精华内容
下载资源
问答
  • c语言程序设计第五版课后习题答案谭浩强第八章课后题 输入三个字符串,按由大到小的顺序输出 要求用指针实现 输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个属兑换。写三个函数:1.输入10个数;...

    c语言程序设计第五版课后习题答案谭浩强第八章课后题
    输入三个字符串,按由大到小的顺序输出 要求用指针实现
    输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个属兑换。写三个函数:1.输入10个数;2.进行处理;3.输出10个数
    有n个整数,使前面各数顺序向后移m个位置,最后m个数变成最前面m个数,。写一函数实现以上功能,在主函数中输入n个整数和输出调整后的n个数
    有n个人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下来的是原来第几号的那位
    写一函数,求一个字符串的长度。在main函数中输入字符串,并输出其长度
    有一字符串,包含n个字符。写一函数,将此字符串中从第m个字符开始的全部字符复制成为另一个字符串
    输入一行文字,找出其中大写字母、小写字母、空格、数字以及其它字符各有多少(用指针实现)
    写一函数,将一个3x3的整形矩阵转置
    将一个5x5的矩阵中的最大元素放在中心,4个角分别放4个最小的元素(顺序为从左到右,从上到下依次从小到大存放),写一函数实现之。用main函数调用。
    写一个用矩形法求定积分的通用公式,分别求 sinx在0-1上积分,cosx在0-1上积分,e^x在0-1上积分
    有一个班4个学生,5门课程。1.求第一门课程的平均分;2.找出有两门以上课程不及格的学生,输出他们的学号和全部课程成绩及平均成绩;3.找出平均成绩在90以上或全部课程在85分以上的学生。分别编3个函数

    答案
    c语言程序设计第五版课后习题答案谭浩强第八章课后题

    展开全文
  • 8 善于利用指针 注:本习题要求用指针的方法处理 1.输入3个整数,按由小到大的顺序输出 #include<stdio.h> void swap(int *a,int *b){ int temp = *a; *a = *b; *b = temp; } int main(){ int a,...

    第8章 善于利用指针


    注:本章习题要求用指针的方法处理

    1.输入3个整数,按由小到大的顺序输出

    #include<stdio.h>
    
    void swap(int *a,int *b){
    	int temp = *a;
    	*a = *b;
    	*b = temp;
    
    }
    
    int main(){
    	int a,b,c;
    	scanf("%d%d%d",&a,&b,&c);
    	if(a>b) swap(&a,&b);
    	if(a>c) swap(&a,&c); //第一个数a为最小的数 
    	if(b>c) swap(&b,&c); //再找出第二小的数 
    	printf("%d%d%d",a,b,c);
    } 
    

    2.输入3个字符串,按由小到大的顺序输出

    #include<stdio.h>
    #include<string.h>
    
    void swap(char* p1,char* p2){
    	char p[20];
    	strcpy(p,p1);
    	strcpy(p1,p2);
    	strcpy(p2,p);
    }
    
    int main(){
    	char str1[20],str2[20],str3[20];
    	printf("input three line:\n");
    	gets(str1);
    	gets(str2);
    	gets(str3);
    	if(strcmp(str1,str2)>0) swap(str1,str2);
    	if(strcmp(str1,str3)>0) swap(str1,str3);
    	if(strcmp(str2,str3)>0) swap(str2,str3);
    	printf("now,this order is:\n");
    	printf("%s\n%s\n%s\n",str1,str2,str3); 
    	
    }
    

    3.输入10个整数,将其中最小的数与第1个数对换,把最大的数与最后一个数对换。写3个函数①输入10个数;②进行处理;③输出10个数

    #include<stdio.h>
    
    void max_min_value(int* a){
    	int *min,*max,*p,temp;
    	max = min = a;
    	for(p = a;p < a+10;p++)
    		if(*p > *max) max = p;//找最大
    	temp = a[9];a[9] = *max;*max = temp;
    	for(p = a;p < a+10;p++)
    		if(*p < *min) min = p;//找最小
    	temp = a[0];a[0] = *min;*min = temp;	
    	
    }
    
    int main(){
    	int a[10] = {32,24,56,78,1,98,36,44,29,6};
    	max_min_value(a);
    	for(int i = 0 ;i < 10;i++){
    		printf("%-3d",a[i]);
    	}
    	
    }
    

    4.有n个整数,使前面的各数向后移m个位置,最后m个数变成最前面m个数。

    1 2 3 4 5 移动2位
    4 5 1 2 3

    #include<stdio.h>
    
    //法1:借用指针+递归 
    void move1(int a[],int n,int m){
    	int *p,a_end;
    	a_end = *(a+n-1); //保存最后一个元素的值
    	for(p = a+n-1;p > a;p--)
    		*p = *(p-1); //整个数组向后移动一位
    	*p = a_end; //给第一个元素赋值为变化前最后一个元素
    	m--; //一趟向后移动一位 m-1
    	if(m > 0) move1(a,n,m); //递归调用
    }
    //法二:利用新数组
    void move2(int a[],int n,int m){
    	int b[5],*p;
    	for(int i = 0;i < 5;i++){
    		b[ (i+m)%n ] = a[i]; //求模赋值
    	}
    
    	for(int i = 0;i < 5;i++){
    		*(a+i) = *(b+i);
    	//	printf("%-3d",a[i]);
    	} 
    	
    } 
    
    
    int main(){
    	int a[5] = {1,2,3,4,5};
    //	move1(a,5,2);
    //	for(int i = 0;i < 5;i++)
    //		printf("%-3d",a[i]);
    	
    	move2(a,5,2);
    	for(int i = 0;i < 5;i++)
    		printf("%-3d",a[i]);
    }
    

    5.n个人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号。

    #include<stdio.h>
    
    int main(){
    	int num[50],k,i,n,m,*p;
    	printf("请输总共有多少人:\n");
    	scanf("%d",&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){
    			*(p+i) = 0; //退出的人编号置为0
    			printf("%d号淘汰\n",i+1);
    			k = 0;
    			m++;  //淘汰人数加1 
    		}
    		i++;
    		if(i == n) i=0; //报数到尾后,i回复为0 
    	} 
    	while(*p == 0) p++;
    	printf("最后剩下的元素为: %d\n",*p);
    	return 0; 
    	 
    } 
    

    6.写一个函数,求一个字符串的长度。在main函数中输入字符串,并输出其长度。

    #include<stdio.h>
    
    int strlen(char *s){//求字符串长度
    	printf("strlen\n");
    	int len = 0;
    	char *p = s;
    	while(*p != '\0'){ //报错 p != '\0' 
    		p++;
    		len++;
    	}
    	return len;
    }
    
    int main(){
    	char s[20];
    	gets(s); //输入字符串 
    	//puts(s); 
    	int len = strlen(s);
    	printf("s的长度为:%d\n",len);
    }
    

    7.有一个字符串包含n个字符。写一个函数,将此字符串从第m个字符开始的全部字符串复制为另一个字符串。

    #include<stdio.h>
    #include<string.h>
    
    void copystr(char* p1,char* p2,int m);
    
    int main(){
    	char str1[20],str2[20];
    	int m;
    	printf("请输入要复制字符串:\n");
    	gets(str1);
    	printf("请输入从第几位开始复制\n");
    	scanf("%d",&m);
    	if(strlen(str1) < m)
    		printf("输入有误\n");
    	else{
    		copystr(str1,str2,m); 
    		printf("复制后的字符串为:\n"); 
    		printf("%s",str2
    		);	
    	}
    } 
    
    void copystr(char* p1,char* p2,int m){
    	printf("copystr~~~\n"); 
    	int n=0;
    	while(n < m-1){
    		n++;
    		p1++;
    	}
    	while(*p1 != '\0'){
    		*p2 = *p1;
    		p1++;
    		p2++;
    	}
    	*p2 = '\0';
    }
    

    8.输入一行文字,找出其中大写字母、小写字母、空格、数字以及其他字符各有多少。

    #include<stdio.h>
    
    int main(){
    	int upper=0,lower=0,digit=0,space=0,other=0,i=0;
    	char *p,s[20];
    	printf("input string: ");
    	while( ( s[i]=getchar() )!='\n') i++;
    	p = s;
    	while(*p != '\n'){
    		if( (*p >= 'A')&&(*p <= 'Z') )
    			++upper;
    		else if((*p >= 'a')&&(*p <= 'z'))
    			++lower;
    		else if(*p == ' ')
    			++space;
    		else if((*p >='0' )&&(*p <='9'))
    			++digit;
    		else
    			other++;
    		p++;
    	} 
    	
    	printf("upper case:%d   lower case:%d",upper,lower);
    	printf("    space case:%d   digit case :%d   other case:%d\n",space,digit,other);
    	
    }
    

    9.写一个函数将一个3*3的矩阵转置

    #include<stdio.h>
    
    //a[i][j]的地址是p+3*i+j
    //a[j][i]的地址是p+3*j+i 
    //a[i][j] a[j][i]地址相同 
    
    void move(int *p){
    	int i,j,t;
    	for(i = 0;i < 3;i++){
    		for(j = i;j < 3;j++){ //j=i 不是 j=0 
    			t = *(p+3*i+j);
    			*(p+3*i+j) = *(p+3*j+i);
    			*(p+3*j+i) = t;
    		}
    	}
    }
    
    void move2(int a[][3]){
    	int i,j,t;
    	for(i = 0;i < 3;i++){
    		for(j = i;j < 3;j++){ //j=i 不是 j=0 
    			t = a[i][j];
    			a[i][j] = a[j][i];
    			a[j][i] = t;
    		}
    	}
    }
    
    int main(){
    	int i,j,*p;
    	int a[3][3]={1,2,3,4,5,6,7,8,9};
    	p = &a[0][0];
    	for(i = 0;i < 3;i++){
    		printf("%d %d %d\n",a[i][0],a[i][1],a[i][2]);
    	} 
    
    	//move(p);
    	move2(a);
    	printf("变化后\n"); 
    	for(i = 0;i < 3;i++){
    		printf("%d %d %d\n",a[i][0],a[i][1],a[i][2]);
    	} 
    }
    

    10.将一个5*5的矩阵中最大的元素放在中心,4个角分别放4个最小的元素(顺序为从左到右,从上到下),写一个函数实现。套娃题,脑壳疼

    #include<stdio.h>
    
    void change(int *p){
    	int i,j,temp;
    	int *max,*min;
    	max = min = p;
    	for(i = 0;i < 5;i++){
    		for(j = 0;j < 5;j++){
    			if(*max < *(p+5*i+j)) max = p+5*i+j;
    			if(*min > *(p+5*i+j)) min = p+5*i+j;
    		}
    	}
    	temp = *(p+12); //将最大值与中间元素互换
    	*(p+12) = *max;
    	*max = temp;
    	
    	temp = *p; //将最小值与左上角元素互换
    	*p = *min;
    	*min = temp;
    	
    	min = p+1; //将a[0][1]的最地址给min,从该位置开始找最小的值
    	for(i = 0;i < 5;i++){
    		for(j = 0;j < 5;j++){
    			if(i == 0 && j == 0) continue; 
    			if(*min > *(p+5*i+j)) min = p+5*i+j;
    		}
    	}
    	
    	temp = *min;  //将第二小的值跟右上角的互换 
    	*min = *(p+4);
    	*(p+4) = temp;
    	 
    	min = p + 1; //找到第三小的值 
    	for(i = 0;i < 5;i++){
    		for(j = 0;j < 5;j++){
    			if((i==0 && j==0)||(i==0 && j==4)) continue; 
    			if(*min > *(p+5*i+j)) min = p+5*i+j;
    		}
    	}
    	
    	temp = *min;  //将第三小的值跟左下角的互换 
    	*min = *(p+20);
    	*(p+20) = temp;
    	
    	min = p + 1; //找到第四小的值 
    	for(i = 0;i < 5;i++){
    		for(j = 0;j < 5;j++){
    			if((i==0&&j==0)||(i==0&&j==4)||(i==4&&j==0)) continue; 
    			if(*min > *(p+5*i+j)) min = p+5*i+j;
    		}
    	}
    	temp = *min;  //将第四小的值跟右下角的互换 
    	*min = *(p+24);
    	*(p+24) = temp;
    }
    
    int main(){
    	int a[5][5]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25};
    	int i,j,*p;
    	p = &a[0][0];
    	change(p);
    	//打印变化后的数组 
    	for(i = 0;i < 5;i++){
    		for(j = 0;j < 5;j++)
    			printf("%-4d",a[i][j]);
    		printf("\n"); 
    	}
    } 
    

    11.在主函数中输入10个等长的字符串。用另一函数对他们排序。然后在主函数输出这10个已经排好序的字符串

    #include<stdio.h>
    #include<string.h>
    
    void sort(char s[3][6]){ //形参s是指向6个元素一组的指针 
    	int i,j;
    	char *p,temp[10]; //temp为临时容器长度要大于6 
    	p = temp;
    	//字符串版的冒泡排序   由于下面if是s[j]与s[j+1]比较所有i不能到3否则数组会溢出 
    	for(i = 0;i < 2;i++){
    		for(j = 0;j < 2-i;j++){
    			if(strcmp(s[j],s[j+1])>0){
    	//以下三行是将s[j]指向的一维数组与s[j+1]指向的一维数组的内容互换 
    				strcpy(p,s[j]);
    				strcpy(s[j],s[j+1]);
    				strcpy(s[j+1],p);
    			}
    		}
    	} 
    } 
    
    int main(){
    	int i;
    	char str[3][6]; //主要是算法数组大小无所谓
    	printf("输入3个长度为6的字符串\n");
    	for(i = 0;i < 3;i++)
    		scanf("%s",str[i]);
    	sort(str);
    	printf("排序后为:\n");
    	for(i = 0;i < 3;i++)
    		printf("%s\n",str[i]);
    	return 0;
    }
    

    12.用指针数组处理上一题目,字符串不等长。

    #include<stdio.h>
    #include<string.h>
    
    void sort(char *s[]){  
    	int i,j;
    	char *temp; //temp为临时容器长度要大于6 
    	//字符串版的冒泡排序  
    	for(i = 0;i < 4;i++){
    		for(j = 0;j < 4-i;j++){
    			if(strcmp(*(s+j),*(s+j+1))>0){
    				temp = *(s+j);
    				*(s+j) = *(s+j+1);
    				*(s+j+1) = temp;
    			}
    		}
    	} 
    } 
    
    int main(){
    	int i;
    	char *p[5],str[5][20]; //主要是算法,数组大小无所谓
    	for(i = 0;i < 5;i++)
    		p[i]=str[i];        //将第i个字符的首地址赋予指针数组p的第i个元素 
    	printf("输入5个字符串\n");
    	for(i = 0;i < 5;i++)
    		scanf("%s",p[i]);
    	//sort(p);
    	printf("排序后为:\n");
    	for(i = 0;i < 5;i++)
    		printf("%s\n",p[i]);
    	return 0;
    }
    

    13.写一个函数用矩形求定积分的通用函数,分别别F(0,1) sinx dx,F(-1,1) cosx dx,F(0,2) exp(x) dx的定积分.

    说明:sin,cos,exp已在系统的数学函数库中.
    
    #include<stdio.h>
    #include<math.h>
    int main()
    {float integral(float(*)(float),float,float,int);//对integarl函数的声明
    float fsin(float);          //对fsin函数的声明
    float fcos(float);          //对fcos函数的声明
    float fexp(float);          //对fexp函数的声明
    float a1,b1,a2,b2,a3,b3,c,(*p)(float);
    int n=20;
    printf("input a1,b1:");
    scanf("%f,%f",&a1,&b1);
    printf("input a2,b2:");
    scanf("%f,%f",&a2,&b2);
    printf("input a3,b3:");
    scanf("%f,%f",&a3,&b3);
    p=fsin;
    c=integral(p,a1,b1,n);
    printf("The integral of sin(x) is:%f\n",c);
    p=fcos;
    c=integral(p,a2,b2,n);
    printf("The integral of cos(x) is:%f\n",c);
    p=fexp;
    c=integral(p,a3,b3,n);
    printf("The integral of exp(x) is:%f\n",c);
    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)
        {return sin(x);}
      float fcos(float x)
        {return cos(x);}
      float fexp(float x)
        {return exp(x);}
    
    

    14.将n个数按输入时的顺序逆序排列,用函数实现.

    #include<stdio.h>
    
    void sort(char* p,int m){
    	int i;
    	char temp,*p1,*p2; //双指针,一头一尾同时工作,替换值
    	for(i=0;i<m/2;i++){ //i只到m的中间 
    		p1 = p+i;//从头到中间 
    		p2 = p+(m-1-i);//从尾到中间 
    		temp = *p1; //首尾交换 
    		*p1 = *p2;
    		*p2 = temp; 
    	
    	} 
    } 
    
    int main(){
    	int i,n;
    	char *p,num[20];
    	printf("input n:");
    	scanf("%d",&n);
    	printf("input this numbers:\n");
    	for(i=0;i<n;i++){  //i要从0开始 
    		scanf("%d",&num[i]);
    	}
    	p = &num[0];
    	sort(p,n);
    	for(i=0;i<n;i++){
    		printf("%d ",num[i]);
    	}
    } 
    

    15.有一个班4个学生,5门课程.①求第一门课程的平均分;②找出有两门以上课程不及格的学生,输出他们的学号和全部课程及平均成绩;③找出平均成绩在90分以上或者全部课程在85分以上的学生.分别编三个函数实现3个要求

    #include <stdio.h>
    /*
    输入课程 
    English
    computer
    math
    physics
    chemistry
    输入成绩 
    101 34 56 88 99 89
    102 27 88 99 67 78
    103 99 90 87 86 89
    104 78 89 99 56 77
    */ 
    void avsco(float *,float *);   // 求每个学生的平均成绩的函数
    void avcour1(char (*)[10],float *); // 求第一课程的平均成绩的函数
    void fali2(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 main()
    {
     	int i,j,*pnum,num[4];
     	float score[4][5],aver[4],*pscore,*paver;
     	char course[5][10],(*pcourse)[10];
     	printf("input course:\n");
     	pcourse=course;   
     	for (i=0;i<5;i++)
     		scanf("%s",course[i]);
    	 printf("input NO. and scores:\n");
    	 printf("NO.");
    	 for (i=0;i<5;i++)
    	   printf(",%s",course[i]);
    	 printf("\n");
    	 pscore=&score[0][0];
    	 pnum=&num[0];
    	 for (i=0;i<4;i++)
    	 {
    	 	scanf("%d",pnum+i); //pnum记录学号 num[i][0]  
    	  	for (j=0;j<5;j++)
    	   		scanf("%f",pscore+5*i+j); //pscore 记录分数 
    	 }
    	 paver=&aver[0];
    	 printf("\n\n");             
    	 avsco(pscore,paver);                  // 求出每个学生的平均成绩
    	 avcour1(pcourse,pscore);                // 求出第一门课的平均成绩 (pcourse指向课程数组) 
    	 printf("\n\n");
    	 fali2(pcourse,pnum,pscore,paver);       // 找出2门课不及格的学生
    	 printf("\n\n");
    	 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;  //paver是存每个学生平均成绩的数组 
        }
    }
    
    //char (*pcourse)[10]:是一个数组指针,这个指针是指向一个度大小为10的字符数组; 
    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));               //累计每个学生的得分 sum最终为第一列值的和 
      average1=sum/4;                        //计算平均成绩
      printf("course 1:%s average score:%7.2f\n",*pcourse,average1);
    }
    
    void fali2(char course[5][10],int num[],float *pscore,float aver[4]) 
               // 找两门以上课程不及格的学生的函数
     {
    	 int i,j,k,labe1;
    	  printf("        ==========Student who is fail in two courses=======  \n");
    	  printf("NO. ");
    	  for (i=0;i<5;i++)
    	    printf("%11s",course[i]);
    	  printf("    average\n");
    	  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)
        	{
    			printf("%d",num[i]);
       			for (k=0;k<5;k++)
          			printf("%11.2f",*(pscore+5*i+k)); //输出有两门不及格学号的所有成绩 
        		 printf("%11.2f\n",aver[i]);  //直接输出之前记录下的平均值 
       		 }
          }
    }
    
    void good(char course[5][10],int num[4],float *pscore,float aver[4])
       // 找成绩优秀学生(各门85以上或平均90分以上)的函数
     {
      int i,j,k,n;
      printf("         ======Students whose score is good======\n");
      printf("NO. ");
      for (i=0;i<5;i++)
        printf("%11s",course[i]);
      printf("    average\n");
      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))
         {printf("%d",num[i]);
          for (k=0;k<5;k++)
            printf("%11.2f",*(pscore+5*i+k));
          printf("%11.2f\n",aver[i]);
         }
     }
    }
    

    16. 输入一个字符串,内有数字和非数字字符,例如:

    a123x456 17960? 302tab5876
    

    将其中连续的数字作为一个整数,依次存放到一数组a中。例如,123存入在a[0],456存放在a[1]……统计共有多少整数,并输出这些数。

    #include <stdio.h>
    int main()
    {
     char str[50],*pstr;
     int i,j,k,m,e10,digit,ndigit,a[10],*pa;
     printf("input a string:\n");
     gets(str);
     pstr=&str[0];    /*字符指针pstr置于数组str 首地址*/
     pa=&a[0];        /*指针pa置于a数组首地址*/
     ndigit=0;        /*ndigit代表有多少个整数*/
     i=0;             /*代表字符串中的第几个字符*/
     j=0;            /*记录数字连续的个数*/ 
     while(*(pstr+i)!='\0')
     {if((*(pstr+i)>='0') && (*(pstr+i)<='9'))
           j++;
         else
           {if (j>0)
            {digit=*(pstr+i-1)-48;          /*将个数位赋予digit,字符 0对应的ascii码为 48*/
             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)                         /*以数字结尾字符串 j还是>0不能处理,或者是全是数字的情况下 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++)            /*打印数据*/
        printf("%d ",*(pa+j));
      printf("\n");
      return 0;
    }
    

    17.编写一个函数,实现两个字符串的比较.即自己写一个strcmp函数,函数原型为strcmp(char *p1,char *p2);

    #include<stdio.h>
    
    int mystrcmp(char *p1,char *p2){
    	int i = 0;
    	while( *(p1+i) == *(p2+i) )
    		if( *(p1+i++) == '\0' ) return 0;  //相等时返回结果0 
    	return (*(p1+i) - *(p2+i));  //不等时返回第一个结果不相等字符的差值 
    	
    } 
    int main(){
    	int m;
    	char str1[20],str2[20],*p1,*p2;
    	printf("请输入两串字符串\n");
    	gets(str1);
    	gets(str2);
    	p1 = str1;
    	p2 = str2;
    	m = mystrcmp(p1,p2);
    	printf("%d",m);
    }
    

    18编写一个程序,输入月份号,输出改月份的英文月名.例如输入"3",则输出"march",要求用指针数组处理.

    #include <stdio.h>
    
    /*
    void someFunc(char *someStr);
    再看这个函数调用:
    someFunc("I'm a string!");
    把这两个东西组合起来,用最新的g++编译一下就会得到标题中的警告。
    为什么呢?原来char *背后的含义是:给我个字符串,我要修改它。
    而理论上,我们传给函数的字面常量是没法被修改的。
    所以说,比较和理的办法是把参数类型修改为const char *。
    这个类型说背后的含义是:给我个字符串,我只要读取它。
    */
    
    int main()
    {
        const char * month[13]={"illegal","January", "Februray", "March", "April", "May", "June", "July",
    						"August", "September", "October", "November", "December"};
        int n;
        printf("Please enter month: \n");
        scanf("%d", &n);
        if ( (n <= 12) && (n >= 1) )
        	printf("It is %s.\n",*(month+n));
        else{
    		printf("Error!\nPlease enter month: ");
    		scanf("%d", &n);
    		//output(m, month);
    	}
        
        return 0;
    }
    
    

    19(1)编写一个函数new,对n个字符开辟连续的存储空间,此函数应返回一个指针地址,指向字符串开始的空间.new(n)表示分配了n个字节的内存空间

    19(2)编写函数free,free的作用是是newp的值恢复为p.

    new为关键字自己写函数不要用这个new命名

    #include<stdio.h>
    
    #define NEWSIZE 1000  //指定开辟存储区的最大容量
    int newbuf[NEWSIZE]; //定义字符串数组newbuf
    int *newp = newbuf; //定义指针变量newp,指向存储区的始 端
    
    
    int* my_new(int n){ //定义开辟存储区的函数new,开辟数组后返回指针 
    	if(newp+n <= newbuf+1000){ //开辟区未超过newbuf数组的大小 
    		newp += n;  //newp指向存储区末尾 
    		return newp-n; //返回首地址 
    	}
    	else
    	return NULL; //存储区不够分配时,返回一个空指针 
    } 
    
    void my_free(int *p){  //释放存区函数 
    	if(p >= newbuf && p<newbuf+1000)
    		newp = p;
    }
    
    int main(){
    
    	int *p = my_new(5);
    
    	for(int i=0;i<5;i++){
    		p[i]=i;
    	} 
    	my_free(p); //让newp回到初始位置 
    
    	for(int i=0;i<5;i++){
    		printf("%d\n",newp[i]);  //此时newp的位置等于 p[0] 
    	} 
    } 
    

    20.用指向指针的指针的对5个字符串进行排序并输出

    /* 测试数据 
    China
    America
    India
    Philippines
    Canada
    排序后输出为:
    America
    Canada
    China
    India
    Philippines
    
    AZZ
    B
    C
    D
    E
    */
    
    #define _CRT_SECURE_NO_WARNINGS 1
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    void sort(char **p) //冒泡排序交换字符串 
    {
    	char **q, **s, *t;
    	for (q = p; q < p + 4; q++) 
    	{
    		for (s = p+4; s > q; s--)
    		{
    			if (strcmp(*q, *s) > 0)
    			{
    				printf("*q_初始地址=%d\n",*q);
    				printf("*s_初始地址=%d\n",*s);
    				printf("\n");
    				
    				printf("*q_字符串=%s\n",*q);
    				printf("*s_字符串=%s\n",*s);
    				printf("\n");
    				t = *q;
    				*q = *s;
    				*s = t;
    				printf("*q_排序后地址=%d\n",*q);
    				printf("*s_排序后=%d\n",*s);
    				printf("\n");
    				
    				printf("*q_排序后值=%s\n",*q);
    				printf("*s_排序后值=%s\n",*s);
    				printf("\n");
    			}
    		}
    		for (int i = 0; i < 5; i++)
    		{
    			printf("*p[%d]=%s\n",i, *(p+i) );
    		}
    		printf("\n");
    	}
    }
    int main()
    {
    	char *a[5],  **p;
    	char b[5][100];
    	int i;
    	for (i = 0; i < 5; i++)
    		a[i] = b[i];   //将第i个字符串的首地址赋值予指针数组a的第i个元素 
    	printf("请依次输入五个字符串:\n");
    	for (i = 0; i < 5; i++)
    		scanf("%s", a[i]);
    	p = a;
    	sort(p);
    	printf("排序后输出为:\n");
    	for (i = 0; i < 5; i++)
    	{
    		printf("%s\n", a[i]);
    	}
    	system("pause");
    	return 0;
    
    }
    

    21.用指向指针的指针方法对输入的n个整数排序并输出.

    #include<stdio.h>
    
    void sort(int **p,int n){
    	int i,j,*temp;
    	for(i = 0;i < n-1;i++)
    		for(j = n-1;j > i;j--){
    			if( **(p+j-1) > **(p+j) ){ //*p表示数组的地址,* *p表示取数组地址的值.
    				temp = *(p+j-1);
    				*(p+j-1) = *(p+j);
    				*(p+j) = temp;
    			}
    		}
    } 
    
    int main(){
    	int i,n,*pstr[20],**p;
    	int a[20]={34,98,56,12,22,65,1};//n=7
    	printf("请输入n:\n");
    	scanf("%d",&n);
    	printf("排序前:\n"); 
    	for(i = 0;i < n;i++){
    		pstr[i] = &a[i];
    		printf("%d ",a[i]);
    	}
    	p = pstr;
    	sort(p,n); //改变的是指针数组*pstr[]里面存放 a[]数组的地址 的顺序 
    	printf("\n排序后:\n"); 
    	for(i = 0;i < n;i++)
    		printf("%d ",*pstr[i]); 
    	//printf("%d ",a[i]); 	//a[i]数组的值位置没有发生变化 
    	
    } 
    
    展开全文
  • 林军主编《C语言程序设计课后参考答案第一二习题七填空题1.'\0'2一组(.多个)相同类型数据 多组相同类型数据3. gets puts4.字符串所含有字符的个数5.586单项选择题1.B 2.B 3.A 4.D程序填空题1.(1)gets(temp)(2)...

    林军主编《C语言程序设计》课后参考答案第一二章

    习题七

    填空题

    1.'\0'

    2一组(.多个)相同类型数据 多组相同类型数据

    3. gets puts

    4.字符串所含有字符的个数

    5.586

    单项选择题

    1.B 2.B 3.A 4.D

    程序填空题

    1.(1)gets(temp)

    (2)strcpy(temp,s);

    2.(1)i<10

    (2)if(strcmp(a[p],a[j])>0) p=j;

    (3)p!=j

    3.(1)a[i][j]>= '0'&& a[i][j]>= '9'

    (2)a[i][m]=a[i][m+1]

    (3)a[i][m]= '\0'

    编程题

    1.

    #include

    #include

    main()

    {int i,t;

    char a[20],c;

    printf("Enter a string: ");

    gets(a);

    printf("\n\nThe string is: %s\n",a);

    t=strlen(a);

    for(i=0;i

    {c=a[i];

    a[i]=a[t-1-i];

    a[t-1-i]=c;}

    printf("The new string is: %s\n",a);

    }

    习题八

    填空题

    1.在定义函数时函数名后面圆括号中的变量名 在主调函数中调用一个函数时,函数名后面圆括号中的参数

    2.在一个函数内部定义的变量 在函数之外定义的变量

    3. 动态存储类

    4.之前

    5.return 表达式; 计算表达式的值,将表达式的值作为函数的返回值返回到主调函数

    6.自动的 静态的 寄存器的 外部的

    单项选择题

    1.B 2.B 3.D 4.C 5.B 6.C 7.C 8.D 9.D 10.A

    阅读程序题

    1.

    (1) x=2,y=3,z=0

    (2) x=4,y=9,z=5

    (3) x=2,y=3,z=0

    2.

    0,8

    1,9

    2,10

    3.55

    4.

    a=5

    a*a=25

    a*a*a=125

    程序填空题

    1. (1)<=y

    (2)z*x

    2. (1)s=1

    (2)s=n+sum(n-1)

    3.(1) s=0

    (2)s+func(i)

    (3)1

    (4)p*2

    (5)p

    编程题

    1.

    #include

    int fun1(int n)

    {int p=1,i;

    for(i=1;i<=n;i++)

    p=p*i;

    return p;

    }

    void fun2()

    {int i;

    for(i=1;i<=30;i++)

    putchar('*');

    putchar('\n');

    }

    main()

    {int m,n,a,b,c,s,t;

    scanf("%d %d",&m,&n);

    if(m>n)

    {t=m;m=n;n=t;}

    a=fun1(n);

    b=fun1(m);

    c=fun1(n-m);

    s=a/b/c;

    fun2();

    printf(" C=%d\n",s);

    fun2();

    }

    习题九

    填空题

    1.类型说明符 *变量名 类型说明符 **变量名

    2.乘法运算符 指针运算符 定义指针变量

    3.取地址运算符 按位与运算符

    4. a[5]+1 *(p+5)+1

    5.单精度 指向单精度的指针 x的地址

    6.地址

    7. puts(p)

    8.指针数组 Chinese ,mathematics, English的首地址

    9.*(p+9) *(a+9) p[9]

    10. 7 8 'd' '\0' 'n'

    单项选择题

    1.B 2.B 3.A 4.A 5. 6 D. 7.D 8.A

    展开全文
  • * 时程序终止。 * * * * * * * * * * * * * * * * * * * * * * * * */ int main(void) { bool flag; int digit; int n; while (1) { //每次执行前将标志数组和标志变量初始化 bool digit_seen[10] = ...

    自己练习时手写,难免会有些疏忽遗漏等各种各样问题,错误之处还请指出

    但这些代码确实已通过编译,实现了书上的输出结果,还希望能给需要之人作为个小参考


    8_1

    #include <stdio.h>
    #include <stdbool.h>
    
    int main (void)
    {
    	bool digit_seen[10] = {false}, digit_wr[10] = {false}, flag = false;
    	int digit;
    	long n;
    	
    	printf ("Enter a number: ");
    	scanf ("%ld", &n);
    	
    	while (n > 0) {
    		digit = n % 10;
    		if (digit_seen[digit] == true) {
    			flag = true;
    			digit_wr[digit] = true;
    		}
    		digit_seen[digit] = true;
    		n /= 10;
    	}
    	
    	if (flag) {
    		printf ("Repeated digits(s): ");
    		for (int i = 0; i < 10; i++) {
    			if (digit_wr[i]) printf ("%d ", i);
    		} 
    	}
    	else 
    		printf ("No repeated digit\n");
    	
    	return 0;
     } 

    8_2

    #define _CRT_SECURE_NO_WARNINGS
    
    #include <stdio.h>
    #include <stdlib.h>
    
    int main (void)
    {
    	int digit_wr[10] = {0};
    	int digit;
    	int n;
    	
    	printf ("Enter a number:");
    	scanf ("%d", &n);
    	
    	while (n > 0) {
    		digit = n % 10;
    		digit_wr[digit]++;
    		n /= 10;
    	} 
    	
    	printf ("Digit:\t\t");
    	for (int i = 0; i < 10; i++) {
    		printf ("%3d", i);
    	}
    	
    	printf ("\nOccurrences:\t");
    	for (int i = 0; i < 10; i++) {
    		printf ("%3d", digit_wr[i]);
    	}
    
    	printf("\n");
    	system("pause");
    	return 0;
     } 

    8_3

    #include <stdio.h>
    #include <stdbool.h>
    
    /* * * * * * * * * * * * * * * * * * * * * * * * 
     *	连续输入一百以内数,当输入的数小于或等于0  * 
     *	时程序终止。                               * 
     * * * * * * * * * * * * * * * * * * * * * * * */
    
    int main(void) 
    {
    	bool flag;
    	int digit;
    	int n;
    	
    	while (1) {
    		//每次执行前将标志数组和标志变量初始化
    		bool digit_seen[10] = {false};
    		flag = false;				
    
    		printf ("Enter a number: ");
    		scanf ("%d", &n);
    
    		//如果输入是0跳出循环,结束
    		if (n <= 0) break;
    		while (n > 0) {
    			digit = n % 10;
    			if (digit_seen[digit] == true) flag = true;
    			digit_seen[digit] = true;
    			n = n / 10;
    		}
    		if (flag) {
    			printf("Repeated digit\n");
    		}
    		else {
    			printf("No repeated digit\n");
    		}
    	}
    
    	return 0;
    }

    8_4

    #define _CRT_SECURE_NO_WARNINGS
    
    #include <stdio.h>
    #include <stdlib.h>
    
    #define SIZE  (int)(sizeof (a) / sizeof (a[0])) 
    #define N 10
    
    int main (void)
    {
    	int a[N], i;
    	
    	printf ("Enter %d numbers: ", N);
    	for (i=0; i < SIZE; i++)
    		scanf ("%d", &a[i]);
    		
    	printf ("In reverse order: ");
    	for (i = SIZE - 1; i >= 0; i--)
    		printf (" %d", a[i]);
    	printf ("\n");
    	
    	printf("\n");
    	system("pause");
    	return 0;
    }

    8_5

    #include <stdio.h>
    
    #define NUM_RATES ((int)(sizeof (value) / sizeof (value[0])))
    #define INITIAL_BALANCE 100.00
    
    int main (void) 
    {
    	int i, low_rate, num_years, year, month;
    	double value[5];
    	
    	printf ("Enter interst rate: ");
    	scanf ("%d", &low_rate);
    	printf ("Enter number of years: ");
    	scanf ("%d", &num_years);
    	
    	printf ("\nYears");
    	for (i = 0; i < NUM_RATES; i++) {
    		printf ("%6d%%", low_rate + i);
    		value[i] = INITIAL_BALANCE;
    	}
    	printf ("\n");
    	
    	for (year = 1; year <= num_years; year++) {
    		printf ("%3d    ");
    		for (i = 0; i < NUM_RATES; i++) {
    			for (month = 1; month <= 12; month++) {
    				value[i] += ((double)(low_rate + i) / 12) / 100.0 * value[i]; 
    			}
    			printf ("%7.2f", value[i]);
    		}
    		printf ("\n");
    	}
    	
    	return 0;
    }

    8_6

    #include <stdio.h>
    #include <ctype.h>
    
    int main (void) 
    {
    	char mess[100];
    	int i = 0, j;
    	
    	printf ("Enter message: ");
    	while (((mess[i]) = getchar () ) != '\n') {
    		i++;
    	}
    	
    	printf ("In B1FF-speak: ");
    	for (j = 0; j < i; j++) {
    		if ((mess[j] <= 122) && (mess[j] >= 97)){
    			mess[j] = toupper (mess[j]);
    		}
    		
    		switch (mess[j]) {
    			case 'A': printf ("4"); break;
    			case 'B': printf ("8"); break;
    			case 'E': printf ("3"); break;
    			case 'I': printf ("1"); break;
    			case 'O': printf ("0"); break;
    			case 'S': printf ("5"); break;
    			default : printf ("%c", mess[j]); break;
    		}
    	}
    	printf ("!!!!!!!!!!");
    	
    	return 0;
    	
    }

    8_7

    #include <stdio.h>
    
    #define N 5
    
    int main(void)
    {
    	int a[N][N] = {0};
    	int i, j;
    	 
    	for (i = 0; i < N; i++) {
    		printf("Enter row %d:  ", i + 1);
    		for (j = 0; j < N; j++) {
    			scanf("%d", &a[i][j]);
    		} 
    	}
    	
    	int sum;
    	
    	printf("Row totals:  ");
    	for (i = 0; i < N; i++) {
    		for (j = 0; j < N; j++) {
    			sum += a[i][j];
    		}
    		printf("%d ", sum);
    		sum = 0;
    	}
    	
    	printf("\nColumn totals:  ");
    	for (j = 0; j < N; j++) {
    		for (i = 0; i < N; i++) {
    			sum += a[i][j];
    		}
    		printf("%d ", sum);
    		sum = 0;
    	}
    	
    	return 0;
     } 

    8_8

    #include <stdio.h>
    
    #define N 5
    
    int main(void)
    {
    	int a[N][N];
    	int i, j;
    	
    	for (i = 0; i < N; i++) {
    		printf("输入学生%d的五门成绩:", i + 1);
    		for (j = 0; j < N; j++) {
    			scanf("%d", &a[i][j]);
    		}
    	}
    	printf("\n");
    	
    	int sum = 0;
    	float average = 0.0f;
    	
    	for (i = 0; i < N; i++) {
    		for (j = 0; j < N; j++) {
    			sum += a[i][j];
    		}
    		average = (float) sum / N;
    		printf("学生%d的总成绩和平均分分别为%d和%.2f\n", i, sum, average);
    		sum = 0;
    	}
    	printf("\n");
    	
    	int max, mix;
    	sum = 0;
    	average = 0.0f;
    	
    	for (j = 0; j < N; j++) {
    		max = a[0][j];
    		mix = a[0][j];
    		for (i = 0; i < N; i++) {
    			if (max < a[i][j]) max = a[i][j];
    			if (mix > a[i][j]) mix = a[i][j];
    			sum += a[i][j];
    		}
    		average = (float) sum / N;
    		printf("学科%d的平均分是%.2f,最高分是%d,最低分是%d\n", j, average, max, mix);
    		sum = 0;
    	}
    	
    	
    	return 0;
    }

    8_9

    #include <stdio.h>
    #include <time.h>
    #include <stdlib.h>
    #include <stdbool.h>
    
    #define N 10
    #define WAY 4
    
    int main(void)
    {
    	bool a[N][N] = {false};
    	char b[N][N];
    	int i, j;
    	
    	//初始化表 
    	for (i = 0; i < N; i++) {
    		for (j = 0; j < N; j++) {
    			b[i][j] = '.';
    		}
    	}
    	
    	srand((unsigned) time(NULL));
    	int ways;
    	i = 0; j = 0;
    	b[0][0] = 'A';
    	a[0][0] = true;
    	
    	for (int m = 0; m < 25; ) {
    		 //余0表上, 1表下, 2表左, 3表右 
    		ways = rand() % WAY;      
    		
    		if (ways == 0) {
    			//如果往上走出表格了,continue重新循环试试别的方向 
    			if (i - 1 < 0) {
    				continue;
    			} 
    			//如果往上走有字母了, 进行判断 
    			else if (a[i - 1][j] == true){
    				//如果四面都是字母,退出 
    				if ((a[i + 1][j] == true && a[i][j - 1] == true && a[i][j + 1] == true)
    				// 考虑左边和左下角情况 
    					|| j - 1 < 0 && a[i + 1][j] == true && a[i][j + 1] == true
    					|| j - 1 < 0 && i + 1 > 9 && a[i][j + 1] == true
    				// 右边和右下角
    					|| j + 1 > 9 && a[i + 1][j] == true && a[i][j - 1] == true
    					|| j - 1 < 0 && i + 1 > 9 && a[i][j + 1] == true
    				//下边
    					|| i + 1 > 9 && a[i][j + 1] == true && a[i][j - 1] == true) break;
    				//如果都不是,重新选方向 
    				continue;
    			} else {				
    				a[i - 1][j] = true;
    				b[i - 1][j] = 'B' + m;
    				m++;
    				i--;
    				continue;
    			}
    		} 
    		
    		if (ways == 1) {
    			if (i + 1 > 9) {
    				continue;
    			} else if (a[i + 1][j] == true){
    				if (a[i - 1][j] == true && a[i][j - 1] == true && a[i][j + 1] == true
    				//右边和右上角 
    					|| j + 1 > 9 && a[i][j - 1] == true && a[i - 1][j] == true
    					|| j + 1 > 9 && i - 1 < 0 && a[i][j - 1] == true
    				//左边 
    					|| j - 1 < 0 && a[i - 1][j] == true && a[i][j + 1] == true
    				//上边 
    					|| i - 1 < 0 && a[i][j + 1] == true && a[i][j - 1] == true) break;
    				continue;
    			} else {				
    				a[i + 1][j] = true;
    				b[i + 1][j] = 'B' + m;
    				m++;
    				i++;
    				continue;
    			}
    		} 
    		
    		if (ways == 2) {
    			if (j - 1 < 0) {
    				continue;
    			} else if (a[i][j - 1] == true){
    				if (a[i + 1][j] == true && a[i - 1][j] == true && a[i][j + 1] == true
    				// 考虑下边和右下角情况 
    					|| i + 1 > 9 && a[i - 1][j] == true && a[i][j + 1] == true
    					|| j + 1 > 9 && i + 1 > 9 && a[i - 1][j] == true
    				// 上边和右上角
    					|| i - 1 < 0 && a[i + 1][j] == true && a[i][j + 1] == true
    					|| j + 1 > 9 && i - 1 < 0 && a[i][j + 1] == true
    				// 右边
    					|| j + 1 > 9 && a[i - 1][j] == true && a[i + 1][j] == true) break;
    				continue;
    			} else {				
    				a[i][j - 1] = true;
    				b[i][j - 1] = 'B' + m;
    				m++;
    				j--;
    				continue;
    			}
    		} 
    		
    		if (ways == 3) {
    			if (j + 1 > 9) {
    				continue;
    			} else if (a[i][j + 1] == true){
    				if (a[i + 1][j] == true && a[i][j - 1] == true && a[i - 1][j] == true
    				//左边和左下角 
    					|| j - 1 < 0 && a[i - 1][j] == true && a[i + 1][j] == true
    					|| j - 1 < 0 && i + 1 > 9 && a[i - 1][j] == true
    				//下边 
    					|| i + 1 > 9 && a[i - 1][j] == true && a[i][j - 1] == true
    				//上边 
    					|| i - 1 < 0 && a[i][j - 1] == true && a[i + 1][j] == true) break;
    				continue;
    			} else {				
    				a[i][j + 1] = true;
    				b[i][j + 1] = 'B' + m;
    				m++;
    				j++;
    				continue;
    			}
    		} 
    	}
    	
    	for (i = 0; i < N; i++) {
    		for (j = 0; j < N; j++) {
    			printf("%c ", b[i][j]);
    		}
    		printf("\n");
    	}
    	
    	
    	return 0;
    }

    8_10

    #include <stdio.h>
    #include <math.h>
    
    int main(void)
    {
    	const int lea[8] = {480, 583, 679, 767, 840, 945, 1140, 1305};
    	const int arr[8] = {616, 712, 811, 900, 968, 1075, 1280, 1438};
    	
    	int hours, minutes;
    	int time;
    	
    	printf ("Enter a 24-hour time:");
    	scanf ("%d:%d", &hours, &minutes);
    	//将时间换算成分钟 
    	time = hours * 60 + minutes;
    	
    	int mix = 1440, m;
    	
    	//找到距离最近的时间,并记录其下标 
    	for (int i = 0; i < 8; i++) {
    		if (fabs(lea[i] - time) < mix) {
    			mix = fabs(lea[i] - time);
    			m = i;
    		}
    	}
    	
    	int hour, minute;
    	//判断是上午还是下午并输出 
    	if (lea[m] / 60 > 12) {
    		if (arr[m] / 60 > 12) {
    			printf("CLosest departure time is %d:%.2d p.m.", lea[m] / 60 - 12, lea[m] % 60);
    			printf(", arriving at %d:%.2d p.m.", arr[m] / 60 -12, arr[m] % 60);
    		}
    	} else {
    		if (arr[m] / 60 > 12) {
    			printf("CLosest departure time is %d:%.2d a.m.", lea[m] / 60, lea[m] % 60);
    			printf(", arriving at %d:%.2d p.m.", arr[m] / 60 -12, arr[m] % 60);
    		} else {
    			printf("CLosest departure time is %d:%.2d a.m.", lea[m] / 60, lea[m] % 60);
    			printf(", arriving at %d:%.2d p.m.", arr[m] / 60, arr[m] % 60);
    		}
    	}
    	
    	return 0;
     } 

    8_11

    #include <stdio.h>
    
    int main (void)
    {
    	int ch, i = 0;
    	char c[15];
    	
    	printf ("Enter phone number: ");
    	
    	//输入字符直到为回车为止 
    	while ((ch = getchar ()) != '\n') {
    		//输入的如果是字母,换成数字 
    		if (ch <= 'Z' && ch >= 'A') {
    			switch (ch) {
    				case 65: case 66: case 67:
    					c[i] = '2';
    					break;
    				case 68: case 69: case 70:
    					c[i] = '3';
    					break;
    				case 71: case 72: case 73:
    					c[i] = '4';
    					break;
    				case 74: case 75: case 76:
    					c[i] = '5';
    					break;
    				case 77: case 78: case 79: 
    					c[i] = '6';
    					break;
    				case 81: case 82: case 83: case 80:
    					c[i] = '7';
    					break;
    				case 84: case 85: case 86: case 87:
    				 	c[i] = '8';
    					break;
    				case 88: case 89: case 90:
    					c[i] = '9';
    					break; 
    			}
    			i++;
    			continue;
    		}
    		
    		c[i] = ch;
    		i++;
    	}
    	
    	printf("In numeric form : "); 
    	for (int j = 0; j < i; j++) {
    		printf("%c", c[j]);
    	}
    	
    	return 0;
    }

    8_12

    #include <stdio.h>
    //头文件ctpye中包含toupper()函数 
    #include <ctype.h>
    
    int main(void)
    {
    	//建立整数型数组模拟每个字母所代表的面值 
    	const int a[26] = {1, 3, 3, 2, 1, 4, 2, 4, 1, 8, 5, 1, 3, 1, 1, 3, 10, 1, 1, 1, 1, 4, 4, 8, 4, 10};
    	int sum = 0;
    	char ch;
    	
    	printf("Enter a word: ");
    	
    	while ((ch = getchar()) != '\n') {
    		if (toupper(ch) < 'A' || toupper(ch) > 'Z') {
    			printf("Illegal input\n");
    			break;
    		} else {
    			sum += a[toupper(ch) - 'A'];
    		}	
    	}
    	
    	printf("Scrabble value: %d", sum);
    	
    	
    	return 0;
    }
    
    

    8_13

    #include <stdio.h>
    
    int main(void)
    {
    	char a[20];
    	char ch1, ch2;
    	
    	printf ("Enter a first and last name: ");
    	scanf ("%c", &ch1);
    	
    	//循环输入直到空格为止 
    	while ((getchar()) != ' ')
    		;
    	
    	int i = 0;	
    	while ((ch2 = getchar()) != '\n') {
    		a[i] = ch2;
    		i++;
    	}
    	
    	printf("You enered the name: ");
    	for (int j = 0; j < i; j++) {
    		printf("%c", a[j]);
    	} 
    	printf(", %c.", ch1);
    	
    	return 0;
     } 
    
    
    

    8_14

    #include <stdio.h>
    
    int main(void)
    {
    	char sen[100];
    	int i;
    	
    	printf("Enter a sentence: ");
    	for (i = 0; i < 100; i++) {                                     //建立字符数字sen并输入句子 
    		sen[i] = getchar();
    		if (sen[i] == '!' || sen[i] == '.' || sen[i] == '?') break; //遇到句末符号break跳出循环(i++并没有执行),此时i指向末尾的符号 
    	}
    	
    	int pri = i;								//记录下句子的长度,以后用于输出	
    	char sen1[100];								//建立一个数组用于存改变顺序后的句子 (一个一个单词地复制) 
    	int j = 0;
    	int over, start;						    //start为每次开始复制时的数组下标,over为复制结束时的 
    	for (i = i - 1; i >= 0; i--, j++) {         //从i-1的位置往前找空格,i-1表示先不处理句末符号 
    		over = i;								//下次一个单词的复制就从i(i此时已经i-1)处结束 
    		while (sen[i] != ' ' && i > 0) i--;		//遇到空格或者i<=0时,停止寻找 
    		start = i + 1;							//开始一个单词的复制,下标应该在空格后一个 
    		if (i == 0) start--;					//这个if只针对已经复制到原句的第一个单词的情况,start需要从零开始故减1 
    		for (; start <= over; start++, j++) {
    			sen1[j] = sen[start];				//复制单词 
    		}
    		sen1[j] = ' ';                          //每个单词后加个空格 
    	}
    	
    	sen1[j - 1] = sen[pri];						//之后就是sen1数组的输出了! 
    	printf("Reversal of sentence: ");
    	for (int m = 0; m < pri + 1; m++) {
    		printf("%c", sen1[m]);
    	}
    		
    	return 0;
    }

    8_15

    #include <stdio.h>
    
    int main(void)
    {	
    	//sen为原句子 
    	char sen[80], sen1[80];
    	int n;
    	
    	//初始化数组
    	int i;
    	printf("Enter message to be encrypted: ");
    	for (i = 0; ; i++) {               
    		sen[i] = getchar();
    		if (sen[i] == '\n') break;
    	} 
    	
    	printf("Enter shift amout (1~25): ");
    	scanf("%d", &n);
    	
    	printf("Encrypted message: ");
    	for (int j = 0; j < i + 1; j++) {
    		if (sen[j] <= 'z' && sen[j] >= 'a') {
    			printf("%c", ((sen[j] - 'a') + n) % 26 + 'a');
    		} else if (sen[j] <= 'Z' && sen[j] >= 'A') {
    			printf("%c", ((sen[j] - 'A') + n) % 26 + 'A');
    		} else {
    			printf("%c", sen[j]);
    		}
    	}
    	
    	return 0;
     } 

    8_16

     #include <ctype.h>
     #include <stdio.h> 
     #include <stdbool.h>
     
     int main(void)
     {
     	//定义一个整数数组用来记录每个字母出现的次数。第一输入单词,
    	//对应数组元素加一,第二次输入减一,若最后每个元素都为零则 为变为词 
     	int num[26] = {0};
     	char word[20];
     	
     	int i;
     	
     	printf("Enter first word: ");
     	for (i = 0; i < 20; i++) {
     		word[i]  = getchar();
     		if (!isalpha(word[i]) && word[i] != '\n') {
     			printf("Illegal input!");
    			return 0; 
    		 }
     		if (word[i] == '\n') break;
     		word[i] = tolower(word[i]);
     		num[word[i] - 'a']++;
    	 }
     	
     	printf("Enter second word: ");
     	for (i = 0; i < 20; i++) {
     		word[i]  = getchar();
     		if (!isalpha(word[i]) && word[i] != '\n') {
     			printf("Illegal input!");
    			return 0; 
    		 }
     		if (word[i] == '\n') break;
     		word[i] = tolower(word[i]);
     		num[word[i] - 'a']--;
    	 }
    	 
    	bool flag = false;
    	for (i = 0; i < 26; i++) {
    		if (num[i]) flag = true;
    	}
     	
     	if (flag) printf("The words are not anagrams.");
     	else printf("The words are anagrams.");
     	
     	return 0;
      } 

    8_17

    #include <stdio.h>
    
    int main(void)
    {
    	printf("This is program creates a magic square of a specified size.\n");
    	printf("The size must be an odd number between 1 and 99.\n");
    	printf("Enter size of magic square: ");
    	
    	int size;
    	scanf("%d", &size);
    	
    	int square[size][size];
    	for (int i = 0; i < size; i++) {
    		for (int j = 0; j < size; j++) {
    			square[i][j] = 0;
    		}
    	}
    	int i = 0, j = size / 2, num = 1;
    	
    	for (; ; ) {
    		if (square[i][j] == 0) {
    			square[i][j] = num;
    			i = i + size - 1; j++;
    			i = i % size;
    			j = j % size;		
    		} else {
    			i++; i++; j = j + size - 1;
    			i = i % size;
    			j = j % size;		  
    			square[i][j] = num;
    			i = i + size - 1; j++;	
    			i = i % size;
    			j = j % size;
    		}
    		num++;
    		
    		if (num > size * size) break;
    	}
    
    	for (i = 0; i < size; i++) {
    		for (j = 0; j < size; j++) {
    			printf("%3d", square[i][j]);
    		}
    		printf("\n");
    	}
    	
    	return 0;
     } 

     

    展开全文
  • C程序设计第五版谭浩强课后答案 第八章习题答案

    万次阅读 多人点赞 2020-06-28 15:06:45
    这里写目录标题C语言程序设计第五版谭浩强课后答案第八章 善于利用指针1. 输入3个整数,要求按由小到大的顺序输出。2. 输入3个字符串,要求按由小到大的顺序输出。3. 输入10个整数,将其中最小的数与第一个数对换, 把...
  • C语言程序设计教程 c++课后答案(清华版) 第八章答案
  • 代码简单全面,符合每题的要求。陶浩强老师的《c语言程序设计课后答案。都已经过上级变成通过的。完全正确的答案
  • 第八章:位域、联合、枚举、定义类型及预处理功能。 掌握位域及结构嵌套,联合,枚举,定义类型名,预处理功能。
  • C语言程序设计课后习题答案共有个章节的答案,这是6章答案

空空如也

空空如也

1 2 3 4
收藏数 62
精华内容 24
关键字:

c语言程序设计第八章课后答案

c语言 订阅