Переменные, которые используются внутри данной функции, называются локальными. Память для них выделяется в стеке, поэтому после окончания работы функции они удаляются из памяти. Нельзя возвращать указатель на локальную переменную, т. к. память, выделенная такой переменной будет освобождаться.
Глобальные переменные – это переменные, описанные вне функций. Они видны во всех функциях, где нет локальных переменных с такими именами. Глобальные переменные также можно использовать для передачи данных между функциями, но этого не рекомендуется делать, т. к. это затрудняет отладку программы и препятствует помещению функций в библиотеки. Нужно стремиться к тому, чтобы функции были максимально независимы, а их интерфейс полностью определялся прототипом функции.
Функции и массивы
Передача одномерных массивов как параметров функции
При использовании массива как параметра функции, в функцию передается указатель на его первый элемент, т. е. массив всегда передается по адресу. При этом теряется информация о количестве элементов в массиве, поэтому размерность массива следует передавать как отдельный параметр. Так как в функцию передается указатель на начало массива (передача по адресу), то массив может быть изменен за счет операторов тела функции.
Передача строк в качестве параметров функций
Строки при передаче в функции могут передаваться как одномерные массивы типа char или как указатели типа char*. В отличие от обычных массивов в функции не указывается длина строки, т. к. в конце строки есть признак конца строки - символ '\0'.
Пример: Функция поиска заданного символа в строке
int find(char *s,char c)
{
int i;
for (i=0;i<strlen(s);i++)
if(s[I]==c) return i;
return –1;
}
С помощью этой функции подсчитаем количество гласных букв в строке.
void main()
{
char s[255];
char *gl="aouiey";
int i, k;
gets(s);
for(i=0,k=0;I<strlen(gl);i++)
if(find(s,gl[I])>0
k++;
printf("%d",k);
}
Рекомендации по выполнению лабораторной работы
Комментарии к заданию 1
При определении количество дней между двумя датами следует учитывать следующее:
Комментарии к заданию 2
Перевод вещественных чисел из одной системы счисления в другую целесообразно производить в два этапа:
a) Дробная часть числа умножается на основание новой системы счисления.
b) Получившаяся при умножении целая часть считается очередной цифрой дробной части числа в новой систем счисления, начиная со старшей (старшая цифра – первая справа от запятой).
c) Получившаяся после умножения дробная часть считается новым значение дробной части числа, подлежащей переводу.
d) Пункты a-c выполняются до тех пор, пока дробная часть не станет равной 0 или пока не будет достигнута заданная точность (нужное количество цифр после запятой).
Содержание отчета
Отчет по лабораторной работе должен содержать:
- задание лабораторной работы, соответствующее варианту
- структурную схему алгоритма программы и подпрограммы (подпрограмм)
- текст программы
- результаты работы программы
Лабораторная работа 7
Цель работы
Закрепление пройденного материала: использование условных операторов, циклов, массивов, работа с функциями.
Задание
Разработать программу и подпрограмму (подпрограммы), выполняющие действия согласно варианту задания
№ | Вариант |
для заданного натурального Nполучить символьное представление числа в виде последовательности троек цифр и пробела между ними. | |
для заданного целого числа N получить N чисел Фибоначчи u0 = 0; u1 = 1; ui = ui-1 + ui-2 и N членов последовательности f0 = 0; f1 = 1; fi = fi-1 + fi-2 + ui-2. | |
для заданного натурального числа m получить все трехзначные числа, сумма цифр которых равна m (m<27). | |
перевод десятичного числа в римскую систему счисления I=1, V=5, X=10, L=50,C=100,D=500,M=1000. | |
перевод десятичного числа в двоично-десятичную систему счисления. | |
вычисление суммы n членов последовательностиa0+a1+a2+…+an, где ai = 1/(i2+0+1)+1/(i2+1+1)+...+1/(i2+j+1), j=0…i |
Рекомендации по выполнению лабораторной работы
Комментарии к заданию 1
Требуется представить любое натуральное число в виде групп из 3-х цифр, разделенных пробелом. Например, число 123456 в результате работы программы должно принять вид 123<символ_пробела>456, а число 1234567890 – вид 1<символ_пробела>234<символ_пробела>567<символ_пробела>890.
Комментарии к заданию 4
В римской системе счисления рядом не может стоять более трех одинаковых римских цифр. Поскольку самое большое число, отображаемое римской цифрой, - это число 1000 (M), то максимально возможное число, которое можно записать в римской системе счисления, равно 3999 (MMMCMXCIX).
Комментарии к заданию 5
Двоично-десятичная система счисления (Binary Coded Decimal, BCD) – это такое представление десятичных чисел, в котором каждая десятичная цифра представлена своим двоичным эквивалентом. Поскольку максимальная десятичная цифра – 9 и для ее представления требуется четыре двоичных разряда (1001), то в двоично-десятичной системе счисления все десятичные цифры записываются четырьмя двоичными разрядами.
Содержание отчета
Отчет по лабораторной работе должен содержать:
- задание лабораторной работы, соответствующее варианту
- структурную схему алгоритма программы и подпрограммы (подпрограмм)
- текст программы
- результаты работы программы
Лабораторная работа 8
Цель работы
Изучение принципов работы с текстовыми файлами.
Задание
Разработать программу подпрограмму (подпрограммы), работающую с текстовым файлом и выполняющую действия согласно варианту задания
№ | Задание |
Подсчитать количество слов и определить и вывести на экран максимальное и минимальное слова и их длину. | |
Определить количество букв и цифр в файле (сколько раз в файле встречается каждая буква и каждая цифра) и среднее количество букв и цифр в строке. | |
Подсчитать в файле количество слов разной длины. | |
Подсчитать в файле количество строк и определить строку максимальной длины и вывести на экран количество строк в файле, самую длинную строку и ее длину. | |
Создать выходной файл на основе входного, удалив в каждой строке входного файла текст после первой точки. | |
Подсчет контрольной суммы строк – разности суммы кодов символов, стоящих на четных и на нечетных позициях строки. |
Теоретическая часть
Ввод-вывод в языке Си
Файл – это именованная область внешней памяти. Файл имеет следующие характерные особенности:
1. имеет имя на диске, что дает возможность программам работать с несколькими файлами;
Особенностью языка Си является отсутствие в нем структурированных файлов. Все файлы рассматриваются как неструктурированная последовательность байтов. При таком подходе понятие файла распространяется и на различные устройства. Одни и те же функции используются как для обмена данными с файлами, так и для обмена с устройствами.
Потоковый ввод-вывод
На уровне потокового ввода-вывода обмен данными производится побайтно, т. е. за одно обращение к устройству (файлу) производится считывание или запись фиксированной порции данных (512 или 1024 байта). При вводе с диска или при считывании из файла данные помещаются в буфер, а затем побайтно или порциями передаются программе пользователя. При выводе в файл данные также накапливаются в буфере, а при заполнении буфера записываются в виде единого блока на диск. Буферы реализуются в виде участков оперативной памяти. Т.о. поток – это файл вместе с предоставленными средствами буферизации. Функции библиотеки Си, поддерживающие обмен данными на уровне потока позволяют обрабатывать данные различных размеров и форматов. При работе с потоком можно:
1. Открывать и закрывать потоки (при этом указатели на поток связываются с конкретными файлами);
2. Вводить и выводить строки, символы, форматированные данные, порции данных произвольной длины;
3. Управлять буферизацией потока и размером буфера;
4. Получать и устанавливать указатель текущей позиции в файле.
Прототипы функций ввода-вывода находятся в заголовочном файле stdio.h, который также содержит определения констант, типов и структур, необходимых для обмена с потоком.
Открытие и закрытие потока
Прежде, чем начать работать с потоком, его надо инициировать, т. е. открыть. При этом поток связывается со структурой предопределенного типа FILE, определение которой находится в файле stdio.h. При открытии потока возвращается указатель на поток, т. е. на объект типа FILE. Указатель на поток должен быть объявлен следующим образом:
#include <stdio.h>
. . . . . . . .
FILE*f; /* указатель на поток */
Указатель на поток приобретает значение в результате выполнения функции открытия потока:
FILE* fopen(const char*filename,const char*mode);
где
const char*filename – строка, которая содержит имя файла, связанного с потоком;
const char*mode – строка режимов открытия файла.
Например, f=fopen("t.txt","r"); ‑ здесь t.txt – имя файла, r – режим открытия файла.
Файл, связанный с потоком, можно открыть в одном из 6 режимов:
Режим | Описание режима открытия файла |
r | Файл открывается для чтения, если файл не существует, то возвращается ошибка. |
w | Файл открывается для записи, если файл не существует, то он будет создан, если файл уже существует, то вся информация из него стирается. |
a | Файл открывается для добавления, если фай не существует, то он будет создан, если существует, то информация из него не стирается, можно выполнять запись в конец файла |
r+ | Файл открывается для чтения и записи, изменить размер файла нельзя, если файл не существует, то возвращается ошибка. |
w+ | Файл открывается для чтения и записи, если файл не существует, то он будет создан, если файл уже существует, то вся информация из него стирается. |
a+ | Файл открывается для чтения и записи, если фай не существует, то он будет создан, если существует, то информация из него не стирается, можно выполнять запись в конец файла |
Поток можно открывать в текстовом (t) или двоичном режиме(b). В текстовом режиме поток рассматривается как совокупность строк, в конце каждой строки находится управляющий символ '\n'. В двоичном режиме поток рассматривается как набор двоичной информации. Текстовый режим устанавливается по умолчанию. В файле stdio.h определена константа EOF, которая сообщает о конце файла.
При открытии потока могут возникать следующие ошибки:
- файл, связанный с потоком не найден (при чтении из файла);
- диск заполнен (при записи);
- диск защищен от записи (при записи) и т. п.
В этих случаях указатель на поток приобретет значение NULL.
Для вывода об ошибке при открытии потока используется стандартная библиотечная функция
void perror (const char*s);
Эта функция выводит на экран строку символов, на которую указывает указатель s, за этой строкой размещается двоеточие пробел и сообщение об ошибке. Текст сообщения выбирается на основании номера ошибки. Номер ошибки заносится в переменную int errno (определена в заголовочном файле errno.h).
После того как файл открыт, в него можно записывать информацию или считывать ее, в зависимости от режима.
Открытые файлы после окончания работы рекомендуется закрыть явно. Для этого используется функция:
int fclose(FILE*f);
Изменить режим работы с файлом можно только после закрытия файла.
Дата: 2016-10-02, просмотров: 214.