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

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

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

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

воскресенье, 18 марта 2012 г.

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

Прочитайте улучшенную версию этого урока "Циклы с условием while и do-while".

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

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

Добрый день дорогие друзья.
После долгого перерыва,я снова с вами.
Сегодняшнее занятие будет продолжением занятия номер 7.Циклические конструкции 
Сегодня поговорим о еще двух циклических конструкциях. 
Как уже говорилось ранее,цикл for используется,когда известно сколько раз надо выполнить тело цикла. А что же делать если количество повторений заранее не известно, а есть только условие которое после которого нужно прекратить выполнять цикл. Для этих целей используют циклические конструкции while и do-while. Остановимся на каждом из них поподробнее. 

Цикл while.
Цикл  while называют еще циклом с предусловием. Чаще всего он используется когда неизвестно конкретно сколько раз нужно выполнить тело цикла.
Вот его синтаксис:

Листинг 9.1
while (условие)
    оператор;

Работает эта конструкция следующим образом.

1.Сначала проверяется условие в скобках.
1.1 Если оно истинно, то выполняется тело цикла. (Оператор). И программа снова переходит к проверке условия.  
Напомню,что тело цикла всегда состоит из одного оператора. И если нам нужно использовать несколько операторов, то как и в случае с конструкцией if-else или циклом for, применяется составной оператор {...}.
1.2 Если условие ложно, то выполнение циклической конструкции заканчивается  и программа выполняется дальше.

Заметим, что цикл может не выполниться ни одного раза,если изначально условие будет ложным.
Например:
Листинг 9.2
while (0)
{   ...   }


Цикл do-while.
Цикл do-while называют еще циклом с постусловием. И в этом состоит его основное отличие от цикла while. Сейчас мы разберем его синтаксис, поймем как он работает и увидим как раз в чем разница.

Синтаксис:


Листинг 9.3
do //заголовок цикла
оператор;} // тело цикла 
while (условие); //условие


как видите цикл do-while состоит из 3 частей. Заголовка цикла, тела цикла и условия. 
Работает эта конструкция следующим образом.
1)После того как программа встречает ключевое слово do,она понимает, что имеет дело с циклом do-while. 
2)выполняется тело цикла.
3) Проверяется условие.
3.1) Если условие истинно,то снова выполняется тело цикла.
3.2) Если условие ложно, то работа циклической конструкции заканчивается и программа выполняется дальше.

Обратите внимание, что при использовании цикла do-while, тело цикла выполнится всегда хотя бы один раз! Это очень важная особенность и иногда её очень удобно использовать.


Прочитайте улучшенную версию этого урока "Операторы управления циклом. Зацикливание.".

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

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

Зацикливание.
Теперь поговорим немного о такой пренеприятнейшей вещи как зацикливание. Зацикливание - это когда программа постоянно выполняет тело цикла и не может из него выйти. Причиной зацикливания всегда является программист. Надо всегда внимательно следить за тем, чтобы работа операторов как-то влияла на условие. 

Напоследок напишем одну маленькую программку.С использованием циклов do-while и while.
Пусть требуется написать программу которая принимает на входе положительное натуральное число, а на выходе выдает сумму цифр этого числа. При этом, надо запретить пользователю вводить отрицательные числа. (защита от дурака). 
Сначала напишем основную часть программы.
Считаем число и  посчитаем сумму его цифр.
Листинг 9.4

#include <stdio.h>

int main()
{
      int A, sum=0;
      printf("Vvedite chislo:");
      scanf("%d",&A); //считываем число

//начинаем последовательно получать каждую последнюю цифру числа. 
      while (A>0)
      {
            sum=sum+A%10;
            A= A/10;
      }
      printf("summa chifr etogo chisla: %d\n", sum);

return(0);
}


Эта программа работает. Теперь добавим в неё так называемую "защиту от дурка". Чтобы пока не введешь правильные данные,программа не будет работать. Для этого используем цикл do-while.И будем повторить ввести ввод до тех пор, пока не будет введено положительное число.
Получим следующий код.
Листинг9.5

#include <stdio.h>

int main()
{
int A, sum=0;
do {
    printf("Vvedite chislo:");
    scanf("%d",&A); //считываем число
} while(A<=0);

while (A>0){
    sum=sum+A%10;
    A= A/10;
}    

printf("summa chifr etogo chisla: %d\n", sum);
return(0);
}


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


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




  1. Дано целое число N (вводится с клавиатуры), причем N<30000. По заданному N вывести через пробел все (натуральные, т.е. 0, 1, 2, 3, ... ) степени числа 2, которые меньше N.
  2. Вычислить и вывести на экран в виде таблицы значения функции F на интервале от Хнач. до Хкон.с шагом dх.  Функция F должна принимать действительное значение, если выражение (Ац^Вц)|(Ац^Сц) не равно нулю, и целое значение в противном случае. Через Ац, Вц и Сц обозначены целые части значений a,b,c. Значения a,b,c, Хнач., Хкон., dx ввести с клавиатуры. Пока что не обязательно к выполнению.!
  3. Дано натуральное число N. Напишите программу которая считает сумму цифр этого числа.
  4. Дано натуральное число N. Выведите его представление в двоичном виде в обратном порядке.

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

90 комментариев :

  1. Как интересно, а будут ли другие языки изучаться?

    ОтветитьУдалить
    Ответы
    1. Изначально планировалось два языка, Паскаль и Си, и даже было первое занятие для каждого из языков, но позже из-за моей лености Паскаль был убран. Как видите сейчас даже раздел Си не обновляется. Но в моих планах числится закончить этот проект. Только вот не знаю как скоро я возьмусь за это.

      Удалить
  2. //№3
    #include
    int main()
    {
    int N,summ=0;
    do {
    printf("Vvedite chislo:");
    scanf("%d",&N);
    }
    while(N<=0);
    while(N>0){

    summ=summ+N%10;
    N=N/10;
    }
    printf("Summa etogo chisla %d\n" ,summ);
    return(0);
    }

    ОтветитьУдалить
    Ответы
    1. Хорошо.
      Только если используешь do...while, то пиши while в строчке в которой стоит закрывающая скобка.
      do
      {
      code
      } while ();

      а не
      do
      {
      code
      }
      while ();

      Так удобнее читать. =)

      Удалить
    2. Кадет объясни пожалуйста про sum,
      я уверен что многие не знают что это

      Удалить
    3. summ это просто переменная, в которую записывается сумма цифр числа. Можно назвать её любым другим именем, просто summ нагляднее.

      Удалить
  3. Владимир. Вот решение 1-й задачи.

    #include

    int main()
    {
    int N,a=1;
    printf("Vvedite chislo\n");
    scanf("%d",&N);
    while((a*2)<N)
    {a=a*2;
    printf("%d ",a);
    }
    return 0;
    }

    ОтветитьУдалить
  4. 4 задание
    #include
    #include
    int main(void)
    {
    int N,n;
    printf("Vvedite N\n");
    scanf("%d",&N);
    printf("N v dvoichnoi sesteme s prava na levo\n");
    while (N>0)
    {
    n=N%2;
    if (n>0)
    printf("0");
    else
    printf("1");
    N=N/2;
    printf("%d",n);
    }
    return(0);
    }

    ОтветитьУдалить
    Ответы
    1. был еще вариант, но оба считают не правильно, почему не могу понять. мож кто разберется

      Удалить
  5. //Задача 1
    #include
    int main(void)
    {
    int a,b;
    printf("Vvedite chislo <30000: ");
    scanf("%d",&a);
    b=2;
    while(b<a)
    {
    printf("%d ",b);
    b*=2;
    }
    return(0);
    }

    ОтветитьУдалить
  6. Анонимный2 мая 2013 г., 15:19

    Задание №1
    #include
    int main()
    {
    int N, i=1;
    printf("Vvedite naturalnoye chislo <30000: ");
    scanf("%d", &N);
    while(i<N)
    {
    printf("%d ", i);
    i*=2;
    }
    }

    ОтветитьУдалить
  7. Анонимный2 мая 2013 г., 15:20

    Задание №3
    #include
    int main()
    {
    int N, summ=0;
    printf("Vvedite naturalnoye chislo: ");
    scanf("%d", &N);
    while(N!=0)
    {
    summ+=(N%10);
    N/=10;
    }
    printf("Summa tsyfr %d\n", summ);
    }

    Задание №4
    #include
    int main()
    {
    int N, i=1;
    printf("Vvedite naturalnoye chislo: ");
    scanf("%d", &N);
    do
    {
    i=(N%2);
    printf("%d", i);
    N/=2;
    } while(N>=1);
    printf("\n");
    }

    ОтветитьУдалить
  8. Анонимный3 мая 2013 г., 14:46

    Задание №2
    #include
    int main()
    {
    float a, b, c, xnach, xkon, dx, x;
    printf("Vvedite 6 chislel (a,b,c,xnach,xkon,dx)\n");
    scanf("%f%f%f%f%f%f", &a,&b,&c,&xnach,&xkon,&dx);
    x=xnach;
    while(x<=xkon)
    {
    if((x<1)&&(x!=b))
    printf("\t\t|%-19f|%-19f|\n", x,(a*x*x+b));
    if((x>1)&&(x!=(-b)))
    printf("\t\t|%-19f|%-19f|\n", x,((x-a)/x));
    if(!((x>1)&&(x!=(-b)))&&!((x<1)&&(x!=b)))
    printf("\t\t|%-19f|%-19f|\n", x,(x/c));
    x+=dx;
    }
    }
    Только я не поняла часть условия "(Ац^Вц)|(Ац^Сц)", поэтому у меня все ответы в формате float...

    ОтветитьУдалить
    Ответы
    1. Завтра проверю код. С условием моя вина. Я переборщил. Это так называемые побитовые операции.Быть может я посвящу им отдельный урок или допишу этот. Хотя возможно и вообще заменю это дополнительное условие. Так как практика показывает, что у обучающихся с побитовыми операциями возникают серьезные проблемы. Возможно для начинающих это не столь важно.

      Удалить
    2. Мне не нравится третий if. Как-то все больно мудрено, попробуйте иначе, используя else. Должно получится красивее.

      Удалить
  9. Анонимный23 июня 2013 г., 12:18

    №1

    #include
    #include

    int main ()
    {
    int N,i=0;
    do
    {
    printf ("vvedite chislo N<30000\n");
    scanf ("%d",&N);
    }
    while (N<0 && N>30000);
    while (N>0)
    {
    i++;
    N/=2;
    printf ("\n%d\n", i-1);
    }
    system("pause");
    }

    ОтветитьУдалить
  10. Анонимный25 июля 2013 г., 16:46

    #include
    #include
    #include

    int main () {
    setlocale(LC_ALL,"Russian");
    int N;
    printf("Ввдите число N (0 <= N <= 30 000): ");
    scanf("%d",&N);
    while ((N < 0) && (N > 30000)) {
    printf("Не соответствует условию (0 <= N <= 30 000). Повторите ввод N: ");
    scanf("%d",N);
    }
    printf("N= %d\n",N);
    return (0);
    }

    Заготовка к первой программе. Ни как не могу понять почему не выполняется цикл? при вводе и отрицательного числа и больше 30000 выводится нижняя строчка printf("N= %d\n",N);. В чем ошибка?

    ОтветитьУдалить
    Ответы
    1. Внимательно прочитайте урок. Тело цикла выполняется, когда условие верно. )

      Удалить
  11. Анонимный25 июля 2013 г., 19:11

    Да это я видел и помню, у вас очень хорошие уроки. Но я видимо чего-то не понимаю. Ведь у меня так и есть, что бы цикл выполнялся при верном условии т.е. когда N меньше нуля и больше 30000.
    У меня написано, в перевод на человеческий:
    ввести N.
    после получения N идет цикл. у которого условие верно если N не попадает в промежуток [0;30000].
    Следовательно если я ввожу например 40000 то должен пройти цикл, написать строчку
    printf("Не соответствует условию (0 <= N <= 30 000). Повторите ввод N: ");
    Получить новое N. и т.д. пока не попадет в [0;30000]

    Но этого не происходит сразу же выводится надпись
    printf("N= %d\n",N); т.е. 40000. (да и любое другое значение так же идет в обход цикла будь то 0, 10, -1 или что еще)

    ОтветитьУдалить
    Ответы
    1. Спасибо за отзывы, мне приятно.

      У вас небольшая логическая ошибка. Смотрите. Вы связали два условия оператором И. То есть, условие будет истинно когда выполнено первое условие И второе условие. =)))

      Но, ваши два условия не могут быть выполнены одновременно. Возьмем ваш пример, число 40000. Оно больше 30000, следовательно второе условие истинно. теперь проверим первое условие. 40000 < 0 конечно же нет. Поэтому первое условие ложно. Следовательно операция И выдаст нам что условие ложно и цикл не выполняется. С этим надо быть аккуратнее. =))

      Удалить
  12. У меня не в порядке с защитой от дурака, подобной той, что в листинге 9.5. Программирую в Borland. Если ввести неправильное значение, то программа возвращается в цикл, но выполняет только команду printf, до scanf не доходит. В общем зацикливается, и приходится закрывать компилятор. Скажите, пожалуйста, почему так происходит?

    ОтветитьУдалить
  13. Задача 4
    #include
    int main()
    {
    int n,a;
    printf("Vvedite chislo:");
    scanf("%d",&n);
    while (n>0)
    {
    a=n%2;
    printf("%d",a);
    n=n/2;
    }
    printf("\n");
    return (0);
    }

    ОтветитьУдалить
  14. #include

    int main()
    {
    int N, x=1, y=0;
    do {
    printf("Vvedite chislo menshe 30000:\n");
    scanf("%d",&N); // считываем число
    } while(N>=30000); // защита от дурака
    while (x<N)
    {
    printf("%d ", y);
    x=x*2;
    y=y+1;
    }
    return(0);
    }

    ОтветитьУдалить
    Ответы
    1. Уважаемый! Что же тут хорошего? Вы в задаче №1 просите найти степени числа 2, которые меньше N, или показатели степени при возведении в которые число 2 получается число меньше N?

      Удалить
  15. Задание 3:
    #include

    int main()
    {
    int N, x=0;
    printf("Vvedite naturalnoe chislo:\n");
    scanf("%d",&N); // считываем число
    if (N>0)
    {
    while (N>0)
    {
    x=x+N%10;
    N=N/10;
    }
    }
    else
    {
    N=N*(-1);
    while (N>0)
    {
    x=x+N%10;
    N=N/10;
    }
    }

    printf("Summa cifer chisla ravna:%d\n", x);
    return(0);
    }

    ОтветитьУдалить
    Ответы
    1. Ок. Но это задание, можно было и не делать. =)

      Удалить
  16. Задание №4

    #include

    int main()
    {
    int N,x,y,z;
    printf("Vvedite naturalnoe chislo:\n");
    scanf("%d",&N); // считываем число
    while (N>0)
    {
    x=N%2;
    N=N/2;
    printf("%d", x);
    }
    printf("\nVvedite poluchenyi rezultat:\n");
    scanf("%d", &y);
    while (y>0)
    {
    z=y%10;
    printf("%d", z);
    y/=10;
    }
    return(0);

    ОтветитьУдалить
    Ответы
    1. Вторая часть программы - лишняя.

      Удалить
  17. Задание 1
    #include <//вывод степеней 2 меньше N
    int main()
    {
    int N,a=0,b=1;
    printf("vvedite chislo N<30 000 \n");
    scanf("%d",&N);
    while (b<=N)
    {
    printf(" %d",a);
    a++;
    b*=2;
    }
    printf("\n");
    return(0);
    }

    ОтветитьУдалить
  18. задание 2
    #include ((stdio.h))//задание 2
    int main()
    {
    float A,B,C,Xmin,Xmax,dX,F;
    printf("vvedite chisla A, B , C, Xmin , Xmax, dX cherez probel. \n");
    scanf("%f %f %f %f %f %f",&A,&B,&C,&Xmin,&Xmax,&dX);
    int Ac=A;
    int Bc=B;
    int Cc=C;
    printf("\tX :\tF\n");
    if ((Ac&&Bc)||(Ac&&Cc)!=0){//if0
    while(Xmin<=Xmax)
    {if((Xmin<1)&&(Xmin!=B)){//if1 проверка 1-го усл
    F=A*Xmin*Xmin+B;
    printf(" %10f:%10f\n",Xmin,F);
    }//if1
    else{//else1
    if ((Xmin>1)&&(Xmin==-B)){//if2 проверка 2-го
    F=(Xmin-A)/Xmin;
    printf(" %10f:%10f\n", Xmin,F);
    }//if2
    else{//else 2
    if (C==0)//проверка по С
    printf(" %10f: error\n", Xmin);
    else{//else 3
    F=Xmin/C;
    printf(" %10f:%10f\n", Xmin,F);
    }//else 3
    }//else 2
    }// else1
    Xmin+=dX;
    }//while
    }//if0
    else {//else0
    while(Xmin<=Xmax)
    {if((Xmin<1)&&(Xmin!=B)){//if1 проверка 1-го усл
    F=A*Xmin*Xmin+B;
    int Fc=F;
    printf(" %10f:%10d \n", Xmin,Fc);
    }//if1
    else{//else1
    if ((Xmin>1)&&(Xmin==-B)){//if2 проверка 2-го
    F=(Xmin-A)/Xmin;
    int Fc=F;
    printf(" %10f:%10d\n", Xmin,Fc);
    }//if2
    else{//else 2
    if (C==0)//проверка по С
    printf(" %10f: error\n", Xmin);
    else{//else 3
    F=Xmin/C;
    int Fc=F;
    printf(" %10f:%10d\n", Xmin,Fc);
    }//else 3
    }//else 2
    }// else1
    Xmin+=dX;
    }//while
    }//else0
    printf("\n");
    return(0);
    }
    как то некрасиво , но работает....

    ОтветитьУдалить
    Ответы
    1. Какой-то кромешный АД. =))) Даже проверять не хочется. Перепишите пожалуйста, и не делайте пока что необязательную часть.

      Удалить
  19. задание 4
    #include ((stdio.h))//представление в двоичном виде в обратном порядке
    int main()
    {
    int N,c=0;
    do{
    printf("Vvedite N\n");
    scanf("%i",&N);
    }while(N<=0);
    while (N>0){
    c=N%2;
    N=N/2;
    printf ("%d", c);
    }
    printf("\n");
    return(0);
    }

    ОтветитьУдалить
  20. Здравствуйте!
    Очень плохо понимаю написанное:
    while (A>0){
    sum=sum+A%10;
    A= A/10;

    Не понимаю A%10 : что оно делает?
    А в третьей строчке мы просто соответсвующее значение делим на 10?

    ОтветитьУдалить
    Ответы
    1. при использовании % получается остаток от деления числа, стоящего до %, на число, стоящее после %. то есть если А=25, то А%10=5

      Удалить
    2. Спасибо, что помогаете мне отвечать на вопросы. =)

      Удалить
  21. Задание 1
    #include "stdio.h"
    #include "iostream"
    int main()
    {
    setlocale(LC_ALL,"RUS");
    int n,e=1,t=0,c=2;
    printf("Введите необходимое значение степени числа 2 (от 0 до 30000)\n");
    scanf("%d",&n);
    if((n>30000)||(n==0))
    {
    printf("Неверное значение\n");
    system("pause");

    return (0);
    }

    else
    {
    while (t<n)
    {if (t==0)
    {
    printf("%d^%d=%d ",c,0,1); // не могу додуматься как иначе вывести нулевую степень
    t=t++;
    }
    printf("%d^%d=%d ",c,e,t);
    e=e+1; //Показатель степени для вывода сообщения
    t=t*2; //Вычисление степени
    }
    }
    printf("\n");
    system("pause");
    return(0);
    }

    ОтветитьУдалить
    Ответы
    1. Немножко врёт ваша программа. )

      Удалить
  22. Добрый вечер скажите Листинг 9.5
    #include

    int main()
    {
    int A, sum=0;
    do {
    printf("Vvedite chislo:");
    scanf("%d",&A); //считываем число
    } while(A<=0);

    //while (A>0) НА СКОЛЬКО ВАЖНО ВОТ ЭТО УСЛОВИЕ ПО СУТИ ПРОГРАММА ПРЕКРАСТНО РАБОТАЕТ И БЕЗ НЕГО??????
    {
    sum=sum+A%10;
    A= A/10;
    }

    printf("summa chifr etogo chisla: %d\n", sum);
    return(0);
    }

    ОтветитьУдалить
    Ответы
    1. Как вы предлагаете изменить программу?

      Удалить
  23. Добрый вечер! Подскажите пожалуйста я никак не могу понять следующее (пример из листинга 9.5)
    sum=sum+A%10;
    A= A/10;
    Я думала, что надо Sum=A/10+A%10.

    ОтветитьУдалить
    Ответы
    1. Здравствуйте. Ну давайте разберемся, как я понял вы предлагаете заменить
      sum=sum+A%10;
      A= A/10;

      на строчку
      Sum=A/10+A%10

      давайте посмотрим, что у нас получится.
      Пусть пользователь ввел число 523. Посмотрим как работает наш алгоритм.
      A=523.
      Проверяется условие цикла A>0 они истинно значит начинаем выполнять тело цикла.
      В переменную sum записываем результат выражения A/10 + A%10. это будет 52+3 = 55. Цикл заканчивается. На этом шаге получили A=523, sum=55.
      Снова проверяем условие A>0? Да, значит выполняем тело цикла.
      Переменной sum присваиваем A/10 + A%10. Получаем sum=55.
      Еще один шаг цикла выполнен. На этом шаге имеем A=523, sum=55.
      Снова проверяем условие и т.д.

      Как видите, переменная A совсем не изменяется в вашем цикле, значит он будет выполняться бесконечно. Значит это неправильный подход. А теперь точно таким же способом попробуйте разобрать ту программу, которая записана в листинге 9.5. Если будет что-то непонятно - спрашивайте. )))

      Удалить
    2. Извините, но непонятно... ведь в 9.5 тоже всегда А>0 и сумма неясно как считается sum=0+523%10=0+3=3 и А присваиваем 523/10=52... что-то не так, но где не знаю... Помогите , пожалуйста!

      Удалить
    3. В 9.5 не всегда А>0. сначала 523, потом 52, потом 5, потом 0 и конец цикла. =))
      Вы сделали только первый шаг. =)) После него у вас sum =3 а А=52. Теперь выполните еще один шаг цикла, уже с этими данными.

      За один шаг мы записали в сумму последнюю цифру исходного числа, т.е. тройку, а в исходной числе эту тройку отбросили, так как мы уже её посчитали. =))

      Удалить
    4. объясните, пожалуйста, тогда следующий шаг данного цикла: summ=5+5%10=???

      Удалить
    5. О каком цикле речь? О том, что в 9.5?
      Тогда там такие итерации

      523
      первая
      summ=0+523%10 = 0+3 =3
      A = 523/10 = 52
      вторая
      summ=3+52%10 = 3+2 =5
      A = 52/10 = 5
      третья
      summ=5+5%10 = 5+5 =10
      A = 5/10 = 0

      Удалить
  24. Ааааа, понятно! Все теперь ясно! Спасибо!!!

    ОтветитьУдалить
  25. Добрый вечер.
    9-1
    int main()
    {
    int N,a=1;
    printf("vvedite chislo\n");
    scanf("%d",&N);
    while(a<=N){
    printf("%d ",a); // vivod na ekran vsex stepenej 2 menche N
    a=a*2;
    }
    return 0;
    }

    9-4
    int main()
    {
    int N,a=0;
    printf("vvedite chislo\n");
    scanf("%d",&N);
    while (N>0){
    a=N%2;
    N=N/2;
    printf("%d",a); // vvivod chisla N v dvoichnom vide v obratnom poriadke
    }
    return 0;
    }
    Спасибо за Ваши уроки!!!

    ОтветитьУдалить
    Ответы
    1. 9-1. Нет, не правильно. Вывести нужно показатели степени, а не значения. =))

      9-2. Хорошо. ))

      Удалить
    2. Запутался немного, так что ли?
      9-1
      int main()
      {
      int N,i;

      printf("vvedite chislo\n");
      scanf("%d",&N);
      for(i=0; i<N; i++){
      printf("%d ",i); // vivod na ekran N stepenej 2
      }
      return 0;
      }

      Удалить
  26. Помогите разобраться в 1 задаче, почему то условие while (A
    #include
    #include
    int main()
    {
    //int N, A=0;
    float N, A=0, i=0;
    printf("Vvedite chislo:");
    scanf("%f",&N);
    if (N<30000)
    do {
    A=pow(2,i);
    i++;
    printf("Naturalnie stepeni chisla 2: %f\n", A);
    } while (A<N);
    else
    printf("Vvedite pravilnoe chislo:");
    getch();
    }

    ОтветитьУдалить
    Ответы
    1. Добрый день, Александра.

      Сначала укажу вам на то, что вы выводите не то, что требуется. Выводить нужно сами степени, а не значения. т.е. 0 1 2 3, а не 1 2 4 16

      А что не так с условием? Условие верное, и работает все правильно, так как написано. Просто у вас сначала выполняет вывод, а потом проверка условия. Стоит использовать цикл с предусловием while. ))

      Удалить
    2. И еще, куда-то у вас запропастился заключительный return. Не хорошо!

      Удалить
  27. 9.1
    # include
    # include
    int main (void)
    {
    int c;
    double stepeni=1,rezultat;
    do
    {
    printf ("Vvedite cislo ne bolsche 30000:\n");
    scanf ("%d",&c);
    }while (c >=30000);
    do
    {
    rezultat= pow(2,stepeni);
    printf ("2 v%.0f stepeni=%.0f\n",stepeni,rezultat);
    stepeni= stepeni++;
    }
    while(stepeni<c);


    return(0);
    }



    Предвижу критику. Просто не знаю какая ескейп последовательность для пробела. : ))
    А так очень красиво получается.

    ОтветитьУдалить
    Ответы
    1. Пробел это просто пробел, ну либо используйте "\t". Но что это? Я ввожу 1200, надеясь увидеть
      0 1 2 3 4 5 6 7 8 9 10

      А программа зацикливается.)

      Удалить
  28. Здравствуйте.
    Задача 1.

    int main()
    {
    int a, i, power;

    do {
    printf("Enter a integer number less 30000 --> ");
    scanf("%d", &a);
    } while(a >= 30000);

    i = 0;
    power = 1;
    while( power <= a) {
    printf("%d ", i);
    ++i;
    power = power * 2;
    }

    printf("\n");
    system("pause");
    return 0;
    }

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

      Удалить
  29. Задача 4.

    #include
    int main()
    {
    int a;

    printf("Enter a natura number --> ");
    scanf("%d", &a);

    while(a > 0) {
    printf("%d ", a % 2);
    a = a / 2;
    }
    printf("\n");

    system("pause");
    return 0;
    }

    ОтветитьУдалить
    Ответы
    1. Небольшая неточность. Не работает, если я ввожу нуль. )

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

    ОтветитьУдалить
  31. Задание №2
    http://pastebin.ru/IC1m9mAd

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

    #include
    #include

    int main (){
    int cheslo,stepen=0,N;
    do {
    printf("Введите число, которое меньше 30000, но не больше 0\nЧисло:");
    scanf("%d", &N);
    } while (N>30000 || N<0);
    while (N>cheslo){
    cheslo=pow(2,stepen);
    if(N>cheslo){
    printf(" %d", stepen);
    }/*if(cheslo<N)*/
    stepen++;
    }/*wh (cheslo<N)*/
    printf("\n");
    return 0;}

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

    #include

    int main (){
    int n;
    printf ("Перевод числа n в двоичный код в обратном порядке\nn:");
    scanf("%d", &n);
    while (n>0){
    printf ("%d",n%2);
    n=n/2;
    }/*wh (n<0)*/
    printf ("\n");
    return 0;}

    ОтветитьУдалить
  34. Анонимный21 июня 2014 г., 22:28

    #include "stdio.h"
    #include "math.h"

    float F (float a, float b, float c, float x)
    {
    float f;
    if ((x-1<0) && (b-x != 0))
    {
    f=a*x*x+b;
    return f;
    }
    if ((x-1>0) && (b+x==0))
    {
    f=(x-a)/x;
    return f;
    }
    f=x/c;
    return f;
    }

    int main(void)
    {
    float a, b, c, x1, x2, x, dx;
    scanf ("%f %f %f %f %f %f", &a, &b, &c, &x1, &x2, &dx );
    for(x=x1; x<=x2; x=x+dx)
    {
    printf ("x = %f, F = %f \n", x, F(a, b, c, x));
    }
    return (0);
    }

    ОтветитьУдалить
  35. 1oe i 5oe zadanie twix

    // lessons.cpp: определяет точку входа для консольного приложения.
    //
    #include "stdafx.h"
    #include
    #include

    int main() {
    int n, a, b = 0;
    printf("vvedite polozhitelnoe celoe chislo:\n");
    scanf_s("%i", &n);
    while (n > 0) {
    a = n % 2;
    n = n / 2;
    printf(" %i", a);
    b = b + 1;
    }
    printf("\n max kol-vo stepenei cifri 2 po rezultatu ne previshaushee vvedenoe chislo, vkluchaya nulevuyu stepen = %i \n", b);
    return(0);
    }

    ОтветитьУдалить
    Ответы
    1. т.к. кол-во весомых 0 и 1 в бинарном виде числа, и есть максимально возможная степень 2 не превышающая при возведении введенного числа
      приятель подсказал ;)

      Удалить
    2. Добрый день. Если это первая программа, то неправильно. ))) Выводить нужно степени. Зато это может сойти за четвертую программу.
      Кстати, вы создали немного не тот тип проекта, о котором говорилось в первых уроках.

      Удалить
    3. ну это ньюансы, я про саму идею. И конечно да, я ошибся, я имел ввиду первое и последнее четвертое задание...
      вот дописал немного
      // lessons.cpp: определяет точку входа для консольного приложения.
      //
      #include "stdafx.h"
      #include
      #include

      int main() {
      int n, a, i, b = 0;
      printf("vvedite polozhitelnoe celoe chislo:\n");
      scanf_s("%i", &n);
      printf(" Chislo v dvoichnom kode: ");
      while (n > 0) {
      a = n % 2;
      n = n / 2;
      printf(" %i ", a);
      b = b + 1;
      }
      printf(" Stepeni dvoiki: ");
      for (i = 0; i < b;i++)
      printf(" %i ", i);
      return(0);
      }

      а что вы имеете ввиду про тип проекта? я просто установил себе visual studio express, и там кстати у меня возникли проблемы с уроком switch - case , scanf мне категорически запрещает использовать вижуал студио, настойчиво предлагая использовать Scanf_s , а там с char переменной выдает ошибки при считывании ;( даже программы которые вы приняли в комментах не работают ;(

      Удалить
    4. Под типом проекта я понимаю тип проекта. Видите у вас появляются всякие

      // lessons.cpp: определяет точку входа для консольного приложения.
      //
      #include "stdafx.h"

      Нужно было создавать пустой проект.

      Это не ошибки, а предупреждения. Можете не обращать на них внимания пока что. Хотя можете поискать в интернете чем так плохи эти функции.

      Удалить
  36. да и спасибо за Ваши уроки, ими занимаюсь вторую неделю, учитывая нулевые базовые знания 20 летней давности...

    ОтветитьУдалить
  37. Листинг 9.4

    #include

    int main()
    {
    int A, sum=0;
    printf("Vvedite chislo:");
    scanf("%d",&A); //считываем число

    //начинаем последовательно получать каждую последнюю цифру числа.
    while (A>0)
    {
    sum=sum+A%10;
    A= A/10;
    }
    printf("summa chifr etogo chisla: %d\n", sum);

    return(0);
    }
    для чего А делить на 10 при этом получив остаток а затем остаток опять делить на 10 ?

    ОтветитьУдалить
  38. Здравствуйте напишите пожалуйта программу которая переводит число из двоичной в десятичную систему счисления я чайник поэтому используйте по возможности простые операторы и с обьяснениями большое спасибо!

    ОтветитьУдалить
    Ответы
    1. С такими предложениями вам сюда: http://youngcoder.blogspot.ru/p/blog-page_9.html

      Удалить
  39. Задание № 2

    Происходит зацикливание, но не могу найти ошибки.

    #include
    #include
    int main (void) {
    float a, b, c, x, F, x_nach, x_kon;
    scanf ("%f, %f, %f, %f, %f", &a, &b, &c, &x_nach, &x_kon);
    x=x_nach;
    printf ("|| x || F ||\n");
    while (x<=x_kon) {
    if (x-1<0 && b-x!=0) {
    F=a*pow (x, 2)+b;
    printf ("|| %5.0f || %5.0f ||\n", x, F);
    }
    else {
    if (x-1>0 && b+x==0) {
    F=(x-a)/x;
    printf ("|| %5.0f || %5.0f ||\n", x, F);
    }
    else {
    F=x/c;
    printf ("|| %5.0f || %5.0f ||\n", x, F);
    }
    }
    x++;
    }
    return (0);
    }

    ОтветитьУдалить
    Ответы
    1. Добрый день, Никита.
      Думаю всё дело в считывании данных.
      У вас вот такая формат-строка %f, %f, %f, %f, %f

      Это значит на входе должны быть числа разделенные запятой и пробелом. Например:
      1, 2, 3, 1, 10
      тогда программа считает их нормально, иначе, если вы введете 1 2 3 1 10 в переменные запишется непонятно что.
      Кроме того, вы выполняете не совсем то задание. ваша программа вычисляет значение функции единичным шагом, а он должен быть произвольным и задаваться пользователем.

      Удалить
  40. Задание 2 доп условие не понял=( поэтому не делал
    int main (void)
    {
    float X_begin, X_end, a,b,c,dx,x,f;
    printf ("Vvedite 6 chisel: X_nachalo, X_konec, a,b,c i shag dx ");
    scanf ("%f %f %f %f %f %f", &X_begin,&X_end,&a,&b,&c,&dx);
    x=X_begin;
    while (x<=X_end){
    if ((x-1<0) && (b-x!=0))
    {
    f=a*x*x+b;
    printf ("\t\t\t|%-20.6f|%-20.6f|\n", x,f);
    x+=dx;
    }
    if ((x-1>0) && (b+x==0))
    {
    f=(x-a)/x;
    printf ("\t\t\t|%-20.6f|%-20.6f|\n", x,f);
    x+=dx;
    }
    else
    {
    f=x/c;
    printf ("\t\t\t|%-20.6f|%-20.6f|\n", x,f);
    x+=dx;
    }

    }
    return (0);
    }

    ОтветитьУдалить
  41. Доброго времени суток!!! Только что сделал задание 4. И по ходу выполнения столкнулся я с такой проблемой, когда у меня оператор printf находиться в теле цикла while, то программа выводит число в двоичном виде. Но если printf находиться вне цикла, то выводит либо ноль либо единицу. В задаче которую Вы представили в уроке, printf находиться за циклом, но все работает. Вот и хотелось бы мне узнать в чем собственно разница. Заранее благодарен за ответ!

    ОтветитьУдалить
  42. Добрый день, подскажите где ошибка
    Задание 1

    # include
    # include

    int main()
    {

    float N, x=1, y=0;
    printf("Vvedite chislo:");
    scanf("%f",&N);

    while (x<N)
    {

    x=pow (2,y);
    y++;
    printf ("%.0f ", y);
    }
    return (0);
    }

    ОтветитьУдалить
    Ответы
    1. y - обозначает степень, а не число возведённое в неё.
      В последнем printf("%.0f ",y); ошибка. Там должен быть "x". В твоём случае должно выйти так:
      // Урок 9 Задание 1
      #include "stdio.h"
      #include "math.h"

      int main()
      {

      float N,x=1,y=0;
      printf("Vvedite chislo:\n");
      scanf("%f\n",&N);

      while (x<N)
      {

      x=pow(2,y);
      y++;
      printf("%.0f\n",x);
      }
      return(0);
      }

      Удалить
    2. меньше мудрить нужно, я библиотеку "math.h" даже не приклеивал сюда, чем механизм проще тем проще его чинить

      Удалить
  43. // Урок 9
    #include
    int main()
    {
    int N, a=2;
    float x=2;
    do
    {
    printf("Vvedite chislo N, N<30000\n");
    scanf("%d\n",&N);
    } while ((N>30000)||(N<0));

    while (x*2<N)
    {
    x=x*2;
    printf("2v%d=%.0f\n",a,x);
    a++;
    }
    return(0);
    }

    ОтветитьУдалить
  44. //Задание 3
    #include
    int main()
    {
    int N, a=0, b, i;
    printf("Vvedite naturalnoe chislo N, dvuh i bolee znachnoe\n");
    scanf("%d\n",&N);
    while (N>0)
    {
    b=N%10;
    a=a+b;
    N=N/10;
    }
    printf("Summa chifr chisla=%d\n",a);
    return(0);
    }

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

    ОтветитьУдалить
  46. листинг 9.5...
    я переписал его (я так всегда делаю для тренировки).
    я не понимаю почему он работает некорректно.
    ввожу например 523, выдает сумма цифр 10. Как так?
    высчитывая по формуле sum=sum+A%10; A=A/10 меня так и получилось - 10...
    sпервая
    summ=0+523%10 = 0+3 =3
    A = 523/10 = 52
    вторая
    summ=3+52%10 = 3+2 =5
    A = 52/10 = 5
    третья
    summ=5+5%10 = 5+5 =10
    A = 5/10 = 0
    получился 0, цикл прекратился.
    Получается 10 знаков?

    ОтветитьУдалить
    Ответы
    1. вот сам код:
      #include
      int main()
      {
      int A, sum=0;
      do {
      printf("Vvedite chislo:");
      scanf("%d",&A);
      } while(A<=0);
      while (A>0){
      sum=sum+A%10;
      A= A/10;
      }
      printf("summa chifr chisla: %d\n", sum);
      return(0);
      }

      Удалить

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