Задачи по программированию на СС++. Учебно-методическое пособие
.pdfprintf("%2d ",a[i][j]); printf("\n");
}
for(j=0;j<m;j++){
sum=0;
for(i=0;i<n;i++)
sum=sum+a[i][j];
printf("сумма столбца %d = %d\n",j,sum);
}
return 1;
}
Задачи
1.Ввести матрицу 4 6. Заменить в ней все положительные элементы на 1, отрицательные на –1.
2.Ввести матрицу a(5 4). Найти: а) сумму всех элементов; б) сумму элементов 3-й строки;
в) наибольший элемент 2-го столбца.
3.Заполнить и вывести матрицу 5 5:
1 |
0 |
0 |
0 |
0 |
||
|
2 |
1 |
0 |
0 |
0 |
|
|
|
|||||
3 2 1 0 0
4 3 2 1 05 4 3 2 1
4.Дана матрица A(N,M ). Вывести ее элементы, распо-
ложенные в строках с четными номерами (2, 4, …). Вывод элементов производить по строкам, условный оператор не использовать.
5.Подсчитать, сколько раз встречается в заданной целочисленной матрице A(N,M ) максимальное по величине число.
41
6.В заданной матрице A(N,M ) поменять местами строки с номерами P и Q (1 P N , 1 Q N ).
7.Определить, имеется ли среди элементов главной диагонали заданной целочисленной матрицы A(N,N) хотя
бы один положительный нечётный элемент.
8. Дана матрица размера M N и целое число K (1 K N ). Найти сумму и произведение элементов K-го столбца данной матрицы.
9.Дана матрица размера M N . Для каждой строки матрицы найти сумму ее нечетных элементов.
10.Дана матрица размера M N . Для каждого столбца матрицы найти произведение четных его элементов.
11.Дана матрица размера M N . Для каждой строки матрицы с нечетным номером (1, 3,…) найти среднее арифметическое ее элементов.
12.Дана матрица размера M N . Для каждого столбца матрицы с четным номером (2, 4,…) найти сумму его элементов.
13.Дана матрица размера M N . В каждой строке матрицы найти минимальный элемент.
14.Дана матрица размера M N . В каждом столбце матрицы найти максимальный из четных элементов.
15.Дана матрица размера M N . Найти номер ее строки с
наибольшей суммой элементов и вывести данный номер, а также значение наибольшей суммы.
16. Дана матрица размера M N . Найти номер ее столбца с наименьшим произведением элементов и вывести данный номер, а также значение наименьшего произведения.
17.Дана матрица размера M N . Найти максимальный среди минимальных элементов ее строк.
18.Дана матрица размера M N . Найти минимальный среди максимальных элементов ее столбцов.
42
19.Дана матрица размера M N . В каждой ее строке найти количество элементов, меньших среднего арифметического всех элементов этой строки.
20.Дана матрица размера M N . В каждом ее столбце найти количество элементов, больших среднего геометрического всех элементов этого столбца.
21.Дана матрица размера M N . Найти номера строки и столбца для элемента матрицы, наиболее близкого к среднему арифметическому значению всех ее элементов.
22.Дана целочисленная матрица размера M N . Найти номер первой из ее строк, содержащих равное количество положительных и отрицательных элементов (нулевые элементы матрицы не учитываются). Если таких строк нет, то вывести –1.
23.Дана целочисленная матрица размера M N . Найти номер последнего из ее столбцов, содержащих равное количество положительных и отрицательных элементов (нулевые элементы матрицы не учитываются). Если таких столбцов нет, то вывести –1.
24.Дана целочисленная матрица размера M N . Найти номер последней из ее строк, содержащих только четные числа. Если таких строк нет, то вывести –1.
25.Дана целочисленная матрица размера M N . Найти номер первого из ее столбцов, содержащих только нечетные числа. Если таких столбцов нет, то вывести –1.
26.Дана целочисленная матрица A(N,N). Определить,
имеются ли среди её элементов, лежащих ниже главной диагонали, отрицательные числа.
27.В заданной целочисленной матрице A(N,M ) найти количество строк, содержащих нули и числа меньше 10.
28.Дана целочисленная матрица A(N,M ). Определить,
встречается ли заданное целое K среди максимальных элементов столбцов этой матрицы.
43
29.Дана матрица A(N,N). Если хотя бы один элемент
строки матрицы отрицателен, то все элементы этой строки заменить нулями.
30.Дана целочисленная матрица размера M N , элементы которой могут принимать значения от 0 до 100. Различные строки матрицы назовем похожими, если совпадают множества чисел, встречающихся в этих строках. Найти количество строк, похожих на первую строку данной матрицы.
31.Дана целочисленная матрица размера M N . Найти количество ее строк, все элементы которых различны.
32.Дана целочисленная матрица размера M N . Найти номер последней из ее строк, содержащих максимальное количество одинаковых элементов.
33.Дана целочисленная матрица размера M N . Найти номер первого из ее столбцов, содержащих максимальное количество одинаковых элементов.
34.Дана матрица размера M N . Найти количество ее строк, элементы которых упорядочены по возрастанию.
35.Дана матрица размера M N . Найти минимальный среди элементов тех строк, которые упорядочены либо по возрастанию, либо по убыванию. Если упорядоченные строки в матрице отсутствуют, то вывести 0.
36.Дана целочисленная матрица размера M N . Найти
элемент, являющийся максимальным в своей строке и минимальным в своем столбце. Если такой элемент отсутствует, то вывести 0.
37. Дана матрица размера M N и целые числа K1 и K2 (1 K1 K2 M ). Поменять местами строки матрицы с номерами K1 и K2.
38.Дана матрица размера M N . Преобразовать матрицу, поменяв местами минимальный и максимальный элемент в каждой строке.
44
39.Дана матрица размера M N . Поменять местами строки, содержащие минимальный и максимальный элементы матрицы.
40.Дана матрица размера M N . Поменять местами столбец с номером 1 и последний из столбцов, содержащих только положительные элементы. Если требуемых столбцов нет, то вывести матрицу без изменений.
41.Дана матрица размера M N (M – четное число). Поменять местами верхнюю и нижнюю половины матрицы.
42.Дана матрица размера M N (N – четное число). Поменять местами левую и правую половины матрицы.
43.Дана матрица размера M N (M и N – четные числа). Поменять местами левую верхнюю и правую нижнюю четверти матрицы.
44.Дана матрица размера M N (M и N – четные числа). Поменять местами левую нижнюю и правую верхнюю четверти матрицы.
45.Дана матрица размера M N . Зеркально отразить ее элементы относительно горизонтальной оси симметрии матрицы (при этом поменяются местами строки с номерами 0 и M–1, 2 и M–2 и т.д.).
46.Дана матрица размера M N . Зеркально отразить ее
элементы относительно вертикальной оси симметрии матрицы (при этом поменяются местами столбцы с номерами 0 и N–1, 1 и N–2 и т.д.).
47. Дана матрица размера M N и целое число K (1 K M ). Удалить строку матрицы с номером K.
48.Дана матрица размера M N . Удалить строку, содержащую минимальный элемент матрицы.
49.Дана матрица A(N,N). Переставить строку с макси-
мальным элементом на главной диагонали со строкой с заданным номером m, ( m N ).
45
50. |
В заданной матрице заменить отрицательные нечетные |
|||||
|
элементы нулями, положительные – единицами. |
|||||
51. |
Дана матрица A(N,N). |
Определить симметричная это |
||||
|
матрица или нет. |
|
|
|
||
52. |
Дана матрица a(5 5). Заменить в ней нулями элементы |
|||||
|
под главной диагональю. |
|
|
|
||
53. |
Дана матрица a(5 5). Заменить в ней нулями элементы |
|||||
|
над главной диагональю. |
|
|
|
||
54. |
В матрице A(N,N) вычислить две суммы элементов, |
|||||
|
расположенных ниже и выше главной диагонали. |
|||||
55. |
Транспонировать матрицу A(N,N). |
|||||
56. |
Дана матрица a(5 5). Заменить в ней нулями элементы |
|||||
|
под побочной диагональю. |
|
|
|||
57. |
Дана матрица a(5 5). Заменить в ней нулями элементы |
|||||
|
над побочной диагональю. |
|
|
|||
58. |
Отразить матрицу a(n n) относительно побочной диа- |
|||||
|
гонали. |
|
|
|
||
59. |
Магическим квадратом называется матрица, у которой |
|||||
|
равны суммы элементов каждой строки, каждого |
|||||
|
столбца и каждой диагонали – см. пример: |
|||||
|
|
6 |
|
1 |
8 |
|
|
|
7 |
|
5 |
3 |
|
|
Задача: ввести |
2 |
|
9 |
4 |
|
|
матрицу n n и проверить, является ли |
|||||
|
она магическим квадратом |
|
|
|||
60. |
Вычислить определитель матрицы A(N,N). |
|||||
Тема 9. Функции
Кроме главной и библиотечных функций в программах могут использоваться дополнительные, оформленные по определенным правилам, функции, предназначенные для решения
46
вспомогательных подзадач. Код программы при этом становится более структурированным и более компактным.
Пример 1. Протабулировать функцию f(x)=p∙sin(x)+q∙cos(x) на интервале числовой оси от a до b с шагом h. Необходимо вычислить и вывести на экран значения функции в точках:
xi 1 xi h, |
x0 a, |
h (b a)/n, |
i 0,...,n 1 |
Коэффициенты p, q, координаты интервала и количество разбиений интервала n>0 вводятся с клавиатуры. Значения исходной функции в заданных точках вычисляются с помощью специально оформленной функции ftrigs. Функция имеет три формальных параметра для передачи в неё значений коэффициентов и координаты точки. В главную функцию возвращается значение типа float, вычисляемое в ftrigs.
#include <stdio.h> #include <math.h>
float ftrigs(float p, float q, float x) {float v;
v=p*sin(x)+q*cos(x); return v;
}
int main()
{int n,i; float p,q,a,b,h,x,y; printf("\n ‚Введите n,p,q,a и b\n"); scanf("%d%f%f%f%f",&n,&p,&q,&a,&b); h=(b-a)/n;
for(i=0,x=a;i<=n;i++) {y=ftrigs(p,q,x); x=x+h; printf("y[%d]=%f\n",i,y);
}
return 1;
}
Пример 2. Необходимо подсчитать и вывести на экран все натуральные числа, меньшие некоторого числа M , для которых квадрат суммы их цифр равен заданному числу X . Значения M и X вводятся с клавиатуры. В функции SqrSumDig
47
проверяется, равно ли число x сумме квадратов цифр в числе n. Если такое равенство обнаруживается, то в главную функцию возвращается значение 1, в противном случае — 0. При этом используется условная тернарная операция.
#include <stdio.h>
int SqrSumDig(int n, int x)
{int nn,d,s; nn=n;
s=0;
do{
d=nn%10; s+=(d*d); nn=nn/10; }while(nn!=0);
return (s==x)? 1:0;
}
int main(){
int X, M, i, snum; printf("\n ‚Введите X и M "); scanf("%d %d",&X,&M); snum=0;
for(i=1;i<M;i++)
if(SqrSumDig(i,X)) {snum++;printf("%d ",i);}
printf("\nКол-во чисел с квадратом цифр = %d ,
меньших %d =%d\n",X,M,snum);
return 1;
}
Пример 3. Представляемая программа показывает возможность передавать в функцию не только данные скалярного типа, но и целые массивы. Программа с помощью функции SclProd вычисляет скалярное произведение двух векторов.
#include <stdio.h> #include <math.h> #define Lim 100
float SclProd(int k,float x[],float y[]) {int i;float v;
for(i=0,v=0;i<k;i++)
v+=x[i]*y[i];
48
return v;
}
int main()
{int n,i; float a[Lim],b[Lim],p; printf("Размерность векторов n= \n"); scanf("%d",&n);
printf("Введите %d координат вектора a: \n",n); for(i=0;i<=n;i++) scanf("%f",&a[i]); printf("Введите %d координат вектора b: \n",n); for(i=0;i<=n;i++) scanf("%f",&b[i]); p=SclProd(n,a,b);
printf("Скал. произв. векторов a и b = %f", p); return 1;
}
Пример 4. Рассмотренные ранее определения функций помещались перед вызывающей их функцией, т.е. перед главной. Стандарт языка Си предусматривает размещение определений функций и после вызывающей функции, однако требуется предварительное объявление функций в виде прототипов (принцип опережающего объявления).
Задача. В одномерном массиве вещественного типа найти максимальный элемент. Соответствующая программа содер-
жит три функции InputMas, OutputMas и MaxMas. Их прототипы прописаны в программе до описания главной функции. Полное определение этих функций следует за главной функцией. Отметим, что первые две функции не возвращают результатов, и поэтому перед их именами используется тип void. Вызов таких функций совпадает с форматом вызова процедур. Другая особенность: в описании первой функции в качестве одного из формальных параметров объявлен указатель, что позволяет не только передать, но и возвратить из функции необходимое значение.
#include <stdio.h> #define Lim 100
49
void InputMas(int *, double []); void OutputMas(int, double []); double MaxMas(int, double []);
int main(){
double a[Lim], max; int i,n=0; InputMas(&n,a); OutputMas(n,a); max=MaxMas(n,a);
printf("\nmax = %.2lf\n",max); return 1;
}
void InputMas(int* n, double m[]) {int i,nn;
do{
printf("Введите 0<n<=%d ",Lim); scanf("%d",&nn);
}while(n<=0 || n>Lim); printf("\nВводите элементы массива\n"); for(i=0;i<nn;i++){
printf("Введите элемент %d ",i+1); scanf("%lf",&m[i]);
}
*n=nn;
}
void OutputMas(int n, double m[]) {int i;
for(i=0;i<n;i++) printf(" %.2lf ",m[i]);
}
double MaxMas(int n, double m[]){ double max; int i;
max=m[0];
for(i=0;i<n;i++) if(m[i]>max) max=m[i];
return max;
}
50
