- •Нижегородский государственный университет им. Н.И. Лобачевского (ннгу)
- •Учебно-методическое пособие по курсу «программирование (язык си)»
- •1. Содержательное описание курса
- •1.1. Цели освоения дисциплины
- •1.2. Место дисциплины в структуре основных образовательных программ
- •1.3 Формирование компетенций
- •1.4 Требования к результатам освоения дисциплины «Программирование (с)»
- •2. Структура курса «Программирование (с)»
- •2.1 Плановая нагрузка
- •2.2. Содержание разделов дисциплины
- •10. Типы, определяемые пользователем.
- •3. Лабораторный практикум
- •3.1. Общие положения о выполнении лабораторных работ
- •3.2. Тематические задания по курсу «Программирование (язык си).
- •If (условие) оператор;
- •& Конъюнкция (логическое и)
- •| Дизъюнкция (логическое или)
- •1. Массивы символов.
- •2. Числовые массивы.
- •1. Передача параметров в функции.
- •2. Рекурсивные функции.
- •3.3. Рекомендации по выполнению лабораторных работ
- •Задача Джонсона. Обработки n деталей на 2 станках.
- •Модификация задачи Джонсона.
- •4. Учебно-методическое обеспечение самостоятельной работы студентов.
- •4.1. Вопросы для контроля
- •4.2. Критерии оценок
- •4.3. Учебно-методическое и информационное обеспечение дисциплины «Программирование (с)»
- •Оглавление
- •Учебно-методическое пособие по курсу «программирование (язык си)»
- •603950, Нижний Новгород, пр. Гагарина, 23.
3.3. Рекомендации по выполнению лабораторных работ
Форматированный ввод-вывод. В программе описываются переменные трёх типов: char, int, double и строка символов, как массив типа char. С клавиатуры вводятся их значения. Используя, допустимые спецификаторы формата, вывести их представления. Объяснить полученный результат.
Пример: программа считывает символ и отображает его в различных форматах.
char ch; // int ch;
printf("Input a symbol: \n");
scanf("%c",& ch ); //ch=getchar();
printf("\n%c\n%5c\n%-5c\n%d\n%o\n%x\n",ch,ch,ch,ch,ch,ch);
Объяснить полученный результат.
Ввод и вывод вещественных данных. Наиболее приятный вид имеет числовая информация, организованная по табличному типу – в виде колонок фиксированной ширины, в которых одноименные числовые разряды располагаются друг под другом. При этом более рационально используется площадь экрана. Достигается это за счет управления форматами выводимых данных.
В программе описывается массив из 20 вещественных чисел. Осуществить запрос количества чисел и их ввод. Вывести их компактно (в одну или несколько строк) в предположении, что вводимые числа вещественные и имеют 2 значащие цифры в дробной части. Перед каждым числом разместить его порядковый номер и после номера «:». После нажатия любой клавиши вывести их столбиком, располагая одноименные разряды друг под другом, подвести под столбиком черту и напечатать сумму введенных чисел.
Замечание: наиболее часто применяемые типы вещественных чисел представлены короткими (4 байта) и длинными (8 байт) данными. Си использует для этой цели спецификаторы float и double.
Короткий вещественный формат по модулю обеспечивает представление чисел в диапазоне от 10-38 до 10+38 примерно с 7-8 значащими цифрами. Для 8-байтового формата диапазон существенно расширяется –от 10-308 до 10+308, а количество значащих цифр увеличивается до 15-16.
Для компактного вывода на каждое число вместе с его номером необходимо отвести столько позиций, чтобы длина строки была кратна ширине колонки. В противном случае часть последнего числа будет автоматически перенесена в следующую строку.
Использование функций. Известно, что любое четное число N (N > 0) может быть представлено в виде суммы двух простых чисел (N = N1 + N2). Написать программу, которая отыскивает все такие разложения (о не единственности решения свидетельствует простейший пример: 4 = 1 + 3 = 2 + 2).
Алгоритм работы программы: она перебирает все возможные слагаемые, первое из которых не превосходит 0.5*N, и если оба они оказываются простыми, выводит полученный результат. Анализ слагаемых выполняется с помощью функции prime, которая возвращает значение «1», если число простое, «0», если составное.
int prime(long N)
{
long j;
if(N < 4) return 1;
if(N%2 == 0) return 0;
for(j=3; j*j <= N; j+=2)
if(N%j==0) return 0;
return 1;
}
Обратить внимание, где будет располагаться функция.
Преобразование типов, условные операторы. «Вечный календарь». Даны натуральные числа d, m, g, которые обозначают число, месяц и год. Определить день недели, на который попадает введенная дата.
Замечание. Дата должна находиться в диапазоне от 1582 до 4902 гг. Номер дня недели (воскресенье - 0, понедельник - 1, ..., суббота - 6) равен остатку от деления на 7 значения выражения
[ 2.6 * m - 0.2] + d + y + [y / 4] + [x / 4] - 2 * x.
Если полученное значение будет отрицательным, для получения истинного значения необходимо прибавить 7.
d - номер дня в месяце (1, 2, ...);
m - номер месяца, нумерация начинается с марта (март - 1, апрель - 2,..., декабрь - 10, январь и февраль считаются месяцами с номерами 11 и 12 предыдущего года;
y - две младшие цифры года;
x - две старшие цифры года;
[a] - целая часть а.
Осуществить контроль ввода дат. Использовать операторы целочисленного деления и остатка от деления. При выводе наименования дня недели использовать оператор switch.
Вложенные циклы. «Отгадай число». Генерируется случайное число в диапазоне от 0 до 99. Задано количество попыток. Если пользователь угадывает число, программа выводит сообщение "правильно"; в случае несовпадения выдается подсказка (больше/ меньше введённое число по сравнению со сгенерированным числом). В случае совпадения выдаётся сообщении о количестве попыток. При несовпадении печатается сгенерированное число. По окончании игры выдаётся запрос: «Продолжить игру Y/N?». Первый цикл – «начать новую игру», выход из второго цикла – количество попыток исчерпано или число угадано.
Обработка текстовой информации. В программе вводится текст (признак конца вводав - CTRL/Z - в программе EOF). Считаем, что слова в тексте могут быть разделены символами пробел, табуляция, клавишей enter (количество пробельных символов произвольно). Все остальные знаки препинания (если они написаны слитно со словом) считать, что они относятся к слову (по желанию можно учитывать различные знаки препинания для выделения слов)
Написать программу:
печатающую количество слов в тексте и гистограмму длин вводимых слов. Изобразить гистограмму в виде горизонтальных полос, напечатанных знаками "*" (можно другими).
Пример входных данных:
Язык Си был разработан сотрудником Bell Laboratories
(отделение известной телефонной компании AT&T)
Деннисом Ритчи
В тексте 14 слов.
****
**
***
**********
***********
****
************
**********
*********
**********
********
*****
********
*****
печатающую количество предложений и количество слов в предложении (конец предложения - ". ? !"). Изобразить диаграмму в виде вертикальных полос, напечатанных знаками "*" (можно другими).
Пример.
Пусть в тексте 4 предложения. В 1-м предложении 4 слова, во 2-м 3, в 3-м 6, в 4-м 5.
*
* *
* * *
* * * *
* * * *
* * * *
Битовые операции. Осуществить циклический сдвиг влево или вправо на заданное число позиций. Пользователь вводит число (целое или символ в зависимости от того, что сдвигают: integer или char), а также число позиций сдвига. В результате выполнения программы должно быть выведено на экран:
А) исходное число в десятичном и двоичном виде
Б) число, полученное в результате сдвига, в двоичном и десятичном формате.
Пример. Пусть исходное число 11710.
Двоичное представление: 011101012.
Сдвиг вправо на 3 позиции: 101011102 = 17410.
Сдвиг влево на 4 позиции: 010101112 = 8710.
Решить задачу о ранце, используя битовые операции. Задаётся число предметов, их вес и полезность, а также грузоподъёмность ранца. Определить, какие предметы надо уложить в ранец, чтобы их суммарная стоимость была максимальной.
Замечание. Задача переборного типа. Перебор осуществляется по всевозможным представлениям двоичного числа. Количество комбинаций 2n, где n – количество предметов. Поиск комбинации, на которой суммарный вес предметов <= объёма ранца и суммарная стоимость предметов в ранце максимальная.
