Цель работы: ознакомиться с возможностями функции scanf(). Научиться составлять условные алгоритмы на примере алгоритма проверки ошибок ввода данных. Реализовать алгоритм на языке Си.
Не всем алгоритмам достаточно для выполнения конструкции следования. Рассмотрим следующий пример: . Алгоритм решения этой задачи может быть следующим:
Эта управляющая конструкция носит название развилка (проверка условия, условная конструкция) – ЕСЛИ условие ТО действия при истинном условии ИНАЧЕ действия при ложном условии.
Для организации ветвления алгоритма в Си используется оператор проверки условия if (логическое выражение) {действия при истинном значении выражения} else {действия при ложном значении выражения}. Оператор else может отсутствовать, если это обусловлено алгоритмом.
Логическое условие может быть сложным, т.е. может состоять из нескольких условий, связанных между собой логическими операциями:
- «И» (конъюнкция), в Си оператор &&, все логическое выражение считается истинным только в том случае, если истинны все простые выражения.
- «ИЛИ» (дизъюнкция), в Си оператор ||, все логическое выражение считается ложным только в том случае, если ложны все простые выражения.
Например, запишем следующее условие «Если переменная x меньше переменной y и переменная x меньше переменной z»: x
Если в блоках программы, выполняющихся при истинности или ложности условия необходимо выполнить два и более действий, эти блоки определяются фигурными скобками. Приведем примеры.
- Если x < y, то вывести на экран значение суммы x и y, значение переменной x заменить на 10.
- Если x не равно y вывести на экран соответствующее сообщение, в противном случае вывести на экран значения переменных переменную x увеличить в два раза.
При некорректном вводе (введены данные, несовпадающие с указанным спецификатором) не возникает ошибка выполнения. Но при этом дальнейшая работа программы не предсказуема. Такие ошибки можно отследить, проанализировав результат работы функции scanf. При успешном вводе результат работы функции – количество введенных верно полей. Например, проверку ошибок ввода можно выполнить, следующим образом:
В рассмотренном примере количество вводимых полей – 1 (вводится одна переменная n). Следовательно, если переменная y не принимает значение один – произошла ошибка ввода. На экран выводятся соответствующие сообщения. Программа ожидает нажатия клавиши и заканчивает работу (exit). В случае успешной работы выполняется часть программы, описанная в блоке else.
При одном вызове функции возможно ввести более одной переменной. В этом случае спецификаторы формата пишутся один за другим, без пробелов. Каждому спецификатору должен соответствовать свой адрес переменной. При этом scanf при успешном вводе возвращает количество успешно считанных полей. Например:
После успешного выполнения программы значение переменной m примет значение 3.
Составить и записать алгоритм решения индивидуального задания с проверкой корректности данных. По составленному алгоритму написать программу на языке Си.
1. Получить индивидуальное задание
2. По индивидуальному заданию определить типы и значения данных, являющиеся некорректными для задачи.
3. Составить и записать алгоритм решения задачи
4. Составить программу, реализующую алгоритм:
4.1.Описать входные и выходные данные
4.2.Ввести данные с клавиатуры
4.3.Проверить входные данные
4.4.Вычислить значение функции
4.5.Вывести полученное значение на экран
4.6.Вывести личные данные
4.7.Выполнить компиляцию проекта
5. Защитить работу
Задание оценивается в 5 баллов:
1 балл алгоритм,
1 балл – код программы,
3 балла ответы на вопросы.
Задание: Даны x, y, z. Вычислить a, b, если
и
.
. Значения x,y,z вводить с клавиатуры.
Пример программы на Си – папка Dev-lab2.
1. Что возвращает функция scanf?
2. Запишите функцию scanf для ввода трех переменных.
3. Что Вы понимаете под некорректными данными?
4. Какие данные будут некорректными для решения следующей задачи – “Даны длины трех сторон треугольника. Найдите площадь треугольника.”
5. Как в Си реализована условная конструкция структурного программирования?
6. Опишите синтаксис конструкции if else языка Си.
7. Какое значение примет переменная m после выполнения следующего фрагмента программы:
если с клавиатуры были введены значения 3 2?
8. Какое значение примет переменная m после выполнения следующего фрагмента программы:
если с клавиатуры были введены значения 3 d?
9. Какое значение примет переменная x после выполнения следующего фрагмента программы:
10. Какое значение примет переменная x после выполнения следующего фрагмента программы:
1. Разветвляющиеся (условные) алгоритмы
Не всем алгоритмам достаточно для выполнения конструкции следования. Рассмотрим следующий пример: . Алгоритм решения этой задачи может быть следующим:
Шаг 1. Задать х.
Шаг 2. ЕСЛИ х=0 ТО f := 1 ИНАЧЕ f := .
КОНЕЦ
Шаг 2. ЕСЛИ х=0 ТО f := 1 ИНАЧЕ f := .
КОНЕЦ
Эта управляющая конструкция носит название развилка (проверка условия, условная конструкция) – ЕСЛИ условие ТО действия при истинном условии ИНАЧЕ действия при ложном условии.
2. Условная конструкция в языке Си
Для организации ветвления алгоритма в Си используется оператор проверки условия if (логическое выражение) {действия при истинном значении выражения} else {действия при ложном значении выражения}. Оператор else может отсутствовать, если это обусловлено алгоритмом.
Логическое условие может быть сложным, т.е. может состоять из нескольких условий, связанных между собой логическими операциями:
- «И» (конъюнкция), в Си оператор &&, все логическое выражение считается истинным только в том случае, если истинны все простые выражения.
- «ИЛИ» (дизъюнкция), в Си оператор ||, все логическое выражение считается ложным только в том случае, если ложны все простые выражения.
Например, запишем следующее условие «Если переменная x меньше переменной y и переменная x меньше переменной z»: x
Если в блоках программы, выполняющихся при истинности или ложности условия необходимо выполнить два и более действий, эти блоки определяются фигурными скобками. Приведем примеры.
- Если x < y, то вывести на экран значение суммы x и y, значение переменной x заменить на 10.
if (x %d”,x+y);
x = 10;
}
x = 10;
}
- Если x не равно y вывести на экран соответствующее сообщение, в противном случае вывести на экран значения переменных переменную x увеличить в два раза.
if(x!=y)
printf(“Переменные имеют неравные значения”);
else {
printf(“x = %d, y = %d\n”,x,y);
x*=2;
}
printf(“Переменные имеют неравные значения”);
else {
printf(“x = %d, y = %d\n”,x,y);
x*=2;
}
3. Возможности функции scanf()
При некорректном вводе (введены данные, несовпадающие с указанным спецификатором) не возникает ошибка выполнения. Но при этом дальнейшая работа программы не предсказуема. Такие ошибки можно отследить, проанализировав результат работы функции scanf. При успешном вводе результат работы функции – количество введенных верно полей. Например, проверку ошибок ввода можно выполнить, следующим образом:
…
int y,n;
printf(“Введите значение переменной n: ”);
y = scanf(“%d”,&n);
if (y!=1) {printf(“Введены неверные данные…\n ”);
system(“pause”);
exit(0);
}
else { …}
int y,n;
printf(“Введите значение переменной n: ”);
y = scanf(“%d”,&n);
if (y!=1) {printf(“Введены неверные данные…\n ”);
system(“pause”);
exit(0);
}
else { …}
В рассмотренном примере количество вводимых полей – 1 (вводится одна переменная n). Следовательно, если переменная y не принимает значение один – произошла ошибка ввода. На экран выводятся соответствующие сообщения. Программа ожидает нажатия клавиши и заканчивает работу (exit). В случае успешной работы выполняется часть программы, описанная в блоке else.
При одном вызове функции возможно ввести более одной переменной. В этом случае спецификаторы формата пишутся один за другим, без пробелов. Каждому спецификатору должен соответствовать свой адрес переменной. При этом scanf при успешном вводе возвращает количество успешно считанных полей. Например:
…
float x,y,z;
printf(“Введите значения переменных x,y и z: ”);
int m = scanf(“%f%f%f”,&x,&y,&z);
…
float x,y,z;
printf(“Введите значения переменных x,y и z: ”);
int m = scanf(“%f%f%f”,&x,&y,&z);
…
После успешного выполнения программы значение переменной m примет значение 3.
4. Задание на лабораторную работу
Составить и записать алгоритм решения индивидуального задания с проверкой корректности данных. По составленному алгоритму написать программу на языке Си.
5. Порядок выполнения работы
1. Получить индивидуальное задание
2. По индивидуальному заданию определить типы и значения данных, являющиеся некорректными для задачи.
3. Составить и записать алгоритм решения задачи
4. Составить программу, реализующую алгоритм:
4.1.Описать входные и выходные данные
4.2.Ввести данные с клавиатуры
4.3.Проверить входные данные
4.4.Вычислить значение функции
4.5.Вывести полученное значение на экран
4.6.Вывести личные данные
4.7.Выполнить компиляцию проекта
5. Защитить работу
Задание оценивается в 5 баллов:
1 балл алгоритм,
1 балл – код программы,
3 балла ответы на вопросы.
6. Пример выполнения задания
Задание: Даны x, y, z. Вычислить a, b, если
и
.
. Значения x,y,z вводить с клавиатуры.
2. | Определение некорректных данных | - символьные данные;
|
3. | Алгоритм | 1. Ввести c клавиатуры значения x,y,z 2. Если x или y или z – не число, то вывести сообщение “Введены не числа” перейти на 10 3. ЕСЛИ z-x=0 или x = 0, ТО вывести сообщение “Ошибка деления на 0” перейти на 10
“Ошибка извлечения корня” перейти на 10 5. Вычислить 6. Вывести значение a на экран 7. ЕСЛИ a = 0 или a = z ТО вывести сообщение “Ошибка деления на 0” перейти на 10 8. Вычислить 9. Вывести значение b на экран 10. Конец |
4. | Составление программы | Для использования математических функций и констант подключите библиотеку математических функций: #include <math.h> |
4.6. | Вывод личных данных | printf(“Программу выполнил Иванов Андрей Сергеевич\n”); |
4.1. | Описание переменных | float x,y,z,a,b; |
4.2. | Ввод данных с клавиатуры | printf(“Введите значения переменных: ”); int m = scanf(“%f%f%f”,&x,&y,&z); |
4.3. | Проверка входных данных | if (m!=3) {printf (“Введены не числа\n”); system(“pause”); exit(0);} if (x==0 ||z-x==0) {printf (“Ошибка деления на 0\n”); system(“pause”); exit(0);} float temp = x – y/sqrt(x) ; if (temp<0||x<0) {printf (“Ошибка извлечения корня\n”); system(“pause”); exit(0);} |
4.4 | Вычисление значения функции | a = 2*y/(z-x)-fabs(x);a = a*pow(temp,1/4.); |
4.5 | Вывод результата | printf(“Значение а = %9.3f\n”,a); |
4.3. | Проверка входных данных | if (a==0 ||a==z) {printf (“Ошибка деления на 0\n”); system(“pause”); exit(0);} |
4.4 | Вычисление значения функции | b = a – x/(2*a)+ x*x/(a-z); |
4.5 | Вывод результата | printf(“Значение b = %9.3f\n”,b); |
Пример программы на Си – папка Dev-lab2.
7. Контрольные вопросы
1. Что возвращает функция scanf?
2. Запишите функцию scanf для ввода трех переменных.
3. Что Вы понимаете под некорректными данными?
4. Какие данные будут некорректными для решения следующей задачи – “Даны длины трех сторон треугольника. Найдите площадь треугольника.”
5. Как в Си реализована условная конструкция структурного программирования?
6. Опишите синтаксис конструкции if else языка Си.
7. Какое значение примет переменная m после выполнения следующего фрагмента программы:
…
float i;
int j;
int m = scanf(“%f%d”,&i, &j);
…
float i;
int j;
int m = scanf(“%f%d”,&i, &j);
…
если с клавиатуры были введены значения 3 2?
8. Какое значение примет переменная m после выполнения следующего фрагмента программы:
…
float i;
int j;
int m = scanf(“%f%d”,&i, &j);
…
float i;
int j;
int m = scanf(“%f%d”,&i, &j);
…
если с клавиатуры были введены значения 3 d?
9. Какое значение примет переменная x после выполнения следующего фрагмента программы:
…
int x = 10;
int k = 12,z = 74;
if (k …
int x = 10;
int k = 12,z = 74;
if (k
10. Какое значение примет переменная x после выполнения следующего фрагмента программы:
…
int x = 10;
int k = 31,z = 22;
if (k …
int x = 10;
int k = 31,z = 22;
if (k