Сегодняшний наш урок будет посвящен пользовательским функциям, который программист пишет самостоятельно. Когда я отвечал на ваши комментарии к прошлым урокам, нашел хороший пример для иллюстрации использования функций в Си. Про полезность хороший примеров я уже говорил. Итак начнем.
В домашнем задании к уроку №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. Поэтому, здесь и далее я буду использовать название функция как для функций, так и для процедур.