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.不要累计问题

浙公网安备 33010602011771号