上机实验11 指针与数组一.实验目的1. 掌握用下标、数组名或指针等不同方式引用数组元素;2. 掌握数组名作函数参数的方法;3.掌握常用的字符串处理函数和字符处理函数;4.掌握用指针处理字符串的方法;二.实验内容【实验题1】程序填空:自定义函数del(s), 功能是删除字符串s中的数字字符, 要求使用字符处理函数isdigit()和字符串处理函数strcpy()。
在主函数中输入1个字符串,然后调用函数del(), 用于删除其中的数字字符,并输出处理后的字符串。
提示:从字符串s的首字符开始, 到结束符’\0’之前为止,逐个检查第i个字符是否是数字字符,是则删除该字符——使用字符判别函数isdigit(s[i]), 如果s[i]是数字字符,该函数返回1,否则返回0. 难点:如何删除s的第i个字符?——使用字符串复制函数strcpy(), 将子串s+i+1(从字符s[i+1]开始的子串)复制到给s+i (从字符s[i]开始的子串),即strcpy(s+i, s+i+1)。
#include <stdio.h>#include < ctype.h >#include <string.h>void del( char *s); //line 4 函数声明void main(){ char str[80];gets( str); //输入字符串strdel(str ); //调用函数del(),删除str中的数字puts(str); //输出字符串str}void del(char *s) //line 12 函数定义{ int i=0;while(s[i]!='\0')if(isdigit(s[i]) ) strcpy( s+i, s+i+1); // 如果字符s[i]是数字,用函数strcpy删除它else i++; // 否则,继续查看下一个字符}运行程序,输入字符串"a1b2<c3d4",输出结果是:ab<cd语句行line 4和line 12分别是函数声明和函数定义首部,其中的参数采用了指针的形式,此外,还可采用数组名的形式,即亦可写为void del( char s[] )【实验题2】分析程序运行结果,源程序如下#include <stdio.h>#include <string.h>void main(){ char *s1="****", *s2="****";while (*s2!='\0') {puts(s1+strlen(s2)-1 );s2++;}}运行程序运行时,共循环4次,每次输出一行字符串,其中1)第1行输出:* ,此时,字符串s2= "****" , strlen(s2)= 4 , s1+strlen(s2)-1= s1+ 3 ;2) 第2行输出:** ,此时,字符串s2= "***" , strlen(s2)= 3 , s1+strlen(s2)-1= s1+ 2 ;3) 第3行输出:*** ,此时,字符串s2= "**" , strlen(s2)= 2 , s1+strlen(s2)-1= s1+ 1 ;4) 第4行输出:**** ,此时,字符串s2= "*" , strlen(s2)= 1 , s1+strlen(s2)-1= s1+0 . 【实验题3】程序填空:用选择法将5个字符串“Zhao”、“Qian”、“Sun”,“Li”,“Wang”按降序排序,并输出(要求:使用字符型指针数组)#include<stdio.h>#include<string.h> //Line 2void main(){ char*name[5]={"Zhao", "Qian", "Sun","Li","Wang"}, *s; //1个指针对应1个字符串,共5个字符型指针int i,j,k;for(i=0; i< 4 ; i++) {k= i;for(j= i+1 ; j< 5 ; j++)if(strcmp(name[j], name[k]) >0 ) k= j; //注意:是降序s= name[i] ; name[i]= name[k] ; name[k]= s ; //交换name[i]与name[k] }for(i=0; i<5; i++) puts( name[i] ); //输出排序后的字符串}运行程序,结果显示为:——如果删除语句行Line2,程序是否能正常编译?为什么?--不能,因为要使用字符串比较函数strcmp,必须要包含string.h 【实验题4】程序设计:在主函数中输入一段你或者你们组最想说的话(英文),以这句话作为字符串,编写函数1:输出本字符串并,计算字符串长度;函数2:找出期中大写字母、小写字母、空格、数字,以及其他字符各有多少。
#include <stdio.h>int main(){void length(char *p);void check(char *p);char *str="Love You 10000 Years!!!";length(str);//输出长度check(str);//检测字符串字符类型个数return 0;}void length(char *p) //输出长度函数{int n=0;printf("%s\n",p);while (*p!='\0'){n++;p++;}printf("The length of string is %d.\n",n);}void check(char *p)//检测字符串字符个数函数{int upper=0,lower=0,digit=0,space=0,other=0,i=0;while (*p!='\0'){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++;}printf("upper case:%d,lower case:%d\n",upper,lower);printf("space:%d,digit:%d,other:%d\n",space,digit,other);}【实验题5】程序设计:编写一个程序,输入组号,输出该组的组名。
例如,输入“9”,则输出“开心小团体”,要求用指针处理。
#include <stdio.h>int main(){char *group_name[11]={"illegal group num","No.1","六只老虎","第三组","Hello c!","铠甲勇士","农夫山泉","C7","学霸6+1","开心小团体","小霸王"};int n;printf("input group num:\n");scanf("%d",&n);if ((n<=10) && (n>=1))printf("It is %s.\n",*(group_name+n));elseprintf("It is wrong.\n");return 0;}【实验题6】写一个用梯形法求定积分的通用函数,分别求sin(x),cos(x),exp(x)函数从0到1的定积分(参考课本292页13题,注意本题用梯形法非矩形法)。
#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=100;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)+(*p)(x+h))*h/2; }return(s);}float fsin(float x){return sin(x);}float fcos(float x){return cos(x);}float fexp(float x){return exp(x);}。