Добавил:
Рад, если кому-то помог Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
2
Добавлен:
01.11.2025
Размер:
2.03 Mб
Скачать

МИНИСТЕРСТВО ЦИФРОВОГО РАЗВИТИЯ, СВЯЗИ И МАССОВЫХ КОММУНИКАЦИЙ РОССИЙСКОЙ ФЕДЕРАЦИИ

Федеральное государственное бюджетное образовательное учреждение

высшего образования

«Поволжский государственный университет телекоммуникаций и информатики»

Факультет

Факультет № 1.

Направление подготовки / специальность

09.03.01 Информатика и вычислительная техника

Кафедра информатики и вычислительной техники

ФИО студента

Группа студента

,Лабораторная работа № 1

по программированию С

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

Ход работы:

1.

2.

3.

Размеры типов данных:

  • sizeof показывает количество байт, занимаемых каждым типом

  • Результаты зависят от архитектуры ОС и компилятора

  • Например, int обычно 4 байта, char - 1 байт

Переполнение целых типов:

  • При достижении CHAR_MAX (127) и инкременте: 127 + 1 = -128 (переполнение)

  • Беззнаковые типы ведут себя по модульной арифметике: UCHAR_MAX(255) + 1 = 0

Сравнение знаковых и беззнаковых:

  • При сравнении -5 > 5 знаковое число приводится к беззнаковому

  • -5 в беззнаковом представлении становится большим положительным числом

  • Результат: -5 > 5 дает 1 (true)

Приведение вещественных к целым:

  • i = 5.1 и i = 5.9 обрезают дробную часть → i = 5

Точность вещественных чисел:

  • float имеет ограниченную точность (~6-7 значащих цифр)

  • Большие числа (1e11) выводятся с потерей точности

  • 1234567890 в float может отображаться как 1234567936.000000 из-за потери точности

Арифметика с большими числами:

  • Выражения вроде 1e20 * 1e20 превышают диапазон double

  • Результаты могут быть inf (бесконечность) или терять точность

Особенности вычислений:

  • 10000*100000+1-4*250000000 должно давать 1, но в float может давать 0 из-за потери точности при больших числах

  • double сохраняет точность лучше для таких вычислений

Программа наглядно демонстрирует особенности представления данных в памяти, переполнение, приведение типов и потерю точности при работе с вещественными числами.

Ответы на контрольные вопросы

1. Какова структура программы на языке Си?

Программа на Си состоит из директив препроцессора (например, #include), объявлений функций и глобальных переменных. Обязательно должна присутствовать функция main(), которая является точкой входа. Код организуется в функции, содержащие операторы и локальные переменные.

2. Зачем нужна директива #include?

Директива #include используется для включения содержимого других файлов (обычно заголовочных) в исходный код. Это позволяет использовать стандартные библиотечные функции (например, printf, scanf) и собственные заголовочные файлы.

3. Что такое main()?

main() — это главная функция программы, с которой начинается выполнение. Она может быть объявлена как int main(void) или int main(int argc, char *argv[]). Должна возвращать целое значение (обычно 0 при успешном завершении).

4. Перечислите скалярные типы данных языка Си.

- Целочисленные: char, int, short, long (и их беззнаковые варианты unsigned)

- Вещественные: float, double, long double

- Перечисления: enum

- Указатели

5. Что определяет тип данного?

Тип данных определяет:

- Размер памяти, выделяемый для переменной

- Диапазон представляемых значений

- Допустимые операции над данными

- Способ интерпретации битового представления в памяти

6. Что такое void?

void — специальный тип, означающий "отсутствие типа". Используется:

- Для указания того, что функция не возвращает значение

- В качестве параметра функции, которая не принимает аргументов

- В объявлениях указателей на данные произвольного типа (void*)

7. Что такое явное и неявное приведение типов? Как и когда оно используется?

- Явное приведение: программист явно указывает преобразование, например: (double)x

- Неявное приведение: компилятор автоматически преобразует типы в выражениях, где участвуют разные типы данных

- Используется для обеспечения совместимости типов в операциях.

8. Что такое константа? Найдите константы в набранных вами программах.

Константа — это фиксированное значение, которое не может изменяться during выполнения программы.

Примеры из программ: 5, -0.5, CHAR_MAX, 0.6, 5.7, 2, 3., 1e10

9. Что такое переменная?

Переменная — это именованная область памяти, предназначенная для хранения данных, которые могут изменяться в процессе выполнения программы.

10. Как проинициализировать переменную?

При объявлении можно указать начальное значение:

c

int x = 10;

float y = 3.14;

char c = 'A';

11. Чем отличается оператор от операции?

Операция — это действие над операндами (например, +, -, *)

Оператор — это законченная инструкция языка (например, if, while, x = y + z;)

12. Чем отличаются унарные операции от бинарных?

Унарные операции имеют один операнд (например, -x, ++i, !flag)

Бинарные операции имеют два операнда (например, a + b, x = y, a > b)

13. Какие операции относятся к арифметическим? Каков приоритет каждой из них?

Арифметические операции (по убыванию приоритета):

++, -- (постфиксные/префиксные)

+, - (унарные)

*, /, %

+, - (бинарные)

14. Каков порядок выполнения операций в случае их одинакового приоритета?

При одинаковом приоритете операции выполняются слева направо (ассоциативность слева направо), за исключением присваивания и унарных операций.

15. Как выполняется операция деления в случае целочисленных операторов и в случае, когда хотя бы один из операторов вещественный?

Целочисленное деление: результат — целое число, дробная часть отбрасывается

Вещественное деление: результат — вещественное число, если хотя бы один операнд вещественный

16. Что такое выражение?

Выражение — это комбинация переменных, констант, операций и вызовов функций, которая вычисляет значение.

17. Какое значение вычисляет операция присваивания?

Операция присваивания вычисляет значение правого операнда и возвращает его как результат операции.

18. В каком порядке выполняются присваивания в случае, если в выражении их несколько?

При множественном присваивании (a = b = c = 5) операции выполняются справа налево.

19. Как и зачем используются дополнительные операции присваивания?

Сокращенные операции (+=, -=, *=, /=) объединяют арифметическую операцию с присваиванием. Они компактнее и могут быть эффективнее для компилятора.

20. Чем отличается префиксная форма операции инкремента или декремента от постфиксной?

Префиксная (++x): сначала увеличивает, затем использует значение

Постфиксная (x++): сначала использует текущее значение, затем увеличивает

21. Какие функции используются для ввода информации? Назовите их отличительные особенности.

scanf() — форматный ввод

getchar() — ввод одного символа

gets() — ввод строки (небезопасная)

fgets() — безопасный ввод строки

Основная для форматного ввода — scanf().

22. Какие функции используются для вывода информации? Назовите их отличительные особенности.

printf() — форматный вывод

putchar() — вывод одного символа

puts() — вывод строки с переводом строки

Основная для форматного вывода — printf().

23. Почему функции scanf() и printf() называются функциями форматного ввода и вывода? Как они работают?

Они называются форматными, потому что используют форматную строку для определения типа и формата вводимых/выводимых данных. Функция анализирует форматную строку и соответственно обрабатывает аргументы.

24. Чем отличается управляющая строка функции scanf() от управляющей строки функции printf()?

В printf() управляющая строка может содержать обычный текст и спецификаторы

В scanf() управляющая строка в основном содержит только спецификаторы формата и символы-разделители

25. Что такое спецификатор формата? Зачем он нужен?

Спецификатор формата — это последовательность символов, начинающаяся с %, которая указывает тип и формат данных. Он нужен для правильного преобразования данных при вводе/выводе.

26. Какие параметры указываются функции scanf() после управляющей строки? Сколько их должно быть?

После управляющей строки указываются адреса переменных, в которые будут записаны считанные данные. Количество адресов должно соответствовать количеству спецификаторов в форматной строке.

27. Каковы последствия несоответствия типа считываемой функцией scanf() переменной спецификатору типа?

Неопределенное поведение: повреждение данных в памяти, аварийное завершение программы, некорректные значения переменных.

28. Какие параметры указываются функции printf() после управляющей строки? Сколько их должно быть?

Указываются значения или переменные для вывода. Количество аргументов должно соответствовать количеству спецификаторов в форматной строке.

29. Каковы последствия несоответствия типа выводимого функцией printf() значения спецификатору типа?

Неопределенное поведение: вывод мусора, некорректных значений, аварийное завершение программы.

30. Что такое управляющие символы? Зачем они нужны? Приведите примеры.

Управляющие символы — это специальные последовательности, начинающиеся с обратного слеша \, которые используются для форматирования вывода:

\n — перевод строки

\t — табуляция

\\ — вывод обратного слеша

%% — вывод знака процента

\a — звуковой сигнал

Соседние файлы в папке Лаба1