Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Тема 1.2. Последовательности



 

Цель.

Умение обрабатывать большие последовательности данных (значений) по одному без одновременного их хранения в памяти.

 

Основные понятия.

Многократное использование переменных. Однократная обработка данных.

 

Ключевые слова.

Последовательность, цикл.

 

ПРИМЕР 1.

Дана последовательность целых чисел. Найти самое большое, самое маленькое число и сумму всех чисел. В начале последовательности задаётся количество чисел в ней.

 

Алгоритм.

Будем вводить по одному числу и сравнивать его с эталонами - наибольшим и наименьшим. Сначала в качестве обоих эталонов возьмём первое число. Все числа хранить в памяти не будем, каждое новое будет помещаться в ту же ячейку, где хранилось предыдущее.

 

Решение.

 

// C++

 

# include < iostream>

# include < cstdlib>

 

using namespace std;

 

int main () // основная часть программы – главная функция

{

setlocale (LC_ALL, " RUS" );

 

cout < < " Вычисление МАХ, MIN, SUM" < < endl;

cout < < " Введите количество и сами числа " < < endl;

 

int a, n, max, min, sum;

cin > > n;

 

cin > > max;

min = max;

sum = max;

 

for ( int i=1; i < n; i++ )

{

cin > > a;

if ( max < a ) max = a;

if ( min > a ) min = a;

sum += a;

}

cout < < " MAX = " < < max < < " MIN = " < < min < < " SUM = " < < sum < < endl;

 

system (" PAUSE" );

return 0;

}

 

// C#

 

using System;

 

class Program

{

static void Main (string [] args)

{

Console.WriteLine (" Вычисление МАХ, MIN, SUM" );

Console.WriteLine (" Введите количество и сами числа по 1 в строке" );

 

int a, n, max, min, sum;

n = int.Parse (Console.ReadLine ());

 

max = int.Parse (Console.ReadLine ());

min = max;

sum = max;

 

for ( int i=1; i < n; i++ )

{

a = int.Parse (Console.ReadLine ());

 

if ( max < a ) max = a;

if ( min > a ) min = a;

sum += a;

}

Console.WriteLine (" MAX = " + max + " MIN = " + min + " SUM = " + sum);

Console.ReadKey ();

}

}

 

ПРИМЕР 2

Та же самая задача, но программа должна проработать на серии тестов и для каждого выдать свой ответ.

 

// C++

 

# include < iostream>

# include < cstdlib>

 

using namespace std;

 

int main () // основная часть программы – главная функция

{

setlocale (LC_ALL, " RUS" );

 

cout < < " Вычисление МАХ, MIN, SUM" < < endl;

cout < < " Введите количество тестов" < < endl;

 

int t;

cin > > t;

 

for ( int tt=0; tt < t; tt+ )

{

cout < < " Введите количество и сами числа" < < endl;

 

int a, n, max, min, sum;

cin > > n;

 

cin > > max;

min = max; sum = max;

 

for ( int i=1; i < n; i++ )

{

cin > > a;

if ( max < a ) max = a;

if ( min > a ) min = a;

sum += a;

}

cout < < " MAX = " < < max < < " MIN = " < < min < < " SUM = " < < sum < < endl;

}

 

system (" PAUSE" );

return 0;

}

 

// C#

 

using System;

 

class Program

{

static void Main (string [] args)

{

Console.WriteLine (" Вычисление МАХ, MIN, SUM" );

Console.WriteLine (" Введите количество тестов" );

 

int t = int.Parse (Console.ReadLine ());

 

for ( int tt=0; tt < t; tt+ )

{

Console.WriteLine (" Введите количество и сами числа по 1 в строке" );

 

int a, n, max, min, sum;

n = int.Parse (Console.ReadLine ());

 

max = int.Parse (Console.ReadLine ());

min = max;

sum = max;

 

for ( int i=1; i < n; i++ )

{

a = int.Parse (Console.ReadLine ());

 

if ( max < a ) max = a;

if ( min > a ) min = a;

sum += a;

}

Console.WriteLine (" MAX = " + max + " MIN = " + min + " SUM = " + sum);

}

Console.ReadKey ();

}

}

 

 

Задачи для обязательного решения.

 

1.2.1.1. в последовательности из n целых чисел найти 3-ее по величине значение, т.е. если их упорядочить по возрастанию, то ответ – третье значение с конца. В первой строке задаётся количество чисел в последовательности, а во второй - сами числа.

Исходные данные:

6 9 2 4 0 7 3

Результат:

 

1.2.1.2. для последовательности из n целых чисел напечатать «ДА», если числа расположены в порядке не убывания или не возрастания (монотонная). В первой строке задаётся количество чисел в последовательности, а во второй - сами числа.

Исходные данные:

6 9 2 4 0 7 3

Результат:

НЕТ

 

1.2.1.3. для последовательности из n целых чисел напечатать «ДА», если числа образуют арифметическую прогрессию в порядке их следования и «НЕТ» в противном случае. В первой строке задаётся количество чисел в последовательности, а во второй - сами числа.

Исходные данные:

-1 1 3 5 7

Результат:

ДА

 

1.2.1.4. для последовательности из n целых чисел напечатать «ДА», если числа образуют геометрическую прогрессию и «НЕТ» в противном случае. В первой строке задаётся количество чисел в последовательности, а во второй - сами числа.

Исходные данные:

32 16 8 3 2

Результат:

НЕТ

 

1.2.1.5. для заданного числа n найти и напечатать число Фибоначчи с этим номером. Ч

Исходные данные:

Результат:

 

1.2.1.6. ПОИСК ВСЕХ ПИКОВ. В последовательности целых чисел найти номера и значения всех элементов, которые строго больше предыдущего и последующего элементов. Первое и последнее число не учитываются, т.к. у них только по одному соседу. В первой строке задаётся количество чисел в последовательности, а во второй - сами числа.

Исходные данные:

6 9 2 4 0 7 3

Результат:

 

Задачи для самостоятельного решения.

 

1.2.2.1. в последовательности из n целых чисел найти самую длинную строго возрастающую цепочку, т.е. такую цепочку элементов, что Ai < Ai+1 < Ai+2 и т.д. Напечатать длину этой цепочки. В первой строке задаётся количество чисел в последовательности, а во второй - сами числа.

Исходные данные:

1 5 1 2 3

Результат:

 

1.2.2.2. в последовательности из n целых чисел найти самую длинную пилу, т.е. такую цепочку элементов, что Ai < Ai+1 > Ai+2 и т.д. или Ai > Ai+1 < Ai+2… В первой строке задаётся количество чисел в последовательности, а во второй - сами числа.

Исходные данные:

1 5 1 2 3

Результат:

 

1.2.2.3. для заданного числа n найти ближайшее сверху число Фибоначчи (большее или равное)

Исходные данные:

Результат:

 

1.2.2.4. для заданного числа n найти ближайшее снизу число Фибоначчи (меньшее или равное)

Исходные данные:

Результат:

 

1.2.2.5. в последовательности из n целых чисел найти пару с самым большим произведением и напечатать его. В первой строке задаётся количество чисел в последовательности, а во второй - сами числа.

Исходные данные:

1 5 1 2 -3

Результат:

 

1.2.2.6. в последовательности из n целых чисел найти пару с самым большим произведением, которое делится на 21, и напечатать его. В первой строке задаётся количество чисел в последовательности, а во второй - сами числа.

Исходные данные:

1 5 14 2 3

Результат:

 

1.2.2.7. в последовательности из n целых чисел найти пару с самым большим (маленьким) произведением, но их номера в последовательности должны отличаться не менее, чем на 5. и напечатать его. В первой строке задаётся количество чисел в последовательности, а во второй - сами числа.

Исходные данные:

2 5 1 2 3 7 3 1 2

Результат:

 

1.2.2.8. в последовательности из n целых чисел найти пару с самым большим (маленьким) чётным произведением, но их номера в последовательности должны отличаться не менее, чем на 5, и напечатать это произведение. В первой строке задаётся количество чисел в последовательности, а во второй - сами числа.

 

1.2.2.9. Представить данное число n в виде суммы нескольких разных чисел Фибоначчи и напечатать их в порядке убывания (возрастания).

Исходные данные:

Результат:

13 5 1

 

1.2.2.10. В последовательности из n целых чисел найти наибольший перепад – наибольшую разность элементов в цепочке возрастающих или убывающих элементов. В первой строке задаётся количество чисел в последовательности, а во второй - сами числа.

Исходные данные:

2 5 1 2 3 7 3 2 2

Результат:

 

1.2.2.11. Требуется найти самую длинную непрерывную цепочку нулей в последовательности нулей и единиц. В единственной строке записана последовательность нулей и единиц (без пробелов). Суммарное количество цифр не превышает 1000.

Вывести искомую длину цепочки нулей.

Исходные данные:

Результат:

 

Продвинутые задачки.

 

1.2.3.1. Обобщение ряда Фибоначчи. Дана бесконечная в обе стороны последовательность вещественных чисел, которая строится по правилу ai=ai-1+ ai-2. Заданы значения двух произвольных членов этой последовательности ai и aj. Написать программу, которая по заданному числу n вычисляет элемент an. В первой строке задаются номер i и значение ai, во второй номер j и значение aj, в третьей – номер n.

Исходные данные:

Результат:

 

1.2.3.2. В последовательности цифр a1, a2,...ai,... каждый член, начиная с четвертого, равен последней цифре суммы трех предыдущих. Написать программу, которая по заданным значениям a1, a2, a3 вычисляет an, где n< =1000000000.

Исходные данные:

Результат:

 

1.2.3.3. Общее количество цифр. Для заданного натурального числа n вычислить и напечатать общее количество цифр во всех числах от 1 до n.

Исходные данные:

Результат:

 

1.2.3.4. Количество цифр. Для заданного натурального числа n вычислить и напечатать количество каждой цифры во всех числах от 1 до n: количество ноликов, единичек и т.д. до девяти.

Исходные данные:

Результат:

1 10 2 2 2 2 2 2 1 1

 

1.2.3.5. Минимальная вместимость автобуса. На автобусном маршруте имеется n остановок. На каждой остановке из автобуса сначала выходят ai человек, потом входят bi человек. Изначально автобус пустой. Определить и напечатать минимальную возможную вместимость автобуса.

Исходные данные:

 

Результат:

 

 

Тема 1.3. Массивы

 

Цель.

Изучение алгоритмов обработки большого количества данных, хранящихся одновременно в оперативной памяти.

 

Основные понятия.

Массив – упорядоченное множество однотипных элементов, занимающих смежные участки оперативной памяти. Они используются в тех случаях, когда элементы последовательности должны обрабатываться не в том порядке, в котором поступают в программу, или каждый элемент должен обрабатываться (просматриваться) несколько раз. Имя массива ассоциируется с адресом начала массива (первого элемента). Этот адрес является постоянным. Основная операция над массивами – операция доступа к элементу []. Можно использовать значение элемента и можно его изменять. Используя адреса можно обращаться к элементам массива с помощью операции * и операции адресной арифметики.

Ввод и вывод массивов осуществляется поэлементно (для символьных строк – см. ниже).

 

Ключевые слова.

Массив, индекс, элемент, счётчик, адрес, указатель, NULL, случайное число.

 

ПРИМЕР 1.

Дан массив целых чисел из N элементов. Для заданных номеров k1 и k2 (1 < = k1 < = k2 < = N) переставить элементы массива от k1-го до k2-го в обратном порядке.

 

Алгоритм.

В цикле запустим два счётчика навстречу друг другу и соответствующие элементы будем менять местами.

 

Решение.

 

// C++

 

# include < iostream>

# include < cstdlib>

 

using namespace std;

 

const int N = 10000;

 

int main () // основная часть программы – главная функция

{

setlocale (LC_ALL, " RUS" );

cout < < " Переворот части массива." < < endl;

cout < < " Введите количество, а в следующей строке числа." < < endl;

 

int a [N], n;

cin > > n;

for ( int i=0; i < n; i++ )

cin > > a [i];

 

cout < < " С какой позицию по какую: ";

 

int k1, k2;

cin > > k1 > > k2;

k1--, k2--;

 

for ( int i=k1, j=k2; i < j; i++, j-- )

swap (a [i], a [j]);

 

for ( int i=0; i < n; i++ )

cout < < a [i] < < " ";

cout < < endl;

 

system (" PAUSE" );

return 0;

}

 

 

// C#

 

using System;

 

class Program

{

static void Main (string [] args)

{

Console.WriteLine (" Переворот части массива." );

Console.WriteLine (" Введите количество, а в следующей строке числа." );

 

int n = int.Parse (Console.ReadLine ());

int [] a = new int [n];

 

string ss = Console.ReadLine (); // все числа в одной строке

string [] s = ss.Split (' '); //| через один пробел

for ( int i=0; i < n; i++ )

a [i] = int.Parse (s [i]);

 

Console.WriteLine (" С какой позицию по какую: " );

 

int k1 = int.Parse (Console.ReadLine ());

int k2 = int.Parse (Console.ReadLine ());

k1--, k2--;

 

for ( int i=k1, j=k2; i < j; i++, j-- )

{

int temp = a [i];

a [i] = a [j];

a [j] = temp;

}

 

for ( int i=0; i < n; i++ ) // печатаем числа в одну строку

Console.Write (a [i] + " " );

Console.ReadKey ();

}

}

 

ПРИМЕР 2.

Заполнить массив случайными целыми числами в диапазоне от 0 до 999 и распечатать его.

 

Решение.

 

// C++

 

# include < iostream>

# include < cstdlib>

 

using namespace std;

 

const int N = 1000;

 

int main ()

{

setlocale (LC_ALL, " RUS" );

cout < < " Заполнение массива случайными числами." < < endl;

cout < < " Введите количество элементов." < < endl;

 

int * a, n;

cin > > n;

 

a = new int [n];

 

srand (time (0));

for ( int i=0; i < n; i++ )

a [i] = rand () % N;

 

for ( int i=0; i < n; i++ )

cout < < a [i] < < " ";

cout < < endl;

 

system (" PAUSE" );

return 0;

}

 

 

// C#

 

using System;

 

class Program

{

static void Main (string [] args)

{

Console.WriteLine (" Заполнение массива случайными числами." );

Console.WriteLine (" Введите количество элементов." );

 

int n = int.Parse (Console.ReadLine ());

int [] a = new int [n];

 

// заполнение случайными числами

Random rnd = new Random(DateTime.Now.Millisecond);

//создание генератора случайных чисел и инициализация текущим временем

 

for ( int i=0; i < a.GetLength (0); i++ )

a [i] = rnd.Next ();

// GetLength(i) возращает длину массива по i-му измерению

 

for ( int i=0; i < n; i++ ) // печатаем числа в одну строку

Console.Write (a [i] + " " );

Console.ReadKey ();

}

}

 


Поделиться:



Популярное:

Последнее изменение этой страницы: 2017-03-08; Просмотров: 617; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.096 с.)
Главная | Случайная страница | Обратная связь