Прочитайте улучшенную версию этого урока "Циклы с условием 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);
}
На этом сегодня всё. Домашнего задания к этому уроку не будет. Так как мне надо разобраться с той кучей вопросов, которые накопились за это время в комментариях.
Задание для практической работы.
- Дано целое число N (вводится с клавиатуры), причем N<30000. По заданному N вывести через пробел все (натуральные, т.е. 0, 1, 2, 3, ... ) степени числа 2, которые меньше N.
- Вычислить и вывести на экран в виде таблицы значения функции F на интервале от Хнач. до Хкон.с шагом dх. Функция F должна принимать действительное значение, если выражение (Ац^Вц)|(Ац^Сц) не равно нулю, и целое значение в противном случае. Через Ац, Вц и Сц обозначены целые части значений a,b,c. Значения a,b,c, Хнач., Хкон., dx ввести с клавиатуры. Пока что не обязательно к выполнению.!
- Дано натуральное число N. Напишите программу которая считает сумму цифр этого числа.
- Дано натуральное число N. Выведите его представление в двоичном виде в обратном порядке.
Если Вам понравился этот урок, расскажите о нем вашим друзьям. В этом Вам могут помочь кнопки основных социальных сетей, расположенные ниже. Вам остается всего лишь кликнуть по любой из них.
Как интересно, а будут ли другие языки изучаться?
ОтветитьУдалитьИзначально планировалось два языка, Паскаль и Си, и даже было первое занятие для каждого из языков, но позже из-за моей лености Паскаль был убран. Как видите сейчас даже раздел Си не обновляется. Но в моих планах числится закончить этот проект. Только вот не знаю как скоро я возьмусь за это.
УдалитьХех
Удалить//№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);
}
Хорошо.
УдалитьТолько если используешь do...while, то пиши while в строчке в которой стоит закрывающая скобка.
do
{
code
} while ();
а не
do
{
code
}
while ();
Так удобнее читать. =)
Кадет объясни пожалуйста про sum,
Удалитья уверен что многие не знают что это
summ это просто переменная, в которую записывается сумма цифр числа. Можно назвать её любым другим именем, просто summ нагляднее.
УдалитьВладимир. Вот решение 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 задание
ОтветитьУдалить#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
ОтветитьУдалить#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);
}
Задание №1
ОтветитьУдалить#include
int main()
{
int N, i=1;
printf("Vvedite naturalnoye chislo <30000: ");
scanf("%d", &N);
while(i<N)
{
printf("%d ", i);
i*=2;
}
}
Задание №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");
}
Задание №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...
Завтра проверю код. С условием моя вина. Я переборщил. Это так называемые побитовые операции.Быть может я посвящу им отдельный урок или допишу этот. Хотя возможно и вообще заменю это дополнительное условие. Так как практика показывает, что у обучающихся с побитовыми операциями возникают серьезные проблемы. Возможно для начинающих это не столь важно.
УдалитьМне не нравится третий if. Как-то все больно мудрено, попробуйте иначе, используя else. Должно получится красивее.
Удалить№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");
}
#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);. В чем ошибка?
Внимательно прочитайте урок. Тело цикла выполняется, когда условие верно. )
УдалитьДа это я видел и помню, у вас очень хорошие уроки. Но я видимо чего-то не понимаю. Ведь у меня так и есть, что бы цикл выполнялся при верном условии т.е. когда 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 или что еще)
Спасибо за отзывы, мне приятно.
УдалитьУ вас небольшая логическая ошибка. Смотрите. Вы связали два условия оператором И. То есть, условие будет истинно когда выполнено первое условие И второе условие. =)))
Но, ваши два условия не могут быть выполнены одновременно. Возьмем ваш пример, число 40000. Оно больше 30000, следовательно второе условие истинно. теперь проверим первое условие. 40000 < 0 конечно же нет. Поэтому первое условие ложно. Следовательно операция И выдаст нам что условие ложно и цикл не выполняется. С этим надо быть аккуратнее. =))
У меня не в порядке с защитой от дурака, подобной той, что в листинге 9.5. Программирую в Borland. Если ввести неправильное значение, то программа возвращается в цикл, но выполняет только команду printf, до scanf не доходит. В общем зацикливается, и приходится закрывать компилятор. Скажите, пожалуйста, почему так происходит?
ОтветитьУдалитьЗадача 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);
}
#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 просите найти степени числа 2, которые меньше N, или показатели степени при возведении в которые число 2 получается число меньше N?
УдалитьЗадание 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);
}
Ок. Но это задание, можно было и не делать. =)
УдалитьЗадание №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
ОтветитьУдалить#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);
}
Хорошо.)
Удалитьзадание 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);
}
как то некрасиво , но работает....
Какой-то кромешный АД. =))) Даже проверять не хочется. Перепишите пожалуйста, и не делайте пока что необязательную часть.
Удалитьзадание 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);
}
хорошо.
УдалитьЗдравствуйте!
ОтветитьУдалитьОчень плохо понимаю написанное:
while (A>0){
sum=sum+A%10;
A= A/10;
Не понимаю A%10 : что оно делает?
А в третьей строчке мы просто соответсвующее значение делим на 10?
при использовании % получается остаток от деления числа, стоящего до %, на число, стоящее после %. то есть если А=25, то А%10=5
УдалитьСпасибо, что помогаете мне отвечать на вопросы. =)
УдалитьЗадание 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);
}
Немножко врёт ваша программа. )
УдалитьДобрый вечер скажите Листинг 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);
}
Как вы предлагаете изменить программу?
УдалитьДобрый вечер! Подскажите пожалуйста я никак не могу понять следующее (пример из листинга 9.5)
ОтветитьУдалитьsum=sum+A%10;
A= A/10;
Я думала, что надо Sum=A/10+A%10.
Здравствуйте. Ну давайте разберемся, как я понял вы предлагаете заменить
Удалить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. Если будет что-то непонятно - спрашивайте. )))
Извините, но непонятно... ведь в 9.5 тоже всегда А>0 и сумма неясно как считается sum=0+523%10=0+3=3 и А присваиваем 523/10=52... что-то не так, но где не знаю... Помогите , пожалуйста!
УдалитьВ 9.5 не всегда А>0. сначала 523, потом 52, потом 5, потом 0 и конец цикла. =))
УдалитьВы сделали только первый шаг. =)) После него у вас sum =3 а А=52. Теперь выполните еще один шаг цикла, уже с этими данными.
За один шаг мы записали в сумму последнюю цифру исходного числа, т.е. тройку, а в исходной числе эту тройку отбросили, так как мы уже её посчитали. =))
объясните, пожалуйста, тогда следующий шаг данного цикла: summ=5+5%10=???
УдалитьО каком цикле речь? О том, что в 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
Ааааа, понятно! Все теперь ясно! Спасибо!!!
ОтветитьУдалитьДобрый вечер.
ОтветитьУдалить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;
}
Спасибо за Ваши уроки!!!
9-1. Нет, не правильно. Вывести нужно показатели степени, а не значения. =))
Удалить9-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;
}
Помогите разобраться в 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();
}
Добрый день, Александра.
УдалитьСначала укажу вам на то, что вы выводите не то, что требуется. Выводить нужно сами степени, а не значения. т.е. 0 1 2 3, а не 1 2 4 16
А что не так с условием? Условие верное, и работает все правильно, так как написано. Просто у вас сначала выполняет вывод, а потом проверка условия. Стоит использовать цикл с предусловием while. ))
И еще, куда-то у вас запропастился заключительный return. Не хорошо!
Удалить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);
}
Предвижу критику. Просто не знаю какая ескейп последовательность для пробела. : ))
А так очень красиво получается.
Пробел это просто пробел, ну либо используйте "\t". Но что это? Я ввожу 1200, надеясь увидеть
Удалить0 1 2 3 4 5 6 7 8 9 10
А программа зацикливается.)
Здравствуйте.
ОтветитьУдалитьЗадача 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;
}
Хорошо, только зачем было проверять вводимое число?)
УдалитьЗадача 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;
}
Небольшая неточность. Не работает, если я ввожу нуль. )
УдалитьЭтот комментарий был удален автором.
ОтветитьУдалитьЗадание №2
ОтветитьУдалитьhttp://pastebin.ru/IC1m9mAd
Задание 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;}
Задание 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;}
Все хорошо.
Удалить#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);
}
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);
}
т.к. кол-во весомых 0 и 1 в бинарном виде числа, и есть максимально возможная степень 2 не превышающая при возведении введенного числа
Удалитьприятель подсказал ;)
Добрый день. Если это первая программа, то неправильно. ))) Выводить нужно степени. Зато это может сойти за четвертую программу.
УдалитьКстати, вы создали немного не тот тип проекта, о котором говорилось в первых уроках.
ну это ньюансы, я про саму идею. И конечно да, я ошибся, я имел ввиду первое и последнее четвертое задание...
Удалитьвот дописал немного
// 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 переменной выдает ошибки при считывании ;( даже программы которые вы приняли в комментах не работают ;(
Под типом проекта я понимаю тип проекта. Видите у вас появляются всякие
Удалить// lessons.cpp: определяет точку входа для консольного приложения.
//
#include "stdafx.h"
Нужно было создавать пустой проект.
Это не ошибки, а предупреждения. Можете не обращать на них внимания пока что. Хотя можете поискать в интернете чем так плохи эти функции.
да и спасибо за Ваши уроки, ими занимаюсь вторую неделю, учитывая нулевые базовые знания 20 летней давности...
ОтветитьУдалитьЛистинг 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 ?
Здравствуйте напишите пожалуйта программу которая переводит число из двоичной в десятичную систему счисления я чайник поэтому используйте по возможности простые операторы и с обьяснениями большое спасибо!
ОтветитьУдалитьС такими предложениями вам сюда: http://youngcoder.blogspot.ru/p/blog-page_9.html
УдалитьЗадание № 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);
}
Добрый день, Никита.
УдалитьДумаю всё дело в считывании данных.
У вас вот такая формат-строка %f, %f, %f, %f, %f
Это значит на входе должны быть числа разделенные запятой и пробелом. Например:
1, 2, 3, 1, 10
тогда программа считает их нормально, иначе, если вы введете 1 2 3 1 10 в переменные запишется непонятно что.
Кроме того, вы выполняете не совсем то задание. ваша программа вычисляет значение функции единичным шагом, а он должен быть произвольным и задаваться пользователем.
Задание 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);
}
Доброго времени суток!!! Только что сделал задание 4. И по ходу выполнения столкнулся я с такой проблемой, когда у меня оператор printf находиться в теле цикла while, то программа выводит число в двоичном виде. Но если printf находиться вне цикла, то выводит либо ноль либо единицу. В задаче которую Вы представили в уроке, printf находиться за циклом, но все работает. Вот и хотелось бы мне узнать в чем собственно разница. Заранее благодарен за ответ!
ОтветитьУдалитьДобрый день, подскажите где ошибка
ОтветитьУдалитьЗадание 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);
}
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);
}
меньше мудрить нужно, я библиотеку "math.h" даже не приклеивал сюда, чем механизм проще тем проще его чинить
Удалить// Урок 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);
}
//Задание 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);
}
Этот комментарий был удален автором.
ОтветитьУдалитьлистинг 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 знаков?
вот сам код:
Удалить#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);
}