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

  • Использование памяти. Постоянная память

  • Динамическая память

  • Операторы new , delete во время выполнения программы оператор new

  • * имя ;имя = new тип

  • **имя ;имя = new тип *

  • Структура Структура

  • Функция. Объявление и описание. Функция

  • Сигнатура функции

  • Функцию можно объявить и описать.

  • Обращение к функции – вызов функции

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


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

    Строковые функции

    Все функции, работающие со строками, начинаются с str… , функции могут возвращать: указатель типа char, int, size_t.

    Введен тип size_t – типа int.

    Функции работы со строками находятся в библиотеке <string.h>

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

    Пример:

    // работа со строками в

    char s1[200] = "AAAAAA ";

    char s2[50] = "BBBB ";
    //слияние s1=s1+s2, записывается в конец строки s1 строка s2

    //s1 - место приемника, s2 - место источника, 200 – размер в байтах

    strcat_s(s1, 200, s2);

    printf("1. Слияние: %s\n", s1);

    Результат работы:



    Некоторые строковые функции приведены в приложении 4 «Строковые функции»

    Двумерный массив (матрица) используется, когда надо представить данные в виде таблиц, состоящих из строк и столбцов.

    В памяти двумерный массив располагается по строкам.

    Начальный индекс каждой строки начинается с 0, конечный индекс каждой строки равен количество строк минус 1.

    Начальный индекс каждого столбца равен 0, конечный индекс каждого столбца равен количеству столбцов минус 1.

    Объявление двумерного массива:

    Тип_массива Имя_массива [количество_строк][количество_столбцов]

    Работа с двумерным массивом происходит в циклах – внешнем и внутреннем.

    Внешний цикл организуется для перебора значения индексов по строкам. Внутренний цикл организуется для перебора значения индексов по столбцам. Во внутреннем цикле происходит обращение к каждому элементу двумерного массива.

    Обращение к элементу массива:

    Имя_массива [текущий_индекс_строки][текущий_индекс_столбца]

    Пример:

    #define N 2 //строки

    #define M 3 //столбцы

    int main()

    {

    // объявление двумерного массива

    int mas1[N][M];

    double dob[3][3];

    . . . . .

    }

    Если массивы располагаются в обычной памяти (их создает компилятор), то при объявлении массива его можно сразу инициализировать:

    Тип_массива Имя_массива[размерность][размерность] = {список значений через запятую};

    Пример:

    //4. присвоение значений инициализацией при объявлении

    int masI[2][3] = {//инициализированный массив, размером 2 строки и 3 столбца

    1, 2, 3,

    4, 5, 6

    };

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

    Объявление указателя: тип_переменной * имя_переменной.

    Операции, используемые с указателями:

    - & взятие адреса – возвращает адрес своего операнда; Когда к переменной применяется операция &, результатом операции будет адрес переменной в памяти.

    - * разадресация (разыменование) – возвращает значение переменной, хранящееся по заданному адресу.

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

    Существуют операции с указателями:

    - присваивания указателей: =

    - приведения типов, если указатели разных типов;

    - операции с указателями, если они принадлежат непрерывной области памяти (массиву):

    - сложение и вычитание указателей с константой (адресов с константой);

    - вычитание одного указателя из другого (вычитание адресов);

    - инкремент (адреса);

    - декремент (адреса);

    - сравнения (> >= < <= == !=) (адресов).

    Пример:

    //1. объявление

    int a; //объявление переменной

    int *pa; //объявление указателя

    a = 10; //переменной присвоили значение

    pa = &a; //связали указатель с адресом переменной

    printf("1. Значение переменной а=%d,"

    "\nадрес переменной а находится в переменной pa и равен %p,"

    "\nдостаем значение а через разадресацию (разыменование): *ра =%d\n", a, pa, *pa);
    //2. присваивание значения переменной а через указатель

    *pa = 25;

    printf("\n2. изменили значение а = %d\n",a);

    Результат выполнения:


    Пример Указатель и массив

    printf("\n\tСвязь Массива с Указателем\n");

    int mas[5] = {1,2,3,4,5};

    int i;

    //1. обычное обращение

    printf("1. Печать через индекс\n");

    for(i=0; i<5; i++) printf("%d ", mas[i]);

    vk;

    //2. объявление указателя на массив

    int *m;

    m = &mas[0]; //или m = mas; что эквавалентно

    printf("2. Печать через разыменование (указатель+смещение)\n");

    for(i=0; i<5; i++) printf("%d ", *(m + i));

    Использование памяти.

    Постоянная память (статическая) - Эта память отводится компилятором. Обычно в ней располагаются переменные, указатели и массивы разных типов. Размеры массивов заранее известны. Объекты, располагающиеся в такой памяти, при объявлении можно срезу инициализировать.

    Динамическая память используется, когда размер массивов (или каких-то объектов) заранее не известен, а определяется только во время работы программы, либо предполагается изменение физического размера массива, либо использование специальных динамических данных. Она располагается в особой области

    Распределение памяти осуществляется двумя способами:

    - операторами new– выделение памяти, delete- освобождение памяти;

    - функциями malloc(), calloc(), realloc() - выделение памяти, free() – освобождение памяти.

    При выделении памяти – возвращается адрес начала динамической памяти, с которого будут располагаться объекты (адрес первого выделенного байта).

    Освобождение памяти обязательно, так как память – ресурс системы.

    В программах сначала динамическая память выделяется, только потом инициализируется. После окончания работы с объектами, находящимися в динамической памяти, они удаляются. После удаление объекты не доступны.
    Операторы new, delete

    во время выполнения программы оператор newпозволяют выделить непрерывную динамическую память из кучи (свободного пространства адресов), возвращает адрес выделенной памяти и оператор delete – освобождает выделенную память.

    Алгоритм работы с этими операторами:

    1.создается указатель; 2. выделяется память; 3. инициализируется; 4. что-то делают с этими данными; 5. после окончания работы – удаляют память.
    Применение операторов с массивами

    Пусть

    i – текущий индекс элементов одномерного массива;

    j – текущий индекс элементов по строке двумерного массива;

    k – текущий индекс элементов по столбцу двумерного массива.

    Тогда:

    Выделение памяти для одномерного массива:

    тип * имя;

    имя = new тип [размер_массива];

    Обращение к элементу одномерного массива: имя [i];

    Удаление одномерного массива: delete [] имя.
    Выделение памяти для двумерного массива: (происходит в два этапа)

    тип **имя;

    имя = new тип * [количество_строк]; //1-ый этап

    for(j=0; j<количество_строк ; j++)

    имя [j] = new тип [количество_столбцов]; //2-ой этап

    Обращение к элементу двумерного массива: имя [j][k];

    где j, k –текущие индексы элемента

    Удаление двумерного массива: (происходит в два этапа)

    for(j=0; j<количество_строк; j++) delete [] имя[j]; //1-ый этап

    delete [] имя; //2-ой этап

    Удаление массивов применяется после окончания работы с массивами, так как после удаления память не доступна.

    Пример с одномерным массивом

    //1. Использование оператора new для создания динамического массива.

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

    int *m;

    m = new int[n];

    //присвоения начальных значений элементам через случайные числа

    for(i=0; i//печать

    printf("\nМассив m через new\n");

    for(i=0; i//поменять местами - перевернуть массив

    for(int i=0, j=n-1; i<=j; i++, j--)

    {

    int tmp=m[i];

    m[i]=m[j];

    m[j]=tmp;

    }
    // печать

    printf("\nМассив перевернутый m\n");

    for(i=0; i//удаление

    delete[] m; //освобождаем память
    Результат работы:



    Пример с двумерным массивом

    //2.Двойные указатели. Объявление указателя на указатель

    printf("2.Двойные указатели. Объявление указателя на указатель\n");

    int N1 = 3, M1 = 5;

    int i, j;

    float **mas1;
    // создаем массив указателей - массив строк (1-ый этап)

    mas1 = new float *[N1];
    //для каждого указателя создаем одномерный массив столбцов (2-ой этап)

    for(i=0; i //присвоение значений каждому элементу двумерного массива

    for(i=0; i
    for(j=0; j
    }

    //печать

    for(i=0; i
    for(j=0; j
    printf("\n");

    }

    //далее может быть какая-то работа с матрицей

    //освобождаем память

    for(i=0; i
    delete[] mas1; //2-ой этап

    Результат выполнения:




    Структура

    Структура –- сложный тип данных, позволяющий объединить данные разных типов и обрабатывать их как единый объект (под одним именем). Эти данные разных типов называются полями (компонентами, характеристиками).

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

    Создание структуры состоит из 2-х этапов:

    1) - объявить шаблон struct с объявлением идентификатора, объявить поля, входящие в шаблон. Поля – элементы любого типа; Объявленный идентификатор при ключевом слове struct – означает собственный_тип.

    2) - объявить переменную (объект) собственного типа :

    собственный_тип имя_переменной; (или имя_объекта).

    или объявить массив собственного типа:

    собственный_тип имя_массива [ размерность_массива].
    Обращение через имя_переменной к полям объекта собственного типа через точку:

    имя_переменной.поле;

    Обращение к полям элемента массива собственного типа через точку:

    имя_массива[индекс_массива].поле.

    Создание указателя на собственный тип:

    собственный_тип * имя_переменной;

    Обращение через указатель на объект: имя_переменной ->поле.
    В общем случае объявление сложного типа и объектов этого типа:

    struct имя

    {

    тип1 поле1;

    тип2 поле2;

    тип3 поле3;

    ..} список_ имен_переменных; или

    struct имя{//перечисление типов и полей…..};

    имя список_имен_переменных;
    Переменная собственного типа может называться экземпляром структуры или объектом. Память компилятором отводится только под переменную. Под шаблон память не отводится. Размер памяти, который отводится компилятором под одну переменную, равен сумме байт, отводимых под все характеристики.

    Примерструктуры

    #include

    #include

    using namespace std;
    struct BOOK //создание типа - КНИГА

    {

    char name[30]; //название

    int page; //количество страниц

    double cast; //цена

    };

    int main()

    {

    BOOK b; //объявлена переменная типа BOOK

    //задаем начальные значения переменной b

    strcpy(b.name, " Пигмалион");

    b.page = 100; //

    b.cast = 371.5;
    //печать характеристик через объект

    cout << "Название: " << b.name << ", Количество страниц=" << b.page << " Цена=" << b.cast << endl;

    BOOK *pb = &b; //создали указатель pb типа BOOK и связали его с объектом b

    //печать характеристик через указатель на тип

    cout << "Название: " << pb->name << ", Количество страниц=" << pb->page << " Цена=" << pb->cast << endl;

    return 0;

    }

    Можно создать инициализированную переменную этого типа: BOOK b ={"Xa-Xa",10,35.};
    Функция. Объявление и описание.

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

    Функции повышают уровень модульности программы, облегчают ее чтение, внесение изменений и коррекцию ошибок и, самое главное облегчают разработку алгоритмов решения задачи, позволяя разбивать её нa подалгоритмы (функции).

    Все функции языка Си подразделяются на две группы: встроенные и определяемые пользователем:

    - встроенные (стандартные) функции могут вызываться по имени без предварительного определения. Встроенные функции хранятся в виде объектного кода в специальных файлах (библиотеках).

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

    Функция имеет заголовок и тело.

    Заголовок функции: тип_функции имя_функции (список_параметров), где

    - тип_функции определяется типом возвращаемого функцией значения. Если функция ничего не возвращает, то тип ее void;

    - имя_функции – произвольное имя, имеющее смысл. Требования к имени такое, как к идентификатору.

    - список параметров – в круглых скобках указывается каждый параметр со своим типом через запятую: (тип_параметра имя1, тип_параметра имя2, . . . . тип_параметра имяN.) Эти параметры называются формальными. Если формальных параметров нет, то пустые скобки обязательны. Формальные параметры по своему свойству локальные: при входе в функцию они создаются, при выходе из функции они уничтожаются. Их область видимости – сама функция.

    Пример:

    void f_perem(int a, int &b) /* Заголовок функции,

    тип - void, имя - f_perem, а и b – формальные параметры */

    {// начало тела функции

    a = a*2; b = b*2;

    printf("\n2.ФУНКЦИЯ Получение значения и получение адреса: a=%d b=%d ", a, b);

    }// конец тала функции
    Сигнатура функции - количество и тип параметров.

    Тело функции должно быть заключено в {}. Если функция возвращает какой-то параметр, то этот параметр записывается в операторе возврата: return параметр. Если функция не возвращает параметр, то оператор return не ставится. Все переменные, массивы объявленные в теле функции носят локальный характер. Они: создаются, инициализируются в функции и при выходе из нее уничтожаются.

    Исключения составляют динамические переменные и массивы.
    Функцию можно объявить и описать.

    - Объявление функции – запись ее заголовка. В конце ставится символ «;» Объявление функции необходимо компилятору для проверки типов параметров. Объявление функции – прототип функции. Прототип функции должен записываться до обращения к функции.

    Пример:

    void f_perem(int a, int &b); // объявление функции без тела
    - Описание функции – запись ее заголовка с указанием параметров с типами и телом. В этом случае после заголовка функции символ «;» НЕ СТАВИТСЯ.

    Если функция небольшая, по описание и объявление функции совмещается. В этом случае функция должна располагаться до первого обращения к ней.

    void f_perem(int a, int &b) // описание с телом

    {

    a = a*2; b = b*2;

    printf("\n2.ФУНКЦИЯ Получение значения и получение адреса: a=%d b=%d ", a, b);

    }
    Обращение к функциивызов функции. В теле программы записывается ее имя со списком параметров, если они есть. В этом случае параметры называются фактические.

    Пример:

    f_perem(i, j);//ВЫЗОВ функции

    Если параметров нет, то ставятся пустые круглые скобки.

    Перечень типов параметров при вызове функции должен совпадать с перечнем типов в заголовке функции. Функцию НЕЛЬЗЯ описать или объявить в теле другой функции. Можно только вызвать.
    Имя функции без параметров (без скобок) – ее адрес (используется при передаче функции как параметра в другую функцию).
    1   2   3   4   5   6


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