Функции вывода информации
Для вывода информации в языке С используются следующие функции:
Функция putchar() – вывод одиночного символа без перехода на новую строку.
Функция puts() – вывод строки символов с переходом на начало новой строки.
Функция printf() – для форматированного вывода данных. Ее формат:
рrintf (<управляющая строка>, <список аргументов>);
Управляющая строка заключается в кавычки и указывает компилятору вид выводимой информации. Она может включать спецификации преобразования и управляющие символы.
Спецификация преобразования имеет вид:
Lt;флаг> <размер поля. точность> спецификация
где флаг может принимать следующие значения:
- выравнивание влево выводимого числа;
+ выводится знак положительного числа;
размер поля – задает минимальную ширину поля. При недостаточной ширине поля выполняется автоматическое расширение;
точность – задает точность числа, т. е. количество цифр в его дробной части;
спецификация указывает вид выводимой информации.
Формат | Тип выводимой информации |
%d (%i) | десятичное целое число |
%c | один символ |
%s | строка символов |
%e | число с плавающей точкой (экспоненциальная запись) |
%f | число с плавающей точкой (десятичная запись) |
%u | десятичное число без знака |
%o | восьмеричное число без знака |
%x | шестнадцатеричное число без знака |
Для длинных чисел (long, double) – используется дополнительный формат l.
Например: % ld - длинное целое, % lf – вещественное число с удвоенной точностью.
При необходимости вывода символа % его нужно указать 2 раза.
Например: printf("Только %d%% предприятий не работало.\n",5);
Получим: Только 5% предприятий не работало.
Управляющая строка может содержать следующие управляющие символы:
\n – переход на новую строку;
\t – горизонтальная и \v – вертикальная табуляция;
\b – возврат назад на один символ;
\r – возврат в начало строки;
\f – прогон бумаги до начала новой страницы;
\a – звуковой сигнал;
\ddd – 8-ричный ASCII-код;
\xhhh – 16-ричный код;
Список аргументов - печатаемые объекты (константы, переменные или выражения), вычисляемые перед выводом. Количество аргументов и их типы должны соответствовать спецификациям преобразования в управляющей строке.
Пример:
#include <stdio.h>
#define PI 3.1415926
main()
{
int number=5, cost=11000, s=-777;
float bat=255, x=12.345;
printf ("Значение числа pi равно%f.\n", PI);
printf ("Стоимость этой вещи %d%s.\n", cost,"Руб.");
printf ("x=%-8.4f s=%5d%8.2f ", x, s, x); }
Функции ввода информации
Функция getch () – для ввода одиночных символов.
Функция gets () – ввод строки символов до нажатия клавиши ENTER.
Функция scanf() предназначена для форматированного ввода информации любого вида. Общий вид функции:
scanf (<управляющая строка>, < список адресов объектов ввода>);
В < управляющей строке> указываются только модификаторы форматов, при этом их количество и порядок следования должны совпадать с количеством и порядком следования вводимых объектов. Функция scanf(), в отличие от функции printf(), использует в списке адресов указатели на переменные, т.е. их адреса, для чего перед именем переменной записывается символ &, обозначающий адрес переменной. Для ввода значений строковых переменных символ & не используется. При использовании формата %s строка вводится до первого пробела. Вводить данные с клавиатуры можно как в одной строке через пробел(ы), так и в разных строках.
Данные при вводе разделяются пробелами, символами перевода строки или табуляции, но не запятыми.
Пример:
int course;
float grant;
char name[20];
printf ("Укажите ваш курс, стипендию, имя \n");
scanf ("%d%f", &course, &grant);
scanf ("%s", name); /* & отсутствует при указании массива символов */
Стандартные математические функции
Для подключения математических функций используется директива # include <math.h>. Аргументы x, y и результат функции имеют тип double. Аргументы тригонометрических функций задаются в радианах.
Математическая функция | Имя функции в языке С | Математическая функция | Имя функции в языке С |
Корень из x | sqrt(x) | arcsin(x) | asin(x) |
|x| | fabs(x) | arccos(x) | acos(x) |
ex | exp(x) | arctg(x) | atan(x) |
xy | pow(x,y) | arctg(x/y) | atan2(x,y) |
ln(x) | log(x) | sh(x)=1/2 (ex-e-x) | sinh(x) |
lg10(x) | log10(x) | ch(x)=1/2 (ex+e-x) | cosh(x) |
sin(x) | sin(x) | tgh(x) | tanh(x) |
cos(x) | cos(x) | Остаток от деления x на y | fmod(x,y) |
tg(x) | tan(x) | Наименьшее целое >=x | ceil(x) |
Наибольшее целое <=x | floor(x) |
Операторы выбора
В языке программирования С++ существует два оператора выбора:
1) Оператор выбора if
2) Оператор выбора switch
Операторы выбора позволяют принять программе решение, основываясь на истинности или ложности условия. Если условие истинно (т. е. равно true) значит, оператор в теле if выполняется, после чего выполняется следующий по порядку оператор. Если условие ложно (т. е. равно false) значит, оператор в теле if не выполняется (игнорируется или пропускается) и сразу же выполняется следующий по порядку оператор. Проверяемое условие может быть любым логическим выражением. Логические выражения могут быть образованы операциями равенства и отношения.
Операция в С++ | Условие | Смысл записанных условий в С++ |
== | a==b | a равно b |
!= | a!= b | a не равно b |
> | a > b | a больше b |
< | a < b | a меньше b |
>= | a >= b | a больше или равно b |
<= | a <= b | a меньше или равно b |
Очень частой ошибкой программирования является неправильная запись операций равенства и соотношений. Пробелов между знаками ==;!=; >=; <=; быть не должно. Также необходимо помнить правильную последовательность записи символов операций равенства и отношений.
Нельзя путать операцию = (операция присваивания) и операцию == (операция равенства) так как это приводит к логическим ошибкам, т. е. программа даже скомпилируется без всяких ошибок, но работать будет не правильно.
Условный оператор или оператор выбора if записывается в двух формах, рассмотрим первую.
if (/*проверяемое условие*/) { //тело условного оператора } |
Фигурные скобочки тела условного оператора можно опускать, если при истинности условия необходимо выполнить один оператор. Пример:
if (/*проверяемое условие*/) /*оператор1*/; |
Чтобы в будущем не путаться рекомендую всегда прописывать фигурные скобочки, так код будет более понятен.
Рассмотрим простейший пример использования оператора if. Условие задачи: даны два числа, необходимо их сравнить.
#include <iostream> using namespace std; int main() { int a, b; cout << "Vvedite pervoe chislo: "; cin >> a; cout << "Vvedite vtoroe chislo: "; cin >> b; if (a > b) // если а > b { cout << a << " > " << b << endl; // печатать данное сообщение } if (a < b)// если а < b { cout << a << " < " << b << endl; } if (a == b) // если а = b cout << a << " = " << b << endl; // в теле условного оператора опущены фигурные скобочки system("pause"); return 0; } |
Еще одну логическую ошибку часто делают, когда ставят точку с запятой сразу за правой круглой скобкой оператора if.
if (a == b); // логическая ОШИБКА cout << a << " = " << b << endl; |
В этом случае программ скомпилируется и запустится, но уже будет работать не правильно. Ошибка заключается в том, что у данного ифа уже нет оператора входящего в его тело, то есть if пустой. И уже неважно истинно условие или нет оператор вывода cout << a << " = " << b << endl; будет срабатывать всегда.
Оператор с двойным выбором if else:
if (условие) оператор1;
else оператор2;
Например: if(x>y) max=x;
else max=y;
Если оператор1 или оператор2 содержат два и более операторов, то они заключаются в фигурные скобки { }.
Итак мы рассмотрели оператор с одиночным выбором if и оператор с двойным выбором if else, но в С++ еще имеется оператор множественного выбора switch, который мы сейчас детально рассмотрим.
// форма записи оператора множественного выбора switch switch (/*переменная или выражение*/) { case /*константное выражение1/*: { /*группа операторов*/; break; } case /*константное выражение2*/: { /*группа операторов*/; break; } //... default: { /*группа операторов*/; } } |
На начальном этапе анализируется выражение или переменная. После чего осуществляется переход к той ветви программы, для которой значение переменной или выражения совпадает с указанным константным выражением. Далее выполняется оператор или группа операторов пока не встретится зарезервированное слово break или закрывающая фигурная скобочка. Если значение переменной или выражения не совпадает ни с одним константным выражением, то передается управление ветви программы содержащей зарезервированное слово default. После чего выполняется оператор или группа операторов данной ветви. Сейчас рассмотрим задачу с использованием оператора выбора switch.
Условие задачи: написать программу, которая складывает, вычитает, умножает, делит два числа введенных с клавиатуры. Разработать пользовательский интерфейс.
#include <iostream> using namespace std; int main() { int count; // переменная для выбора в switch double a,b; // переменные для хранения операндов cout << "Vvedite pervoe chislo: "; cin >> a; cout << "Vvedite vtoroe chislo: "; cin >> b; cout << "Vibirite deistvie: 1-clojenie; 2-vichitanie; 3-ymnojenie; 4-delenie: "; cin >> count; switch (count) // начало оператора switch { case 1: // если count = 1 { cout << a << " + " << b << " = " << a + b << endl; // выполнить сложение break; } case 2: // если count = 2 { cout << a << " - " << b << " = " << a - b << endl; // выполнить вычитание break; } case 3: // если count = 3 { cout << a << " * " << b << " = " << a * b << endl; // выполнить умножение break; } case 4: // если count = 4 { cout << a << " / " << b << " = " << a / b << endl; // выполнить деление break; } default: // если count равно любому другому значению cout << "Nepravilni vvod" << endl; } system("pause"); return 0; } |
Условие задачи: даны действительные числа a, b, c. Полностью исследовать биквадратное уравнение ax4+bx2+c=0, т. е. если действительных корней нет, то должно быть выдано сообщение об этом, иначе должны быть выданы два или четыре корня.
//ax4+bx2+c=0, ay2+by+c=0, D=b2-4ac, корни (-b±sqrt(D))/2*a #include <iostream> #include <cmath> using namespace std; int main(){ double a(4),x,c(1),b(-5),y; //4x4-5x2+1=0 int D; D=pow(b,2)-4*a*c; //Поиск дискриминанта по формуле if (D>0){ y= sqrt((-b+sqrt(D)) / (2*a)); cout<<y<<"\n"<<-y<<"\n"; y= sqrt((-b-sqrt(D)) / (2*a)); cout<<y<<"\n"<<-y<<"\n"; } if (D==0) { y=-b/2*a; cout<<y<<"\n"<<-y<<"\n"; } if (D<0) { cout<<"not ans\n"; } } |
· Даны два числа X и Y проверить истинность того что оба числа четные.
#include <iostream> using namespace std; int main(){ int x,y; cout<<"X: "; cin>>x; cout<<"Y: "; cin>>y; if ((x%2) || (y%2)) cout<<"uneven numbers\n"; //нечетное else cout<<"even numbers\n"; //четное } |
Внимание! В С++ знаками || обозначается операция логическое ИЛИ, && - логическое И,! – логическое НЕ.
Задачи для решения:
· Даны действительные числа х, у. Меньшее из этих двух чисел заменить их полусуммой, а большее — их удвоенным произведением
· Даны два действительных числа. Вывести первое число, если оно больше второго, и оба числа, если это не так
· Даны действительные положительные числа а, b, с, х, у. Выяснить, пройдет ли кирпич с ребрами а, b, с в прямоугольное отверстие со сторонами х и у. Просовывать кирпич в отверстие разрешается только так, чтобы каждое из его ребер было параллельно или перпендикулярно каждой из сторон отверстия
· Даны два числа X и Y определить истинность высказывания: Только одно из чисел нечетное
· Дано четыре числа, вывести на экран то, которое меньшее и то, которое большее с соответствующим обобщением: большее число ___, меньшее число ___
· Даны координаты начала и координаты конца отрезка. Если считать отрезок обозначением горки, то в одном случае он обозначает спуск, в другой подъем. Определить и вывести на экран спуск это или подъем, ровная дорога или вообще ровная вниз
· Игральные карты обозначены следующим образомМасти — 1,2,3,4 (бубны, трефы, червы, пики). Достоинства — 11,12,13,14 (Валет, Дама, Король, Туз). Даны два числа, обозначающих достоинство и масть карты. Первое число Nпринадлежит диапазону (6<=N<=14), второе число M принадлежит диапазону (1<=M<=4) Вывести название соответствующей карты (Шестерка бубен, тройка червей в соответствии с тем, что ввел пользователь)
· В восточном календаре принят 60 летний цикл, состоящий из 12 летних под циклов, обозначаемых названиями цвета: Зеленый, Красный, желтый, белый и черный. В каждом цикле годы носят названия животных: Крысы, Коровы, Тигра, Зайца, Дракона, Змеи, Лошади, Овцы, Обезьяны, Курицы, Собаки и Свиньи. По номеру года определить его название если 1984 год начало цикла: Год зеленой крысы
· Дано трехзначное число. Вывести его словесное описание (345 = Триста сорок пять)
· Напишите программу тест. Пользователю задается вопрос и предлагается 3 варианта ответа. Нужно задать три вопроса. Только один ответ в каждом вопросе правильный. Пользователь выбирает вариант (1,2 или 3) и задается следующий вопрос. В процессе ведется подсчет верных и неверных ответов. После всех вопросов отобразить результаты теста.
· Пользователь вводит два числа. Вы задаете вопрос a*b=___ (a и b числа введенные пользователем) Пользователь должен ввести свой ответ. Надо проверить правильность ответа и сообщить пользователю
· Написать программу, которая дописывает рубль в правильной форме (от 1 до 999)
1 = 1рубль, 20=20 рублей, 3=3 рубля