Практическое занятие Ввод-вывод информации Дисциплины "ЯЗЫКИ ПРОГРАММИРОВАНИЯ"

advertisement
ФГОБУ ВПО "СибГУТИ"
Кафедра вычислительных систем
Дисциплины
"ЯЗЫКИ ПРОГРАММИРОВАНИЯ"
"ПРОГРАММИРОВАНИЕ"
Практическое занятие
Ввод-вывод информации
Преподаватель:
Доцент Кафедры ВС, к.т.н.
Поляков Артем Юрьевич
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
Шаблон документа
Общий
для всех писем
текст
В котором изменяются
только персональные
данные
http://www.interface.ru/home.asp?artId=26132
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
2
Вывод данных
printf
(PRINT Formatted) – функция, обеспечивающая
информации на экран компьютера (стандартный вывод).
вывод
Функции printf необходимо передать следующие аргументы:
1.
Строку, содержащую шаблон текста, выводимого на экран. Шаблон
содержит константные элементы, которые выводятся без
изменения, а также спецификаторы,
которые заменяются
значениями переменных, которые следуют за строкой.
2.
Список переменных (разделитель – запятая), значения которых будут
использоваться для замены спецификаторов форматной строки.
Переменные сопоставляются спецификаторам в том порядке, в
котором они указаны в списке.
int x;
float y;
printf("Check: x = %d, y = %f", x, y);
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
3
Форматные спецификаторы
%d – целый знаковый параметр (int / signed int)
%u – целый беззнаковый параметр (unsigned int)
%f – вещественный параметр одинарной точности (float)
Для параметров других типов используются флаги, которые
добавляются к одному из трех типов, указанных выше:
%hhd – тип char
%hd – тип short
%ld – тип long
%hhu – тип unsigned char
%hu – тип unsigned short
%lu – тип unsigned long
%lf – тип double
%Lf – тип long double
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
4
Вывод данных
(демонстрационная программа)
output1.c
#include <stdio.h>
// Output demo program
int main()
{
int i = 10;
char c = 19;
unsigned int ui = 250;
float f = 120.5;
double d = 1240.5461;
// Output variables:
printf("Integers: i = %d, c = %hhi, ui = %u\n",
i, c, ui);
printf("Reals: f = %f, d = %lf\n", f, d);
return 0;
}
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
5
Переход на новую строку
Символ перехода на новую строку в языке Си обозначается как '\n'
и может быть использован в любом месте форматной строки:
output2.c
#include <stdio.h>
// Output demo program
int main()
{
int i = 10;
char c = 19;
float f = 120.5;
// Output variables:
printf("Integers: i = %d, c = %hhi\nReals: f = %f\n",
i, c, f);
return 0;
}
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
6
Ограничение точности
для вещественных типов данных
Вещественные спецификаторы позволяют указать количество
знаков после запятой, которое следует выводить:
#include <stdio.h>
// Output demo program
int main()
{
float f = 120.5564;
double d = 1.23456;
output3.c
// Output variables:
printf("Original: f = %f, d = %lf\n"
"Rounded: f = %.2f, d = %.4lf\n", f, d, f, d);
return 0;
}
$./output3
Original: f = 120.556396, d = 1.234560
Rounded: f = 120.56, d = 1.2346
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
7
Ограничение точности
для вещественных типов данных
Вещественные спецификаторы позволяют указать количество
знаков после запятой, которое следует выводить:
#include <stdio.h>
// Output demo program
int main()
{
float f = 120.5564;
double d = 1.23456;
output3.c
// Output variables:
printf("Original: f = %f, d = %lf\n"
"Rounded: f = %.2f, d = %.4lf\n", f, d, f, d);
return 0;
}
Почему не 120.5564?
$./output3
Original: f = 120.556396, d = 1.234560
Rounded: f = 120.56, d = 1.2346
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
8
Преобразования между системами
счисления средствами printf
Функция printf имеет спецификаторы %x (hexadecimal) и %o
(octal), которые позволяют выводить числа в шестнадцатеричной и
восьмеричной системах счисления:
convert1.c
#include <stdio.h>
// Convert demo program
int main()
{
int i = 58, j = 126, k = -15;
// Output variables:
printf("i: %d %u %x %o\n", i, i, i, i);
printf("j: %d %u %x %o\n", j, j, j, j);
printf("k: %d %u %x %o\n", k, k, k, k);
return 0;
}
$ ./convert1
i: 58 58 3a 72
j: 126 126 7e 176
k: -15 4294967281 fffffff1 37777777761
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
9
Преобразования между системами
счисления средствами printf
Функция printf имеет спецификаторы %x (hexadecimal) и %o
(octal), которые позволяют выводить числа в шестнадцатеричной и
восьмеричной системах счисления:
convert1.c
#include <stdio.h>
// Convert demo program
int main()
{
int i = 58, j = 126, k = -15;
// Output variables:
printf("i: %d %u %x %o\n", i, i, i, i);
printf("j: %d %u %x %o\n", j, j, j, j);
printf("k: %d %u %x %o\n", k, k, k, k);
return 0;
}
$ ./convert1
Откуда эти числа?
i: 58 58 3a 72
j: 126 126 7e 176
k: -15 4294967281 fffffff1 37777777761
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
10
Ввод данных
scanf (SCAN Formatted) – функция, обеспечивающая ввод информации с
клавиатуры компьютера (стандартный ввод).
Функции scanf необходимо передать следующие аргументы:
1. Строку, содержащую шаблон текста, выводимого на экран. Шаблон
может содержать:
символы разделители: пробел (' '), табуляция ('\t'), новая строка ('\n'),
такой элемент соответствует любому количеству любых разделителей во
входном тексте.
обычные символы (не разделители и не %): выполняется точное
сопоставление со входным текстом
спецификаторы: такие же как для функции printf.
2. Список указателей на переменные в которые осуществляется ввод
(разделитель – запятая). Для получения указателя на переменную
используется операция '&', например &x – указатель на переменную x.
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
11
Ввод данных
(ввод целой знаковой переменной)
input1.c
#include <stdio.h>
int main()
{
int i;
printf("Input i value: ");
scanf("%d",&i);
printf("Your input was %d\n",i);
printf("i + 5 = %d\n",i+5);
return 0;
}
$ ./input1
Input i value: 10
Your input was 10
i + 5 = 15
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
12
Ввод данных
(ввод двух целых переменных, разделители)
input2.c
#include <stdio.h>
int main()
{
int i, j;
printf("Input i & j value: ");
scanf("%d %d", &i,&j);
printf("Your input was i=%d, j=%d\nInput i & j again: ",i,j);
scanf("%d
%d",&i,&j);
printf("Your input was i=%d, j=%d\n",i,j);
printf("i + j = %d\n",i + j);
return 0;
}
$ ./input2
Input i & j value: 4 5
Your input was i=4, j=5
Input i & j again: 2
3
Your input was i=2, j=3
i + j = 5
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
13
Ввод данных
(обычные символы в форматной строке)
input3.c
#include <stdio.h>
int main()
{
int i = 0, j = 0;
printf("Input i & j value: ");
scanf("i=%d j=%d",&i,&j);
printf("Your input was i=%d, j=%d\nInput i & j again: ",i,j);
scanf("%d, %d",&i,&j);
printf("Your input was i=%d, j=%d\n",i,j);
printf("i + j = %d\n",i+j);
$ ./input3
return 0;
Input i & j value: 10, 11
}
Your input was i=0, j=0
$ ./input3
Input i & j value: i=2 j=10
Your input was i=2, j=10
Input i & j again: 10, 11
Your input was i=10, j=11
i + j = 21
Input i & j again: Your input was
i=10, j=11
i + j = 21
$ ./input3
Input i & j value: 10 11
Your input was i=0, j=0
Input i & j again: Your input was
i=10, j=0
i + j = 10
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
14
Конвертация из десятичной
в восьмеричную систему счисления
convert2.c
#include <stdio.h>
// Convert demo program
int main()
{
int i;
printf("Input i: ");
scanf("%d", &i);
printf("Octal representation of i: %o\n",i);
return 0;
}
$ ./convert2
Input i: 10
Octal representation of i: 12
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
15
Распространенные ошибки
при использовании scanf
(передача переменной, а не указателя)
#include <stdio.h>
// Convert demo program
int main()
{
int i = 0;
printf("Input i: ");
scanf("%d", i);
printf("Octal representation of i: %o\n",i);
return 0;
}
Компилятор способен обнаруживать подобные ошибки и сообщать о них:
$ gcc -Wall -o convert2 convert2.c
convert2.c: In function ‘main’:
convert2.c:7: warning: format ‘%d’ expects type ‘int *’, but argument 2 has
type ‘int’
При выполнении такой программы она аварийно завершается,
не выводя на экран ожидаемую информацию!
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
16
Распространенные ошибки
при использовании scanf
(разделитель в конце форматной строки)
#include <stdio.h>
// Convert demo program
int main()
{
int i = 0;
printf("Input i: ");
scanf("%d\n", &i);
printf("Octal representation of i: %o\n",i);
return 0;
}
При выполнении такой программы она запрашивает значение i,
а потом "зависает"! На самом деле, согласно описанию функции scanf:
… символы разделители: пробел (' '), табуляция ('\t'), новая строка ('\n'), такой
элемент соответствует любому количеству любых разделителей во входном
тексте….
Таким образом нажатие "Enter" совпадает с шаблоном и scanf продолжает
считывать данные. Прервать работу scanf можно только введя
"обычный символ".
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
17
Задачи для самостоятельного решения
Форма отчетности: исходные коды и тестовые данные (не менее 10 наборов для
каждой задачи, если это допускается должны быть как отрицательные, так и
положительные числа) для приведенных ниже задач.
1. Модифицировать программу convert2 так, чтобы она выполняла перевод из
десятичной в шестнадцатеричную систему счисления.
2. Модифицировать программу convert2 так, чтобы она выполняла перевод из
шестнадцатеричной в десятичную систему счисления.
3. Разработать программу, вычисляющую результат сложения целых чисел a и
b, значения которых вводятся с клавиатуры.
4. Разработать программу, вычисляющую разность вещественных чисел a и
b, значения которых вводятся с клавиатуры.
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
18
Download