- 实验目的 (1) 掌握一维数组和二维数组的定义、赋值和输入输出的方法。 (2) 掌握字符数组和字符串函数的使用。 (3) 掌握与数组有关的算法(特别是排序算法)。
- 实验内容 编程序并上机调试运行。 (1) 用选择法对10个整数排序。10个整数用scanf函数输入。 (2) 已有一个排好序的数组,要求输入一个数后,按原来排序规律将它插入数组中。 (3) 有一篇文章,共3行文字,每行80个字符。要求分别统计出其中英文大写字母、小写字母、数字、空格以及其他字符的个数。 (4) 找出一个二维数组的“鞍点”,即该位置上的元素在该行上最大,在该列上最小。也可能没有鞍点。 应当至少准备两组测试数据: ①二维数组有鞍点,例如:
②二维数组没有鞍点,例如:
用scanf函数从键盘输入数组各元素的值,检查结果是否正确。题目并未制定二维数组的行数和列数,程序应能处理任意行数和列数的数组。因此,从理论上来说,应当准备许多不同行数和列数的数组数据,但这样的工作量太大,一般来说不需要这样做,只须准备典型的数据即可。 如果已指定了数组的行数和列数,可以在程序中对数组元素赋初值,而不必用scanf函数。请修改程序以实现之。
实验1: #include<stdio.h> int main() { int i,j,min,t,a[10]; for(i=0;i<10;i++) scanf("%d",&a[i]); for(i=0;i<9;i++){ for(j=i+1;j<10;j++){ min=i; if(a[min]>a[j]) min=j; if(min!=i){t=a[i];a[i]=a[min];a[min]=t; } } } for(i=0;i<10;i++) printf("%d\t",a[i]); }
优化方案: #include<stdio.h> void swap(int *a,int *b){ int t; t=*a; *a=*b; *b=t; } int main(){ int a[10],i,j,min; for(i=0;i<10;i++) scanf("%d",&a[i]); for(i=0;i<10;i++){ for(j=i+1;j<10;j++){ if(a[i]>a[j]) swap(&a[i],&a[j]); } } for(i=0;i<10;i++) printf("%d\t",a[i]); }
实验2: 从小到大: #include<stdio.h> int main() { int i,a[6]={0,1,2,3,4,5,},b,c; scanf("%d",&b); for(i=0;i<6;i++){ if(b<a[i]){ c=i; break; } } if(c!=1){ for(i=4;i>=c;i--) a[i+1]=a[i]; a[c]=b; } for(i=0;i<6;i++) printf("%d",a[i]); }
优化代码:任意从小到大数组插入 #include<stdio.h> int main() { char u; int i,a[1000],b,c=-1,j; printf("输入数组"); scanf("%d",&a[0]); for(i=1;(u=getchar())!='\n';i++){ scanf("%d",&a[i]); } printf("输入插入的数"); scanf("%d",&b); for(j=0;j<i;j++){ if(b<a[j]){ c=j; break; } } if(c!=-1&&c!=0){ for(j=i;j>=c;j--) a[j+1]=a[j]; a[c]=b; } for(j=0;j<i;j++) printf("%d\t",a[j]); } 从大到小: #include<stdio.h> int main() { int i,a[6]={5,4,3,2,1,0,},b,c; scanf("%d",&b); for(i=0;i<6;i++){ if(b>a[i]){ c=i; break; } } if(c!=1&&c!=0){ for(i=4;i>=c;i--) a[i+1]=a[i]; a[c]=b; } for(i=0;i<6;i++) printf("%d",a[i]); } PS:若写入一个程序,则判断a[0]>a[5]=1还是a[0]>a[5]=0
实验3: #include<stdio.h> int main() { char a[3][80]; int b,c,d,e,f,i,j; b=c=d=e=f=0; for(i=0;i<3;i++){ for(j=0;j<80&&(a[i][j]=getchar())!='\n';j++){ if(a[i][j]>='a'&&a[i][j]<='z') b++; else if(a[i][j]>='A'&&a[i][j]<='Z') c++; else if(a[i][j]>='0'&&a[i][j]<='9') d++; else if(a[i][j]==' ') e++; else f++; } } printf("小写字母数为:%d\n大写字母数为:%d\n数字数为:%d\n空格数为:%d\n其他字符数为:%d\n",b,c,d,e,f); } 优化代码:含有回车计数
#include<stdio.h>
int main()
{
char a[3][80];
int b,c,d,e,f,i,j,p;
b=c=d=e=f=p=0;
for(i=0;i<3;i++){
for(j=0;j<80;j++){
a[i][j]=getchar();
if(a[i][j]>='a'&&a[i][j]<='z')
b++;
else if(a[i][j]>='A'&&a[i][j]<='Z')
c++;
else if(a[i][j]>='0'&&a[i][j]<='9')
d++;
else if(a[i][j]==' ')
e++;
else if(a[i][j]=='\n')
p++;
else f++;
}
}
printf("小写字母数为:%d\n大写字母数为:
%d\n数字数为:%d\n空格数为:%d\n其他字符
数为:%d\n回车数:%d\n",b,c,d,e,f,p);
}
实验4: #include<stdio.h> int main() { int a[3][3]={ {0,1,2}, {3,4,5}, {6,7,8} }; int max[3]={0},min[3]={9,9,9},i,j,x[3],y[3]; for(i=0;i<3;i++){ for(j=0;j<3;j++){ if(max[i]<a[i][j]) max[i]=j; } } for(j=0;j<3;j++){ for(i=0;i<3;i++){ if(min[j]>a[i][j]) min[j]=i; } } for(i=0;i<3;i++) if(min[max[i]]==i) printf("二维数组存在鞍点\n"); } PS:若要求输入二维数组a[][],则max与min的初始化应利用遍历分别取a[][]的最小值和最大值