c语言第二次实验报告
题目一:11-7 找鞍点
设计思路:
1.输入一个二维数组
2.判断有几个点,如果只有一个则就是是鞍点
3.然后用for循环判断是否为行最大值,且为列最小值
4.输出
实现方法:
用双重for循环遍历比较大小,判断鞍点,也是整个程序最难的地方。
题目二:12-8 删除重复字符
设计思路:
1.定义二个数组,并赋初值为0
2.读取一个字符串
3.判断数组中被填充的位置,填充的是非0值,没填充的是0值
实现方法:
str1中每个字符的assic码作为str2的下标值,并把对应位置填充为1,同一个字符的assci值相同,所以这样就去掉了重复字符。
题目三:13-6 数组循环右移
设计思路:
1.定义一个空的数组
2.把右移后的原数组放入空数组
3.输出空数组
实现方法:
重定义一个数组,把处理过数据处理进去比较简便。
题目四:14-4 输出月份英文名
设计思路:
1.定义指针函数
2.按照n的数字返回字符串
3.如果为月份外数字则反NULL
实现方法:
简单暴力的return,避开了一些麻烦
题目五:15-3 函数实现字符串逆序
设计思路:额外设定一个指针,从后到前输入
实现方法:while循环调整指针的前后位置。
二、部分源程序
11-7 找鞍点:
for(i=0; i<n; i++) { y=i; for(p=0; p<n; p++) //找行最大值 { if(a[i][k]<=a[i][p])//数组元素之间比较,若比a[i][k]大,则将数组列标赋给k { k=p; } } for(j=0; j<n; j++)//判断是否为列最小值 { if(a[y][k]>a[j][k])//若此行最大值不是列所在最小值,把小的行标赋给y { y=j; break; } } if(i==y)//行最大且列最小,判断条件行标不改变 { flag=0; break; } }
12-8 删除重复字符
for(i=0;str1[i];i++) { str2[str1[i]]=1;//str1中每个字符的assic码作为str2的下标值,并把对应位置填充为1,同一个字符的assci值相同,所以这样就去掉了重复字符 } for(i=0;i!=256;i++) if(str2[i]==1)//判断数组中被str1填充的位置,填充的是非0值,没填充的是0值 printf("%c",i);//输出str2的下标值,对应str1中的字符值 putchar('\n');
13-6 数组循环右移
int ArrayShift( int a[], int n, int m ) { int b[1000],i; for( i=0 ; i<n ; i++ ) { if(m>n) while(m>n) m=m-n; if(i-m<0) b[i]=a[n-m+i]; else b[i]=a[i-m]; } for( i=0 ; i<n ; i++ ) { a[i]=b[i]; } }
14-4 输出月份英文名
char *getmonth( int n ) { if(n==1) return ("January"); if(n==2) return ("February"); if(n==3) return ("March"); if(n==4) return ("April"); if(n==5) return ("May"); if(n==6) return ("June"); if(n==7) return ("July"); if(n==8) return ("August"); if(n==9) return ("September"); if(n==10) return ("October"); if(n==11) return ("November"); if(n==12) return ("December"); else return (NULL); }
15-3 函数实现字符串逆序
void f(char *s) { char c,*p,*q; p=q=s; while (*q) q++; q--; while ( p<q ) { c=(*p); (*p)=(*q); (*q)=c; p++; q--; } }
三、遇到的问题和解决办法。
1.测试点没有考虑周全
2.编译过程小错误不断
3.遇到问题应及时想他人求助
4.不要累计问题