40гг первые цифровые компьютеры программирование путем коммутации проводов
Вид материала | Документы |
- Рабочая программа учебной дисциплины «Системы коммутации» Направление подготовки, 204.68kb.
- Неоднородный полупроводниковый носитель информации в переменном магнитном поле, 107.68kb.
- Темы Лекции Практика, 13.65kb.
- Общие принципы построения вычислительных сетей, 1480.56kb.
- Курс лекций "интернет технологии", 1261.62kb.
- А) Представление информации в цифровых автоматах (ЦА), 34.28kb.
- Информатика. Лекции. Краткая история компьютерной техники Первые компьютеры: Z3, Colossus,, 3630.67kb.
- Курс лекций для студентов очного и заочного отделений по специальности 210406 «Сети, 3045.9kb.
- Радумльская средняя школа, 28.4kb.
- Лекция №7. Обобщенная задача коммутации Важной задачей построения сетей ЭВМ является, 67.2kb.
Динамические массивы создают с помощью операции 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.
Пример вывода в файл