- •Void main(void)
- •Void main(void)
- •Void main()
- •Void main()
- •Viod main()
- •Условные выражения
- •Void main()
- •If(Выраженне1) Выражение2;
- •If(Выражение1) Выраженпе2; else ВыражениеЗ;
- •Void main()
- •Циклические выражения
- •Void nain()
- •Void main()
- •Void main()
- •Void main()
- •Void main()
- •Void main()
- •Void main()
- •Массивы
- •Void main()
- •Void main()
- •Void main()
- •Viod main()
- •Void main()
- •Void main()
- •Void main()
- •Void main()
- •Void main()
- •Void main()
- •Адреса и указатели
- •Void main()
- •Viod main()
- •Функции
- •Void main(void)
- •Void main(void)
- •Int I; double X,step();
- •Void decart(double r, double f)
- •Void main()
- •Void decart(double r,double f,double *X,double*y)
- •Void main()
- •Void rnain()
- •Void main()
- •Void main()
- •Void main()
- •Int length;
- •Объектно-ориентированное программирование и приложения с графическим интерфейсом
- •Void main(void)
- •Int MyFunc(int, int);
- •Void NewFunc(void);
- •Void main()
- •Void FuncOut();
- •Void prob::FuncOut()
- •Void main()
- •Void main()
- •Void __fastcall tForm1::Button1Click(tObject *Sender)
- •Int pascal
- •Int nCmdShow)
- •Void __fastcall tForm1::Timer1Timer(tObject *Sender)
- •Void __fastcall tForm1::okClick(tObject *Sender)
- •Int I,step;
- •Введение в численные методы
Void main()
{
char S[]="This is string";
printf("%d",strlen(S));
}
Для операций с матрицами в математике используются переменные со многими индексами. В С для этой цели используются так называемые многомерные массивы, или массивы массивов. В принципе ограничений на количество индексов нет, но мы ограничимся рассмотрением двухмерных массивов. Описание int x[2][3]; можно рассматривать как два массива, каждый из которых есть набор трех целых чисел. Нам более привычно рассматривать такую конструкцию просто как матрицу - набор компонентов с двумя индексами:
В памяти компьютера многомерные массивы располагаются последовательно так, что в первую очередь меняется последний индекс, а в последнюю - первый. Таким образом, элементы указанного массива расположены в памяти последовательно в следующем порядке: x[0][0], x[0][1], x[0][2], x[1][0], x[1][1], х[1][2]. Работу с двухмерными массивами проиллюстрируем простой программой, которая формирует единичную матрицу и выводит ее на экран:
Void main()
{
int i.j, М[5][5];
for(i=0; i<5; i++)
for(j=0; j<5; j++) if(i==j) M[i][j]=1; else M[i][j]=0;
for(i=0; i<5; i++)
{
for(j=0; j<5; j++) printf(“%d ",M[i][j]);
printf("\n");
}
}
Как известно, в единичной матрице по главной диагонали стоят единицы, а все остальные элементы равны нулю. Два первых вложенных друг в друга цикла for позволяют перебрать все возможные комбинации индексов, а условное выражение во внутреннем цикле выполняет соответствующее присваивание. Можно предложить более элегантное, хотя и менее наглядное выражение вместо конструкции if - else. Необходимый результат дает присваивание M[i][j] = (i==j); Вторая пара вложенных циклов обеспечивает печать матрицы на экран именно в виде таблицы из пяти строк и пяти столбцов. Внешний цикл работает пять раз. Пять раз выполняется составное выражение, в котором, в свою очередь, два выражения. Первое выражение — печать значений элементов матрицы. Печать выполняется в одну строчку — печатаются пять чисел, разделенных пробелом. Затем выполняется второе выражение, а это есть переход на новую строку. Далее снова печатается пять чисел и снова производится перевод на новую строку, где, наконец, печатаются последние числа. Заметим, что в данной программе можно было бы обойтись только одной парой циклов, совместив инициализацию матрицы с ее печатью. Разделение на два этапа сделано исключительно для большей наглядности.
Адреса и указатели
Этот материал выделен автором в самостоятельный раздел, несмотря на его небольшой объем, поскольку является крайне важным для дальнейшего, теперь уже достаточно профессионального изучения языка С.
Начать следует с напоминания того факта, что все данные, необходимые для выполнения программы, такие, как переменные, константы, массивы и многое другое, включая и сам код программы, размещаются в оперативной памяти компьютера. Память представляет собой совокупность большего числа элементарных ячеек, каждая из которых имеет свой номер или, выражаясь профессионально, свой адрес. Такая минимальная адресуемая ячейка называется байтом. Байт, в свою очередь, представляет собой совокупность восьми двоичных разрядов (битов), в которых записываются 0 или 1. Мы уже говорили о том, что различные типы данных занимают различное число байтов. Так, один символ размещается в одном байте, целое типа int занимает уже два байта и так далее. После загрузки исполняемого кода программы в память каждая переменная обзаводится своим адресом, номером первого из группы занимаемых ею байтов. Адреса принято представлять в шестнадцатеричной системе счисления, и для операций с адресами в С существует специальный формат р (от английского pointer - указатель), а для размещения адресов существует специальный тип переменных - указатели. В зависимости от того, адреса каких данных помещаются в указатели, изменяются и сами типы указателей. Могут существовать указатели на символы, на целые типа int, на вещественные типа double и многие другие. Указатели в программе описываются так: Тип *Имя. При этом указатели можно объединять с описаниями других данных под общим названием типа. Например, возможно такое описание: double u=7.65,*a; Здесь описана и инициализирована вещественная переменная двойной точности u и указатель р на объект типа double, пока не инициализированный, то есть не имеющий значения. Для получения адреса объекта в С также существует специальная операция &, знак которой помещается перед именем объекта. Таким образом, &u есть адрес переменной u. Понятно, что инициализация указателя (придание ему конкретного значения) может быть сделана простым присваиванием. После выполнения выражения а=&u указатель а имеет значение адреса переменной u. Существует операция, обратная операции получения адреса. Такая операция называется разадресацией и имеет вид *Указатель. Применение такой операции позволяет получить значение, находящееся по адресу, на который указывает указатель. В нашем примере *а есть число, находящееся по адресу а. В свою очередь, а есть адрес переменной u, значение которой равно 7.65. В итоге *а - это просто число 7.65. Поскольку & и * - взаимно обратные операции, очевидно, что &*M есть М и *&N есть N, что бы ни представляли собой переменные М и N.
Может возникнуть вопрос, ответ на который не столь тривиален, как это может показаться. Вопрос простой: в каких единицах измеряется значение указателя и какова величина этих единиц. Сказать, что указатели выражаются в байтах, будет правильно, но мало. Сначала рассмотрим программу: