1. 要求用指针或引用方法处理:输入3个整数,按由小到大顺序处理。
思路:
(1)主函数:输入三个数,用指针指向它们,然后比大小,并交换顺序;
(2)比较函数:每次交换都把当前两个值里最小的放在前面,即:第一个和第二个比,如果第一个大,则交换这两个,然后用当前的第一个和第三个比,若第三个大,则交换一三,此时的第一个位置的数是当前最小的,最后比较二三,小的放在前面;
(3)交换函数:将传入的两个地址所指向的值交换
(4)关于指针变量使用的几个说明:
a. 作为函数声明时,可以不写变量名,只写类型;
b. 在*出现在变量定义、函数声明及定义时,可以理解为表示类型,也就是指针类型的标志符号;
c. 在给指针类型赋值时,应不用*,因为此时的*表示取出所指向的数字,因此只用变量名即可,如p1 = &a
d. 在函数定义时,指针型变量要带*,在用指针所指向的值时,要带*,如swap函数的定义和内容。
//要求用指针或引用方法处理:输入3个整数,按由小到大顺序处理。
#include <iostream>
using namespace std;
int main()
{
void exchange(int *, int *, int *);
int a,b,c,* p1,* p2,* p3;
cin >> a >> b >> c;
p1 = &a; p2 = &b; p3 = &c;
exchange(p1,p2,p3);
cout << a << " " << b << " " <<c;
}
void exchange(int * q1, int * q2, int * q3)
{
void swap(int *, int *);
if(* q1 > * q2) swap(q1,q2);
if(* q1 > * q3) swap(q1,q3);
if(* q2 > * q3) swap(q2,q3);
}
void swap(int *t1, int *t2)
{
int temp;
temp = * t1;
* t1 = * t2;
* t2 = temp;
}
2. 要求用指针或引用方法处理:输入3个字符串,按由小到大的顺序输出。
用字符数组的方法:
//要求用指针或引用方法处理:输入3个字符串,按由小到大的顺序输出。
#include <iostream>
using namespace std;
int main()
{
void swap(char *, char *);
char s1[20],s2[20],s3[20],*p1,*p2,*p3;
gets(s1);
gets(s2);
gets(s3);
//cin >> s1 >> s2 >>s3;//用cin也可以
p1 = s1;p2 = s2;p3=s3;//等价于p1 = &s1[0];p2 = &s2[0]; p3 = &s3[0];
if (strcmp(s1,s2)>0) swap(p1,p2);
if (strcmp(s1,s3)>0) swap(p1,p2);
if (strcmp(s2,s3)>0) swap(p1,p2);
cout << s1 << " " << s2 << " " << s3;
}
void swap(char *q1, char *q2)
{
char p[20];
strcpy(p,q1);
strcpy(q1,q2);
strcpy(q2,p);
}
思路同上题,要说明的几点如下:
(1)char s1[20]是定义了字符串数组,因为char s1只能定义一个字符变量(一个字符),而不能定义字符串;
(2)关于cin和gets(),cin不接受空格,TAB等键的输入,遇到这些键,字符串会终止,而gets()则接受连续的输入,包括空格,TAB。
例子如下:
#include<iostream>
using namespace std;
int main()
{
char str[20];
cin>>str;
cout<<str<<endl;
return 0;
}
输入:abc abc
输出:abc
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
char str[20];
gets(str);
cout<<str<<endl;
return 0;
}
输入:abc abc
输出:abc abc
详细说明见:https://www.cnblogs.com/wft1990/p/5861529.html
(3)指针变量(地址)赋值时,如果用字符串数组s1就不用取址符号&,因为数组名本身就表示该数组的首地址,而如果想用取址符号&,就需要把数组的第一个元素赋给它,这两种形式是等效的。
(4)在交换函数中,由于字符串数组名本身也是地址,所以直接传入p1和p2给strcpy是可以的。
用字符变量和引用的方法:
#include <iostream>
#include <string>
using namespace std;
int main()
{void change(string &,string &);
string str1=" ",
str2=" ",
str3=" ";
char *p1=&str1[0],*p2=&str2[0],*p3=&str3[0];
cout<<"input three line:"<<endl;
gets(p1);
gets(p2);
gets(p3);
if(str1>str2)change(str1,str2);
if(str1>str3)change(str1,str3);
if(str2>str3)change(str2,str3);
cout<<endl<<"Now,the order is:"<<endl;
cout<<str1<<endl<<str2<<endl<<str3<<endl;
return 0;
}
void change(string &st1,string &st2) /* 交换两个字符串 */
{string st;
st=st1;st1=st2;st2=st;
}
3. 要求用指针或引用方法处理:输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。写3个函数:
(1) 输入10个数;
(2)进入处理;
(3)输出10个数。
#include <iostream>
using namespace std;
int main()
{
int number[10];
void input(int *number);
void max_min_number(int *number);
void output(int *number);
input(number);//数组名可以直接作为指针引用,因为都表示的首地址
max_min_number(number);
output(number);
return 0;
}
void input(int *number)
{
int i;
cout<<"input 10 numbers:";
for (i=0;i<10;i++)
cin >> number[i];
}
void max_min_number(int *number)
{
int *max,*min,*p,temp;
max=min=number;
for(p=number+1;p<number+10;p++)
{
if(*p>*max) max=p; // 将大数地址赋给 max
else if(*p<*min) min=p; // 将小数地址赋给 min
}
if(max != number) //若最大值就在最后一个位置或最小值就在第一个位置则不必交换
{temp=number[0];number[0]=*min;*min=temp; } // 将最小数与第一数交换
if(min != number)
{temp=number[9];number[9]=*max;*max=temp;} // 将最大数与最后一数交换
}
void output(int *number) // 输出函数
{
int *p;
cout<<"now,they are: ";
for (p=number;p<number+10;p++)
cout<<*p<<" ";
cout<<endl;
return;
}
此题注意:数组名在引用的操作底层,形参数组名会被作为指针变量处理,来接收实参传入的地址变量,此题代码直接把形参定义为指针的形式,实参的数组名进入自然会被当做指针来处理,若是形参写成数组的形式,处理的机制也是相同的,即当做指针变量来处理,只是看上去是数组的形式而已。
4. 要求用指针或引用方法处理:
有n个整数,使前面各数顺序向后移m个位置,最后m个数变成最前面m个数,见下图,写一个函数实现以上功能,在主函数中输入n个整数和输出调整后的n个数。
思路:将原始数组每个数字后移一位,然后递归m次移动
#include <iostream>
using namespace std;
int main()
{
void move(int *number,int n,int m);
int number[20];
int n,m,i;
cout << "input n,m:";
cin >> n >> m;
cout <<"input numbers:";
for(i = 0; i<n; i++)
cin >> number[i];
move(number,n,m);
cout<<"result:"<<endl;
for (i=0;i<n;i++)
cout<<number[i]<<" ";
cout<<endl;
return 0;
}
void move(int *number,int n, int m)
{
//先向后移一位
int end,*p;
end = *(number +n -1);//取值
for(p = number+n-1;p>number;p--)
*p = *(p-1);//换地址里的值
*number = end; //换值
m--;
if (m>0) move(number,n,m); //递归调用,当循环次数m减至为0时,停止调用
}
需要注意的是:在函数move中所有交换操作都是对值进行的,而不能写成p=p-1等,因为对地址的交换无法改变该地址指向的值,因此必须改变地址里的值才可以。
5.要求用指针或引用方法处理:
有n个人围成一圈 顺序排号 从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的人原来排在第几号
思路:该题是个约瑟夫环的问题,下边过程是将问题描述的过程,编号用指针变量表示,具体实现仍需再次思考。
#include <iostream>
using namespace std;
int main()
{
int i,k,m,n,*p,num[50];
cout<<"input number of person: n=";
cin>>n;
p=num;
for (i=0;i<n;i++)
*(p+i)=i+1; // 以1至n为序给每个人编号
i=0; // i为每次循环时计数变量
k=0; // k为按1,2,3报数时的计数变量
m=0; // m为退出人数
while (m<n-1) // 当退出人数比n-1少时(即未退出人数大于1时)执行循环体
{
if (*(p+i)!=0) k++;
if (k==3) // 将退出的人的编号置为0
{
*(p+i)=0;
k=0;
m++;
}
i++;
if (i==n) i=0; // 报数到尾后,i恢复为0
}
while(*p==0) p++;
cout<<"The last one is NO."<<*p<<endl;
return 0;
}
可参考最简单的数学解法思路:https://www.cnblogs.com/cmmdc/p/7216726.html
6.要求用指针或引用方法处理:写一函数,求一个字符串的长度。在main函数中输入字符串,并输出其长度。
#include <iostream>
using namespace std;
int main()
{
int length(char *p);
int len;
char str[20];
cout<<"input string:";
cin>>str;
len=length(str);
cout<<"The length of string is "<<len<<endl;
return 0;
}
int length(char *p)
{
int n;
n = 0;
while(*p!='\0')
{
n++;
p++;
}
return n;
}
7.要求用指针或引用方法处理:
有一字符串,包含n个字符。写一函数,将此字符串中从第m个字符开始的全部字符复制成为另一个字符串。
//有一字符串,包含n个字符。写一函数,将此字符串中从第m个字符开始的全部字符复制成为另一个字符串。
#include <iostream>
using namespace std;
int main()
{
void copystr(char *p1,char *p2,int m);
char s1[20],s2[20];
cout << "string1 is:";
cin >> s1;
cout <<"string2 is:";
cin >> s2;
cout <<"m is: ";
int m;
cin >> m;
cout << "the result is: ";
copystr(s1,s2,m);
cout <<s2;
return 0;
}
void copystr(char *p1,char *p2,int m)
{
int n;
n=0;
while (n<m-1)
{
n++;
p1++;
}
while(*p1 != '\0')
{
*p2 = *p1;
p1++;
p2++;
}
*p2 = '\0';
}
此题注意:函数copystr中上来用了个循环把指针p1放到s1的第m个字母的位置,不能用*p1 = *(p1+m-1)是因为后者只是单纯把第m个地址赋给p1,而没有移动p1,因此这样不是在m个之后做的改变而是仍从开始做的改变,但是可以写成p1 = p1+m-1,这是对地址的改变,结果与while()循环的结果一致。
8. 要求用指针或引用方法处理: 输入一行文字 找出其中的大写字母、小写字母、空格、数字以及其他字符各有多少。
//输入一行文字 找出其中的大写字母、小写字母、空格、数字以及其他字符各有多少。
#include <iostream>
using namespace std;
int main()
{
int upper=0,lower=0,digit=0,space=0,other=0,i=0;
char *p,s[20];
cout<<"input string:";
while ((s[i]=getchar())!='\n') i++;
p=s;
while (*p!='\n')
{
if (('A'<=*p) && (*p<='Z'))
upper++;
else if (('a'<=*p) && (*p<='z'))
lower++;
else if (*p==' ')
space++;
else if ((*p<='9') && (*p>='0'))
digit++;
else
other++;
p++;
}
cout<<"upper case:"<<upper<<endl<<"lower case:"<<lower<<endl;
cout<<"space:"<<space<<endl<<"digit:"<<digit<<endl<<"other:"<<other<<endl;
return 0;
}
9. 要求用指针或引用方法处理:写一函数 将一个3x3的整型矩阵转置
思路:数组的指针是一条龙排列下来的,若只用一个指针,转置对中的两个元素的序列号分别是p+3*i+j以及p+3*j+i。
//要求用指针或引用方法处理:写一函数 将一个3x3的整型矩阵转置
#include <iostream>
using namespace std;
int main()
{
void move(int *p);
int a[3][3],*p,i;
cout << "input : ";
for(i = 0; i <3; i++)
cin >>a[i][0] >> a[i][1] >>a[i][2];
p = &a[0][0];
move(p);
cout<<"Now,matrix:"<<endl;
for (i=0;i<3;i++)
cout<<a[i][0]<<" "<<a[i][1]<<" "<<a[i][2]<<endl;
cout<<endl;
return 0;
}
void move(int *p)
{
int i,j,t;
for(i = 0; i < 3; i++)
for(j = i; j < 3; j++)
{
t = *(p + 3*i + j);
*(p + 3*i + j) = *(p +3*j +i);
*(p + 3*j +i) = t;
}
}
10. 要求用指针或引用方法处理:
将一个5 * 5的矩阵中最大的元素放在中心,4个角分别放4个最小的元素(顺序为从左到右,从上到下顺序依次从小到大存放),写一函数实现之。用main函数调用。
//将一个5*5的矩阵中最大的元素放在中心,4个角分别放4个最小的元素(顺序为从左到右,从上到下顺序依次从小到大存放),写一函数实现之。用main函数调用。
#include <iostream>
using namespace std;
int main()
{
void change(int *p);
int a[5][5],*p,i,j;
cout<<"input matrix:"<<endl;
for (i=0;i<5;i++) //输入矩阵
for (j=0;j<5;j++)
cin>>a[i][j];
p=&a[0][0]; //使p指向0行0列元素
change(p); //调用函数,实现交换
cout<<"Now,matrix:"<<endl;
for (i=0;i<5;i++) //输出已交换的矩阵
for (j=0;j<5;j++)
{
cout<<a[i][j]<<" ";
cout<<endl;
}
return 0;
}
void change(int *p)
{
int i,j,temp;
int *pmax,*pmin;
pmax=p;
pmin=p;
for (i=0;i<5;i++) //找最大值和最小值的地址,并赋给 pmax,pmin
for (j=i;j<5;j++)
{
if (*pmax<*(p+5*i+j)) pmax=p+5*i+j;
if (*pmin>*(p+5*i+j)) pmin=p+5*i+j;
}
temp=*(p+12); //将最大值与中心元素互换
*(p+12)=*pmax;
*pmax=temp;
temp=*p; //将最小值与左上角元素互换
*p=*pmin;
*pmin=temp;
pmin=p+1;
//将a[0][1]的地址赋给pmin,从该位置开始找最小的元素
for (i=0;i<5;i++) //找第二最小值的地址赋给 pmin
for (j=0;j<5;j++)
if (((p+5*i+j)!=p) && (*pmin > *(p+5*i+j))) pmin=p+5*i+j;
temp=*pmin; //将第二最小值与右上角元素互换
*pmin=*(p+4);
*(p+4)=temp;
pmin=p+1;
for (i=0;i<5;i++) //找第三最小值的地址赋给pmin
for (j=0;j<5;j++)
if(((p+5*i+j)!=(p+4)) && ((p+5*i+j)!=p) &&(*pmin>*(p+5*i+j))) pmin=p+5*i+j;
temp=*pmin; // 将第三最小值与左下角元素互换
*pmin=*(p+20);
*(p+20)=temp;
pmin=p+1;
for (i=0;i<5;i++) // 找第四最小值的地址赋给pmin */
for (j=0;j<5;j++)
if (((p+5*i+j)!=p) &&((p+5*i+j)!=(p+4)) && ((p+5*i+j)!=(p+20)) && (*pmin>*(p+5*i+j)))
pmin=p+5*i+j;
temp=*pmin; //将第四最小值与右下角元素互换
*pmin=*(p+24);
*(p+24)=temp;
}
11. 要求用指针或引用方法处理:在主函数输入10个等长的字符串。用另一函数对它们排序。然后在主函数输出这10个已经排好序的字符串。
//要求用指针或引用方法处理:在主函数输入10个等长的字符串。用另一函数对它们排序。然后在主函数输出这10个已经排好序的字符串。
#include <iostream>
using namespace std;
int main()
{
void sort(char str[][6]);
int i;
char str[10][6];
cout<<"input 10 strings:"<<endl;
for (i=0;i<10;i++)
cin>>str[i];//优先给数组的第一个维度即行来赋值
sort(str);
cout<<"Now,the sequence is:"<<endl;
for (i=0;i<10;i++)
cout<<str[i]<<endl;
return 0;
}
void sort(char s[][6])
{
int i,j;
char *p,temp[10];
p=temp;//设置10个放替换元素的空间,若只设置一个会报出空间被占的错误
for (i=0;i<9;i++) //冒泡
for (j=0;j<9-i;j++)
if (strcmp(s[j],s[j+1])>0)
{strcpy(p,s[j]);
strcpy(s[j],s[j+1]);
strcpy(s[j+1],p);
}
}
12. 用指针数组处理第11题,字符串不等长。
//用指针数组处理第11题,字符串不等长。
#include <iostream>
using namespace std;
int main()
{
void sort(char *p[]);
char *p[10],str[10][20];
int i;
//将指针数组初始化,即以此附上待排序数组的地址
for(i=0;i<10;i++)
p[i] = str[i];
cout<<"input 10 strings:"<<endl;
for(i=0;i<10;i++)
cin >> str[i];
sort(p);
cout<<"Now,the sequence is:"<<endl;
for (i=0;i<10;i++)
cout<<p[i]<<endl;
return 0;
}
void sort(char *p[])
{
int i,j;
char *temp;
for(i=0;i<9;i++)
for(j=0;j<9-i;j++)
if(strcmp(p[j],p[j+1])>0)
{
temp = p[j];//指针数组中的每个元素仍为地址
p[j] = p[j+1];
p[j+1] = temp;
}
}
13.写一个用矩形法求定积分的通用函数 分别求:
//写一个用矩形法求定积分的通用函数 分别求:sinx cosx ex
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
float integral(float (*p)(float),float a,float b,int n);
float a1,b1,a2,b2,a3,b3,c,(*p)(float);
float fsin(float); // 对fsin函数作声明
float fcos(float); // 对fcos函数作声明
float fexp(float); // 对fexp函数作声明
int n=20;//步长
cout<<"input a1,b1:"; //输入求sin(x) 定积分的下限和上限
cin>>a1>>b1;
cout<<"input a2,b2:"; // 输入求cos(x) 定积分的下限和上限
cin>>a2>>b2;
cout<<"input a3,b3:"; // 输入求#include <iostream>
cin>>a3>>b3;
p=fsin;
c=integral(p,a1,b1,n); // 求出sin(x)的定积分
cout<<"The integral of sin(x) is :"<<c<<endl;
p=fcos;
c=integral(p,a2,b2,n); // 求出cos(x)的 定积分
cout<<"The integral of cos(x) is :"<<c<<endl;;
p=fexp;
c=integral(p,a3,b3,n); // 求出 的定积分
cout<<"The integral of exp(x) is :"<<c<<endl;
return 0;
}
float integral(float (*p)(float),float a,float b,int n)
//用矩形法求定积分的通用函数
{
int i;
float x,h,s;
h=(b-a)/n;
x=a;
s=0;
for (i=1;i<=n;i++)
{x=x+h;
s=s+(*p)(x)*h;
}
return(s);
}
float fsin(float x) // 计算sin(x) 的函数
{return sin(x);}
float fcos(float x) // 计算cos(x) 的函数
{return cos(x);}
float fexp(float x) // 计算exp(x)的函数
{return exp(x);}
14. 将n个数按输入时顺序的逆序排列,用函数实现
思路:从中间分开,两两交换位置,两个指针分别指即可
//将n个数按输入时顺序的逆序排列,用函数实现
#include <iostream>
using namespace std;
int main()
{
void sort (char *p,int m);
int i,n;
char *p,num[20];
cout<<"input n:";
cin>>n;
cout<<"please input these numbers:"<<endl;
for (i=0;i<n;i++)
cin>>num[i];
p=&num[0];
sort(p,n);
cout<<"Now,the sequence is:"<<endl;
for (i=0;i<n;i++)
cout<<num[i]<<" ";
cout<<endl;
return 0;
}
void sort (char *p,int m) // 将n个数逆序排列函数
{
int i;
char temp, *p1,*p2;
for (i=0;i<m/2;i++)
{p1=p+i;
p2=p+(m-1-i);
temp=*p1;
*p1=*p2;
*p2=temp;
}
}
15. 有一个班4个学生,5门课程。①求第1门课程的平均分;②找出有两门以上课程不及格的学生,输出他们的学号和全部课程成绩及平均成绩;③找出平均成绩在90分以上或全部课程成绩在85分以上的学生。分别编3个函数实现以上的要求。
#include <iostream>
using namespace std;
int main()
{
void avsco(float *,float *);
void avcour1(char (*)[10],float *);
void fail2(char course[5][10],int num[],float *pscore,float aver[4]);
void good(char course[5][10],int num[4],float *pscore,float aver[4]);
int i,j,*pnum,num[4];
float score[4][5],aver[4],*pscore,*paver;
char course[5][10],(*pcourse)[10];
cout<<"input course:"<<endl;
pcourse=course;
for (i=0;i<5;i++)
cin>>course[i];
cout<<"input NO. and scores:"<<endl;
cout<<"NO.";
for (i=0;i<5;i++)
cout<<","<<course[i];
cout<<endl;
pscore=&score[0][0];
pnum=&num[0];
for (i=0;i<4;i++)
{cin>>*(pnum+i);
for (j=0;j<5;j++)
cin>>*(pscore+5*i+j);
}
paver=&aver[0];
cout<<endl<<endl;
avsco(pscore,paver); // 求出每个学生的平均成绩
avcour1(pcourse,pscore); // 求出第一门课的平均成绩
cout<<endl<<endl;
fail2(pcourse,pnum,pscore,paver); // 找出两门课不及格的学生
cout<<endl<<endl;
good(pcourse,pnum,pscore,paver); // 找出成绩好的学生
return 0;
}
void avsco(float *pscore,float *paver) // 求每个学生的平均成绩的函数
{
int i,j;
float sum,average;
for (i=0;i<4;i++)
{sum=0.0;
for (j=0;j<5;j++)
sum=sum+(*(pscore+5*i+j)); //累计每个学生的各科成绩
average=sum/5; //计算平均成绩
*(paver+i)=average;
}
}
void avcour1(char (*pcourse)[10],float *pscore) // 求第一课程的平均成绩的函数
{
int i;
float sum,average1;
sum=0.0;
for (i=0;i<4;i++)
sum=sum+(*(pscore+5*i)); //累计每个学生的得分
average1=sum/4; //计算平均成绩
cout<<"course 1: "<<*pcourse<<",average score:"<<average1<<endl;
}
void fail2(char course[5][10],int num[],float *pscore,float aver[4])
// 找两门以上课程不及格的学生的函数
{
int i,j,k,labe1;
cout<<" ==========Student who failed in two courses ======= "<<endl;
cout<<"NO. ";
for (i=0;i<5;i++)
cout<<course[i]<<" ";
cout<<" average"<<endl;
for (i=0;i<4;i++)
{labe1=0;
for (j=0;j<5;j++)
if (*(pscore+5*i+j)<60.0) labe1++;
if (labe1>=2)
{cout<<num[i]<<" ";
for (k=0;k<5;k++)
cout<<*(pscore+5*i+k)<<" ";
cout<<" "<<aver[i]<<endl;
}
}
}
void good(char course[5][10],int num[4],float *pscore,float aver[4])
// 找成绩优秀学生(全部课程成绩在85分以上或平均成绩在90分以上)的函数
{
int i,j,k,n;
cout<<" ======Students whose score is good======"<<endl;
cout<<"NO. ";
for (i=0;i<5;i++)
cout<<course[i]<<" ";
cout<<" average"<<endl;
for (i=0;i<4;i++)
{n=0;
for (j=0;j<5;j++)
if (*(pscore+5*i+j)>85.0) n++;
if ((n==5)||(aver[i]>=90))
{cout<<num[i]<<" ";
for (k=0;k<5;k++)
cout<<*(pscore+5*i+k)<<" ";
cout<<" "<<aver[i]<<endl;
}
}
}
16. 输入一个字符串,内有数字和非数字字符,例如:
a123x456 17960? 302tab5876
将其中连续的数字作为一个整数,依次存放到一数组a中。例如,123存入在a[0],456存放在a[1]……统计共有多少整数,并输出这些数。
#include <iostream>
using namespace std;
int main()
{char str[50],*pstr;
int i,j,k,m,e10,digit,ndigit,a[10],*pa;
cout<<"input a string:"<<endl;
gets(str);
cout<<endl;
pstr=&str[0]; //字符指针pstr指向数组str首元素
pa=&a[0]; //指针pa指向a数组首元素
ndigit=0; //ndigit代表有多少个整数
i=0; //i代表字符串中的第几个字符/
j=0; //j代表连续数字的位数
while(*(pstr+i)!='\0')
{if((*(pstr+i)>='0') && (*(pstr+i)<='9'))
j++;
else
{if (j>0)
{digit=*(pstr+i-1)-48; //将个数位赋予digit
k=1;
while (k<j) //将含有两位以上数的其它位的数值累计于digit
{e10=1;
for (m=1;m<=k;m++)
e10=e10*10; //e10代表该位数所应乘的因子
digit=digit+(*(pstr+i-1-k)-48)*e10; //将该位数的数值累加于digit
k++; //位数k自增
}
*pa=digit; //将数值放在数组a中
ndigit++;
pa++; //指针pa指向a数组下一元素
j=0;
}
}
i++;
}
if (j>0) //以数字结尾字符串的最后一个数据
{digit=*(pstr+i-1)-48; //将个数位赋予digit
k=1;
while (k<j) // 将含有两位以上数的其它位的数值累加于digit
{e10=1;
for (m=1;m<=k;m++)
e10=e10*10; //e10代表位数所应乘的因子
digit=digit+(*(pstr+i-1-k)-48)*e10; //将该位数的数值累加于digit
k++; /*位数K自增*/
}
*pa=digit; //将数值放到数组a中
ndigit++;
j=0;
}
printf("There are %d numbers in this line. They are:\n",ndigit);
j=0;
pa=&a[0];
for (j=0;j<ndigit;j++) //打印数据
cout<<*(pa+j)<<endl;
cout<<endl;
return 0;
}
17. 写一函数,实现两个字符串的比较,即自己写一个strcmp函数,函数原型为
int strcmp(char *p1,char *p2);
设p1指向字符串s1,p2指向字符串s2。要求当s1=s2时,返回值为0,若s1!=s2返回 他们二者第一个不同字符的ASCII码差值(如“BOY”与“BAD”,第二个字母不同,“O”与“A”之差为79-65=14)。如果s1>s2,则输出正值,如果s1<s2,则输出负值。
//写一函数,实现两个字符串的比较,即自己写一个strcmp函数
#include <iostream>
using namespace std;
int main()
{
int strcmp(char *p1,char *p2);
int m;
char str1[20],str2[20],*p1,*p2;
cout<<"input two strings:"<<endl;
cin>>str1;
cin>>str2;
p1=&str1[0];
p2=&str2[0];
m=strcmp(p1,p2);
cout<<"result:"<<m<<endl;
return 0;
}
int strcmp(char *p1,char *p2) //自已定义字符串比较函数
{
int i;
i=0;
while(*(p1+i)==*(p2+i))
if (*(p1+i++)=='\0') return(0); //全部字符相同时返回结果0
return(*(p1+i)-*(p2+i)); //不相同时返回结果为第一对不相同字符的ASCII码的差值
}
18. 编写一程序,输入月份号,输出该月的英文月名。例如,输入“3”,则输出“March”,要求用指针数组处理
//编写一程序,输入月份号,输出该月的英文月名。例如,输入“3”,则输出“March”,要求用指针数组处理
#include <iostream>
using namespace std;
int main()
{
char *month_name[13]={"illegal month","January","February","March","April",
"May","June","July","August","September","October", "November","December"};
int n;
cout<<"input month:"<<endl;
cin>>n;
if ((n<=12) && (n>=1))
cout<<"It is "<<*(month_name+n)<<endl;
else
cout<<"It is wrong"<<endl;
return 0;
}
19.用指向指针的指针的方法对5个字符串排序并输出
#include <iostream>
using namespace std;
int main()
{
void sort(char **p);
const int m=20; //定义字符串的最大长度
int i;
char **p,*pstr[5],str[5][m];
for (i=0;i<5;i++)
pstr[i]=str[i]; /*将第i个字符串的首地址赋予指针数组 pstr 的第i个元素*/
cout<<"input 5 strings:"<<endl;
for (i=0;i<5;i++)
cin>>pstr[i];
p=pstr;
sort(p);
cout<<"strings sorted:"<<endl;
for (i=0;i<5;i++)
cout<<pstr[i]<<endl;
return 0;
}
void sort(char **p) //冒泡法对5个字符串排序函数
{
int i,j;
char *temp;
for (i=0;i<5;i++)
{for (j=i+1;j<5;j++)
{if (strcmp(*(p+i),*(p+j))>0) //比较后交换字符串地址
{temp=*(p+i);
*(p+i)=*(p+j);
*(p+j)=temp;
}
}
}
}
20. 用指向指针的指针的方法对n个整数排序并输出。要求将排序单独写成一个函数。n个整数在主函数中输入,最后在主函数中输出。
//用指向指针的指针的方法对n个整数排序并输出。要求将排序单独写成一个函数。n个整数在主函数中输入,最后在主函数中输出。
#include <iostream>
using namespace std;
int main()
{
void sort(int **p,int n);
int i,n,data[10],**p,*pstr[10];
cout<<"input n:";
cin>>n;
for (i=0;i<n;i++)
pstr[i]=&data[i]; /*将第i个整数的地址赋予指针数组 pstr 的第i个元素*/
cout<<"input "<<n<<" integer numbers:"<<endl;
for (i=0;i<n;i++)
cin>>*pstr[i];
p=pstr;
sort(p,n);
cout<<"Now,the sequence is:"<<endl;
for (i=0;i<n;i++)
cout<<*pstr[i]<<" ";
cout<<endl;
return 0;
}
void sort(int **p,int n)
{
int i,j,*temp;
for (i=0;i<n-1;i++)
{
for (j=i+1;j<n;j++)
{
if (**(p+i)>**(p+j)) //比较后交换整数地址
{temp=*(p+i);
*(p+i)=*(p+j);
*(p+j)=temp;
}
}
}
}