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

Основы программирования на языке С. Учебное пособие

.pdf
Скачиваний:
1
Добавлен:
07.09.2026
Размер:
2 Мб
Скачать
☆
Задание 11. Одномерные массивы
Пример. Сформировать массив целых чисел X(N), элементами кото­рого являются случайные числа в диапазоне [-20..20]. Найти максималь­ный элемент и его номер.
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
void main()
{
const int N=100;
int a[N],n;
do
{
printf("\nEnter n (1-%d%s",N,"): ");
scanf("%d",&n);
}
while (n<=0 || n>N);
const int k=20;// граница диапазона [-20,20]
int max=-21,imax=-1;
printf("\n");
for (int i=0;i<n;i++)
{
a[i]= rand()%(k*2+1)-k; //генерируем массив случайных чисел
//в диапазоне [-k..k]
printf("a[%d%s%d%s",i, "]=",a[i], "\n");//вывод эле­мента массива на экран
if (a[i]>max) {max=a[i]; imax=i;}// поиск максимума
}
printf("\nmax=a[%d%s%d",imax, "]= " , max);
getch();
}
1. В целочисленном массиве X(N), N≤20, сгенерированном случай­ным образом, нечетные элементы увеличить в два раза, а у элементов с четными номерами заменить знаки на противоположные.
2. В целочисленном массиве X(N), N≤20, сгенерированном случай­ным образом, определить количество перемен знака.
3. В целочисленном массиве X(N), N≤20, сгенерированном случай
-
ным образом, найти наименьший из положительных элементов.
4. Для целочисленного массива X(N), N≤20, сгенерированного слу-
чайным образом, определить, образуют ли его элементы неубывающую последовательность.
41
5. Проведено измерение роста N студентов (N≤20). Данные записаны
в массиве ROST. Разместить в массиве NR номера тех студентов, чей рост меньше 180 см и подсчитать число таких студентов.
6. Результаты сдачи экзамена группой из N студентов (N≤20) нахо- дятся в массиве REZ. Подсчитать количество студентов, сдавших экзамен на «хорошо» и «отлично».
7. Из целочисленного
массива X(N), N≤20, сгенерированного случай-
ным образом, переписать в массив Y элементы массива X c нечетными но­мерами, а в массив Z – элементы массива X, значения которых кратны 5.
8. Сформировать случайным образом массив X(N), N≤20, элементами которого могут быть только 0 и 1. Проверить, существует ли строгое чере­дование 0 и 1.
9.
Сформировать целочисленный массив X (N), N≤20, элементами ко­торого являются случайные числа из диапазона [-3..3]. Определить, сколь­ко раз в нем встретилось два подряд идущих нулевых элемента.
10. Сформировать целочисленный массив X(N), N≤20, элементами которого являются случайные числа из диапазона [-20..10]. Найти величи­ну наибольшего среди отрицательных чисел этого массива.
11. Сформировать вещественный
массив X1(N), N≤20, элементами
которого являются случайные числа из диапазона [0..50]. Переслать из не­го в массив X2 все элементы, значения которых больше 24 и меньше 34.
12. Сформировать целочисленный массив X(N), N≤20, элементами которого являются случайные числа из диапазона [-40..40]. Подсчитать сумму элементов этого массива, значения которых кратны 8.
Задание 12. Вложенные
циклы
Пример. Введите месяц и день своего рождения. В массиве целых чисел, генерируемом случайным образом, найдите первое счастливое для Вас число. Число называется счастливым, если сумма его цифр равна сум­ме цифр месяца и дня Вашего рождения.
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
void main ()
{
const int n=20;
int a[n];
int m,d,sum1;
printf("\nВведите день и месяц рождения ");
scanf("%d%d",&d,&m);
sum1=d%10+d/10+m%10+m/10;// считаем сумму цифр месяца и
//дня рождения
printf("\nСумма цифр даты рождения: %d",sum1);
42
printf("\nСгенерирован массив"); for (int i=0;i<n;i++) { a[i]=rand()%100;//генерируем элемент массива случайным
образом
printf("\n a[%d%s%d",i,"]=",a[i]); } int sum2,i,k; for(i=0;i<n;i++) { sum2=0; k=a[i];//сохраняем значения a[i] while (k>0)// ищем сумму цифр числа a[i] { sum2+=k%10; k/=10; } printf("\n%d",sum1); if (sum1==sum2)//нашли счастливое число { printf("\nСчастливое число a[%d%s%d",i,"]=",a[i]); break;//прекратили просмотр массива (выход из цикла) } } if (i==n) printf("\n В массиве нет счастливого числа
%d");
getch(); }
1. Найти все натуральные числа в диапазоне между m и n (m<n), де-
лящиеся на каждую из своих цифр.
2. Найти все натуральные числа в диапазоне между m и n (m<n), де­сятичная запись которых есть строго возрастающая последовательность цифр. Подсчитать количество таких чисел.
3. Найти все натуральные числа в
диапазоне между m и n (m<n), в за-
писи которых нет двух одинаковых цифр. Подсчитать количество таких чисел.
4. Натуральное число из m цифр называется числом Амстронга, если сумма его цифр, возведенная в степень m, равна самому числу. Распечатать все числа Амстронга, не превосходящие заданного n, и подсчитать количе­ство
таких чисел.
5. Дано натуральное число n. Подсчитать количество различных цифр, встречающихся в k старших разрядах его записи.
6. Распечатать все различные тройки последовательных элементов
одномерного массива цифр. Например, в массиве 318731873 различные тройки – это 318, 187, 873, 731.
43
7. Сколько чисел между n и m (n<m) состоит только из нечетных
цифр? Выведите на экран эти числа.
8. Заданное натуральное число представить в виде суммы квадратов
двух натуральных чисел или выдать сообщение, что это невозможно.
9. Указать индексы и напечатать те элементы целочисленного масси-
ва X, сумма цифр которых равна
заданному числу M (если такие элементы
есть).
10. Для натуральных a и b определим операцию ab=a–b+a%b.
Найти все пары a,b, не превосходящие заданного n, для которых ab=
bа.
11. Определить, сколько чисел между n и m (n<m) состоит только из
четных цифр. Выведите
на экран эти числа.
12. Найти максимальное из чисел, встречающихся в заданном цело-
численном массиве более одного раза.
Задание 13. Двумерные массивы
Пример. Сформировать матрицу A(10,10) следующего вида
0..001
 
     
 
#include <stdio.h> #include <conio.h>
void main () { const int N=10; static int a[N][N]; //статический массив инициализируется //нулями for (int i=0; i<N; i++) for (int j=0; j<N; j++) if (i>=j) a[i][j]=i-j+1; //условие попадания под
главную диагональ
for (int i=0; i<N; i++) // печать матрицы { for (int j=0; j<N; j++) printf("%2d", a[i][j]); printf("\n"); } getch(); }
 
0..012
 
0..023
......
 
0.....
 
1..8910
Можно уменьшить количество повторений в цикле и избавиться от проверок в операторе IF, если фрагмент заполнения матрицы записать сле­дующим образом:
for (i=0; i<N; i++)
44
for (j=0; j<i; j++)
a[i][j]=i–j+1
1. Сгенерировать случайным образом квадратную матрицу размер­ности K<20. Найти сумму ее элементов, находящихся на диагонали, «орто­гональной» главной.
2. Дана прямоугольная матрица A (N, M) (N
M, M 15). Найти про-
изведение элементов каждой строки матрицы. Сформировать массив B из найденных произведений.
3. Дана прямоугольная матрица A (N, M) (N
M, M 15). Найти мак-
симальный элемент в каждой строке. Сформировать массив B из найден­ных элементов.
4. Дана прямоугольная матрица A (N, M) (N
M, M 15). Преобразо-
вать матрицу таким образом, чтобы на месте первой строки находилась вторая, на месте второй – третья, и т.д., а на месте последней – первая.
5. Дана прямоугольная матрица A (N, M) (N
M, M 15) и искомое
число k. Найти все имеющиеся в матрице числа k и их позиции. Если таких элементов нет, то выдать соответствующее сообщение.
6. Сформировать и распечатать квадратную матрицу А(10,10) следу­ющего вида:
10..00
 
     
 
 
02..00
 
......
......
 
00..90
 
00..010
7. Сформировать и распечатать прямоугольную матрицу A(10,20) следующего вида:
20..21
 
    
 
20..21
 
.
.....
.....
 
20..21
8. Сформировать и распечатать квадратную матрицу A(12,12) следу­ющего вида:
12..321
 
     
 
 
11..210
 
10..100
.
......
 
......
 
100000
9. Сформировать и распечатать квадратную матрицу A(15,15) следу­ющего вида:
45
 
     
 
10. Сформировать и распечатать квадратную матрицу A(15,15) сле-
дующего вида:
 
     
 
11. Сформировать и распечатать квадратную матрицу размерности
M<20 следующего вида:
 
     
 
12. Сформировать и распечатать квадратную матрицу A(15,15) сле-
дующего вида:
 
     
 
Задание 14. Посимвольная обработка строк
Пример. Переслать из одной строки, читаемой с клавиатуры, в но-
вую строку каждый третий символ.
void main () {
const int n=255; char str1[n]; printf ("Enter string "); gets(str1); int len = 0; // вычислим длину строки str1 – len while (str1[len]) len++; char *str2= (char *)malloc(len+1); //определили указатель //на второй массив символов //и выделил участок памяти для него int j=0; //определили индекс для массива str2 for (int i=2;i<=len;i+=3)// цикл пересылки каждого
1..111
 
2..221
 
3..321
......
 
......
 
15..321
10..00
 
01..00
 
......
......
 
00..10
 
00..01
0..001
 
0..012
 
0..123
......
 
......
1..21
MMM
 
0..0015
 
0..0140
 
0..1300
......
 
02....
 
10.000
46
//третьего символа str2[j++]=str1[i]; str2[j]='\0'; // в новую строку на последнее место внесли // символ конца строки printf("str1= %s",str1); printf("\nstr2= %s",str2); free(str2); getch(); }
1. Сформировать строку, в которой все прописные буквы заданной заменить строчными, а все строчные буквы – прописными.
2. Сформировать строку, состоящую из всех строчных букв, входя­щих в заданную строку, без повторов.
3. Дано слово. Определить, упорядочены ли его буквы по алфавиту. Выделить первую упорядоченную последовательность в новую строку.
4. Из заданной текстовой строки
выбрать все строчные и прописные
буквы в разные подстроки, пробелы и небуквенные символы повторять в обеих подстроках.
5. Сформировать строку, состоящую из символов заданной строки, где после каждой гласной буквы добавлен пробел.
6. Из заданной текстовой строки выбрать все символы главных букв в одну строку, а все прочие в другую.
7. Дана
строка. Сформировать строку, содержащую символы данной
в обратном порядке, причем каждый четвертый символ (считая с конца данной строки) выкинуть.
8. Дана строка. Сформировать строку, содержащую все символы данной, за исключением символов гласных букв.
9. Дана строка. Сформировать строку, содержащую все символы данной, за исключение символов прописных букв.
10. Дана строка. Сформировать строку
, содержащую все символы
данной, но точки заменены на многоточие.
11. Дана строка. Сформировать строку, содержащую все символы,
которые входят в данную только один раз в том порядке, в котором они расположены в исходной строке.
12. Дана строка. Сформировать строку, содержащую все символы данной, кроме символов, заключенных в скобки ‘(‘, ‘)’. Сами скобки нужно включить в новую строку. (Считается, что скобки расставлены корректно и не могут быть вложенными).
Задание 15. Сортировка массива
Сортировку следует понимать как процесс перегруппировки задан­ного множества объектов в некотором определенном порядке. Основное требование к методам сортировки – экономное использование времени процессора и памяти. Существующие методы сортировки обычно разби-
47
вают на три класса в зависимости от лежащего в их основе приема: сорти­ровка выбором, сортировка обменом, сортировка вставками.
Пример. Реализовать пузырьковую сортировку случайным образом генерируемого массива. Пузырьковая сортировка: массив просматрива­ется от начала до конца. Сравниваются i-е и (i+1)-е числа. Если i-е число больше (сортировка по
возрастанию), то они меняются местами. Массив просматривается до тех пор, пока от начала до конца массива не сделано ни одной перестановки соседних чисел.
void main () { const int N=100; int a[N],n; printf("Enter n< %d",N); scanf("%d",&n); printf("\nArray:\n"); for (int i=0;i<n;i++) //Генерируем массив случайных чисел
в
//диапазоне [0..50] и выводим на экран { a[i]=rand()%51; printf("%d%s",a[i]," "); }
printf("\nSotr:\n"); bool f; int b; do { f=false; for(int i=0;i<n-1;i++)// Просматриваем весь массив if (a[i]>a[i+1]) { b=a[i]; a[i]=a[i+1]; a[i+1]=b; f=true; //Был обмен } } while (f); // Проверяем, был ли хоть один обмен for (int i=0;i<n;i++) // Выводим на экран отсортированный //массив printf("%d%s",a[i]," "); getch(); }
Отсортировать случайным образом cгенерированный массив, ис-
пользуя следующие алгоритмы.
48
1. Усовершенствованная пузырьковая сортировка. Используется
принцип пузырьковой сортировки, но массив просматривается не от нача­ла до конца, а от начала до последнего перемещенного элемента (после ко­торого все элементы уже упорядочены). Вначале этим «последним» эле­ментом выбирается последний элемент массива.
2. Простой выбор. Выбрать наибольший элемент массива и поме-
нять его
местами с последним (n-ым) элементом массива. Затем из n–1 первых элементов опять выбрать наибольший и опять поменять его места­ми с (n–1)-м. И так далее, пока весь массив не будет упорядочен.
3. Простые вставки. Так обычно сортируют карты: из веера карт
берут одну, стоящую не по старшинству, и
помещают между двумя уже упорядоченными картами. Массив просматривают с начала до конца. Рас­сматривается i-й элемент массива и вставляется на нужную позицию в ря­ду первых (i–1) уже упорядоченных элементов. (Первоначально «упорядо- чен» только первый элемент массива). Если i-й элемент перемещается в j­ю позицию, то все элементы с
j-го по (i–1)-й элемент должны быть сдвину-
ты на одну позицию вправо.
4. Метод подсчета. Если для какого–то элемента массива известно, что если он больше, чем i других элементов этого массива, то он должен стоять на (i+1)-ом месте после упорядочивания. Для каждого i-го элемента массива считают,
сколько чисел меньше его, и результат заносят в массив индексов с[i]. Это делается следующим образом. Сравнивают попарно все элементы массива: i-й и j-й. (Одна пара чисел может сравниваться только один раз.) Если i-й больше, то с[i] увеличивают на единицу, иначе c[j] уве­личивают на единицу. После
формирования массива индексов с, форми-
руют результирующий массив.
5. Метод распределяющего подсчета. Используется, если в массиве много одинаковых элементов. Создается массив индексов d[i]. Размерность массива – число различных между собой элементов исходного массива. За­тем в элемент массива d[i] заносят количество элементов массива, равных i, и в результирующий массив
записывают по d[i] элементов i-го типа. Например, исходный массив 0010101031; d[0]=5, d[1]=4, d[2]=0, d[3]=1. Ре- зультирующий массив 0000011113.
49
7. ФУНКЦИИ
Функция – это именованная часть программы, к которой можно об­ращаться из других частей программы столько раз, сколько потребуется. Программа на языке С – это совокупность функций, каждая из которых должна быть описана до ее использования. Определение функции имеет следующий формат:
тип_функции имя_функции (спецификация_формальных_парамет­ров) {тело_функции}
Здесь тип_функции – тип возвращаемого функцией значения, в том числе void, если функция не возвращает никакого значения. Тип функции может быть любым кроме массива и функции. Имя_функции – идентифи­катор. Спецификация_формальных_параметров может отсутствовать (но скобки обязательны) или представлять собой список спецификаций для каждого параметра, имеющий вид:
тип имя_параметра
или
тип имя_параметра= умалчиваемое значение.
Тело_функции – это блок или составной оператор, заключенный в скобки {}. Очень важным оператором тела функции является оператор возврата в точку вызова
return выражение;
или
return;
Выражение в операторе return определяет возвращаемое функцией значение, именно то значение, которое будет результатом обращения к функции. Если функция имеет тип void, то этот оператор можно опустить.
Обращение к функции (вызов функции) – это выражение вида
имя_функции (список_фактических_параметров)
При обращении к функции формальные параметры заменяются фак­тическими, причем соблюдается строгое соответствие параметров по ти­пам. Именно поэтому необходимо определить или хотя бы объявить функ­цию ее вызова. Объявление функции (прототип) совпадает с заголовком определения функции (описание функции без тела) после которого ставит­ся ;. В списке формальных параметров в этом
случае могут отсутствовать
имена параметров.
Приведем несколько примеров.
Пример 1. Составить функции для нахождения максимума двух це­лых чисел, куба целого числа. Найти куб максимального из двух чисел и вывести на экран, используя данные функции.
# include <stdio.h>
# include <conio.h>
int max (int n, int m ) // определение функции нахождения максимума
50
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]