БлогNot. Ещё несколько учебных задач на C++

Ещё несколько учебных задач на 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] << " ";

}

теги: алгоритм c++ программирование

30.11.2011, 13:06; рейтинг: 17464