第一套上機(jī)試題
一、改錯(cuò)題
【分析】:改錯(cuò)題的錯(cuò)誤一般可分為兩類,一類是語法錯(cuò)誤,這類錯(cuò)誤可通過調(diào)試程序改正,較容易;另一類是邏輯錯(cuò)誤,這類錯(cuò)誤程序能運(yùn)行,但結(jié)果不正確,這類錯(cuò)誤相對(duì)較難,修改前必須要看懂和理解程序。
#include"stdio.h"
#define n 4 #define m 3 /*語法錯(cuò),#define m 3需另起一行*/
int a[n][m],s[m];
p(int j)/*此函數(shù)的功能為:找出a數(shù)組中第j列的最小元素的值及行號(hào),函數(shù)成功運(yùn)行后,i中即為j列的最小元素的行號(hào),s[j]中即為j列的最小元素的值*/
{int k,i,x;
x=a[0][j];i=0; /*邏輯錯(cuò),從函數(shù)的功能可知,a[0][j]也應(yīng)賦值給s[j],所以x=a[0][j]應(yīng)改為s[j]=x=a[0][j]*/
for(k=1;k
if(a[k][j]
{i=k;s[j]=x=a[k][j];}
return i;
}
main()
{int index[m],i,j,k;
for(i=0;i
for(j=0;j
scanf("%d",a[i][j]);/*語法錯(cuò),但編譯時(shí)不會(huì)報(bào)錯(cuò),scanf語句的一般形式為scanf(格式控制,地址表列),所以a[i][j]應(yīng)改為&a[i][j])*/
for(j=0,j
{index[j]=p[j];
printf("a[%d,%d]=%d\n",index[j],j,s[j]);
}
i=s[1];k=0; /*邏輯錯(cuò),數(shù)組s中存放的是a數(shù)組中每一列的最小值,比較時(shí)應(yīng)從數(shù)組的第0個(gè)元素開始,而下面的for循環(huán)是從第1個(gè)元素開始的,所以i=s[1]應(yīng)改為i=s[0]*/
for(j=1;j
if(s[j]
{i=s[j];k=j;}
printf("min=a[%d,%d]=%d",index[k],k,i); }
二、編程題
【分析】:本題的主要功能是建立一個(gè)3行8列的二維數(shù)組,并給其元素賦值,其中第1、2行的值可通過遞推公式xi+1=(25*xi+357)%1024得到,第三行的值取前兩行同列元素的公約數(shù),所以編程時(shí)可用一個(gè)函數(shù)來實(shí)現(xiàn)求公約數(shù)的算法。
#include
#include
#define n 8
/*函數(shù)gcd實(shí)現(xiàn)求公約數(shù)的算法*/
gcd(int a,int b)
{int c;
while(b!=0)
{c=a%b;a=b;b=c;}
return a;
}
main()
{int i,j,x,a[3][n];
FILE *f;
if((f=fopen("d:\\temp\\1\\myf2.out","w"))= =NULL)
{printf("Create File myf2.out Failed!\n");exit(0);}
x=26;
/*下面二重for循環(huán)實(shí)現(xiàn)給第1、2行數(shù)組元素賦值的功能*/
for(i=0;i<2;i++)
for(j=0;j
{a[i][j]=x;x=(25*x+357)%1024;}
/*下面for循環(huán)通過調(diào)用gcd函數(shù)實(shí)現(xiàn)給第3行數(shù)組元素賦值的功能*/
for(j=0;j
a[2][j]=gcd(a[0][j],a[1][j]);
/*下面for循環(huán)實(shí)現(xiàn)按題目所給格式輸出二維數(shù)組的功能*/
for(i=0;i<3;i++)
{for(j=0;j
fprintf(f,"\n");
}
fclose(f); }