Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Основы алгоритмизации и программирования. Часть 1. Учебное пособие
.pdf
Пример 2.3. Рассмотрим примеры ввода одномерного и двумерного
массивов:
а) задать или ввести значения n элементов одномерного ai, i = 1, 2, …, n,
массива с помощью операторов ввода printf и scanf
const int n=5;
int a[n],i;
for(i=0;i<n;i++) {
printf("a[%d]= ",i);
scanf("%d ",&a[i]);
}
б) вывести на экран элементы одномерного ai, i = 1, 2, …, n, массива
for(i=0;i<n;i++)
printf("a[%d]= %d ",i,a[i]);
Указание: если в цикле только один оператор, то его можно не
заключать в логические скобки {}.
в) задать или ввести значения n элементов одномерного ai, i = 1, 2, …, n,
массива с помощью генератора случайных чисел
#include <time.h>
#include <stdlib.h>
//задание размера массива
const int n=5;
int a[n],i;
//генерация случайных чисел
//от min=1 до max=10
const int min=1, max=10;
srand(time(NULL));
for(i=0;i<n;i++)
a[i]=rand()%(max-min+1)+min;
г) ввести значения элементов двумерного aij, i = 1, 2, …, n, j = 1, 2, …, m,
массива с помощью оператора ввода InputBox
const int n=3, m=3;
int a[n][m],i,j;
for(i=0;i<n;i++)
61

for(j=0;j<m;j++) {
printf("a[%d][%d]= ",i,j);
scanf("%d",&a[i][j]);
}
д) задать или ввести значения элементов двумерного aij, i = 1, 2, …, n,
j = 1, 2, …, m, массива с помощью генератора случайных чисел
#include <time.h>
#include <stdlib.h>
//задание размера массива
const int n=3, m=3;
int a[n][m],i;
//генерация случайных чисел
//от min=1 до max=10
const int min=1, max=10;
srand(time(NULL));
for(i=0;i<n;i++)
for(j=0;j<m;j++)
a[i][j]=rand()%(max-min+1)+min;
е) вывести на экран элементы двумерного aij, i = 1, 2, …, n, j = 1, 2, …, m,
массива
for(i=0;i<n;i++)
for(j=0;j<m;j++)
printf("a[%d][%d]= %d ",i,j,a[i][j]);
Пример 2.4. Вычислим сумму S и произведение P элементов
одномерного ai, i = 1, 2, …, n, и двумерного aij, i = 1, 2, …, n, j = 1, 2, …, m,
массивов.
а) сумма S и произведение P элементов одномерного массива ai,
i =1, 2, …, n.
S = 0; P = 1;
for(i=0; i<n; i++) for(i=0; i<n; i++)
S = S + a[i]; P = P * a[i];
62

б) сумма S и произведение P элементов двумерного массива
kn 2
S = 0; P = 1;
for(i=0; i<n; i++) for(i=0; i<n; i++)
for(j=0; j<m; j++) for(j=0; j<m; j++)
S = S + a[i][j]; P = P * a[i][j] ;
Пример 2.5. В двумерном массиве a
i = 1, 2, …, n, j = 1, 2, …, m,
ij,
подсчитаем сумму элементов S1 в строке i=n и сумму элементов S2 в столбце
j=m.
а) сумма элементов б) сумма элементов
в каждой строке в каждом столбце
S1 = 0; S2 = 0;
for(j=0; j<m; j++) for(i=0; i<n; i++)
S1 = S1 + a[n][j]; S2 = S2 + a[i][m];
Пример 2.6. Рассмотрим программы для:
а) определения среднего Sr арифметического четных элементов a2, a4, a6,
…, a2k последовательности a1, a2, …, an, где
.
S = 0;
k = 0;
for(i=0; i<n; i=i+2) {
S = S + a[i];
k = k + 1;
}
Sr = S/k;
б) определения суммы S элементов последовательности a1, a2, …, an,
которые делятся на заданное число k.
S = 0;
for(i=0; i<n; i++) {
if (fmod(a[i],k)==0)
S = S + a[i];
}
в) определения минимального элемента min последовательности
a1,a2,…,an.
63

min = a[0];
Рис. 2.10
void zadanie5a() {
int k,m;
printf("Input m>0 ");
scanf("%d",&m);
k=0;
while(pow((float)4,k)<m)
k++;
printf("k= %d ",k);
getch();
}
а
б
void zadanie5b() {
int k,m;
printf("Input m>0 ");
scanf("%d",&m);
k=0;
do k++;
while(pow((float)4,k)<m);
printf("k= %d ",k);
getch();
}
for(i=1; i<n; i++) {
if (min > a[i]) min = a[i] ;
}
ЗАДАНИЕ 5
Дано целое число m > 0. Найти наибольшее целое k, при котором 4k < m,
с использованием функций zadanie5a() и zadanie5a() и циклов с
предусловием и постусловием.
ТЕХНОЛОГИЯ РАБОТЫ
1. Нарисуйте в тетрадь блок-схему, содержащую цикл с предусловием,
для решения поставленной задачи, а затем приступите к набору функции
zadanie5a() на рис. 2.10, а.
Указание: у функции pow() первый аргумент должен иметь
вещественный тип, поэтому целое число 4 необходимо оператором (float)
преобразовать в вещественное.
Проверьте работу функции zadanie5a() при m = 1024. (Ответ: k = 5.)
2. Нарисуйте в тетрадь блок-схему, содержащую цикл с постусловием,
для решения аналогичной задачи. Введите функцию zadanie8б() на
рис._2.10, б. Проверьте работу функции zadanie8б() при m = 1024. (Ответ:
k = 6.) Объясните полученный результат.
64

3. Самостоятельно составьте блок-схемы и функции на языке С для
void zadanie6() {
//Задание размерности массива
const int n=5;
int a[n],i;
float S;
//Использование цикла с параметром
//для заполнения массива вручную
for(i=0;i<n;i=i+1) {
printf("a[%d]= ",i);
scanf("%d",&a[i]);
}
//Расчет среднего арифметического
//элементов массива
S = 0;
for(i=0;i<n;i++)
S = S + a[i];
S=S/n;
printf("S= %.2f ",S);
getch();
}
Рис. 2.11
решения задачи с использованием циклов с предусловием и постусловием:
сколько чисел нужно взять в последовательности 1 + 2 + 3 + 4 + …, чтобы
получить число, большее, чем S = 252? (Ответ: При S = 252 нужно взять
k = 23 числа).
ЗАДАНИЕ 6
Вручную заполните целыми числами массив {ai}, i = 1, 2, …, N и
рассчитайте среднее арифметическое значение его элементов в функции
zadanie6().
ТЕХНОЛОГИЯ РАБОТЫ
1. Самостоятельно нарисуйте в тетрадь блок-схему задачи, а затем
приступите к набору функции zadanie6() на рис. 2.11.
до 100 квадратную матрицу {aij}, i = 1, 2, …, N, j = 1, 2, …, N, и найдите
минимальный элемент матрицы в функции zadanie7().
При помощи датчика случайных чисел заполните целыми числами от 1
ЗАДАНИЕ 7
65

ТЕХНОЛОГИЯ РАБОТЫ
void zadanie7() {
//задание размера матрицы
const int n=5;
//объявление матрицы
//и трех переменных типа int
int a[n][n],i,j,MIN;
//генерация случайных чисел
//от min=1 до max=100
//с заполнением ими матрицы
const int min=1, max=100;
srand(time(NULL));
for(i=0;i<n;i++)
for(j=0;j<n;j++)
a[i][j]=rand()%(max-min+1)+min;
//вывод на экран сгенерированной матрицы
for(i=0;i<n;i++)
for(j=0;j<n;j++)
printf("\na[%d][%d]= %d ",i,j,a[i][j]);
//поиск минимального элемента матрицы
MIN = a[0][0];
for(i=1; i<n; i++)
for(j=0;j<n;j++) {
if (MIN > a[i][j]) MIN = a[i][j];
}
printf("\nMIN= %d ", MIN);
getch();
}
Рис. 2.12
1. Самостоятельно нарисуйте в тетради блок-схему для решения задачи,
а затем приступите к набору программы на рис. 2.12.
2. Самостоятельно составьте блок-схему, наберите и запустите
программу для решения следующей задачи: найти, сколько положительных
элементов Np содержит матрица {aij}, где i = j = 1, 2, …, 4, в строке i = 2 и
столбце j = 4 (см. пример 2.5).
3. Выполните третью группу самостоятельных задач индивидуального
варианта из табл. 1.8.
66

2.6. Подпрограммы
Подпрограмма - это программа, реализующая вспомогательный
алгоритм. Основная программа исполняет основной алгоритм решения задачи
и содержит в себе обращения к подпрограммам-функциям.
ЗАДАНИЕ 8
Даны одномерные массивы xi, yi, i = 1, 2,..N. Вычислите сумму Sr = Sr1 +
Sr2 средних значений Sr1 массива xi и Sr2 массива yi, используя
подпрограмму-функцию для вычисления Sr1 и Sr2.
ТЕХНОЛОГИЯ РАБОТЫ
1. Выполните набор программы на рис. 2.13.
Указание: функцию zadanie8() следует указать в основной функции
main(), а функцию average()- нет, так как она вызывается из функции
zadanie8(). Кроме того, следует объявить функцию average():
float average(int a[], int n);
В функции zadanie8() вычисляется Sr с привлечением функции
average_a() (рис. 2.13).
Проверьте работу программы при x1 = 1, x2 = 2, x3 = 3, y1 = 2, y2 = 3,
y3 = 4. (Ответ: Sr = 5.)
2. Самостоятельно составьте программу, содержащую подпрограмму-
функцию, для решения следующей задачи: даны два одномерных массива xi и
yi, i=1, 2, 3, вычислить наименьшее из двух произведений P1 и P2, где P1 -
произведение элементов массива xi и P2 - произведение элементов массива yi.
3. Самостоятельно создайте функцию для решения задачи четвертой
группы индивидуального варианта из табл. 1.8.
67

Рис. 2.13
void zadanie8() {
//Задание размерности массива
const int n=5;
int x[n],y[n],i;
float Sr,Sr1,Sr2;
//заполнения массивов x и y вручную
for(i=0;i<n;i++) {
printf("x[%d]= ",i);
scanf("%d",&x[i]);
}
for(i=0;i<n;i++) {
printf("y[%d]= ",i);
scanf("%d",&y[i]);
}
//Вызов функции average для расчета
//среднего элементов массива x и y
Sr1=average(x,n);
Sr2=average(y,n);
Sr = Sr1+Sr2;
printf("Sr= %.2f",Sr);
getch();
}
float average_a(int a[], int n) {
int i;
float S=0;
//Расчет среднего арифметического
//элементов массива
for(i=0;i<n;i++)
S = S + a[i];
S=S/n;
return S;
}
68

ЗАДАНИЕ 9
void zadanie14() {
int N,F;
printf("Input N= ");
scanf("%d",&N);
//Вызов рекурсивной функции Fact
F=Fact(N);
printf("F= %d ",F);
getch();
}
int Fact(int N) {
//Вычисление факториала
if(N<=1) return(1);
else return(Fact(N-1)*N);
}
В функции zadanie9() вычислите факториал F = 1 • 2 • 3 • …• N = N!
числа N с помощью рекурсивной функции Fact().
ТЕХНОЛОГИЯ РАБОТЫ
1. Наберите программу на рис. 2.14, выполните ее компиляцию, отладку
и выполнение, проверьте ее работу при N = 3. (Ответ: F = 6.)
Функция Fact() называется
рекурсивной, поскольку она
вызывает сама себя
посредством обращения
изнутри к своему имени
Fact().
Рис. 2.14
2. Самостоятельно составьте
программу для расчета
суммы N чисел F = 1 + 2 +
…+ N с использованием
рекурсивной функции.
69

БИБЛИОГРАФИЧЕСКИЙ СПИСОК
1. Кудинов, Ю.И. Основы современной информатики: учеб. пособие /
Ю.И._Кудинов, Ф.Ф. Пащенко. – Санкт-Петербург: Лань, 2009. – 256 с.
2. Кудинов, Ю.И. Практикум по основам современной информатики:
учеб. пособие / Ю.И. Кудинов, Ф.Ф. Пащенко, А. Ю. Келина. - СанктПетербург: Лань, 2011. - 350 с.
3. Кудинов, Ю.И. Практическая работа в VBA: учеб. пособие /
Ю.И. Кудинов. – Липецк: Липецкий государственный технический
университет, 2001. – 98 с.
4. Липачёв, Е.К. Технология программирования. Базовые конструкции
C/C++: учебно–справочное пособие / Е.К. Липачёв. – Казань: Казанский
университет, 2012. - 142 с.
5. Богуславский А.А. Основы программирования на языке Си++: учеб.
пособие / А.А. Богуславский, С.М. Соколов. – Коломна: Коломенский
государственный педагогический институт, 2002. – 490 с.
6. Страуструп, Б. Язык программирования C++ / Бьерн Страуструп; пер.
с англ. С._Анисимова, М. Кононова под ред. Ф. Андреева, А. Ушакова.– 3-е
изд. – Москва: Бином; Санкт-Петербург: Невский диалект, 1999. – 990 с.
70
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
