
- •Дополнительный код для представления целых чисел со знаком Числа без знака
- •Числа со знаком
- •Свойства дополнительного кода
- •Ещё два свойства дополнительного кода
- •Перенос и переполнение
- •Почему "дополнительный"
- •Знак числа в дополнительном коде
- •Число двойной точности
- •Определение
- •[Править]Аксиомы
- •[Править]Логические операции
- •[Править]Свойства логических операций
- •Имена (идентификаторы)
- •Объявления переменных
- •Операции присваивания
- •28) Разветвляющийся вычислительный процесс (if else)
- •Блок-схема алгоритма поиска корня уравнения методом половинного деления (дихотомии)
- •34,35) Операторы цикла
- •Цикл с предусловием while
- •Цикл с постусловием repeat
- •Цикл с параметром for
- •Рекомендации по использованию циклов
- •Процедуры передачи управления
- •36) " Массивы в языке с. "
- •2. Поиск минимального и максимального элементов в массиве
- •40) Индексирование
2. Поиск минимального и максимального элементов в массиве
Задача поиска минимального и максимального элементов в неупорядоченном массиве является одной из самых распространенных задач, возникающей при работе с массивами. Для ее решения используется стандартный алгоритм, состоящий из следующих шагов (для случая поиска минимального элемента):
Выбираем в качестве минимального значения первый элемент массива (min := V[1];)
Сравниваем значение переменной min со вторым элементом массива. Если оказывается, что V[2] меньше чем min, т.е. если выполняется условие (V[2]<min), тогда в качестве min берем значение V[2]. В противном случае, значение переменной min оставляем без изменения.
Циклически повторяем действия п.2 для третьего, четвертого и т.д. элементов. По завершению цикла переменная min будет содержать минимальный элемент массива.
Аналогично осуществляется поиск максимального элемента.
PROGRAM Min_Max; VAR V : array [1..5] of Integer; i, min, max : Integer; BEGIN ... ввод элементов массива V; ... min := V[1]; max := V[1]; FOR i:=2 TO 5 DO begin IF V[i] < min THEN min := V[i]; IF V[i] > max THEN max := V[i]; end; Writeln(‘min: ’, min); Writeln(‘max: ’, max) END.
40) Индексирование
Чтобы задать смысл индексов для объектов класса используется функция operator[]. Второй параметр (индекс) функции operator[] может быть любого типа. Это позволяет определять ассоциативные массивы и т.п. В качестве примера давайте перепишем пример из #2.3.10, где при написании небольшой программы для подсчета числа вхождений слов в файле применялся ассоциативный массив. Там использовалась функция. Здесь определяется надлежащий тип ассоциативного массива:
struct pair {
char* name;
int val;
};
class assoc {
pair* vec;
int max;
int free;
public:
assoc(int);
int& operator[](char*);
void print_all();
};
В assoc хранится вектор пар pair длины max. Индекс первого неиспользованного элемента вектора находится в free. Конструктор выглядит так:
assoc::assoc(int s)
{
max = (s<16) ? s : 16;
free = 0;
vec = new pair[max];
}
При реализации применяется все тот же простой и неэффективный метод поиска, что использовался в#2.3.10. Однако при переполнении assoc увеличивается:
#include
int assoc::operator[](char* p)
/*
работа с множеством пар "pair":
поиск p,
возврат ссылки на целую часть его "pair"
делает новую "pair", если p не встречалось
*/
{
register pair* pp;
for (pp=&vec[free-1]; vec<=pp; pp--)
if (strcmp(p,pp->name)==0) return pp->val;
if (free==max) { // переполнение: вектор увеличивается
pair* nvec = new pair[max*2];
for ( int i=0; iname = new char[strlen(p)+1];
strcpy(pp->name,p);
pp->val = 0; // начальное значение: 0
return pp->val;
}
Поскольку представление assoc скрыто, нам нужен способ его печати. В следующем разделе будет показано, как определить подходящий итератор, а здесь мы используем простую функцию печати:
vouid assoc::print_all()
{
for (int i = 0; i>buf) vec[buf]++;
vec.print_all();
}