6. main()
{ int i,a[5];
for(i=0;i<<5;i++)
a[i]=9*(i-2+4*(i>2))%5;
for(i=4;i>=0;i--)
printf("=",a[i]);
}
【分析】我們可以按照程序中語句執(zhí)行的順序,記錄各個(gè)變量及數(shù)組元素值的方法來解決這種閱讀程序?qū)戇\(yùn)行結(jié)果的問題。首先執(zhí)行第1個(gè)for循環(huán)。
i=0, i<5的條件成立,執(zhí)行循環(huán)體。
a[0]=9*(0-2+4*(0>2))%5=9*(-2)%5=-18%5=-3
i=1,1<5的條件成立,執(zhí)行循環(huán)體。
a[1]=9*(1-2十4*(1>2))%5=9*(-1)%5=-9%5=-4
1=2,i<5的條件成立,執(zhí)行循環(huán)體。
a[2]=9*(2-2十4*(2>2))%5=9*(0)%5=0%5=0
i=3,i<5的條件成立,執(zhí)行循環(huán)體。
a[3]=9*(3-2+4*(3>2))%5=9*(5)%5=45%5=0
1=4,1<5的條件成立,執(zhí)行循環(huán)體。
a[4]=9*(4-2+4*(4>2))%5=9*(6)%5=54%5=4
i=5,1<5的條件不成立,退出第1個(gè)for循環(huán)。
注意,計(jì)算中的“i>2”是關(guān)系運(yùn)算,結(jié)果只能為1或0;“x%5”是模運(yùn)算,結(jié)果是x除5的余數(shù),且余數(shù)的符號和x符號相同。
再執(zhí)行第2個(gè)for循環(huán)。
i=4,i>=0的條件成立,執(zhí)行循環(huán)體。輸出數(shù)組元素a[4]的值,等于4
i=3,i>=0的條件成立,執(zhí)行循環(huán)體。輸出數(shù)組元素a[3」的值,等于0
i=2,1>=0的條件成立,執(zhí)行循環(huán)體。輸出數(shù)組元素a[2」的位,等于0
i=1,i>=0的條件成立,執(zhí)行循環(huán)體。輸出數(shù)組元素a[1]的值,等于-4
i=0,1>=0的條件成立,執(zhí)行循環(huán)體。輸出數(shù)組元素a[0]的值,等于-3
i=-1,i>=0的條件不成立,退出第2個(gè)for循環(huán)。
【參考答案】 4 0 0 -4 -3
7.main()
{ char s[][6]={”1234”,”56789”},*p[2];
int i,sum=0;
p[0]=s[0],p[1]=s[1];
for(i=0;p[0][i」!=’\0’;i++,i++)
sum=10*sum+p[0][i]-’0’;
for(i=1;p[1]「i」!=’\0’;i++,i++)
sum=10*sum+p[1][i]-’0’;
printf("%d",sum);
}
【解析】本程序的第1條語句是定義2行5列的二維字符型數(shù)組s,并且賦了初值如下:
s[0][0]='1's[0][1]='2's[0][2]='3's[0][3]='4's[0][4]='\0'
s[1][0]='5's[1][1]='6's[1][2]='7's[1][3]='8's[1][4]='9'S[1][5]='\0'
此外還定義了字符型指針數(shù)組p,利用第3條語句賦了值,結(jié)果如下:
p[0]指向以“s[0][i]”為數(shù)組名的一維數(shù)組首地址,即p[0][i]就相當(dāng)于s[0][i]
p[1]指向以“s[1][i]”為數(shù)組名的一維數(shù)組首地址,即p[1][i]就相當(dāng)于s[1][i]
第2條語句定義了整型變量i(用于單重循環(huán)的控制變量)和sum,并對sum清0。
第4條語句是for循環(huán),控制變量i初值為0,每次加2,控制循環(huán)的條件是“p[0」[i]!='\
0',注意其中的“p[0][i]”就是“s[0][i]”,這個(gè)控制循環(huán)的條件可以理解為“二維字符型數(shù)組元素s[0][i]不是字符串的結(jié)束標(biāo)記則繼續(xù)循環(huán)”。從控制變量i的取位來看,二維字符型數(shù)組元素只能取s[0][0]、s[0][2],因?yàn)橄乱粋€(gè)數(shù)組元素是s[0][4],該元素值是'\0'。再分析循環(huán)體中的語句,其中“ p[0][i]-'0'”是將數(shù)組元素s[0][i]中存放的數(shù)組字符減去'0',結(jié)果將是該數(shù)字字符對應(yīng)的一位整數(shù),整個(gè)語句是將sum變量中的原值乘以10以后再加上當(dāng)前的數(shù)字。循環(huán)結(jié)束后的sum值就是s[0」[0」和s[0][2]中的兩個(gè)數(shù)字組成的2位十進(jìn)制數(shù),結(jié)果為13。
按照同樣的道理,可以分析出第2個(gè)for循環(huán)作用是完全相同的,它是把s[1」[1」、s[1][3]中的兩個(gè)數(shù)字(前者為6,后者為8)拼接到sum的原值中,結(jié)果sum中值為十進(jìn)制整數(shù)1368。程序的最后一個(gè)語句就是輸出變量sum中的整數(shù)值。
【參考答案】 1368
8.int p(m,n)
int m,n;
{ int i,pp;
for(i=pp=1;i
PP*= m;
return(pp);
}
main()
{ printf("%d"、 p(3,4));
}
【解析】主函數(shù)中只有一條輸出語句,輸出結(jié)果是函數(shù)調(diào)用“p(3,4)”的返回值。所以本題的關(guān)鍵是函數(shù)p的功能。
分析函數(shù)p(),有兩個(gè)參數(shù)m、n。函數(shù)體中關(guān)鍵的是for循環(huán)語句。分析這個(gè)循環(huán)語句可以看出,控制變量是i,初值為1;,終值為n,每次循環(huán)i加1。所以是標(biāo)準(zhǔn)的次數(shù)型循環(huán),共計(jì)循環(huán)n次。循環(huán)體中是將參數(shù)m的值乘到變量pp中,變量pp在開始循環(huán)時(shí)已經(jīng)設(shè)置初值為1,所以整個(gè)循環(huán)是將n個(gè)m乘到pp中。顯然循環(huán)語句的功能是計(jì)算m”。而函數(shù)的返回值正是這個(gè)變量pp中的值。
由此分析可知,函數(shù)調(diào)用“p(3,4)”的返回值就是34。結(jié)果為 81,也就是本程序的輸
出結(jié)果。
【參考答案】81
9.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,對應(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
10.# 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語句的右花括號“}”。如果某個(gè)“case”分支的后面沒有“break”語句,它在執(zhí)行完本分支后的所有語句之后,將繼續(xù)執(zhí)行下一個(gè)分支中的語句,直到出現(xiàn)“break”語句或者switch語句的右花括號“}”后才中止本分支的執(zhí)行。
【參考答案】113468
{ int i,a[5];
for(i=0;i<<5;i++)
a[i]=9*(i-2+4*(i>2))%5;
for(i=4;i>=0;i--)
printf("=",a[i]);
}
【分析】我們可以按照程序中語句執(zhí)行的順序,記錄各個(gè)變量及數(shù)組元素值的方法來解決這種閱讀程序?qū)戇\(yùn)行結(jié)果的問題。首先執(zhí)行第1個(gè)for循環(huán)。
i=0, i<5的條件成立,執(zhí)行循環(huán)體。
a[0]=9*(0-2+4*(0>2))%5=9*(-2)%5=-18%5=-3
i=1,1<5的條件成立,執(zhí)行循環(huán)體。
a[1]=9*(1-2十4*(1>2))%5=9*(-1)%5=-9%5=-4
1=2,i<5的條件成立,執(zhí)行循環(huán)體。
a[2]=9*(2-2十4*(2>2))%5=9*(0)%5=0%5=0
i=3,i<5的條件成立,執(zhí)行循環(huán)體。
a[3]=9*(3-2+4*(3>2))%5=9*(5)%5=45%5=0
1=4,1<5的條件成立,執(zhí)行循環(huán)體。
a[4]=9*(4-2+4*(4>2))%5=9*(6)%5=54%5=4
i=5,1<5的條件不成立,退出第1個(gè)for循環(huán)。
注意,計(jì)算中的“i>2”是關(guān)系運(yùn)算,結(jié)果只能為1或0;“x%5”是模運(yùn)算,結(jié)果是x除5的余數(shù),且余數(shù)的符號和x符號相同。
再執(zhí)行第2個(gè)for循環(huán)。
i=4,i>=0的條件成立,執(zhí)行循環(huán)體。輸出數(shù)組元素a[4]的值,等于4
i=3,i>=0的條件成立,執(zhí)行循環(huán)體。輸出數(shù)組元素a[3」的值,等于0
i=2,1>=0的條件成立,執(zhí)行循環(huán)體。輸出數(shù)組元素a[2」的位,等于0
i=1,i>=0的條件成立,執(zhí)行循環(huán)體。輸出數(shù)組元素a[1]的值,等于-4
i=0,1>=0的條件成立,執(zhí)行循環(huán)體。輸出數(shù)組元素a[0]的值,等于-3
i=-1,i>=0的條件不成立,退出第2個(gè)for循環(huán)。
【參考答案】 4 0 0 -4 -3
7.main()
{ char s[][6]={”1234”,”56789”},*p[2];
int i,sum=0;
p[0]=s[0],p[1]=s[1];
for(i=0;p[0][i」!=’\0’;i++,i++)
sum=10*sum+p[0][i]-’0’;
for(i=1;p[1]「i」!=’\0’;i++,i++)
sum=10*sum+p[1][i]-’0’;
printf("%d",sum);
}
【解析】本程序的第1條語句是定義2行5列的二維字符型數(shù)組s,并且賦了初值如下:
s[0][0]='1's[0][1]='2's[0][2]='3's[0][3]='4's[0][4]='\0'
s[1][0]='5's[1][1]='6's[1][2]='7's[1][3]='8's[1][4]='9'S[1][5]='\0'
此外還定義了字符型指針數(shù)組p,利用第3條語句賦了值,結(jié)果如下:
p[0]指向以“s[0][i]”為數(shù)組名的一維數(shù)組首地址,即p[0][i]就相當(dāng)于s[0][i]
p[1]指向以“s[1][i]”為數(shù)組名的一維數(shù)組首地址,即p[1][i]就相當(dāng)于s[1][i]
第2條語句定義了整型變量i(用于單重循環(huán)的控制變量)和sum,并對sum清0。
第4條語句是for循環(huán),控制變量i初值為0,每次加2,控制循環(huán)的條件是“p[0」[i]!='\
0',注意其中的“p[0][i]”就是“s[0][i]”,這個(gè)控制循環(huán)的條件可以理解為“二維字符型數(shù)組元素s[0][i]不是字符串的結(jié)束標(biāo)記則繼續(xù)循環(huán)”。從控制變量i的取位來看,二維字符型數(shù)組元素只能取s[0][0]、s[0][2],因?yàn)橄乱粋€(gè)數(shù)組元素是s[0][4],該元素值是'\0'。再分析循環(huán)體中的語句,其中“ p[0][i]-'0'”是將數(shù)組元素s[0][i]中存放的數(shù)組字符減去'0',結(jié)果將是該數(shù)字字符對應(yīng)的一位整數(shù),整個(gè)語句是將sum變量中的原值乘以10以后再加上當(dāng)前的數(shù)字。循環(huán)結(jié)束后的sum值就是s[0」[0」和s[0][2]中的兩個(gè)數(shù)字組成的2位十進(jìn)制數(shù),結(jié)果為13。
按照同樣的道理,可以分析出第2個(gè)for循環(huán)作用是完全相同的,它是把s[1」[1」、s[1][3]中的兩個(gè)數(shù)字(前者為6,后者為8)拼接到sum的原值中,結(jié)果sum中值為十進(jìn)制整數(shù)1368。程序的最后一個(gè)語句就是輸出變量sum中的整數(shù)值。
【參考答案】 1368
8.int p(m,n)
int m,n;
{ int i,pp;
for(i=pp=1;i
PP*= m;
return(pp);
}
main()
{ printf("%d"、 p(3,4));
}
【解析】主函數(shù)中只有一條輸出語句,輸出結(jié)果是函數(shù)調(diào)用“p(3,4)”的返回值。所以本題的關(guān)鍵是函數(shù)p的功能。
分析函數(shù)p(),有兩個(gè)參數(shù)m、n。函數(shù)體中關(guān)鍵的是for循環(huán)語句。分析這個(gè)循環(huán)語句可以看出,控制變量是i,初值為1;,終值為n,每次循環(huán)i加1。所以是標(biāo)準(zhǔn)的次數(shù)型循環(huán),共計(jì)循環(huán)n次。循環(huán)體中是將參數(shù)m的值乘到變量pp中,變量pp在開始循環(huán)時(shí)已經(jīng)設(shè)置初值為1,所以整個(gè)循環(huán)是將n個(gè)m乘到pp中。顯然循環(huán)語句的功能是計(jì)算m”。而函數(shù)的返回值正是這個(gè)變量pp中的值。
由此分析可知,函數(shù)調(diào)用“p(3,4)”的返回值就是34。結(jié)果為 81,也就是本程序的輸
出結(jié)果。
【參考答案】81
9.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,對應(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
10.# 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語句的右花括號“}”。如果某個(gè)“case”分支的后面沒有“break”語句,它在執(zhí)行完本分支后的所有語句之后,將繼續(xù)執(zhí)行下一個(gè)分支中的語句,直到出現(xiàn)“break”語句或者switch語句的右花括號“}”后才中止本分支的執(zhí)行。
【參考答案】113468