progr_su_3.ppt
- Количество слайдов: 80
Типы данных в C Простые типы Целые Вещественные Указатели Перечислимый тип Пустой тип (void) Составные типы массивы структуры объединения
Целые типы данных char 1 байт short 2 байта long 4 байта int платформозависимый тип sizeof int - определение размера памяти, выделяемой для переменной заданного типа
Знаковые и беззнаковые типы signed unsigned char ch; // -128. . 127 unsigned char ch; // 0. . 255 signed short s; // -32 768. . 32 767 unsigned short s; // 0. . 65 535 signed int d; // -2 147 483 648. . 2 147 483 647 unsigned int d; // 0. . 4 294 967 295
Вещественные типы данных float — 4 байта (3. 4 *10 -38 до 3. 4*10+38) double — 8 байтов (1. 7 *10 -308 до 1. 7*10+308) long double — 10 байтов Формат числа с плавающей точкой: +/- m*2 p Где 2 — основание системы счисления, m — мантисса, p - показатель степени float: Знак 31 й 1 бит 0 й бит
Вычисление арифметических выражений 1. Неявное преобразование типов Приоритеты типов данных, используемые для неявного преобразования: long double → float → unsigned long (int) → unsigned short → unsigned char → signed char 2. Явное преобразование типов int b; double f = 13. 25; b = (int) f %10; 3. Приоритеты арифметических операций: 1. ++ -- 2. * / % 3. +- 4. = *= /= %= += -=
Указатели Объявление типизированного указателя: int* ptr; float* ptr; char* ptr; Объявление бестипового указателя: void* ptr; Инициализация переменной-указателя: int a = 5; int* ptr = &a; Косвенная адресация: int b = *ptr; a: 5 ptr : адрес a b : *ptr
Выражения, содержащие указатели int a = 10, b = 5; int * ptra = &a; int* ptrb = &b; *ptrb = *ptra + 2 * *ptrb; Замечание: нельзя получить адрес константного значения, арифметического выражения, регистровой переменной.
Преобразование типов указателей старший байт младший байт unsigned int a = 0 xddcc; void* ptr = &a; 0 unsigned 0 0 ch 0= *(unsigned 1 0 1 1 1 0 0 0 0 char 0 0 1 1 char*)ptr; printf(''%x %d'', a, ch); На экране: ddcc 204 ptr 1 1 0 0
Адресная арифметика Операции над указателями: присваивание ptr 1 = ptr 2; инкремент ptr 1++; декремент ptr 1 --; сложение ptr 2 = ptr 1 + 2; вычитание ptr 2 = ptr 1 — 3; где ptr 1 и ptr 2 — типизированные* указатели
Пример использования указателей Задача: в вещественную переменную ввести число. Просмотреть содержимое каждого байта указанной переменной. Ввели: 0. 21875 (0. 00111 ) Ответ: 1 байт — 0 2 #include
Перечислимый тип enum color{red, blue, black=4, green}; int var; switch (var) { case red: printf(''Это красный цвет''); break; case blue: printf(''Это синий цвет''); break; case black: printf(''Это черный цвет''); break; case green: printf(''Это зеленый цвет''); }
Тип void Использование: 1. для объявления функции, не возвращающей значение void My. Fn( ); 2. для объявления функции, не имеющей параметров void My. Fn (void); 3. для объявления переменной — бестипового указателя void* pointer;
Структура программы на языке C 1. Директивы препроцессора 2. Объявления переменных (локальные, глобальные) 3. Инициализация (определение) переменных 4. Объявление функции (прототип) 5. Реализация (определение) функции
#include
#include
#include
Пример 4 — оператор разрешения области видимости (С++) : : int x = 2; // глобальная переменная void fn() { int x = 1; // локальная переменная int z = x + : : x; printf(''z = %d'', z); }
Функция пользователя 1. Объявление функции 2. Определение (реализация) функции 3. Вызов функции Определение функции: тип_возвр_значения имя_функции (список параметров) { }
Функция, не возвращающая значение Прототип: Определение: void privet( ); void privet( ) { printf(''Privet!!!n''); } Вызов: int main() { privet(); return 0; }
Функция с параметрами, возвращающая значение Прототип: float square(float, float); Определение: float square(float fa, float fb) { float c = fa*fa + fb*fb; return c; } Вызов: int main() { float a=3, b=4, d; d = square(a, b); printf(''%fn'', d); return 0; }
Массивы Тип элемента массива Индекс элемента массива Начальный индекс элемента массива — 0 Размерность массива Объявление массива: int A[4]; float B[3][5]; char symb[5][6][4]; Инициализация одномерного массива: int A[4] = {5, -3, 8, 6};
Доступ к элементу массива Элемен 5 т -3 8 6 Индекс 1 2 3 a 0 int a[4]; 1. С помощью индекса: a[0] a[3] a[i] pritntf(''%d'', a[3]); 2. С помощью указателя: a — константа-указатель на начало массива a+1 — адрес элемента массива с индексом 0 *(a+1)<==> -3 *(a+i) <==> ?
Примеры 1. Ввести в числовой массив 5 вещественных чисел. Вычислить среднее арифметическое элементов массива. 2. Ввести в числовой массив 8 вещественных чисел. Вычислить максимальное значение элемента массива.
Обращение к элементу одномерного массива с помощью переменнойуказателя int D[3] = {1, 2, 3}; int* ptr = D; for(int i=0; i<3; i++) { printf(''%7 d'', *ptr); ptr++; }
Двумерный массив 0 -1 -2 -3 -4 1 1 2 3 4 -5 -6 2 Объявление -7 int B[3][4]; -8 Инициализация int B[3][4] = {-1, -2, -3, -4, 1, 2, 3, 4, 0 1 2 3 5, -6, -7, -8}; Доступ к элементу B[2][1] <==> -6
Доступ к элементу двумерного массива с помощью указателей int B[3][4]; B *(*(B+1)+2) -1 -2 -3 -4 1 1 2 3 4 2 *B, *(B+1), *(B+2) 0 -5 -6 -7 -8 *(*(B+j)+i), j - номер строки, i 0 - номер столбца 1 2 3
Комбинированные способы обращения к элементам двумерного массива 0 -1 -2 -3 -4 1 1 2 3 4 2 -5 -6 -7 -8 2 3 int B[3][4]; *(B[i]+j) (*(B+i))[j] 0 1
Задача Ввести с клавиатуры числа в двумерный массив, состоящий из 5 столбцов и 3 строк. Вычислить наименьшее значение элемента для каждой строки. Результаты вывести на экран.
Параметры функции 1. Передаются через стек 2. Виды параметров: • Параметр-значение • Параметр-указатель • Параметр-ссылка (в C++)
Передача параметра-значения float mult(float a) { a = 2*a; return a; } int main() { float num = 15. 5; printf(''%. 3 f n'', mult(num)); printf(''%. 3 f '', num); return 0; } Ответ: 31. 000 15. 500
Передача параметра-указателя void mult 2(float* pa) { *pa = *pa * 2 } int main() { float num = 15. 5; mult 2(&num); printf(''%fn'', num); return 0; } Ответ: 31. 000
Передача параметра-ссылки void mult 3(float &b) { b = b*2; } int main() { float num = 15. 5; mult 3(num); printf(''%fn'', num); return 0; } Ответ: 31. 000
Пердача в функцию одномерного массива void My. Function(int* a, int n); где a - указатель на начало массива n — количество элементов в массиве void My. Function(int a[ ], int n); где a[ ] - эквивалент обозначению *a n — количество элементов в массиве Вызов функции: int massiv[6]; … My. Function(massiv, 6);
Задача Для одномерного массива, содержащего N целых числа, определить, сколько чисел имеют значение в диапазоне от 100 до 10000. Заполнение массива выполнить с помощью генератора случайных чисел. Результат генерации и обработки массива вывести на экран. Заполнение, обработку массива и вывод результатов выполнить с помощью функций пользователя. Генерация случайных чисел : rand() (stdlib. h) Запуск генератора случайных чисел: srand() (stdlib. h и time. h)
Генератор случайных чисел int i, a[5], b[5]; srand(time(NULL)); // Запуск генератора for(i=0; i<5; i++) { // Генерация в диапазоне 0 — RAND_MAX // RAND_MAX = 32767 (stdlib. h) a[i]=rand(); // Генерация в диапазоне 2 - 101 b[i]=rand()%100+2; }
Решение задачи (1) #include
Решение задачи (3) void generate(int* a, int n) { int i; srand(time(NULL)); for(i=0; i
Решение задачи (4) void print_mas(int* a, int n) { int i; for(i=0; i
Решение задачи (5) int count(int* a, int n) { int c=0, i; for(i=0; i
Результат работы программы
Передача в функцию двумерного массива void My. Function(int mas[ ][3], int m, int n); где mas[ ][3] — адрес начала массива m и n — количество строк и столбцов в массиве Вызов функции: int massiv[4][3]; … My. Function(massiv, 4, 3);
Задача Ввести с клавиатуры числа в двумерный массив m x n. Вывести на экран массив в виде таблицы. Вывести на экран числа из второй строки в обратном порядке. Все действия над массивом выполнить с помощью функций
Решение задачи (1) #include
Решение задачи (2) int main() { int massiv[M][N]; input(massiv, M, N); print(massiv, M, N); revers(massiv[1], N); return 0; }
Решение задачи (3) void input(int mas[][N], int m, int n) { int i, j; for(i=0; i
Решение задачи (4) void print(int mas[][N], int m, int n) { int i, j; for(i=0; i
=0;" src="https://present5.com/presentation/5090597_151676544/image-48.jpg" alt="Решение задачи (5) void revers(int row[], int n) { int i; printf("n"); for(i=n-1; i>=0;" /> Решение задачи (5) void revers(int row[], int n) { int i; printf("n"); for(i=n-1; i>=0; i--) printf("%7 d", row[i]); }
Объявление пользовательского типа typedef int mas[4]; typedef float mas 2[3][4]; Создание массива: mas One; mas 2 Two; Передача массива в функцию: void My. Function 1(mas a, int n); void My. Function 2(mas 2 b, int m, int n);
Методы программирования Структурное программирование Модуль в С: *. h — заголовочный файл (внешняя часть модуля, интерфейс, header) • • • Директивы препроцессора Объявления типов данных Прототипы функций *. c, *. cpp, *. cc — реализация модуля (внутренняя часть модуля) • • • Объявления и инициализация переменных Реализация (определение) функций Директивы препроцессора
Конструирование программы для обработки двумерного массива
My. Modul. h #define M 4 #define N 3 typedef int tmas 2[M][N]; void input(tmas 2 mas, int m, int n); void print(tmas 2 mas, int m, int n); void revers(int row[], int n);
My. Modul. cpp #include ''My. Modul. h'' #include
Main. cpp #include ''My. Modul. h'' int main() { tmas 2 massiv; input(massiv, M, N); print(massiv, M, N); revers(massiv[1], N); return 0; }
My. Modul. h (2 редакция) #ifndef MYMODUL_H_INCLUDED #define M 4 #define N 3 typedef int tmas 2[M][N]; void input(tmas 2 mas, int m, int n); void print(tmas 2 mas, int m, int n); void revers(int row[], int n); #endif // MYMODUL_H_INCLUDED
Задача В одномерный массив ввести целые числа. Сформировать второй массив, поместив в него 1, если соответствующий элемент первого массива имеет четное значение, и 0, если нечетное. Применить модульное построение программы.
Строки в C 1. Объявление строки как массива символов char str[10]; Инициализация: char str[10] = ''array''; char str[10] = {'a', 'r', 'a', 'y', ' '}; char str[ ] = ''array''; 2. Объявление строки с помощью переменнойуказателя char *str 2; Инициализация: char *str 2 = ''array'';
Ввод и вывод строк char str[15]; Ввод с клавиатуры: scanf(''%s'', str); gets (str); Вывод на экран: printf(''%s'', str); puts (str); Присваивание значения: char *str 1; str 1 = str; или str 1 = ''строка'';
Функции для обработки строк Заголовочный файл: string. h 1. strlen (const char* str) — вычисляет фактическое количество символов в строке 2. strcmp (const char* str 1, const char* str 2) — сравнение строк str 1 и str 2 3. strcpy (char* str 1, const char* str 2) — копирование символов строки str 2 в строку str 1 4. strcat (char* str 1, const char* str 2) — конкатенация строк, т. е. добавление символов строки str 2 в конец строки str 1
Пример обработки строк char str 1[10] = ''работа_''; char str 2[8] = ''робот''; char str 3[100]; strcpy(str 3, str 1); strcat(str 3, str 2); strcat(str 3, ''а''); int n = strlen(str 3); printf(''Длина строки str 3 = %dn'', n); if (strcmp(str 1, str 2)>0) printf(''%s больше %sn'', str 1, str 2); if (strcmp(str 1, str 2)<0) printf(''%s меньше %sn'', str 1, str 2); if (!strcmp(str 1, str 2)) printf(''Одинаковые строкиn'');
Массивы строк Массив указателей на строки: char *strings[ ] = {''один'', ''два'', ''восемь''}; Двумерный массив символов: char array[ ][7] = {''один'', ''два'', ''восемь''};
Обработка символов в строках Заголовочный файл ctype. h isdigit( ) - распознает цифры isspace( ) - распознает пробелы isalpha( ) - распознает буквы islower( ) - распознает строчные буквы isupper( ) - распознает прописные буквы tolower( ) - преобразует прописные буквы в строчные toupper( ) - преобразует строчные буквы в прописные
Пример распознавания символов char str[30] = ''2011 год''; int n = strlen(str); for(int i=0; i
Разбиение строки на лексемы char* strtok(char* s 1, const char*s 2) s 1 — указатель на разбиваемую строку s 2 — строка, содержащая символыразделители исходной строки Возвращаемое значение при последовательных вызовах: указатель на очередную лексему. Заголовочный файл string. h
Результат работы программы
#include
Структуры 1. Объявление типа структуры 2. Объявление структурной переменной Объявление типа (Person): struct Person { char Name[30]; /*поле структуры*/ int Year; /*поле структуры*/ }; Объявление переменной (Nick): struct Person Nick;
Объявление тега структуры (синоним типа) typedef struct Person { char Name[30]; int Year; } PERSON; PERSON Ann;
Анонимный тип структуры struct { char Name[30]; int Year; } Tom; Tom — имя перемной структурного типа Выделено памяти: 30 + 4 = 34 (байта)
Инициализация структурной переменной struct Person { char Name[30]; int Year; }; struct Person Stud 1 = {''John'', 1994}; struct Person Stud 2 = {''Ann'', 1993};
Действия над структурами 1. Обращение к полю структуры через имя переменной Stud 1. Year Stud 2. Name 2. Использование в вычислениях полей структур Stud 1. Year = 1992; int Age = 2011 - Stud 1. Year; strcpy(Stud 1. Name, ''Bill''); printf(''Имя: %s возраст: %d'', Stud 1. Name, Age); 3. Обращение к полю через указатель struct Person* p. Stud = &Stud 1; printf(''%s %d'', p. Stud->Name, p. Stud->Year);
Задача Создать тип данных — структуру, содержащую 3 поля: Марка машины, Фамилия владельца, Год выпуска. Создать две структурных переменных, ввести в них данные с клавиатуры. Определить, какая из двух машин новее. Вычислить срок эксплуатации каждой машины. Результаты вывести на экран. Эту же задачу решить для структуры, имеющей в составе 5 полей: Марка машины, Фамилия владельца, Год выпуска, Месяц выпуска, Дата выпуска.
Передача в функцию структурной переменной struct Person { char Name[30]; int Year; }; void input_struct(struct Person* P); void output_struct(struct Person P); int main() { struct Person Ann; input_struct(&Ann); output_struct(Ann); return 0; } void input_struct(struct Person* P) { scanf(''%s'', P->Name); scanf(''%d'', &P->Year); } void output_struct(struct Person P) { printf(''%s %dn'', P. Name, P. Year); }
Вложенные структуры Объявления типов: struct Person { char Name[30]; Объявление переменной: struct Student Nick = {1, {''Ivanov'', 1995}}; int Year; }; struct Student { int Kurs; struct Person Stud; }; Обращение к полям структуры: printf(''%dn'', Nick. Kurs); printf(''%sn'', Nick. Stud. Name); printf(''%dn'', Nick. Stud. Year);
Массив структур struct Person { char Name[30]; int Year; }; struct Person Mas[4]; Обращение к полю структуры в массиве: Mas[i]. Year = 1996; (Mas + i)->Year = 1993;
Передача в функцию массива структур struct Person { char Name[30]; int Year; }; void input_struct(struct Person* P, int n); void output_struct(struct Person* P, int n); int main() { struct Person su 11[25]; input_struct(su 11, 25); output_struct(su 11, 25); return 0; }
void input_struct(struct Person* P, int n) { int i; for(i=0; i
Объединения union myunion /* тип данных */ { int i; double d; char mas[12]; } myvar ; /* переменная */ sizeof(myvar) <=> 12
Пример программы union tag { int i; double d; } u; int main(void) { printf("integer number: n"); scanf("%d", &u. i); printf("%d n%en", u. i, u. d); printf("double number: n"); scanf("%lf", &u. d); printf("%d n%en", u. i, u. d); return 0; }
Инициализация объединения union tag { int i; double d; } u ={1. 2}; int main(void) { printf("integer number: n"); printf("%dn", u. i); printf("%en", u. d); return 0; }