Локальные и глобальные переменные
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

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

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

Функции и массивы

Передача одномерных массивов как параметров функции

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

Передача строк в качестве параметров функций

Строки при передаче в функции могут передаваться как одномерные массивы типа 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

При определении количество дней между двумя датами следует учитывать следующее:

  1. Вне зависимости от того, какая дата больше – первая или вторая, разность между ними всегда положительна. Между 1 сентября 2007 года и 31 августа 2007 года разница – 1 день, как и между 31 августа 2008 года и 1 сентября 2008 года.
  2. Високосный год – это год, который делится нацело на 4, но не делится при этом нацело на 100 или год, который делится нацело на 400. Это определение приведено здесь потому, что многие студенты почему-то (???) считают, что високосный год – это только такой год, который делится нацело на 4 J

Комментарии к заданию 2

Перевод вещественных чисел из одной системы счисления в другую целесообразно производить в два этапа:

  1. Перевод целой части вещественного числа в нужную систему (алгоритм описан в лабораторной работе №5).
  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. имеет имя на диске, что дает возможность программам работать с несколькими файлами;

  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, просмотров: 182.