一、实验题目,设计思路,实现方法
实验题目:十一次 11-7 十二次12-8 十三次 13-5 十四次 14-3 十五次 15-7
设计思路:11-7:鞍点就是行最大列最小,分两点,一:只有一行一列则必然是鞍点,二:二维(行列大于1)。先从第一行开始找行最大,再在这个数字所对应的列中寻找列最小,若就是行最大,则输出该点的行列下标,不是则进入下一行继续寻找。
12-8:计算字符长度,字符串排序,除去排好字符里的重复字符,并放入新的字符组里,然后输出
13-5:计算字符串长度,i从0开始增,j从长度减一开始减,当i<j时,一直判断该两个位置的数是否相同,若有不同循环结束,输出不是回文,若一直循环到i>=j则输出是回文。
14-3:值得注意的是要返回是的首地址,先找到s的首地址,然后t从首地址依次赋给s末地址及后面的地址。
15-7:根据规律,找到递归出口和递归调用函数。
二、源程序
11-7
#include <stdio.h> int main() { int a[6][6];//定义二维数组 int n; scanf("%d",&n); int i,j; for(i=0; i<n; i++) for(j=0; j<n; j++) { scanf("%d",&a[i][j]); } int k=0,y=0,flag=1,p=0; if(n==1) printf("0 0");//只有一个点时,一定是鞍点 else { 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; } } if(flag==0) printf("%d %d",i,k); else printf("NONE"); } return 0; }
12-8:
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h> int main() { int min,i,j,k=0; char str[80],str_pr[80],t; gets(str); int c; c=strlen(str);//strlen计算字符长度,头文件string.h for(j=0;j<c;j++){ min=j; for(i=j+1;i<c;i++) if(str[min]>str[i]) min=i; t=str[min]; str[min]=str[j]; str[j]=t; } //字符串排序 for(i=0;i<c;i++){ for(j=i;j<c;j++){ if(((' '<=str[j]&&str[j]<='~'))&&(str[j]==str[i])){ str_pr[k]=str[j]; for(int x=0;x<c;x++){ if(str_pr[k]==str[x]){ str[x]=0; } } k++; } } } //除去排好字符里的重复字符,并放入str_pr字符组里 for(i=0;i<k;i++){ printf("%c",str_pr[i]); } return 0; }
13-5:
bool palindrome( char *s ) { int len=strlen(s); int k=0,i=0,j=len-1; while(i<j){ if(s[i]!=s[j]) break; i++; j--; } if(i>=j) return true; else return false; }
14-3:
char *str_cat( char *s, char *t ) { while(*s!=0) s++; while(*t!=0){ *s=*t; s++; t++; } *s='