40гг первые цифровые компьютеры программирование путем коммутации проводов

Вид материалаДокументы

Содержание


Динамические массивы
Многомерные массивы
Пример объявления, определения и вызова функции
Примеры возвращения значений
Передача параметров по указателю
Передача параметров ссылке
Пример функций с параметрами по умолчанию
Символ типа
Чтение и запись строками
Форматированный ввод-вывод
Неформатированный ввод
Дополнительные функции
Подобный материал:
1   2   3   4   5   6   7   8   9   ...   12

Динамические массивы создают с помощью операции new, при этом необходимо указать тип и количество элементов

int n = 100;

float *р = new float [n];
  • Динамические массивы нельзя при создании инициализировать, и они не обнуляются.
  • Преимущество динамических массивов состоит в том, что размерность может быть переменной, то есть объем памяти, выделяемой под массив, определяется на этане выполнения программы.
  • Доступ к элементам динамического массива осуществляется точно так же, как к статическим.

Работа с динамическим массивом

int N = 100;

int *p = new int[N];

for(int i=0;i
p[i] = 0;



delete [] p;


Многомерные массивы
  • Многомерные массивы задаются указанием каждого измерения в квадратных скобках.
  • Например, оператор int matr [6][8] задает описание двумерного массива из 6 строк и 8 столбцов.
  • В памяти такой массив располагается в последовательных ячейках построчно.

Инициализация многомерного массива
  • При инициализации многомерного массива он представляется:
  • как массив из массивов, при этом каждый массив заключается в свои фигурные скобки (в этом случае левую размерность при описании можно не указывать),
  • задается общий список элементов в том порядке, в котором элементы располагаются в памяти:
  • int mass2 [][2] = { {1, 1}, {0, 2}, {1, 0} };
  • int mass2 [3][2] = {1, 1, 0, 2, 1, 0}:



Доступ к элементам многомерного массива
  • Для доступа к элементу многомерного массива указываются все его индексы.
  • Например,
  • matr[i][j]
  • *(matr[i]+j)
  • *(*(matr+i)+j)
  • Это возможно, поскольку matr[i] является адресом начала i-й строки массива.

Динамический многомерный массив

int nstr, nstb;

cout «'" Введите количество строк и столбцов :";

cin » nstr » nstb;

int **a = new int *[nstr];

for(int i = 0; i
a[i] = new int [nstb];



for(int i = 0; i
delete [] a[i];

delete[] a;

Размещение динамического массива в памяти


Строки
  • Строка представляет собой массив символов, заканчивающийся нуль-символом.
  • Нуль-символ — это символ с кодом, равным 0, что записывается в виде управ­ляющей последовательности '\0'.
  • По положению нуль-символа определяется фактическая длина строки.
  • Строку можно инициализировать строковым литералом.

Пример работы со строками

char from[] = “ПЯВУ”;

char to[10];

for(int i=0;i
to[i] = from[i];

---

for(char *p=from, *t = to;*p!=‘\0’; *t++ = *p++);


С++. Функции


Основные вопросы
  • Понятие функции в С++
  • Объявление и определение функции
  • Возвращаемое значение и параметры
  • Функция main
  • Функции форматированного ввода-вывода


Функции в С++
  • В С++ отсутствует понятие процедуры, есть только функции.
  • Любая программа на С++ состоит из функций.
  • Одна из функция должна иметь имя main – с нее начинается выполнение программы.
  • Любая функция должна быть объявлена и определена. Объявлений может быть несколько, а определение – только одно.
  • Объявление функции должно находиться в теле программы до ее вызова, для того, чтобы компилятор мог проверить его правильность.
  • Объявление функции может находиться в теле другой функции или вне его.
  • В объявлении, определении и при вызове функции типы и порядок следования параметров должны совпадать.


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


Структура определения функции


[модификатор] тип имя ([список параметров)

{

тело функции

}


  • Модификатор, задающий область видимости функции:
  • extern – глобальная видимость – функцию можно использовать во всех модулях программы (устанавливается по умолчанию)
  • static – видимость только в пределах файла, в котором определена функция.
  • inline – рекомендует компилятору заменять вызов функции ее телом.
  • Тип возвращаемого значения – любой скалярный тип. Если функция не возвращает значений, указывается тип void.
  • Список параметров – состоит из пар типа и имени для каждого параметра. Пары разделяются запятыми.
  • В объявлении функции указывать имя параметров не обязательно. Они используются только для улучшения читаемости программы.


Пример объявления, определения и вызова функции


int sum(int x, int y);

int main(){

int a=2, b=3, c;

с = sum(a,b);

return 0;

}

int sum(int q,int p){

return (q+p);

}


Возвращаемое значение функции
  • Возврат значения из функции реализуется с помощью оператора

return [ выражение ];
  • Тип выражения должен совпадать с типом объявленного возвращаемого значения.
  • Если функция объявлена как void, return можно не использовать.
  • Функция может содержать несколько операторов return.
  • Нельзя возвращать указатель на локальную переменную, т.к. при возврате из функции память, выделенная под локальную переменную будет освобождена.


Примеры возвращения значений

int f1(){ return 1;}

void f2(){ return 2;} // Ошибка!

double f3(){ return 3;}

int *f4(){

int a = 5;

return &a; // Запрещено!!

}

Действия при вызове функции
  • В стеке выделяется память под
  • Адрес возврата функции
  • Параметры функции
  • В выделенную под параметры память помещаются значения выражений, указанных при вызове функции в качестве параметров.
  • Осуществляется переход по адресу места расположения функции в памяти.
  • В стеке выделяется память для локальных переменных функции.
  • Выполняется тело функции
  • Осуществляется переход по адресу точки возврата



Параметры функции
  • Способы передачи параметров функции:
  • По значению – в функцию передается копия значения некоторой переменной.
  • По адресу – в функцию передается адрес переменной. В этом случае функция может модифицировать переменную.


Передача параметров по указателю

void sum(int x, int y, int *z);

int main(){

int a=2, b=3, c;

sum(a,b,&c);

return 0;

}

void sum(int q,int p , int *z){

*z = q+p;

}


Размещение указателей в памяти


0x02

0xCC

0xBB

0xAA

0x0A

0x00

0x00

0x00

0x06

0xCC

0xBB

0xAA






Запись в программе:

int c = 10;

int *p = &c;

int **pp = &p;


Передача параметров ссылке

void sum(int x, int y, int &z);

int main(){

int a=2, b=3, c;

sum(a,b,c);

return 0;

}

void sum(int q,int p , int &z){

z = q+p;

}


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



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

int sumMas(int *m, int count);

int main(){

int mm[3] = {1,2,3};

int res = sumMas(mm,3);

return 0;

}

//int sumMas(int mas[],int cnt){

int sumMas(int *mas,int cnt){

int ret = 0;

for(int i=0;i

return ret;

}


Параметры со значением по умолчанию
  • Для упрощения вызова функции при ее объявлении можно указать значение по умолчанию для параметра.
  • Разрешается использование значений по умолчанию только для последних параметров функции.


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

int sumMas(int *m, int count = 3);

int main(){

int mm[3] = {1,2,3};

int res = sumMas(mm);

return 0;

}

//int sumMas(int mas[],int cnt=3){

int sumMas(int *mas,int cnt=3){

int ret = 0;

for(int i=0;i

return ret;

}


Функции с переменным числом параметров
  • Если в объявлении функции список параметров заканчивается многоточием, то это означает, что при ее вызове можно указать еще несколько параметров.
  • Проверка этих параметров не выполняется, char и short передаются как int, а float – как double.
  • Например:

int printf(const char *, …);


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

printf(“ Введите исходные данные”);

printf(“ Итого %10.2f рублей”, sum);

printf(“%i %i %i %i”, a, b, c, d);


Функция main
  • Функция, с которой начинается выполнение программы должна иметь имя main.
  • Возможны различные определения функции main:
  • void main()
  • int main()
  • int main(int argc);
  • int main(int argc, char *argv[ ])
  • Возвращаемое значение – код возврата программы.
  • Параметры – количество аргументов командной строки, и массив указателей на строки, являющиеся аргументами.


Функции форматированного ввода и вывода
  • Форматированный вывод на экран – функция printf
  • Форматированный ввод с клавиатуры – функция scanf

Форматированный вывод на экран – функция printf
  • Прототип:

int printf(char *format,…)
  • Строка формата описывает в каком виде должны быть выведены на экран переменные (значения выражений) следующие после строки формата.

printf(“ Введите исходные данные”);

printf(“ Итого %10.2f рублей”, sum);

printf(“%i %i %i %i”, a, b, c, d);


Спецификатор формата

% [flags] [width] [.prec] [F|N|h|l|L] type_char
  • flags – флаги (выравнивание, лидирующие нули и т.д.)
  • width – минимальное количество символов отводимое под вывод значения
  • .prec – точность - количество цифр после запятой для чисел с плавающей точкой
  • [F|N|h|l|L] – модификатор типа
  • type_char – тип выводимого значения



Флаги
  • - выравнивание по левому краю
  • + Выводить + перед положительными числами и – перед отрицательными
  • пробел Выводить пробел перед положительными числами и минус перед отрицательными


Ширина (width)
  • n - минимальное количество символов для значения.
  • Если значение занимает места больше указанного оно будет выведено

целиком,
  • Если меньше – оставшееся место будет заполнено пробелами.
  • 0n - оставшееся место будет заполнено нулями



Символ типа

d Integer signed decimal integer

i Integer signed decimal integer

u Integer unsigned decimal integer

x Integer unsigned hexadecimal int (with a, b, c, d, e, f)

X Integer unsigned hexadecimal int (with A, B, C, D, E, F)

f Floating point signed value of the form [-]dddd.dddd.

e Floating point signed value of the form [-]d.dddd or e[+/-]ddd

g Floating point signed value in either e or f form, based on given value and precision. Trailing zeros and the decimal point are printed if necessary.

E Floating point Same as e; with E for exponent.

G Floating point Same as g; with E for exponent if e format used

c Character Single character

s String pointer Prints characters until a null-terminator is pressed or precision is reached

% None Prints the % character

Форматированный ввод с клавиатуры – функция scanf
  • Прототип –

int scanf(char *format,…)
  • Строка формата описывает как должны интерпретироваться вводимые значения
  • Параметры после строки формата должны содержать адрес переменной, в которую будет помещено считанное значение.

int a,b,c,d;

scanf(“%i %i %i %i”, &a, &b, &c, &d);


С++.
Дополнительные возможности



Основные вопросы
  • Программы из нескольких модулей
  • Файловый ввод-вывод
  • Стандартные функции
  • Математические функции
  • Функции работы со строками
  • Динамические структуры данных
  • массивы с динамически изменяемым размером
  • списки
  • структуры данных на основе списков


Программы из нескольких модулей
  • Понятие модуля эквивалентно понятию пакета.
  • Использование модулей упрощает повторное использование кода.
  • В модуль помещается набор функций – файл имеет расширение . cpp. Объявление функций помещается в файл с таким же именем и расширением .h.
  • Для включения описания функций используется директива препроцессора
  • #include <имя файла с описаниями> - поиск данной библиотеки в системных папках
  • #include “имя файла с описаниями” - поиск данной библиотеки в папке проекта



Структура программы из нескольких модулей





Пример программы из двух модулей
  • Модули
  • Главный модуль (main.cpp)
  • Модуль с функциями
  • Файл с объявлением функций (funcs.cpp)
  • Файл с определением функций (funcs.h)


funcs.h

/* Описание действий, производимых функцией, возвращаемого значения, параметров */

void f1();

/* Описание действий, производимых функцией, возвращаемого значения, параметров */

int f2();

/* Описание действий, производимых функцией, возвращаемого значения, параметров */

char * f3(int a, int b);


/* Зачем нужна переменная */

extern int GlobalData;


funcs.cpp

/* Описание действий, производимых функцией, возвращаемого значения, параметров */

void f1(){…}

/* Описание действий, производимых функцией, возвращаемого значения, параметров */

int f2(){…}

/* Описание действий, производимых функцией, возвращаемого значения, параметров */

char * f3(int a, int b){…}


/* Зачем нужна переменная */

int GlobalData;


main.cpp

#include ”funcs.h”

int main(int argc,char *argv[]){



f1();



int a = f2(…);

char *b = f3(…);



return 0;

}


Файловый ввод-вывод
  • Открытие файла
  • Чтение данных из файла
  • Неформатированное чтение
  • Чтение символов
  • Чтение строк
  • Форматированный ввод
  • Запись данных в файл
  • Неформатированная запись
  • Запись символа
  • Запись строки
  • Форматированный вывод
  • Закрытие файла
  • Дополнительные функции
  • Функции работы с файлами описаны в заголовочном файле stdio.h


Открытие файла
  • Функция открытия потока имеет формат:

FILE* fopen(const char* filename, const char* mode);
  • При успешном открытии потока функция возвращает указатель на структуру типа FILE
  • Параметры
  • имя файла в виде,
  • режим открытия файла
  • "г" — файл открывается для чтения;
  • "w" — открывается пустой файл для записи (если файл существует, он стирается);
  • "а"' — файл открывается для добавления информации в его конец;
  • может быть добавлена буква t (текстовый режим) или b (двоичный режим), отличающиеся обработкой символов перехода на новую строку. По умолчанию файл открывается в текстовом режиме.



Закрытие файла
  • Файл закрывается либо при завершении программы, либо явным образом с помощью функции:

int fclose(FILE *pfile);
  • Перед закрытием файла информация из связанных с ним буферов выгружается на диск.
  • Рекомендуется всегда явным образом закрывать файлы, открытые для записи, чтобы избежать потери данных.

Чтение и запись по одному символу

int fputc(int c, FILE *stream);

int fgetc(FILE *stream);

с – выводимый символ

stream – указатель на файл, полученный функцией fopen().


Чтение и запись строками

char *fgets(char *s, int n, FILE *stream);

int fputs(const char *s, FILE *stream);

s – указатель на строку

n – максимальное количество символов в строке.

stream – указатель на файл, полученный функцией fopen().


Форматированный ввод-вывод

int fprintf(FILE *stream, const char *format[, argument, ...]);

int fscanf(FILE *stream, const char *format[, address, ...]);
  • stream – указатель на файл, полученный функцией fopen().
  • Остальные параметры как у функций printf и scanf.
  • Имеются аналоги и для других функций, ориентированные на стандартные потоки ввоода-вывода

Неформатированный ввод-вывод

size_t fread(void *ptr, size_t size, size_t n, FILE *stream);

size_t fwrite(const void *ptr, size_t size, size_t n, FILE *stream);

ptr – указатель на область памяти

size – размер элемента в байтах

n – количество элементов

stream – указатель на файл, полученный функцией fopen().


Дополнительные функции

int feof(FILE *stream);
  • Возвращает не равное нулю значение, если достигнут конец файла, в противном случае 0;

int ferror(FILE* stream);
  • Возвращает не равное нулю значение, если обнаружена ошибка ввода/вывода, в противном случае 0.

Пример вывода в файл