C=getch();
}
Вначале описываем функцию supervisor(), а затем обращаемся к ней в основной программе по команде supervisor();. В результате получаем диалог:
- Я вызываю функцию supervisor.
- Вы меня вызывали?
- Да. Посмотрите, кто из студентов спит, и разбудите их.
- вводить исходные данных;
- обрабатывать исходные данные по алгоритму;
- выводить выходные данные.
Си содержит функции, необходимые для выполнения этих действий. Все функции будем рассматривать на примерах и начнем с функций ввода-вывода.
Вывод осуществляется на экран, принтер, винчестер (гибкие диски), порт. Рассмотрим функции вывода на экран.
Функция printf предназначена для этой цели. Формат: printf(<формат>[,аргумент1],...).
Формат - это строка в двойных кавычках, которая выводится на экран. Перед выводом printf заменяет все объекты в строке в соответствии со спецификациями аргумента. Например, printf(" В %d М содержится %d cm\n", I,J); %d в строке формата - это спецификация аргумента.
Спецификации аргумента начинаются с символа процента (%) и одной буквой, обозначающей тип данных.
%d, используемое в спецификации, говорит о том, что ожидается некоторое целое число. Вот несколько других общеиспользуемых спецификаций формата:
- %d целое число;
- %u целое число без знака;
- %ld длинное целое число;
- %p значение указателя;
- %f число с плавающей точкой;
- %e число с плавающей точкой в экспоненциальной форме;
- %c cимвол;
- %s строка;
- %x целое в шестнадцатеричном формате.
Можно задать ширину поля, например %6d -поле шириной 6.
Значение будет напечатано сдвинутым вправо (впереди пробелы), так что общая ширина поля равна 6.
Для формата вещественных чисел можно указать дробную часть, например %8.4f - поле шириной 8, десятичная часть 4.
В конце форматной строки можно поставить знаки:
\n перевод строки;.
\f (перевод формата или очистка экрана)
\t (табуляция)
\b (забой <-)
\xhhh (вставка символа c кодом ASCII hhh, где hhh содержит от 1 до 3 16-ричных цифр)
Для вывода можно использовать функции: puts и putchar.
Функция puts выводит строку на экран. Например:
#include <stdio.h>
main ()
{
puts("Привет, студент");
}
Функция putchar выводит на экран один символ.
Ввод в Си в основном осуществляется с клавиатуры, из файла и порта.
Функция scanf аналогична printf. Ее формат: scanf(<формата>[,аргумент1],...). В scanf используются те же спецификаторы формата, что и у функции printf. Необходимо отметить, что scanf имеет одну особенность: аргументы, следующие за строкой формата, должны быть адресами, а не значениями (это не распространяется на символьные переменные). Ранее в примерах мы видели, что при вводе целого числа записывалась функция следующим образом:
scanf("%d", &a);
& -операция адреса, которая передает scanf адреса.
При вводе нескольких переменных через запятую можно использовать запятую внутри формата. Пример:
scanf ("%d, %d", &a, &b);
Теперь можно вводить, например 23,56.
Имеются сложности с вводом строки символов из нескольких слов - введутся только данные до первого пробела. Для решения этой проблемы существует функция gets.
#include <stdio.h>
main ()
{
char name [60];
printf("Каквасзовут: ");
gets (name);
printf ("Привет, %s\n", name);
}
Функция gets читает все, что набирается до тех пор, пока не нажат Ввод.
В С++ ввод-вывод может осуществляться не только с помощью функций, но и с помощью операций. Операция вывода << операция ввода >>.
Формат вывода на экран:cout<< выражение.
Формат ввода с клавиатуры:cin<< переменная.
При использовании операций ввода-вывода необходимо включить в программу файл iostream.h.
Пример:
#include <iostream.h>
main()
{
int i;
cout << "Целоечисло?: ";
cin >> i;
cout << " Квадратчисла: " << i*i << "\n";
return 0;
}
Возможен ввод-вывод нескольких величин (через пробел).
1.4 Базовые типы данных Языка Си
Имена, которые присваиваются константам, типам данных, переменным и функциям называются идентификаторами. В Си следующие правила создания идентификаторов: должны начинаться с буквы (a...z,A...Z) или с подчеркивания (_), остальная часть идентификатора должна состоять из букв, подчеркиваний и/или цифр(0...9).
1.4.2 Типизированные константы
В Си используются константы, которые представляют собой имя, присваиваемое какой-либо величине. Идентификатор имени может быть любой длинны, но распознаются первые 32 символа. Идентификатор начинается с латинской буквы или символа подчеркивания, последующие символы могут быть цифры, латинские буквы и символы подчеркивания.
Компилятор Си рассматривает буквы верхнего и нижнего регистра как различные символы.
Типизированные константы бывают: целые, с плавающей запятой, символьные константы и символьные строки.
Константы представляются в виде целого десятичного, восьмиричного или шестнадцатиричного числа.
Описание констант начинается с ключевого слова const, далее тип и значение, например const int Nalog=2.
1.4.3 Переменные
Переменная - это поименованная величина, значение которой может изменяться во время выполнения программы. Переменная принадлежит к определенному типу.
1.4.3.1 Целые типы
Целые числа представляются целыми типами. Целый тип - это обобщенный тип, представление которого зависит от операционной системы и типа процессора.
Рассмотрим основные типы целых чисел:
Целый тип | Размер |
Short int | 16 битовое целое |
Int | 16 битовое целое |
Unsigned long | 32 битовое целое без знака |
Long | 32 битовое целое |
Рассмотрим простой пример.
#include <stdio.h>
#include <conio.h>
main()
{
const int Nalog= 2;
int Stavka;
int Symma;
int C;
Stavka = 300;
Symma = Stavka * Nalog;
printf("Symma naloga = %d\n",Symma);
C=getch();
}
В примере объявлены одна константа и две переменные целого типа.
1.4.3.2 Вещественные типы
Для хранения чисел с дробной частью используется вещественный тип.
В C++ существуют следующие основные типы вещественных чисел:
Вещественный тип | Размер |
Float | 32 битовое плавающее число |
Double | 64 битовое плавающее число |
Long double | 80 битовое плавающее число |
Рассмотрим следующий пример.
#include <stdio.h>
main()
{
const float Nalog= 0.7;
int Stavka;
float Symma;
Stavka = 325;
Symma = Stavka * Nalog;
printf("Symma naloga = %8.4f\n",Symma);
}
В данном примере вещественный тип представлен переменной Symma.
1.4.3.3 Символьные типы
Символьный тип -Char предназначен для хранения одного символа, поэтому его размер - один байт.
Символьный тип | Размер |
Unsigner char | 8 бит без знака |
Char | 8 бит |
Рассмотрим пример:
#include <stdio.h>
main()
{
char A;
char B;
char C;
A = 'D';
B = '!';
printf("A= %c B= %c\n",A,B);
C = '*';
printf("C= %c\n",C);
}
В данном примере переменной A присвоено значение ‘D’, переменной B значение ‘!’, а переменной С присвоено значение символа ‘*’.
1.4.4 Тип данных строка
Для представления строки символов в Си используют массивы типа char.
Рассмотрим пример.
#include <stdio.h>
#include <string.h>
main()
{
char A[256]; /* длина может быть до 256 символов */
char B[11];
char C[24];
strcpy(A,"IBM PC Pentium");
strcpy(B,"Windows 95");
strcpy(C,""); /* очисткапеременной */ printf("A= %s\n",A);
printf("B= %s\n",B);
strcpy(C,B);
printf("C= %s\n",C);
}
В данном примере представлены три строки символов A, B, C.
По команде, например, strcpy (A,"IBM PC Pentium"); в строку A помещается текст IBM PC Pentium.
Кроме рассмотренного примера, для определения строк можно использовать указатель на символы. Пример:
#include <stdio.h>
#include <string.h>
main()
{
char *msg;
msg = "Привет, студент";
puts(msg);
}
Звездочка перед msg означает, что msg является указателем на символ - т.е. msg может хранить адрес символа. Однако, при этом память для размещения символов не выделяется.
Команда msg = "Привет, студент " присваивает начальный адрес этой строки - (адрес символа П) переменной msg. Команда puts(msg) печатает символы до тех пор, пока она не встретит нулевой символ, обозначающий конец строки..
1.4.5 Структуры
Размещенная в памяти совокупность связанных между собой данных представляет структуру. В Си рассматриваются следующие структуры: массивы, записи и их комбинации.
1.4.5.1 Массивы
Именованная совокупность однородных данных называется массивом. Каждый элемент массива хранится в отдельной области памяти и имеет собственный номер (начиная с нуля).
Рассмотрим пример.
#include <stdio.h>
main()
{
int B[3];
B[0] = 0;
B[1] = 10; B[2] = 20; B[3] = 30;
printf("B[0]= %d\n",B[0]);
printf("B[1]= %d\n",B[1]);
printf("B[2]= %d\n",B[2]);
printf("B[3]= %d\n",B[3]);
}
В рассмотренном примере определен массив B, состоящий из четырех целочисленных элементов. С элементами массива можно манипулировать как с обыкновенными переменными.
Существуют многомерные массивы, например:
int A[3][2];
Массив A -двумерный массив ( состоит из четырех строк и трех столбцов):
char A[3][3][3][3];
Массив A - четырехмерный массив.
Рассмотрим пример работы с двумерным массивом.
#include <stdio.h>
main()
{
float B[4][3];
B[0][0] = 0;
B[1][1] = 1.1;
B[2][1] = 1.2; B[3][1] = 1.3;
B[1][2] = 2.1;
B[2][2] = 2.2;
B[3][2] = 2.3;
printf("B[1,1]= %4.2f B[2,1]= %4.2f B[3,1]= %4.2f\n", B[1][1],B[2][1],B[3][1]);
printf("B[1,2]= %4.2f B[2,2]= %4.2f B[3,2]= %4.2f\n", B[1][2],B[2][2],B[3][2]);
}
1.4.5.2 Записи
В отличие от массивов запись позволяет хранить данные различных типов. Запись начинается после ключевого слова struct. Рассмотрим пример - в записи хранится информация о студентах: фамилия, год рождения, номер группы.