Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Лабораторная работа № 4
Цель работы:
1) изучить описание массивов на языке С;
2) освоить обработку массивов с использованием вложенных циклов.
Теоретические сведения
Массив - это совокупность переменных одного типа, к которым обращаются с помощью общего имени. Доступ к отдельному элементу массива может осуществляться с помощью индекса. В С все массивы состоят из соприкасающихся участков памяти. Наименьший адрес соответствует первому элементу. Наибольший адрес соответствует последнему элементу. Массивы могут иметь одну или несколько размерностей.
Одномерный массив
Стандартный вид объявления одномерного массива следующий:
тип имя_массива [размер];
В С массивы должны определяться однозначно, чтобы компилятор мог выделить для них место в памяти. Здесь тип определяет базовый тип массива и является типом каждого элемента массива. Параметр размер определяет, сколько элементов содержит массив.
У всех массивов первый элемент имеет индекс 0.
Пример 1. Следующая программа загружает целочисленный массив числами от 0 до 9 и выводит его:
#include <stdio.h>
int main(void)
{
int x[10];
int t;
for(t=0;t<10;t++) x[t]=t;
for(t=0;t<10;t++) printf("%d ",x[t]);
return 0;
}
В С отсутствует проверка границ массивов. Можно выйти за один конец массива и записать значение в какую-либо переменную, не относящуюся к массиву, или даже в код программы. Работа по проверке границ возлагаются на программиста.
Пример 2. Ввод массива с клавиатуры.
. . .
#define M 30
. . .
int main ( )
{double x[M];
. . .
for (int i=0; i< M; i++)
{ cout << "\n x[" << i << "%d ]=";
cin >> x[i];
}
return 0;
}
Mожно организовать ввод массива, пользуясь генератором случайных чисел.
Пример 3. Ввод массива с помощью генератора случайных чисел.
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
int main( void )
{
int i;
int a[10];
/* Seed the random-number generator with current time so that
* the numbers will be different every time we run.
*/
srand( (unsigned)time( NULL ) );
for( i = 0; i < 10;i++ )
a[i]=rand() ;
return 0;
}
Для инициализации массивов формируют список начальных значений, заключенных в фигурные скобки.
Пример 4. Инициализация одномерного массива
#define M 10
. . .
main ( )
{ double x[M]= {12.2, 45.4, 67.2, 12.2, 34.6, 87.4, 83.6, 12.3, 14.8, 55.5};
. . .
}
Если начальных значений задано меньше, чем элементов в массиве, компилятор присвоит оставшимся элементам массива значение 0. Если количество начальных значений больше, чем число в квадратных скобках, компилятор выдаст сообщение об ошибке.
Точное число начальных значений можно не указывать, так как язык С позволяет задавать размер массива автоматически, используя количество элементов в соответствующем списке начальных значений. Следовательно, число в квадратных скобках при описании массива может отсутствовать. В этом случае размер массива определит компилятор, например, double x[ ]= {1,2,3};
Двумерные массивы
С позволяет создавать многомерные массивы. Простейшим видом многомерного массива является двумерный массив. Двумерный массив это массив одномерных массивов. Двумерный массив объявляется следующим образом:
тип имя_массива [размер_2] [размер_1];
Как и в одномерных массивах, каждый индекс имеет нижнюю границу, равную 0, а число элементов для каждого уровня индекса определяется при объявлении многомерного массива.
Пример 5. Объявление многомерных массивов
double matrix A [100][10];
char table [41][22][3];
int index [7][12];
Большинство компиляторов хранит элементы многомерного массива друг за другом, т.е. как длинный одномерный массив. Исполняемый модуль вычисляет, где расположен искомый элемент в этом массиве.
Однако заполнение и обработку многомерных массивов чаще всего производят пользуясь вложенными циклами.
С дает возможность инициализировать многомерный массив способом, аналогичным инициализации одномерных массивов. Для этого нужно использовать список значений, расположенных в той же последовательности, в которой элементы многомерного массива хранятся в памяти ЭВМ.
Пример 6. Инициализация матрицы
#define MAX_COL 4
#define MAX_ROW 3
. . .
int main ( )
{ double x[MAX_ROW][MAX_COL]= {{ 1, 2, 3, 4}, // строка # 1
{ 5, 6, 7, 8}, // строка # 2
{ 9,10,11,12}}; // строка # 3
. . .
return 0;
}
Пример 7. Ввод многомерных массивов с клавиатуры.
. . .
for (i=0; i<MAX_ROW; i++)
{ for (j=0; j<MAX_COL; j++)
{ cout << "x[" << i <<"][" << j<<"]";
cin >> x[i][ j]; }
}
. . .
Вывод массивов также осуществляется с помощью циклов, одиночных для одномерных массивов или вложенных для многомерных массивов.
Пример 7. Вывод матриц
. . .
for (i=0; i<MAX_ROW; i++)
{ for (j=0; j<MAX_COL; j++)
{ cout << setw(5) << x[i][ j];
}
cout << endl;
}
При обработке матриц чаще всего встречаются следующие типы задач:
При работе с матрицей в целом, в качестве объекта для сравнения выбирают элемент с индексами (0,0), затем, последовательно перебирая все элементы матрицы, выполняют необходимые действия. Перебор элементов происходит с использованием вложенных циклов.
Пример 8. Определить среднее арифметическое значение элементов матрицы x[6][7] целого типа.
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#define MAX_COL 6
#define MAX_ROW 7
int main()
{ int x[MAX_ROW][MAX_COL];
int i,j,sum=0;
float sred;
srand( (unsigned)time( NULL ) ); // Инициализация генератора случайных чисел
for(i=0; i<MAX_ROW; i++) //Заполнение массива случайными числами
for(j=0; j<MAX_COL; j++)
x[i][j]=rand()%11;
for(i=0; i<MAX_ROW; i++) // Вывод матрицы на экран
{ printf("\n");
for(j=0; j<MAX_COL; j++)
{ printf(" %6d", x[i][j]); // и вычисление суммы ее элементов
sum+=x[i][j];
}
}
sred= (float) sum/(MAX_ROW*MAX_COL);
printf("\nSumma=%d Meandr=%f\n",sum,sred);
return 0;
}
Для поиска элемента строки (столбца) объектом сравнения является первый элемент строки с индексами i,0 или столбца с индексами 0,j и обработка идет до конца строки (столбца). Обычно результатом такой обработки массива является вектор-столбец или вектор-строка.
Пример 9. Определить минимальный элемент каждой строки действительной матрицы matr[4][8].
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#define COL 4
#define ROW 8
int main()
{ int matr[ROW][COL];
int i,j;
int min[ROW];
srand( (unsigned)time( NULL ) );
for (i=0; i<ROW; i++) // заполнение и вывод матрицы
{ for (j=0; j<COL; j++) // на экран
{ matr[i][j]=rand()%101;
printf(" %3d", matr[i][j]);
}
printf("\n");
}
for (i=0; i<ROW; i++) // формирование вектора-столбца
{ min[i]=matr[i][0]; // из минимальных элементов строк
for (j=0; j< COL; j++)
if (matr[i][j]<min[i]) min[i]=matr[i][j];
printf(" %3d", min[i]);
}
printf("\n");
for (i=0; i< ROW; i++) printf("%3d ",min[i]);
printf("\n");
return 0;
}
При работе с диагональными элементами учитывают, что индексы элементов, стоящих на главной диагонали, удовлетворяют условию i = j.
Элементы, стоящие на побочной диагонали, имеют индексы, удовлетворяющие условию
i=n - j - 1,
если n - порядок матрицы (предполагается, что матрица - квадратная).
int hats [3]= {10,20,30};
int caps [ ] = {5,7,9}
Лабораторное задание
Составить программу на языке С для своего варианта задания. На экран вывести исходную матрицу и результаты вычислений. Для поиска ошибок в программе использовать встроенный отладчик ИСР.
Порядок выполнения работы
Отчет должен содержать:
1) название и цель работы;
2) краткие теоретические сведения;
3) блок-схему алгоритма;
Номер варианта |
Задание |
|
1, 16 |
Дана целочисленная матрица размера 6x9, содержащая как положительные, так и отрицательные элементы. Сформировать одномерные массивы, состоящие из сумм элементов четных строк и нечетных столбцов. Определить значения и местоположение максимального и минимального элементов матрицы, а также минимальное и максимальное ее значения по абсолютной величине. |
|
2, 17 |
m k
|
Дана целочисленная матрица 8x12. Найти сумму элементов заштрихованной области. Определить значения и местоположение максимального элемента из правой верхней четверти матрицы и минимального элемента из левой нижней четверти. Сформировать новую матрицу путем прибавления полученной суммы к каждому элементу исходной матрицы. |
3, 18 |
m m |
Дана целочисленная матрица 8x8. Найти сумму элементов заштрихованной области. Сформировать одномерный массив, содержащий минимальные элементы каждой строки. |
4, 19 |
k k |
Дана целочисленная матрица 11x11. Найти сумму элементов заштрихованной области. Сформировать одномерный массив, содержащий максимальные элементы каждого столбца. |
5, 20 |
k m |
Дана целочисленная матрица mxk. Найти минимальное значение для верхней половины матрицы и максимальное значение для нижней половины. Сформировать новую матрицу путем прибавления к каждому элементу верхней половины исходной матрицы определенного для нее минимального значения и к каждому элементу ее нижней половины определенного для нее максимального значения. |
6, 21 |
Дана целочисленная матрица mxm. Найти максимальное значение для ее первой четверти и минимальное - для третьей четверти. Сформировать одномерный массив, содержащий произведения элементов каждого столбца матрицы. |
|
7, 22 |
Дана матрица 5х7, элементами которой являются значения символьного типа. Составить одномерный массив, содержащий количество символов m в каждом из ее столбцов. Подсчитать количество символов а над третьей строкой матрицы и общее количество символов b и z под третьей строкой. |
|
8, 23 |
Дана целочисленная матрица 9x9. Определить количество нулевых элементов в заштрихованной области. Сформировать одномерный массив, содержащий количество отрицательных элементов каждого столбца матрицы. |
|
9, 24 |
Дана действительная матрица 7x7. Найти минимальное значение среди элементов, стоящих над главной диагональю, и максимальное среди элементов, находящихся ниже главной диагонали, а также их местоположение. Сформировать одномерный массив, содержащий сумму элементов четных строк и произведение элементов нечетных строк. |
|
10, 25 |
k m |
Дана действительная матрица 6x8. Найти сумму элементов каждой строки верхней половины матрицы и произведение элементов каждой строки ее нижней половины. Определить значение и местоположение максимального элемента верхней половины матрицы и минимального элемента ее нижней половины. |
11, 26 |
Дана действительная матрица 7x7. Найти сумму элементов в заштрихованной области. Сформировать новую матрицу путем прибавления полученного значения к каждому элементу из незаштрихованной области исходной матрицы. |
|
12, 27 |
Дана матрица 4х5, элементами которой являются значения символьного типа. Заменить на о значения символов, больших, чем о. Сформировать одномерный массив, содержащий количество элементов о в каждом четном столбце матрицы и количество символов, отличных от о, в каждом нечетном столбце. |
|
13, 28 |
Дана целочисленная матрица 4x7. Определить минимальное и максимальное значения матрицы и их местоположение. Найти среднее арифметическое значение положительных элементов и модулей отрицательных элементов в каждом столбце матрицы. Результаты вычислений записать в одномерные массивы. |
|
14, 29 |
Дана целочисленная матрица размером 5x5. Получить новую матрицу путем умножения всех элементов на наименьший по модулю элемент. Сформировать одномерный массив из максимальных элементов каждой строки полученной матрицы. |
|
15, 30 |
Дана вещественная квадратная матрица порядка 5. Получить новую матрицу путем прибавления к элементам каждой строки матрицы наименьшего значения элементов этой строки. Сформировать одномерный массив, содержащий количество четных элементов в четных столбцах полученной матрицы и количество нечетных элементов в нечетных столбцах. |
Приложение: Отладка приложений в ИСР Borland C++ Builder и MS Visual C++.
В ИСР Borland C++ для отладки используются следующие «горячие» клавиши:
F4 |
Run to cursor |
Выполнить до текущего места |
F5 |
Set breakpoint |
Установить точку прерывания программы |
F7 |
Trace into |
Выполнить строку программы с заходом в код вызываемых функций |
F8 |
Step over |
Выполнить строку программы без захода в код вызываемых функций |
F9 |
Run |
Выполнить |
Shift+F7 |
Trace to next source line |
Выполнить до следующей строки с исполняемым кодом |
Ctrl+Alt+L |
Show local variables |
Показать окно значений локальных переменных |
Ctrl+Alt+W |
Show watches |
Показать окно слежения за переменными |
Ctrl+Alt+B |
Show breakpoints |
Показать окно точек прерывания |
Ctlr+F2 |
Stop |
Остановка отладки |
В ИСР Visual C++ для отладки используются следующие «горячие» клавиши:
Ctrl+F10 |
Run to cursor |
Выполнить до текущего места |
F9 |
Set breakpoint |
Установить точку прерывания программы |
F11 |
Trace into |
Выполнить строку программы с заходом в код вызываемых функций |
F10 |
Step over |
Выполнить строку программы без захода в код вызываемых функций |
F5 |
Run |
Выполнить |
Ctrl+Shift+F5 |
Restart |
Выполнить с учётом изменений |
Shift+F5 |
Stop |
Остановить отладку |
При отладке следуйте следующим правилам:
Отладка приложений позволяет выявить ошибки алгоритма и ошибки программиста, которые компилятор самостоятельно выявить не может.