Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lections / lection 4.doc
Скачиваний:
10
Добавлен:
19.03.2015
Размер:
161.28 Кб
Скачать

Занятие 4

1. Массивы: определение, инициализация, обработка. Строка как массив символов.

2. Элементарные вычисления:набор задач.

3.Задачи

http://acm.uva.es/problemset: 591 (Коробка с кирпичами), 10035 (Простая арифметика), 10055 (Хашмат – смелый воин), 10071 (Назад к школьной физике), 10300 (Экологическая премия), 10302 (Суммирование полиномов), 10370 (Больше среднего), 10499 (Земля праведности), 11172 (Операторы сравнения).

1. Массивы

Массивом называется индексируемый список данных одного типа. Любой массив объявляется следующим образом:

<тип данных> <имя>[ <размер>];

где <тип данных> – тип данных элементов массива, <имя> – имя массива, <размер> – количество элементов типа <тип данных>, содержащихся в массиве <имя>.

Индексация массива в языке Си начинается с нуля. То есть первой (начальной) ячейкой является ячейка с нулевым индексом. Последней в массиве будет ячейка с индексом <размер> – 1. Например, директива

int m[5];

объявляет целочисленный массив m. Он имеет 5 целочисленных ячеек, к которым можно обращаться при помощи функции индексирования: m[0], m[1], m[2], m[3], m[4]:

m[0]

m[1]

m[2]

m[3]

m[4]

Инициализировать массив данными можно при его объявлении. Например, директива

double f[5] = {1.0,0.4,0.2,-4.55,10};

объявляет вещественный массив f из 5 элементов и заносит в его ячейки соответствующие значения:

индекс i

0

1

2

3

4

значение f[i]

1.0

0.4

0.2

-4.55

10.0

При инициализации размер массива можно не указывать, то есть следующее объявление корректно:

double f[] = {1.0,0.4,0.2,-4.55,10};

Пример 1.1. Создать массив m длины 100, занести в его i - ую ячейку значение i2 и найти сумму значений всех ячеек.

#include <stdio.h>

int m[100];

int s, i;

void main(void)

{

for(i = 0;i < 100; i++) m[i] = i*i;

for(s = i = 0; i < 100; i++) s += m[i];

printf("%d\n",s);

}

Объявляем глобальную переменную m – массив длины 100. В первом цикле for заносим в каждую ячейку значение, равное квадрату ее индекса. Во втором цикле подсчитываем сумму всех чисел в массиве.

Пример 1.2. Объявить и инициализировать данными целочисленный, символьный и вещественный массивы. При помощи цикла вывести данные объявленных массивов.

#include <stdio.h>

int i, m[] = {1,2,3,4,5};

char stroka[] = "This is a cat";

double f[] = {1.0,0.4,0.2,-4.55,10};

void main(void)

{

for(i = 0; i < 5; i++) printf("%d ",m[i]);

printf("\n%s\n",stroka);

for(i = 0; i < 5; i++) printf("%lf ",f[i]);

printf("\n");

}

Массив символов называют строками. Строки можно выводить посимвольно при помощи цикла, но такой вывод не эффективен. Для вывода строк следует воспользоваться форматом вывода “%s”.

Запомнить! Формат вывода строк имеет вид “%s”.

Пример 1.3. Массив m длины 10 содержит некоторые числа. Найти наименьший элемент в массиве m длины 100.

#include <stdio.h>

int i, min;

int m[] = {6, 88, 44, 33, 3, 56, 233, 231, 6654, 34};

void main(void)

{

min = m[0];

for(i = 1; i < 10; i++)

if (m[i] < min) min = m[i];

printf("%d\n",min);

}

В переменной min будем находить наименьший элемент массива. Присвоим изначально ей значение m[0]. Проходим по остальным элементам массива слева направо и для каждого значения m[i], меньшего min, полагаем min = m[i].

Если размер массива неизвестен на стадии компиляции, можно воспользоваться механизмом new[]/delete[].

Пример 1.4. Создание массива фиксированного размера

#include <stdio.h>

int i, s, *m;

int main(void)

{

m = new int [10];

for(i = 0; i < 10; i++) m[i] = i;

for(s = i = 0; i < 10; i++) s += m[i]; printf("%d\n",s);

delete[] m;

m = new int [5];

for(i = 0; i < 5; i++) m[i] = i*i;

for(s = i = 0; i < 5; i++) s += m[i]; printf("%d\n",s);

delete[] m;

return 0;

}

Упражнение 1.1. Имеется массив длины n. Найти его наименьший и наибольший элемент, выполнив наименьшее количество сравнений.

Упражнение 1.2 [Вальядолид, 591]. Коробка с кирпичами. Играя с кирпичами, Боб выстраивает стопки разной высоты. Алиса хочет переложить минимальное количество кирпичей так, чтобы все стопки имели одинаковую высоту.

Вход. Состоит из нескольких тестов. Первая строка каждого теста содержит количество стопок n. Во второй строке следуют n чисел – высоты стопок hi . Известно, что 1  n  50, 1  hi  100. Общее количество кирпичей всегда делится на количество стопок. Признак конца входных данных n = 0.

Выход. Для каждого теста вывести его номер и сообщение ‘The minimum number of moves is k.’, где k – минимальное количество кирпичей которое надо переложить, чтобы уравнять стопки. После каждого теста выводить пустую строку.

Пример входа

Пример выхода

6

Set #1

5 2 4 1 7 5

The minimum number of moves is 5.

0

Упражнение 1.3 [Вальядолид, 10370]. Больше среднего. В классе учится n учеников. Известны их аттестационные оценки по 100 бальной шкале (от 0 до 100 включительно). Вычислить процент учеников, имеющих бал выше среднего.

Вход. Первая строка содержит количество тестов. Каждый тест располагается в отдельной строке. Первым числом каждого теста является количество учеников в классе n (1  n  1000). Далее следуют n чисел – аттестационные оценки учеников.

Выход. Для каждого теста вывести в отдельной строке процент учеников, имеющих бал выше среднего. Ответ округлять до 3 десятичных знаков.

Пример входа

Пример выхода

5

40.000%

5 50 50 70 80 100

57.143%

7 100 95 90 80 70 60 50

33.333%

3 70 90 80

66.667%

3 70 90 81

55.556%

9 100 99 98 97 96 95 94 93 91

Соседние файлы в папке Lections