Последние новости

YoungCoder теперь и на Stepikе. Записывайтесь: https://vk.cc/75rISy

Чтобы записаться на курс, необходимо зарегистрироваться на Степике: https://vk.cc/75rIC4

Это моя личная ссылка-приглашение на Stepik для вас. Регистрируясь по этой ссылке, записываясь на курсы и решая задачи, Вы помогаете автору данного сайта принять участие в конкурсе платформы Stepik! Подробности конкурса здесь: https://vk.cc/75rKuS

воскресенье, 20 ноября 2011 г.

Занятие 7.Циклические конструкции. Цикл со счетчиком for.Уроки программирования для чайников.Язык Си.

Прочитайте улучшенную версию этого урока "Цикл со счётчиком for".

В новой версии:

  • Ещё более доступное объяснение
  • Дополнительные материалы
  • Задачи с автоматической проверкой решения

Добрый день уважаемые друзья.
Вот и подошло время очередного занятия. Одно занятие было мной пропущено, из-за важных дел, я хотел его восстановить в течении недели, но навалились другие проблемы и мне не удалось этого сделать. Уж извините, всё предусмотреть невозможно. Сегодняшнее занятие будет посвящено новой управляющей конструкции. Сам того не подозревая, подбираю практические задачи для прошлого урока, я очень выгодно выбрал задачу с коровами, и дело вот в чем. Обычно, когда происходит изучение языка программирования не сразу понятно зачем и что нужно. И бывает достаточно сложно привести хороший пример. Можно конечно просто словами сказать, для чего предназначена та или иная конструкция. Но человеку гораздо понятнее, когда он сам увидел, и так сказать "пощупал", "поковырял" какой-то механизм. Еще Конфуций говорил "То, что я слышал, я забываю. То, что видел, я помню. То, что я делал сам, я  понимаю". Теперь вернемся к нашей задаче с коровами. Естественно мне надо было её как-то проверять. Нужно было ввести все значения от 0 до 99 и посмотреть какой результат программа выдает. Всё это можно было-бы сделать вручную, но это крайне не продуктивно.Представьте, сколько времени уйдет, чтобы проверить одну программу. Вот именно здесь мне и пригодилась циклическая конструкция. Циклическая конструкция предназначена для того, чтобы выполнять какую-то последовательность действий несколько раз. В нашем случае для того чтобы 100 раз запустить одну и ту же программу с разными входными данными. Надеюсь общее назначение циклов и польза от их применения вы осознали, теперь можно приступить непосредственно к изучению.

Циклическая конструкция for. (Цикл for)
В языке Си несколько циклических конструкций. Сегодня мы познакомимся с одной из них, а именно циклом for. Его ещё называют цикл со счетчиком. Он чаще всего используется, когда нужно повторить заданное действие известное число раз. 
Сначала посмотрим на формат цикла for. Он выглядит следующим образом:

Листинг 7.1:
for (инициализация счетчика; условие; изменение счетчика)
    оператор;

Теперь опишем словесно как работает эта инструкция. Цикл for состоит как бы из двух частей: заголовка (первая строка) и тела цикла (вторая строка). 
Сначала разберемся с заголовком. После слова for, в скобках, записаны три выражения. 

  • Первое выражение - инициализация счетчика
Мы должны завести переменную-счетчик и присвоить ей начальное значение.Например:

Листинг 7.2.
for (i=0;...;...) 
или
for (j=13;...;...)

  • Второе выражение - условие.
Здесь записано условие при котором будет выполняться тело цикла. Т.е. цикл будет работать пока условие истинно. Например:

Листинг 7.3.
for (i=0; i<10; ...)
или
for (d=-100; d<=0; ...)

  • Третье выражение - изменение счетчика.
Здесь записывается как изменяется переменная-счетчик после каждого выполнения тела цикла. Например:

Листинг 7.4.
for (i=0; i<10; i++)
или
for (d=-100; d<=0; d+10)

Теперь немного поговорим о теле цикла. Тело цикла всегда состоит из одного оператора. И если нам нужно использовать несколько операторов, то как и в случае с конструкцией if-else, применяется составной оператор {...}. 

Опишем работу цикла for словами и потом перейдем к рассмотрению практических примеров.
  1. Когда программа встречает слово for она понимает что перед ней цикл. 
  2. Сначала определяется переменная счетчик (выражение 1). 
  3. Проверяется условие выполнение цикла (выражение 2)
  4. Если условие ложно, то программа выходит из цикл for и продолжает свое выполнение. Т.е. если в самом начале условие будет ложно, то тело цикла не выполнится ни одного раза.
  5. Если условие истинно, то начинает выполняться тело цикла. 
  6. После того как тело цикла выполнится, программа возвращается к заголовку и выполняет изменение значение переменной-счетчика (выражение 3). 
  7. После этого возвращаемся к пункту два, и все действия повторяются до тех пор, пока условие не станет ложным.
Для лучшего понимаю работы циклической конструкции for разберем сначала простейший пример, а потом вернемся к нашей задачке с коровами.

Пусть нам надо посчитать сумму 10 чисел введенных пользователем с клавиатуры.
Такая программа будет выглядеть следующим образом:

Листинг 7.5.
#include <stdio.h>
int main(void){
      int i,summ=0, temp=0;

      for (i=0;i<10;i++){
            printf("\nVvedite chislo: ");
            scanf("%d",&temp);
            summ+=temp;
      }
      printf("Summa vvedennih chisel = %d\n",summ);
      return(0);
}

Теперь распишем по пунктам как работает наша программа.
Начнем с 4 строки, всё остальное вам уже должно быть ясно после ознакомления с предыдущими уроками.

  1. Переменная i счетчик и ей присваивается значение 0.
  2. Проверяется условие i<10. Оно истинно, значит выполняется тело цикла: выводится надпись, пользователь вводит число и оно прибавляется к переменной summ. Тело цикла заканчивается программа возвращается к заголовку.
  3. Программа выполняет выражение i++, изменяет значение переменной счетчика, в нашем случае увеличивает i на единицу.  Теперь i  = 1.
  4. Снова проверяется условие, i<10. Оно опять истинно. Снова выполняется тело цикла и происходит изменение переменной счетчика. И процесс повторяется. 
  5. Потом, через несколько шагов значение i после изменения  выражения счетчика становится равным 10. Проверяется условие. Оно ложно. Программа выходит из цикла и продолжает свое выполнение. В нашем случае выводит на экран значение переменной summ.
На рисунке представлен результат работы этой программы:

Припер работы программы с циклом for.

Ну а теперь напишем программу для проверки задания с коровами.
Изначально имеется программа (код юзера Dispose, с моими небольшими изменениями):

Листинг 7.6

#include <stdio.h>

int main(void)
{
      int n,b;
      printf("Vvedite chislo ot 1 do 100: ");
      scanf("%d", &n);
            if(n>=11&&n<=14)
            {
                  printf("Na lugu pasetsya %d korov \n", n);
            }
            else
            {
                  b=n%10;
                  if(b==1)          printf("Na lugu pasetsya %d korova \n", n);
                  if(b>=2&&b<=4)    printf("Na lugu pasetsya %d korovy \n", n);
                  if(b>=5&&b<=9)    printf("Na lugu pasetsya %d korov \n", n);
                  if(b==0)          printf("Na lugu pasetsya %d korov \n", n);
            }
return(0); 
}

Нам нужно проверить эту программу. Смотрим что количество коров задается в переменной n. Именно её и возьмем в качестве переменной счетчика. начальное значение у нас 0 конечное 99 . С каждым  шагом значение изменяется на 1 Значит заголовок будет выглядеть следующим образом: 
Листинг 7.7
for(n=0,n<=99,n++)

Теперь из исходной программы удалим строчки, где просится ввести число n и строку, где введенное число считывается в переменную n. Также добавим туда наш заголовок и возьмем оставшуюся часть программы в фигурные скобки. Получим следующий код:

Листинг 7.8.

#include <stdio.h>
int main(void)
{
      int n,b;
      for(n=0;n<=99;n++)
        {
            if(n>=11&&n<=14)
            {
                  printf("Na lugu pasetsya %d korov \n", n);
            }
            else
            {
                  b=n%10;
                  if(b==1)          printf("Na lugu pasetsya %d korova \n", n);
                  if(b>=2&&b<=4)    printf("Na lugu pasetsya %d korovy \n", n);
                  if(b>=5&&b<=9)    printf("Na lugu pasetsya %d korov \n", n);
                  if(b==0)          printf("Na lugu pasetsya %d korov \n", n);
            }
        }
return(0); 
}


Если теперь запустить нашу полученную программу то можно посмотреть, какое окончание прибавляет программа к какому количеству коров.


Иллюстрация работы программы листинг 7.8

Напоследок хочу заметить что тело цикла может содержать в себе другие циклы, т.е. могут быть вложенные циклы.И опять же советую вам использовать в теле цикла составной оператор.
На этом на сегодня всё.

Резюме урока:

  • Посмотрели на примерах для чего используются в программировании циклы.
  • Изучили циклическую конструкцию for.

Задания для практической работы:

  1. На вход поступает четыре целых числа a,b,c,d. Выведите все числа на отрезке от a до b, дающие остаток c при делении на d.
  2. На вход программе подается число N. Напишите программу, для вычисления произведения всех чисел от 1 до N (N!  N-факториал). По условию N не больше 10.
  3. На вход программе подается два числа.Первое сумма двух неизвестных чисел х и у, а второе произведение х и у. По двум введенным числам, найти х и у. х и у не превосходят 1000.
  4. На вход программе подается одно положительное число N, которое по не превосходит 10000. Написать программу которая выводит одно единственное число равное сумме чисел от 1 до N. 
Если Вам понравился этот урок, расскажите о нем вашим друзьям. В этом  Вам могут помочь кнопки основных социальных сетей, расположенные ниже. Вам остается всего лишь кликнуть по любой из них. 

81 комментарий :

  1. Видимо для for сложно какое либо задание придумать...

    ОтветитьУдалить
    Ответы
    1. Суета, мой милый друг, суета.=) Всё будет, обязательно.

      Удалить
  2. Добрый день!
    "Напоследок хочу заметить что тело цикла может содержать в себе другие циклы, т.е. могут быть вложенные циклы."
    процитировал Ваши выкдадки. А если без вложенных циклов не обойтись?
    Нам задали вот такую задачу: надо построить равнобедренный треугольник из символов *.число строк вводит пользователь.я не прошу написать программу, а просто схематически объяснить синтаксис построения 3-х составного for.

    ОтветитьУдалить
  3. Задание №4:

    #include
    int main(void)
    {
    int N=0, summa=0,i=0;
    printf("Vvedite chislo: ");
    scanf("%i", &N);
    if ((N<10000) && (N>-10000))
    {
    for (i=0; i<=N; i=i+1)
    {
    summa+=i;
    }
    printf("Summa ravna: %i\n", summa);
    }
    else
    {
    if (N>10000)
    {printf("Chislo bolshe 10000\n");}
    if (N<-10000)
    {printf("Chislo menshe -10000\n");}
    }
    return(0);
    }

    Правда с некоторыми модификациями :)

    ОтветитьУдалить
  4. Владимир.
    Здравствуйте. Решение 1 задачи.

    #include
    int main()
    {
    int a,b,c,d,i;
    printf("Vvedite chetyre chisla\n");
    scanf("%d %d %d %d",&a,&b,&c,&d);
    if(ab){
    for(i=a;i>b;i--)
    if(i%d==c) printf("%d\n",i);
    }
    return 0;

    }

    ОтветитьУдалить
    Ответы
    1. Код такой же но программа не работает, почему??????????

      Удалить
    2. такой код и не будет работать, в условии if написана чушь ведь. наверное не все символы вставились.

      Удалить
  5. Zadanije N2

    #include (stdio.h)
    int main(void)
    {
    int a, c, n, f;
    printf("Vvedite celoje chislo do 10:");
    scanf("%d", &a);

    if (a==0)
    {
    printf("%d!=1\n", a);
    }
    else
    {
    c=a;
    f=a;
    if (a<=10)
    {
    for (n=1;n<a;n++)
    f=f*(c=c-1);
    printf("Faktorial chisla %d!= %d\n", a, f);
    }
    else
    printf("Chislo dolzno bitj ne boljshe 10!!!\n");
    }

    return(0);
    }

    ОтветитьУдалить
  6. Zadanije N3

    #include (stdio.h)
    int main(void)
    {
    int x, y, a, b;
    printf("Vvedite 2 chisla: \n");
    scanf("%d %d", &a, &b);
    {
    for (x=1;x<=1000;x++)
    {
    for (y=1;y<=1000;y++)
    {
    if ((a==x+y) && (b==x*y))
    {
    printf("x=%d y=%d\n", x, y);
    }

    }
    }
    }


    return(0);
    }

    ОтветитьУдалить
  7. //Первая задача
    #include;
    int main(void)
    {
    int a,b,c,d,p,i;
    //float i;
    printf("Vvedite chetyre chisla: \n");
    scanf("%d%d%d%d",&a,&b,&c,&d);
    for(i=a;i<=b;i++)
    {
    p=i%d;
    if((p==c)&&(i>d)) printf("%d\n",i);
    }

    return(0);
    }

    ОтветитьУдалить
  8. //Вторая задача
    #include;
    int main(void)
    {
    int N,i,p=1;
    printf("Vvedite chislo N ot 1 do 10: \n");
    scanf("%d",&N);
    for(i=1;i<=N;i++)
    {
    p=p*i;
    }
    printf("\n%d\n",p);
    return(0);
    }

    ОтветитьУдалить
  9. //Третья задача
    #include
    #include
    int main(void)
    {
    int c1,c2,x,y;
    printf("Vvedite dva chisla cherez probel:\n");
    scanf("%d%d",&c1,&c2);
    for(x=1;x<=c2;x++)
    {
    for(y=1;y<=c2;y++)
    {
    if(((x*y)==c2)&&((x+y)==c1))
    {
    printf("X=%d Y=%d\n",x,y);
    return(0);
    }
    }
    }
    printf("Net otveta\n");

    return(0);
    }

    ОтветитьУдалить
  10. //Четвертая задача
    #include
    int main(void)
    {
    int N,i,s=0;
    printf("Vvedite chislo N v intervale ot -10000 do 10000:\n");
    scanf("%d",&N);
    if(N<0)
    {
    N*=(-1);
    for(i=1;i<=N;i++)
    {
    s=s+i;
    }
    s=s-1;
    printf("Summa=%d\n",-s);
    }
    else
    {
    for(i=1;i<=N;i++)
    {
    s=s+i;
    }
    printf("Summa=%d\n",s);
    }

    return(0);
    }

    ОтветитьУдалить
  11. Задание №2
    #include
    int main()
    {
    int n, x, xfact=1;
    printf("Vvedite tseloye chislo x<=10\n");
    scanf("%d", &x);
    for(n=1; n<=x; n++)
    {
    xfact*=n;
    }
    printf("x!=%d\n", xfact);
    }

    ОтветитьУдалить
  12. #include
    int main()
    {
    Задание №4
    int n, N, Nsumm=0;
    printf("Vvedite tseloye chislo N<=10000\n");
    scanf("%d", &N);
    for(n=1; n<=N; n++)
    {
    Nsumm+=n;
    }
    printf("Summa chisel ot 1 do N %d\n", Nsumm);
    }

    ОтветитьУдалить
  13. Задание №3
    Вариант 1
    #include
    #include
    int main()
    {
    float a, b, x, y;
    printf("Vvedite dva chisla a(summa), b(proizvedeniye)\n");
    scanf("%f%f", &a,&b);
    if((a*a)<(4*b))
    printf("takih x,y net\n");
    else
    {
    x=0.5*(a+sqrt(a*a-4*b));
    y=0.5*(a-sqrt(a*a-4*b));
    printf("%f %f\n", x, y);
    }
    }
    Вариант 2
    #include
    int main()
    {
    float a, b, x, y;
    printf("Vvedite dva chisla a(summa), b(proizvedeniye)\n");
    scanf("%f%f", &a,&b);
    for(x=1;x<=1000;x++)
    {
    y=a-x;
    if(y==(b/x))
    {
    printf("%f %f\n", x, y); break;
    }
    }
    }
    Но второй вариант выдаёт только те решения, когда одно из чисел целое...

    ОтветитьУдалить
  14. Что такое summ и temp? и в каком уроке про них рассказывалось?

    ОтветитьУдалить
    Ответы
    1. Это просто названия переменных. Переменные можно называть так, как тебе удобно. Для компа нет разницы что переменная "а", что "summ".

      Удалить
  15. Большое спасибо, все очень нравится, читаю и занимаюсь с удовольствием) Автор молодца!

    ОтветитьУдалить
  16. #include
    int main()
    {
    int N,i,summ=0;
    printf("vvedite chislo N<10000\n");
    scanf("%d",&N);
    if(N<10000)
    {
    for(i=1;i<=N;i++)
    summ+=i;
    printf("summa chisel ot 1 do %d ravna %d\n",N,summ);
    }
    else
    printf("Error");
    return 0;
    }

    ОтветитьУдалить
  17. Задание 1
    #include
    int main()
    {
    int a,b,c,d,i,e;
    printf("vvedite 4 chisla cherez probel\n");
    scanf("%d %d %d %d",&a,&b,&c,&d);
    if (d==0) printf ("error");
    else
    {
    if (a>b)
    {
    i=b;
    b=a;
    a=i;
    }
    for(i=a;i<=b;i++)
    {
    e=i;
    e%=d;
    if (e==c) printf (" %d ",i);
    }
    printf ("\n");
    }

    return(0);
    }
    вроде работает...
    У меня почему-то часто пишет предупреждение :warning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.Когда меняешь scanf на scanf_s предупреждений нет.В чем сдесь дело?
    Заранее спасибо!

    ОтветитьУдалить
    Ответы
    1. Ну функция scanf считается устаревшей типа и небезопасной.Поэтому компилятор предлагает вам её улучшенный аналог. Не обращайте внимания, на данном этапе это не важно.)

      Удалить
  18. Задание 2
    #include
    int main()
    {
    int a,b=1,i;
    printf("vvedite celoe chislo N ne bolee 10 \n");
    scanf("%d",&a);
    if ((a>10)||(a<0)) printf ("error\n");
    else
    {
    for(i=1;i<=a;i++)
    {
    b*=i;
    }
    printf ("N!=%d\n",b);

    }
    return(0);
    }

    ОтветитьУдалить
  19. Задание 3
    #include
    #include
    int main()
    {
    float a,b,d,x,y;
    printf("vvedite dva chisla cherez probel \n");
    scanf("%f %f",&a,&b);
    if ((a>2000) ||( b>1000000)) printf (" error\n");
    else
    {
    d=(a*a)-(4*b);//D уравн х*х - a*x +b=0
    if (d<0)
    printf("no solution\n");
    else
    {
    x=(a+sqrt(d))/2;
    y=a-x;
    printf("X=%f\tY=%f\n", x,y);
    }
    }
    return(0);
    }

    тока у меня сдесь циклов не случилось....

    ОтветитьУдалить
    Ответы
    1. Хорошо, мне нравится. Особенно трюк с вычитанием из а. )))

      Удалить
  20. задание 4
    #include
    int main()//summa
    {
    int a,b,c=0;
    printf("vvedite natural'noe chislo N < 10000 \n");
    scanf("%d",&a);
    if ((a>10000)||(a<1)) printf ("error\n");
    else
    {
    for (b=1;b<=a;b++)
    {
    c+=b;
    }
    printf("%d\n",c);
    }

    ОтветитьУдалить
    Ответы
    1. Как же вы не заметили арифметическую прогрессию тут? ))) А так все в порядке. ))

      Удалить
  21. #include "stdio.h"
    int main()
    {
    int a,b,x,y,i;
    scanf("%i %i",&a,&b);
    for (i=1; i<=a; i++)
    {
    x=i;
    y=a-x;
    if (x*y==b) printf("%i %i\n",x,y);
    }
    return(0);
    }

    ОтветитьУдалить
    Ответы
    1. 3-я задача

      Удалить
    2. А можете изменить программу так, чтобы числа выводились только один раз?

      Удалить
    3. И кстати, для пары -4 0 программа не работает. Это плохо. Стоит подумать и исправить это.

      Удалить
  22. Задание 1:
    #include"stdio.h>"
    #include"iostream"

    int main()
    {
    setlocale(LC_ALL,"RUS");
    int a,b,c,d,e,f;
    printf("Введите число - начало ряда:\n");
    scanf("%d",&a);
    printf("Введите число - конец ряда:\n");
    scanf("%d",&b);
    printf("Введите число - делитель:\n");
    scanf("%d",&c);
    printf("Введите число - искомый остаток от деления числа из ряда:\n");
    scanf("%d",&d);
    for (e=a;e<=b;e++)
    {
    f=e%c;
    if ((f==d)&&(e>d))
    printf("Остаток от деления %d на %d равен %d\n",e,c,d);
    }

    system("pause");
    return (0);
    }

    ОтветитьУдалить
    Ответы
    1. Если хотите, чтобы я проверял код, соблюдайте пожалуйста формат ввода и вывода. =))

      Удалить
  23. Задание 2:
    #include"stdio.h>"
    #include"iostream"
    int main()
    {
    setlocale(LC_ALL,"RUS");
    int a,b,c,d,e,f;
    printf("Введите число - начало ряда:\n");
    scanf("%d",&a);
    printf("Введите число - конец ряда:\n");
    scanf("%d",&b);
    printf("Введите число - делитель:\n");
    scanf("%d",&c);
    printf("Введите число - искомый остаток от деления числа из ряда:\n");
    scanf("%d",&d);
    for (e=a;e<=b;e++)
    {
    f=e%c;
    if ((f==d)&&(e>d))
    printf("Остаток от деления %d на %d равен %d\n",e,c,d);
    }

    system("pause");
    return (0);
    }

    ОтветитьУдалить
    Ответы
    1. Не то :)
      Задание 2:
      #include"stdio.h>"
      #include"iostream"
      int main()
      {
      setlocale(LC_ALL,"RUS");
      int nN,a,summ=1,fak;
      printf("Введите число от 1 до 10:\n");
      scanf("%d",&nN);
      if ((nN<1)||(nN>10))
      {
      printf("Неверное число\n");
      system("pause");
      return(0);
      }
      else
      for (a=1;a<=nN;a++)
      {
      summ=summ*a;
      }
      printf("Факториал числа %d=%d\n",nN,summ);
      system("pause");
      return(0);
      }

      Удалить
    2. С факториалом верно, только много всего лишнего.
      И вот еще. Если ыы хотите использовать переменную a в цикле, так и объявляйте её прямо там. Так как она объявлена у вас, она создается и занимает память все время работы программы. Тут это не критично, но все равно, лучше сразу привыкать к хорошему. )

      Удалить
  24. Переделал код юзера "обморк" добавив цикл и отрицательные числа, они ведь тоже могут быть введены. Получилось не рационально зато работает.
    #include "stdio.h"
    #include "math.h"
    int main ()
    {

    float x, y, b;
    float a, D;
    printf ("\t Vvedite chisla a b chtoby a=x+y, b=x*y \n");
    scanf ("%f %f", &a, &b);
    D=pow( a, 2)-4*b;

    for(x=-999; x<1000; x++)
    {
    for(y=-999; y<1000; y++)
    {
    if ((x==(a+sqrt(D))/2) && (y==a-x))
    {
    printf ("\t ili \n\t x=%.0f \n", x);
    printf ("\t y=%.0f \n" ,y);
    }//if+
    if ((x==(a-sqrt(D))/2) && (y==a-x))
    {
    printf ("\t x=%.0f \n", x);
    printf ("\t y=%.0f \n" ,y);
    }//if -
    }//for y
    }//for x
    }//main

    ОтветитьУдалить
    Ответы
    1. Думаю Вы намудрили. Код обморока, был основан на применении теоремы Виета. Он работал и для отрицательных чисел. Или я что-то не заметил, тогда приведите пример, когда его программа не работает. =))

      Удалить
  25. Первое задание:
    #include "stdio.h"
    int main ()
    {
    int a, b, c, d, x, y, z, n_c_ne_ravno_y=2;
    printf ("\t vvedite 4 celih chisla \n");
    scanf ("%i %i %i %i", &a, &b, &c, &d);


    for (x=a; x<=b; x++)
    {
    y=x%d;

    if (c==y)
    {
    n_c_ne_ravno_y=1;
    printf ("%i \n", x);
    }


    }


    if (n_c_ne_ravno_y != 1) printf ("\t malenikii orezok a b.\n") ;

    return (0);
    }
    Замучился выводить " malenikii orezok a b." Вроде работает правильно.

    ОтветитьУдалить
    Ответы
    1. Хорошо. Только не нужно было это выводить. Если таких чисел нет, по каким либо причинам, то программа должна просто завершить работу. )

      Удалить
  26. Добрый день.
    7-2
    int main()//summa
    {
    int a,b,c=0;
    printf("vvedite natural'noe chislo N < 10000 \n");
    scanf("%d",&a);
    if ((a>10000)||(a<1)) printf ("error\n");
    else
    {
    for (b=1;b<=a;b++)
    {
    c+=b;
    }
    printf("%d\n",c);
    }

    7-3
    int main()
    {
    int a,b,i,j;
    printf("Vvedite dva celih chisla\n");
    scanf("%d %d", &a, &b);
    for (i=1;i<b;i++)
    for (j=1;j<b;j++)
    {
    if ((a==i+j)&&(b==i*j))
    printf("\n%d %d\n",i,j);

    }
    return 0;
    }

    7-4
    int main()
    {
    int N,i,b=0;
    printf("vvedite chislo N ot 1 do 1000\n");
    scanf("%d",&N);
    for (i=0;i<=N;i++)
    {
    b+=i;
    }
    printf("%d",b);
    return 0;
    }

    ОтветитьУдалить
    Ответы
    1. 7-2 не понял что это.
      7-3 не правильно. =) Например: ввожу 2 1 ответ 1 1, а ваша программа ничего не выводит.
      7-4 Делаете один лишний шаг - первый. прибавляете нуль.=) А так хорошо.

      И еще вопрос, почему вы не используете объявление переменной-счетчика внутри цикла, а объявляете её в самом начале?

      Удалить
    2. 7-2 вот правильная
      int main()
      {
      int a, i, proiz=1;
      printf("Vvedite chislo ot 1 do 10\n");
      scanf("%d",&a);
      if ((a<1) || (a>10)) printf("ERROR\n");
      else
      for(i=1;i<=a;i++)
      {
      proiz*=i;
      printf("Factorial vachego chisla raven %d\n", proiz);
      }
      return (0);
      }


      7-3 исправил
      int main()
      {
      int a,b,i,j;
      printf("Vvedite dva celih chisla\n");
      scanf("%d %d", &a, &b);
      for (i=0;i<=b;i++)
      for (j=0;j<=b;j++)
      {
      if ((a==i+j)&&(b==i*j))
      printf("\n%d %d\n",i,j);
      }
      return 0;
      }

      А по поводу объявления переменной-счетчика не понял, Надо перед for ee объявлять?

      Удалить
    3. 7-2 хорошо
      7-3 правильно, но не оптимально. Можно сделать попроще. Сейчас вы перебираете b*b вариантов, подумайте как можно сократить это число используя тот факт, что сумма чисел должна давать a.

      Про цикл.
      Ошибки тут нет, но так уже не программируют. Переменную можно объявить и инициализировать прямо внутри цикла.Пример по ссылке: http://pastebin.ru/tM8rrpVE

      Удалить
  27. Задание №1
    #include
    int main(void)
    {
    int a,b,c,d,ost,i;

    printf("Vvedite chisla a,b,c,d cherez probel:");
    scanf("%i %i %i %i",&a,&b,&c,&d);
    printf("Proverka %i %i %i %i",a,b,c,d);

    for(i=a;i<=b;i++)
    {
    ost=i%d;
    if(ost == c) printf("\n%i chislo s ostatkom %i",i,ost);

    }


    return 0;
    }

    ОтветитьУдалить
    Ответы
    1. Vvedite chisla a,b,c,d cherez probel:1 10 2 3
      Proverka 1 10 2 3
      2 chislo s ostatkom 2
      5 chislo s ostatkom 2
      8 chislo s ostatkom 2

      Это вот результат работы вашей программы. А я хочу, чтобы экран выглядел вот так
      1 10 2 3
      2 5 8

      Это называется формат выходных данных. =)) А так, все хорошо.

      Удалить
  28. Не понял, а как у Eugene Fessplay, программа без работает? Попробовал у меня только с ней работает.

    ОтветитьУдалить
    Ответы
    1. stdio.h почему-то не вывелась

      Удалить
    2. Как у Eugene программа работает без stdio.h. Пробовал без нее не пашит

      Удалить
  29. Задача 1
    #include
    int main(void)
    {
    int a, b, c, d;
    printf("Vvedite 4 celih chisla cherez probel, primer 5 9 151 10\n");
    scanf("%i %i %i %i", &a, &b, &c, &d);
    for(a; a<=b; a++) {
    if (c==a%d)
    printf("%i\n", a);
    }
    return (0);
    }

    ОтветитьУдалить
  30. Задача 2
    #include
    int main(void)
    {
    int a, b=1, c;
    printf("Vvedite chislo ot 1 do 10\n");
    scanf("%i", &a);
    if (a<=0||a>10)
    printf("ERROR\n");
    else {
    if (a==1)
    printf("%i!=%i\n", a, a);
    else {
    for(c=1; c<=a; c++) {
    b*=c;
    printf("%i!=%i\n", a, b);
    }
    }
    }
    return (0);
    }

    ОтветитьУдалить
  31. Задание 1:

    #include

    int main(){
    int a, b, c, d, N;
    printf ("Задача найти число от a до b при деление на d даёт c результат\na=");
    scanf ("%d",&a);
    printf ("b=");
    scanf ("%d",&b);
    printf ("d=");
    scanf ("%d",&d);
    printf ("c=");
    scanf ("%d",&c);
    for (a;a<=b;a++){
    N=a/d;
    if (N==c){
    printf ("Возможно при a=%d\n",a);}}
    return 0;}

    ОтветитьУдалить
    Ответы
    1. Как-то не так работает эта программа. ввожу 1 10 1 2
      Хочу получить 1 3 5 7 9
      Но ваша программа делает что-то другое. И соблюдайте пожалуйста формат ввода и вывода.

      Удалить
  32. Задание 3:

    #include

    int main(){
    float a;
    int b, x, y;
    printf ("Задача:найти x и y\nx и y должны быть целыми числами\nx*y:");
    scanf ("%f", &a);
    printf("x+y:");
    scanf ("%d", &b);
    if (a>=1000000 || b>=2000){
    printf("Ошибка:x*y > 10^6 или x+y >2000 ");}
    else {
    for(x=1;x<=b;x++){
    y=b-x;
    if(x*y==a){
    printf("X=%d Y=%d\n", x, y);}}}
    return 0;}

    ОтветитьУдалить
  33. int a,b,c,d,i,x;
    printf ("Vvedite 4 chisla: ",a,b,c,d);
    scanf ("%d %d %d %d",&a,&b,&c,&d);
    for(i=a; i<=b; i++);
    {
    x=i%d;
    if (x==c) printf (" %d ",x);
    }
    }
    getch();
    Задание 1 почему-то не работает так, как надо :с

    ОтветитьУдалить
  34. Мой комментарий.

    ОтветитьУдалить
    Ответы
    1. Задание 2

      #include

      int main()
      {
      int a,i,y=1;

      scanf("%d",&a);
      for(i=1;i<=a;i++)
      y=i*y;
      printf("%d\n",y);
      }

      Удалить
  35. про коров не совсем верно показывает с циклом for

    ОтветитьУдалить
  36. Задание 3

    #include
    #include
    int main(void)
    {
    float c, b, d, x, y;
    printf("Vvedite summu chisel x i y\n");
    scanf("%f", &b);
    printf("Vvedite proizvedrnie chisel x i y\n");
    scanf("%f", &c);
    if((b>1000)||(c>1000))
    {
    printf("CHISLA MENSHE 1000!!!!!!\n");
    }
    else
    {
    d=b*b-4*c;
    x=((b+sqrt(d))/2);
    y=((b-sqrt(d))/2);
    printf("Pervoe chislo ravno %f\nVtoroe chislo ravno %f\n", x, y);
    }
    return(0);
    }

    ОтветитьУдалить
  37. Задание 4

    #include
    int main (void)
    {
    unsigned int N, i, sum=0;
    printf("Vvedite chislo ot 1 do 10 000\n");
    scanf("%d", &N);
    if(N<=10000)
    {
    for(i=0;i<=N;i++)
    {
    sum+=i;
    }
    printf("Summa chisel ot 1 do %d ravna %d\n", N, sum);
    }
    else
    printf("error\n");
    return(0);
    }

    ОтветитьУдалить
  38. Задание 4 (так тоже можно или только с помощью for?)
    #include
    int main (void)
    {
    int d,n,n1,summ;
    scanf("%d",&n);
    d=1;
    n1=1;
    summ=((2*n1+d*(n-1))/2)*n;
    printf("summa chisrl =%d",summ);
    return(0);
    }

    ОтветитьУдалить
  39. Здравствуйте. Просмотрите пожалуйста код заданий. Вроде все работает, но т.к. благодаря цыклу, нашел сразу же в своей прошлой задаче про коров ошибку, думаю что и в этих мог где-то накосячить.
    Задание 1
    int main (void)
    {
    int a,b,c,d,e,n;
    scanf ("%d %d %d %d", &a,&b,&c,&d);
    for (n=a;n<=b;n++)
    {
    e=n%d;
    if (e==c)
    {
    printf ("%d\n",n);
    }
    }
    return(0);
    }
    Задание 2
    int main (void)
    {
    int n,i,m=1;
    scanf ("%d",&n);
    for (i=1;i<=n;i++)
    {
    m=m*i;
    }
    printf("%d!=%d\n",n,m);
    return (0);
    }
    Задание 3
    int main (void)
    {
    float a,b;
    float y1,y2,x1,x2,d;
    scanf ("%f %f", &a,&b);
    // y*y-a*y+b=0 умножил изначальное ур-ние на -1 что бы убрать минус перед у*у
    d=a*a-4*1*b;
    if (d>0)
    {
    y1=((-a+sqrt(d))/2)*(-1);
    y2=((-a-sqrt(d))/2)*(-1);
    x1=a-y1;
    x2=a-y2;
    printf ("x=%f\ny=%f\n", x1,y1);
    }
    else
    {
    if (d==0)
    {
    y1=-a/2;
    x1=a-y1;
    printf("x=%f\ny=%f", x1,y1);
    }
    else
    printf ("reshenie nevozmogno\n");
    }
    return (0);
    }
    Задание 4
    int main (void)
    {
    int a,n,x=0;
    scanf("%d", &a);
    for (n=1;n<=a;n++)
    {
    x+=n;
    }
    printf("%d\n", x);
    return(0);
    }

    ОтветитьУдалить
  40. #include
    #include
    int main(void){
    int n,a,b,c,d,x;
    printf("Vvedite 4 chisla \n");
    scanf("%d %d %d %d", &a, &b , &c, &d);
    for(n=a;n<=b;n++){
    x=n%d;
    if(x==c){
    printf("%d \n", n);
    }
    else{
    printf("");
    }
    }
    return(0);
    }

    ОтветитьУдалить
  41. 1 задание
    #include
    #include
    int main (void)
    {
    int a,b,c,d,i;
    printf("Vvedite 4etire celih chisla cherez probel: \n");
    scanf("%d%d%d%d",&a,&b,&c,&d);
    if(d==0)printf("EROR\n");
    i=c*d;
    if(i>=a&&i<=b)printf("i=%d YES\n",i);
    for(i=d;i>=a&&i<=b;i++)
    {
    if(c=(i/d))printf("%d\n",i);
    }
    return(0);
    }
    Вроде работает...

    ОтветитьУдалить
  42. 2 задание
    #include
    int main ()
    {
    int n,p,i=1;
    printf("Vvedite chislo N ot 1 do 10:\n");
    scanf("%d",&n);
    if((n>10)||(n<0))printf("ERROR\n");
    for(p=1;p<=n;p++)
    {
    i*=p;
    if(p>10)printf("ERROR\n");
    }
    printf("%d\n",i);
    return(0);
    }

    ОтветитьУдалить
  43. Что то я совсем не понял этот цикл for. Вот к примеру как я понял первое задание. Дано четыре числа a,b,c,d. Как я понимаю A и B это отрезок a начало отрезка b - конец. D делитель, C - результат. Получается я в вожу a и b, например 1 и 20, d к примеру 2, значит программа должна выводить все остатки от деления на отрезке от 1 до 20, там к примеру 3/2=1, 7/2=1. Значит с шагом изменяется только a так как в цикле я задал а++. Следовательно b только задает ограничение отрезка. А C должно получаться в следствии а%d, где а изменяется на единицу. Я уже и блок-схему нарисовал, но как кодом начинаю выражать, так у меня С везде нулю равно при любых значениях. Задачи в комментах смотреть не хочу, так как хочется самому допереть. Посоветуйте что нибудь.

    ОтветитьУдалить
    Ответы
    1. Доброго времени суток!!! Начну с того что я не правильно понял 1 задание. Подумал, что надо выводить все остатки от деления, а не числа дающие остаток. Листинг прилагаю:
      # include ;
      int main (void) {
      int a, b, c, d, i;
      printf ("\nVvedite A, B, C, D\n");
      scanf ("%d %d %d %d",&a, &b, &c, &d);
      for (i=a;i<=b;i++) {
      if (i%d==c) {

      {printf("C:%d\t", i);}}
      }
      return (0); }
      Все вроде как надо работает. Проверял на отрезке от 1 до 5 и от 1 до 20. Но все равно испытываю сложности при написании кода, вроде бы и понимаю как и что должно делаться, но как в программе выразить иногда не представляю.

      Удалить
  44. В третьем задании Х и У надо искать и по сумме и по произведению. Или отдельно найти Х, У для суммы и для произведения?

    ОтветитьУдалить
    Ответы
    1. прилагаю листинг нахождения суммы Х и У, написал ради эксперимента.
      # include ;
      int main (void) {
      int a, x, y, i;
      printf ("\nVvedie A=");
      scanf ("%d", a);
      if ((x<1000) && (y<1000))
      {
      for (i=1;i<a;i++)
      {
      x=a-i; // naxodim znachenie X
      y=a-x; // naxodim znachenie Y

      if (a==(x+y)) // proveryem, esli X+Y ravno znacheniu A

      { printf ("X=%d Y=%d\n", x, y);} // esli znachenie sovpalo to vivodim X i Y
      }
      }

      return (0); }
      Правда при выполнении программа ни чего не выводит, не знаю почему, но вроде бы мысль так правильная правильная.

      Удалить
  45. Работает даже при отрицательных
    //Практика
    #include
    #include
    int main()
    {
    int a, b ,c ,d, i;
    float x;
    printf("Vvedite chislo A, nachalo promegutka & chislo B konec\n");
    scanf("%d\n",&a);
    printf("Vvedite chislo C, ostatok pri delenii na D\n");
    scanf("%d\n",&b);
    printf("Vvedite chislo D\n");
    scanf("%d\n",&c);
    printf("Posle nagmite lubuu klavishu i ENTER\n");
    scanf("%d\n",&d);
    if (a>b)
    {
    for (i=b; i<=a; i++)
    {
    x=i%d;
    x=fabs(x);
    if (x==c)
    {
    printf("Chislo =%d\n",i);
    }
    else
    {
    }
    }
    }
    else
    {
    for (i=a; i<=b; i++)
    {
    x=i%d;
    x=fabs(x);
    if (c==x)
    {
    printf("Chislo =%d\n",i);
    }
    else
    {
    }
    }
    }
    return(0);
    }

    ОтветитьУдалить
  46. Этот комментарий был удален автором.

    ОтветитьУдалить
  47. // Квест
    #include
    int main()
    {
    int i,N,z=1;
    printf("Vvedite chislo factorial cotorogo hotite naiti, N<11\n");
    scanf("%d\n",&N);
    if (N<11)
    {
    for (i=1;i<N+1;i++)
    {
    z*=i;
    }
    }
    else
    {
    printf("Yslovie ne vipolneno\n");
    return(0);
    }
    printf("Factorial N=%d\n",z);
    return(0);
    }

    ОтветитьУдалить
  48. /*Задание 4*/
    #include

    int main(){
    float N, s=0;
    printf ("N="); scanf ("%f", &N);
    for (int i=1; i<=N; i++) {
    s=s+i;
    }
    printf ("S=%0.0f \n", s);
    return 0;
    }

    ОтветитьУдалить
  49. у вас в статье небольшая описка:
    for (d=-100; d<=0; d+10)
    надо:
    for (d=-100; d<=0; d+=10)

    ОтветитьУдалить

Примечание. Отправлять комментарии могут только участники этого блога.