Исходник программы - Сортировка подсчетом рациональных дробей на Си(C++)
1)Определяется класс объектов массива, предназначенного для сортировки. Перегрузить для него операцию присваивания и операции сравнения <, <=, ==, >=, >.
2) Программа, сортирующую массив объектов построенного класса с помощью написанной параметризованной подпрограммы.
Код на C++ #include<stdio.h> #include<stdlib.h> #include<iostream.h> #include<conio.h> #define kol 5 class drob { protected : int m,n; public : void inrnd(int ); friend ostream& operator<<(ostream &, drob &); friend istream& operator>>(istream &, drob &); drob operator=(drob &q){m=q.m;n=q.n;return q;} int operator<=(drob q){if(m*q.n-q.m*n<=0)return 1;else return 0;} int operator<(drob q){if(m*q.n-q.m*n<0)return 1;else return 0;} int operator>=(drob q){if(m*q.n-q.m*n>=0)return 1;else return 0;} int operator>(drob q){if(m*q.n-q.m*n>0)return 1;else return 0;} int operator==(drob q){if(m*q.n-q.m*n==0)return 1;else return 0;} void delitel(float a1,float m1); }; void drob::inrnd(int n1=1) { m=random(20)+1; n=random(30)+1; delitel(m,n);} istream& operator>>(istream &fi,drob &fp) { cout<<"m=";scanf("%d",&fp.m); cout<<"n=";scanf("%d",&fp.n); if(fp.n<=0){cout<<"ERROR";exit(-1);} return fi;} void drob::delitel(float a1,float m1) { int k; float f=1; if(a1>m1){k=m1;} if(a1<m1){k=a1;} if(a1==0){a1++;} if(m1==0){m1++;} if(a1==m1){n=1;m=1;} for(float i=1;i<=k;i++) { if((a1/i)==int(a1/i)&((m1/i)==int(m1/i))){f=i;} } if(n<0&m>0){n=n*-1;m=m*-1;} m=m/f;n=n/f; } ostream &operator<<(ostream &fo,drob &fp){fo<<fp.m<<"/"<<fp.n;return fo;} template <class Type> void shell(Type *x, int n) { int i,j; Type *temp=new Type[n]; int *count=new int[n]; for (i=0;i<n;i++) temp[i]=x[i]; for (i=0; i<n; i++) count[i]=0; for (i=n-1; i>=1;i--) for(j=i-1; j>=0; j--) if (x[i]<x[j]) count[j]++; else count[i]++; for (i=0;i<n;i++) x[count[i]]=temp[i];} template <class Type>void print(Type *x,int n1) {for(int i=0;i<n1;i++){cout<<x[i]<<" ";}} void main() { clrscr(); randomize(); drob *mas; mas=new drob[kol]; int k1=1; //масив целых чиселы int *mas2=new int[kol]; for(int i=0;i<kol;i++){mas2[i]=random(40)*k1;k1*=-1;} cout<<"\n\nМассив целых чисел:\n"; print(mas2,kol); cout<<"\n\nОтсортированный массив:\n"; shell(mas2,kol); print(mas2,kol); //массив чисел с плавающей точкой float *mas3=new float[kol]; for(i=0;i<kol;i++){mas3[i]=random(30)+0.5;} cout<<"\n\nМассив чисел с плавающей точкой:\n"; print(mas3,kol);cout<<"\n\nОтсортированный массив:\n"; shell(mas3,kol); print(mas3,kol); for(i=0;i<kol;i++) {mas[i].inrnd(k1);k1*=-1;} cout<<"\n\n Массив объектов класса:\n"; for(i=0;i<kol;i++) {cout<<mas[i]<<" ";} //print(mas,kol); cout<<"\n\nОтсортированные объекты массива:\n"; shell(mas,kol); print(mas,kol); getch();}
|