某不知名学校C语言作业 老师又又又又没给答案 题目不给输入输出 数据也小 算了 居然发现自己都快习惯了 这一章又是指针 对于很少用指针的我 头皮发麻
算了
直接看题吧
第一题
一维实型数组
编写函数计算一维实型数组前n个元素的最大值、最小值和平均值。数组、n、最大值、最小值和平均值均作为函数形参,函数无返回值;在主函数中输入数据,调用函数得到结果。(要求用指针方法实现)
分析 数组我们会了 函数封装会了 比大小也会了 主要是怎么用指针 简单一点说就是:
定义指针是int *p 其中p是一个地址 *p是地址的内容 &a表示取a的地址
同时 a[99] a作为数组名 代表数组的首地址 因此可以直接当作指针用
fun函数里面是形参 主函数里面是实参 要想通过函数fun改变主函数的实参 就要传入实参的地址
#includeint n;//设成全局变量 因为求平均数时候要用到void fun(float a[], float* max, float* min, float* avg){int i;*min = *max = *avg = a[0];//这一步将三个数初始化为第一个数for (i = 1; i < n; i++) {if (a[i] *max) {//最大值同理*max = a[i];}*avg += a[i];//所有数相加}*avg = *avg/ n;//这就是为什么要全局变量}int main(){scanf("%d",&n);float a[99];//防止数组溢出float avg, min, max;//题目要求浮点数for (int i = 0; i < n; i++)scanf("%f", &a[i]);fun(a, &max, &min, &avg);//数组名也是一种特殊的指针printf("max:%.2f\nmin:%.2f\naveg:%.2f\n", max, min, avg);//这里被卡输出了 我习惯平均数用avg 题目是aveg return 0;}
第二题
元素之和
利用指向行的指针变量求5×3数组各行元素之和。
分析 这其实没必要用指针 这道题考的应该是通过指针移动来遍历二维数组
一维的移动方法是*(指针 + 偏移量) 那么二维就是*(*(p+行偏移量) + 列偏移量)
#includevoid getsum(int (*p)[3])//传入一个二维数组地址{int t;int i,j;for(i=0;i<5;i++)//有5行{t = 0;for(j=0;j<3;j++)//有3列{t += *(*(p+i) + j);//遍历方法 指针移动}printf("row i:%d\n",t);}}int main(){int arr[5][3];for(int i=0;i<5;i++){for(int j=0;j<3;j++){scanf("%d",&arr[i][j]);}}getsum(arr);return 0;}
第三题
字符指针
使用字符指针编写程序,输入一个长度为n的字符串a,在字符串a的i (0<i<n)处插入字符x,输出插入后的字符串a。(n,x,i的值可自由输入)。例如:输入nw world在1处插入e输出new world。
分析:考的也是用指针遍历数组元素 因为在C里面字符串也是一个字符数组
多判断了插入位置不对的情况 不过学校作业数据都很小 应该不用判断也行
#include #include //函数strlen()获取字符串长度void insert(char str[],char c,int n) {//原来字符串 插入字符 插入位置int i = 0;if((n - 1) >= strlen(str)) {//如果插入位置超出字符串长度 直接放最后面*(str+n-1) = c;//str本身就是首地址指针 要*才能等于地址内容}if((n - 1) >= 0 && (n-1) = n; i--) {*(str+i) = *(str+i-1);//把每一个字符串的字符往后移一位 空出位置给插入的字符}*(str+n-1) = c;//插入}}int main() {char s[100],c;gets(s);//用scanf万能一点 这里我试试getsint n,i;scanf("%d %c",&n,&c);insert(s,c,n);for(i = 0; i < strlen(s); i++) {printf("%c",s[i]);//本来用puts 发现卡输出了}return 0;}
第四题
实现字符比较函数
编写一个函数,实现两个字符串的比较。即自己写一个strcmp函数,函数原型为 strcmp(char *p1,char *p2) 设p1指向字符串s1,p2指向字符串s2.要求当s1=s2时,返回值为0;若s1≠s2,返回他们二者第一个不同字符的ASCII码差值;如果s1>s2,则输出正值;若s1
分析:题目都打不全 要命 考的还是用指针遍历数组 指针可以用也可以不用 但是为了练习 还是用吧
#includeint cmp(char*p1,char*p2){int i=0;while(*(p1+i)==*(p2+i))//如果每个字符相等相等if(*(p1+i++)=='\0')return 0;//就会在字符1结束的时候返回0return (*(p1+i)-*(p2+i));//ASCII码差值}int main(){char str1[99],str2[99],*p1,*p2;scanf("%s%s",str1,str2);p1=&str1[0];//分别取首元素地址 其实多余了 直接用数组名就行 不过这样好像更容易理解p2=&str2[0];int k=cmp(p1,p2);printf("%d\n",k); return 0;}
这样直接用数组名也行
#includeint cmp(char*p1,char*p2){int i=0;while(*(p1+i)==*(p2+i))if(*(p1+i++)=='\0')return 0;return (*(p1+i)-*(p2+i));}int main(){char str1[99],str2[99],*p1,*p2;scanf("%s%s",str1,str2);int k=cmp(str1,str2);//直接用也行 printf("%d\n",k); return 0;}
第五题
合并字典
将两个按字典顺序排序的名字登记表合并,删除重复出现的名字使得每个名字在登记表中只出现一次,输出名字登记表内容。 两个登记表分别为 S1={“jixiang”,”lihua”,”lihua”,”lijian”,”wanger”,”zhanglin”} S2={“chenming”,”lihua”,”lijian”,”liutian”,”zhouqi”,”zhouqi”}
分析:考的是字符串查重 排序 我的做法是新开一个数组s3 这是我第一时间想到的做法 不过做着做着发现有点麻烦 应该有更简单的做法
#include#include//用到函数strcpy复制 strlen测量长度int choose(char (*s1)[10],char (*s2)[10],char (*s3)[10])//分别传入三个数组 第三个用来记录{ int n=0,i=0,j=0; char t[10];//临时数组 while(s1[i][0] && s2[j][0]) {//如果字符串还存在 if(strcmp(s1[i],s2[j])<0) strcpy(t,s1[i++]);//字符串1小 则复制字符串1else strcpy(t,s2[j++]); while(strcmp(s1[i],t)==0) i++;//如果相等 i++ 等价于忽略相同字符串 while(strcmp(s2[j],t)==0) j++; strcpy(s3[n++],t); //把t中临时存的字符串复制s3 } while(s1[i][0])//开始漫长的 算出s3的长度 if(strcmp(s1[i],s3[n-1])) strcpy(s3[n++],s1[i++]); else i++; while(s2[j][0]) if(strcmp(s2[j],s3[n-1])) strcpy(s3[n++],s2[j++]); else j++; return n;//感觉我这样做太麻烦了 应该有更好的方法}int main(){ char s1[10][10]={"jixiang","lihua","lihua","lijian","wanger","zhanglin"}; char s2[10][10]={"chenming","lihua","lijian","liutian","zhouqi","zhouqi"}; char s3[20][10]={0}; int k,n;n=choose(s1,s2,s3); for(k=0;k<n;k++) printf("%s ",s3[k]); return 0;}
第六题
定义两个整型变量,再定义两个指针变量指向整型变量,通过指针变量访问整型变量
分析:大水题 要指针指向用取地址符就好 p=&a;
# include int main(){int a,b;scanf("%d%d",&a,&b);int *p1=&a; int *p2=&b;printf("*pointer_1=%d,*pointer_2=%d",*p1,*p2);//小心卡输出return 0;}
第七题
用指针方法对10个整数按由大到小顺序排序
分析:排序应该已经学过了 选择 冒泡这两种应该比较容易理解 其实用快排应该更好 不过应该刚学指针理解起来有点困难(其实是我不会用指针写) 所有我们就用选择排序吧
#includevoid sort(int x[],int n)//排序函数 {int i,j,k,t; for(i=0;i<9;i++){k=i;//把i的值赋给k for(j=1+i;jx[k])//如果前一个数大 {k=j;} } t=x[k]; //实现交换 x[k]=x[i];x[i]=t;}}int main() {int i,*p,a[10];//定义整型变量、指针变量、数组 p=a;//给a赋值数组名也是指针因此直接相等 for(i=0;i<10;i++){scanf("%d",p++);} sort(a,10);//调用sort排序 for(p=a,i=0;i<10;i++)//输出排序后的数 {printf("%d ",*p);p++;}printf("\n");//换行 return 0;}
第八题
根据序号输出学生成绩(指针函数实现)
有3个学生,每个学生有4门课程的成绩。要求用户输入学生序号以后,能输出该学生的全部成绩。用指针函数来实现 学号分别为012 成绩则为{60,70,80,90},{56,89,67,88},{34,78,90,66}
分析:如果你做到这了 你会发现 其实很多题根本不用指针 那指针的意义是什么?
指针 可以让我们更高效去访问某些数据 特别是跟多维数组在一起的时候 如果是一个二维数组 正常要用两个循环 三维数组三个 但是如果有指针 就可以快速随意的指向数组的某一个元素
这道题也是考的指针去遍历数组 如果不用指针 那也可以用if直接写
#includefloat* search(float(*p)[4], int n){float* ptemp;ptemp = *(p + n);return (ptemp);//返回你要访问的第几行}int main(){float score[][4] = { {60,70,80,90} ,{56,89,67,88} ,{34,78,90,66} };float* p;int j;scanf("%d", &j);p = search(score, j);for (int i = 0; i < 4; i++)//每行四个数{printf("%.2f ", *(p + i));}printf("\n");return 0;}
第九题
按首字母升序输出国家名称
把输入的5个国家的名字按字母的升序输出 China Japan Korea American England
分析:用strcmp函数就能比较字符串大小了 然后再依次交换 就完成了选择排序 思路不难 主要是要求用指针实现
#include #include void fun(char *a[],int lenth){char *t;int i,j;for(i=0;i<lenth-1;i++){for(j=0;j0)//strcmp返回的是int类型{t = *(a+j);//等价于交换函数*(a+j) = *(a+j+1);*(a+j+1) = t;}}}}int main(){char *a[5]={ "China","Japan","Korea","American","England" };int b=5;fun(a,b);int i;for(i=0;i<b;i++){printf("%s ",a[i]);}return 0;}
第十题
将数字按序插入数组
有10-90这9个整数,已按升序存放于长度为10的一维数组中。要求将一整数35插入其中,并保持数组元素仍然有序。
相关知识
通过定义动态数组来存储数值并计算
分析:这道题好像不用动态数组做不出来 必须要用malloc去定义一个动态数组
在C++里面就是vector 因为很少写这个malloc定义的动态数组 所有我也不是很会 幸好班上有大佬教了我用法 勉勉强强能过 但是不知道数据大了行不行
#include int main() {int i, temp;int* s;//分配动态空间s = (int*)malloc(sizeof(int[10]));//s就是我们定义的int类型的动态数组了//初始化10-90for (i = 0; i = 0; i--) {if (s[i] < s[i-1]) {//老一套的选择排序temp = s[i];s[i] = s[i - 1];s[i - 1] = temp;}}for (i = 0; i < 10; i++) {printf("%d ", s[i]);}//释放内存free(s);//这个是个习惯 虽然做题不释放也可能对 但以后去工作一定会给打死return 0;}
okk 作业做完了 还有可爱的期中考试和期末考等着我呢
真是快乐的大学牲啊