Поиск минимального (максимального) элемента в массиве
ВВЕДЕНИЕ
Лабораторный практикум посвящен языку Си в его базовом варианте. Для исполнения данного цикла пригодна любая операционная среда и любая система программирования Си, так как те свойства языка, которые здесь изучаются, являются ядром языка и присутствуют во всех ее реализациях. Здесь рассматривается работа в операционной системе Windows XP и системе программирования Borland C.
Описание каждой лабораторной работы начинается с разделов «Цель работы», «Краткие теоретические сведения» и «Примеры решения задач». Указанные в разделе «Краткие теоретические сведения» темы обязательно должны быть изучены по материалам лекционного курса и по литературе до начала лабораторной работы, а также должны быть разобраны все решения, приведенные в разделе «Примеры решения задач».
ЛАБОРАТОРНАЯ РАБОТА № 13
ОДНОМЕРНЫЕ МАССИВЫ
Цель работы:получение практических навыков в работе с одномерными массивами.
Краткие теоретические сведения
Массив – это конечная именованная последовательность однотипных величин. Массивы широко используются в том случае, если необходимо обработать много данных, которые пользователь вводит с клавиатуры.
Массив называется одномерным, если он состоит из одной строки и N столбцов (вектор).
Формат описания массива следующий:
тип_элементов имя [размерность];
Размерность – это количество элементов в массиве (целая положительная константа).
Например:
int array[10];
Данная запись означает, что резервируется память для 10 чисел целого типа с именем array и порядковыми номерами (индексами) от 0 до 9 включительно. В Си индексация начинается с нуля,поэтому размер массива, указанный в описании, всегда на единицу больше максимального значения индекса.
Чтобы обратиться к отдельному элементу массива, надо указать имя массива и номер элемента в массиве (индекс) в квадратных скобках. Индекс является целым числом.
array[0] – первый элемент массива, array[9] – последний элемент массива.
Элементы массива обладают всеми атрибутами заданного типа.
Существуют два варианта объявления массива:
§ неинициализированный (например, массив с четырьмя элементами целого типа можно определить как int array[4];);
§ инициализированный. Определяется следующим образом: int array[]={2, 3, 5, 7};
Ввод элементов массива
Ввод элементов одномерного массива с клавиатуры осуществляется следующим образом:
const int n=5; // количество элементов в массиве
float array[n]; // объявление массива
int i; // объявление индекса элементов
for (i=0; i<n; i++)
{ printf(“array[%d]=”, i); // печать подсказки
scanf(“%f”, &array[i]); // считывание с клавиатуры элемента
}
Заполнение массива случайными числами
Пусть требуется заполнить массив равномерно распределенными случайными числами в интервале [a,b]. Поскольку для целых и вещественных чисел способы вычисления случайного числа в заданном интервале отличаются, рассмотрим оба варианта. Здесь и далее предполагается, что в начале программы есть строчка
const int n = 10;
Описание функции-датчика случайных чисел находится в заголовочном файле stdlib.h.
Удобно также добавить в свою программу функцию random:
int random (int N) { return rand() % N; }
которая выдает случайные числа с равномерным распределением в интервале [0,N-1]. Для получения случайных чисел с равномерным распределением в интервале [a,b]надо использовать формулу
k = random ( b – a + 1 ) + a;
Для вещественных чисел формула несколько другая:
x = rand()*(b - a)/RAND_MAX + a;
Здесь константа RAND_MAX– это максимальное случайное число, которое выдает стандартная функция rand.
В приведенном ниже примере массив Aзаполняется случайными целыми числами в интервале [-5,10], а массив X– случайными вещественными числами в том же интервале.
const int n=10;
float x[n];
int i, A[n], a=-5, b=10;;
randomize(); // инициализация генератора случайных чисел
for (i=0; i<n; i++)
A[i]=random(b-a+1)+a; // каждому элементу массива
// присваивает некоторое случайное значение
for (i=0; i<n; i++)
x[i]=(float)rand()*(b-a)/RAND_MAX+a;
Если необходимо, чтобы числа были не только положительными, но и отрицательными, можно записать, например, так:
array[i]=20 – random (100);
Вывод элементов массива
1. Вывод элементов массива в одну строку экрана:
const int n=5;
float array[n];
int i;
for (i=0; i<n; i++)
printf(“%f \t”, array[i]); // \t – табуляция
Для вывода элементов массива в один столбец экрана в функции printf нужно заменить \t на \n – переход на новую строку экрана.
Операция sizeof
С помощью операции sizeof() можно определить размер памяти, которая соответствует идентификатору или типу. Операция sizeof() имеет следующий формат:
sizeof (выражение);
В качестве выражения может быть использован любой идентификатор либо имя типа. Если в качестве выражения указано имя массива, то результатом является размер всего массива (т. е. произведение числа элементов на длину типа).
printf(“%d \n”, sizeof (array));
Суммирование элементов массива
S=0;
for (i=0; i<n; i++)
S=S+a[i];
Удаление элемента из массива
Требуется удалить k-й элемент из массива A размером N. Удалить элемент, расположенный на k-м месте в массиве, можно, сдвинув весь «хвост» массива, начиная с (k+1)-го элемента, на одну позицию влево, т. е. выполняя операции Ai=Ai+1, i=k, k+1, …, N-1.
for (i=k; i<n; i++)
A[i]=A[i+1];
Включение элемента в заданную позицию массива
Перед включением элемента в k-ю позицию необходимо раздвинуть массив, т. е. передвинуть «хвост» массива вправо на одну позицию, выполняя операцию Ai+1=Ai, i= N-1, N-2, …,k. Перемещение элементов массива нужно начинать с конца. В противном случае весь «хвост» будет заполнен элементом A[k]. Далее, k-му элементу присваивается заданное значение B. Размер массива должен быть задан на 1 больше.
const N=6;
void main()
{ int A[N]={1, 2, 3, 4, 5};
int i, k=3, B=10;
clrscr();
for (i=N–2; i>=k; i--)
A[i+1]=A[i];
A[k]=B;
for (i=0; i<N; i++)
printf(“%d\t”, A[i]);
gecth(); }
В результате выполнения получится:
1 2 3 10 4 5
Перестановка элементов в массиве
Перестановка i-го и j-го элементов осуществляется с использованием вспомогательной переменной P (того же типа, что и элементы массива), в которую временно помещается один из элементов массива:
P=A[i]; A[i]=A[j]; A[j]=P;
Поиск минимального (максимального) элемента в массиве
Условно первый (с номером 0) элемент массива считается минимальным (максимальным), затем в цикле путем сравнения находим фактическое значение.
min=A[0]; // начальное значение минимума
imin=0; // начальное значение индекса
for (i=0; i<n; i++)
if (A[i]<min) { min=A[i]; imin=i; }
printf (“min=A[%d]=%d\n”, imin, A[imin]);
Если в массиве несколько элементов имеют минимальное значение, то в imin будет запоминаться индекс первого из них. Если проверять условие A[i]<=min, то – последнего.
Для поиска максимального элемента нужно в улови заменить знак < на знак >.
Примеры решения
1. Ввести массив из n целых чисел. Вычислить сумму (произведение) и количество элементов, кратных 3 и не кратных 2, или вывести сообщение «Таких значений нет».
#include <stdio.h>
#include<conio.h>
void main()
{ const int n=10;
int a[n], s=0, k=0, i;
// s=0; k=0; - начальное значение суммы и количества
/* для произведения вместо s задать
long p=1; начальное значение произведения; long, т.к. произведение быстро растет и выходит за пределы типа int (32767) */
clrscr();
puts("Vvedite massiv");
for (i=0; i<n; i++)
{ printf("a[%d]=",i+1);
scanf("%d",&a[i]);
}
for (i=0; i<n; i++)
// проверка на кратность 3 и не кратность 2 //
if (a[i]%3==0 && a[i]%2!=0) // % - остаток от деления
{ s=s+a[i]; // накапливание суммы
// p=p*a[i]; накапливание произведения
k++; // накапливание количества
}
puts("\nResult");
if (k= =0) puts("net");
else
// \t – табуляция (запрограммированное число пробелов)
printf("s=%d \t k=%d\n",s,k);
// или для произведения
// printf("p=%ld \t k=%d\n",p,k);
// %ld – формат вывода данных типа long (длинный целый)
getch();
}
Если функция getch(); не используется, то просмотреть результат можно нажатием комбинации клавиш Alt-F5.
Проверка, что элемент массива заканчивается заданной цифрой m (ввести с клавиатуры):
puts(“Vvedite zadannoe chislo m”);
scanf(“%d”,&m);
for (i=0; i<n; i++)
if (a[i] % 10 = = m) ….. /* остаток от деления на 10 равен последней цифре числа. Если этот остаток равен m, то …*/
Проверка, что элементы массива являются квадратами некоторого заданного числа P(здесь обязательно требуется подключение файла math.h в разделе #include):
puts(“Vvedite zadannoe chislo P”);
scanf(“%d ”,&P);
for (i=0; i<n; i++)
if (sqrt(a[i]) = = P) // квадратный корень из элемента массива = P
2. В одномерном массиве из n элементов найти и вывести значение и номер первого отрицательного значения или вывести сообщение об отсутствии отрицательных чисел.
При решении данной задачи может потребоваться досрочный выход из цикла (при наличии отрицательного числа), т. е. оператор break.
#include <stdio.h>
#include<conio.h>
#include <stdlib.h>
void main()
{ const int n=10;
int a[n], i;
int f=0; // флажок указывает на успешность поиска
// изначально 0, т. к. еще ничего не найдено
// заполним массив случайными числами
randomize();
for (i=0; i<n; i++)
{ a[i]=20 – random(100);
printf (“%d\t”, a[i]);
}
printf (“\n”); // перевод курсора на новую строку экрана
// начало поиска
for (i=0; i<n; i++)
if (a[i]<0)
{ f=1; //устанавливаем флажок в состояние «истина»
printf (“a[%d]=%d\n”, i, a[i]);
break;
}
if (f= =0) puts (“<0 нет”);
getch();
}
Для поиска значения и номера последнего отрицательного значения массив лучше рассматривать с конца, т. е. при поиске записать for (i=n-1; i>=0; i--)
Не нашли, что искали? Воспользуйтесь поиском по сайту:
©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.
|