МИНИСТЕРСТВО образованиЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
Федеральное государственное бюджетное образовательное учреждение
высшего профессионального образования
«Донской государственный технический университет»
КАФЕДРА «ПОВТ И АС»
ЛАБОРАТОРНАЯ РАБОТА № 4
по дисциплине:
«Объектно-ориентированное программирование»
на тему:
«Использование указателей»
Выполнил: ст.гр. ВИ31
Малыгин А.Ю.
Проверила: Болдырева А.А.
г.Ростов-на-Дону
2012г.
Содержание.
Постановка задачи
Тестирование программы
Листинг
Постановка задачи
Цель: «Изучение основных приемов использования указателей в программировании на Си»
В условии лабораторной работы требует выполнить 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;
}