Задача На Циклы

Тема в разделе "C и С++ FAQ", создана пользователем Homka, 1 дек 2013.

  1. Homka

    Homka Member

    Регистрация:
    1 дек 2013
    Сообщения:
    10
    Симпатии:
    0
    Задание: образует ли десятичная запись n в квадрате упорядочённую по убыванию последовательность.

    Код (C++):
    #include <stdio.h>
    #include <math.h>
    #include <conio.h>
    float n,k,i, numb,
    int cifri, mas[10];
    /*int numb;*/
    void main()
    {
    clrscr();
    cifri=0;
    printf("Vvedite n:\n");
    scanf("%f", &n,);
    numb=pow(n,2);
    printf("%.0f", numb);
    do
    {
    a=numb%10;
    numb/=10;
    mas[i]=mas[i]+a;
    cifri++;
    }
    while(numb>0);
    printf("Kolichestvo cifer=%d\n", cifri);
    for(i=0;i<k; i++)
    {
    if(mass[i]>mass[i+1])
    { printf("Posledovatelnost' po ubivaniju\n");}
    else
    { printf( "Posledovatelnost' narushena"); }
    getch();
    }
    }
    Подскажите, что не так... может поправите к верному коду программы.

    Заранее спасибо.
     
  2. Senset

    Senset Well-Known Member

    Регистрация:
    11 сен 2006
    Сообщения:
    136
    Симпатии:
    0


    Толком не могу понять задание...
    и где вы задаете k?
     
  3. Homka

    Homka Member

    Регистрация:
    1 дек 2013
    Сообщения:
    10
    Симпатии:
    0
    Если внятно объясну, то вот: число, допустим 9.
    Я возвожу в квадрат: 81

    И я должен 81 разбить на массив: [8][1]

    И сравнить, массив идёт по убыванию или возрастает.

    Немножко переделал код:

    Код (C++):
    #include <stdio.h>
    #include <math.h>
    #include <conio.h>
    int n,k,i,a,t;
    int c, m[100];
    main()
    {
    clrscr();
    printf("Vvedite n:");
    scanf("%d",&n);
    n=n*n;
    printf("%d\n", n);
    i=0;
    while(n)
    {
    a=n%10;
    n/=10;
    m[i]=a;
    i++;
    k++;
    printf("%d", m[i]);
    }
    for(i=0;i<k; i++)
    if(m[i]>m[i+1])
    t++;
    else
    t--;
    if(t=k)
    {
    printf("\nPosledovatelnost ne po ubivaniu");
    }
    else
    {
    printf("Posledovatelnost' po ubivaniju\n");
    }
    getch();
    return n*n;
    }
     
  4. Senset

    Senset Well-Known Member

    Регистрация:
    11 сен 2006
    Сообщения:
    136
    Симпатии:
    0
    мммм... это интересно, я так понимаю проблема именно с разбитием на массив.
    Без рекурсий и доп. функций это будет так:
    Код (C++):
    int determ=1;
    while (determ<n) determ*=10;
    if (determ==1) determ=10;
    else determ/=10;
    while(n)
    {
    if (n>determ)
    {
    a=n/determ;
    n=n-a*determ;
    determ/=10;
    if (determ==1) determ=10;
    }
    else
    {
    a=n%determ;
    n=0;
    }
    m[i]=a;
    i++;
    k++;
    }
    И весь код станет вот таким:
    Код (C++):
    #include <stdio.h>
    #include <math.h>
    #include <conio.h>
    int n,k,i,a,t;
    int c, m[100];
    main()
    {
    clrscr();
    printf("Vvedite n:");
    scanf("%d",&n);
    n=n*n;
    printf("%d\n", n);
    i=0;
    int determ=1;
    while (determ<n) determ*=10;
    if (determ==1) determ=10;
    else determ/=10;
    printf("determ=%d\n",determ);
    while(n)
    {
    if (n>determ)
    {
    a=n/determ;
    n=n-a*determ;
    determ/=10;
    if (determ==1) determ=10;
    }
    else
    {
    a=n%determ;
    n=0;
    }
    m[i]=a;
    i++;
    k++;
    }
    for (i=0;i<k;i++) printf ("%d ",m[i]);
    for(i=0;i<k; i++)
    if(m[i]>m[i+1])
    t++;
    else
    t--;
    if(t=k)
    {
    printf("\nPosledovatelnost ne po ubivaniu");
    }
    else
    {
    printf("Posledovatelnost' po ubivaniju\n");
    }
    getch();
    return n*n;
    }
     
  5. Homka

    Homka Member

    Регистрация:
    1 дек 2013
    Сообщения:
    10
    Симпатии:
    0
    Senset, спасибо.)

    И ещё вопросик: вот задача [​IMG]

    Часть Б). Какой код должен быть?... я с условиями нахождения максимального значения не могу сделать.

    Часть А) более лёгкая, чем Б). Поможете?
     
  6. Senset

    Senset Well-Known Member

    Регистрация:
    11 сен 2006
    Сообщения:
    136
    Симпатии:
    0
    Код (C++):
    //получим сумму первой строки (предполаем что индексация матрицы начинается с 0)
    double max=0;
    int max_string=0;
    for (int i=0;i<n;i++) max+=m[0,i];

    for (int i=1;i<n;i++)
    {
    double sum=0;
    for (int j=0;j<n;j++)
    {
    if (j>=i) sum+=m[i,j]; //учитываем только элементы правее главной диагонали (учитывая значение на самой диагонали)
    }
    if (sum>max)
    {
    max=sum;
    max_string=i;
    }
    }
    //Здесь получаем, что: max - хранит значение максимальной суммы, max_string - хранит номер строки, где сумма нужных элементов максимальна
    printf("max=%0.4f max_string=%0.4f",max,max_string);
    Чтобы переделать этот код для задачи "Б", достаточно дополнить условие, которое считает сумму нужных элементов
     
  7. Homka

    Homka Member

    Регистрация:
    1 дек 2013
    Сообщения:
    10
    Симпатии:
    0
    Так не поделитесь условиями для части Б?
     
  8. Senset

    Senset Well-Known Member

    Регистрация:
    11 сен 2006
    Сообщения:
    136
    Симпатии:
    0
    :( Нет, потому что достаточно разобраться с тем как идет накопление суммы для части "А", и тогда достаточно легко и просто понять, что нужно дописать чтобы работало и для части "Б". А Вы ленитесь.
     
  9. Homka

    Homka Member

    Регистрация:
    1 дек 2013
    Сообщения:
    10
    Симпатии:
    0
    Хорошо. Попробую сам. Если что, вышлю код, чтоб поправить наверняка ^^
     
  10. Homka

    Homka Member

    Регистрация:
    1 дек 2013
    Сообщения:
    10
    Симпатии:
    0
    Уважаемый Senset.

    У меня вообще не приходит в голову, какое условие нужно для части "Б".


    Код (C++):
    #include <stdio.h>
    #include<conio.h>

    void main()
    {
    int t=0,i,j,N,Max=0;
    clrscr();
    printf("Enter a size of mass 'N'\n");
    scanf("%d",&N);
    if (N<=18)
    {
    int mass[18][18];
    for(i=0;i<N;i++)
    for(j=0;j<N;j++)
    {
    scanf("%d",&mass[i][j]);
    }
    for(i=0;i<N;i++)
    for(j=0;j<N;j++)
    {
    printf("%d ", mass[i][j]);
    t++;
    if(t==N)
    {
    printf("\n");
    t=0;
    }
    }
    for(i=0;i<N;i++)
    {
    for(j=i;j<N;j++);
    }
    {
    for(i=N;i<N;i--)
    {
    for(j=N;j<N;j--)
    {
    if(Max<mass[i][j])
    Max=mass[i][j];
    }
    }
    }
    printf("Max=%d\n", Max);
    }
    else
    {
    printf("\nN>18 - uslovie narusheno");
    }
    getch();
    }
    Что не так я написал? :\
     
  11. Senset

    Senset Well-Known Member

    Регистрация:
    11 сен 2006
    Сообщения:
    136
    Симпатии:
    0
    Это беспредел! Конечно это работает (в смысле вывод матрицы), но согласитесь неудобно кушать через нос.
    Обратите внимание на этот код:
    Код (C++):
    for(i=0;i<N;i++)
    {
    for(j=0;j<N;j++) printf("%d ", mass[i][j]);
    printf("\n");
    }
    и постарайтесь понять как это происходит.


    Прежде, чем делать что-то подобное (хотя я не понимаю зачем это) нужно посмотреть "а чему равен Ваш Max изначально"?... по-моему чему-то нехорошему (т.е. нулю), а значит если матрица состоит из элементов ниже нуля (Ваш алгоритм не заработает)

    Отличный бесполезный цикл (даже два). Зачем Вы это сделали?

    Итого:
    1) С вводом\выводом всё ок (посмотрите мой код для вывода)
    2) Начальное значение Max - не зачет (посмотрите как я нахожу начальное значение максимума).
    3) Попробуйте продублировать части моего кода, которые я приводил выше (для элементов правее главной диагонали) и посмотрите что нужно менять чтобы "уходить" от привязки к главной диагонали.
    P.S. когда приводите код постарайтесь отделять пробелами блоки кода (как я например) --> так проще читать и видеть вложенности
     
  12. Senset

    Senset Well-Known Member

    Регистрация:
    11 сен 2006
    Сообщения:
    136
    Симпатии:
    0
    И еще будет просто замечательно, если Вы уточните задание.
    Например: как выглядит "заштрихованная" область для: N=3,N=5,N=8, N=9 для вариантов "А" и "Б".
    P.S. Вдруг это не главные диагонали, и если так, то каким образом идет определение области (м.б. пользователь сам указывает нужные элементы)?
     
  13. Homka

    Homka Member

    Регистрация:
    1 дек 2013
    Сообщения:
    10
    Симпатии:
    0
    Спасибо)

    Сдал я отчёт по лабораторной работе!) :)

    Спасибо за помощь!)
     
Загрузка...
Похожие Темы - Задача На Циклы
  1. elzim
    Ответов:
    0
    Просмотров:
    930
  2. ShaoKahn
    Ответов:
    1
    Просмотров:
    1.123
  3. eremin-sanek
    Ответов:
    3
    Просмотров:
    1.106
  4. MonteCristo
    Ответов:
    1
    Просмотров:
    852
  5. bort
    Ответов:
    1
    Просмотров:
    1.180

Поделиться этой страницей