Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
00002.doc
Скачиваний:
2
Добавлен:
01.03.2025
Размер:
130.56 Кб
Скачать

Задачи к экзамену по дисциплине «Структуры и алгоритмы компьютерной обработки данных»

  1. Написать программу для перевода числа из системы счисления с основанием 2 в систему счисления с основанием 9.

int n,a,k,t,i;

String str1="";

int main(int argc, char* argv[])

{

cout<<"VVedite chiclo v 2-i cicteme"<<endl;

cin>>n;

t=0;

i=0;

while(n>0)

{

a=n%10;

n=n/10;

t+=a*pow(2,i++);

};

cout <<"v 9-i sisteme ono ravno: ";

while (t!=0)

{

k=t%9;

t=t/9;

str1+=IntToStr(k);

}

for (int i=str1.Length(); i>=1;--i) cout<< str1[i];

}

  1. Написать программу для перевода десятичного числа в римские цифры и обратно.

int _tmain()

{

setlocale( LC_ALL, "Russian" );

int ar[13] = {1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 1000};

string rim[13] = {"I", "IV", "V", "IX", "X", "XL", "L", "XC", "C", "CD", "D", "CM", "M"};

string s;

int n;

s ="";

int i;

cout << "ВВедите арабское число = ";

cin >> n;

i = 12;

while (n > 0)

{

if (n < ar[i]) --i;

else{

s += rim[i];

n -= ar[i]; }

}

cout << "Римское число = "<<s<<endl;

s = "";

cout <<"ВВедите римское число = ";

cin >> s;

n = 0;

int v;

i = 12;

int k = 0;

while (i != -1)

{

int v = s.rfind(rim[i], 0);

if (v > -1) { n += ar[i];

if (rim[i].length() == 1)

{

for (int j = 0; j < s.length(); j++)

s[j] = s[j+1];

s.resize(s.length() - 1);

}

else{

for (int j = 0; j < s.length(); j++)

s[j] = s[j+1];

s.resize(s.length() - 1);

for (int j = 0; j < s.length(); j++)

s[j] = s[j+1];

s.resize(s.length() - 1);

}

}

else i--;

}

cout << "Арабское число = " << n << endl;

}

  1. Написать программу, вычисляющую сумму двух «длинных» чисел, произведение «длинного» числа на обычное целое, умножение «длинного» числа на степень 10.

int* sum(int* m1, int* m2)

{

for(int i=n-1; i>=0; --i)

{

temp=m1[i]+m2[i]+m3[i];

if (temp > 9)

{

m3[i]=temp%10;

temp1=temp/10;

m3[i-1]+=temp1;

} else m3[i]=temp;

}

return m3;

} ;

int* umn_na_10(int* m1, int ch)

{

temp=ch;

int k3 = n-1;

for(int k=0; k<temp; ++k)

{

for(int i=1; i<n; ++i)

{

m1[i]=m1[i+1];

}

m1[k3]=0;

}

return m1;

} ;

int* umn_na_cif(int* m1,int ch)

{

int* m3;

m3=new int[n];

for (int i=0; i<n; ++i) m3[i]=0;

for(int i=n-1; i>=0; --i)

{

temp=m1[i]*ch+m3[i];

if (temp > 9)

{

m3[i]=temp%10;

temp1=temp/10;

m3[i-1]+=temp1;

} else m3[i]=temp;

}

return m3;

} ;

  1. Написать программу, вычисляющую произведение двух «длинных» чисел. (см. задачу 3)

int* umn(int*m1,int* m2)

{

cozd_pust(m3);

cozd_pust(m4);

m4=umn_na_cif(m1,m2[n-1]);

for (int l=n-2; l>0; l--)

{

m3=umn_na_cif(m1,m2[l]);

m3=umn_na_10(m3,n-l-1);

m4=sum(m3,m4);

} ;

};

  1. Написать программу, вычисляющую частное и остаток от деления двух «длинных чисел».

  2. Написать программу, реализующую два простейших квадратичных алгоритма сортировки.

а. «пузырьком»

int a[100];

int n;

int temp;

void puzirok(int *m,int k)

{

int kk=k;

for(int j=0; j<kk-2;++j) {

for(int i=0; i<k-1; ++i)

{

if(m[i]>m[i+1]) {

temp=m[i];

m[i]=m[i+1];

m[i+1]=temp;

};

}

};

}

Int main(int argc, char* argv[])

{

cin>>n;

for(int i=0; i<n; ++i) cin>> a[i];

puzirok(a,n);

for(int i=0; i<n; ++i) cout << a[i];

б. Прямыми вставками

int a[10];

int n,k,j;

Int main(int argc, char* argv[])

{

cout << "kolich"<<endl;

cin >> n;

cout << "a"<<endl;

for (int i=1; i<=n; ++i) cin >> a[i];

for(int i=1; i<=n; ++i)

{

k=a[i];

for(j=i;(j>0)&&(a[j-1]>k);j--)

{

a[j]=a[j-1];

}

a[j]=k;

};

for (int i=1; i<=n; ++i) cout << a[i];

}

  1. Написать программу, реализующую пирамидальную сортировку массива данных.

const int N=100;

int a[N];

int n,t,temp,maxe,kol,nn;

void minim(int k)

{

kol=n-1;

maxe=k;

if ((k*2+2<=kol)&&(a[k*2+2]>a[maxe])) maxe=2*k+2;

if ((k*2+1<=kol)&&(a[k*2+1]>a[maxe])) maxe=2*k+1;

if (maxe!=k)

{

t=a[maxe];

a[maxe]=a[k];

a[k]=t;

minim(maxe);

}

};

void pir_sort()

{ nn=n;

while (n>1) {

temp=a[0];

a[0]=a[n-1];

a[n-1]=temp;

--n;

minim(0);

} ;

for (int l=0; l<nn; ++l) cout << a[l]<<' ';

cout << endl;

};

Int main(int argc, char* argv[])

{

cout << "Vvedite koli4estvo elementov"<<endl;

cin >> n;

cout << "VVedite posledovatelnost"<<endl;

for (int i=0; i<n; ++i) cin >> a[i];

pir_sort();

}

  1. Написать программу, реализующую сортировку слиянием массива данных.

int n;

int* mas; int* mas_new;

void sort(int l,int r)

{

if (l<r){

int q=(l+r)/2;

sort(l,q);

sort(q+1,r);

// дальше следует процедура слияния

int i=l;

int j=q+1;

int k=l;

while ((i<=q)&&(j<=r))

{

if (mas[i]<=mas[j])

{

mas_new[k]=mas[i];

i++; k++;

} else

{

mas_new[k]=mas[j];

j++; k++;

}

};

while (j<=r)

{

mas_new[k]=mas[j];

j++; k++;

} ;

while (i<=q)

{

mas_new[k]=mas[i];

i++; k++;

}

for (int i=l; i<=r; ++i) mas[i]=mas_new[i];

}

};

Int main(int argc, char* argv[])

{

cout << "vvedite pazmer"<<endl;

cin >> n;

mas = new int[n];

mas_new = new int[n];

cout << "vvedite massiv" << endl;

for (int i=0; i<n; i++) cin >> mas[i];

int l=0; int r=n-1;

// аналогично переписать оставшиеся элементы из левой половины

sort(l,r);

for (int i=0; i<n; i++) cout << mas[i];

}

  1. Написать программу, реализующую алгоритм быстрой сортировки.

int n,j,i;

int* mas;

void sort(int l, int r)

{

i=l;

j=r;

int x = mas[(l+r)/2]; //опорный средний

while (i<=j)

{

while (mas[i]<x) i++;

while (mas[j]>x) j--;

if (i<=j)

{

int temp=mas[i];

mas[i]=mas[j];

mas[j]=temp;

i++; j--;

}

if (l<j) sort(l,j);

if (i<r) sort(i,r);

}

};

Int main(int argc, char* argv[])

{

cout << "vvedite pazmer"<<endl;

cin >> n;

mas = new int[n];

cout << "Input mnochestvo"<<endl;

for (int i=0; i<n; ++i) cin >> mas[i];

sort(0,n-1);

for (int i=0; i<n; ++i) cout << mas[i]<< " ";

getch();

}

  1. Написать программу, выполняющую сортировку подсчетом набора целых чисел из диапазона от -1000 до 1000.

const int m = 30;

const int cou=100;

int n;

int a[cou];

int b[cou];

int c[m];