КаталогИндекс раздела
НазадОглавлениеВперед


Лабораторная работа ╧2
Базовые типы данных и ввод-вывод

1. Цель работы

     Целью лабораторной работы является получение практических навыков в работе с типами данных языка C и в использовании функций стандартного ввода-вывода.

2. Темы для предварительной проработки

3. Задание

     Разработать программу, которая вводит фактические данные из таблицы, представленной в Вашем варианте индивидуального задания и выводит на экран таблицу, подобную той, которая находится в индивидуальном задании (включая заголовок и примечания).

4. Варианты индивидуальных заданий

 1        2        3        4        5        6        7        8        9       10      
11       12       13       14       15       16       17       18       19       20      
21       22       23       24       25       26       27       28       29       30      

5. Пример решения задачи (вариант 30)

5.1. Разработка алгоритма решения

5.1.1. Общий метод решения
     В таблице, приведенной в индивидуальном задании, первая строка - общий заголовок таблицы, вторая - заголовки столбцов таблицы. Фактические данные составляют третью, четвертую и пятую строки. Шестая строка - примечания.

     Программа должна начинаться с ввода фактических данных. Для удобства оператора перед вводом на экран должено выводиться приглашение, в котором перечисляется, какие именно данные ожидает программа. За одно приглашение-ввод будет вводиться одина строка фактических данных таблицы. Т.е., приглашение-ввода должно повторяться трижды. Введенные данные будут сохранятся в переменных программы.

     На втором этапе программа выполняет вывод данных на экран. Каждая строка таблицы может выводиться одним оператором вывода. Среди строк, которые выводятся, будут строки без переменных значений (заголовки и линии) и строки с переменными значениями (строки с фактическими данными).

     Для формирования наглядного табличного вида можна применять символы '|' и '-'.

     Поскольку алгоритм программы чисто линейный, схему алгоритма мы не приводим

5.2. Определение переменных программы

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

     Название. Во всех фактических значениях этот столбец является символьной строкой из 8 символов. Т.е. для представления его в памяти переменные, в которых хранятся значения этого столбца, должны быть объявлены как:

char name1[9], name2[9], name3[9];

дополнительный символ резервируется для обозначения конца символьной строки.

     Школа. Эти данные являются одним символом. Их объявление:

char sch1, sch2, sch3;

     Количество монахов. Эти данные являются целыми числами в диапазоне 10 - 220. Этот диапазон перекрывается диапазоном возможных значений типа unsigned short (диапазон этого типа: 0 - 255). Т.е. объявление соответственных переменных:

unsigned short cnt1, cnt2, cnt3;

     Площадь земель. Это число с дробной частью, следовательно, соответствующие переменные должны быть переменными с плавающей точкой. Точность данных - всего один знак после точки, поэтому для их представления будет достаточно типа float:

float sq1, sq2, sq3;

5.3. Разработка текста программы

     Начинаем разработку текста програмы с заголовка главной функции main():

int main(void)

     Далее открывается тело функции и в нее включается описание переменных (см. п.5.2).

     Кодовая часть программы начинается с приглашения - вывода строки-константы:

printf("1. Введите: название, школу, количество, площадь >");

за которым считываются данные, вводимые оператором:

scanf("%s %c %d %f",name1, &sc1, &cnt1, &sq1);

Поскольку описания этих функций хранятся в файле stdio.h, включаем этот файл в начало программы:

#include <stdio.h>

При вводе строка вводится по спецификации типа %s, один символ - по спецификации типа %c, целое число - по спецификации типа %d, число с плавающей точкой - по спецификации типа %f. Спецификации разделяются пробелами, т.е. и данные при вводе должны разделятся пробелами или переходом на новую строку. В списке ввода перед всеми элементами кроме того, который вводится по %s, ставится знак &.

    Приглашение-ввод повторяется трижды, с разными переменными в списке ввода.

     Для формирования вывода следует подсчитать ширину каждого столбца. Ширина первого столбца определяется размером фактических данных в строке - 9 символьных мест, с учетом пробелов в начале и в конце - 11. Ширина остальных столбцов определяется шириной текста в заголовках столбцов и составляет соответственно 7, 11 и 13 символьных мест. Учитывая вертикальные линии ширина строки составляет 47 знакомест.

     Первая строка - горизонтальная линия, которая состоит из символа '-', повторенного 47 раз. Вторая строка - общий заголовок, дополненный до ширины 47 пробелами. Третья строка - еще одна горизонтальная линия. Четвертая и пятая строки - заголовки столбцов, каждый из них имеет установленную ширину. Шестая строка - еще одна горизонтальная линия.

     Наконец, строки с седьмой до девятой - фактические даные. В каждой строке выводятся значения набора переменных для одной строки. Например:

printf("| %9s | %c | %-3d | %5.1f |\n", name1, sc1, cnt1, sq1); 

     Значения имени выводятся по спецификации типа %s с шириной 9. Значения школы выводятся по спецификации типа %c. Поскольку значения в этом столбце выводится по центру столбца, перед и после него ставятся пробелы. Значения количества выводятся по спецификации типа %d с шириной 3, а площадь - %f с общей шириной 5 и одним знаком после точки. Значения в этих столбцах дополняются до нужной ширины пробелами. В столбце 3 ставится признак выравнивания по правому краю.

     Остальные четыре строки выводятся как текстовые константы.

     Полный текст программы приведен ниже.

/*******************************************************/
/*           Лабораторная  работа ╧2                   */
/*          Типы данных и ввод-вывод                   */
/*        Пример выполнения. Вариант ╧30.              */
/*******************************************************/
#include <stdio.h>
int main(void) {
 char name1[9], name2[9], name3[9];
 char sc1, sc2, sc3;
 unsigned short cnt1, cnt2, cnt3;
 float sq1, sq2, sq3;
 /* Введение фактических данных*/
 printf("1. Введите: название, школу, количество, площадь >");
 scanf("%s %c %d %f",name1, &sc1, &cnt1, &sq1);
 printf("2. Введите: название, школу, количество, площадь >");
 scanf("%s %c %d %f",name2, &sc2, &cnt2, &sq2);
 printf("3. Введите: название, школу, количество, площадь >");
 scanf("%s %c %d %f",name3, &sc3, &cnt3, &sq3);
 /* Вывод таблицы */
 /* вывод заголовков */
 printf("-----------------------------------------------\n");
 printf("|Буддийские монастыри Японии периода Нара |\n");
 printf("|---------------------------------------------|\n");
 printf("| Название | Школа | Количество|Площадь земли|\n");
 printf("|          |       |    монахов|    (га)     |\n");
 printf("|----------|-------|-----------|-------------|\n");
 /* вывод строк фактических данных */
 printf("| %9s | %c | %3d | %-5.1f |\n", name1, sc1, cnt1, sq1);
 printf("| %9s | %c | %3d | %-5.1f |\n", name2, sc2, cnt2, sq2);
 printf("| %9s | %c | %3d | %-5.1f |\n", name3, sc3, cnt3, sq3);
 /* вывод примечаний */
 printf("|---------------------------------------------|\n");
 printf("| Примечание: Т - Тэндай; С - Сингон;         |\n");
 printf("|             Д - Дзедзицу                    |\n");
 printf("-----------------------------------------------\n");
 return 0;
}

5.4. Отладка программы

При отладке программы можно использовать пошаговый режим отладки с отслеживанием значений переменных - тех, которые вводятся. Если возникнут проблемы с вводом переменных, есть смысл вводить каждую переменную отдельным оператором.

Аккуратный формат таблицы достигается несколькими запусками программы с последующим выравниванием столбцов по результатам запуска.

5.5. Результаты работы программы

При работе програмы на екран было выдано следущее:

1. Введите: название, школу, количество, площадь > Тодайдзи Т 220 368.8 
2. Введите: название, школу, количество, площадь > Якусидзи С 50 54.7 
3. Введите: название, школу, количество, площадь > Дайаедзи Д 10 12.2 

----------------------------------------------
|Буддийские монастыри Японии периода Нара    |
|--------------------------------------------|
| Название | Школа | Количество|Площадь земли|
|          |       |  монахов  |    (га)     |
|----------|-------|-----------|-------------|
| Тодайдзи |   Т   |       220 | 368.8       |
| Якусидзи |   С   |        50 |  54.7       |
| Дайаедзи |   Д   |        10 |  12.2       |
|--------------------------------------------|
| Примечание: Т - Тендай; С - Сингон;        |
|             Д - Дзедзицу                   |
----------------------------------------------

5.6. Выводы

При выполнении лабораторной работы изучены вопросы:

Приложение 1. Базовые типы данных языка С

Название типа Пояснения Диапазон значений
short Краткое целое число -128 . . . 127
unsigned short Краткое целое число без знака 0 . . . 255
int Целое число -32768 . . . 32767
unsigned int Целое число 0 . . . 65535
long Длинное целое число -230 . . . 230-1
unsigned long Длинное целое число без знака 0 . . . 231-1
char Один символ символы кода ASCII
char[ ] Строка
float Число с плавающей точкой 3.4 10-38 . . . 3.4 10+38
double Число с плавающей точкой двойной точности 1.7 10-308 . . . 1.7 10+308

Приложение 2. Некоторые функции стандартного ввода-вывода

Функции стандартного ввода - вывода описаны в файле stdio.h.

printf() - форматный вывод на экран:

int printf(char *format, <список вывода>);

Первый параметр является символьной строкой, которая задает спецификации формата. Остальные параметры - перечисление переменных и выражений, значения которых выводятся. Каждая спецификация формата имеет вид (параметры в квадратных скобках необязательны):

%[flags][width][.prec][F|N|h|l]type
где type - тип спецификации
d или i целое десятичное число со знаком
u десятичное число без знака
x целое 16-ричное число без знака
f число с плавающей точкой
e число в E-форме
g число с плавающей точкой или в E-форме
c один символ
s строка
% символ %
flags - признак выравнивания:
+ или пусто выравнивание по правому краю
- выравнивание по левому краю
width - целое число - общая ширина поля. Если это число начинается с цифры 0, вывод дополняется слева нулями до заданной ширины. В заданную ширину входят все символы вывода, включая знак, дробную часть и т.п.
prec - целое число, количество знаков после точки при выводе чисел с плавающей точкой
F - соответственный элемент списка вывода является дальним указателем
N - соответственный елемент списка вывода является близким указателем
l - соответствующий елемент списка вывода является long int или double

scanf() - форматный ввод с клавиатуры:

int scanf(char *format, <список ввода>); 
Первый параметр является символьной строкой, которая задает спецификации формата (см. функцию printf()). Остальные параметры - перечисление адресов переменных, в которые вводятся данные. В этом списке перед именами всех переменных, кроме тех, которые вводятся по спецификации типа %s, должен стоять символ &.

putchar() - вывод одного символа на экран:

int putchar(int ch);

Параметр функции - код символа, который выводится. При успешном выполнении функция возвращает этот же код, при неуспешном - EOF.

getchar() - ввод одного символа с клавиатуры:
int getchar(void);
Функция возвращает код введенного символа.

puts() - вывод строки символов на экран:

int puts(char *string);
Параметр функции - указатель на начало той строки, из которой выводятся данные. Функция возвращает количество выведенных символов.

gets() - ввод строки символов с клавиатуры:

 
char *gets(char *string);
Параметр функции - указатель на начало той строки, в которую вводятся данные. Функция возвращает тот же самый указатель.


КаталогИндекс раздела
НазадОглавлениеВперед