- •3. Правила формального описания синтаксиса языка программирования
- •5. Идентификаторы языка Си
- •6. Понятие функции. Стандартная функция printf.
- •7. Стандартная функция scanf
- •8. Простейшие арифметические операции.
- •9. Операция присваивания. Оператор - выражение.
- •10. Использование в выражениях операндов разных типов. Операция преобразования типов.
- •11. Стандартные математические функции.
- •12. Простейшие функции, определяемые программистом.
- •13. Дополнительные арифметические операции. Дополнительные операции присваивания.
- •14. Побитовые операции.
- •15. Операции отношения. Операция определения размера данных.
- •16. Приоритеты операций.
- •17. Понятие о препроцессоре языка Си: директива «include», директива «define».
- •18. Основные положения структурного программирования. Понятие оператора (statement). Пустой и составной операторы.
- •19. Условный оператор и условная операция.
- •20. Оператор цикла «while». Оператор прерывания цикла. Оператор продолжения цикла. Множественный выбор. Оператор переключения.
- •21. Оператор цикла «do-while».
- •22.Перечисления. Работа с клавиатурой ibm pc
- •23. Массивы. Описание массива.
- •24. Ввод-вывод массива
- •25. Инициализация массива
- •26. Программа вычисления длины строки символов
- •32. Двумерные массивы (массивы массивов)
- •32. Адресная арифметика языка Си
- •33. Указатели и одномерные массивы
- •34. Указатели и двумерные массивы
- •35. Указатели и функции
- •36. Оператор typedef
- •39. Области видимости и глобальные данные
- •40. Время жизни переменных и классы памяти языка Си
- •41. Передача аргументов в функцию
- •42. Возврат значений из функций
- •47. Общий случай двумерного массива.
- •48. Особенности работы с массивами большого размера
- •49. Описание структуры.
- •50. Трактовка имени структуры.
- •51. Доступ к элементу структуры.
- •52. Инициализация структур.
- •53. Структуры и функции.
- •54. Поля бит в структурах.
- •55. Объединения.
- •56. Динамические данные.
- •57. Линейные списки.
- •58. Организация данных в виде стека.
- •59. Организация данных в виде очереди.
- •60. Организация данных в виде деревьев.
47. Общий случай двумерного массива.
Рассмотрим организацию т.н. рваного массива, т.е. такого, строки которого отличаются по длине.
В таком случае, каждую строку удобно хранить в отдельном динамическом массиве. Указатели на строки, объединяются вектором указателей на них.
Существуют различные техники подсчета кол-ва элементов в нем:
1)терминальные символы.
2)хранение кол-во элементов в [-1] элементов.
3)кол-во строк хранить в дескрипторе, в нем же хранится массив размеров строк и вектор указателя.
Массив представляется в виде одномерного вектора указателей на строки указатель на длины строк двумерного массива. Каждой строке выделяется соответствующий блок памяти в конструкторе. Картинку нарисовать.
48. Особенности работы с массивами большого размера
Массивами большого размера будем называть такие массивы, которые не помещаются в сегменте памяти.
Для больших двумерных массивов вариантом решения проблемы может служить предложенная в предыдущем разделе схема массива в виде вектора указателей на строки.
Следующая программа иллюстрирует использование массива размером большим максимального размера сегмента:
void far FarMalloc( unsigned long size )
{
void far *p = farmalloc(size);
if( !p )
{ printf("Недостаточно памяти!\n"); exit(1); }
return p;
}
void main(void)
{
double huge *A;
unsigned long i, maxN;
/* Выделение максимального блока памяти */
A = (double huge *) FarMalloc( maxN = farcoreleft() );
maxN /= sizeof(double);
printf("Размер массива: %lu\n", maxN);
getch();
/* Заполняем массив */
for(i = 0; i < maxN; i++) A[i] = i;
/* Печатаем часть массива.*/
for(i = 0; i < 1000; i++)
{
printf("%10.3lf ", A[i]);
if( (i + 6) % 5 == 0 ) printf("\n");
if( (i + 121) % 120 == 0 ) { getch(); clrscr(); }
}
printf("\n");
/* Освобождение памяти */
farfree(A);
}
Если в этой программе поменять атрибут huge на far, то вся адресация будет выполняться по модулю равному размеру сегмента и результат будет неверным.
49. Описание структуры.
Под структурой понимают совокупность данных разного типа, лежащих в непрерывной области памяти и объединенных общим именем.
1 способ
struct
{
char name[21];
float price;
int number;
} goods;
Выделяется 27 байт для переменной goods;
2 способ Описание пользователем тим goods. Переменные не описаны, память не выделилась.
struct _GOODS
{
char name[21]; float price; int number;
};
3способ. Можно смепшать два способа:
struct _GOODS
{
char name[21]; float price; int number;
}
goods;
4 способ. Используется оператор описания типа typedef:
typedef char string[40];
новый тип string
string a, b, c; - описание трех переменных, каждая из
которых является массивом из 40 символов.
В случае структуры имеем:
typedef struct { char name[21];
float price;
int number;} GOODS;
50. Трактовка имени структуры.
Имя структуры обозначает всю область памяти, связанную со структурой, поэтому для структур одного и того же типа допускается операция присваивания:
goods2 = goods1;
При этом вся область памяти goods1 копируется в область памяти goods2. Составные части структурв называются полями. Поля располагаются в памяти в том порядке в котором они описаны в структуре.