
- •1.Учебно-методический комплекс дисциплины
- •Данные о преподавателе:
- •1.2 Данные о дисциплине:
- •Выписка из учебного плана
- •1.3 Пререквизиты
- •1.4 Постреквизиты
- •1.5 Цели и задачи дисциплины
- •1.6 Перечень и виды заданий и график их выполнения
- •Виды заданий и сроки их выполнения
- •1.7 Список литературы
- •1.8 Контроль и оценка знаний.
- •1.9 Политика и процедура курса
- •2 Содержание Активного раздаточного материала
- •2,1 Тематический план курса
- •2.2 Конспект лекционных занятий
- •#Define millenium 1000
- •// Нельзя изменять
- •/* Это моя первая программа на Си*/
- •Void main()
- •Void main ()
- •Void main()
- •Void main()
- •Void main()
- •Void main()
- •Void main(void)
- •If (логическое выражение) оператор 1;
- •Void main()
- •If (логическое выражение)
- •If (условие 1 )
- •If (условие 1 )
- •If (X) printf ("Число не равно нулю");
- •Void main()
- •Void main(void)
- •Void main()
- •Void main()
- •Int n; // Количество узлов интерполяции
- •Int k; // Номер узла
- •Void main()
- •Vvedi 5 7
- •Int *a; // Указатель на массив целых чисел
- •Void main()
- •Int vect[10], s1[50];
- •Int vect [n];
- •Void main( )
- •Int min; // номер минимального элемента
- •Int random ( int n )
- •Void lin(char a)
- •Void z1(int * X, int * y)
- •Void z1(int*, int*);
- •Int имя переменной;
- •Void main()
- •8 Есть цифра
- •8 Есть буква или цифра
- •Int integ;
- •Void main()
- •Void main()
- •Void main()
- •Void main()
- •Int ocen;
- •Void main( )
- •File *указатель на файл;
- •Fclose(имя_указателя);
- •Void main()
- •Int h; /*дескриптор создаваемого файла*/
- •Void main()
- •Initgraph(&g_driver,&g_mode," ");
- •Vgamed 1 640x350
- •Vgahi 2 640x480
- •Initwindow ( 400, 300 ); // открыть окно для графики 400 на 300
- •Void main(void)
- •Int g_driver,g_mode,g_error;
- •2.3 Планы лабораторных занятий
- •Планы занятий в рамках самостоятельной работы студентов под руководством преподавателя (срсп).
- •2.5 Планы занятий в рамках самостоятельной работы студентов (срс).
- •2.6 Тестовые задания для самоконтроля с указанием ключей
- •Глоссарий
Int vect[10], s1[50];
float A[5], B[25];
В этом примере описаны два целочисленных массива: vect, содержащий 10 элементов, и S1, содержащий 50 элементов, и два массива действительных чисел A и B, содержащие 5 и 25 элементов соответственно.
При описании можно инициализировать элементы массива заданными значениями. Например:
int D[5]={23, 45, 32, 12, 88};
Для задания количества элементов в массиве удобно использовать именованные константы. Например:
const N=10, M=5;
Int vect [n];
float mas [M];
При этом корректировка программы в случае изменения размера массива сводится к минимуму: достаточно только изменить значение константы.
Для обращения к отдельному элементу массива следует указать имя массива и в квадратных скобках индекс (порядковый номер) этого элемента в массиве. При определении индекса элемента нужно помнить, что элементы в массиве нумеруются, начиная с нуля, т.е. индекс первого элемента равен 0, а индекс последнего элемента – на единицу меньше размера массива. Так, в нашем примере присваивание значений элементам может выглядеть следующим образом:
vect[0]=23;
A[0]=0.75;
S1[49]=vect[0];
В качестве индексов могут выступать переменные и произвольные выражения, тип которых должен соответствовать типу индексов в описании массива.
int i=2;
vect [i]=45;
vect [(i+1)*2]=5-i+1;
Для одномерного массива легко подсчитать, сколько байт в памяти будет занимать этот массив :
колич. байт=<размер типа элемнтов>*<количество элементов>.
В языке С под массив всегда выделяется непрерывное место в оперативной памяти. Это позволяет рассматривать массив как структуру произвольного (прямого) доступа, т.е. можно обращаться к любому элементу массива по его индексу i, не просматривая при этом предыдущие i-1 элемент. Зная порядковый номер элемента в массиве (его индекс) и тип элементов, можно легко определить адрес i-го элемента:
Адрес i =Адрес начала массива + i* длина типа элементов;
Если требуется произвести какие-либо действия с каждым элементом массива, то используют циклы. Например:
const N=10,
int A [N], i;
// заполнение массива значениями с клавиатуры
for (i=0; i<N; i++)
scanf (“%d”, &A[i]);
// вывод на экран значений элементов массива
for (i=0; i<N; i++)
printf (“%d ”, A[i]);
// обнуление элементов массива
for (i=0; i<N; i++)
A[i]=0;
В языке С не проверяется выход индекса за пределы массива. Если массив А[10] описан как целочисленный, имеющий 10 элементов, а вы в программе укажете А[20], то сообщение об ошибке не будет выдано, а в качестве значения элемента А[20] будет выдано некоторое число, занимающее соответствующие 2 байта.
Ниже приведены ряд программ по обработке одномерного массива:.
а) поиск минимального элемента одномерного массива
#include <stdio.h>
#include <conio.h>
#define N 5
Void main( )
{ int a[N];
Int min; // номер минимального элемента
int i;
printf (“ Введите в одной строке элементы массива \n”);
for ( i=0;i<N;i++)
scanf( “%i”,&a[i]);
min=0;
for ( i=0;i<n;i++)
if ( a[i]<a[min]) min=i;
printf (“Минимальный элемент массива:’’);
printf (“a[%i]=%i’’,min+1, a[min]);
getch( );
}
Результатат программы:
Введите в одной строке элементы массива
34 56 76 23 77
Минимальный элемент массива: a[4]=23
б) изменение порядка следования элементов массива на обратный
#include <stdio.h> void main() { int p,i=0; a[10]={10,11,12,13,14, 15,16,17,18,19}; while(i<10/2) { p=a[i]; a[i]=a[9-i]; a[9-i]=p; i++; } i=0; while(i<10) printf(" %d",a[i++]); }
Результатат программы:
19 18 17 16 15 14 13 12 11 10
в) поиск разности максимального и минимального элемента массива с испрользованием функции
#include <stdio.h> int fmax(int x[10],int n) { int i=0, max=x[0]; while(i<n) { if(x[i]> max) max=x[i]; i++; } return(max); } void main() { int a[10]={1,-2,3,-4,5,-6,7,-8,9,-13}; max=fmax(a,10); i=0; while(i<10) { a[i]=-a[i]; i++; } min=fmax(a,10); printf("макс-мин=%d\n",max+min); }
Результатат программы:
макс-мин=22
г)поиск наибольшего числа одинаковых идущих подряд элементов массива.
#include <stdio.h> void main() {int a[]={5,6,6,6,4,3,3,3,3,3,8}; int n=10; int i,k,max; i=k=max=1; while(i<n) { if(a[i]==a[i-1]) k++; else { if(k>max)max=k; k=1; }i++; } printf("kmax=%d\n",(k>max)?k:max); }
Результатат программы:
kmax=5
Двумерные массивы
Как мы уже отмечали, язык С допускает многомерные массивы, простейшей формой которых является двумерный массив. Двумерные массивы называют также матрицами. При описании массива первый размер определяет количество строк, а второй - количество столбцов. Можно сказать, что двумерный массив - это массив одномерных массивов.
Двумерный массив int a[3][4] можно представить в виде таблички:
a[0][0] |
a[0][1] |
a[0][2] |
a[0][3] |
a[1][0] |
a[1][1] |
a[1][2] |
a[1][3] |
a[2][0] |
a[2][1] |
a[2][2] |
a[2][3] |
Первый индекс - номер строки, второй индекс - номер столбца. Количество байт памяти, которое необходимо для хранения массива, вычисляется по формуле
Колич.байт =размер типа данных *колич. строк *колич. столбцов
В памяти компьютера массив располагается непрерывно по строкам, т. е.
а[0][0], a[0][l], a[0][2], a[0][3], а[1][0], а[1][1], а[1][2], а[2][1], ..., а[2][3].
Пример описания двумерных массивов
const N=4, M=5;
int A[N][M], B[N][N];
float X[10][5], Y[M][N];
Обращение к элементам матрицы:
A[0][3]=8; X[1][2]=0.678;
B[2][0]= A[0][3]*2;
Y[2][1]=Y[2][2]=5.5;
Для однородной обработки каждого элемента матрицы используют вложенные циклы. Например,
//заполнение матрицы с помощью датчика случайных чисел
for (int i=0; i<N; i++) //цикл по строкам
for ( int j=0; j<M ; j++) //цикл внутри строки по столбцам
A[i][j]=random (50);
// заполнение единичной матрицы:
// элементы главной диагонали равны 1,
// все остальные элементы - 0
for ( i=0; i<N; i++) //цикл по строкам
for ( j=0; j<N ; j++) цикл внутри строки по столбцам
if (i==j) B[i][j]=1; else B[i][j]=0;
//обнуление матрицы
for ( i=0; i<M; i++) //цикл по строкам
for ( j=0; j<N ; j++) //цикл внутри строки по столбцам
Y[i][j]=0.0;
//вывод матрицы на экран
for ( i=0; i<M; i++) //цикл по строкам
{ for ( j=0; j<N ; j++) //цикл внутри строки по столбцам
printf (“%5.1 “,Y[i][j] );
printf (“\n “ ); // переход на новую строку
}
Ниже приведены программаы обработки элементов матрицы.В программе определяется минимальный элемент кажой строки матрицы и выполняется обмен местами найденого и диагональю этой же строки.
#include <stdio.h> #define M 4 void main() { int i, j, jmin, amin, a[M][M] ;
printf (“ Введите элементы матрицы \n”);
for ( i=0;i<N;i++)
for ( j=0; j<N ; j++)
scanf( “%i”,& a[i][j]);
i=0; while(i<M) { amin=a[i][0]; jmin=0;j=1; while(j<m) { if(a[i][j]<amin) {amin=a[i][j]; jmin=j; } j++; } a[i][jmin]=a[i][i]; a[i][i]=amin; i++; }i=0;
printf (“ Преобразованная матрица \n”);
while(i<M) { j=0; while(j<M) printf("%3d",a[i][j++]); printf("\n"); i++; } }
Результатат программы:
Введите элементы матрицы
3 4 1 5 -1 6 7 0 1 8 7 -1 4 9 7 -1
Преобразованная матрица
1 4 3 5 6 -1 7 0 1 8 -1 7 4 9 7 -1
При работе с массивами бльшой размерности удобгл использлвать функции для работы со случайными числами.
Функции для работы со случайными числами
В языке Си существуют следующие функции для работы со случайными числами (ихописание находится в заголовочном файле stdlib.h — это значит, что его необходимо подключать в начале программы):
n = rand(); получить случайное целое число в интервале от 0 до RAND_MAX (это очень большое целое число — 32767)
srand ( m ); установить начальное значение случайной последовательности, равное m
Случайные числа в заданном интервале
Для практических задач надо получать случайные числа в заданном интервале [a,b]. Если интервал начинается с нуля (a=0), можно использовать свойство операции взятия остатка от деления: остаток от деления числа на некоторое N всегда больше или равен нуля, но меньше N, то есть находиться в интервале [0,N-1]. Можно написать такую функцию