- •Введение
- •Блок-схема алгоритма
- •Общие требования к блок-схеме алгоритма
- •Линейные и разветвляющиеся процессы
- •Циклические процессы
- •Итерационные процессы
- •Основные понятия языка С(С++)
- •Комментарии
- •Типы данных
- •Данные целого типа
- •Данные вещественного типа
- •Модификатор const
- •Переменные перечисляемого типа
- •Константы
- •Структура программы на языке С(С++)
- •Операции и выражения
- •sizeof
- •Операция присваивания
- •Арифметические операции
- •Операции поразрядной арифметики
- •Логические операции
- •Операции отношения
- •Инкрементные и декрементные операции
- •Операция sizeof
- •Порядок выполнения операций
- •Приоритет операций
- •Преобразование типов
- •Операция приведения
- •Операция запятая
- •Ввод и вывод информации
- •Директивы препроцессора
- •Директива #include
- •Директива #define
- •Операторы языка С(С++)
- •Понятие пустого и составного операторов
- •Операторы организации цикла
- •Оператор цикла for
- •Оператор цикла while
- •Оператор цикла do … while
- •Вложенные циклы
- •Примеры программ
- •Массивы
- •Одномерные массивы
- •Примеры программ
- •Многомерные массивы (матрицы)
- •Примеры программ
- •Указатели
- •Понятие указателя
- •Описание указателей
- •Операции с указателями
- •Связь между указателями и массивами
- •Массивы указателей
- •Многоуровневые указатели
- •Примеры программ
- •Символьные строки
- •Ввод/вывод строк.
- •Функции работы со строками.
- •Примеры программ
- •Функции
- •Прототип функции.
- •Определение функции.
- •Параметры функции
- •Передача массива в функцию
- •inline функции
- •Класс памяти
- •Автоматические переменные
- •Статические переменные
- •Регистровые переменные
- •Блочная структура
- •Примеры программ
- •Указатели на функции
- •Примеры программ
- •Рекурсия
- •Примеры программ
- •Аргументы в командной строке
- •Функции с переменным числом параметров
- •Вершина стека
- •Примеры программ
- •Сортировка
- •Пузырьковая сортировка.
- •Шейкер сортировка
- •Сортировка вставкой
- •Сортировка выбором
- •Метод Шелла
- •Метод Хора
- •Структуры
- •Указатели на структуры.
- •Структуры и функции
- •Примеры программ
- •Поля бит
- •Объединения
- •Переменные с изменяемой структурой
- •Организация списков и их обработка
- •Операции со списками при связном хранении
- •Стек
- •Построение обратной польской записи
- •Односвязный линейный список, очередь
- •Двусвязный линейный список
- •Циклический список, кольцо
- •Двусвязный циклический список
- •Примеры программ
- •Деревья
- •Файлы
- •Примеры программ
- •Литература
(++him)->okl; или (him++)->okl;
Рассмотрим еще один пример объявления структуры: struct
{char * str; float f;
} *pr;
Как и выше, *pr->str есть содержимое объекта, на который ссылается str; *pr->str++ передвинет указатель pr->str после считывания объекта, на который он указывал; (*pr->str) ++ увеличит значение объекта, на который ссылается str; *pr ++->str передвинет указатель pr после получения значения, на которое указывает str.
Структуры и функции
В функцию можно наряду со стандартными типами данных передавать и
структуры. |
|
struct men |
// обьявление шаблона структуры Men |
{ char *String; |
|
int Number; |
|
int Marks[10]; |
|
}; |
|
men sum(men); |
// прототип 1 |
void sum (men*); |
// прототип 2 |
Выше приведены |
два прототипа функции. В первом описывается |
функция, в которую передается копия переменной типа структура men и которая возвратит в основную программу значение того же типа.
Второй прототип описывает функцию в которую передается указатель на структуру. В функции выполнятся преобразования структуры расположенной в памяти по указателю, который в нее передан. Поэтому функция ничего не возвращает. Этот вариант функции лучше нежели первый, он будет работать быстрее и требует меньшего количества памяти.
Существует, по крайней мере, три подхода передачи структуры функции: передавать компоненты по отдельности, передавать всю структуру целиком и передавать указатель на структуру. Каждый из отмеченных подходов имеет свои положительные и отрицательные стороны.
Передача функции компонент структуры. В общем случае, элемент структуры является переменной (массивом) некоторого типа, и может быть передан как аргумент функции. Рассмотрим следующую несложную программу, выполняющую суммирование окладов нескольких профессий, и нахождение max из них:
#include <stdio.h>
float summa(float,float *);
struct str |
|
{ char *prof[5]; |
// профессия |
float okl[5],sm; |
// оклад и сумма |
} ok= {"проф1","проф2","3","4","", 1.5,2.06,31.4,3.0,0,0};
void main(void) { float max;
int i;
for(i=0;i<5;i++) max=summa(ok.okl[i],&ok.sm); printf("max значение =%5.2f\n сумма = %5.2f",max,ok.sm);
}
float summa(float i,float *j) { static float max=0;
*j+=i; //вычисление суммы max=(max>i)?max:i; //поиск max значения return max;
}
Рассматриваемая программа состоит из двух функций: main() и summa(). Функции summa() в качестве параметров передаются один из суммируемых окладов (ok.okl[i]) и адрес элемента структуры, куда помещается сумма (&ok.sm). Функция summa() также возвращает вычисленное максимальное значение оклада.
Передача всей структуры в функцию. В этом случае выполняется передача данных всей структуры в функцию (в стек) со всеми полями, которые в нее входят (массивы, другие структуры и т. д.).
При этом никакие изменения структуры внутри функции не влияют на структуру, используемую в качестве аргумента. При использовании структуры в качестве параметра, тип аргумента должен соответствовать типу параметров. Это можно сделать определив структуру глобально, а затем использовать ее для объявления необходимых структурных переменных и параметров.
#include <stdio.h> float sr_ball(struct str ); struct str
{char prof[15]; int oc[4];
};
void main(void)
{float bl;
struct str s= {"Иванов",5,4,3,5}; bl=sr_ball(s);
printf("средний балл =%5.2f",bl);
}
float sr_ball(struct str st)
{
return (st.oc[1]+st.oc[2]+st.oc[3]+st.oc[4])/4;
}
Передача структуры через указатель будет рассмотрена позже.
Примеры программ
Пример . Среди абитуриентов, сдавших вступительные экзамены в институт, определить количество абитуриентов, проживающих в городе Минске и сдавших экзамены со средним баллом не ниже 8, распечатать их фамилии в алфавитном порядке.
#include<stdio.h> |
|
#include<conio.h> |
|
#include<stdlib.h> |
|
#include<string.h> |
|
#define n 3 |
|
void main(void) |
|
{ struct str |
|
{ char *gr; |
// город |
char fm[15]; |
//фамилия |
int oc[3]; |
|
} s[n]; |
|
int i,j,k=0; |
|
char c; |
|
clrscr();
printf("\nВведите информацию в массив структур"); for(i=0;i<n;i++) // цикл ввода структур в массив
{printf("\n введите город :"); fflush(stdin);
s[i].gr=(char *)malloc(10); //отводим память для ввода города
gets(s[i].gr); |
//ввод города |
if (!*s[i].gr) break; |
// выход по пустой строке |
printf("\n введите фамилию :"); |
|
gets(s[i].fm); |
//ввод фамилии |
printf("\n введите оценки (ф м л) :"); scanf("%d%d%d",s[i].oc,s[i].oc+1,s[i].oc+2);
}
i--; // последняя стр-ра s[i] - пустая или i==n for(c='А';c<='Я';c++)
for(j=0;j<=i;j++)
if(!strcmp(s[j].gr,"Минск") && s[j].fm[0]==c) if((s[j].oc[0]+s[j].oc[1]+s[j].oc[2])/3>=8)
{printf("\n%s",s[j].fm);
k++; // подсчет числа абитуриентов удовл. условию задачи
}
printf("\n Итого абитуриентов = %d",k);
}
Пример . вложенных структур
#include <stdio.h>
#define DL 30 // max число символов в строке char
struct name |
|
|
{ |
char fm[DL]; |
// фамилия |
|
char im; |
// имя |
}; |
char ot; |
// отчество |
|
|
|
struct inform |
|
|
{ |
name nm; |
// переменная типа на структура name |
|
char prof[DL]; |
// профессия |
|
int god; |
// год рождения |
|
float okl; |
// оклад |
};
void main(void)
{static inform mas[4]=
{"Иванов",'И','И',"конструктор",1989,15000.50, "Петров",'П','П',"оператор",1987,12350.50};
inform *him; |
|
// указатель на структуру inform |
printf("адрес mas[0]: %u |
mas[1]: %u \n",&mas[0],&mas[1]); |
|
him=mas; |
|
// him содержит адрес mas[0] |
printf("адрес mas[0]: %u |
mas[1]: %u \n",him,him+1); |
|
printf("him->okl = %.2f |
|
(*him).okl = %.2f \n",him->okl,(*him).okl); |
him++; |
// him содержит адрес следующей стр-ры mas[1] |
|
(++him)->okl++; |
// him->okl==12351.5 |
|
printf("him->okl = %.2f |
|
(*him).okl = %.2f \n",him->okl,(*him).okl); |
him--;
printf("him->nm.fm = %.20s (*him).nm.fm = %.20s \n", (him)->nm.fm,(*--him).nm.fm);
//в этом случае выполняется переход к mas[0]-----------┘
//затем вывод -------------------------------┘
}
Пример . Нахождение площади прямоугольной фигуры по 2точкам с координатами (x1,y1) и (x2,y2).
#include <stdio.h> #include <conio.h>
struct rect analiz(struct rect); // здесь наличие слова struct обязательно void swap(int n,struct rect *);
struct point |
|
|
{ |
int x; |
// структура point описывает координаты |
}; |
int y; |
// (x и y) точки на плоскости |
|
|
|
struct rect |
|
|
{ |
point p1; |
// структура rect описывает координаты |
}; |
point p2; |
// 2 угловых точек (прямоуг-ка, квадрата) |
|
|