<5的条件成立,执行循环体。 a[0]=9*(0-2+4*(0>2))%5=9*(-2)%5=-18%5=-3 i=1,1<5的条件成立,执行循环体。 a[1]=9*(1-2十4*(1>2))%5=9*(-1)%5=-9%5=-4 1=2,i<5的条件成立,执行循环体。 a[2]=9*(2-2十4*(2>2))%5=9*(0)%5=0%5=0 i=3,i<5的条件成立,执行循环体。 a[3]=9*(3-2+4*(3>2))%5=9*(5)%5=45%5=0 1=4,1<5的条件成立,执行循环体。 a[4]=9*(4-2+4*(4>2))%5=9*(6)%5=54%5=4 i=5,1<5的条件不成立,退出第1个for循环。 注意,计算中的“i>2”是关系运算,结果只能为1或0;“x%5”是模运算,结果是x除5的余数,且余数的符号和x符号相同。 再执行第2个for循环。 i=4,i>=0的条件成立,执行循环体。输出数组元素a[4]的值,等于4 i=3,i>=0的条件成立,执行循环体。输出数组元素a[3」的值,等于0 i=2,1>=0的条件成立,执行循环体。输出数组元素a[2」的位,等于0 i=1,i>=0的条件成立,执行循环体。输出数组元素a[1]的值,等于-4 i=0,1>=0的条件成立,执行循环体。输出数组元素a[0]的值,等于-3 i=-1,i>=0的条件不成立,退出第2个for循环。 【参考答案】 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列的二维字符型数组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' 此外还定义了字符型指针数组p,利用第3条语句赋了值,结果如下: p[0]指向以“s[0][i]”为数组名的一维数组首地址,即p[0][i]就相当于s[0][i] p[1]指向以“s[1][i]”为数组名的一维数组首地址,即p[1][i]就相当于s[1][i] 第2条语句定义了整型变量i(用于单重循环的控制变量)和sum,并对sum清0。 第4条语句是for循环,控制变量i初值为0,每次加2,控制循环的条件是“p[0」[i]!='\ 0',注意其中的“p[0][i]”就是“s[0][i]”,这个控制循环的条件可以理解为“二维字符型数组元素s[0][i]不是字符串的结束标记则继续循环”。从控制变量i的取位来看,二维字符型数组元素只能取s[0][0]、s[0][2],因为下一个数组元素是s[0][4],该元素值是'\0'。再分析循环体中的语句,其中“ p[0][i]-'0'”是将数组元素s[0][i]中存放的数组字符减去'0',结果将是该数字字符对应的一位整数,整个语句是将sum变量中的原值乘以10以后再加上当前的数字。循环结束后的sum值就是s[0」[0」和s[0][2]中的两个数字组成的2位十进制数,结果为13。 按照同样的道理,可以分析出第2个for循环作用是完全相同的,它是把s[1」[1」、s[1][3]中的两个数字(前者为6,后者为8)拼接到sum的原值中,结果sum中值为十进制整数1368。程序的最后一个语句就是输出变量sum中的整数值。 【参考答案】 1368
8.int p(m,n) int m,n; { int i,pp; for(i=pp=1;i<n十1;i++) PP*= m; return(pp); } main() { printf("%d"、 p(3,4)); }
【解析】主函数中只有一条输出语句,输出结果是函数调用“p(3,4)”的返回值。所以本题的关键是函数p的功能。 分析函数p(),有两个参数m、n。函数体中关键的是for循环语句。分析这个循环语句可以看出,控制变量是i,初值为1;,终值为n,每次循环i加1。所以是标准的次数型循环,共计循环 |