【C++习题笔记】谭浩强C++程序设计(第三版)第六章

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; 
			}
		}
	}
} 

猜你喜欢

转载自blog.csdn.net/zl3090/article/details/85112142