Ещё несколько учебных задач на C++
Все приложения - консольные, приведены готовые листинги, условия вставлены в начале комментариями. Темы - простые расчёты, рекурсия, сортировки, обработка матриц. Указатели ещё не изучались, код часто "детский", целую пару писал, однако :) Может быть, позднее перенесу что-то в "Алгоритмы".
/* Найти совершенные числа в диапазоне от 1 до 1000 Совершенным называется натуральное число, равное сумме своих делителей Пример: 6=1+2+3 */ #include <conio.h> #include <iostream.h> int soversh (int n) { int s=0; for (int j=1; j<=n/2; j++) { if (n%j==0) s+=j; } if (s==n) return 1; // return (s==n?1:0); else return 0; } void main () { clrscr(); for (int n=1; n<=1000; n++) { if (soversh(n)!=0) cout << n << ' '; } } /* Написать рекурсивную функцию для вычисления элемента ряда Фибоначчи с номером n. Соотношение ряда Фибоначчи задаётся формулой f(n)=f(n-1)+f(n-2), n=0,1,..., f(0)=0, f(1)=1 */ #include <iostream.h> #include <stdio.h> #include <stdlib.h> long int fibo (int n) { if (n==0) return 0; else if (n==1) return 1; else return (fibo(n-1)+fibo(n-2)); } void main () { int n; cout << "Введите число N "; cin >> n; if (n<0) { cout << "Число должно быть не меньше 0!"; getchar(); exit (1); } long int f; f = fibo (n); cout << "Число Фибоначчи с номером " << n << " = " << f; getchar(); } /* Написать программу для решения системы линейных алгебраческих уравнений (СЛАУ) методом Гаусса */ #include <iostream.h> #include <conio.h> #include <stdlib.h> void main () { const int n=3; //Размерность системы float a[n][n+1],a0[n][n+1]; //A - расширенная матрица системы, A0 - ее копия для проверки решения int i,j,k; float buf,x[n],b[n]; clrscr(); randomize (); cout << "Матрица и вектор правой части"; for (i=0; i<n; i++) { cout << endl; for (j=0; j<n+1; j++) { a0[i][j]=a[i][j]=1+random(100)/25.; //Нулевых элементов нет, деления на ноль не будет cout << a[i][j] << " "; } } //Прямой ход метода Гаусса for (i=0;i<n-1;i++) for (j=i+1;j<n;j++) { buf=a[i][i]/a[j][i]; for (k=0;k<=n;k++) a[j][k]=a[j][k]*buf-a[i][k]; } //Обратный ход метода Гаусса x[n-1]=a[n-1][n]/a[n-1][n-1]; for (i=n-2;i>=0;i--) { buf=0; for (j=i+1;j<n;j++) buf+=a[i][j]*x[j]; x[i]=(a[i][n]-buf)/a[i][i]; } cout << endl << "Решение" << endl; for (i=0; i<n; i++) cout << x[i] << " "; cout << endl << "Проверка" << endl; for (i=0; i<n; i++) { b[i]=0; for (j=0; j<n; j++) b[i]+=a0[i][j]*x[j]; cout << b[i] << " "; } } /* В заданной матрице a[n][m] найти: максимальные элементы строк; минимальные элементы столбцов. Использовать функции, работающие с параметром - одномерным массивом Матрицу заполнить случайными целыми числами */ #include <iostream.h> #include <stdlib.h> int max (int n,int a[]) { int m=a[0]; for (int i=1; i<n; i++) { if (a[i]>m) m=a[i]; } return m; } int min (int n,int a[]) { int m=a[0]; for (int i=1; i<n; i++) { if (a[i]<m) m=a[i]; } return m; } void main () { const int n=4; const int m=3; int a[n][m]; randomize (); cout << "Матрица"; for (int i=0; i<n; i++) { cout << endl; for (int j=0; j<m; j++) { a[i][j]=random (100); cout << a[i][j] << " "; } } cout << endl << "Максимумы в строках" << endl; for (i=0; i<n; i++) cout << "Строка " << i << ":" << max(m,a[i]) << endl; cout << "Минимумы в строках" << endl; for (int j=0; j<m; j++) { int b[n]; for (int i=0; i<n; i++) b[i]=a[i][j]; cout << "Столбец " << j << ":" << min(n,b) << endl; } } /* В заданной матрице a[n][m] найти: среднее арифметическое элементов строк с чётными номерами; произведение элементов, значения которых больше 2, в строках с нечётными номерами; количество элементов, крастных 3, в столбцах с нечётными номерами. Использовать функции, работающие с параметром - одномерным массивом. Матрицу заполнить случайными вещественными числами */ #include <iostream.h> #include <stdlib.h> float average (int n, float a[]) { float s=0; for (int i=0; i<n; i++) s+=a[i]; return (s/n); } float proizv2 (int n, float a[]) { float pr=1; for (int i=0; i<n; i++) if (a[i]>2) pr*=a[i]; return pr; } int count3 (int n, int a[]) { int k=0; for (int i=0; i<n; i++) if (a[i]%3==0) k++; return k; } void main () { const int n=50; const int m=100; float a[n][m]; randomize (); cout << "Матрица"; for (int i=0; i<n; i++) { cout << endl; for (int j=0; j<m; j++) { a[i][j]=random(100)/25.; cout << a[i][j] << " "; } } for (i=0; i<n; i+=2) { float av=average(m,a[i]); float pr=proizv2(m,a[i+1]); cout << endl << "Среднее стр." << i << "=" << av << " Произведение стр." << (i+1) << "=" << pr; } cout << endl << "Кол-во эл-тов, кратных 3" << endl; for (int j=1; j<m; j+=2) { int b[n]; for (int i=0; i<n; i++) b[i]=a[i][j]; //Дробные части отбросили! cout << "Столбец " << j << ":" << count3(n,b) << " "; } } /* Программа сортировки элементов одномерного целочисленного массива размерностью 10 */ #include <iostream.h> #include <stdlib.h> void main() { int a[10],i,j,c; randomize(); cout << endl <<"massiv do sortirovki "; for (i=0;i<10;i++){ a[i]=random (10); cout <<a[i] << " "; } for (i=0;i<9;i++) for (j=i+1;j<10;j++) if (a[i]>a[j]) { c=a[i]; a[i]=a[j]; a[j]=c; } cout << endl <<"massiv posle "; for (i=0;i<10;i++) cout<<a[i] << " "; } /* Программа сортировки элементов одномерного целочисленного массива размерностью 10 Метод пузырька (сортировка обменами) Число сравнений неоптимально, как его уменьшить? */ #include <iostream.h> #include <conio.h> #include <dos.h> #include <stdlib.h> void main() { int a[10],i,j,c; randomize(); for (i=0;i<10;i++) a[i]=random (10); for (j=0;j<9;j++) for (i=0;i<9;i++) if (a[i]>a[i+1]) { c=a[i]; a[i]=a[i+1]; a[i+1]=c; clrscr (); for (int k=0; k<10; k++) cprintf ("%d ",a[k]); delay (1000); } cout << endl <<"massiv posle "; for (i=0;i<10;i++) cout<<a[i] << " "; }
30.11.2011, 13:06 [19224 просмотра]