Главная страница
Навигация по странице:

  • Возвращать параметры из функции

  • Работа с файлами в стиле С++

  • Работа с файлами в языке Си

  • Приложение 1 Приоритет операций.

  • Унарные операции Примеры

  • Бинарные операции и тернарные Примеры

  • шпора по проге. прог. Теоретический материал по курсу Основы программирования Язык С (для фкбв и фкбо) Основные понятия. Типы данных


    Скачать 165.08 Kb.
    НазваниеТеоретический материал по курсу Основы программирования Язык С (для фкбв и фкбо) Основные понятия. Типы данных
    Анкоршпора по проге
    Дата06.01.2023
    Размер165.08 Kb.
    Формат файлаdocx
    Имя файлапрог.docx
    ТипДокументы
    #874591
    страница4 из 6
    1   2   3   4   5   6


    Передача параметров в функцию осуществляется через системный стек. Передавать параметр можно только двумяспособами: 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 //функции ввода – вывода для c++

    #include //стандартные функции (для функции srand)

    #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

    Приоритет операций.

    Операции С++ приведены в порядке убывания приоритета

    Унарные операции

    Примеры

    :: доступ к области видимости

    int count;//глобальная одноименная

    int numer;//глобальная

    void main()

    {

    int count = 1;//локальная одноименная

    ::count = 10; //обращение к глобальной

    numer = 100;//обращение к глобальной

    cout<<(count + ::count + numer)<
    }

    . точка - обращение к открытым полям пользовательского типа через объект

    struct drob

    {

    int i;

    int j;

    } d;
    d.i = 2; d.j = 4;

    -> обращение к полям открытым полям пользовательского типа через указатель на объект

    drob *pd = &d;

    cout<i<<" "<j<

    [] обращение к элементу массива (индексация)

    int x[10] = { 0 }, i=5;

    x[i++] += (10 * i);

    cout<

    ( ) – вызов функции

    sort(mas, mas+N, Comp);

    ++ Префиксная форма: пред-инкремент

    int x=10, y=++x;//прединкр.

    cout << x << " " << y << endl; //11 11

    – – Префиксная форма: пред-декремент

    int x=10, y=--x;//пред

    cout << x << " " << y << endl; //9 9

    sizeof(тип) определение размера

    int x; double pi = 3.14;

    cout <
    //4 8

    ++ Постфиксная формы: пост-инкремент
    пред-инкремент

    int x=10, y=x++;//постинкр.

    cout << x << " " << y << endl; // 11 10
    int x = 10, y = ++x;//префиксн.

    cout << x << " " << y << endl; // 11 11

    – – Постфиксная форма: постфикс: пост-декремент

    пре-дектемент

    int x=10, y=x--;//постдек.

    cout << x << " " << y << endl; //9 10

    int x = 10, y = --x;//префиксн.

    cout << x << " " << y << endl; // 9 9

    Поразрядное дополнение (дополнение до единицы) – инвертирование

    int x = 10, y = x;

    printf("%x %x -> %d\n", x, y, y);

    // a fffffff5 -> -11

    ! Логическое отрицание

    int x = 0, y;

    if (!x) y = 1;

    – Унарный минус

    int x=10, y=-x;

    printf("%x %x -> %d\n", x, y, y);

    // a fffffff6 -> -10

    + Унарный плюс //работает для пользовательских типов данных

    int x=-10, y=+x;

    printf("%x %x -> %d\n", x, y, y);

    // fffffff6 fffffff6 -> -10

    & Операция взятия адреса

    int x = 10, *y; y = &x;

    printf("%d %d %p\n", x, *y, y);

    //10 10 0024FB10

    * разадресация

    int *x = NULL;

    new

    выделение памяти

    delete

    освобождение памяти

    (тип) приведение типа

    int x=2, y=4; double d = (double)x/y;

    cout << d << endl;//0.5

    Унарные операции имеют более высокий приоритет, чем бинарные.

    Бинарные операции и тернарные

    Примеры

    * Умножение

    int x = 15, y = 2;

    x = x * y; cout << x << endl; //30

    / Деление

    int x = 15, y = 2;

    x = x / y; cout << x << endl; //7

    % Остаток от деления

    int x = 15, y = 2;

    x = x % y; cout << x << endl; //1

    + Бинарный плюс (сложение)

    int x = 15, y = 2;

    int c = x + y; cout << x << endl; //17

    – Бинарный минус (вычитание)

    int x = 15, y = 2;

    int c = x - y; cout << x << endl; //13

    << Сдвиг влево, а также помещение в поток

    int x = 3, y = 2;

    x = x << y; cout << x << endl; //12

    cout << (x<

    >> Сдвиг вправо, а также извлечение из потока

    int x = 15, y = 2;

    x = x >> y; cout << x << endl; //3

    cout << (x>>y) << endl; //3

    < Меньше

    int x = 5, y = 2; if (x < y) x *= 2;

    printf("%d %d\n", x, y); // 5 2

    <= Меньше или равно

    (x <= y)

    > Больше

    int x = 5, y = 2; if (x > y) x *= 2;

    printf("%d %d\n", x, y); // 10 2

    >= Больше или равно

    (x >= y)

    = = Равно

    (x == y)

    != Не равно

    (x != y)

    & Поразрядное И

    int x = 3, y = 5;

    x = x & y; cout << x << endl; //1

    ^ Поразрядное исключающее ИЛИ

    int x = 3, y = 5;

    x = x ^ y; cout << x << endl; //6

    | Поразрядное включающее ИЛИ

    int x = 3, y = 5;

    x = x | y; cout << x << endl; //7

    && Логическое И

    int x = 3, y = 0;

    cout << (x && y) << endl; //0

    || Логическое ИЛИ

    int x = 3, y = 0;

    cout << (x || y) << endl; //1

    выражение? истина : ложь; тернарный оператор

    int x = 15;

    (x % 2) ? cout<<"нечет\n" : cout<<"чет\n";

    = Присваивание

    int x = 15, y=x;

    printf("%d %d\n", x, y); //15 15

    *= Присвоить произведение

    int x = 3, y; y = x *= x;

    printf("%d %d\n", x, y); // 9 9

    /= Присвоить частное

    int x = 8, y=2; x /= y;

    printf("%d %d\n", x, y); // 4 2

    %= Присвоить остаток

    int x = 18; x %= 5;

    printf("%d \n", x); // 3

    += Присвоить сумму

    int x = 5, y = 2; y += x;

    printf("%d %d\n", x, y); // 5 7

    -= Присвоить разность

    int x = 5, y=2; x -= y;

    printf("%d %d\n", x, y); // 3 2

    <<= Присвоить сдвиг влево

    x <<=3;

    >>= Присвоить сдвиг вправо

    y >>=x;

    &= Присвоить поразрядное И

    x &= 5;

    ^= Присвоить поразрядное исключающее ИЛИ

    x ^= 2;

    |= Присвоить поразрядное ИЛИ

    x |= 0xa;



    Другие Операции (продолжение)

    , перечисление

    int x, z = 0, y = 2, k, m;

    double a, hi = 3.1415, h;

    = множественное присваивание

    int x, y, z, k, m=10;

    x = y = z = k = m;


    1   2   3   4   5   6



    написать администратору сайта