Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Информатики и радиоэлектроники

Поиск

БЕЛОРУССКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ

ИНФОРМАТИКИ И РАДИОЭЛЕКТРОНИКИ

А.М. Ковальчук

Ю.А. Луцик

ЛАБОРАТОРНЫЙ

ПРАКТИКУМ

В 2-х частях

Часть 1

 

 

Минск – 2007

Министерство образования Республики Беларусь

Учреждение образования

Белорусский государственный университет

информатики и радиоэлектроники

 

А.М. Ковальчук, Ю.А. Луцик

 

ЛАБОРАТОРНЫЙ ПРАКТИКУМ

по дисциплине «Основы алгоритмизации и программирования»

для студентов специальности

I-40 02 01 «Вычислительные машины, системы и сети»

 

В 2-х частях

 

Часть 1

 

Минск 2007

 

УДК

ББК

 

 

Ковальчук, А.М., Луцик, Ю.А.

Лабораторный практикум по дисциплине «Основы алгоритмизации и программирования» для студентов специальности I-40 02 01 «Вычислительные машины, системы и сети»: в 2ч.

Ч.1/А.М. Ковальчук, Ю.А. Луцик. – Мн.:БГУИР,2007. –

ISBN

 

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

Введение

 

Курс "Основы алгоритмизации и программирования" (ОАиП) занимает важное место в учебном процессе по подготовке инженера-системотехника.

Методические указания составлены на основе программы дисциплины "ОАиП" для высших учебных заведений по специальности 40 02 01 "Вычислительные машины, системы и сети".

В результате выполнения лабораторных работ по курсу студенты должны получить знания по теоретическим основам алгоритмизации задач и проектирования программ, создания программ на алгоритмических языке С(С++), научиться отлаживать и выполнять на ЭВМ конкретные задачи с использованием современных методов программирования.

В процессе выполнения лабораторных работ студенты изучают некоторые стандартные алгоритмы решения задач, а также разрабатывают на их основе новые алгоритмы. Графически разрабатываемые алгоритмы изображаются в виде блок-схем для построения, которых студенты знакомятся со стандартами. Разрабатываемые алгоритмы, реализуются на языке С. Для этого студенты используют знания, получаемые в теоретическом курсе.

Основные вопросы, рассматриваемые при выполнении лабораторных работ: организация ввода/вывода информации, операции и операторы языка, структурированные типы данных, массивы, указатели и операции над указателями, строковые данные, функции.

Материал рассматриваемый на лабораторных работах является основой для изучения дисциплин: "Конструирование программ и языки программирования", "Объектно-ориентированное программирование" и др.

 

Лабораторная работа №1

 

Построение блок-схем алгоритмов вычислительных процессов

 

Цель работы: Изучить принципы построения блок-схем алгоритмов линейных, разветвляющихся, циклических и итерационных вычислительных процессов.

Краткие теоретические сведения

 

Линейный вычислительный процесс

Вычислительный процесс называется линейным, если направление его продолжения на любом этапе вычислений является единственным. Линейный процесс можно представить в виде следующих этапов: первый – задание исходных данных; второй – реализация вычислений; третий – вывод результатов. Правила построения блок-схем алгоритмов приводятся в ГОСТ

19-002-80 и ГОСТ 19-003-80. Согласно этим ГОСТ, все размеры фигур связаны с двумя величинами: a и b, где a – величина, кратная 5, а b вычисляется по формуле b=1,5a, допускается b=2a. В январе 1992 года введен новый ГОСТ 19-701-90. Он описывает, как и где следует использовать фигуры. Схемы алгоритмов состоят из имеющих заданное значение символов, краткого пояснительного текста и соединяющих линий.

Описание символов

Начальные значения переменных можно задать несколькими способами. Первый способ: исходные данные переменным задаются с помощью оператора присваивания. Второй способ: исходные данные переменным задаются путем ввода их из внешних устройств. На третьем этапе необходимо предусмотреть вывод результатов на удобный для чтения носитель информации.

Пример: Составить блок-схему вычисления значения функции

при следующих значениях переменных: x=0.1; a=2; b=2.5; c=3.

Блок-схема алгоритма приведена на рис.1.

Ошибка! Ошибка связи.

 

Рисунок 1. Блок-схема линейного вычислительного процесса

Разветвляющимся называют вычислительный процесс, который в зависимости от исходных данных и результатов промежуточных вычислений осуществляется по одному из нескольких возможных вариантов. Варианты (направление вычислений), по которым может реализовываться вычислительный процесс, называют ветвями. Выбор ветви для продолжения вычислений зависит от результатов проверки некоторого условия. Если условие выполняется, то выбирается одна ветвь, если не выполняется, то другая ветвь (рис.2).

Рисунок 2. Выбор ветви выполнения вычислительного процесса

Условие, определяющее выбор той или иной ветви вычислений, может быть сложным, т.е. состоять из нескольких простых условий (рис.3).

 

Пример. Составить блок-схему алгоритма нахождения корней квадратного уравнения. Коэффициенты уравнения ввести из клавиатуры (рис.4).

 

 

 

Рисунок 4. Блок-схема алгоритма вычисления корней квадратного уравнения

 

Порядок выполнения работы

1. Изучить краткие теоретические сведения.

2. Составить блок-схему алгоритма.

 

Варианты заданий

Составить блок-схемы следующих вычислительных процессов:

1. Вычислить значение функции

 

2. Вычислить

3. Дан массив из 10 элементов. Сформировать массив, поменяв местами элементы, стоящие на четных и нечетных местах:

а) сформировать массив на месте исходного массива;

б) сформировать новый массив.

 

4. Дан массив из 10 элементов. Сформировать массив, у которого первым элементом будет последний элемент исходного массива. Вторым – предпоследний и т.д. (т.е. расположить элементы массива в обратном порядке):

а) сформировать массив на месте исходного массива;

б) сформировать новый массив.

 

5. Дан двухмерный массив А(6,9). Найти сумму элементов каждой строки.

 

6. Умножить матрицу А(4,5) на вектор В(5). Результат произведения

сохранить в новой матрице А1.

 

7. Дана матрица А(6,9). Найти сумму элементов каждой строки. Результат сохранить в массиве В.

8. Вычислить функцию по формуле для x от 0.2 до

1.5 с шагом 0.01. Если знаменатель меньше 0.0001 по абсолютному значению, то положить Y=105.

 

9. Дан массив С(20). Вычислить

; ; и , т.е. .

 

10. Дан массив Х(20). Вычислить

и

где , т.е. максимальный элемент массива Х.

 

Лабораторная работа №2

Теоретические сведения

Элементы программы

Составными элементами программы являются лексемы, которые в свою очередь, состоят из символов, относящихся к базовому словарю, распознаваемому компилятором. Множество используемых символов включает в себя следующие:

строчные символы - a-z, прописные символы - A-Z, цифры - 0-9 и

символы +, =, -, _, (,), *,;, %, #, &,!, ”, ’, \, [, ], {, }, ~, ^.

Различают пять разновидностей лексем: ключевые слова, идентификаторы, константы, операторы и пунктуация.

Ключевые слова строго зарезервированы и имеют фиксированный смысл. Они используются для объявления типов (такие как int, char, float и др.), для синтаксических операторов (такие как do, for, if и др.) и другие.

Идентификатор (или имя переменной, функции и др.) – это последовательность букв, цифр и подчеркиваний. Идентификатор не может начинаться с цифры. Прописные и строчные буквы обрабатываются как различные символы.

Литералы – это постоянные значения, такие как 1 или 3.14519. Все встроенные типы данных С имеют такие литералы, как символы, целые числа, числа с плавающей точкой и указатели. Допускаются также строковые константы. Например:

5 – целочисленная константа;

5u – u или U определяет unsigned;

5l - l или L определяет long;

05 – восьмеричная;

0x5 – шестнадцатеричная;

5.0 – с плавающей точкой;

‘5’ – символьная константа;

“5” – строковая константа, состоящая из ‘5’ и ‘\0’.

 

Простые типы

В С имеются следующие простые встроенные типы: double, int и char. Простые типы в С могут быть модифицированы с помощью ключевых слов short, long, signed, unsigned.

Простые типы данных

 

char signed char unsigned char

short int long

unsigned short unsigned unsigned long

float double long double

 

Диапазоны целочисленных значений, представленных в вашей системе, определены в стандартном файле limits.h. Диапазон значений чисел с плавающей запятой находятся в стандартном файле float.h.

 

Инициализация

Объявление переменной связывает тип с ее именем. Большинство объявлений переменной являются так же определениями. Определение переменной распределяет под нее память. Переменная может быть проинициализирована следующим образом:

double radius = 5.5; // объявлено, определено и инициализировано

double a; // объявлено и определено, но не проинициализировано

Инициализация может включать произвольное выражение при условии, что все переменные и функции, используемые в выражении, определены. Нельзя ссылаться на неинициализированную переменную. С позволяет многократное присвоение в одном операторе.

y=z=3.5; // эквивалентно z=3.5; y=3.5;

a=b+(c=3); // эквивалентно с=3; a=b+c;

a+=b; // a=a+b;

a*=a+b; // a=a*(a+b);

 

С поддерживает операторы инкрементации ++ и декрементации -- в префиксной и постфиксной формах.

++i; // префиксная форма записи

--i;

i++; // постфиксная форма записи

i--;

 

Преобразование типов

 

Если выражение имеет смешанный тип операндов, то согласно иерархии типов

int < unsigned < long < unsigned long < float < double

преобразуется к значению, совместимому с левосторонней переменной.

 

Функции ввода/вывода

Функция scanf

Функция scanf выполняет форматированный ввод данных из входного потока. В общем виде формат функции scanf следующий:

scanf(“формат ввода переменных”,адреса переменных, которым присваиваются значения);

Типы некоторых форматов вводимых переменных следующие:

%d - целое десятичное число;

%c - отдельный символ;

%s - символьная строка;

%f - число с плавающей запятой в записи с фиксированной десятичной точкой;

%e - значение со знаком в формате;

%p - значение указателя, т.е. адрес.

Функция scanf возвращает число правильно считанных полей.

Пример: ввод числа.

void main()

{

int a,b;

int n;

printf(“\nВведите два целых числа a и b\n”);

n=scanf(%d%d”,&a,&b);

if(n!=2)

{

printf(“\nДанные введены неверно\n”);

return;

}

}

Функция gets считывает символьную строку из стандартного входного потока и размещает ее по адресу, заданному указателем. Прототип функции

char * gets(char *str); Чтение строки заканчивается, когда функция встречает символ ‘\n’. Данный символ заменяется ‘\0’.

Функция getchar считывает символ из стандартного входного потока. Прототип функции: int getchar(void);

Функция printf выводит форматированные данные в поток. Общий формат функции printf можно записать в следующем виде

printf(“форматы вывода данных”,имена переменных, значения которых необходимо вывести);

Форматы вывода данных используются такие же, как и для функции scanf.

Пример использования функции scanf и printf.

void main()

{

int a,b,c;

printf(“\nВведите два целых числа\n”);

c=scanf(“%d%d”,&a,&b);

if(c!=2)

{

printf(“Данные введены неверно\n”);

return;

}

printf(“Значение а=%3d, b=%3d\n”,a,b);

}

 

Операторы if и if_else

Обобщенная форма оператора if имеет вид

if(выражение)

оператор

если значение “выражение” отлично от нуля (true), то оператор выполняется, если равно нулю – оператор пропускается. Выражение в операторе if – это сравнение, равенство или логическое выражение.

Оператор if_else имеет форму:

if(выражение)

оператор1

else

оператор2

если выражение отлично от нуля, то выполняется оператор1, а оператор2 пропускается, если выражение равно нулю, то пропускается оператор1 и выполняется оператор2.

if(x<y)

min=x;

else

min=y;

printf(“\nmin=%3d”, min);

Структура простой программы

Любая программа на языке С состоит из одной или более функций. Функциям можно давать любые имена, но среди них есть одна головная функция, имя которой main. Выполнение программы всегда начинается с этой функции. Для выполнения определенных действий функция main() обычно обращается к другим функциям, часть из которых находится в той же самой программе, а часть – в библиотеках, содержащих ранее написанные функции.

Приведем структуру программы на языке С, в которой функция main() обращается к другой функции – prog(), которой не передаются параметры и она ничего не возвращает.

#include<stdio.h>

void main(void) // тело функции main

{

void prog(void); // прототип функции prog

int a=10; // определение данных

int b=13;

int c;

c=a*b; // вычисления

printf(“\n a+b=%4d”,c); // вывод результата

prog(); // вызов функции prog на выполнение

}

void prog(void) // тело функции prog

{

printf(“\n Выполняется функция prog”);

}

Исходная программа состоит из следующих объектов: директив, указаний компилятору, объявлений и определений. Директивы задают действия препроцессора по преобразованию текста программы перед компиляцией. Указания компилятору – это команды, выполняемые компилятором во время компиляции. Объявления задают имена и атрибуты переменных, функций и типов, используемых в программе. Определения – это объявления, определяющие переменные и функции. Определение переменной в дополнение к ее имени и типу задает начальное значение объявленной переменной.

 

Порядок выполнения работы

1. Изучить краткие теоретические сведения.

2. Составить блок-схему алгоритма.

3. По разработанной блок-схеме алгоритма написать программу.

4. Отладить и выполнить программу.

 

Варианты заданий

1. Даны натуральные числа n, p, целые числа a1,…,an. Получить

произведение членов последовательности a1,…,an кратных p.

2. Даны действительные числа a, b, c. Удвоить эти числа, если , и заменить их абсолютными значениями, если это не так.

3. Даны натуральное число n, целые числа a1,…,an. Найти количество и сумму тех членов данной последовательности, которые делятся на 5 и не делятся на 7.

4. Вычислить значение переменной t при следующем условии: при выполнении условия x-y < 0, то , в противном случае, если , то вычислить значение переменной t по формуле , в противном случае .

.

5. Вычислить значение переменной

,

,

.

.

6. Даны действительные числа a, b, c. Удвоить эти числа, если a >= b >= c, и заменить их абсолютными значениями, если это не так.

7. Вычислить функцию

 

8. Вычислить функцию

9. Вычислить значение функции

Значение x ввести.

10. Вычислить значение функции

11. Вычислить значение

 

Лабораторная работа №3

Теоретические сведения

Оператор while

Обобщенная форма оператора while:

while(выражение)

оператор

Вначале вычисляется выражение. Если результат отличен от нуля, тогда выполняется оператор и управление переходит обратно к началу цикла while. Это приводит к выполнению тела цикла while, а именно оператора, который будет выполняться до тех пор, пока выражение не станет равным нулю. Пример:

int i=1, sum=0;

while(i<=10)

{

sum+=i;

++i;

}

Оператор for

Оператор for – итерационный оператор, обычно используемый с переменной, которая увеличивается или уменьшается. Конструкция оператора for следующая:

for(выражение1; выражение2; выражение3)

оператор

Сначала вычисляется выражение1. Обычно выражение1 инициализирует переменную, используемую в цикле. Это выражение вычисляется только один раз. Затем вычисляется выражение2. Если оно отлично от нуля, то выполняется оператор, обрабатывается выражение3, проверяется выражение2 и т.д., пока выражение2 не станет равным нулю. В операторе for могут отсутствовать любое, либо все выражения, но должны оставаться точки с запятой. Пример:

int i, sum=0;

for(i=0; i<=10; i++) // вычисление суммы 10 чисел

sum+=i;

 

for(i=1, sum=0;; sum+=i++); // бесконечный цикл

for(;;);

 

 

Оператор do_while

 

Конструкция оператора do_while следующая:

do

оператор

while(выражение);

Сначала выполняется оператор, затем вычисляется выражение. Если его результат отличен от нуля, то управление переходит обратно к началу оператора do. Например: суммировать положительные числа.

int i=0, sum=0;

do

{

sum+=i;

scanf(“%d”,&i);

} while(i>0);

 

 

Оператор switch

 

В программе часто необходимо в зависимости от того или иного результата реализовать одну либо другую группу инструкций. Оператор switch позволяет выбрать одну из нескольких альтернатив. Он записывается в следующем формальном виде:

switch(целое выражение)

{

case метка1: вариант 1; break;

case метка2: вариант 2; break;

...

case метка n: вариант n; break;

default: вариант n+1; break;

}

Порядок работы оператора switch следующий:

1. Вычисляется выражение в круглых скобках, стоящих за switch.

2. Выполняется метка case, совпадающая с тем значением, которое было

найдено на этапе 1; если ни одна из case не соответствуют этому значению, выполняется метка default; если метки default нет, switch прерывается.

3. Выполнение switch прерывается, когда встречается инструкция break или

когда достигается конец switch.

 

Оператор break

 

Оператор break используется в операторах цикла for, while, do_while и в операторе switch. Оператор break вызывает выход из самого глубоко вложенного цикла или оператора switch. Например:

// выход из цикла по отрицательному значению

int i;

float x;

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

{

printf(“\nВведите число\n”);

scanf(“%f”,&x);

if(x< 0.0)

{

printf(“\nЧисло отрицательное\n”);

break; //выход из цикла по отрицательному значению

}

}

 

Оператор continue

Оператор continue заставляет прекратить текущую итерацию цикла и начать следующую.

// вычисление суммы положительных чисел

int i;

float x, sum=0;

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

{

printf(“\nВведите число\n”);

scanf(“%f”,&x);

if(x< 0.0) continue;

sum+=x;

}

 

Порядок выполнения работы

1. Изучить краткие теоретические сведения.

2. Составить блок-схему алгоритма.

3. По разработанной блок-схеме алгоритма написать программу.

4. Отладить и выполнить программу.

 

Варианты заданий

1. Даны натуральное число n и целые числа a1,…an . Вычислить количество и сумму тех членов данной последовательности, которые делятся на 5 и не делятся на 7.

2. Используя оператор цикла, написать программу, в которой вычисляется наибольшее положительное целое число n, удовлетворяющее условию: . Значение переменной n вывести на печать.

3. Даны натуральное число n и целые числа a1,…an . Вычислить количество и сумму положительных, отрицательных и равных нулю членов данной последовательности.

4. Получить все шестизначные счастливые номера. Про целое число n, удовлетворяющее условию 0 <= n <= 999999, говорят, что оно представляет собой счастливый номер, если сумма трех его первых цифр равна сумме трех его последних цифр; если в числе меньше шести цифр, то недостающие начальные цифры считаются нулями.

5. Дано натуральное число n (n <= 99). Получить все способы выплаты суммы с помощью монет достоинством 1, 5, 10 и 20 коп.

6. Дано натуральное число n. Как наименьшим количеством монет можно выплатить n копеек? Предполагается, что в достаточно большом количестве имеются монеты в 1, 2, 3, 5, 10, 15, 20 и 50 коп.

7. День Учителя ежегодно отмечается в первое воскресенье октября. Дано натуральное число n, означающее номер года. Определить число, на которое в октябре указанного года приходится День Учителя.

8. Рассмотрим некоторое натуральное n (n > 1). Если оно четно, то разделим его на 2, иначе умножим на 3 и прибавим 1. Если полученное число не равно 1, то повторяется тоже действие и т.д., пока не получится 1. До настоящего времени неизвестно, завершается ли этот процесс для любого n > 1. Даны натуральные числа k, n, m (1 < k <n). Поверить, верно ли, что для любого натурального n из диапазона от k до n процесс завершается не позднее, чем после m таких действий.

9. Написать программу, которая выдает все способы представления числа n в виде суммы n=b1 + … +bk, где k, b1,…,bk > 0.

10. Даны натуральные числа a, b, c и a1, b1, c1, где a, a1 – означают день, b, b1 – месяц, c, c1 – год. Вычислить количество дней прошедших между двумя датами и количество полных лет.

 

 

Лабораторная работа №4

Теоретические сведения

 

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

int temp[20];

Квадратные скобки ([]) говоря о том, что temp – имя массива, а число, заключенное в скобки, указывает количество элементов массива. Нумерация элементов массива начинается с нуля, поэтому temp[0] является первым, а temp[19] последним элементом массива. Отдельный элемент массива определяется при помощи его номера или индекса. Элементы массива размещаются в памяти последовательно, друг за другом. Имя массива является указателем на первый элемент массива.

 

float mas[10]; // массив mas содержит 10 элементов типа float

int mas1[20]; // массив mas1 содержит 20 элементов типа int

int n=5;

int mm[n]; // ошибка, переменная не может задавать размер массива

При объявлении массивы можно инициализировать. Для этого при объявлении указывается список начальных значений элементов, заключенных в фигурные скобки:

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

Количество элементов в фигурных скобках не должно превышать размерность массива. Инициализировать можно не все элементы, а любое количество первых элементов:

int mas[10]={1,2,3,4,5,6};

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

Инициализировать массив можно следующим образом:

int mas[]={11,22,33,44,55}; // массив из пяти элементов

В этом случае число элементов массива определяется по списку инициализации.

Пример: Ввести массив чисел и вычислить сумму положительных значений

#include<stdio.h>

#include<conio.h>

#define N 100

void main(void)

{

int mas[N]; // массив чисел

int summa=0; // сумма положительных значений

int n; // количество чисел

int i;

printf(“\nВведите количество чисел не более %3d”,N-1);

scanf(“%d”,&n);

printf(“\nВведите %3d элементов массива”,n);

for(i=0; i < n; i++) // цикл по элементам массива

scanf(“%d”, &mas[i]); // ввод i-го элемента массива

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

{

if(mas[i]>0) // если i-ый элемент массива положительный

summa+=mas[i]; // суммируются положительные элементы

}

printf(“\n сумма положительных значений равна %3d”,summa);

}

 

Порядок выполнения работы

1. Изучить краткие теоретические сведения.

2. Составить блок-схему алгоритма.

3. По разработанной блок-схеме алгоритма написать программу.

4. Отладить и выполнить программу.

 

Варианты заданий

 

1. Дано натуральное n (n >= 2). Найти все меньшие n простые числа используя решето Эратосфена. Решетом Эратосфена называют следующий способ. Выпишем подряд все целые числа от 2 до n. Первое простое число 2. Подчеркнем его, а все большие числа, кратные 2, зачеркнем. Первое из оставшихся чисел 3. Подчеркнем его как простое, а все большие числа, кратные 3, зачеркнем. Первое число из оставшихся теперь 5, так как 4 уже зачеркнуто. Подчеркнем его как простое, а все большие числа, кратные 5, зачеркнем и т.д.

2. Пусть дан массив a1,…,an. Требуется переставить a1,…,an так, чтобы вначале в массиве шла группа элементов, больших того элемента, который в исходном массиве располагался на первом месте, затем – сам этот элемент, потом – группа элементов, меньших или равных ему.

3. Пусть по некоторому каналу связи передается сообщение, имеющее вид последовательности нулей и единиц. Из-за помех возможен ошибочный прием некоторых сигналов: нуль может быть воспринят как единица и наоборот. Можно передавать каждый сигнал трижды, заменяя, например, последовательность 1,0,1 последовательностью 1,1,1, 0,0,0, 1,1,1. Три последовательные цифры при расшифровке заменяются той цифрой, которая встречается среди них по крайней мере дважды. Такое утраивание сигналов существенно повышает вероятность правильного приема сообщения. Написать программу расшифровки.

4. Задан массив положительных чисел a1,…,an. Для каждого a[i] среди элементов массива следующих по порядку за a[i] и больших чем a[i], выберем элемент с наименьшим номером j и заменим значение a[i] на a[j]. Если такого элемента a[j] не найдется, то заменим значение a[i] нулем. Распечатать получившийся массив.

Пояснение. Например, массив 2,9,8,5,9,3,4,5,2 после замены станет таким

9,0,9,9,0,4,5,0,0.

5. Дан массив a1,…,an. Исключить из него пять минимальных элементов, сдвинув оставшиеся элементы к левому краю.

6. Даны два целочисленных массива a1,…,an и b1,…,bn. Вывести на печать все пары индексов, для которых a[i]* b[i] > 10. Подсчитать число пар и сумму этих произведений.

7. Дан одномерный массив a1,…,an. Найти и напечатать номер элемента, произведение которого с предыдущим максимально.

8. Рассортировать одномерный массив по возрастанию (убыванию) элементов (метод Шелла).

9. Рассортировать одномерный массив по возрастанию (убыванию) элементов (метод пузырька).

10. В одномерном массиве a1,…,an заменить отрицательные элементы нулями, подсчитать число замен m, вычислить m!.

 

Лабораторная работа №5

Теоретические сведения

Двухмерный массив – это массив массивов, т.е. массив, элементами которого являются массивы.

Двухмерный массив объявляется следующим образом:

int mas[4][5];

Число в первых квадратных скобках указывает количество строк массива, а число во вторых квадратных скобках указывает количество столбцов массива. Для доступа к элементу двухмерного массива необходимо указать все его индексы:

rez= mas[1][2]; //переменной rez присваивается значение третьего элемента второй строки.

Элементы многомерных массивов располагаются в памяти компьютера построчно. Многомерные массивы можно инициализировать. Например:

int mas[3][3]={1,2,3,

4,5,6,

7,8,9};

Если необходимо проинициализировать не все элементы строки, то в списке инициализации можно использовать фигурные скобки, охватывающие значения для этой строки. Например:

int mas[3][3]={{1},

{2,3},

{4,5,6}

};

Пример программы: отсортировать главную диагональ двухмерного массива по возрастанию

#include<stdio.h>

#include<conio.h>

#include N 4

int main()

{

int i,j;

int temp;

int mas[N][N]; // двухмерный массив

printf(“\nВведите элементы массива\n”);

for(i=0; i < N; i++) // цикл по строкам массива

for(j=0; j < N; j++) // цикл по столбцам массива

scanf(“%d”,&mas[i][j]); // ввод элемента массива

printf(“\nИсходный массив\n”);

for(i=0; i < N; i++)

{

printf(“\n”);

for(j=0; j < N; j++)

printf(“%4d”, mas[i][j]);

}

for(j=N-1; j > 0; j--)

for(i=0; i< j; i++)

if(mas[i][i] > mas[i+1][i+1}

{

temp=mas[i][i];

mas[i][i]=mas[i+1][i+1];

mas[i+1][i+1]=temp;

}

printf(“\nРезультат\n”);

for(i=0; i < N; i++)

{

printf(“\n”);

for(j=0; j < N; j++)

printf(“%4d”, mas[i][j]);

}

 

}

В приведенном примере имя массива является постоянным указателем, этот указатель в программе изменить нельзя.

Порядок выполнения работы

1. Изучить краткие теоретические сведения.

2. Составить блок-схему алгоритма.

3. По разработанной блок-схеме алгоритма написать программу. Размеры

массивов брать как константу.

4. Отладить и выполнить программу.

 

Варианты заданий

1. Даны действительные числа a1,…,an. Получить квадратную матрицу порядка n следующего вида:

a1 a2 a3 … an-2 an-1 an

a2 a3 a4 … an-1 an a1

a3 a4 a5 … an a1 a2

......................

an a1 a2 … an-3 an-2 an-1

2. Дана действительная квадратная матрица порядка n. Найти наибольшее из значений элементов, расположенных в заштрихованной части матрицы.

 

3. Дан двухмерный массив А размером n*m. Определить количество положительных, отрицательных и равных нулю элементов матрицы А.

4. Написать программу сортировки i-ой строки матрицы ММ методом «пузырька». Исходную и преобразованную матрицу вывести на печать.

5. Отсортировать строки массива А размером n*m по убыванию.

6. В двухмерном массиве определить сумму элементов, имеющих нечетные значения и стоящих на четных местах.

7. В матрице целых чисел определить максимальный элемент на главной диагонали, и есть ли такой элемент ниже главной диагонали, если есть, то определить его координаты.

8. В двухмерном массиве определить количество элементов, кратных минимальному элементу массива.

9. Дана действительная квадратная матрица порядка 2n. Получить новую квадратную матрицу, переставляя ее блоки размера n*n следующим образом:

 

10. Дана квадратная матрица порядка n. Выполнить транспонирование матрицы относительно главной диагонали. Вывести на экран исходную и транспонированную матрицу.

 

 

Лабораторная работа №6

Порядок выполнения работы

1. Изучить краткие теоретические сведения.

2. Составить блок-схему алгоритма.

3. По разработанной блок-схеме алгоритма написать программу. Память под

двухмерный массив необходимо выделять как для одномерного.

4. Отладить и выполнить программу.

 

Варианты заданий

 

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

2. В двухмерном массиве среди чисел, стоящих на четных местах, определить минимальный положительный элемент массива и его индексы.

3. В матрице порядка n найти седловую точку (элемент максимальный в строке и минимальный в столбце).

4. Рассортировать положительные элементы каждой строки матрицы по убыванию. Отрицательные элементы оставить на своих местах.

5. Рассортировать отрицательные элементы каждого столбца матрицы по возрастанию. Положительные элементы оставить на своих местах.

6. Дана матрица. Поменять местами максимальный элемент среди всех отрицательных элементов матрицы на минимальный элемент среди всех положительных.

7. Рассортировать элементы главной диагонали квадратной матрицы порядка n по возрастанию.

8. В некоторых видах спортивных состязаний выступление каждого спортсмена независимо оценивается несколькими судьями, затем из всей совокупности оценок удаляется наиболее высокая и наиболее низкая, а для оставшихся оценок вычисляется среднее арифметическое, которое и идет в зачет спортсмену. Если наиболее высокую оценку выставило несколько судей, то из совокупности оценок удаляется только одна такая оценка; аналогично поступают с наиболее низкими оценками. Даны натуральное число n, действительные положительные числа а1,…,an (n>=3). Считая, что числа а1,…,an – это оценки, выставленные судьями одному из участников соревнований, определить оценку, которая пойдет в зачет этому спортсмену.

9. Даны действительные числа а1,…,an. Требуется умножить все члены последовательности а1,…,an на квадрат ее наименьшего числа, если а1 >= 0, и на квадрат ее наибольшего члена, если а1 < 0.

10. У прилавка магазина выстроилась очередь из n покупателей. Время обслуживания продавцом i-ого покупателя равна ti (i=1,…,n). Пусть даны натуральное n и действительные t1,…,tn. Получить c1,…,cn, где ci – время пребывания i-ого покупателя в очереди (i=1,…,n). Указать номер покупателя, для обслуживания которого продавцу потребовалось самое малое время.

 

 

Лабораторная работа №7

Порядок выполнения работы

1. Изучить краткие теоретические сведения.

2. Составить блок-схему алгоритма.

3. По разработанной блок-схеме алгоритма написать программу. Память под

массивы выделять динамически как указатель на указатель.

4. Отладить и выполнить программу.

 

Варианты заданий

 

1. Рассортировать отрицательные элементы каждого столбца матрицы по возрастанию. Положительные элементы оставить на своих местах.

2. Даны натуральное число n, действительное число x, действительная матрица размера n*2n. Получить последовательность b1,…,bn из нулей и единиц, где bi=1, если элементы i-ой строки матрицы не превосходят x, и bi=0 в противном случае.

3. Даны целочисленная матрица размера n*m, целые числа k,k1

(1 <=k <=n, 1 <= k1 <=n, k k1). Преобразовать матрицу так, чтобы строка



Поделиться:


Последнее изменение этой страницы: 2016-08-10; просмотров: 501; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.12.165.68 (0.019 с.)