ФГОБУ ВПО "СибГУТИ" Кафедра вычислительных систем Дисциплины "ЯЗЫКИ ПРОГРАММИРОВАНИЯ" "ПРОГРАММИРОВАНИЕ" Практическое занятие Ввод-вывод информации Преподаватель: Доцент Кафедры ВС, к.т.н. Поляков Артем Юрьевич © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» Шаблон документа Общий для всех писем текст В котором изменяются только персональные данные 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