for (j=1;j<=n;j++) a[i][j]=0; j=n/2+1; a[1][j]=1;
for (k=2;k<=n*n;k++) {i=i-1; j=j+1;
if ((i<1) && (j>n)) {i=i+2; j=j-1; } else
{if (i<1) i=n; if (j>n) j=1; }
if (a[i][j]==0) a[i][j]=k; else
{i=i+2; j=j-1; a[i][j]=k; } }
for (i=1;i<=n;i++) {for (j=1;j<=n;j++)
printf(\ printf(\ } return 0; }
8、 找出一个二维数组中的鞍点,即该位置上的元素在该行上最大、在该列上最小。也可能没有鞍点。 解:
#include
#define M 5 /* 数组为4行5列 */ int main() {
int i,j,k,a[N][M],max,maxj,flag;
printf(\
for (i=0;i {max=a[i][0]; /* 开始时假设a[i][0]最大 */ maxj=0; /* 将列号0赋给maxj保存 */ for (j=0;j flag=1; /* 先假设是鞍点,以flag为1代表 */ for (k=0;k if(flag) /* 如果flag1为1表示是鞍点 */ {printf(\ /* 输出鞍点的值和所在行列号 */ break; } } if(!flag) /* 如果flag为0表示鞍点不存在 */ printf(\ return 0; } 9、 有15个数按由大到小顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中第几个元素的值。如果该数不在数组中,则输出“无此数”。 解: #include { int i,number,top,bott,mid,loca,a[N],flag=1,sign; char c; printf(\ scanf(\ i=1; while(i {scanf(\ if (a[i]>=a[i-1]) i++; else printf(\ } printf(\ for (i=0;i {printf(\ scanf(\ sign=0; top=0; //top是查找区间的起始位置 bott=N-1; //bott是查找区间的最末位置 if ((numbera[N-1])) //要查的数不在查找区间内 loca=-1; // 表示找不到 while ((!sign) && (top<=bott)) {mid=(bott+top)/2; if (number==a[mid]) {loca=mid; printf(\ sign=1; } else if (number top=mid+1; } if(!sign||loca==-1) printf(\ printf(\ scanf(\ if (c=='N'||c=='n') flag=0; } return 0; } 10、 有一篇文章,共有3行文字,每行有80个字符。要求分别统计出其中英文大写字母、小写字母、数字、空格以及其他字符的个数。 解: #include \void main() { int i,j,upp,low,dig,spa,oth; char text[3][80]; upp=low=dig=spa=oth=0; for(i=0;i<3;i++) { printf(\ gets(text[i]); for(j=0;j<80&&text[i][j]!=0;j++) { if (text[i][j]>='A'&&text[i][j]<='Z') upp++; else if (text[i][j]>='a'&&text[i][j]<='z') low++; else if (text[i][j]>='0'&&text[i][j]<='9') dig++; else if (text[i][j]==' ') spa++; else oth++; } } printf(\ printf(\ printf(\ :%d\\n\ printf(\ :%d\\n\ printf(\ :%d\\n\ } 11、 输出以下图案: * * * * * * * * * * * * * * * * * * * * * * * * * 解: #include { char a[5]={'*','*','*','*','*'}; int i,j,k; char space=' '; for (i=0;i<5;i++) { printf(\ printf(\ \ for (j=1;j<=i;j++) printf(\ for (k=0;k<5;k++) printf(\ } printf(\ return 0; } 12、 有一行电文,已按下面规律译成密码: A →Z a →z B →Y b →y C →X c →x . . . . . . 即第1个字母变成第26个字母,第i个字母变成第(26-i+1)个字母,非字母字符不变。要求编程序将密码译回原文,并输出密码和原文。 解: (1) #include char ch[80],tran[80]; printf(\ gets(ch); printf(\ :%s\ j=0; while (ch[j]!='\\0') { if ((ch[j]>='A') && (ch[j]<='Z')) tran[j]=155-ch[j]; else if ((ch[j]>='a') && (ch[j]<='z')) tran[j]=219-ch[j]; else