Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Основы алгоритмизации и программирования. Часть 1. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
1 Мб
Скачать
☆
Пример 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
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]