Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование на С.docx
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
1.77 Mб
Скачать

Зацикливание.

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

Напоследок напишем одну маленькую программку.С использованием циклов 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.

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

  2. Дано натуральное число N. Напишите программу которая считает сумму цифр этого числа.

  3. Дано натуральное число N. Выведите его представление в двоичном виде в обратном порядке.

Занятие 10. Функции определяемые пользователем.

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

В домашнем задании к уроку №5 я просил вас, написать программу, которая решает уравнение ах=b в целых числах относительно х. Что многие успешно сделали. Разберем теперь другую сторону вопроса. Пусть нам надо проверить одну такую программу. Вот её код.

Листинг 10.1

#include <stdio.h>

int main(void)

{

int a,b;

scanf("%d %d",&a,&b);

if((a==0)&&(b!=0)) printf("no solution\n");

else {

if((a==0)&&(b==0)) printf("many solution\n");

else {

if (b%a!=0) printf("no solution\n");

else {

printf("%d\n",b/a);

}

}

}

return(0);

}

Теперь подумаем как вообще должно решаться такое уравнение и подберем к нему набор тестов.

ах=b следовательно х=b/a. Так как решение в целых числах, то при делении b на a не должно получаться остатка.

Получаем несколько вариантов решения.

1) а=0 и b=0 х любое число.т.е. программа должна вывести many solution.

2) a=0 и b!=0 решений нет. Программа должна ответить no solution

3) b делится на а без остатка, то это и b/a решение.

4) b делится на а с остатком. Программа должна вывести no solution

Теперь подберем проверочные значения для каждого случая.

1. а=0, b=0

2. a=0, b=3

3. a=3, b=9

4. a=3, b=7

Теперь нам надо проверить нашу программу на всех этих данных и если в ответе получается

1.many solution

2. no solution

3.3

4.no solution

то программа написана верно.

Разберемся как можно сделать это используя те знания, которые у нас уже есть за 9 уроков.

1 способ.

Мы можем запустить нашу программу несколько раз и подставить в неё эти данные, но это слишком долго. Отметаем этот способ.

2 способ.

Можем переписать программу добавив в неё цикл на 4 шага и каждый раз вводить значения и смотреть ответы. Программа будет выглядеть следующим образом.

Листинг 10.2

#include <stdio.h>

int main(void)

{

for(int i=0;i<4;i++) {

int a,b;

scanf("%d %d",&a,&b);

if((a==0)&&(b!=0)) printf("no solution\n");

else {

if((a==0)&&(b==0)) printf("many solution\n");

else {

if (b%a!=0) printf("no solution\n");

else {

printf("%d\n",b/a);

}

}

}

}

return(0);

}

Вот так будет выглядеть окно программы.

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

3 способ.

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

4 способ.

Хорошо было бы написать так программу, чтобы мы туда один раз скопировали текст своей программы, запустили её и она нам сразу выдала бы, правильно работает программа или нет.

Вот здесь-то нам и придут на помощь подпрограммы. Подпрограмма это отдельная программа которая может выполняться внутри основной программы.

Подпрограммы в различных языках программирования делят на два вида. Функции и процедуры. Различие между двумя этими названиями лишь в том, что

функция это подпрограмма, которая после своего выполнения возвращает в программу какое-то значение, а процедура это подпрограмма, которая после своего выполнения не возвращает в программу ничего.

Функция main, которая есть в каждой нашей программе является именно функцией, так как после того как она выполнится она возвращает в программу которое её вызвала, а в данном случае операционная система, некоторое значение.

В некоторых языках программирования функции и процедуры разграничены синтаксисом языка. Например, в языке программирования Pascal. В языке Си, процедура это любая функция которая возвращает значение типа void. Поэтому, здесь и далее я буду использовать название функция как для функций, так и для процедур.