1.struct stu
{ int num;char name[10];int age};
void py(struct stu *p)
{ printf("%s\n",(*p).name);}
main()
{ struct stu student[3]={{1001,"Sun",25},
{1002,"Ling",23},
{1003,"Shen",22};
py(student+2);
}
【解析】本程序是由3段組成的。第1段是結(jié)構(gòu)型stn的定義;第2段是函數(shù)py()的定義;第3段是主函數(shù)。
我們先分析主函數(shù)。首先定義了結(jié)構(gòu)型stu的數(shù)組student[3],并且給3個(gè)元素的所有成員都賦了初值。接著調(diào)用了函數(shù)py,對(duì)應(yīng)的實(shí)參是結(jié)構(gòu)型數(shù)組元素student[2]的地址。注意,“數(shù)組名+k”是數(shù)組元素“數(shù)組名[k]”的地址。
再來分析函數(shù)調(diào)用"py(student+2);"。調(diào)用時(shí),首先把實(shí)參傳遞給形參,即把結(jié)構(gòu)型stu的數(shù)組元素student[2」的地址"student+2"傳遞給形式參數(shù)“結(jié)構(gòu)型stu的指針變量p”。
然后執(zhí)行函數(shù)體,輸出表達(dá)式是"(*p).name",這是結(jié)構(gòu)型stu的指針變量p指向的結(jié)構(gòu)型stu數(shù)據(jù)(即結(jié)構(gòu)型stu的數(shù)組元素student[2〕)的成員name,其值是字符串"Shen"。這就是本題的答案。
【參考答案】Shen
2.# include"stdio.h"
main()
{ char c;
while((c=getchar())!=’\n’)
switch(c)
{case ’0’:
case’1’: putchar(c);
case’2’:putchar(c);break;
case’3’:putchar(c);
default:putchar(c+1);break;
}
printf("\n");
}
假定本程序執(zhí)行時(shí)輸入:1357/(其中的/代表回車換行符)。
【解析】本題也可以采用記錄的方法。
執(zhí)行 while循環(huán)。
輸入第1個(gè)字符'1',不是'\n',執(zhí)行switch語句的"case'1'"后的輸出語句,輸出字符'1';由于其后沒有“break”語句,則繼續(xù)執(zhí)行"case'2'"后的語句,輸出字符'1'。輸入第2個(gè)字符'3',不是'\n',執(zhí)行switch語句的"case'3'"后的輸出語句,輸出字符'3';由于其后沒有“break”語句,則繼續(xù)執(zhí)行"default"后的語句,輸出字符'4'。
繼續(xù)while循環(huán)。
輸入第3個(gè)字符'5',不是'\n',執(zhí)行switch語句的"default"后的語句,輸出字符'6'。
繼續(xù)while循環(huán)。
輸入第4個(gè)字符呼'7',不是'\n',執(zhí)行switch語句的"default"后的語句,輸出字符'8'。
繼續(xù)While循環(huán)。
輸入第 5個(gè)字符'\n',是'\n',退出while循環(huán),輸出“回車換行符”。
注意switch語句的執(zhí)行過程是:在每個(gè)“case”分支之后,可以有多個(gè)語句,程序?qū)⒁来螆?zhí)行這些語句,直到遇見“break”語句或者switch語句的右花括號(hào)“}”。如果某個(gè)“case”分支的后面沒有“break”語句,它在執(zhí)行完本分支后的所有語句之后,將繼續(xù)執(zhí)行下一個(gè)分支中的語句,直到出現(xiàn)“break”語句或者switch語句的右花括號(hào)“}”后才中止本分支的執(zhí)行。
【參考答案】113468
程序設(shè)計(jì)題
3.編函數(shù)計(jì)算并返回m行6列整型數(shù)組a周邊元素之和(即第1行、第m行、第1列、第6列上元素之和,但是重復(fù)元素只參加1次求和)。數(shù)組名a和m、n作為函數(shù)參數(shù)。
【解析】先用單重循環(huán)求第1行和第m行上元素之和,控制循環(huán)的變量i對(duì)應(yīng)列下標(biāo),依次等于0、1、…、5,參與求和的數(shù)組元素是a[0][i]和a[m-1][i]。
再用單重循環(huán)求第1列和第6列上元素之和(注意排除第1行和第m行),控制循環(huán)的變量1對(duì)應(yīng)行下標(biāo),依次等于1、…、m-2,參與求和的數(shù)組元素是a[i][0]和a[i][5]。
【參考答案】int fun(a,m)
int a[][6];
{ int i,s=0;
for(i=0;i<6;i++)
s+=a[0][i]+a[m一1][i];
for(i=1;i
s+=a[i][0]+a[i][5];
return(S);
}
4.編程序從鍵盤上輸入一個(gè)字符串(長(zhǎng)度小于或等于80),分別統(tǒng)計(jì)其中的字母、數(shù)字和其他字符的數(shù)目。本題要求用指向數(shù)組首地址的指針變量來處理字符率中的字符。
【解析】定義字符型數(shù)組和指向數(shù)組首地址的指針變量。利用系統(tǒng)函數(shù)輸入一個(gè)字符串,存入字符型數(shù)組。利用單重循環(huán)依次處理字符串中的單個(gè)字符,直到當(dāng)前字符是字符率結(jié)束標(biāo)記符為止。在循環(huán)體中利用if-else組成的嵌套雙分支結(jié)構(gòu)處理3個(gè)分支:是字母的,則在對(duì)應(yīng)計(jì)數(shù)變量c1且中加1;是數(shù)字的,則在對(duì)應(yīng)計(jì)數(shù)變量c2中加1;其他情況,則在對(duì)應(yīng)計(jì)數(shù)變量c3中加1。注意,這3個(gè)計(jì)數(shù)變量在循環(huán)前必須清0。
【參考答案】main()
{ char s[81],*p=s;
int c1,c2,c3;
c1=c2=c3=0;
scanf("%s",s);
while(*p!='\0')
{ if((*p>='a')&&(*p<='z'))
c1++;
else if((*p>='A')&&(*p<='Z'))
c1++;
else if((*p>+'0')&&(*p<='9'))
c2++;
else
c3++;
p++;
}
printf("c1=%d c2=%d c3=%d\n", c1,c2,c3);
}
5.編寫一個(gè)模擬簡(jiǎn)單計(jì)算器的程序,計(jì)算表達(dá)式:a1 op a2的值,要求 a1、op、a2從盤輸入。其中a1、a2(作除數(shù)時(shí)不能為0)為數(shù)值,op為運(yùn)算符+、-、*、/。
【解析】本程序首先要定義相關(guān)的變量,a1和a2為單精度實(shí)型,op為字符型。接著要輸入兩個(gè)運(yùn)算數(shù)和運(yùn)算符。后要按照運(yùn)算符進(jìn)行分支處理,由于分支的條件是運(yùn)算符op等于不同的值,所以可以選取swtch語句來完成。其中當(dāng)op為'\'時(shí),要注意區(qū)分出除數(shù)a2為0的異常情況。
【參考答案】#include "math.h"
main()
{ float a1,a2;
char op;
scanf("%f,%c,%f",&a1,&op,&a2);
switch(op)
{ case'+':printf("a1+a2=%f\n",a1+a2);break;
case'-':printf("a1-a2=%f\n",a1-a2); break;
case'*':printf("a1*a2=%f\n", a1*a2);break;
case'/':if(fabs(a2)<1e-4)
printf("division by zero.\n");
else
printf("a1/a2=%f\n",a1/a2);
break;
default:printf("unknown operator.\n");
}
}
6.編寫一程序,從鍵盤輸入10個(gè)實(shí)數(shù),計(jì)算并輸出算術(shù)平均值。
【解析】相關(guān)的變量和數(shù)組:用來存放算術(shù)平均值的變量(例如用ave)、存放10個(gè)實(shí)數(shù)的一準(zhǔn)數(shù)組(例如用a[10」)。因?yàn)閍ve要求和,所以事先要賦初值0.0。第1個(gè)次數(shù)為10的循環(huán)用于輸入10個(gè)實(shí)數(shù)存入數(shù)組a,可以使用for循環(huán),利用下標(biāo)變量i來控制循環(huán)。第2個(gè)次數(shù)為10的循環(huán)用于求10個(gè)數(shù)組元素之和存入變量刪,可以使用for循環(huán),利用下標(biāo)變量i來控制循環(huán)。后是輸出結(jié)果,要注意變量ave中存放的是和,必須除10后才是平均值。
【參考答案】 main()
{ int i;
float ave=0.0,a[10];
for(i=0;i<10;i++)
scanf("%f",&a[i]);
for(i=0;i<10;i++)
ave+=a[i];
printf(".4f\n",ave/10.0);.
}
7.編程序輸入50個(gè)學(xué)生的學(xué)號(hào)、姓名、3門課程的成績(jī)存入一個(gè)結(jié)構(gòu)型的數(shù)組。統(tǒng)計(jì)每個(gè)學(xué)生的總分并輸出學(xué)生的學(xué)號(hào)、姓名、總分。
【解析】首先要設(shè)計(jì)一個(gè)結(jié)構(gòu)型,其成員包括學(xué)號(hào)(長(zhǎng)整型)、姓名(字符數(shù)組)、3個(gè)成績(jī)(實(shí)型或?qū)嵭蛿?shù)組)、總分(實(shí)型)。定義長(zhǎng)度為50的這種結(jié)構(gòu)型數(shù)組。用單重50次的次數(shù)型循環(huán)輸出50個(gè)學(xué)生的信息。再用次數(shù)為50的單重循環(huán)依次求出每個(gè)學(xué)生的總分(等于3科成績(jī)之和)存入成員總分中。后仍然用50次的單重循環(huán)輸出50個(gè)學(xué)生的學(xué)號(hào)、姓名和總分。
【參考答案】main()
{ struct{ long num;
char name[20];
float score1;
float score2;
float score3;
float total;
}stu[50」;
int i;
float x1,x2,x3
for(i=0;i<50;i++)
{ scanf(",%s",&stu[i].num,stu[i].name);
scanf("%f,%f,%f",&x1,&x2,&x3);
stu[i].score=x1,stu[i].score2=x2,stu[i].score3=x3;
}
for (i=0;i<50;i++)
stu[i].total=stu[i].scorel+stu[i].score2+stu[i].score3;
for(i=0;i<50;i++)
printf("%name%f\n:", stu[i].num,stu[i].total);
}
8.編寫一程序,輸出如下圖形。
*****
*****
*****
*****
【解析】分析題目中給出的圖形,可以看出需要使用二重循環(huán)結(jié)構(gòu)。外層循環(huán)控制行,這是次數(shù)為4的次數(shù)型循環(huán)結(jié)構(gòu),可以使用for語句,其控制循環(huán)的變量i依次等于1、2.3、4,循環(huán)體中的工作有兩項(xiàng):一項(xiàng)是輸出前面的空格,第二項(xiàng)是輸出該行上的符號(hào)串”*****”。由此得出外層循環(huán)結(jié)構(gòu)如下:
for(i=1;i<=4;i++)
{ 輸出前面的空格;
輸出符號(hào)串”*****”;
輸出前面的空格需要使用循環(huán)。我們來看題目中給出的圖形,第1行上要輸出的空格數(shù)目是0,即“1-1”。第2行上要輸出的空格數(shù)目是1,即“2-1”,…。顯然,第i行上要輸出的空格數(shù)目是“i一1”。由此可以得出這個(gè)循環(huán)也是次數(shù)型循環(huán),控制循環(huán)的變量j依次等于 1、2、…、 i-1。其中的i是行數(shù)。由此可以得出這個(gè)內(nèi)層循環(huán)的結(jié)構(gòu)如下:
for(j=1;i<=i-1;j++)
輸出1個(gè)空格;
外層循環(huán)體中的第二項(xiàng)是輸出本行上的符號(hào)串”*****”。這項(xiàng)工作比較簡(jiǎn)單,用一條輸出語句“printf(“*****\n”);”即可。
依據(jù)上述分析,可以很容易寫出程序清單。
【參考答案】 main()
{ int i,j;
for(i=1;i<=4;i++)
{ for(j=1;j<=i-1;j++)
printf("");
printf(”*****\n”);
}
}
{ int num;char name[10];int age};
void py(struct stu *p)
{ printf("%s\n",(*p).name);}
main()
{ struct stu student[3]={{1001,"Sun",25},
{1002,"Ling",23},
{1003,"Shen",22};
py(student+2);
}
【解析】本程序是由3段組成的。第1段是結(jié)構(gòu)型stn的定義;第2段是函數(shù)py()的定義;第3段是主函數(shù)。
我們先分析主函數(shù)。首先定義了結(jié)構(gòu)型stu的數(shù)組student[3],并且給3個(gè)元素的所有成員都賦了初值。接著調(diào)用了函數(shù)py,對(duì)應(yīng)的實(shí)參是結(jié)構(gòu)型數(shù)組元素student[2]的地址。注意,“數(shù)組名+k”是數(shù)組元素“數(shù)組名[k]”的地址。
再來分析函數(shù)調(diào)用"py(student+2);"。調(diào)用時(shí),首先把實(shí)參傳遞給形參,即把結(jié)構(gòu)型stu的數(shù)組元素student[2」的地址"student+2"傳遞給形式參數(shù)“結(jié)構(gòu)型stu的指針變量p”。
然后執(zhí)行函數(shù)體,輸出表達(dá)式是"(*p).name",這是結(jié)構(gòu)型stu的指針變量p指向的結(jié)構(gòu)型stu數(shù)據(jù)(即結(jié)構(gòu)型stu的數(shù)組元素student[2〕)的成員name,其值是字符串"Shen"。這就是本題的答案。
【參考答案】Shen
2.# include"stdio.h"
main()
{ char c;
while((c=getchar())!=’\n’)
switch(c)
{case ’0’:
case’1’: putchar(c);
case’2’:putchar(c);break;
case’3’:putchar(c);
default:putchar(c+1);break;
}
printf("\n");
}
假定本程序執(zhí)行時(shí)輸入:1357/(其中的/代表回車換行符)。
【解析】本題也可以采用記錄的方法。
執(zhí)行 while循環(huán)。
輸入第1個(gè)字符'1',不是'\n',執(zhí)行switch語句的"case'1'"后的輸出語句,輸出字符'1';由于其后沒有“break”語句,則繼續(xù)執(zhí)行"case'2'"后的語句,輸出字符'1'。輸入第2個(gè)字符'3',不是'\n',執(zhí)行switch語句的"case'3'"后的輸出語句,輸出字符'3';由于其后沒有“break”語句,則繼續(xù)執(zhí)行"default"后的語句,輸出字符'4'。
繼續(xù)while循環(huán)。
輸入第3個(gè)字符'5',不是'\n',執(zhí)行switch語句的"default"后的語句,輸出字符'6'。
繼續(xù)while循環(huán)。
輸入第4個(gè)字符呼'7',不是'\n',執(zhí)行switch語句的"default"后的語句,輸出字符'8'。
繼續(xù)While循環(huán)。
輸入第 5個(gè)字符'\n',是'\n',退出while循環(huán),輸出“回車換行符”。
注意switch語句的執(zhí)行過程是:在每個(gè)“case”分支之后,可以有多個(gè)語句,程序?qū)⒁来螆?zhí)行這些語句,直到遇見“break”語句或者switch語句的右花括號(hào)“}”。如果某個(gè)“case”分支的后面沒有“break”語句,它在執(zhí)行完本分支后的所有語句之后,將繼續(xù)執(zhí)行下一個(gè)分支中的語句,直到出現(xiàn)“break”語句或者switch語句的右花括號(hào)“}”后才中止本分支的執(zhí)行。
【參考答案】113468
程序設(shè)計(jì)題
3.編函數(shù)計(jì)算并返回m行6列整型數(shù)組a周邊元素之和(即第1行、第m行、第1列、第6列上元素之和,但是重復(fù)元素只參加1次求和)。數(shù)組名a和m、n作為函數(shù)參數(shù)。
【解析】先用單重循環(huán)求第1行和第m行上元素之和,控制循環(huán)的變量i對(duì)應(yīng)列下標(biāo),依次等于0、1、…、5,參與求和的數(shù)組元素是a[0][i]和a[m-1][i]。
再用單重循環(huán)求第1列和第6列上元素之和(注意排除第1行和第m行),控制循環(huán)的變量1對(duì)應(yīng)行下標(biāo),依次等于1、…、m-2,參與求和的數(shù)組元素是a[i][0]和a[i][5]。
【參考答案】int fun(a,m)
int a[][6];
{ int i,s=0;
for(i=0;i<6;i++)
s+=a[0][i]+a[m一1][i];
for(i=1;i
s+=a[i][0]+a[i][5];
return(S);
}
4.編程序從鍵盤上輸入一個(gè)字符串(長(zhǎng)度小于或等于80),分別統(tǒng)計(jì)其中的字母、數(shù)字和其他字符的數(shù)目。本題要求用指向數(shù)組首地址的指針變量來處理字符率中的字符。
【解析】定義字符型數(shù)組和指向數(shù)組首地址的指針變量。利用系統(tǒng)函數(shù)輸入一個(gè)字符串,存入字符型數(shù)組。利用單重循環(huán)依次處理字符串中的單個(gè)字符,直到當(dāng)前字符是字符率結(jié)束標(biāo)記符為止。在循環(huán)體中利用if-else組成的嵌套雙分支結(jié)構(gòu)處理3個(gè)分支:是字母的,則在對(duì)應(yīng)計(jì)數(shù)變量c1且中加1;是數(shù)字的,則在對(duì)應(yīng)計(jì)數(shù)變量c2中加1;其他情況,則在對(duì)應(yīng)計(jì)數(shù)變量c3中加1。注意,這3個(gè)計(jì)數(shù)變量在循環(huán)前必須清0。
【參考答案】main()
{ char s[81],*p=s;
int c1,c2,c3;
c1=c2=c3=0;
scanf("%s",s);
while(*p!='\0')
{ if((*p>='a')&&(*p<='z'))
c1++;
else if((*p>='A')&&(*p<='Z'))
c1++;
else if((*p>+'0')&&(*p<='9'))
c2++;
else
c3++;
p++;
}
printf("c1=%d c2=%d c3=%d\n", c1,c2,c3);
}
5.編寫一個(gè)模擬簡(jiǎn)單計(jì)算器的程序,計(jì)算表達(dá)式:a1 op a2的值,要求 a1、op、a2從盤輸入。其中a1、a2(作除數(shù)時(shí)不能為0)為數(shù)值,op為運(yùn)算符+、-、*、/。
【解析】本程序首先要定義相關(guān)的變量,a1和a2為單精度實(shí)型,op為字符型。接著要輸入兩個(gè)運(yùn)算數(shù)和運(yùn)算符。后要按照運(yùn)算符進(jìn)行分支處理,由于分支的條件是運(yùn)算符op等于不同的值,所以可以選取swtch語句來完成。其中當(dāng)op為'\'時(shí),要注意區(qū)分出除數(shù)a2為0的異常情況。
【參考答案】#include "math.h"
main()
{ float a1,a2;
char op;
scanf("%f,%c,%f",&a1,&op,&a2);
switch(op)
{ case'+':printf("a1+a2=%f\n",a1+a2);break;
case'-':printf("a1-a2=%f\n",a1-a2); break;
case'*':printf("a1*a2=%f\n", a1*a2);break;
case'/':if(fabs(a2)<1e-4)
printf("division by zero.\n");
else
printf("a1/a2=%f\n",a1/a2);
break;
default:printf("unknown operator.\n");
}
}
6.編寫一程序,從鍵盤輸入10個(gè)實(shí)數(shù),計(jì)算并輸出算術(shù)平均值。
【解析】相關(guān)的變量和數(shù)組:用來存放算術(shù)平均值的變量(例如用ave)、存放10個(gè)實(shí)數(shù)的一準(zhǔn)數(shù)組(例如用a[10」)。因?yàn)閍ve要求和,所以事先要賦初值0.0。第1個(gè)次數(shù)為10的循環(huán)用于輸入10個(gè)實(shí)數(shù)存入數(shù)組a,可以使用for循環(huán),利用下標(biāo)變量i來控制循環(huán)。第2個(gè)次數(shù)為10的循環(huán)用于求10個(gè)數(shù)組元素之和存入變量刪,可以使用for循環(huán),利用下標(biāo)變量i來控制循環(huán)。后是輸出結(jié)果,要注意變量ave中存放的是和,必須除10后才是平均值。
【參考答案】 main()
{ int i;
float ave=0.0,a[10];
for(i=0;i<10;i++)
scanf("%f",&a[i]);
for(i=0;i<10;i++)
ave+=a[i];
printf(".4f\n",ave/10.0);.
}
7.編程序輸入50個(gè)學(xué)生的學(xué)號(hào)、姓名、3門課程的成績(jī)存入一個(gè)結(jié)構(gòu)型的數(shù)組。統(tǒng)計(jì)每個(gè)學(xué)生的總分并輸出學(xué)生的學(xué)號(hào)、姓名、總分。
【解析】首先要設(shè)計(jì)一個(gè)結(jié)構(gòu)型,其成員包括學(xué)號(hào)(長(zhǎng)整型)、姓名(字符數(shù)組)、3個(gè)成績(jī)(實(shí)型或?qū)嵭蛿?shù)組)、總分(實(shí)型)。定義長(zhǎng)度為50的這種結(jié)構(gòu)型數(shù)組。用單重50次的次數(shù)型循環(huán)輸出50個(gè)學(xué)生的信息。再用次數(shù)為50的單重循環(huán)依次求出每個(gè)學(xué)生的總分(等于3科成績(jī)之和)存入成員總分中。后仍然用50次的單重循環(huán)輸出50個(gè)學(xué)生的學(xué)號(hào)、姓名和總分。
【參考答案】main()
{ struct{ long num;
char name[20];
float score1;
float score2;
float score3;
float total;
}stu[50」;
int i;
float x1,x2,x3
for(i=0;i<50;i++)
{ scanf(",%s",&stu[i].num,stu[i].name);
scanf("%f,%f,%f",&x1,&x2,&x3);
stu[i].score=x1,stu[i].score2=x2,stu[i].score3=x3;
}
for (i=0;i<50;i++)
stu[i].total=stu[i].scorel+stu[i].score2+stu[i].score3;
for(i=0;i<50;i++)
printf("%name%f\n:", stu[i].num,stu[i].total);
}
8.編寫一程序,輸出如下圖形。
*****
*****
*****
*****
【解析】分析題目中給出的圖形,可以看出需要使用二重循環(huán)結(jié)構(gòu)。外層循環(huán)控制行,這是次數(shù)為4的次數(shù)型循環(huán)結(jié)構(gòu),可以使用for語句,其控制循環(huán)的變量i依次等于1、2.3、4,循環(huán)體中的工作有兩項(xiàng):一項(xiàng)是輸出前面的空格,第二項(xiàng)是輸出該行上的符號(hào)串”*****”。由此得出外層循環(huán)結(jié)構(gòu)如下:
for(i=1;i<=4;i++)
{ 輸出前面的空格;
輸出符號(hào)串”*****”;
輸出前面的空格需要使用循環(huán)。我們來看題目中給出的圖形,第1行上要輸出的空格數(shù)目是0,即“1-1”。第2行上要輸出的空格數(shù)目是1,即“2-1”,…。顯然,第i行上要輸出的空格數(shù)目是“i一1”。由此可以得出這個(gè)循環(huán)也是次數(shù)型循環(huán),控制循環(huán)的變量j依次等于 1、2、…、 i-1。其中的i是行數(shù)。由此可以得出這個(gè)內(nèi)層循環(huán)的結(jié)構(gòu)如下:
for(j=1;i<=i-1;j++)
輸出1個(gè)空格;
外層循環(huán)體中的第二項(xiàng)是輸出本行上的符號(hào)串”*****”。這項(xiàng)工作比較簡(jiǎn)單,用一條輸出語句“printf(“*****\n”);”即可。
依據(jù)上述分析,可以很容易寫出程序清單。
【參考答案】 main()
{ int i,j;
for(i=1;i<=4;i++)
{ for(j=1;j<=i-1;j++)
printf("");
printf(”*****\n”);
}
}