当前位置:文档之家› 指针与结构体 上机

指针与结构体 上机

指针1.在主函数中输入一个字符串str,调用函数统计字符串中出现的字母(含大小写)、数字、空格及其他字符出现的次数,在主函数中输出统计结果。

要求写三个版本的程序:(1)用指针作参数返回统计结果。

(2)用引用做参数返回统计结果(引用做参数效率更高,代码更简单。

)(3)用数组做参数返回统计结果(当返回多个同类型结果时用数组做参数更简单)。

1.#include<iostream>using namespace std;void stat(char *str,int *letters,int *digits,int *others){char c;for(char *str;*str!='\0';str++){c=*str;if((c>'a'&&c<'z')||(c>'A'&&c<'Z'))(*letters)++;else if('0'<=c&&c<='9')(*digits)++;else(*others)++;}}void main(){char str[100];cin.getline(str,100);int letters=0;int digits=0;int others=0;stat(str,&letters,&digits,&others);cout<<"letters="<<letters<<endl;cout<<"digits"<<digits<<endl;cout<<"others"<<others<<endl;}2. #include<iostream>#include<iomanip>using namespace std;void stat(char *str,int *a){char c;for(int i=0;str[i]!='\0';i++){c=str[i];if((c>'a'&&c<'z')||(c>'A'&&c<'Z'))a[0]++;else if('0'<=c&&c<='9')a[1]++;else if(c=' ')a[2]++;elsea[3]++;}}void main(){char str[100];cin.getline(str,100);int a[4]={0};stat(str,a);char*ss[4]={"letters=","digits=","space=","others="}; for(int i=0;i<4;i++)cout<<setw(10)<<str[i]<<setw(5)<<a[i];}2.在主函数中输入n个整数到数组中,调用函数完成将数组中的最小值与第0个元素对调,将数组中的最大值与最后一个元素对调,主函数中输出调换后的数组。

#include<iostream>using namespace std;const int N = 10;void fun(int *a, int size){int max, min, tmp;int record1, record2;min = max = a[0];record1 = record2 = 0;for (int i = 0; i<size; i++){if (max < a[i]){max = a[i];record1 = i;}if (min >a[i]){min = a[i];record2 = i;}}tmp = a[0];a[0] = a[record2];a[record2] = tmp;tmp = a[size - 1];a[size - 1] = a[record1];a[record1] = tmp;}int main(){int arry[N];void(*p)(int *, int);p = fun;cout<<"调换之前\n";for (int i = 0; i<N; i++){cin>>arry[i];}p(arry, N);cout<<"调换之后";for (int i = 0; i<N; i++){cout<<arry[i];}cout<<"\n";while (getchar() == '\n');}如果随机生成10个数,如何修改程序???3.定义函数求数组前十个元素和后十个元素之和。

#include<iostream>using namespace std;int fs(int*array, int n){int s = 0;for (int i = 0; i < n; i++)s += (*array++);return(s);}void main(){int a[15];for (int i = 0; i < 15; i++)cin >> a[i];int shead;int stail;shead = fs(a, 10);stail = fs(&a[5], 10);cout << "前十个元素的和" << shead << "后十个元素的和" << stail;}4.在主函数中定义并初始化一个4*5的二维数组,调用函数求出该二维数组的鞍点,并通过行列下标变量指针返回鞍点的行列下标值。

鞍点:元素值在行中最大,列中最小。

函数参数:二维数组名,行下标指针,列下标指针。

#include<iostream>using namespace std;int num[4][5] = {4, 2, 3, 1,0, 9, 8, 6,7, 5, 2, 2,5, 7, 5, 9,4, 9, 8, 5,};void FunMin(int* min, int* x, int* y){*min = num[0][0];*x = *y = 0;for (int i = 0; i <4;i++)for(int j = 0; j < 5;j++)if(*min > num[i][j]){*min = num[i][j];*x = i;*y = j;}}void FunMax(int* max, int* x, int* y){*max = num[0][0];*x = *y = 0;for(int i = 0; i <4 ; ++i)for(int j = 0; j < 5; ++j)if(*max < num[i][j]){*max = num[i][j];*x = i;*y = j;}}void main(){int max, min, x, y;FunMin(&min,& x,& y);cout << "Min=" << min << " x=" << x << " y=" << y << endl;FunMax(&max, &x, &y);cout << "Max=" << max << " x=" << x << " y=" << y << endl; }5.上一题的函数参数改为:二维数组名,行下标引用,列下标引用,完成相同的功能。

#include<iostream>using namespace std;int num[4][5] = {4, 2, 3, 1,0, 9, 8, 6,7, 5, 2, 2,5, 7, 5, 9,4, 9, 8, 5,};void FunMin(int& min, int& x, int& y){min = num[0][0];x = y = 0;for(int i = 0; i < 4; ++i)for(int j = 0; j < 5; ++j)if(min > num[i][j]){min = num[i][j];x = i;y = j;}}void FunMax(int& max, int& x, int& y){max = num[0][0];x = y = 0;for(int i = 0; i <4 ; ++i)for(int j = 0; j < 5; ++j)if(max < num[i][j]){max = num[i][j];x = i;y = j;}}void main(){int max, min, x, y;FunMin(min, x, y);cout << "Min=" << min << " x=" << x << " y=" << y << endl;FunMax(max, x, y);cout << "Max=" << max << " x=" << x << " y=" << y << endl; }6.在主函数中定义一个含有12个指针的指针数组,令它的数组元素分别指向12个月份组成的字符串常量,循环输入数字月份,则输出相应月份的字符串。

相关主题