шпора по проге. прог. Теоретический материал по курсу Основы программирования Язык С (для фкбв и фкбо) Основные понятия. Типы данных
Скачать 165.08 Kb.
|
Передача параметров в функцию осуществляется через системный стек. Передавать параметр можно только двумяспособами: 1 способ - по значению, 2 способ - по адресу: - когда передается параметр по значению, то в функцию попадает КОПИЯ ЗНАЧЕНИЯ этого параметра. В функции КОПИЯ изменяется. После выхода из функции вызывающая программа об этом изменении ничего не знает: у нее само значение (оригинал) не меняется. - когда передается параметр по адресу, то в функцию попадает КОПИЯ АДРЕСА этого параметра. При обращении к копии адреса происходит обращение к самому адресу. Таким образом, если в функции изменится этот параметр, то после выхода из функции вызывающей программе будет доступно измененное значение параметра. Пример: void f_perem(int a, int &b)//а передается по значению и b – по адресу Массивы передаются только по адресу. Адрес массива – имя массива без параметров – адрес его нулевого элемента. Для функции: при передаче параметров используется стек вызовов – сегмент данных, используемый для локальных переменных и временных значений. Выделяется при вызове программы и обычно небольшой по размеру (4 Мб). В нем можно обратиться к произвольной ячейке (передаваемой). Возвращать параметры из функции можно только одну величину. Эта величина может быть или значением переменной, или адресом переменной (массива). Возвращается соответственно КОПИЯ ЗНАЧЕНИЯ или КОПИЯ АДРЕСА. Особенность: Возвращать адреса имеет смысл только, если переменные или массивы динамические (они - не локальные. Это - не стековая область памяти, а системная куча). При попытке передачи адресов локальных объектов компилятор делает замечания. Если возникла необходимость вытащить из функции значения нескольких переменных, то эти переменные указывают в формальных параметрах и передают их по адресу (ссылке). Ссылка - неименованный указатель. Функция с такими переменными работает как с обычными переменными. (это С++). Применяется при передаче параметров в функцию или возврата значения. Пример возврата значения из функции: int GetMaxElem(int m[], int I)//получить максимальное значение { int maxim = m[0]; for(int i=0; i if(m[i]>maxim) maxim = m[i]; return maxim; //значение целого типа, поэтому тип функции целого типа. } Вызывающая функция должна быть представлена: int max; max = GetMaxElem(mas, kol);//main получает максимальное значение из функции в переменную max Пример возврата адреса из функции: int * GetAdresMas (int I)//возвращаем динамический адрес одномерного массива { int *m; m = new int [I]; for(int i=0; i return m; //адрес } Вызывающая функция должна быть представлена: //передаем количество элементов, возвращаем адрес динамического одномерного массива int *mas1=NULL; //указатель mas1 = GetAdresMas (kol);//вызов функции создания динамического одномерного массива. В переменной mas1 будет адрес начальной области памяти динамического массива Заголовочные файлы Директива является простейшим средством обеспечения согласованности объявлений в различных файлах, она включает в них информацию об интерфейсе из заголовочных файлов. Заголовочные файлы обычно имеют расширение h и могут содержать: - определения типов, констант, встроенных функций, шаблонов, перечислений; - объявления функций, данных, имен, шаблонов; - пространства имен; - директивы препроцессора; - комментарии. #include <имя.h> - директива для препроцессора – подключение заголовочных файлов с прототипами библиотечных функций. Поиск файла, если не указан полный путь, ведется в стандартных каталогах включаемых файлов; #include “имя.h” - директива для препроцессора – подключение собственных заголовочных файлов с прототипами функций, классов, определенных в данном проекте. В этом случае поиск файла ведется в каталоге, содержащем исходный файл, а затем уже в стандартных каталогах. Пример: //подключение бибилиотек #include #include #include #include Файл Для удобства обращения информация в запоминающих устройствах хранится в виде файлов. Файл – именованная область внешней памяти, выделенная для хранения массива данных. Данные, содержащиеся в файлах, имеют самый разнообразный характер: программы на алгоритмическом или машинном языке; исходные данные для работы программ или результаты выполнения программ; произвольные тексты; графические изображения и т. п. Для программиста открытый файл представляется как последовательность считываемых или записываемых данных. При открытии файла с ним связывается поток ввода-вывода. Выводимая информация записывается в поток, вводимая информация считывается из потока. Работа с файлами в стиле С++ Пример: запись файла в место расположения проекта #include #include using namespace std; int main() { setlocale(0, ""); ofstream f_out; //объект вывода f_out.open("11"); //открытие файла if (f_out.is_open() == NULL) { cout << "\n Не могу открыть выходной файл\n"; return 1; } //запись строки, чисел и символа char strC[50] = " Строка для записи в файл."; int n1 = 10, n2 = 20; char ch = 'Я'; f_out << strC << endl << n1 << endl << n2 << endl< f_out.close(); return 0; } Результаты работы программы в файле 11 /* Строка для записи в файл. 10 20 Я */ Пример: чтение файла из места расположения проекта #include #include using namespace std; int main() { setlocale(0, ""); ifstream in_out;//объект ввода in_out.open("11");//открытие файла if (in_out.is_open() == NULL) { cout << "\n Не могу открыть входной файл\n"; return 1; } //чтение строки, чисел и символа char strC[50]; int n1, n2; char ch; in_out.getline(strC, 50); in_out >> n1 >> n2 >> ch; if(in_out.peek()=='\n') in_out.get(); in_out.get(ch); in_out.close(); cout<< strC << endl << n1 << endl << n2 << endl << ch << endl; return 0; } Результаты работы программы Работа с файлами в языке Си Когда поток открывается для ввода-вывода, он связывается со стандартной структурой типа FILE, которая определена в stdio.h и fstream. Структура FILE содержит необходимую информацию о файле. Открытие файла осуществляется с помощью функции fopen(), которая возвращает указатель на структуру типа FILE, который можно использовать для последующих операций с файлом. FILE *fopen(name, type); name – имя открываемого файла (включая путь), type — указатель на строку символов, определяющих способ доступа к файлу: "r" — открыть файл для чтения (файл должен существовать); "w" — открыть пустой файл для записи; если файл существует, то его содержимое теряется; "a" — открыть файл для записи в конец (для добавления); файл создается, если он не существует; "r+" — файл открывается для чтения и записи (файл должен существовать). Файл сначала читается. Файловый указатель устанавливается в конец, а затем туда можно записать что-то. При перестановке файлового указателя в начало перетирается только объем, равный длине вновь записываемой строки; "w+" — открывается пустой файл для чтения и записи (если файл существует, он перетирается). Файл сначала записывается, потом его можно читать. При перестановке файлового указателя в начало перетирается только объем, равный длине вновь записываемой строки (можно писать в самом начале файла); "а+" — файл открывается для добавления информации в его конец и чтения этой информации. Файл можно читать и прочитанное записывается только в конец. Если файла нет, то он создается. Возвращаемое значение — указатель на открытый поток. Если обнаружена ошибка, то возвращается значение NULL. Функция fclose() закрывает поток или потоки, связанные с открытыми при помощи функции fopen() файлами. Закрываемый поток определяется аргументом функции fclose(). Возвращаемое значение: значение 0, если поток успешно закрыт; константа EOF, если произошла ошибка. Пример: Запись и чтение строки, символа, массива #include using namespace std; int main() { char ar[300]="Привет студентам!"; //запись FILE *f; f=fopen("11", "w"); if(!f) return 1; fputs(ar, f); //запись строки fputc('\n', f); //символа double mas[10], pi = 3.14; for (int i = 0; i<10; i++) { mas[i] = pi*(i + 1); fprintf(f, "%5.2f\t", mas[i]);//массива } fclose(f); //чтение строки и массива char ar1[300]; f=fopen("11", "r"); if(!f) return 1; fgets(ar1,300, f); //функция чтения строки double mas2[10]; for (int i = 0; i<10; i++) fscanf(f, "%lf", &mas2[i]);//массив fclose(f); cout< for (int i = 0; i<10; i++) cout << mas2[i] << " "; return 0; } Приложение 1 Приоритет операций. Операции С++ приведены в порядке убывания приоритета
Унарные операции имеют более высокий приоритет, чем бинарные.
Другие Операции (продолжение)
|