- •1. Простейшие программы
- •2. Переменные
- •5. Методы отладки программ
- •6. Работа в графическом режиме
- •Void Tr ( int X, int y, int c )
- •8. Функции
- •9. Структура программ
- •Void Square ( int X, int y, int a );
- •Void Kvadrat ( int X, int y, int a );
- •If ( kbhit() ) { ... }
- •11. Случайные и псевдослучайные числа
- •Int random ( int n )
- •1. Массивы
- •Int a[10], b[20]; // 2 массива на 10 и 20 целых чисел
- •Int random (int n) { return rand() % n; }
- •2. Символьные строки
- •Void strcpy1 ( char s1[], char s2[] )
- •Int n; // номерсимвола '.'
- •Intx, y;
- •3. Матрицы (двухмерные массивы)
- •Int random ( int n ) { return rand() % n; }
- •Int total, a[m][n];
- •Void SortStrings ( char *s[], int n ) // *s[] – массивуказателей
- •Int I, count;
- •5. Управление памятью
- •Int n; // размер массива (заранее неизвестен)
- •Int *a; // указатель для выделения памяти
- •IntM, n, I;
- •6. Рекурсия
- •Int Factorial ( int n )
- •Void Factorial ( int n, int &fact )
- •Int Factorial ( int n )
- •Int HowMany( char *s, char *word )
- •If ( ! p ) return 0; // ненашли – 0 слов
- •Void RecCircle ( float X, float y, float r, int n )
- •Initwindow(600, 500);
- •Void Pifagor( float X, float y, float l,
- •Void Combinations ( int a[], int n, int k, int q )
- •Void PrintData ( int Data[], int n )
- •Void Permutations ( int a[], int n, int q )
- •Int temp;
- •Void Split(int r, int a[], int q)
- •Void QuickSort ( int a[], int from, int to )
- •Int X, I, j, temp;
- •7. Структуры
- •Int year; // год издания, целое число
- •Int pages; // количество страниц, целое число
- •Int year;
- •Int pages;
- •Void Year2009( Book b )
- •Void Year2009( Book &b )
- •Void Year2009( Book *b ) // параметр – адрес структуры
- •Void SortYear ( pBook p[], int n )
- •Int year;
- •Int pages;
Void Year2009( Book &b )
{
b.year = 2009;
}
В этом случае фактически в процедуру передается адрес структуры и процедура работает с темже экземпляром, что и вызывающая программа. При этом все изменения, сделанные в процедуре, остаются в силе. Работа со структурой-параметром внутри процедуры и вызов этой процедуры из основной программы никак не отличаются от предыдущего варианта.
Передача по адресу
Передача по ссылке возможна только при использовании языка Си++ (она не входит в
стандарт языка Си). Тем не менее, в классическом Си можно передать в качестве параметраадрес структуры. При этом обращаться к полям структуры внутри процедуры надо через оператор ->.
Void Year2009( Book *b ) // параметр – адрес структуры
{
b->year = 2009; // обращение по адресу (через указатель)
}
main()
{
Book b;
Year2009 ( &b ); // передается адрес структуры
}
Сортировка по ключу
Поскольку в структуры входит много полей, возникает вопрос: а как их сортировать? Это
зависит от конкретной задачи, но существуют общие принципы, о которых мы и будем говорить.Для сортировки выбирается одно из полей структуры, оно называется ключевым полемили просто ключом. Структуры расставляются в определенном порядке по значению ключевогополя, содержимое всех остальных полей игнорируется.И еще одна проблема – при сортировке элементы массива меняются местами. Структурымогут быть достаточно больших размеров, и копирование этих структур будет занимать оченьмного времени. ПоэтомуСортировку массива структур обычно выполняют по указателям.
Мы уже использовали этот прием для сортировки массива символьных строк. В памяти формируется массив указателей p, и сначала они указывают на структуры в порядке расположенияих в массиве, то есть указатель p[i] указывает на структуру с номером i. Затем остается только расставить указатели так, чтобы ключевые поля соответствующих структур были отсортированы в заданном порядке. Для решения задачи удобно объявить новый тип данных PBook –
указатель на структуру Book.
typedef Book *PBook;
Пример ниже показывает сортировку массива структур по году выпуска книг. Основной алгоритм сортировки массива указателей заложен в процедуру SortYear, которая имеет два параметра – массив указателей и число структур. Здесь используется «метод пузырька».
Void SortYear ( pBook p[], int n )
{
int i, j;
PBook temp; // вспомогательный указатель
for ( i = 0; i < n-1; i ++ ) // сортировка
for ( j = n-2; j >= i; j -- )
if ( p[j+1]->year < p[j]->year ) // еслиуказателистоят
{ // неправильно, то...
temp = p[j]; // переставить их
p[j] = p[j+1];
p[j+1] = temp;
}
}
Основная программа, которая выводит на экран информацию о книгах в порядке их выхода,выглядит примерно так:
#include <stdio.h>
const int N = 20;
struct Book { // новый тип данных - структура
char author[40];
char title[80];
Int year;
Int pages;
};
typedef Book *PBook; // новый тип данных – указатель на структуру
// здесь надо расположить процедуру SortYear
main()
{
Book B[N]; // массив структур
PBook p[N]; // массив указателей
// здесь нужно заполнить структуры
for ( i = 0; i < N; i ++ ) // начальная расстановка указателей
p[i] = &B[i];
SortYear ( p, N ); // сортировка по указателям
for ( i = 0; i < N; i ++ ) // цикл по всем структурам
printf("%d: %s\n", // вывод через указатели
p[i]->year, p[i]->title);
}