Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lab4.doc
Скачиваний:
3
Добавлен:
30.08.2019
Размер:
1.68 Mб
Скачать

МИНИСТЕРСТВО образованиЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ

Федеральное государственное бюджетное образовательное учреждение

высшего профессионального образования

«Донской государственный технический университет»

КАФЕДРА «ПОВТ И АС»

ЛАБОРАТОРНАЯ РАБОТА № 4

по дисциплине:

«Объектно-ориентированное программирование»

на тему:

«Использование указателей»

Выполнил: ст.гр. ВИ31

Малыгин А.Ю.

Проверила: Болдырева А.А.

г.Ростов-на-Дону

2012г.

Содержание.

  1. Постановка задачи

  2. Тестирование программы

  3. Листинг

  1. Постановка задачи

Цель: «Изучение основных приемов использования указателей в программировании на Си»

В условии лабораторной работы требует выполнить 4 задания, основанных на работе с указателями, передачи массивов и строк в функции и возврата из них, и скомпоновать все в один проект с использованием меню.

2. Тестирование программы

Результат тестирования можно посмотреть вложенном скриншоте:

int *mas1(){

static int mas[10];

wcout<<L"в функции через возвращаемое значение:\n";

for (int i=0;i<10;++i) {

mas[i]=rand();

cout<<mas[i]<<'\n';

}

return &mas[0];

}

void mas2(int *mas){

int*tmp=mas;

wcout<<L"в функции через аргумент:\n";

for (int i=0;i<10;++i) {

*mas++=rand();

cout<<*tmp++<<'\n';

}

}

int f1(){

int *i1;

wcout.imbue(locale(".866"));

i1=mas1();

wcout<<L"Результат через возвращаемое значение:\n";

for (int i=0;i<10;++i) {

cout<<*i1++<<'\n';

}

static int mm[10];

mas2(mm);

wcout<<L"Результат через передачу аргумента:\n";

for (int i=0;i<10;++i) {

cout<<mm[i]<<'\n';

}

getchar();

return 0;

}

Результат работы моей ужасной функции продемонстрирован на скриншоте, код не для слабонервных программистов:

int dlin(char *str){

int i=-1;

while (++i,*str++);

return i;

}

int prov(char * str,char *razd){

char *k=razd;

if (!*str) return 0;

while (*k) { if (!(*str-*k++)) return 0;}

return 1;

}

void obr(char *str,char *razd){

char tmp[50];

char word[50];

char *r;

r=str;

word[0]='-';

word[10]='\0';

int length=dlin(str);

int tmplength=length;

int k=0;

tmp[tmplength--]='\0';

while (*r) {

if (!*r || prov(r,razd)) {word[++k]=*r++;}

else {

if (k>0) while (tmp[tmplength--]=word[k--],k>0);

tmp[tmplength--]='_';

k=0;

*r++;

}

}

if (k>0) while (tmp[tmplength--]=word[k--],k);

for (k=0; k<=length;*str++=tmp[k++]);

}

int f2(){

static char str[50];

wcout.imbue(locale(".866"));

wcout<<L"Введите строку:\n";

scanf("%100[^\r\n]",str);

obr(str,"* .,;!?");

cout<<'\n'<<str;

getchar();

return 0;

}

А вот и результат работы моей четвертой программы:

double srgeom(int *a, int id, int jd){

int i,j,k=0;

double sum=0;

for (int i=0; i<id*jd;++i)

if (a[i]<0) (++k,sum+=(a[i]*a[i]));

sum/=k;

sum=sqrt(sum);

return sum;

}

const int n=3;

int f3(){

wcout.imbue(locale(".866"));

wcout<<L"исходная матрица:\n";

int mas[n][n]={

{1,-2,3},

{3,-4,5},

{3,6,-2}

};

for (int i=0; i<n; ++i) {

for (int j=0; j<n; ++j)

wcout<<' '<<mas[i][j];

cout<<'\n';

}

double k=srgeom(*mas,n,n);

wcout<<L"Среднее геометрическое равно = "<<k;

getchar();

return 0;

}

Результатом работы стала вот такая вот картинка:

int f(int x){

int s;

s=x*x;

return s;

}

void func(int *a, int left,int right, int n){

int k=0,ss=right-left;

for (double i=left; i<=right; i+=(double)(ss)/n){

*a++=(int)f(i);

}

}

int f4(){

wcout.imbue(locale(".866"));

wcout<<L"Введите левый и правый предел\n";

int left,right;

scanf("%d %d",&left,&right);

int a[11];

int n=right-left;

func(a,left,right,n);

cout<<left<<"-------------------------------------------\n";

int ymin=a[0],ymax=a[0];

for (int i=0; i<n; ++i) {if (a[i]<ymin) ymin=a[i]; if (a[i]>ymax) ymax=a[i];};

int yscr;

for (int i=0; i<n; ++i) { yscr=(int)(1+(double)(a[i]-ymin)/(ymax-ymin)*(49));

cout<<'|';

for (int j=0; j++<yscr; cout<<' ');

cout<<"x\n\r";

}

cout<<right<<'\n';

system("pause");

getchar();

return 0;

}

Это мегосложное задание продемонстрированно на данном скриншоте:

int main(){

wcout.imbue(locale(".866"));

int (*menu[4])()={&f1,&f2,&f3,&f4};

char c='a'; int k=0;

while (c!=13) {

wcout<<L"Меню:";

wcout<<L"\n\r№1-вывод рандомных массивов ";

if (k==0) cout<<'V';

wcout<<L"\n\r№2-вывод строки наоборот ";

if (k==1) cout<<'V';

wcout<<L"\n\r№3-вывод среднего геометрического ";

if (k==2) cout<<'V';

wcout<<L"\n\r№4-вывод функции х*х ";

if (k==3) cout<<'V';

c=getch();

if ((c=='w') || (c=='W')) if (k>0) --k;

if ((c=='s') || (c=='S')) if (k<3) ++k;

system("cls");

}

(*menu[k])();

system("pause");

return 0;

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]