第六次作业:指针(以下题目如无特殊声明,请使用指针技术实现,尽量不要使用数组作为形参,也尽量避免使用数组下标引用数组元素)1.数组元素循环移位有n个整数,使前面的各整数顺序向后移动m个位置,后面的m个整数则变成最前面的m个数。
写一函数实现以上功能。
在主函数中输入n及n个整数,输入m (m<n),调用编写的上述函数,然后输出调整后的n个整数。
#include<stdio.h>void main(){void inv(int *p,int n,int m);int n,m,a[20],*p;printf("please input n=");scanf("%d",&n);printf("please input %d numbers:",n);p=a;while(p<a+n)scanf("%d",p++);printf("please input m=");scanf("%d",&m);p=a;inv(a,n,m);printf("the new array:\n");while(p<a+n)printf("%d ",*p++);putchar('\n');}void inv(int *p,int n,int m){int i;for(i=1;i<=n;i++)*(p+n-i+m)=*(p+n-i);for(i=0;i<m;i++)*(p+i)=*(p+n+i);}2. 矩阵元素的排序将一个5×5的整数型矩阵中各元素重新排序。
排序规则为,矩阵元素按照从左到右,从上到下的顺序依次递增,即4,41,10,14,03,02,01,00,0.......a a a a a a a a ≤≤≤≤≤≤≤。
要求编写一个函数实现上述排序功能。
在主函数中输入该矩阵,调用编写的上述函数,然后输出排序后的矩阵。
#include<stdio.h>void main(){void inv(int (*x)[5]);int i,j,a[5][5];int (*p)[5];printf("please input an 5*5 array:\n");p=a;for(i=0;i<5;i++)for(j=0;j<5;j++)scanf("%d",*(p+i)+j);inv(p);printf("the new array:\n");for(i=0;i<5;i++){for(j=0;j<5;j++)printf("%4d",*(*(p+i)+j));putchar('\n');}putchar('\n');}void inv(int (*x)[5]){int i,j,t;for(i=0;i<24;i++)for(j=i+1;j<25;j++){if(*(*x+i)>*(*x+j)){t=*(*x+i);*(*x+i)=*(*x+j);*(*x+j)=t;}}return;}3.星期的查找编写一个程序,输入一个1~7之间的整数,表示星期几,然后输出相应的文字。
例如:如用户输入3,则输出“星期三”。
要求:用指针数组的方法来实现。
#include<stdio.h>void main(){int n;char (*p)[3];char a[7][3]={"一","二","三","四","五","六","七"};printf("please input n=");scanf("%d",&n);p=a;printf("星期%s\n",p+n-1);}4.字符串库函数的实现请使用指针的方法来实现如下的库函数:Char * strncpy( char *s, char * t, int n) //复制t的前n个字符至sChar * strncat( char *s, char * t, int n) //连接t的前n个字符至s的末尾int strncmp( char *s, char * t, int n) //比较s和t的前n个字符并请编写一个主函数来调用并测试自己编写的库函数。
#include<stdio.h>#include<string.h>char *strncpy(char *s,char *t,int n){int i,length;length=strlen(s);for(i=0;i<n;i++)*(s+i)=*(t+i);if(length<n)*(s+n)='\0';return(s);}char *strncat(char *s,char *t,int n){int i,length;length=strlen(s);for(i=0;i<n;i++)*(s+i+length)=*(t+i);*(s+length+n)='\0';return(s);}int strncmp(char *s,char *t,int n){int i;for(i=0;i<n;i++){if(*(s+i)==*(t+i))continue;else if(*(s+i)>*(t+i)){return(1);break;}else {return(-1);break;}}}void main(){char a[20],b[20];int n;scanf("%s%s%d",a,b,&n);printf("%s\n",strncpy(a,b,n));scanf("%s%s%d",a,b,&n);printf("%s\n",strncat(a,b,n));scanf("%s%s%d",a,b,&n);printf("%d\n",strncmp(a,b,n));}5.算术练习程序(指针型函数)一位小朋友正在学习两个100以内正整数的简单运算(加法、减法、乘法、除法),请编写一个程序来帮助他学习。
该程序调用一个GetRandomExpression(),由它随机返回一个简单的表达式;然后程序提示用户输入表达式的计算结果,并判断答案是否正确。
#include<stdio.h>#include<time.h>#include<stdlib.h>int result=1;void GetRanddomExpression(int *num1,char *a,int *num2){int n;srand(time(NULL));*num1=rand()%100+1;*num2=rand()%100+1;n=rand()%4;switch(n){case 0:{while(*num2>*num1) *num2=rand()%100+1;result=(*num1)-(*num2);*a='-';}break;case 1:{while((*num1+*num2)>100)*num2=rand()%100+1;*a='+';result=(*num1)+(*num2);}break;case 2:while((*num1*(*num2))>100)*num2=rand()%100+1;*a='*';result=(*num1)*(*num2);break;case 3:{while(*num1%*num2!=0)*num2=rand()%100+1;result=(*num1)/(*num2);*a='/';}break;}}int judge(int answer){if(answer==result)return(1);else return(0);}void main(){int num1,num2;char a;int answer;while(result!=answer){GetRanddomExpression(&num1,&a,&num2);printf("please input the result of the expression:\n%d%c%d=",num1,a,num2);scanf("%d",&answer);if(judge(answer)==1)printf("you are right!");else printf("sorry,it not the right answer.\n");}}6.数组分区(指针作为函数参数)本题由三个部分构成(1)编写一个函数CountEvensAndOdds,其功能是统计一个整型数组中奇数和偶数的个数。
该函数有4个参数,整数型数组、数组的长度和两个指针(用于返回奇数、偶数的个数)(2)利用(1)中的CountEvensAndOdds函数,编写一个Partition函数,其功能是找出给定长度的一个整型数组中的所有奇数和偶数,并把它们分别保存在两个新的整型数组中(用C语言的库函数malloc函数动态创建),然后返回这两个新数组及其长度。
该函数的参数有6个,整型数组、数组长度、奇数数组及其长度、偶数数组及其长度。
(3)编写主函数,要求能够定义一个数组,并能够用随机数对该数组进行初始化,然后调用(2)中的函数Partition,将原始数组、奇数数组、偶数数组输出。
#include <stdio.h>#include<malloc.h>#include<time.h>#include<stdlib.h>void CountEvensAndOdds(int *parr,int arr_len,int *even_count,int *odds_count) {int i;int count_even=0,count_odds=0;for (i=0;i<arr_len;i++){if ((*(parr+i)%2)==0)count_even++;else count_odds++;}*even_count=count_even;*odds_count=count_odds;}void Partition(int *parr,int arr_len,int **even_arr,int *even_len,int **odds_arr,int *odds_len){int even_count,odds_count,i,m=0,n=0;int count_even=0,count_odds=0;CountEvensAndOdds(parr,arr_len,&even_count,&odds_count);*even_arr=(int *)malloc(sizeof(int)*even_count);*odds_arr=(int *)malloc(sizeof(int)*odds_count);for (i=0;i<arr_len;i++){if((*(parr+i)%2)==0){*(*even_arr+m) = *(parr+i);m++;}else{*(*odds_arr+n) = *(parr+i);n++;}}*even_len=m;*odds_len=n;}void print_arr(int *parr,int arr_len){int i;for(i=0;i<arr_len;i++){printf("%-3d",*(parr+i));if((i+1)%10==0)printf("\n");}printf("\n");}void main(){int *parr,arr_len,i,*even_arr,even_len,*odds_arr,odds_len;srand(time(NULL));arr_len = rand()%50;parr=(int *)malloc(sizeof(int)*arr_len);printf("arr_len=%d\n",arr_len);for(i=0;i<arr_len;i++)parr[i] = rand()%100;Partition(parr,arr_len,&even_arr,&even_len,&odds_arr,&odds_len);printf("arr:\n");print_arr(parr,arr_len);printf("even_arr len=%d\n",even_len);printf("even_arr:\n");print_arr(even_arr,even_len);printf("odds_arr len=%d\n",odds_len);printf("odds_arr:\n");print_arr(odds_arr,odds_len);}7.字符串压缩(使用字符指针)编写一个程序,输入一个字符串,然后采用如下的规则对该字符串当中的每一个字符进行压缩:(1)如果该字符是空格,则保留该字符。