c语言浙江大学上机练习汇总和答案

  1. 10002    显示Hello World!
  2. 10003    显示What is a computer?
  3. 10004    显示图形 (字符图案输出)
  4. 10005    显示Welcome to You!(调试示例error01_1
  5. 10006    显示"Programming in C is fun!"
  6. 10007    显示图案  (字符图案输出)
  7. 20011    求华氏温度100°F对应的摄氏温度。
  8. 20012    求华氏温度 150°F 对应的摄氏温度。
  9. 20013    求摄氏温度26°C对应的华氏温度。
  10. 20014    计算三门课程的平均成绩
  11. 20015    计算各位数字的值
  12. 20016    计算x的平方(改错题error02_2
  13. 20021    计算分段函数的值(调试示例error02_3
  14. 20022    计算摄氏温度(表达式)
  15. 20023    计算存款利息
  16. 20024    计算分段函数
  17. 20025    计算分段函数的值(改错题error02_4
  18. 20026    输入2个整数 num1  num2,计算并输出它们的和、差、积、商与余数。
  19. 20027    计算旅途时间 (求余运算)
  20. 20028    数字加密(求余运算)
  21. 20031    1+2+3+......+100(调试示例error02_5
  22. 20032    m+(m+1)+(m+2)+......+100
  23. 20033    1/m1/(m+1)1/(m+2)......1/n
  24. 20034    1 + 1/3 + 1/5 + ......的前n项和
  25. 20035    11/41/71/10+……的前n项之和
  26. 20036    输出华氏-摄氏温度转换表(改错题error02_6
  27. 20038    xn次幂
  28. 20041    生成 3 的乘方表
  29. 20043    使用函数求 n! /(m!* (n-m)!)
  30. 20044    100^0.5101^0.5+……+1000^0.5
  31. 20053    计算物体自由下落的距离
  32. 20055    计算分段函数
  33. 20057    11/21/3......1/n
  34. 20061    阶梯电价
  35. 20062    m*m1/m(m+1)*(m+1)1/(m+1)......n*n1/n
  36. 20063    12/33/54/75/9-6/11+……
  37. 20064    2^12^22^3+……+2^n
  38. 20065    0!1!2!+……+n!
  39. 30001    求一元二次方程的根
  40. 30002    求分段函数的值
  41. 30004    显示五级记分制成绩所对应的百分制成绩区间(使用switch
  42. 30005    显示水果的价格(使用switch
  43. 30007    求三角形的面积和周长
  44. 30008    计算个人所得税
  45. 30009    统计学生成绩(对应教材习题34 ,统计学生成绩)
  46. 30010    对两个整数进行乘、除和求余运算
  47. 30053    分段计算水费(使用嵌套的if-else语句)
  48. 30061    出租车计费
  49. 30062    输出21世纪所有闰年
  50. 40011    求最小公倍数和最大公约数(调试示例error04_1
  51. 40012    11/41/71/101/131/16+……
  52. 40013    求奇数和
  53. 40014    求整数的位数
  54. 40016    求整数的位数以及各位数字之和
  55. 40017    2/13/25/38/5...
  56. 40019    高空坠球 (循环语句)
  57. 40021    使用嵌套循环求e = 11/1!1/2!....1/n!
  58. 40023    换硬币 (多重循环语句)
  59. 40024    找出各位数字的立方和等于它本身的数
  60. 40025    找完数(改错题error04_2
  61. 40026    验证歌德巴赫猜想(选作)
  62. 40027    从高位开始逐位输出一个整数的各位数字(选作)
  63. 40051    求平均成绩并统计不及格人数
  64. 40061    求偶数的和
  65. 40062    xx*x/2!x*x*x/3!x*x*x*x/4!+……的值
  66. 40065    分解质因数
  67. 40067    打印图案
  68. 50001    n!(调试示例error05_1
  69. 50002    使用函数判断数的符号
  70. 50003    使用函数求奇数和
  71. 50004    使用函数计算两点间的距离
  72. 50005    使用函数统计素数并求和
  73. 50006    使用函数统计一个整数中数字的个数
  74. 50007    使用函数找水仙花数
  75. 50008    使用函数求1! + 2! + … + m!(改错题error05_2
  76. 50009    使用函数求余弦函数的近似值
  77. 50051    数字金字塔
  78. 50052    使用函数找最大值
  79. 50061    使用函数求aaaaaaaa…a
  80. 50062    使用函数输出指定范围内的 Fibonacci
  81. 50063    使用函数找出指定范围内的完数
  82. 50064    使用函数输出一个整数的逆序数
  83. 60001    使用函数求PI(调试示例源程序error06_1
  84. 60002    整数的十进制、八进制和十六进制表现形式
  85. 60003    分类统计字符
  86. 60006    验证歌德巴赫猜想(本题与40026完全一样)
  87. 60007    使用函数输出整数的逆序数
  88. 60009    统计单词
  89. 60062    简单计算器
  90. 70011    简化的插入排序
  91. 70012    求平均值
  92. 70013    将数组中的数逆序存放
  93. 70014    求最大值及其下标
  94. 70015    交换最小值和最大值
  95. 70016    选择法排序
  96. 70017    在数组中查找指定的元素
  97. 70021    求矩阵各行元素之和
  98. 70022    矩阵运算
  99. 70023    九九乘法表
  100. 70024    判断上三角矩阵
  101. 70025    算算看,这是第几天?
  102. 70026    找鞍点(选作)
  103. 70031    将字符串逆序存放
  104. 70032    查找字符
  105. 70033    统计大写辅音字母
  106. 70034    字符串替换
  107. 70035    将十六进制字符串转换为十进制整数
  108. 70036    将十进制字符串转换为十进制整数
  109. 70051    找最大值并交换
  110. 70052    统计字符出现次数
  111. 80011    循环移动
  112. 80012    在数组中查找指定元素
  113. 80013    使用函数的选择法排序
  114. 80014    报数
  115. 80021    找最大的字符串
  116. 80022    找最长字符串
  117. 80023    使用函数删除字符串中的字符
  118. 80024    使用函数实现字符串复制
  119. 80025    判断回文字符串
  120. 80026    分类统计字符个数
  121. 90001    调试示例error09_1.cpp(结构)
  122. 90002    时间换算(结构)
  123. 90003    计算平均成绩(结构)
  124. 90004    计算两个复数之积(结构)
  125. 90005    查找书籍(结构)
  126. 90006    通讯录排序(结构)
  127. 90007    算算看,这是第几天?(结构)
  128. 90008    使用函数实现时间换算(结构)
  129. 90009    找出总分最高的学生(结构)
  130. 10012    函数程序设计
  131. 10014    计算函数P(n,x) (函数递归)
  132. 10015    计算函数Ack(m,n) (函数递归)
  133. 10016    十进制转换二进制
  134. 10017    递归函数程序设计求Fabonacci数列
  135. 10018    递归函数程序设计整数的逆序输出
  136. 10019    改错题error10_1.cpp(函数递归)
  137. 10021    调试示例error11_1.cpp (指针数组、内存动态分配)
  138. 10022    编程题(指针数组)
  139. 10023    编程题 (指针数组,查找相同的字符串)
  140. 10024    计算最长的字符串长度
  141. 10025    字符串的连接
  142. 10026    指定位置输出字符串
  143. 10027    藏尾诗(二维字符数组)
  144. 10028    改错题error11_2.cpp (矩阵操作)
  145. 10031    调试示例error11_3.cpp(用单向链表组织学生信息)
  146. 10032    编程题(单向链表)
  147. 10033    编程题(按数据的逆序建立一个链表并输出)
  148. 10034    编程题(单向链表操作)
  149. 10035    编程题 (单向链表按序合并)
  150. 10036    编程题 (单向链表)

10002    显示Hello World!

程序填空。

在屏幕上显示一个短句Hello World!


#include <stdio.h>

int main(void)

{

/*---------*/

printf( "Hello World!");

return 0;

}

10003    显示What is a computer?

程序填空。

在屏幕上显示一个短句What is a computer?


#include <stdio.h>

int main(void)

{

/*------

---*/

printf( "What is a computer?");

return 0;

}

10004    显示图形 (字符图案输出)

程序填空。在屏幕上显示下列图形

****

***

**

*


#include <stdio.h>

int main(void)

{

/*---------*/

printf( "****\n"

"***\n"

"**\n"

"*");

return 0;

}

10005    显示Welcome to You!(调试示例error01_1)

程序填空。

在屏幕上显示短句Welcome to You!


#include <stdio.h>

int main(void)

{

/*---------*/

printf("Welcome to You!");

return 0;

}

10006    显示"Programming in C is fun!"

编写程序,在屏幕上显示一个短句"Programming in C is fun!"

#include <stdio.h>

int main(void)

{

printf("Programming in C is fun!");

return 0;

}

10007    显示图案  (字符图案输出)   

编写程序,在屏幕上显示如下图案。

* * * *

 * * *

  * *

   *

#include <stdio.h>

int main(void) 

{

printf("* * * *\n"

       " * * *\n"

       "  * *\n"

       "   *\n");

/*---------*/

}

20011    求华氏温度100°F对应的摄氏温度。

计算公式如下,c=5*(f-32)/9,式中:c表示摄氏温度,f表示华氏温度。(源程序error02_1.cpp)

输入输出示例:

fahr=100,celsius=37

#include <stdio.h>

int main(void)

{

    int celsius, fahr;

/*---------*/

fahr=100;

celsius=5*(fahr-32)/9;

    printf("fahr = %d, celsius = %d\n", fahr, celsius);

    return 0;

}

20012    求华氏温度 150°F 对应的摄氏温度。

计算公式:C = 5*F/9-5*32/9,式中:C表示摄氏温度,F表示华氏温度。

输入输出示例:

fahr=150, celsius=66

#include <stdio.h>

int main(void)

{

    int celsius, fahr;

/*---------*/

fahr=150;

celsius=5*fahr/9-5*32/9;

printf("fahr = %d, celsius = %d\n",fahr, celsius);

    return 0;

}

20013    求摄氏温度26°C对应的华氏温度。

计算公式如下,f=9*c/5+32,式中:c表示摄氏温度,f表示华氏温度。

输入输出示例:

celsius=26,fahr=78

#include <stdio.h>

int main(void)

{

     int celsius, fahr;

/*---------*/

celsius=26;

fahr=9*celsius/5+32;

     printf("celsius = %d, fahr = %d\n", celsius, fahr);

return 0;

}

20014    计算三门课程的平均成绩

程序填空,不要改变与输入输出有关的语句。

已知某位学生的数学、英语和计算机课程的成绩分别是87分、72分和93分,求该生3门课程的平均分。

输入输出示例:

math = 87, eng = 72, comp = 93, average = 84

#include <stdio.h>

int main(void)

{

    int math, eng, comp, average;  

/*---------*/

math = 87,eng = 72,comp = 93;

average = (math+eng+comp)/3;

    printf("math = %d, eng = %d, comp = %d, average = %d\n", math, eng, comp, average);

}

20015    计算各位数字的值

输入输出示例:

整数152的个位数字是2,十位数字是5,百位数字是1

#include <stdio.h>

int main(void)

{

     int n,digit1,digit2,digit3;

n=152;

digit1=n%10;

digit2=(n/10)%10;

digit3=n/100;

/*---------*/

     printf("整数%d的个位数字是%d, 十位数字是%d, 百位数字是%d\n", n, digit1, digit2, digit3);

return 0;

}

20016    计算x的平方(改错题error02_2)

程序填空。

假设 x 的值为3,计算 x 的平方 y,并分别以"y = x * x"和"x * x = y"的形式输出 x 和 y 的值。

输入输出示例:

9 = 3 * 3

3 * 3 = 9

#include <stdio.h>

int main(void)

{

    int x,y;  

    x=3;

    y=x*x;

   printf("%d = %d * %d \n",y,x,x);

   printf("%d * %d = %d \n",x,x,y);

   return 0;

}

20021    计算分段函数的值(调试示例error02_3)

程序填空,不要改变与输入输出有关的语句。

输入一个正整数repeat (0<repeat<10),做repeat次下列运算:

输入 x,计算并输出下列分段函数 f(x) 的值(保留1位小数)。

当 x 不等于0时,y = f(x) = 1/x,当 x 等于0时,y = f(x) = 0。

输入输出示例:括号内是说明

输入

2       (repeat=2)

10      (x=10)

0       (x=0)

输出

f(10.00) = 0.1

f(0.00) = 0.0

#include <stdio.h>

int main(void)

{

    int repeat, ri;

    double x, y;  

    scanf("%d", &repeat);

    for(ri = 1; ri <= repeat; ri++){

         scanf("%lf", &x);

         if(x!=0) y=1/x;

         else y=0;

         printf("f(%.2f) = %.1f\n", x, y);

     }

}

20022    计算摄氏温度(表达式)

程序填空,不要改变与输入输出有关的语句。

输入华氏温度,输出对应的摄氏温度。计算公式:c = 5*(f-32)/9,式中:c表示摄氏温度,f表示华氏温度。

输入输出示例:括号内为说明

输入

150        (fahr=150)

输出

celsius = 65

#include <stdio.h>

int main(void)

{

    int celsius, fahr;  

/*---------*/

scanf("%d", &fahr);

celsius = 5*(fahr-32)/9;

    printf("celsius = %d\n", celsius);

}

20023    计算存款利息

程序填空,不要改变与输入输出有关的语句。

输入存款金额 money、存期 year 和年利率 rate,根据下列公式计算存款到期时的利息 interest(税前),输出时保留2位小数。

interest = money(1+rate)^year - money

输入输出示例:括号内为说明

输入

1000 3 0.025 (money = 1000, year = 3, rate = 0.025)

输出

interest = 76.89

#include <stdio.h>

#include <math.h>

int main(void)

{

    int money, year;

    double interest, rate;

    scanf("%d%d%lf",&money,&year,&rate);

    interest = money*pow((1+rate),year) - money;

    printf("interest = %.2f\n", interest);

}

20024    计算分段函数

程序填空,不要改变与输入输出有关的语句。

输入一个正整数repeat (0<repeat<10),做repeat次下列运算:

输入 x,计算并输出下列分段函数 f(x) 的值(保留2位小数),请调用 sqrt 函数求平方根,调用 pow 函数求幂。

当x >= 0时,f(x) = x^0.5,当x小于0时,f(x) = (x+1)^2 + 2x + 1/x。

输入输出示例:括号内是说明

输入

3 (repeat=3)

10

-0.5

0

输出

f(10.00) = 3.16

f(-0.50) = -2.75

f(0.00) = 0.00

#include <stdio.h>

#include <math.h>

int main(void)

{

    int repeat, ri;

    double x, y;

    scanf("%d", &repeat);

    for(ri = 1; ri <= repeat; ri++){

    scanf("%lf",&x);

     if(x>=0)     y = sqrt(x);

     else     y = pow((x+1),2)+2*x+1.0/x;

     printf("f(%.2f) = %.2f\n", x, y);

    }

}

20025    计算分段函数的值(改错题error02_4)

程序填空,不要改变与输入输出有关的语句。

输入一个正整数repeat (0<repeat<10),做repeat次下列运算:

输入实数 x,计算并输出下列分段函数 f(x) 的值,输出时保留1位小数。

当 x 不等于10时,y = f(x) = x,当 x 等于10时,y = f(x) = 1/x。

输入输出示例:括号内是说明

输入

2 (repeat=2)

10

234

输出

f(10.0) = 0.1

f(234.0) = 234.0

#include <stdio.h>

int main(void)

{

    int repeat, ri;

    double x, y;

    scanf("%d", &repeat);

    for(ri = 1; ri <= repeat; ri++){

/*---------*/

scanf("%lf",&x);

if(x!=10) y=x;

else y=1/x;

     printf("f(%.1f) = %.1f\n", x, y);

    }

    return 0;

}

20026    输入2个整数 num1 和 num2,计算并输出它们的和、差、积、商与余数。

输出两个整数的余数可以用 printf("%d %% %d = %d\n", num1, num2, num1%num2);

输入输出示例:括号内是说明

输入

5 3       (num1=5,num2=3)

输出

5 + 3 = 8

5 - 3 = 2

5 * 3 = 15

5 / 3 = 1

5 % 3 = 2

#include <stdio.h>

int main(void)

{

     int num1,num2;

/*---------*/

scanf("%d%d",&num1,&num2);

printf("%d + %d = %d\n",num1,num2,num1+num2);

printf("%d - %d = %d\n",num1,num2,num1-num2);

printf("%d * %d = %d\n",num1,num2,num1*num2);

printf("%d / %d = %d\n",num1,num2,num1/num2);

printf("%d % % %d = %d\n",num1,num2,num1%num2);

return 0;

}

20027    计算旅途时间 (求余运算)

输入2个整数time1和time2,表示火车的出发时间和到达时间,计算并输出旅途时间。

有效的时间范围是0000到2359(前两位表示小时,后两位表示分钟),不需要考虑出发时间晚于到达时间的情况。

例:括号内是说明

输入

712 1411 (出发时间是7:12,到达时间是14:11)

输出

The train journey time is 6 hours 59 minutes.

#include <stdio.h>

int main(void)

{

int time1, time2, hour, minutes, t1, t2, result;

scanf("%d%d", &time1, &time2);

t1 = (time1 / 100) * 60 + time1 % 100;    /* 统一化成minutes: */

t2 = (time2 / 100) * 60 + time2 % 100;

result = t2 - t1;

hour = result / 60;

minutes = result % 60;

printf("The train journey time is %d hours %d minutes.\n", hour, minutes);

}

20028    数字加密(求余运算)

输入一个四位数,将其加密后输出。方法是将该数每一位上的数字加9,然后除以10取余,做为该位上的新数字,最后将千位和十位上的数字互换,百位和个位上的数字互换,组成加密后的新四位数。

例:括号内是说明

输入

1257

输出

The encrypted number is 4601(每一位上的数字加9除以10取余后,得0146,交换后得到4601)

#include <stdio.h>

int main(void)

{

   int number, digit1, digit2, digit3, digit4, newnum;

   scanf("%d", &number);

/*---------*/

   digit1=(number%10+9)%10*100;    

/* 取个位+9之后除以10取余然后变成百位(个位与百位交换)           */

digit2=(number/10%10+9)%10*1000;   

      /* 取十位+9之后除以10取余然后变成千位,将千位和十位上的数字互换 */

digit3=(number/100%10+9)%10;

/* 取百位+9之后除以10取余变成个位,百位和个位上的数字互换*/

digit4=(number/1000+9)%10*10;

/* 取千位+9之后除以10取余变成十位千位数字与十位数字交换 */

newnum=digit1+digit2+digit3+digit4;

   printf("The encrypted number is %d\n", newnum);

   return 0;

}

20031    求1+2+3+......+100(调试示例error02_5)

计算表达式 1 + 2 + 3 + ...... + 100的值。

输出示例:

sum = 5050

#include <stdio.h>

int main(void)

{

    int i, sum;

    sum=0;

for(i=1;i<=100;i++)

sum=sum+i;

    printf("sum = %d\n", sum);

}

20032    求m+(m+1)+(m+2)+......+100

输入一个正整数repeat (0<repeat<10),做repeat次下列运算:

输入一个正整数m(0<=m<=100),计算表达式 m + (m+1) + (m+2) + ...... + 100的值。

输入输出示例:括号内为说明

输入

3 (repeat=3)

0 (计算0+1+2+...+100)

10 (计算10+11+12+...+100)

50 (计算50+51+52+...+100)

输出

sum = 5050

sum = 5005

sum = 3825

#include <stdio.h>

int main(void)

{

    int i, m, sum;

    int repeat, ri;

    scanf("%d", &repeat);

    for(ri = 1; ri <= repeat; ri++){

        scanf("%d", &m);

sum=0;

        for(i=m;i<=100;i++)

sum=sum+i;

/*---------*/

        printf("sum = %d\n", sum);

    }

}

20033    求1/m+1/(m+1)+1/(m+2)+......+1/n

输入一个正整数repeat (0<repeat<10),做repeat次下列运算:

输入2个正整数 m 和 n(m<=n),计算表达式 1/m + 1/(m+1) + 1/(m+2) + ...... + 1/n的值,输出时保留3位小数。

输入输出示例:括号内为说明

输入

3        (repeat=3)

5 15     (计算1/5+1/6+1/7+...+1/15)

10 20    (计算1/10+1/11+1/12+...+1/20)

1 3      (计算1+1/2+1/3)

输出

sum = 1.235

sum = 0.769

sum = 1.833

#include <stdio.h>

int main(void)

{

    int i, m, n;

    int repeat, ri;

    double sum;

    scanf("%d", &repeat);

    for(ri = 1; ri <= repeat; ri++){

        scanf("%d%d", &m, &n);

        sum=0;

for (i=m; i<=n; i++)

sum=sum+1.0/i;

        printf("sum = %.3f\n", sum);

    }

}

20034    求1 + 1/3 + 1/5 + ......的前n项和

输入一个正整数repeat (0<repeat<10),做repeat次下列运算:

输入一个正整数 n,计算表达式 1 + 1/3 + 1/5 + ...... 的前 n 项之和,输出时保留6位小数。

输入输出示例:括号内为说明

输入

2 (repeat=2)

5 (计算1+1/3+1/5+1/7+1/9)

23 (计算1+1/3+1/5+...+1/45)

输出

sum = 1.787302

sum = 2.549541

#include <stdio.h>

int main(void)

{

    int i, n;

int denominator;

    int repeat, ri;

    double sum;

    scanf("%d", &repeat);

    for(ri = 1; ri <= repeat; ri++){

        scanf("%d", &n);

        sum=0;

denominator=1;

for(i=1;i<=n;i++)  {

sum=sum+1.0/denominator;

denominator=denominator+2;

}

        printf("sum = %.6f\n", sum);

    }

}

20035    求1-1/4+1/7-1/10+……的前n项之和

输入一个正整数repeat (0<repeat<10),做repeat次下列运算:

读入一个正整数 n,计算1-1/4+1/7-1/10+……的前 n 项之和,输出时保留3位小数。

输入输出示例:括号内是说明

输入

2   (repeat=2)

3

10

输出

sum = 0.893

sum = 0.819

#include <stdio.h>

int main(void)

{

    int flag, i, n, t;

    int repeat, ri;

    double item, sum;

    scanf("%d", &repeat);

    for(ri = 1; ri <= repeat; ri++){

        scanf("%d", &n);

        sum=0;

flag=1;

t=1;

for(i=1;i<=n;i++){

item=flag*1.0/t;

sum=sum+item;

flag=-flag;

t=t+3;

}/*---------*/

       printf("sum = %.3f\n", sum);

    }

}

20036    输出华氏-摄氏温度转换表(改错题error02_6)

输入一个正整数repeat (0<repeat<10),做repeat次下列运算:

读入2个整数 lower 和 upper,输出一张华氏—摄氏温度转换表,华氏温度的取值范围是[lower, upper],每次增加2F。

计算公式:c = 5 * (f - 32) / 9,其中:c表示摄氏温度,f表示华氏温度。

输出请使用语句 printf("%3.0f %6.1f\n", fahr, celsius);

输入输出示例:括号内是说明

输入

2       (repeat=2)

32 35   (lower=32,upper=35)

40 30   (lower=40,upper=30)

输出

fahr  celsius

 32    0.0

 34    1.1

fahr  Celsius

#include <stdio.h>

int main(void)

{

    int lower, upper;

    int repeat, ri;

    double celsius, fahr;

    scanf("%d", &repeat);

    for(ri = 1; ri <= repeat; ri++){

        scanf("%d%d", &lower, &upper);

        printf("fahr  celsius\n");

        for(fahr=lower;fahr<=upper; fahr++, fahr++) {

celsius=5*(fahr-32)/9;

printf("%3.0f%6.1f\n",fahr,celsius);

}/*---------*/

}

}

20038    求x的n次幂

输入一个正整数repeat (0<repeat<10),做repeat次下列运算:

读入1 个实数x和正整数 n(n<=50),计算并输出 x 的 n 次幂(保留2位小数),不允许调用pow函数求幂。

输入输出示例:括号内是说明

输入

2       (repeat=2)

1.5 2   (x=1.5,n=2)

2 7     (x=2,n=7)

输出

2.25

128.00

#include <stdio.h>

int main(void)

{

    int i, n;

    int repeat, ri;

    double mypow, x;

    scanf("%d", &repeat);

    for(ri = 1; ri <= repeat; ri++){

        scanf("%lf%d", &x, &n);

mypow=1;

for(i=1;i<=n;i++)

mypow=mypow*x;

/*---------*/

        printf("%.2f\n", mypow);

}

}

20041    生成 3 的乘方表

输入一个正整数n,生成一张3的乘方表,输出3^0 ~ 3^n的值,可调用幂函数计算3的乘方。

输出使用语句 printf("pow(3,%d) = %.0f\n", i, mypow);

输入输出示例:括号内是说明

输入

3 (n=3)

输出

pow(3,0) = 1

pow(3,1) = 3

pow(3,2) = 9

pow(3,3) = 27

#include <stdio.h>

#include <math.h>

int main(void)

{

    int i, n;

    double mypow;

    scanf("%d", &n);

for(i=0;i<=n;i++)  {

mypow=pow(3,i);

printf("pow(3,%d) = %.0f\n", i, mypow);

}

}

20043    使用函数求 n! /(m!* (n-m)!)  

输入一个正整数repeat (0<repeat<10),做repeat次下列运算:

输入2个正整数 m 和 n(m<=n),计算 n! /(m!* (n-m)!) 。

要求定义并调用函数fact(n)计算n的阶乘, 其中 n 的类型是 int,函数类型是 double。

例:括号内是说明

输入:

2      (repeat=2)

2 7    (m=2, n=7)

5 12   (m=5, n=12)

输出:

result = 21

result = 792

#include "stdio.h"

int main(void)

{

    int m, n;

    int repeat, ri;

    double s;

    double fact(int n);

    scanf("%d", &repeat);

    for(ri = 1; ri <= repeat; ri++){

        scanf("%d%d", &m, &n);

        s=fact(n)/(fact(m)*fact(n-m));        

        printf("result = %.0f\n", s);

    }

}

double fact(int n)

{

   double result;

   int i;

   result=1;

   for(i=1;i<=n;i++)

       result=result*i;  

   return result;

} 

20044    求100^0.5+101^0.5+……+1000^0.5 

计算 100^0.5+101^0.5+……+1000^0.5的值(保留2位小数),可调用sqrt函数计算平方根。

输入输出示例:括号内是说明

输出

sum = 20435.99

#include <stdio.h>

#include <math.h>

int main(void)

{

    int i;

    double sum;

sum=0;

for(i=100;i<=1000;i++) 

        sum=sum+sqrt(i);

/*---------*/

    printf("sum = %.2f\n",sum);

}

20053    计算物体自由下落的距离 

一个物体从 100m 的高空自由落下,编写程序,求它在前 3s 内下落的垂直距离(结果保留2位小数)。设重力加速度为10米/秒^2。

#include <stdio.h>

int main(void)

{

    double height;

    height=0.5 * 10 * 3* 3;   /*---------*/

    printf("height = %.2f\n", height);

}

20055    计算分段函数

程序填空,不要改变与输入输出有关的语句。

输入一个正整数 repeat (0<repeat<10),做repeat次下列运算:

输入 x,计算并输出下列分段函数f(x)的值(保留3位小数)。

当 x 不等于 0 时,y = f(x) = 1/x,当 x 等于 0 时,y = f(x) = 0。

输入输出示例:括号内是说明

输入

2 (repeat=2)

10

0

输出

f(10.00) = 0.100

f(0.00) = 0.000

#include <stdio.h>

int main(void)

{

    int repeat, ri;

    double x, y;  

    scanf("%d", &repeat);

    for(ri = 1; ri <= repeat; ri++){

        scanf("%lf", &x);

/*---------*/

if (x != 0.0) y=1.0/x;

else y=0.0;

        printf("f(%.2f) = %.3f\n", x, y);

    }

}

20057    求1+1/2+1/3+......+1/n

程序填空,不要改变与输入输出有关的语句。

输入一个正整数repeat (0<repeat<10),做repeat次下列运算:

编写程序,输入一个正整数n,求1+1/2+1/3+......的前n项之和,输出时保留6位小数。

输入输出示例:括号内为说明

输入

2 (repeat=2)

6 (计算1+1/2+1/3+1/4+1/5+1/6)

2 (计算1+1/2)

输出

sum = 2.450000

sum = 1.500000

#include <stdio.h>

int main(void)

{

    int i, n;

    int repeat, ri;

    double sum;

    scanf("%d", &repeat);

    for(ri = 1; ri <= repeat; ri++){

        scanf("%d", &n);

sum=0;

for(i=1;i<=n;i++) 

     sum=sum+1.0/i;

    printf("sum = %.6f\n", sum);

    }

} 

20061    阶梯电价

输入一个正整数repeat (0<repeat<10),做repeat次下列运算:

为了提倡居民节约用电,某省电力公司执行"阶梯电价",安装一户一表的居民用户电价分为两个"阶梯":月用电量50千瓦时以内的,电价为0.53元/千瓦时;超过50千瓦时的用电量,电价上调0.05元/千瓦时。

输入用户的月用电量e(千瓦时),计算并输出该用户应支付的电费(元),结果保留2位小数。

输入输出示例:括号内是说明

输入

2        (repeat=2)

10       (e=10)

100      (e=100)

输出

cost = 5.30

cost = 55.50

#include <stdio.h>

int main(void)

{

    int repeat, ri;

    double cost, e;

    scanf("%d", &repeat);

    for(ri = 1; ri <= repeat; ri++){

        scanf("%lf", &e);

        if(e<=50)   cost=e*0.53;

else  cost=0.53*50+(e-50)*0.58;

/*---------*/

        printf("cost = %.2f\n", cost);

}

}

20062    求m*m+1/m+(m+1)*(m+1)+1/(m+1)+......+n*n+1/n

输入一个正整数repeat (0<repeat<10),做repeat次下列运算:

输入两个正整数 m 和 n(m<=n),求 sum = m*m+1/m+(m+1)*(m+1)+1/(m+1)+(m+2)*(m+2)+1/(m+2)......+n*n+1/n,结果保留6位小数。

输入输出示例:括号内为说明

输入

3        (repeat=3)

1 2      (m=1,n=2)

2 5      (m=2,n=5)

5 10     (m=5,n=10)

输出

sum = 6.500000

sum = 55.283333

sum = 355.845635

#include <stdio.h>

int main(void)

{

    int i, m, n;

    int repeat, ri;

    double sum;

    scanf("%d",&repeat);

    for(ri = 1; ri <= repeat; ri++){

        scanf("%d%d", &m, &n);

        sum=0;

for(i=m;i<=n;i++)

sum=sum+i*i+1.0/i;

/*---------*/

         printf("sum = %.6f\n", sum);

}

}

20063    求1-2/3+3/5-4/7+5/9-6/11+……

输入一个正整数repeat (0<repeat<10),做repeat次下列运算:

输入一个正整数 n,计算1-2/3+3/5-4/7+5/9-6/11+……的前n项之和,输出时保留3位小数。

输入输出示例:括号内是说明

输入

3        (repeat=3)

1        (n=1)

3        (n=3)

5        (n=5)

输出

sum = 1.000

sum = 0.933

sum = 0.917

#include <stdio.h>

int main(void)

{

    int flag, i, n;

float denominator;

    int repeat, ri;

    double item, sum;

    scanf("%d", &repeat);

    for(ri = 1; ri <= repeat; ri++){

        scanf("%d", &n);

sum=0;

flag=1;

denominator =1.0;

for(i=1; i<=n; i++)

{

item=flag* i *1.0/ denominator;

sum=sum+item;

flag=-flag;

denominator = denominator +2;

}

/*---------*/

       printf("sum = %.3f\n", sum);

}

}

20064    求2^1+2^2+2^3+……+2^n

程序填空,不要改变与输入输出有关的语句。

输入一个正整数repeat (0<repeat<10),做repeat次下列运算:

编写一个程序,输入一个正整数 n,计算sum = 2^1+2^2+2^3+……的前 n 项之和,可以调用pow()函数求幂。

例:括号内是说明

输入

3   (repeat=3)

1

3

5

输出

sum = 2

sum = 14

sum = 62

#include <stdio.h>

#include <math.h>

int main(void)

{

    int i,n;

    int repeat, ri;

    double sum;

    scanf("%d", &repeat);

    for(ri = 1; ri <= repeat; ri++){

        scanf("%d", &n);

sum=0;

for(i=1;i<=n;i++)

sum=sum+pow(2,i);

/*---------*/

        printf("sum = %.0f\n", sum);

}

}

20065    求0!+1!+2!+……+n!  

输入一个正整数repeat (0<repeat<10),做repeat次下列运算:

编写一个程序,输入一个正整数 n,计算 e = 0!+1!+2!+……+n!,要求定义和调用函数fact(n)计算n!,函数类型是double。

例:括号内是说明

输入

3   (repeat=3)

1

2

4

输出

sum = 2

sum = 4

sum = 34

#include <stdio.h>

int main(void)

{

    int i,n;

    int repeat, ri;

    double sum;

    double fact(int n);

    scanf("%d", &repeat);

    for(ri = 1; ri <= repeat; ri++){

        scanf("%d", &n);

        sum=1;        

        for(i=1;i<=n;i++){

        fact(i);

        sum=sum+fact(i);

        }

/*---------*/

        printf("sum = %.0f\n", sum);

    }

}

double fact(int n)

{

 double result;

 int j;

 result=1;

 for(j=1;j<=n;j++) 

     result=result*j;

 return result;

} 

30001    求一元二次方程的根 

输入一个正整数repeat (0<repeat<10),做repeat次下列运算:

输入参数a,b,c,求一元二次方程a*x*x+b*x+c=0的根,结果保留2位小数。

输出使用以下语句:

printf("参数都为零,方程无意义!\n");

printf("a和b为0,c不为0,方程不成立\n");

printf("x = %0.2f\n", -c/b);

printf("x1 = %0.2f\n", (-b+sqrt(d))/(2*a));

printf("x2 = %0.2f\n", (-b-sqrt(d))/(2*a));

printf("x1 = %0.2f+%0.2fi\n", -b/(2*a), sqrt(-d)/(2*a));

printf("x2 = %0.2f-%0.2fi\n", -b/(2*a), sqrt(-d)/(2*a));

输入输出示例:括号内为说明

输入:

5               (repeat=5)

0 0 0           (a=0,b=0,c=0)

0 0 1           (a=0,b=0,c=1)

0 2 4           (a=0,b=2,c=4)

2.1 8.9 3.5     (a=2.1,b=8.9,c=3.5)

1 2 3           (a=1,b=2,c=3)

输出:

参数都为零,方程无意义!

a和b为0,c不为0,方程不成立

x = -2.00

x1 = -0.44

x2 = -3.80

x1 = -1.00+1.41i

x2 = -1.00-1.41i

#include <stdio.h>

#include <math.h>

int main(void)

{

    int repeat, ri;

    double a, b, c, d;

    scanf("%d", &repeat);

    for(ri = 1; ri <= repeat; ri++){

        scanf("%lf%lf%lf", &a, &b, &c);

d=b*b-4*a*c;

if(a==0){

if(b==0){

if(c==0) printf("参数都为零,方程无意义!\n");

else printf("a和b为0,c不为0,方程不成立\n");

}

else printf("x = %0.2f\n", -c/b);

}

else{

if(d>=0){

printf("x1 = %0.2f\n", (-b+sqrt(d))/(2*a));

printf("x2 = %0.2f\n", (-b-sqrt(d))/(2*a));

}

else{

printf("x1 = %0.2f+%0.2fi\n", -b/(2*a), sqrt(-d)/(2*a));

printf("x2 = %0.2f-%0.2fi\n", -b/(2*a), sqrt(-d)/(2*a));

}

}

    }     

}

参考2

#include <stdio.h>

#include <math.h>

int main(void)

{

    int repeat, ri;

    double a, b, c, d;

    scanf("%d", &repeat);

    for(ri = 1; ri <= repeat; ri++){

        scanf("%lf%lf%lf", &a, &b, &c);

        d=b*b-4*a*c;

        if(a==0&&b==0&&c==0)     printf("参数都为零,方程无意义!\n");

        if(a==0&&b==0&&c!=0)    printf("a和b为0,c不为0,方程不成立\n");

        if(a==0&&b!=0)

                  printf("x = %0.2f\n", -c/b);

        if(a!=0&&d>=0){

               printf("x1 = %0.2f\n", (-b+sqrt(d))/(2*a));

               printf("x2 = %0.2f\n", (-b-sqrt(d))/(2*a));

         }

         if(a!=0&&d<0){

                 printf("x1 = %0.2f+%0.2fi\n", -b/(2*a), sqrt(-d)/(2*a));

                 printf("x2 = %0.2f-%0.2fi\n", -b/(2*a), sqrt(-d)/(2*a));

          }    

    }     

}

30002    求分段函数的值

输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:

输入一个整数 x,计算并输出下列分段函数 sign(x) 的值。

      -1   x < 0

y = sign(x) = 0    x = 0

      1    x > 0

输入输出示例:括号内是说明

输入

3        (repeat=3)

10       (x=10)

0        (x=0)

-98      (x=-98)

输出

sign(10) = 1    (x = 10时 y = 1)

sign(0) = 0     (x = 0时 y = 0)

sign(-98) = -1  (x = -98时y = -1)

#include <stdio.h>

int main(void)

{

    int repeat, ri;

    int x, y;

    scanf("%d", &repeat);

    for(ri = 1; ri <= repeat; ri++){

        scanf("%d", &x);

if(x==0)  y=0;

else if(x>0) y=1;

else y=-1;

        printf("sign(%d) = %d\n", x, y);

    }

}

30004    显示五级记分制成绩所对应的百分制成绩区间(使用switch)

输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:

输入五级制成绩(A-E),输出相应的百分制成绩(0-100)区间,要求使用switch语句。

五级制成绩对应的百分制成绩区间为:A(90-100)、B(80-89)、C(70-79)、D(60-69)和E(0-59),如果输入不正确的成绩,显示"Invalid input"。

输出使用以下语句:

printf("90-100\n");

printf("80-89\n");

printf("70-79\n");

printf("60-69\n");

printf("0-59\n");

printf("Invalid input\n");

输入输出示例:括号内是说明

输入

6ABCDEj    (repeat=6,输入的五级成绩分别为A、B、C、D、E和无效的字符j)

输出

90-100

80-89

70-79

60-69

0-59

Invalid input   (输入数据不合法)

#include <stdio.h>

int main(void)

{

    char ch;

    int repeat, ri;

    scanf("%d", &repeat);

    for(ri = 1; ri <= repeat; ri++){

        ch = getchar();    

switch(ch){

case'A':

printf("90-100\n");

break;

case'B':

printf("80-89\n");

break;

case'C':

printf("70-79\n");

break;

case'D':

printf("60-69\n");

break;

case'E':

printf("0-59\n");

break;

default:

printf("Invalid input\n");

break;

}

    }

return 0;

}

30005    显示水果的价格(使用switch)

查询水果的单价。有4种水果,苹果(apples)、梨(pears)、桔子(oranges)和葡萄(grapes),单价分别是3.00元/公斤,2.50元/公斤,4.10元/公斤和10.20元/公斤。

在屏幕上显示以下菜单(编号和选项),用户可以连续查询水果的单价,当查询次数超过5次时,自动退出查询;不到5次时,用户可以选择退出。

当用户输入编号1~4,显示相应水果的单价(保留1位小数);输入0,退出查询;输入其他编号,显示价格为0。

输入输出示例:括号内是说明

输入

3   (oranges的编号)

0   (退出查询)

输出

[1] apples

[2] pears

[3] oranges

[4] grapes

[0] Exit

price = 4.1

[1] apples

[2] pears

[3] oranges

[4] grapes

[0] Exit

#include <stdio.h>

int main(void)

{

    int choice, i;

    double price;

    for(i = 1; i <= 5; i++){

        printf("[1] apples\n");

        printf("[2] pears\n");

        printf("[3] oranges\n");

        printf("[4] grapes\n");

        printf("[0] Exit\n");

        scanf("%d", &choice);

        if(choice == 0)

            break;

        else{

switch (choice){

case 1:  price= 3.00;  break;

case 2:  price=2.50;  break;

case 3:  price=4.10;  break;

case 4:  price=10.20;  break;

default:              price=0;  break;

}

           printf("price = %0.1f\n", price);

      }

    }

}

30007    求三角形的面积和周长

输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:

输入三角形的3条边 a, b, c,如果能构成一个三角形,输出面积 area 和周长 perimeter(保留2位小数);否则,输出"These sides do not correspond to a valid triangle"。

在一个三角形中,任意两边之和大于第三边。三角形面积计算公式:area = (s(s-a)(s-b)(s-c))^0.5 ,其中s = (a+b+c)/2

输出使用以下语句:

printf("area = %.2f, perimeter = %.2f\n",area, perimeter);

printf("These sides do not correspond to a valid triangle\n");

输入输出示例:括号内是说明

输入

2       (repeat=2)

5 5 3 (a=5,b=5,c=3)

1 4 1 (a=1,b=4,c=1)

输出

area = 7.15, perimeter = 13.00

These sides do not correspond to a valid triangle

#include <stdio.h>

#include <math.h>

int main(void)

{

    int a, b, c;

    int repeat, ri;

    double area, perimeter, s;

    scanf("%d", &repeat);

    for(ri = 1; ri <= repeat; ri++){

        scanf("%d%d%d", &a, &b, &c);

if ((a+b>c)&& (a+c>b) && (b+c>a) ){

perimeter=a+b+c;

s=(a+b+c)/2.00;

area =sqrt(s*(s-a)*(s-b)*(s-c));

printf("area = %.2f, perimeter = %.2f\n",area, perimeter);

}

else printf("These sides do not correspond to a valid triangle\n");

    }

}

30008    计算个人所得税

输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:

输入一个职工的月薪 salary,输出应交的个人所得税 tax(保留2位小数)。

计算公式:tax = rate * (salary - 850)

当 salary ≤850 时,rate = 0

当 850 < salary ≤ 1350 时,rate = 5%

当 1350 < salary≤  2850 时,rate = 10%

当 2850 < salary ≤ 5850 时,rate = 15%

当 5850 < salary 时,rate = 20%

输入输出示例:括号内是说明

输入

5          (repeat=5)

1010.87    (salary=1010.87)

32098.76   (salary=32098.76)

800        (salary=800)

4010       (salary=4010)

2850       (salary=2850)

输出

tax = 8.04

tax = 6249.75

tax = 0.00

tax = 474.00

tax = 200.00

#include <stdio.h>

int main()

{

int ri, repeat;

double rate, salary, tax;

scanf("%d", &repeat);

for(ri=1; ri<=repeat; ri++)

{

scanf("%lf", &salary);

if (salary<=850) {

rate=0;

tax=rate*(salary-850);

} else if (salary<=1350) {

rate=0.05;

tax=rate*(salary-850);

} else if (salary<=2850) {

rate=0.10;

tax=rate*(salary-850);

} else if (salary<=5850) {

rate=0.15;

tax=rate*(salary-850);

}

else {

rate=0.20;

tax=rate*(salary-850);

}

printf("tax = %0.2f\n", tax);

}

}

 

30009    统计学生成绩(对应教材习题3-4 ,统计学生成绩)

输入一个正整数 n,再输入 n 个学生的百分制成绩,统计各等级成绩的个数。成绩等级分为五级,分别为A(90-100)、B(80-89)、C(70-79)、D(60-69)和E(0-59)。

输入输出示例:括号内是说明

输入

5   (n=5)

77 54 92 73 60

输出

Number of A(90-100): 1

Number of B(80-89): 0

Number of C(70-79): 2

Number of D(60-69): 1

Number of E(0-59): 1

#include <stdio.h>

int main(void)

{

int mark, n, i;

int na,nb,nc,nd,ne;

scanf("%d",&n);

na=nb=nc=nd=ne=0;

for(i=1; i<=n; i++){

         scanf("%d",&mark);

/*---------*/

if(mark>=90&&mark<=100) na++;

else if(mark>=80&&mark<=89) nb++;

else if(mark>=70&&mark<=79) nc++;

else if(mark>=60&&mark<=69) nd++;

else ne++;

    }

printf("Number of A(90-100): %d\n", na);

    printf("Number of B(80-89): %d\n", nb);

    printf("Number of C(70-79): %d\n", nc);

    printf("Number of D(60-69): %d\n", nd);

    printf("Number of E(0-59): %d\n", ne);

return 0;

}

30010    对两个整数进行乘、除和求余运算

程序填空,不要改变与输入输出有关的语句。

输入一个正整数repeat (0<repeat<10),做repeat次下列运算:

输入一个形式如"操作数 运算符 操作数"的表达式,对2个整数进行乘、除和求余运算。

输出使用以下语句:

printf("%d * %d = %d\n", x, y, x * y);

printf("%d / %d = %d\n", x, y, x / y);

printf("%d Mod %d = %d\n",x, y, x % y);

printf("Invalid operator\n");

输入输出示例括号内是说明

输入

4 (repeat=4)

21*8

21/8

21%8

21!8

输出

21 * 8 = 168

21 / 8 = 2

21 Mod 8 = 5

Invalid operator

#include <stdio.h>

int main(void)

{

    char sign;

    int x, y;

    int repeat, ri;

    scanf("%d",&repeat);

    for(ri = 1;ri <= repeat; ri++){

        scanf("%d%c%d", &x, &sign, &y);

/*---------*/

switch (sign) {

case '*': printf("%d * %d = %d\n", x, y, x * y); break;

case '/': printf("%d / %d = %d\n", x, y, x / y); break;

case '%': printf("%d Mod %d = %d\n",x, y, x % y);break;

default: printf("Invalid operator\n");break;

}

    }

}

30053    分段计算水费(使用嵌套的if-else语句)

输入一个正整数repeat (0<repeat<10),做repeat次下列运算:

为鼓励居民节约用水,自来水公司采取按月用水量分段计费的办法,居民应交水费y(元)与月用水量x(吨)的函数关系式如下。

输入用户的月用水量x(吨),计算并输出该用户应支付的水费y(元)(保留2位小数)。要求用嵌套的if-else语句。

   0 (x<0)

y = f(x) = 4x/3 (0<=x<=15)

   2.5x-10.5 (x>15)

输入输出示例:括号内是说明

输入

3        (repeat=3)

-0.5     (x=-0.5)

9.5      (x=9.5)

21.3     (x=21.3)

输出

f(-0.50) = 0.00

f(9.50) = 12.67

f(21.30) = 42.75

#include <stdio.h>

int main(void)

{

    int repeat, ri;

    double x, y;

    scanf("%d", &repeat);

    for(ri = 1;ri <= repeat; ri++){  

        scanf("%lf", &x);      

        if(x<0)  y=0;

else if(x>=0&&x<=15) y=4.0*x/3;

else y=2.5*x-10.5;

        printf("f(%.2f) = %.2f\n", x, y);

    }

}

30061    出租车计费

程序填空,不要改变与输入输出有关的语句。

输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:

某城市普通出租车收费标准如下:"起步里程3公里,起步费10元;超起步里程后10公里内,每公里租费2元,超过10公里以上的部分加收50%的回空补贴费,即每公里租费3元。营运过程中,因路阻及乘客要求临时停车的,每5分钟按1公里租费计收。运价计费尾数四舍五入,保留到元。"。

编写程序,输入行驶里程(公里)与等待时间(分钟),计算并输出乘客应支付的车费(元)。

提示:先将等待的时间折算成公里数,与原公里数相加后再处理。

输入输出示例:括号内是说明

输入

3       (repeat=3)

1.6 2 52    (行驶1.6公里,等待2分52秒)

3.1 6 15    (行驶3.1公里,等待6分15秒)

11.8 2 30   (行驶11.8公里,等待2分30秒)

输出

cost = 10

cost = 13

cost = 31

#include <stdio.h>

int main(void)

{

    int repeat, ri;

    int minutes, seconds;

    double cost, mile;

    scanf("%d", &repeat);

    for(ri = 1; ri <= repeat; ri++){

    scanf("%lf%d%d", &mile, &minutes, &seconds);

mile=mile+(minutes*60+seconds)*1.0/300;   /*先将所有的等待时间转换成公里 */

    if(mile<=3)   cost=10;  

       else if(mile<=10)    cost=10+(mile-3)*2;  

               else   cost=10+7*2+(mile-10)*3;     

   printf("cost = %.0f\n", cost);

    }

}

30062    输出21世纪所有闰年

程序填空,不要改变与输入输出有关的语句。

输入21世纪所有的闰年。判断闰年的条件是:能被 4 整除但不能被 100 整除,或者能被 400 整除。

输出使用语句 printf("%d\n",year);

输入输出示例:括号内是说明

输出

2000

2004

2008

2012

2016

2020

2024

2028

2032

2036

2040

2044

2048

2052

2056

2060

2064

2068

2072

2076

2080

2084

2088

2092

2096

#include <stdio.h>

int main(void)

{

    int year;

    for(year = 2000; year <= 2099; year++){

        if((year%4==0 && year%100!=0)||(year%400==0))

         printf("%d\n",year);

    }

}

40011    求最小公倍数和最大公约数(调试示例error04_1)

输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:

输入两个正整数m和n,输出它们的最小公倍数和最大公约数。

输入输出示例:括号内为说明

输入:

3        (repeat=3)

3 7      (m=3,n=7)

24 4     (m=24,n=4)

24 18    (m=24,n=18)

输出:

21 is the least common multiple of 3 and 7, 1 is the greatest common divisor of 3 and 7.

24 is the least common multiple of 24 and 4, 4 is the greatest common divisor of 24 and 4.

72 is the least common multiple of 24 and 18, 6 is the greatest common divisor of 24 and 18.

#include <stdio.h>

int main(void)

{

    int gcd, lcm, m, n,c;  

    int repeat, ri;  

    scanf("%d", &repeat);

for(ri = 1; ri <= repeat; ri++)

{

        scanf("%d", &m);

        scanf("%d", &n);

for(lcm=1; ;lcm++) {

    if(lcm%m==0&&lcm%n==0)    /*  最小共倍数 lcm */

break;

}

gcd = m*n/lcm;

        printf("%d is the least common multiple of %d and %d, %d is the greatest common divisor of %d and %d.\n", lcm, m, n, gcd, m, n);

        }

return 0;

}

40012    求1-1/4+1/7-1/10+1/13-1/16+…… 

输入一个正整数repeat (0<repeat<10),做repeat次下列运算:

读入1个正实数 eps,计算并输出下式的值,精确到最后一项的绝对值小于 eps(保留6位小数)。请使用 while 语句实现循环。

计算:1-1/4+1/7-1/10+1/13-1/16+……

输入输出示例:括号内是说明

输入

2        (repeat=2)

2E-4     (eps=2E-4)

0.02      (eps=0.02)

输出

sum = 0.835549

sum = 0.826310

#include <stdio.h>

#include <math.h>

int main(void)

{

    int denominator, flag;

    int repeat, ri;

    double eps, item, sum;

    scanf("%d", &repeat);

    for(ri = 1; ri <= repeat; ri++){

        scanf("%le", &eps);

sum=0;

denominator=1;

flag=1;

item=1.0;

while(fabs(item)>=eps){

item=flag*1.0/denominator;

sum=sum+item;  

flag=-flag;

denominator=denominator+3;

}

       printf("sum = %.6f\n", sum);

   }

return 0;

}

40013    求奇数和

输入一个正整数repeat (0<repeat<10),做repeat次下列运算:

读入一批正整数(以零或负数为结束标志),求其中的奇数和。请使用while语句实现循环。

输入输出示例:括号内是说明

输入

2    (repeat=2)

1 3 90 7 0

8 7 4 3 70 5 6 101 -1

输出

The sum of the odd numbers is 11.

The sum of the odd numbers is 116.

#include <stdio.h>

int main(void)

{

    int x, sum;

    int repeat, ri;

    scanf("%d", &repeat);

for(ri = 1; ri <= repeat; ri++) {

        scanf("%d", &x);

sum=0;

while(x>0) {

if(x%2!=0)

sum+=x;

scanf("%d", &x);

}

       printf("The sum of the odd numbers is %d.\n", sum);

   }

}

40014    求整数的位数 

输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:

输入一个整数 in,求它的位数。例如123的位数是3。请使用do-while语句实现循环。

输入输出示例:括号内是说明

输入

4        (repeat=4)

12345    (in=12345)

-100     (in=-100)

-1       (in=-1)

1290     (in=1290)

输出

count = 5 (12345的位数是5)

count = 3 (-100的位数是3)

count = 1 (-1的位数是1)

count = 4 (99的位数是2)

#include <stdio.h>

int main(void)

{

    int count, in;

    int repeat, ri;

    scanf("%d", &repeat);

    for(ri = 1; ri <= repeat; ri++){

      scanf("%d", &in);

count=0;

if(in<0)  in=-in;

do{

count++;

in=in/10;

} while (in!=0);

      printf("count = %d\n", count);

   }

return 0;

}

40016    求整数的位数以及各位数字之和

程序填空,不要改变与输入输出有关的语句。

输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:

输入一个整数 in,求它的位数以及各位数字之和。例如 123 的各位数字之和是 6,位数是 3。

输入输出示例:括号内是说明

输入

4        (repeat=4)

0        (in=0)

23456    (in=23456)

-100     (in=-100)

-1       (in=-1)

输出

count = 1, sum = 0 (0的位数是1, 各位数字之和是0)

count = 5, sum = 20 (23456的位数是5, 各位数字之和是20)

count = 3, sum = 1 (-100的位数是3, 各位数字之和是1)

count = 1, sum = 1 (-1的位数是1, 各位数字之和是1)

#include <stdio.h>

int main(void)

{

    int count, in, sum;

    int repeat, ri;

    scanf("%d", &repeat);

    for(ri = 1; ri <= repeat; ri++){

      scanf("%d", &in);

count=0; sum=0;

if(in<0) in=-in;

do{

count++;

sum+=in%10;

in=in/10;

} while (in!=0);

      printf("count = %d, sum = %d\n", count, sum);

   }

return 0;

}

  

40017    求2/1+3/2+5/3+8/5+...

输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:

输入一个正整数 n,输出 2/1+3/2+5/3+8/5+……前n项之和,保留2位小数。(该序列从第2项起,每一项的分子是前一项分子与分母的和,分母是前一项的分子)

输入输出示例:括号内是说明

输入

3        (repeat=3)

1        (n=1)

5        (n=5)

20       (n=20)

输出

sum = 2.00    (第1项是2.00)

sum = 8.39    (前5项的和是8.39)

sum = 32.66   (前20项的和是32.66)

#include <stdio.h>

int main(void)

{

    int i, n;

    int repeat, ri;

    double denominator, numerator, sum, temp;

    scanf("%d", &repeat);

    for(ri = 1; ri <= repeat; ri++){

        scanf("%d", &n);

sum=0;

denominator=1;

numerator=2;

for(i=1;i<=n;i++){

sum += numerator/denominator;

temp = denominator; /* 为求下一项分子,保留当前项分母 */

denominator=numerator;

numerator=numerator+temp;

}

      printf("sum = %.2f\n",sum);

   }

}

40019    高空坠球 (循环语句)

程序填空,不要改变与输入输出有关的语句。

输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:

皮球从 height(米)高度自由落下,触地后反弹到原高度的一半,再落下,再反弹,……,如此反复。问皮球在第 n 次落地时,在空中一共经过多少距离?第 n 次反弹的高度是多少?(输出保留1位小数)

输入输出示例:括号内是说明

输入

3 (repeat=3)

10  2 (height=10m, n=2)

4   1 (height=2m, n=1)

100 8 (height=100m, n=8)

输出

distance=20.0, height=2.5 (第2次落地时,空中经过距离为20米, 第2次反弹高度为2.5米)

distance=4.0, height=2.0 (第1次落地时,空中经过距离为4米,第1次反弹高度为2米)

distance=298.4, height=0.4 (第8次落地时,空中经过距离为298.4米,第8次反弹高度为0.4米)

#include <stdio.h>

int main(void)

{

    int i, n;

    int repeat, ri;

    double distance, height, bh;

    scanf("%d", &repeat);

    for(ri = 1; ri <= repeat; ri++){

        scanf("%lf%d", &height, &n);

/*---------*/

distance = height;

bh = height/2.0;

if ( n>1 )

for (i = 2; i<=n; i++) {

distance  += bh*2;

bh = bh/2;

}

    printf("distance = %.1f, height = %.1f\n", distance, bh);

   }

}

40021    使用嵌套循环求e = 1+1/1!+1/2!+....+1/n!

程序填空,不要改变与输入输出有关的语句。

输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:

输入1个正整数n,计算下式的前n+1项之和(保留4位小数)。要求使用嵌套循环。

   e = 1+1/1!+1/2!+....+1/n!  

输入输出示例:括号内为说明

输入:

2       (repeat=2)

2       (n=2)

10      (n=10)

输出:

e = 2.5000

e = 2.7183

#include "stdio.h"

int main(void)

{

    int i, j, n;

    int repeat, ri;

    double e, product;

    scanf("%d", &repeat);

    for(ri = 1; ri <= repeat; ri++){

        scanf("%d", &n);

e = 1.0;

for (i = 1; i<= n; i++) {

product = 1;

for (j = 1; j<=i ; j++) {

product *= j;

}

e += 1.0/product;

}

/*---------*/

     printf("e = %0.4f\n", e);

  }

}

40023    换硬币 (多重循环语句)

输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:

将一笔零钱(大于8分,小于1元, 精确到分)换成5分、2分和1分的硬币。

输入金额,问有几种换法?针对每一种换法,每种硬币至少有一枚,请输出各种面额硬币的数量和硬币的总数量。

要求:硬币面值按5分、2分、1分顺序,各类硬币数量依次从大到小的顺序,输出各种换法。

输出使用语句:printf("fen5:%d,fen2:%d,fen1:%d,total:%d\n",fen5, fen2, fen1, fen5+fen2+fen1);

输入输出示例:括号内为说明

输入:

2     (repeat=2)

10    (money=10分)

13    (money=13分)

输出:

fen5:1,fen2:2,fen1:1,total:4

fen5:1,fen2:1,fen1:3,total:5

count = 2     (10分有2种换法)

fen5:2,fen2:1,fen1:1,total:4

fen5:1,fen2:3,fen1:2,total:6

fen5:1,fen2:2,fen1:4,total:7

fen5:1,fen2:1,fen1:6,total:8

count = 4     (13分有4种换法)

#include "stdio.h"

int main(void)

{

    int count, fen1, fen2, fen5, money;

    int repeat, ri;

    scanf("%d", &repeat);

    for(ri = 1; ri <= repeat; ri++){

        scanf("%d", &money);

count=0;

for(fen5=money/5;fen5>=1;fen5--)

for(fen2=money/2;fen2>=1;fen2--)

for(fen1=money/1;fen1>=1;fen1--)

if(fen5*5+fen2*2+fen1*1==money){

printf("fen5:%d,fen2:%d,fen1:%d,total:%d\n",fen5, fen2, fen1, fen5+fen2+fen1);

count++;}

     printf("count = %d\n", count);

    }

return 0;

}

40024    找出各位数字的立方和等于它本身的数 

输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:

输入两个正整数 m 和 n(1<=m, n<=1000),输出 m 到 n之间的所有满足各位数字的立方和等于它本身的数。

例如153的各位数字的立方和是 1^3+5^3+3^3=153 ,这里a^b表示a的b次方。

输出使用语句:printf("%d\n", i);

输入输出示例:括号内为说明

输入:

2            (repeat=2)

100 400      (m=100, n=400)

1 100        (m=1, n=100)

输出:

result:

153          (1*1*1+5*5*5+3*3*3=153)

370          (3*3*3+7*7*7=370)

371          (3*3*3+7*7*7+1*1*1=371)

result:

1            (1*1*1=1)

#include <stdio.h>

int main(void)

{

    int i, digit, m, n, number, sum;

    int repeat, ri;

    scanf("%d",&repeat);

    for(ri = 1; ri <= repeat; ri++){

        scanf("%d%d", &m, &n);

        printf("result:\n");

    for(i=m;i<=n;i++){

       number=i;

       sum=0;

       while(number>0){

          digit=number%10;

          sum=sum+digit*digit*digit;

          number=number/10;

       }

       if(sum==i) printf("%d\n",i);

     }

      }

}

40025    找完数(改错题error04_2) 

输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:

输入两个正整数 m 和 n(1<=m, n<=1000),输出 m 到 n之间的所有完数,并输出其因子。一个数如恰好等于它的因子之和,这个数称为完数,例如,6=1+2+3,其中1、2、3为因子,6为因子和。

输出使用以下语句:

printf("%d = 1", number);

printf(" + %d", factor);

printf("\n");

输入输出示例:括号内为说明

输入:

2          (repeat=2)

1 30       (m=1, n=30)

400 500    (m=400, n=500)

输出

result:

1 = 1

6 = 1 + 2 + 3   // 此题目表述不够严谨,6也是6的约数

28 = 1 + 2 + 4 + 7 + 14

result:

496 = 1 + 2 + 4 + 8 + 16 + 31 + 62 + 124 + 248

#include <stdio.h>

int main(void)

{

    int factor, m, n, number, sum;

    int repeat, ri;

    scanf("%d",&repeat);

    for(ri = 1; ri <= repeat; ri++){

        scanf("%d%d", &m, &n);

        printf("result:\n");

for (number=m;number<=n;number++)  {

    sum=1;

for (factor=2;factor<=number/2;factor++)

if (number%factor==0) sum=sum+factor;

if (sum==number) {

printf("%d = 1",number);

for (factor=2;factor<number;factor++)

 if (number%factor==0) printf(" + %d",factor); 

printf("\n");

     }

}

printf("\n");

    }

}

40026    验证歌德巴赫猜想(选作) 

程序填空,不要改变与输入输出有关的语句。

验证哥德巴赫猜想:任何一个大于6的偶数均可表示为两个素数之和。例如6=3+3,8=3+5,…,18=7+11。

输入两个正整数 m 和 n(6<=m, n<=100),将 m 到 n 之间的偶数表示成两个素数之和,打印时一行打印5组。

输出使用语句:printf("%d=%d+%d ", number, i, number - i);

输入输出示例:括号内为说明

输入:

89 100 (m=90, n=100)

输出:

90=7+83 92=3+89 94=5+89 96=7+89 98=19+79

100=3+97

#include "stdio.h"

#include "math.h"

int main(void)

{

    int count, i, j, k, m, n, number;

    scanf("%d%d", &m, &n);

    if(m % 2 != 0) m = m + 1;

    if(m >= 6){

/*---------*/

    }

}

#include <stdio.h>

int prime(int m)

{

int i, ifPrime=0;

if(m==1) return 0;

for(i=2;i<=m/2;i++) { 

if(m%i==0)

break;

}

if(i>m/2)

ifPrime=1;

return ifPrime;

}

int main(void)

{

    int count, i, m, n, number;

    scanf("%d%d", &m, &n);

    if(m % 2 != 0) m = m + 1;

if(m >= 6) {

count=0;

for(number=m;number<=n;number=number+2)  {

for(i=1;i<=number/2;i++)  {

if(  prime(i) && prime(number-i) )  {

printf("%d=%d+%d ", number, i, number-i);

count++;

if(count%5==0)

printf("\n");

break;

}

}

}

    }

}

注:此题标准答案是输出每个数的第一对满足条件的素数之和,但是:

90=7+83 90=11+79 90=17+73 90=19+71 90=23+67 ...90=83+7

也都是满足条件的, 而机器只对输出第一种为正确解

40027    从高位开始逐位输出一个整数的各位数字(选作) 

输入一个正整数repeat (0<repeat<10),做repeat次下列运算:

输入一个整数 in,从高位开始逐位分割并输出它的各位数字。

输出使用语句:printf("%-2d", digit);

输入输出示例:括号内为说明

输入

3        (repeat=3)

23456    (in=23456)

-600     (in=-600)

8        (in=8)

输出

2 3 4 5 6

6 0 0

8

#include <stdio.h>

int main(void)

{

   int digit, in, power, temp, k;

   int repeat, ri;

   scanf("%d", &repeat);

   for(ri = 1; ri <= repeat; ri++){

       scanf("%d", &in);

if(in<0) in=-in;

power=in;

temp=0;

k = 1;

while(power>0)

{

power=power/10;

temp++;

k = k * 10;

}

power=in;

while(temp>0)   /* temp是控制循环次数 */

{

temp --;

k = k/10;

digit = power / k;

power = power %  k;   /* power向右推进 */

printf("%-2d",digit);

}

printf("\n");

  }

   return 0;

}

40051    求平均成绩并统计不及格人数

程序填空,不要改变与输入输出有关的语句。

输入一个正整数repeat (0<repeat<10),做repeat次下列运算:

从键盘输入一批学生的成绩(以负数为结束标志),计算平均分(保留2位小数),并统计不及格成绩的个数。

输入输出示例:括号内为说明

输入

2    (repeat=2)

67 88 73 54 82 –3

8 7 4 3 70 5 6 100 -1

输出

Grade average is 72.80,the number of fail is 1

Grade average is 25.38,the number of fail is 6

#include <stdio.h>

int main(void)

{

    int fail, num;               

    int repeat, ri;

    double grade, total;

    scanf("%d",&repeat);

    for(ri = 1; ri <= repeat; ri++){

        total=0;

num=0;

fail=0;

do{

scanf ("%lf", &grade);

if(grade<0)break;

num++;

if(grade<60)

fail++;

total=total+grade;

    }while(grade>=0);

if(num > 0)

           printf("Grade average is %.2f,the number of fail is %d\n", total/num, fail);

    }

return 0;

}

40061    求偶数的和

程序填空,不要改变与输入输出有关的语句。

输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:

输入一批正整数(以零或负数为结束标志),求其中的偶数和。

输入输出示例:括号内为说明

输入

2    (repeat=2)

1 3 90 7 0

8 7 4 3 70 5 6 101 -1

输出

The sum of the even numbers is 90.

The sum of the even numbers is 88.

#include <stdio.h>

int even(int n);

int main(void)

{

    int n, sum;

    int ri, repeat;

    scanf("%d", &repeat);

    for(ri = 1; ri <= repeat; ri++){

sum=0;

scanf("%d",&n);

    while (n>0){

          if  (!(n % 2))  sum=sum+n;

          scanf("%d",&n);

}

     printf("The sum of the even numbers is %d.\n", sum);

    }

}

40062    求x+x*x/2!+x*x*x/3!+x*x*x*x/4!+……的值

输入一个正整数repeat (0<repeat<10),做repeat次下列运算:

输入1个实数 x,计算并输出下式的值,直到最后一项的绝对值小于0.00001(保留2位小数)。要求定义和调用函数fact(n)计算n的阶乘,可以调用pow函数求幂。

s = x+x*x/2!+x*x*x/3!+x*x*x*x/4!+……

输入输出示例:括号内为说明

输入

3     (repeat=3)

0     (x=0)

1     (x=1)

0.1   (x=0.1)

输出

s = 0.00

s = 1.72

s = 0.11

#include <stdio.h>

#define MY_EPS 0.00001

int main(void)

{

    int i;

    int repeat, ri;

    double item, s, x;

    double fact(int n);

    scanf("%d", &repeat);

    for(ri = 1; ri <= repeat; ri++){

        scanf("%lf", &x);

i=2;

item=x;

s=x;

while(item*x/fact(i)>= MY_EPS){

item=item*x;

s+=item/fact(i);

i++;

}

       printf("s = %.2f\n", s);

    }

}

double fact(int n)

{

int j;

double product;

product = 1;

for(j=1;j<=n;j++) 

product = product *j;

return product;

}

 

40065    分解质因数

输入一个正整数repeat (0<repeat<10),做repeat次下列运算:

输入一个正整数 m(1<m<1000),将 m 分解质因数。

输出使用以下语句:

printf("%d*", i);

输入输出示例:括号内为说明

输入

3        (repeat=3)

2        (m=2)

8        (m=8)

90       (m=90)

输出

2 = 2

8 = 2*2*2

90 = 2*3*3*5

#include "stdio.h"

int prime(int n);

int main(void)

{

    int i, m;

    int repeat, ri;

    scanf("%d", &repeat);

    for(ri = 1; ri <= repeat; ri++){

        scanf("%d", &m);

        printf("%d = ", m);

while ( (prime(m)!=1) && ( m != 1) ){

                                  /*  ( m != 1) 不考虑,会死机 , 永远while */

for(i=2;i<=m;i++){

if(m%i==0){printf("%d*", i);

                m=m/i;

                break;}

}

}

        printf("%d\n", m);

    }

return 0;

}

int prime(int n)

{

int i;

if (n == 1) return 0;

for(i=2;i<=n/2;i++){

       if(n%i==0) return 0;

}

return 1;

}

40067    打印图案

输入一个正整数repeat (0<repeat<10),做repeat次下列操作:

输入一个正整数n,打印一个边长为 n 的菱形图案。

输出使用以下语句:

printf(" ");

printf("* ");

printf("\n");

输入输出示例:括号内为说明

输入

2        (repeat=2)

3        (n=3)

4        (n=4)

输出

    *   (n=3的菱形图案)

  * * *

* * * * *

  * * *

    *

      * (n=4的菱形图案)

    * * *

  * * * * *

* * * * * * *

  * * * * *

    * * *

      *

#include <stdio.h>

int main(void)

{

    int n;

    int repeat, ri;

int nRow, nVal, nCol;

    scanf("%d", &repeat);

    for(ri = 1; ri <= repeat; ri++){

        scanf("%d", &n);

for (nRow = 1; nRow <= n*2-1;  nRow++)

{

   if (nRow <= n)

nVal = nRow;

   else

   nVal = 2*n - nRow;

   for (nCol=1; nCol <= n-nVal ;nCol++)

printf("  ");

   for (nCol=1;nCol<= nVal*2-1; nCol++)

printf("* ");

   printf("\n");

}

}

}

50001    求n!(调试示例error05_1)

程序填空,不要改变与输入输出有关的语句。

从键盘输入一个正整数n,计算 n! 的值。要求定义和调用函数fact(n),计算n!,函数形参n的类型是int,函数类型是double。

输入输出示例:括号内是说明

5        (n=5)

5! = 120.000000

#include <stdio.h>

int main(void)

{    

    int n;

    double factorial;

    double fact(int n);

    scanf ("%d", &n);

/*---------*/

    printf("%d! = %f\n", n, factorial);

}

#include <stdio.h>

int main(void)

{    

    int n;

    double factorial;

    double fact(int n);

    scanf ("%d", &n);

/*---------*/

factorial =fact(n);

    printf("%d! = %f\n", n, factorial);

}

double fact(int n)

{

int i;

double product = 1;

for (i = 1; i<= n; i++)

product *= i;

return product;

}

50002    使用函数判断数的符号

输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:

输入1个整数 x,若 x 大于0,sign(x) = 1;若 x 等于0,sign(x) = 0;否则,sign(x) = -1,最后输出sign(x)的值。

要求定义和调用函数sign(x)实现该分段函数, 函数形参x的类型是int,函数类型是int。

输入输出示例:括号内是说明

输入

3              (repeat=3)

10             (x=10)

-5             (x=-5)

0              (x=0)

输出

sign(10) = 1     (x=10时sign(x)的值为1)

sign(-5) = -1    (x=-5时sign(x)的值为-1)

sign(0) = 0      (x=0时sign(x)的值为0)

#include <stdio.h>

int sign(int x);

int main(void)

{

    int x, y;

    int repeat, ri;

    scanf("%d", &repeat);

    for(ri = 1; ri <= repeat; ri++){

        scanf("%d",&x);

    y=sign(x);

        printf("sign(%d) = %d\n", x, y);

    }

}

int sign(int x)

{

int t=0;

      if(x<0)  t=-1;

       else if(x==0)  t=0;

       else   t=1;

     return t;

}

 

50003    使用函数求奇数和 

输入一个正整数repeat (0<repeat<10),做repeat次下列运算:

输入一批正整数(以零或负数为结束标志),求其中的奇数和。

要求定义和调用函数even(n) 判断数的奇偶性,当n为偶数时返回1,否则返回0,函数形参n的类型是int,函数类型是int。

输入输出示例:括号内是说明

输入

2     (repeat=2)

12 9 7 18 3 11 20 0

11 8 6 17 2 10 19 -1

输出

The sum of the odd numbers is 30.

The sum of the odd numbers is 47.

#include <stdio.h>

int even(int n);

int main(void)

{

    int n, sum;

    int ri, repeat;

    scanf("%d", &repeat);

    for(ri = 1; ri <= repeat; ri++){

sum=0;

scanf("%d",&n);

     while (n>0){

          if (even(n)==0)

             sum=sum+n;

          scanf("%d",&n);

}

     printf("The sum of the odd numbers is %d.\n", sum);

    }

}

int even(int n)

{

int t;

if (n%2==0)  t=1;

else  t=0;

return t;

}

50004    使用函数计算两点间的距离

输入一个正整数repeat (0<repeat<10),做repeat次下列运算:

给定平面任意两点坐标 (x1, y1) 和 (x2, y2),求这两点之间的距离(保留2位小数)。

要求定义和调用函数 dist(x1, y1, x2, y2)计算两点间的距离,函数形参x1、y1、x2和y2的类型都是double,函数类型是double。

输入输出示例:括号内是说明

输入

1               (repeat=1)

10 10           (x1=10, y1=10)

200 100         (x2=200, y2=100)

输出

Distance = 210.24

#include <stdio.h>

#include <math.h>

double dist(double x1, double y1, double x2, double y2);

int main(void)

{

    int repeat, ri;

    double distance, x1, y1, x2, y2;

    scanf("%d", &repeat);

    for(ri = 1; ri <= repeat; ri++){

        scanf("%lf%lf%lf%lf", &x1, &y1, &x2, &y2);

distance=dist(x1, y1, x2, y2);

        printf("Distance = %.2f\n", distance);

    }

}

double dist(double x1, double y1, double x2, double y2)

{

double a,b,c;

a=(x2-x1)*(x2-x1);

b=(y1-y2)*(y1-y2);

c=sqrt((a+b));

return c;

}

50005    使用函数统计素数并求和 

输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:

输入2个正整数 m 和 n(1<=m,n<=500),统计并输出 m 到 n 之间的素数的个数以及这些素数的和。素数就是只能被1和自身整除的正整数,1不是素数,2是素数。

要求定义并调用函数 prime(m) 判断m是否为素数,当m为素数时返回1,否则返回0,函数形参 m 的类型是int,函数类型是int。

输入输出示例:括号内是说明

输入:

1       (repeat=1)

1 10    (m=1, n=10)

输出:

Count = 4, sum = 17     (1到10之间有4个素数:2,3,5,7)

#include "stdio.h"

#include "math.h"

int main(void)

{

    int count, i, m, n, sum;

    int repeat, ri;

int prime(int m);

    scanf("%d", &repeat);

    for(ri = 1; ri <= repeat; ri++){

     scanf("%d%d", &m, &n);

     sum=0;

     count=0;

     if (m==1)  m++;    /* 若第一个数是1, 可直接判定下一个数 */

     for(i=m;i<=n;i++){

        if(prime(i)==1){

        sum=sum+i;

        count++;

}

}

printf("Count = %d, sum = %d\n", count, sum);

    }

}

int prime(int m)

{

       int t,  result;

       if (m == 1) return 0;  

   result = 0;

       for ( t=2; t <= m/2; t++)

       if (m%t == 0)  

            break;

       if (t>m/2) result=1;

   return result;

}

50006    使用函数统计一个整数中数字的个数 

输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:

读入1 个整数in,再输入一个数字digit(0≤digit<10),统计并输出整数 in 中数字 digit 的个数。

要求定义并调用函数countdigit(number,digit),它的功能是统计整数 number 中数字 digit 的个数 ,函数形参number和digit的类型是int,函数类型是int。例如,countdigit(10090,0)的返回值是3。

输入输出示例:括号内是说明

输入

2         (repeat=2)

21252 2   (number=21252, digit=2)

-1111 9   (number=-1111, digit=9)

输出

Number 21252 of digit 2: 3       (21252中有3个2)

Number -1111 of digit 9: 0       (-1111中有0个9)

#include "stdio.h"

int main(void)

{

    int count, digit, in;

    int repeat, ri;

    int countdigit(int number, int digit);

    scanf("%d",&repeat);

    for(ri = 1; ri <= repeat; ri++){

        scanf("%d%d", &in, &digit);

    count=countdigit(in,digit);

        printf("Number %d of digit %d: %d\n", in, digit, count);

    }

}

int countdigit(int number,int digit)

{ int c,t;

       c=0;

       if(number<0)

          number=-number;   

       do {

            t=number%10;

            number=number/10;

            if(t==digit) c++;

   } while (number!=0);            

       return c;

}

50007    使用函数找水仙花数 

输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:

输入2 个正整数 m 和 n(1<=m,n<=1000),输出 m 到 n 之间的所有水仙花数。水仙花数是指各位数字的立方和等于其自身的数。

要求定义并调用函数is(number)判断 number 的各位数字之立方和是否等于其自身,若相等则返回1,否则返回0,函数形参 number 的类型是int,函数类型是int。

输出使用语句:printf("%d\n", i);

输入输出示例:括号内是说明

输入:

2        (repeat=2)

100 400  (m=100, n=400)

1 100    (m=1, n=100)

输出:

result:  (100 到400之间的水仙花数)

153        (1*1*1+5*5*5+3*3*3=153)

370        (3*3*3+7*7*7=370)

371        (3*3*3+7*7*7+1*1*1=371)

result:  (1到100之间的水仙花数)

1    (1*1*1=1)

#include "stdio.h"

int main(void)

{

    int i, m, n;

    int repeat, ri;

    int is(int number);

    scanf("%d", &repeat);

    for(ri = 1; ri <= repeat; ri++){

        scanf("%d%d", &m, &n);

    printf("result:\n");

    for (i=m;i<=n;i++) {

        if(is(i)==1)

        printf("%d\n", i);

}

    }

}

int is(int number)

{ int sum,res,t,j;

res=1;

sum=0;

j=number;

while (j!=0)  {

   t=j%10;

   j=j/10;

   sum=sum+t*t*t;

}

if(sum!=number)  res=0;

return res;

}

50008    使用函数求1! + 2! + … + m!(改错题error05_2)

程序填空,不要改变与输入输出有关的语句。

输入一个正整数 m(0<m<10),求1! + 2! + … + m!,要求定义并调用函数fact(n)计算 n!,函数形参 n 的类型是int,函数类型是double。

输入输出示例:括号内是说明

输入

5      (m=5)

输出:

1!+2!+...+5! = 153.000000

#include <stdio.h>

double fact(int n);

int main(void)

{    

    int i, m;

    double sum;

    scanf("%d", &m);

    sum=0;

for(i=1;i<=m;i++)

sum=sum+fact(i);

    printf("1!+2!+...+%d! = %f\n", m, sum);

}

double fact(int n)

{ int i;   double x;

  if  (n == 0) return 1.0;

  x=1;

  for(i=1;i<=n;i++)

x=x*i;

  return x;

}

50009    使用函数求余弦函数的近似值 

输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:

输入精度 e 和 x,用下列公式求cos(x)的近似值,精确到最后一项的绝对值小于e。

cos(x) = x^0/0!-x^2/2!+x^4/4!-x^6/6!+……

要求定义并调用函数 funcos(e,x)计算 cos(x) 的值,函数形参e和x的类型均为double,函数类型是double。

输入输出示例:括号内是说明

输入:

2     (repeat=2)

0.001  0   (e=0.001, x=0)

0.0001 -3.14 (e=0.0001, x=-3.14)

输出:

sum = 1.000000

sum = -0.999999

#include "stdio.h"

#include "math.h"

double funcos(double e, double x);

int main(void)

{

    int repeat, ri;

    double e, sum, x;

    scanf("%d", &repeat);

    for(ri = 1; ri <= repeat; ri++){

        scanf("%le%le", &e, &x);

sum=funcos(e,x);

        printf("sum = %f\n", sum);

    }

}

double funcos(double e, double x)

{

int flag,n;

double sum,t;

sum=1;

flag=-1;

n=2;

t=1;

while(fabs(t)>=e){

t=flag*t*x*x/(n*n-n);    

sum=sum+t;

n=n+2;

}

return sum;

}

50051    数字金字塔

输入一个正整数repeat (0<repeat<10),做repeat次下列运算:

输入一个正整数n(n<10),输出n行数字金字塔。要求定义并调用函数pyramid(n)输出n行数字金字塔,函数形参n的类型是int,函数类型是void。

输出使用以下语句:

printf(" ");

printf("%d ", i);

输入输出示例:括号内是说明

输入

2    (repeat=2)

5       (n=5)

2       (n=2)

输出:

    1   (n=5时的数字金字塔)

   2 2

  3 3 3

 4 4 4 4

5 5 5 5 5

 1      (n=2时的数字金字塔)

2 2

#include <stdio.h>

int main(void)

{

    int n;

    int repeat, ri;

int nRow, nCol;

    scanf("%d", &repeat);

    for(ri = 1; ri <= repeat; ri++){

        scanf("%d", &n);

for (nRow = 1; nRow <= n;  nRow++)

{

   for (nCol=1; nCol <= n-nRow ;nCol++)

printf("  ");

   for (nCol=1;nCol<= nRow*2-1; nCol++)

printf("%d ", nRow);

   printf("\n");

}

}

}

50052    使用函数找最大值 

输入一个正整数repeat (0<repeat<10),做repeat次下列运算:

输入两个整数a和b,输出其中较大的数。要求定义和调用函数max(a, b)找出a、b中较大的数,函数形参a、b的类型是int,函数类型是int。

输入输出示例:括号内是说明

输入

3       (repeat=3)

输入:

5 8     (a=5, b=8)

-1 -10  (a=-1, b=-10)

1 1     (a=1, b=1)

输出:

max(5,8) = 8

max(-1,-10) = -1

max(1,1) = 1

#include <stdio.h>

int main(void)

{

    int a, b, maximum;

    int repeat, ri;

    int max(int a, int b);

    scanf("%d", &repeat);

    for(ri = 1; ri <= repeat; ri++){

        scanf("%d%d",&a, &b);

    maximum=max(a,b);

        printf("max(%d,%d) = %d\n", a, b, maximum);

    }

}

int max(int a, int b)

{

    int c;

    c=a;   

    if (c<b)  c=b;  

    return c;

}

50061    使用函数求a+aa+aaa+aa…a

程序填空,不要改变与输入输出有关的语句。

输入一个正整数repeat (0<repeat<10),做repeat次下列运算:

输入两个正整数 a 和 n, 求a+aa+aaa+aa…a(n个a)之和。

要求定义并调用函数fn(a, n),它的功能是返回 aa…a(n个a),函数形参a和n的类型是int,函数类型是long。例如,fn(3,2)的返回值是33。

输入输出示例:括号内是说明

输入

2       (repeat=2)

2 3     (a=2, n=3)

8 5     (a=8, n=5)

输出

246     (2+22+222)

98760   (8+88+888+8888+88888)

#include <stdio.h>

int main(void)

{

    int a, i, n;

    int ri, repeat;

    long sn;

    long fn(int a, int n);

    scanf("%d", &repeat);

    for(ri = 1; ri <= repeat; ri++){

        scanf("%ld%d", &a, &n);

sn=0;

for(i=1;i<=n;i++)

sn+=fn(a,i);

printf("%ld\n", sn);

    }

}

long fn(int a, int n)

{

int sum,j,b;

sum=a;

b=a;

for(j=1;j<n;j++) {

b=b*10;

sum+=b;

}

return sum;

}

50062    使用函数输出指定范围内的 Fibonacci 数 

输入一个正整数repeat (0<repeat<10),做repeat次下列运算:

输入两个正整数 m 和 n(1<=m,n<=10000),输出 m 到 n 之间所有的Fibonacci数。

Fibonacci 序列(第一项起):1  1  2  3  5  8  13  21 ......

要求定义并调用函数fib(n),它的功能是返回第 n 项Fibonacci数,函数形参n的类型是int,函数类型是long。例如,fib(7)的返回值是13。

输出使用语句:printf("%ld ", f);

输入输出示例:括号内是说明

输入:

3               (repeat=3)

1 10            (m=1, n=10)

20 100          (m=20, n=100)

1000 6000       (m=1000, n=6000)

输出:

1 1 2 3 5 8        (1到10之间的Fibonacci数)

21  34  55  89     (20到100之间的Fibonacci数)

1597  2584  4181   (1000到6000之间的Fibonacci数)

#include "stdio.h"

int main(void)

{

   int i, m, n;

   int repeat, ri;

   long f;

   long fib(int n);

   scanf("%d",&repeat);

   for(ri = 1; ri <= repeat; ri++){

        scanf("%d%d", &m, &n);

        f = 1; i =1;

        while (f <=n) {

      if(f>=m) printf("%d ", f);

            f=fib(++i);

}

        printf("\n");

    }

}

long fib(int n)

{

 int i;

 long a=1, b=1, c;

 if(n==1 || n==2)  return 1;

 for(i=3;i<=n;i++) {

  c=a+b;

  a=b;

  b=c;

  }

  return c;

}

50063    使用函数找出指定范围内的完数 

输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:

输入两个正整数 m 和 n(1<=m,n<=1000),输出 m 到 n 之间的所有完数,完数就是因子和与它本身相等的数。

要求定义并调用函数 factorsum(number),它的功能是返回number的因子和,函数形参number的类型是整型,函数类型是整型。例如,factorsum(12)的返回值是16(1+2+3+4+6)。

输出使用语句:printf("%d ", i);

输入输出示例:括号内是说明

输入:

2        (repeat=2)

20 500   (m=20 n=500)

1 100    (m=1, n=100)

输出:

28 496   (20到500之间的完数有:28,496)

1 6 28   (1到100之间的完数有:1,6,28)

#include "stdio.h"

int main(void)

{

    int i, m, n;

    int repeat, ri;

    int factorsum(int number);

    scanf("%d", &repeat);

    for(ri = 1; ri <= repeat; ri++){

    scanf("%d%d", &m, &n);

    for(i=m;i<=n;i++){

       if(i==factorsum(i))

       printf("%d ", i);

     }

        printf("\n");

    }

}

int factorsum(int number)

{

       int t,sum;

       sum=0;

       if(number==1)  sum=1;

       else {

for(t=1;t<=number/2;t++){    

if(number%t==0)

sum=sum+t;

}

}

       return sum;

}

50064    使用函数输出一个整数的逆序数  

程序填空,不要改变与输入输出有关的语句。

输入一个正整数repeat (0<repeat<10),做repeat次下列运算:

输入一个整数 in,输出其逆序数。

要求定义并调用函数reverse(number),它的功能是返回number的逆序数,函数形参number的类型是int,函数类型是int。例如,reverse(12345)的返回值是54321。

输入输出示例:括号内是说明

输入

5        (repeat=4)

12345    (in=12345)

-100     (in=-100)

-2       (in=-2)

99       (in=99)

0        (in=0)

输出

54321    (12345的逆序数)

-1       (-100的逆序数)

-2       (-2的逆序数)

99       (99的逆序数)

0        (0的逆序数)

#include <stdio.h>

int main(void)

{

    long in, res;

    int ri, repeat;

    long reverse(long number);

    scanf("%d", &repeat);

    for(ri = 1; ri <= repeat; ri++){

        scanf("%ld", &in);

/*---------*/

res = reverse(in);

        printf("%ld\n", res);

    }

}

long reverse(long n)

{

   int a;

   long num=0;   /*设置一个累加和的变量 */

   while(n)

{

   a = n%10;

           num=num*10 + a;

           n=n/10;

   }

   return num;     

}

60001    使用函数求PI(调试示例源程序error06_1)

输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:

输入精度eps,根据下式求 PI 的值,直到最后一项小于eps。

PI/2=1+1/(1*3)+2!/(1*3*5)+3!/(1*3*5*7)+...+n!/(1*3*5*...*(2n+1))

要求定义并调用函数 fact(n)计算 n!,函数形参n的类型是int,函数类型是double;定义并调用函数 multi(n)计算 1*3*5*...*n,函数形参n的类型是int,函数类型是double。

输入输出示例:括号内是说明

输入:

2           (repeat=2)

1E-6        (eps=1E-6)

1E-5        (eps=1E-5)

输出示例:

PI = 3.14159

PI = 3.14158

#include <stdio.h>

double fact(int n);

double denominator (int n);

int main(void)

{

    int i;

    int repeat, ri;

    double eps, sum, item;

    scanf("%d", &repeat);

    for(ri = 1; ri <= repeat; ri++){

        scanf("%le", &eps);

i=1;  sum=1;

do{

item = fact(i) / denominator(2*i+1);

sum=sum+item;

i++;

}while(item>=eps);

printf("PI = %0.5f\n", 2 * sum);

      }

return 0;

}

double fact(int n)

{

int i;

double sum;

sum=1;

for(i=1;i<=n;i++)

sum=sum*i;

return sum;

}

double denominator (int n)

{

int i;

double sum;

sum=1.0;

for(i=1;i<=n;i=i+2)

sum=sum*i;

return sum;

}

60002    整数的十进制、八进制和十六进制表现形式

输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:

依次以十进制、八进制和十六进制形式输入三个整数,输出每个整数的十进制、八进制和十六进制形式。

输入输出示例:括号内是说明

输入:

1          (repeat=1)

31 11 1a   (十进制数31,八进制数11,十六进制数1a)

输出:

The decimal is 31, the octal is 37, the hexadecimal is 1f.  (十进制数31的十进制、八进制和十六进制形式是31, 37, 1f)

The decimal is 9, the octal is 11, the hexadecimal is 9.   (八进制数11的十进制、八进制和十六进制形式是9, 11, 9)

The decimal is 26, the octal is 32, the hexadecimal is 1a. (十六进制数1a的十进制、八进制和十六进制形式是26, 32, 1a)

#include <stdio.h>

int main(void)

{

    int decimal, octal, hexadecimal;

    int repeat, ri;

    scanf("%d", &repeat);

    for(ri = 1; ri <= repeat; ri++){

        scanf("%d%o%x", &decimal, &octal, &hexadecimal);

printf("The decimal is %d, the octal is %o, the hexadecimal is %x.\n",decimal,decimal,decimal);

printf("The decimal is %d, the octal is %o, the hexadecimal is %x.\n",octal,octal,octal);

printf("The decimal is %d, the octal is %o, the hexadecimal is %x.\n",hexadecimal,hexadecimal,hexadecimal);

    }

}

60003    分类统计字符

程序填空,不要改变与输入输出有关的语句。

输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:

输入一行字符,以回车结束,统计出其中的英文字母、空格、数字和其他字符的个数。

输入输出示例:括号内是说明

输入

2                          (repeat=2)

Reold building room 123.

Programming is fun!

输出

letter = 17, blank = 3, digit = 3, other = 1   ("Reold building room 123."中的英文字母、空格、数字和其他字符的个数)

letter = 16, blank = 2, digit = 0, other = 1   ("Programming is fun!"中的英文字母、空格、数字和其他字符的个数)

#include <stdio.h>

int main(void)

{

    char c;

    int blank, digit, letter, other;

    int ri, repeat;

    scanf("%d", &repeat);

    getchar();

    for(ri = 1; ri<=repeat; ri++)

    {

     c = getchar();

     letter=blank=digit=other=0;

     while (c!='\n')

      {

       if ((c>='a'&&c<='z')||(c>='A'&&c<='Z')) letter++;

     else  if (c==' ') blank++;

     else  if(c>='0'&&c<='9') digit++;

     else other++;

     c=getchar();

      }

     printf("letter = %d, blank = %d, digit = %d, other = %d\n", letter, blank, digit, other);

    }

}

60006    验证歌德巴赫猜想(本题与40026完全一样

程序填空,不要改变与输入输出有关的语句。

验证哥德巴赫猜想:任何一个大于6的偶数均可表示为两个素数之和。例如6=3+3,8=3+5,…,18=7+11。素数就是只能被1和自身整除的正整数,1不是素数,2是素数。

输入两个正整数 m 和 n(6<=m<=n<=100),将 m 到 n 之间的偶数表示成两个素数之和,打印时一行打印5组。

要求定义并调用函数 prime(m) 判断m是否为素数,当m为素数时返回1,否则返回0,函数形参 m 的类型是int,函数类型是int。

输出使用语句:printf("%4d = %4d + %4d ", number, i, number - i);

输入输出示例:括号内为说明

输入:

89 100 (m=89, n=100)

输出:

90=37+53 92=3+89 94=5+89 96=7+89 98=19+79

100=3+97

#include <stdio.h>

int prime(int m)

{

int i, ifPrime=0;

if(m==1) return 0;

for(i=2;i<=m/2;i++) { 

if(m%i==0)

break;

}

if(i>m/2)

ifPrime=1;

return ifPrime;

}

int main(void)

{

    int count, i, m, n, number;

    scanf("%d%d", &m, &n);

    if(m % 2 != 0) m = m + 1;

if(m >= 6) {

count=0;

for(number=m;number<=n;number=number+2)  {

for(i=1;i<=number/2;i++)  {

if(  prime(i) && prime(number-i) )  {

printf("%d=%d+%d ", number, i, number-i);

count++;

if(count%5==0)

printf("\n");

break;

}

}

}

    }

}

60007    使用函数输出整数的逆序数

程序填空,不要改变与输入输出有关的语句。

输入2个整数,分别将其逆向输出。

要求定义并调用函数 fun(n),它的功能是返回 n 的逆向值,函数形参 n 的类型是int,函数类型是int。例如,fun(123)的返回值是321。

输入输出示例:括号内是说明

输入:

123

-910

输出:

123的逆向是321

-910的逆向是-19

#include <stdio.h>

int fun(int n);

int main(void)

{

    int m1,m2;

    scanf("%d%d", &m1, &m2);

    printf("%d的逆向是%d\n", m1, fun(m1));

    printf("%d的逆向是%d\n", m2, fun(m2));

}

int fun(int n)

{

   int a, num=0;   /*设置一个累加和的变量 */

   while(n)

{

a = n%10;

           num=num*10 + a;

           n=n/10;

   }

   return num;     

}

60009    统计单词

程序填空,不要改变与输入输出有关的语句。

输入一个正整数repeat (0<repeat<10),做repeat次下列运算:

输入一行字符,以回车结束,统计其中单词的个数。各单词之间用空格分隔,空格数可以是多个。

输入输出示例:括号内是说明

输入

2   (repeat=2)

Let's  go   to room  209.

  Programming is fun

输出

count = 5     ("Let's  go   to room  209."中有5个单词)

count = 3     ("  Programming is fun"中有3个单词)

#include <stdio.h>

int main(void)

{

    char c;

    int count, word;

    int repeat, ri;

    scanf("%d", &repeat);

    getchar();

    for(ri = 1; ri <= repeat; ri++){

       c = getchar();

word=0; count=0;

while(c!='\n'){

if(c==' ') word=0;    /* 只要碰上空格, 单词标记清空 */

else{              /*出现非空字符

if(word==0) {   /* 第一次非空字符的话,单词数递增1*/

count++;  

    word=1;    /*  单词标记为1*/

}          

}

c=getchar();

}

        printf("count = %d\n", count);

    }

}

60062    简单计算器

程序填空,不要改变与输入输出有关的语句。

输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:

模拟简单运算器的工作:输入一个算式(没有空格),遇等号 "=" 说明输入结束,输出运算结果。

假设计算器只能进行加、减、乘、除运算,运算数和结果都是整数,4种运算符的优先级相同,按从左到右的顺序计算。

输入输出示例:括号内是说明

输入

2             (repeat=2)

15+2/3=

1+2*10-10/2=

输出

5

10

#include <stdio.h>

int main(void)

{

    char c;

    int operand1, operand2, res;

    int repeat, ri;

    scanf("%d", &repeat);

    for(ri = 1; ri <= repeat; ri++) {

        scanf("%d", &operand1);

        c=getchar();

res=operand1;

        while(c != '=')

{

           scanf("%d", &operand2);

   switch(c)

{

case'+':res=res+operand2;break;

case'-':res=res-operand2;break;

case'*':res=res*operand2;break;

case'/':res=res/operand2;break;

}

       c= getchar();

}

        printf("%d\n", res);

   }

}

70011    简化的插入排序

输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:

输入一个正整数 n(0<n<=9)和一组(n个)有序的整数,再输入一个整数 x,把 x 插入到这组数据中,使该组数据仍然有序。

输入输出示例:括号内为说明

输入:

4               (repeat=4)

5               (数据的个数n=5)

1 2 4 5 7       (5个有序整数)

3               (待插入整数x=3)

4               (数据的个数n=4)

1 2 5 7         (4个有序整数)

-10             (待插入整数x=-10)

3               (数据的个数n=3)

1 2 4         (3个有序整数)

100             (待插入整数x=100)

5               (数据的个数n=5)

1 2 4 5 7       (5个有序整数)

4               (待插入整数x=4)

输出:

1 2 3 4 5 7

-10 1 2 5 7

1 2 4 100

1 2 4 4 5 7

#include <stdio.h>

int main(void)   

{

    int i, j, n, x;

    int repeat, ri;

    int a[10];

    scanf("%d", &repeat);

    for(ri = 1; ri <= repeat; ri++){

        scanf("%d", &n);

        for(i = 0; i < n; i++)

         scanf("%d", &a[i]);

         scanf("%d", &x);

 if (x >= a[n-1]) a[n] = x;  /* 特殊情况x比所有的元素都要大 */

         else

 for(i = 0; i < n; i++) {

  if(x > a[i])   continue;  /* x 插入到合适的位置*/

  j = n - 1;     /* 从当前要插入的位置往后移位 */

  while(j >= i){

   a[j+1] = a[j];

   j--;   

  }       

      a[i] = x;      /* 将x查到当前的位置 */

              break;

 }

     for(i = 0; i < n + 1; i++)

            printf("%d ", a[i]);

        putchar('\n');   

    }

}

70012    求平均值

输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:

输入一个正整数 n (1<n<=10),再输入 n 个整数,输出平均值(保留2位小数)。

输入输出示例:括号内为说明

输入

2          (repeat=2)

3          (n=3)

1 2 -6    

5          (n=5)

12 2 5 4 0

输出

average = -1.00

average = 4.60

#include <stdio.h>

int main(void)

{

    int i, n, sum;

    int repeat, ri;

    int a[10];

    double average;

    scanf("%d", &repeat);

    for(ri = 1; ri <= repeat; ri++){

        scanf("%d", &n);

        for(i = 0; i < n; i++)

            scanf("%d", &a[i]);

sum=0;

for(i=0; i < n; i++)

sum+=a[i];

average=1.0*sum/n*1.0;

        printf("average = %.2f\n", average);

    }

}

70013    将数组中的数逆序存放 

输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:

输入一个正整数 n (1<n<=10),再输入 n 个整数,存入数组a中,先将数组a中的这n个数逆序存放,再按顺序输出数组中的n个元素。

输入输出示例:括号内为说明

输入

2            (repeat=2)

4            (n=4)

10 8 1 2

5            (n=5)

1 2 5 4 0

输出

2 1 8 10

0 4 5 2 1

#include <stdio.h>

int main(void)

{

    int i, n, temp;

    int repeat, ri;

    int a[10];

    scanf("%d", &repeat);

    for(ri = 1; ri <= repeat; ri++){

        scanf("%d", &n);

        for(i = 0; i < n; i++)

            scanf("%d", &a[i]);

i=0;

for(i=0;i<n/2;i++){

temp=a[i];

a[i]=a[n-1-i];

a[n-1-i]=temp;

}

        for(i = 0; i < n; i++)

            printf("%d ", a[i]);

        printf("\n");

    }

}

70014    求最大值及其下标 

输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:

输入一个正整数 n (1<n<=10),再输入n个整数,输出最大值及其对应的最小下标,下标从0开始。

输入输出示例:括号内为说明

输入

3     (repeat=3)

3     (n=3)

1 6 4

4     (n=4)

10 8 1 9

5     (n=5)

1 2 0 4 5

输出

max = 6, index = 1    (最大值6的下标是1)

max = 10, index = 0   (最大值10的下标是0)

max = 5, index = 4    (最大值5的下标是4)

#include <stdio.h>

int main(void)

{

    int i, index, n;

    int ri, repeat;

    int a[10];

    scanf("%d", &repeat);

    for(ri = 1; ri <= repeat; ri++){

        scanf("%d", &n);

        for(i = 0; i < n; i++)

            scanf("%d", &a[i]);

index=0;

a[index]=a[0];

for(i = 1; i < n; i++){

if(a[index]<a[i]){

a[index]=a[i];

index=i;

}

}

        printf("max = %d, index = %d\n", a[index], index);

    }

}

70015    交换最小值和最大值

输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:

输入一个正整数 n (1<n<=10),再输入 n 个整数,将最小值与第一个数交换,最大值与最后一个数交换,然后输出交换后的 n 个数。

输入输出示例:括号内为说明

输入

3         (repeat=3)

5         (n=5)

8 2 5 1 4

4         (n=4)

1 5 6 7

5         (n=5)

5 4 3 2 1

输出

After swap: 1 2 5 4 8

After swap: 1 5 6 7

After swap: 1 4 3 2 5

#include <stdio.h>

int main(void)

{

    int i, index, n, t;

    int repeat, ri;

    int a[10];

    scanf("%d", &repeat);

    for(ri = 1; ri <= repeat; ri++){

        scanf("%d", &n);

        for(i = 0; i < n; i++)

            scanf("%d", &a[i]);

index=0;

for(i = 1; i < n; i++){

if(a[i]<a[index])

index=i;

}

t=a[index];   /* 最小值与第1个数交换 */

a[index]=a[0];

a[0]=t;

index=0;

for(i = 1; i < n; i++){

if(a[i]>a[index])

index=i;

}

t=a[index];     /* 最大值与最后一个数交换 */

a[index]=a[n-1];

a[n-1]=t;

        printf("After swap: ");

        for(i = 0; i < n; i++)

            printf("%d ", a[i]);

        printf("\n");

    }

}

70016    选择法排序

输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:

输入一个正整数 n (1<n<=10),再输入 n 个整数,将它们从大到小排序后输出。

输入输出示例:括号内为说明

输入

3           (repeat=3)

4           (n=4)

5 1 7 6

3           (n=3)

1 2 3

5           (n=5)

5 4 3 2 1

输出

After sorted: 7 6 5 1

After sorted: 3 2 1

After sorted: 5 4 3 2 1

#include <stdio.h>

int main(void)

{

    int i, index, k, n, temp;

    int repeat, ri;

    int a[10];

    scanf("%d", &repeat);

    for(ri = 1; ri <= repeat; ri++){

        scanf("%d", &n);

        for(i = 0; i < n; i++)

            scanf("%d", &a[i]);

for(k=0;k<n-1;k++){

index=k;

for(i=k+1;i<n;i++)

if(a[i]>a[index])

index=i;

temp=a[index];

a[index]=a[k];

a[k]=temp;

}

        printf("After sorted: ");

        for(i = 0; i < n; i++)

            printf("%d ", a[i]);

        printf("\n");

    }

}

70017    在数组中查找指定的元素

输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:

输入一个正整数 n (1<n<=10),再输入 n 个整数,将它们存入数组 a 中,再输入一个整数 x,然后在数组 a 中查找与 x 相同的元素,如果找到,输出 x 在数组 a 中对应元素的最小下标,如果没有找到,输出相应信息。

输入输出示例:括号内为说明

输入:

2 (repeat=2)

6 (n=6)

1 3 5 7 9 5

5 (x=5)

4 (n=4)

1 3 5 7

2 (x=2)

输出:

5: a[2]

2: not found

#include <stdio.h>

int main(void)

{

    int flag, i, n, x;

    int repeat, ri;

    int a[10];

    scanf("%d", &repeat);

    for(ri = 1; ri <= repeat; ri++){

flag=0;          /* 若标志不重新初始化的化,就会一影响下一轮循环的计算 */

        scanf("%d", &n);

        for(i = 0; i < n; i++) scanf("%d", &a[i]);

        scanf("%d", &x);

for (i = 0; i < n; i++) {

if(x==a[i])

{

flag = 1;

break;

}

}

        if(flag != 0) printf( "%d: a[%d]\n", x, i);

        else printf( "%d: not found\n", x);

    }

}

70021    求矩阵各行元素之和

输入2个正整数 m 和 n (1<=m<=6, 1<=n<=6),然后输入矩阵 a(m 行 n 列)中的元素,分别求出各行元素之和,并输出。

输出使用语句:printf("sum of row %d is %d\n", i, sum);

输入输出示例:括号内为说明

输入:

3 2 (m=3,n=2)

6  3

1  -8

3  12

输出:

sum of row 0 is 9

sum of row 1 is -7

sum of row 2 is 15

#include <stdio.h>

int main(void)

{

    int i, j, m, n, sum;

    int a[6][6];

    scanf("%d%d",&m,&n);

    for(i = 0; i < m; i++)    

        for(j = 0; j < n; j++)

            scanf("%d", &a[i][j]);

for(i = 0; i < m; i++){   

sum=0;

for(j = 0; j < n; j++)

sum+=a[i][j];

printf("sum of row %d is %d\n", i, sum);

}

}

70022    矩阵运算

程序填空,不要改变与输入输出有关的语句。

输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:

读入 1 个正整数 n(1≤n≤6), 再读入 n 阶方阵 a , 计算该矩阵除副对角线、最后一列和最后一行以外的所有元素之和。副对角线为从矩阵的右上角至左下角的连线。

输入输出示例:括号内为说明

输入:

1        (repeat=1)

4        (n=4)

2 3 4 1

5 6 1 1

7 1 8 1

1 1 1 1

sum = 35   (2+3+4+5+6+7+8=35)

#include "stdio.h"

int main(void)

{

    int i, j, n, sum;

    int repeat, ri;

    int a[6][6];

    scanf("%d", &repeat);

    for(ri = 1; ri <= repeat; ri++){

        scanf("%d", &n);

        for(i = 0; i < n; i++)

            for(j = 0; j < n; j++)

                scanf("%d", &a[i][j]);

sum=0;

for(i = 0; i < n; i++){

for(j = 0; j < n; j++)

sum+=a[i][j];

}

for(i = 1; i < n-1; i++) 

sum-=a[i][n-i-1];  /* 减去副对角线的元素 */

for(j =0; j <n; j++) 

sum-=a[n-1][j];   /* 减去最下一行 */

for(i =0; i <n; i++)

sum-=a[i][n-1];   /* 减去最右一列 */

sum=sum+a[n-1][n-1];    /*  右下角元素减了两次补回一次 */

        printf("sum = %d\n", sum);

    }

}

70023    九九乘法表  

程序填空,不要改变与输入输出有关的语句。

输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:

输入一个正整数 n(0<n<10),输出九九乘法表的前n×n项。

提示:将乘数、被乘数和乘积放入一个二维数组中,再输出该数组。

输入输出示例:括号内为说明

输入:

1       (repeat=1)

3       (n=3)

输出:

*   1   2   3

1   1

2   2   4

3   3   6   9

#include "stdio.h"

int main(void)

{

    int i, j, n;

    int a[10][10];

    int repeat, ri;

 

    scanf("%d",&repeat);

    for(ri = 1; ri <= repeat; ri++){

        scanf("%d", &n);

for(j = 0; j <= n; j++)

a[0][j]=j;   /* 乘数 */

for(i = 0; i <= n; i++)

a[i][0]=i;   /* 被乘数 */

for(i = 1; i <= n; i++)

            for(j = 1; j <= n; j++)

a[i][j]=i*j;  /* 结果 */

        for(i = 0; i <= n; i++){

            for(j = 0; j <= n; j++)

                if(i == 0 && j == 0) printf("%-4c", '*');

                else if(i == 0 || j <= i) printf("%-4d", a[i][j]);

            printf("\n");

        }

    

}

}

70024    判断上三角矩阵

输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:

输入1 个正整数 n (1≤n≤6)和 n 阶方阵 a 中的元素,如果 a 是上三角矩阵, 输出"YES", 否则, 输出"NO"。上三角矩阵指主对角线以下的元素都为0的矩阵, 主对角线为从矩阵的左上角至右下角的连线。

输入输出示例:括号内为说明

输入:

2       (repeat=2)

3   (n=3)

1  2  3   

0  4  5  

0  0  6

2   (n=2)

1  0  

-8  2   

输出:

YES

NO

#include "stdio.h"

#include "math.h"

int main(void)

{

    int flag, i, j, n;

    int a[6][6];

    int repeat, ri;

    scanf("%d", &repeat);

    for(ri = 1; ri <= repeat; ri++){

        scanf("%d", &n);

        for(i = 0; i < n; i++)

            for(j = 0; j < n; j++)

                scanf("%d", &a[i][j]);

flag=1;

for(i = 0; i < n; i++){

for(j = 0; j < i; j++){     

if(a[i][j]!=0){

flag=0; break;   /* 只要一个数值不满足就可以否定 */

}

}

if (!flag) break;

}

        if(flag != 0)  printf("YES\n");

        else  printf("NO\n");

    }

}

70025    算算看,这是第几天?

输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:

输入日期(年、月、日),输出它是该年的第几天。

要求定义与调用函数 day_of_year(year, month, day),计算并返回year(年)、month(月)和day(日)对应的是该年的第几天,函数形参year、month和day的类型是int,函数类型也是int。

输入输出示例:括号内为说明

输入:

2         (repeat=2)

1981 3 1  (1981年3月1日)

2000 3 1  (2000年3月1日)

输出:

days of year: 60        (1981年3月1日是该年的第60天)

days of year: 61        (2000年3月1日是该年的第61天)

#include "stdio.h"

int main(void)

{

    int day, day_year, month, year;

    int repeat, ri;

    int day_of_year(int year, int month, int day);

    scanf("%d", &repeat);

    for(ri = 1; ri <= repeat; ri++){

        scanf("%d%d%d", &year, &month, &day);

day_year=day_of_year(year,month,day);

        printf("days of year: %d\n", day_year);

    }

}

int day_of_year(int year, int month, int day)

{

int k,leap;

int a[2][31]={

{0,31,28,31,30,31,30,31,31,30,31,30,31},

{0,31,29,31,30,31,30,31,31,30,31,30,31} 

  };

leap=(year%4==0&&year%100!=0||year%400==0);

for(k=1;k<month;k++)

day=day+a[leap][k];

return day;

}

70026    找鞍点(选作)  

输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:

输入 1 个正整数 n(1≤n≤6)和 n 阶方阵 a 中的元素,假设方阵 a 最多有1个鞍点,如果找到 a 的鞍点, 就输出其下标, 否则,输出"NO"。鞍点的元素值在该行上最大, 在该列上最小。

输入输出示例:括号内为说明

输入:

2        (repeat=2)

4        (n=4)

1  7  4  1

4  8  3  6

1  6  1  2

0  7  8  9

2        (n=2)

1 7

4 1

输出:

a[2][1] = 6

NO

#include "stdio.h"

int main(void)

{

    int flag, i, j, k, row, col, n;

    int a[6][6];

    int repeat, ri;

    scanf("%d", &repeat);

    for(ri = 1; ri <= repeat; ri++){

        scanf("%d", &n);

        for(i = 0; i < n; i++)

            for(j = 0; j < n; j++)

                scanf("%d", &a[i][j]);

 for(row=0;row<n;row++){  

col=0;    

for(j=1;j<n;j++){

              if(a[row][j]>a[row][col])

                  col=j;    

}

        flag=1;     

for(i=0;i<n;i++){   

if(a[row][col]>a[i][col]) {

 flag=0;  

 break; /* 只要当前行的最大值不是当前列的最小,放弃*/  

}

}

if(flag) break;   /* 找到就可以跳出循环了 */

}

        if(flag != 0)

            printf("a[%d][%d] = %d\n", row, col,a[row][col]);

        else

            printf("NO\n");

    }

}

70031    将字符串逆序存放

输入一个以回车结束的字符串(少于80个字符),将它的内容逆序输出。如"ABCD" 的逆序为"DCBA"。

输入输出示例:括号内为说明

输入:

Welcome to you!

输出:

!uoy ot emocleW

#include <stdio.h>    

int main(void)

{

    int i, j, temp;

    char str[80];  

 

    i = 0;

    while((str[i] = getchar( )) != '\n')  

        i++;  

    str[i] = 0;   /* 使用\0 的必要性*/

      

    for (j=0;j<i/2;j++) {

        temp=str[i-j-1];

        str[i-j-1]=str[j];

        str[j]=temp;

}     

    for(i = 0; str[i] != 0; i++)  

        putchar(str[i]);

}

70032    查找字符

输入一个正整数repeat (0<repeat<10),做repeat次下列运算:

输入一个字符,再输入一个以回车结束的字符串(少于80个字符),在字符串中查找该字符,如果找到,输出该字符在字符串中所对应的最大下标 (下标从0开始);否则输出"Not Found"。

输入输出示例:括号内为说明

输入:

2 (repeat=2)

m               (字符'm')

programming (字符串"programming")

a (字符'a')

1234 (字符串"1234")

输出:

index = 7      ('m'在"programming"中对应的最大下标是7)

Not Found     ("1234"中没有'a')

#include "stdio.h"

#define MAXLEN 80

int main(void)

{

    char cc, ch;

    char str[MAXLEN];

    int count, flag, i, index;

    int repeat, ri;

    scanf("%d", &repeat);

    getchar();

    for(ri = 1; ri <= repeat; ri++){

        cc = getchar();

        getchar();       /* 用于抵消输入查询字符后的回车 */

        i = 0;

        while((ch = getchar()) != '\n'){

            str[i++] = ch;

        }

        str[i] = 0;

flag=0;

for(i=0;str[i] != '\0';i++){

if(str[i]==cc){

flag++;

index=i;

}

}

        if(flag)  

            printf("index = %d\n", index);

        else

            printf("Not Found\n");

    }

}

70033    统计大写辅音字母

输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:

输入一个以回车结束的字符串(少于80个字符),统计并输出其中大写辅音字母的个数。大写辅音字母:除'A', 'E', 'I', 'O', 'U'以外的大写字母。

输入输出示例:括号内为说明

输入:

2 (repeat=2)

HELLO              

group

输出:

count = 3       ("HELLO"中有3个大写辅音字母)

count = 0       ("group"中没有大写辅音字母)

#include "stdio.h"

#define MAXLEN 80

int main(void)

{

    char ch;

    char str[MAXLEN];

    int count, i;

    int repeat, ri;

 

    scanf("%d", &repeat);

    getchar();

    for(ri = 1; ri <= repeat; ri++){

        i = 0;

        while((ch = getchar()) != '\n'){

            str[i++]=ch;

        }

        str[i] = 0;

        i=0;

        count=0;

        while(str[i]){

              if(str[i]<='Z'&&str[i]>='A')

                 switch(str[i]){

  case 'A':

                      case 'E':

                      case 'I':

                      case 'O':

                      case 'U': break;

                      default:

                            count++;

break;

}

               i++;}

        printf("count = %d\n", count);

    }

}

70034    字符串替换

输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:

输入一个以回车结束的字符串(少于80个字符),将其中的大写字母用下面列出的对应大写字母替换,其余字符不变,输出替换后的字符串。

原字母   对应字母

    A        Z

    B        Y

    C        X

    D        W

       ……

    X        C

    Y        B

    Z        A

输入输出示例:括号内为说明

输入:

2 (repeat=2)

A flag of USA

1+2=3

输出:

After replaced: Z flag of FHZ

After replaced: 1+2=3

/* 思路:A-Z, B-Y, ... Z-A, 左右字符的ASCII值的和都是一样的,都是'A'+'Z',  设左字符为变量x, 右字符的ASCII值就是 'A'+'Z'-x  */

#include "stdio.h"

#include "string.h"

#define MAXLEN 80

int main(void)

{

    char ch;

    char str[MAXLEN];

    int i;

    int repeat, ri;

    scanf("%d", &repeat);

    getchar();

    for(ri = 1; ri <= repeat; ri++){

        i = 0;

        while((ch = getchar()) != '\n'){

            str[i] = ch;

            i++;

}

        str[i] = 0;

for(i=0;str[i]!=0;i++){

if(str[i]>='A'&&str[i]<='Z')

    str[i]='A'+'Z'-str[i];

}

       printf("After replaced: ");

        for(i = 0; str[i] != 0; i++)

            putchar(str[i]);

        putchar('\n');

   }

}

 

70035    将十六进制字符串转换为十进制整数

输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:

输入一个以回车结束的字符串(少于80个字符),滤去所有的非十六进制字符后,组成一个新字符串(十六进制形式),然后将其转换为十进制数后输出。

输入输出示例:括号内为说明

输入:

2 (repeat=2)

10

+A

输出:

Dec = 16

Dec = 10

#include "stdio.h"

#include "string.h"

#define MAXLEN 80

int main(void)

{  

    char ch;

    char str[MAXLEN], num[MAXLEN];

    int i, k;

    int repeat, ri;

    long number;

    scanf("%d", &repeat);

    getchar();

    for(ri = 1; ri <= repeat; ri++){

        i = 0;

        while((ch = getchar()) != '\n'){

            str[i]=ch;

            i++;

        }

        str[i] = 0;    /* 输入字符串 */

number=0;

 for(i=0;str[i]!='\0';i++){

if(str[i]>='0'&&str[i]<='9')

number=number*16+str[i]-'0';

else if(str[i]>='A'&&str[i]<='F')

 number=number*16+str[i]-'A'+10;

else if(str[i]>='a'&&str[i]<='f')

 number=number*16+str[i]-'a'+10;

 }    /*  16进制字符 0-9, A-F, a-f */

       printf("Dec = %ld\n",number);

    }

}

70036    将十进制字符串转换为十进制整数

输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:

输入一个以回车结束的字符串(少于80个字符),把字符串中的所有数字字符('0'~'9')转换为整数,去掉其他字符。例如,字符串"3a56bc"转换为整数后是356。

输入输出示例:括号内为说明

输入:

2 (repeat=2)

82jeep5

free

输出:

825

0

#include <stdio.h>     

#include <string.h>

int main(void)

{

    char str[80];

    int i, s;

    int repeat, ri;

    scanf("%d", &repeat);

    getchar();

    for(ri = 1; ri <= repeat; ri++){

        i = 0;

        while((str[i] = getchar( )) != '\n')

            i++;

        str[i] = 0;

s=0;

for(i=0;str[i]!=0;i++){

if(str[i]>='0'&&str[i]<='9')

s=s*10+str[i]-'0';

}

printf("%d\n",s);

    }

}

70051    找最大值并交换

输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:

输入一个正整数 n (1<n<=10),再输入 n 个整数,先输出最大值及其最大下标(下标从0开始),再将最大值与最后一个数交换,并输出交换后的 n 个数。

输入输出示例:括号内为说明

输入

3            (repeat=3)

5      (n=5)

4 3 5 5 2

4      (n=4)

1 5 6 7

5        (n=5)

5 4 3 2 1

输出

max = 5, index = 3

4 3 5 2 5

max = 7, index = 3

1 5 6 7

max = 5, index = 0

1 4 3 2 5

#include <stdio.h>

int main( )

{

    int i, index, n, temp;

    int repeat, ri;

    int a[10];

    scanf("%d", &repeat);

    for(ri = 1; ri <= repeat; ri++){

        scanf("%d", &n);

        for(i = 0; i < n; i++)

            scanf("%d", &a[i]);

index=0;

    for(i=1;i<n;i++){

    if(a[index]<=a[i])

index=i;

    }

temp=a[index];

a[index]=a[n-1];

a[n-1]=temp;

printf("max = %d, index = %d\n", a[n-1],index);

    for(i = 0; i < n; i++)

            printf("%d ", a[i]);

    printf("\n");

    }

}

 

70052    统计字符出现次数

输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:

输入一个以回车符结束的字符串(少于80个字符),再输入一个字符,统计并输出该字符在字符串中出现的次数。

输入输出示例:括号内为说明

输入:

2 (repeat=2)

programming (字符串"programming")

m               (字符'm')

1234 (字符串"1234")

a (字符'a')

输出:

count = 2 ('m'在"programming"中出现2次)

count = 0 ('a'在"1234"中没有出现过)

#include "stdio.h"

#define MAXLEN 80

int main(void)

{

    char cc, ch;

    char str[MAXLEN];

    int i,count;

    int repeat, ri;

    scanf("%d", &repeat);

    getchar();

    for(ri = 1; ri <= repeat; ri++){

        i = 0;

     while((str[i] = getchar( )) != '\n')

            i++;

     str[i] = '\0';

cc = getchar();

getchar();

count=0;

for(i=0;str[i] != 0;i++){

if(str[i]==cc) count++;

}

       printf("count = %d\n", count);

   }

}

80011    循环移动

输入两个正整数 n 和 m (1<m<n<=10),再输入 n 个整数,将这些数排成一行,向右循环移动 m 个位置(从右边移出的数再从左边移入),最后输出移动后的n个整数。

要求定义并调用函数 mov(x,n,m) 实现上述循环移动的功能,函数形参x的类型是整型指针,形参n和m的类型是int,函数的类型是void。

输入输出示例:括号内为说明

输入:

5 3            (n=5,m=3)

1 2 3 4 5      (5个整数)

输出:

After move: 3 4 5 1 2

#include <stdio.h>

void mov(int *x, int n, int m);

int main(void)

{

    int i, m, n;

    int a[80];

    scanf("%d%d", &n, &m);

    for(i = 0; i < n; i++)

        scanf("%d", &a[i]);

void mov(int *x,int n,int m);

mov(a,n,m);

    printf("After move: ");

    for(i = 0; i < n; i++)

         printf("%d ", a[i]);

    printf("\n");

}

void mov(int a[], int n, int m)

{

   int y,i,j;

   for(i=1;i<=m;i++){  /* 循环移动m次 */

      y=a[n-1];

    for(j=n-1;j>0;j--)

      a[j]=a[j-1];

    a[0]=y;

   }

}

80012    在数组中查找指定元素

输入一个正整数repeat (0<repeat<10),做repeat次下列运算:

输入一个正整数 n (1<n<=10),然后输入n个整数存入数组a中,再输入一个整数x,在数组a中查找x,如果找到则输出相应元素的最小下标,否则输出"Not found"。

要求定义并调用函数search(list, n, x),它的功能是在数组list中查找元素x,若找到则返回相应元素的最小下标,否则返回-1,函数形参 list 的类型是整型指针,形参n和x的类型是int。

输入输出示例:括号内为说明

输入

2              (repeat=2)

3              (n=3)

1 2 -6

2              (x=2)

5              (n=5)

1 2 2 5 4

0              (x=0)

输出

index = 1

Not found

#include <stdio.h>

int main(void)

{

    int i, index, n, res, x;

    int repeat, ri;

    int a[10];

    int search(int list[], int n, int x);

    scanf("%d", &repeat);

    for(ri = 1; ri <= repeat; ri++){

        scanf("%d", &n);

        for(i = 0; i < n; i++)

            scanf("%d", &a[i]);

        scanf("%d", &x);

int search(int *list,int n,int x);

res=search(a,n,x);

        if(res != -1)

            printf("index = %d\n", res);

        else

            printf("Not found\n");

    }

}

int search(int *list,int n,int x){

int i,t;

for(i=0;i<n;i++){

if(list[i]==x){

t=i;

break;

}

else

t=-1;

}

return t;

}

80013    使用函数的选择法排序

输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:

输入一个正整数 n (1<n<=10),再输入 n 个整数存入数组 a 中,用选择法将数组 a 中的元素按升序排列,最后输出排序后的数组元素。

要求定义并调用函数 sort(a,n),它的功能是采用选择排序算法,将数组 a 的前 n 个元素按从小到大的顺序排序,函数形参 a 的类型是整型指针,形参n的类型是int,函数的类型是void。

输入输出示例:括号内为说明

输入

3           (repeat=3)

4           (n=4)

5 1 7 6

3           (n=3)

1 2 3

5           (n=5)

5 4 3 2 1

输出

After sorted: 1 5 6 7  

After sorted: 1 2 3

After sorted: 1 2 3 4 5

#include <stdio.h>

void sort(int a[],int n);

int main(void)

{

    int i, n;

    int repeat, ri;

    int a[10];

void sort(int *p,int n);

    scanf("%d", &repeat);

    for(ri = 1; ri <= repeat; ri++){

        scanf("%d", &n);

        for(i = 0; i < n; i++)

            scanf("%d", &a[i]);

sort(a,n);

        printf("After sorted: ");

        for(i = 0; i < n; i++)

            printf("%d ", a[i]);

        printf("\n");

    }

}

void sort(int *p,int n)

{

int k,i,index,t;

for(k=0;k<n-1;k++){

index=k;

for(i=k+1;i<n;i++)

if(p[i]<p[index])

index=i;

t=p[index];

p[index]=p[k];

p[k]=t;

}

}

80014    报数

输入两个正整数 n 和 m( (1<m<n<=50)),有 n 个人围成一圈,按顺序从 1 到 n 编号。从第一个人开始报数,报数 m 的人退出圈子,下一个人从 1 开始重新报数,报数 m 的人退出圈子。如此循环,直到留下最后一个人。请按退出顺序输出退出圈子的人的编号,以及最后一个人的编号。

提示:将每个人的编号存入数组,从第一个人开始报数,输出报数 m 的人的编号,并将该编号清除为0,重复这样的操作直至只剩下一个不为0的数,该数就是最后一个人的编号。

输出使用语句:printf("No%d: %d\n", no, *p);

输入输出示例:括号内为说明

输入:

5               (n个人报数,n=5)

3               (报数m=3)

输出:

No1: 3          (第1个退出圈子的人编号是3)

No2: 1         (第2个退出圈子的人编号是1)

No3: 5         (第3个退出圈子的人编号是5)

No4: 2         (第4个退出圈子的人编号是2)

Last No is: 4   (最后一个人的编号是4)

/* 提示:这是一个不断循环的过程;

终止条件:报数总个数为n-1;  

         报数过程中,嵌套一个循环:每次计数到m,退出当前小循环

在循环时,注意若当前的数组下标 k==n时,k=0

*/

#include<stdio.h>

main()

{

int m, n;

int i, k=0;   /* 下标*/

int totalNumber=0;  /* 报数总个数 */

int count=0; /* 当前轮报数个数 */

int num[50];

scanf("%d%d", &n, &m);

for(i = 0; i < n; i++)

num[i] = i + 1;

while (1)

{

  if (totalNumber == n-1) break;

  while (count<m)  {

   if (num[k])   {

   count++;

   if (totalNumber == n-1)  break;

   else if (count==m)  {

   printf("No%d: %d\n", ++totalNumber, num[k]);

   break;

   }

   

   }

k++;

if (k == n) k=0 ;

  }

   num[k]=0;     count=0;  /* 当前轮报数个数从新计数 */  

   k++;

   if (k == n) k=0 ;

  

}

while (!num[k]) {

k++;

  if (k == n) k=0 ;

}

printf("Last No is: %d\n", num[k]);

return 0;

}

参考2:

#include<stdio.h>

int main(void)

{

    int count, i, m, n, no;

    int num[50];

    int *p;

    scanf("%d%d", &n, &m);

    for(i = 0; i < n; i++)

        num[i] = i + 1;

    p = num;

int k;

no=i=k=0;

 while(no<n-1) {

   if(*(p+i)!=0)

   k++;

   if(k==m){

 printf("No%d: %d\n",no+1,*(p+i));

     *(p+i)=0;

  k=0;  

    no++;  

       }  

   i++;

      if(i==n)

         i=0;

     }

    p = num;

    while(*p == 0)

        p++;

    printf("Last No is: %d\n", *p);

}

80021    找最大的字符串

输入5个字符串,输出其中最大的字符串。

输入输出示例:括号内为说明

输入:

peach

pear

melon

orange

berry

输出:

Max is: pear

#include <stdio.h>

#include <string.h>

int main(void)

{

    char str[80], max[80];

    int i;

    scanf("%s", str);

strcpy(max,str);

for(i=1;i<5;i++){

scanf("%s",str);

if(strcmp(str,max)>0)

strcpy(max,str);

}

    printf("Max is: %s\n", max);

}   

80022    找最长字符串

输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:

输入一个正整数 n (1<n<=10),然后输入 n 个字符串,输出其中最长的字符串,如果字符串的长度相同,则输出先输入的字符串。

输入输出示例:括号内为说明

输入:

3              (repeat=3)

5               (n=5)

melon peach pear strawberry orange

3               (n=3)

pear berry orange

4               (n=4)

melon peach pear apple

输出:

The longest is: strawberry

The longest is: orange

The longest is: melon

#include <stdio.h>

#include <string.h>

int main(void)

{

    char sx[80], longest[80];

    int i, n;

    int repeat, ri;

    scanf("%d", &repeat);

    for(ri = 1; ri <= repeat; ri++){

        scanf("%d", &n);

        scanf("%s", sx);

strcpy(longest,sx);

for(i=1;i<n;i++){

scanf("%s",sx);

if(strlen(sx)>strlen(longest))

strcpy(longest,sx);

}

printf("The longest is: %s\n",longest);

}

}   

80023    使用函数删除字符串中的字符

输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:

输入一个字符串 str,再输入一个字符 c,将字符串 str 中出现的所有字符 c 删除。

要求定义并调用函数delchar(str,c), 它的功能是将字符串 str 中出现的所有 c 字符删除,函数形参str的类型是字符指针,形参c的类型是char,函数类型是void。

输入输出示例:括号内为说明

输入

3               (repeat=3)

happy new year  (字符串"happy new year")

a               (待删除的字符'a')

bee             (字符串"bee")

e               (待删除的字符'e')

111211          (字符串"111211")

1               (待删除的字符'1')

输出

result: hppy new yer    (字符串"happy new year"中的字符'a'都被删除)

result: b               (字符串"bee"中的字符'e'都被删除)

result: 2               (字符串"111211"中的字符'1'都被删除)

#include<stdio.h>

void main()

{

    char c;

    char str[80];

    int repeat, ri;

    void delchar(char *str, char c);

    scanf("%d", &repeat);

    getchar();

    for(ri = 1; ri <= repeat; ri++){

        gets(str);

        scanf("%c", &c);

        getchar();

delchar(str,c);

        printf("result: ");

        puts(str);

    }

}

void delchar(char *str, char c)

{

 int i,j;

 i = 0, j=0;

 while (str[i]!='\0')

 {

 if (str[i] != c)  /* 若当前字符是要被保留的 */

 {

str[j]=str[i];

i++; j++;

 }

 else  i++;  /* 否则查看下一个元素 */

 }

 str[j]='\0';

}

80024    使用函数实现字符串复制

输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:

输入一个字符串 t 和一个正整数 m,将字符串 t 中从第 m 个字符开始的全部字符复制到字符串 s 中,再输出字符串 s。

要求定义并调用函数 strmcpy(s,t,m), 它的功能是将字符串 t 中从第 m 个字符开始的全部字符复制到字符串 s 中,函数形参s和t的类型是字符指针,形参m的类型是int,函数类型是void。

输入输出示例:括号内为说明

输入:

3              (repeat=3)

happy new year

7

happy

1

new

4

输出:

new year        (从"happy new year"第7个字符开始组成的新字符串为"new year")

happy           (从"happy"第1个字符开始组成的新字符串为"happy")

error input     ("new"的长度小于4)

#include<stdio.h>

#include<string.h>

void main()

{

    char s[80], t[80];

    int m;

    int repeat, ri;

    void strmcpy(char *s,char *t, int m);

    scanf("%d", &repeat);

    getchar();

    for(ri = 1; ri <= repeat; ri++){

        gets(t);

        scanf("%d", &m);

        getchar();

        if(strlen(t)<m)

            printf("error input");

        else{

strmcpy(s,t,m);

            puts(s);

        }

    }

}

void strmcpy(char s[],char t[],int m)

{

 int i,j;

 for(i=m-1,j=0;t[i]!='\0';i++,j++)

  s[j]=t[i];

  s[j]='\0';

}

80025    判断回文字符串

输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:

输入一个字符串(长度不超过80),判断该字符串是否为“回文”。“回文”是指顺读和倒读都一样的字符串,如“XYZYX”和“xyzzyx”。

要求定义并调用函数 mirror(p)判断字符串 p 是否为“回文”,如果 p 是回文字符串,返回1,否则,返回0,函数形参 p 的类型是字符指针,函数类型是 int。

输入输出示例:括号内为说明

输入:

2   (repeat=2)

abcddcba

abcddcb

输出:

YES

NO

#include <stdio.h>

#include<string.h>

void main()

{

    char s[80];

    int repeat, ri;

    int mirror(char *p);

 

    scanf("%d", &repeat);

    getchar();

    for(ri = 1; ri <= repeat; ri++){

        gets(s);

        if(mirror(s) != 0)

           printf("YES\n");

        else

            printf("NO\n");

    }

}

int mirror(char *p)

 {

  int n,i;

  n=strlen(p);

  for(i=0;i<=n/2;i++,n--)

   if (p[i]== p[n-1])   

      return 1;

   return 0;

 }

80026    分类统计字符个数

输入一行字符(不超过80个),统计其中的大写字母、小写字母、空格、数字以及其他字符的个数。

输入输出示例:

输入:

bFaE3+8 =1R

输出:

upper: 3 lower: 2 blank: 1 digit: 3 other: 2

#include<stdio.h>

void main()

{

    char s[80];

    char *p;

    int blank, digit, lower, other, upper;

    gets(s);

    upper = lower = blank = digit = other = 0;

int i;

for(i=0;s[i]!='\0';i++){

if(s[i]>='A'&&s[i]<='Z')

upper++;

else if(s[i]>='a'&&s[i]<='z')

lower++;

else if(s[i]==' ')

blank++;

else if(s[i]>='0'&&s[i]<='9')

digit++;

else

other++;

}

printf("upper: %d lower: %d blank: %d digit: %d other: %d\n", upper, lower, blank, digit, other);

}

90001    调试示例error09_1.cpp(结构)

输入一个正整数n(3≤n≤10),再输入n个雇员的信息,包括姓名、基本工资、浮动工资和支出,输出每人的姓名和实发工资,实发工资=基本工资+浮动工资-支出。

输入输出示例:括号内为说明

输入:

3 (n=3)

zhao 240 400 75

qian 360 120 50

zhou 560 0 80

输出:

 zhao 实发工资: 565.00

 qian 实发工资: 430.00

 zhou 实发工资: 480.00

#include <stdio.h>

int main (void)

{

    int i, n;

      struct emp{

        char  name[10];

        double jbg;

        double fdg;

        double zc;

    } s[10];

    scanf("%d", &n);

for(i=0;i<n;i++)

scanf("%s%lf%lf%lf",s[i].name, &s[i].jbg,&s[i].fdg,&s[i].zc);

    for (i = 0; i < n; i++)

        printf ("%5s 实发工资:%7.2f\n", s[i].name, s[i].jbg + s[i].fdg - s[i].zc);

}

90002    时间换算(结构)

输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:

输入一个时间数值,再输入秒数 n,输出该时间再过 n 秒后的时间值,时间的表示形式为时:分:秒,超过 24 时从 0 时重新开始计时。

输入输出示例:括号内为说明

输入:

3    (repeat=3)

0:0:1

59    (秒数n=59)

11:59:40   

30    (秒数n=30)

23:59:40   

301    (秒数n=301)

输出:

time: 0:1:0    (0:0:01加上59秒的新时间)   

time: 12:0:10    (11:59:40加上30秒的新时间)

time: 0:4:41    (23:59:40加上301秒的新时间)

#include <stdio.h>

int main(void)

{

    int n;

    int repeat, ri;

    struct time{

        int hour, minute, second;

    }time;

    scanf("%d", &repeat);

    for(ri = 1; ri <= repeat; ri++){

        scanf("%d:%d:%d", &time.hour, &time.minute, &time.second);

        scanf("%d",&n);

time.second=time.second+n;

if(time.second>=60){

time.minute=time.minute+time.second/60;

time.second=time.second%60;

if(time.minute>=60){

time.hour=time.hour+time.minute/60;

time.minute=time.minute%60;

if(time.hour>=24)

time.hour=time.hour-24;

}

}

        printf("time: %d:%d:%d\n", time.hour, time.minute, time.second);

   }

}

90003    计算平均成绩(结构)

输入整数n(n<10),再输入n个学生的基本信息,包括序号、姓名和成绩,要求计算并输出他们的平均成绩(保留2位小数)。

输入输出示例:括号内为说明

输入:

3 (n=3)

1  zhang  70

2  wang  80

3  qian  90

输出:

average: 80.00

#include <stdio.h>

int main(void)

{

    int i, n;

    double average, sum;

    struct student{

        int num;

        char name[10];

        int score;

    }s[10];

    scanf("%d", &n);

sum=0;

for(i=0;i<n;i++){

scanf("%d%s%d",&s[i].num,s[i].name,&s[i].score);

sum+=s[i].score;

}

average=sum/n;

    printf("average: %.2f\n", average);

}

90004    计算两个复数之积(结构)

输入4个整数a1,b1,a2,b2,分别表示两个复数的实部与虚部,求两个复数之积(a1+b1i)*(a2+b2i),乘积的实部为:a1*a2-b1*b2,虚部为:a1*b2+a2*b1。

输入输出示例:括号内为说明

输入:

3 4 5 6

输出:

(3+4i) * (5+6i) = -9 + 38i

#include <stdio.h>

int main(void)

{

    struct complex{

        int real;

        int imag;

    }product, x, y;

    scanf("%d%d%d%d", &x.real, &x.imag, &y.real, &y.imag);

product.real=x.real*y.real-x.imag*y.imag;

product.imag=x.real*y.imag+x.imag*y.real;

    printf("(%d+%di) * (%d+%di) = %d + %di\n", x.real, x.imag, y.real, y.imag, product.real, product.imag);

}

90005    查找书籍(结构)

编写程序,从键盘输入 n (n<10)本书的名称和定价并存入结构数组中,查找并输出其中定价最高和最低的书的名称和定价。

输入输出示例:括号内为说明

输入:

3 (n=3)

Programming in C

21.5

Programming in VB

18.5

Programming in Delphi

25.0

输出:

highest price: 25.0, Programming in Delphi

lowest price: 18.5, Programming in VB

#include <stdio.h>

int main (void)

{  

    int i, max_index, min_index, n;

    double x;

    struct book{

        char name[50];

        double price;

    }book[10];

    scanf("%d", &n);

    getchar();

    for(i = 0; i < n; i++){

        gets(book[i].name);

        scanf("%lf", &x);

        getchar();

        book[i].price = x;

    }

max_index=1;

min_index=1;

for(i = 1; i < n; i++){

if(book[max_index].price<book[i].price)

max_index=i;

if(book[min_index].price>book[i].price)

min_index=i;

}

    printf("highest price: %.1f, %s\n", book[max_index].price, book[max_index].name);

    printf("lowest price: %.1f, %s\n", book[min_index].price, book[min_index].name);

}

90006    通讯录排序(结构)

输入n(n<10)个朋友的信息,包括姓名、生日、电话号码,按照年龄从大到小的顺序依次输出通讯录。

输入输出示例:括号内为说明

输入:

3 (n=3)

zhang  19850403  13912345678

wang  19821020  0571-88018448

qian  19840619  13609876543

输出:

wang 19821020 0571-88018448

qian 19840619 13609876543

zhang 19850403 13912345678

#include <stdio.h>

#include <stdio.h>

int main (void)

{  

    int i, index, j, n;

    struct address_list{

        char name[20];

        long birthday;

        char phone[20];

    }temp, friends[10];

    scanf("%d", &n);

    for(i = 0; i < n; i++)

        scanf("%s%ld%s", friends[i].name, &friends[i].birthday, friends[i].phone);

for(i = 0; i < n; i++){

index = i;

for(j = i+1; j < n; j++)

if (friends[index].birthday>friends[j].birthday)

index = j;

temp =friends[index];

friends[index]=friends[i];

friends[i]=temp;

}

        for(i = 0; i < n; i++)

            printf("%s %ld %s\n", friends[i].name, friends[i].birthday, friends[i].phone);

}

90007    算算看,这是第几天?(结构)

输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:

编写程序,输入一个日期(年、月、日),计算并输出该日是该年中的第几天。

要求定义并调用函数 day_of_year(p) 计算某日是该年的第几天,函数形参p的类型是结构指针,指向表示日期的结构变量,函数类型是int,注意区分闰年。

输入输出示例:括号内为说明

输入:

2    (repeat=2)

2006  3  5

2000  3  5

输出:

64    (2006年3月5日是该年的第64天)

65    (2000年3月5日是该年的第65天)

#include <stdio.h>

struct date{

    int year;

    int month;

    int day;

};

int day_of_year(struct date *p);

int main(void)

{

    int yearday;

    int repeat, ri;

    struct date date;

    scanf("%d", &repeat);

    for(ri = 1; ri <= repeat; ri++){

        scanf("%d%d%d", &date.year, &date.month, &date.day);

yearday=day_of_year(&date);

        printf("%d\n", yearday);

    }

}

int day_of_year(struct date *p)

{

 int k,leap;

 int tab[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},

{0,31,29,31,30,31,30,31,31,30,31,30,31} };

 leap=(p->year%4==0 && p->year%100!=0) || p->year%400==0;

 for(k=1;k<p->month;k++)

  p->day=p->day+tab[leap][k];

 return p->day;

}

90008    使用函数实现时间换算(结构)

输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:

输入一个时间数值,再输入秒数 n,输出该时间再过 n 秒后的时间值,时间的表示形式为时:分:秒,超过 24 时从 0 时重新开始计时。

要求定义并调用函数 timecal(p, n)实现时间换算,函数形参 p 的类型是结构指针,指向表示时间的结构变量,形参n 的类型是整型,表示秒数,函数类型是 void。

输入输出示例:括号内为说明

输入:

3    (repeat=3)

0:0:1

59    (秒数n=59)

11:59:40   

30    (秒数n=30)

23:59:40   

301    (秒数n=301)

输出:

time: 0:1:0    (0:0:01加上59秒的新时间)   

time: 12:0:10    (11:59:40加上30秒的新时间)

time: 0:4:41    (23:59:40加上301秒的新时间)

#include <stdio.h>

struct time{

    int hour, minute, second;

};

void timecal(struct time *p, int n);

int main(void)

{

    int n;

    int repeat, ri;

    struct time timeA;   

    scanf("%d", &repeat);

    for(ri = 1; ri <= repeat; ri++){

        scanf("%d:%d:%d", &timeA.hour, &timeA.minute, &timeA.second);

        scanf("%d",&n);

timecal(&timeA,n);

        printf("time: %d:%d:%d\n", timeA.hour, timeA.minute, timeA.second);

    }

}

void timecal(struct time *p, int n)

{                                  

(*p).second=(*p).second+n;

if((*p).second>=60){

(*p).minute=(*p).minute+(*p).second/60;

(*p).second=(*p).second%60;

if((*p).minute>=60){

(*p).hour=(*p).hour+(*p).minute/60;

(*p).minute=(*p).minute%60;

if((*p).hour>=24)

(*p).hour=(*p).hour-24;

}

}

}

90009    找出总分最高的学生(结构)

输入一个正整数 n(3<n≤10),再输入 n 个学生的信息,包括学号、姓名和3门课程的成绩,输出总分最高学生的姓名和总分。

输入输出示例:括号内为说明

输入:

5 (n=5)

1 黄岚 78  83  75

2 王海 76  80  77

3 沈强 87  83  76

4 张枫 92  88  78

5 章盟 76  81  75

输出:

总分最高的学生是: 张枫,258分

#include <stdio.h>

int main (void)

{  

    int i, j, k, max_index, n;

    struct student{

        int number;

        char name[20];

        int score[3];

        int sum;

    }stu[10];

    scanf("%d", &n);

for(i=0;i<n;i++){

scanf("%d%s",&stu[i].number,&stu[i].name);

for(j=0;j<3;j++)

scanf("%d",&stu[i].score[j]);

stu[i].sum=stu[i].score[0]+stu[i].score[1]+stu[i].score[2];

}

max_index=0;

for(i=1; i<n; i++){

if(stu[max_index].sum<stu[i].sum)

max_index=i;

}

    printf("总分最高的学生是: %s,%d分\n", stu[max_index].name, stu[max_index].sum);

}

10012    函数程序设计

编写一个函数,利用参数传入一个3位数number,找出101~number之间所有满足下列两个条件的数:

它是完全平方数,又有两位数字相同,如144、676等,函数返回找出这样的数据的个数。请同时编写主函数。

例:(括号内为说明)

输入

3 (repeat=3)

150

500

999

输出

count=2

count=6

count=8

#include <stdio.h>

#include <string.h>

int search(int n);

int main(void)

{

int number,ri,repeat;

scanf("%d",&repeat);

for(ri=1;ri<=repeat;ri++){

do{

scanf("%d",&number);

}while(number<101||number>999);

printf("count=%d\n",search(number));

}

return 0;

}

int search(int n)

{

int i,j,a1,a2,a3, flag=0;

for (i = 101; i <= n; i++)

{

for (j = 1; j <= i; j++)

{

if (j * j == i)

{

a1 = i % 10;

a2 = i / 10 % 10;

a3 = i /100 % 10;

if ( (a1==a2)||(a1==a3) || (a2==a3) )

{

flag += 1;

break;

}

}

}

}

return flag;

}

10014    计算函数P(n,x) (函数递归)

输入一个正整数repeat (0<repeat<10),做repeat次下列运算:

输入一个整数n (n>=0)和一个双精度浮点数x,输出函数p(n,x)的值(保留2位小数)。

                [1                                    (n=0)

      p(n, x) = [x                                    (n=1)

                [((2*n-1)*p(n-1,x)-(n-1)*p(n-2,x))/n   (n>1)

例:括号内是说明

输入

3   (repeat=3)

0 0.9 (n=0,x=0.9)

1 -9.8 (n=1,x=-9.8)

10 1.7 (n=10,x=1.7)

输出

p(0, 0.90)=1.00

p(1, -9.80)=-9.80

p(10, 1.70)=3.05

#include <stdio.h>

double p(int n, double x);

int main(void)

{

   int repeat, ri;

   int n;

   double x, result;

   scanf("%d", &repeat);

   for(ri = 1; ri <= repeat; ri++)

   {

       scanf("%d%lf", &n, &x);

       result = p(n, x);

       printf("p(%d, %.2lf)=%.2lf\n", n, x, result);

   }

}

double p(int n, double x)

{

double t;

if(n==0)  t=1;

else if(n==1) 

t=x;

else 

t=((2*n-1)*p(n-1,x)-(n-1)*p(n-2,x))/n;

return t;

}

 

10015    计算函数Ack(m,n) (函数递归)

程序填空,不要改变与输入输出有关的语句。

输入一个正整数repeat (0<repeat<10),做repeat次下列运算:

输入两个整数m和n(m>=0且n>=0),输出函数Ack(m,n)的值。

在m>=0和n>=0时Ack(m, n)定义为:

 Ack(0,n) = n+1

 Ack(m,0) = Ack(m-1,1)

 Ack(m,n) = Ack(m-1, Ack(m,n-1))  m>0且n>0

例:括号内是说明

输入

4   (repeat=4)

0 3

2 0

2 3

0 0

输出

Ackerman(0,3)=4

Ackerman(2,0)=3

Ackerman(2,3)=9

Ackerman(0,0)=1

#include <stdio.h>

int Ack(int m, int n);

int main(void)

{

   int m,n;

   int result;

   int i,repeat;

   scanf("%d",&repeat);

   for(i=1; i<=repeat; i++)

   {

       scanf("%d%d", &m, &n);

   

       result = Ack(m,n);

       printf("Ackerman(%d,%d)=%d\n", m, n, result);

   }

}

/*---------*/

int Ack(int m,int n)

{

if (m==0) return(n+1);

   else if (n==0) return( Ack(m-1,1) );

else return( Ack(m-1, Ack(m,n-1)) ) ;

}

10016    十进制转换二进制

输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:

输入1 个正整数n,将其转换为二进制后输出。要求定义并调用函数 dectobin(n),它的功能是输出 n 的二进制。

例如,调用dectobin(10),输出1010。

输出语句:printf("%d");

例:括号内是说明

输入:

3    (repeat=3)

15

100

0

输出:

1111

1100100

0

#include "stdio.h"

int main(void)

{

  int ri,repeat;

  int n;

  void dectobin(int n);

  scanf("%d",&repeat);

  for(ri=1;ri<=repeat;ri++){

    scanf("%d",&n);

    dectobin(n);

    printf("\n");

  }

}

void dectobin(int n)

{

int a[32],i;

if (( n==0)||(n == 1)) {

printf("%d",n);

return;

}

else {

i=0;

while(n!=0)

{

a[i++]=n%2;

n=n/2;

}

}

while(i>0)

printf("%d",a[--i]);

}

/* 参考2: 如下通过递归实现 */

#include "stdio.h"

int main(void)

{

  int ri,repeat;

  int i,n;

  void dectobin(int n);

  scanf("%d",&repeat);

  for(ri=1;ri<=repeat;ri++){

    scanf("%d",&n);

    dectobin(n);

    printf("\n");

  }

}

void dectobin(int n)

{

if(n==1||n==0){

printf("%d",n);

return;

}

dectobin(n/2);

printf("%d",n%2);

}

10017    递归函数程序设计求Fabonacci数列

输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:

用递归方法编写求Fabonacci数列项的函数,返回值为长整型, 并写出相应的主函数。Fabonacci数列的定义为:

   f(n)=f(n-2)+f(n-1)  (n>=2)   其中 f(0)=0,f(1)=1。

例:(括号内为说明)

输入

3 (repeat=3)

0

1

6

输出

fib(0)=0

fib(1)=1

fib(6)=8

#include <stdio.h>

long fib(int n);

int main(void)

{

int n,ri,repeat;

scanf("%d",&repeat);

for(ri=1;ri<=repeat;ri++){

scanf("%d",&n);

printf("fib(%d)=%ld\n",n,fib(n));

}

}

long fib(int n)

{

int t;

if(n==0)  t=0;

else if(n==1)  t=1;

else t=fib(n-2)+fib(n-1);

return t;

}

10018    递归函数程序设计整数的逆序输出

程序填空,不要改变与输入输出有关的语句。

用递归方法实现对一个整数进行逆序输出。

例:(括号内为说明)

输入

3 (repeat=3)

567

911

8

输出

765

119

8

#include <stdio.h>

void reverse(int n);

int main(void)

{

int n,ri,repeat;

scanf("%d",&repeat);

for(ri=1;ri<=repeat;ri++){

scanf("%d",&n);

reverse(n);

printf("\n");

}

}

void reverse(int n) /* 递归实现 */

{

printf("%d", n%10);

n = n/10;

if (n!=0) reverse(n);

return;  

}

10019    改错题error10_1.cpp(函数递归)

用递归函数计算x^n (n>=1)的值。

例:(括号内为说明)

输入

2 3 (x=2,n=3)

输出

Root = 8.00

#include <stdio.h>

double fun(int n, double x);

int main(void)

{

int n;

double x, root;

    scanf("%lf%d", &x,&n);

   root = fun(n, x);

  printf("Root = %0.2f\n", root);

}

double fun(int n, double x)

{

double r;

if(n==1)  r=x;

else   r=x*fun(n-1,x);

return r;

}

10021    调试示例error11_1.cpp (指针数组、内存动态分配)  

程序填空,不要改变与输入输出有关的语句。

输入若干有关颜色的英文单词,以#作为输入结束标志,对这些单词升序排列后输出。其中颜色的英文单词数数小于20个,颜色的英文单词长度均不超过10个字符。

输入输出示例:括号内为说明

输入:

red

blue

yellow

green

purple

#

输出:

blue  green  purple  red  yellow  

#include <stdio.h>

#include<stdlib.h>

#include<string.h>

void main()

{

    int i,j, index, n = 0;

    char *color[20], str[10], *temp;

   

    scanf("%s", str);

    while(str[0] != '#') {

        color[n] = (char *)malloc(sizeof(char)*(strlen(str)+1));  

        strcpy(color[n], str);

    n++;

        scanf("%s", str);

    }

/*---------*/   

for (i =0; i<n-1; i++) {

index = i;

for (j = i+1; j<n; j++)

if (strcmp(color[j],color[index]) < 0) index = j;

strcpy(str, color[i]);

strcpy(color[i], color[index]);

strcpy(color[index], str);

}

    for(i = 0; i < n; i++)

        printf("%s  ", color[i]);

    printf("\n");

}

10022    编程题(指针数组)

输入一个正整数repeat (0<repeat<10),做repeat次下列运算:

编写程序,输入一个月份,输出对应的英文名称,要求用指针数组表示12个月的英文名称。

若输入月份错误,输出提示信息。

输入输出示例:括号内为说明

输入:

3 (repeat=3)

5

9

14

输出:

May

September

Wrong input!

#include<stdio.h>

void main()

{

int ri,repeat;

int month;

char *month_name[]={"","January","February","March","April","May","June","July","August","September","October","November","December"};

scanf("%d",&repeat);

for(ri=1;ri<=repeat;ri++){

scanf("%d",&month);

if((month>=1)&&(month<=12))

puts(month_name[month]);

else

printf("Wrong input!");

}

}

10023    编程题 (指针数组,查找相同的字符串)

程序填空,不要改变与输入输出有关的语句。

输入一个正整数repeat (0<repeat<10),做repeat次下列运算:

定义一个指针数组将下表的星期信息组织起来,输入一个字符串,在表中查找,若存在,输出该字符串在表中的序号,否则输出-1。

(表格详见实验教材P99)

输入输出示例:括号内为说明

输入:

3 (repeat=3)

Tuesday

Wednesday

year

输出:

3

4

-1

#include<stdio.h>

#include<string.h>

void main()

{

int i,ri,repeat,dateNum;

char *date[]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};

char str[80];

scanf("%d",&repeat);

getchar();

for(ri=1;ri<=repeat;ri ++){

scanf("%s",str);

/*---------*/

dateNum=sizeof(date)/sizeof(char *);

for (i = 0; i<dateNum; i++){

if (strcmp(date[i],str) == 0) {

printf("%d\n",i+1); break;

}

}

if (i==dateNum) printf("%d\n",-1);

}

}

10024    计算最长的字符串长度

编写一个函数int max_len(char *s[ ],  int n),用于计算有n(n<10)个元素的指针数组s中最长的字符串的长度,并编写主程序验证。

例:(括号内为说明)

输入

4 (n=4)

blue

yellow

red

green

输出

length=6

#include <stdio.h>

#include <string.h>

int max_len(char *s[],int n);

void main()

{

 int i,n;

 char s[10][80],*p[10];

 scanf("%d",&n);

 for(i=0;i<n;i++){

  scanf("%s",s[i]);

  p[i]=s[i];

 }

 printf("length=%d\n",max_len(p,n));

}

int max_len(char *s[],int n)

{

 int max,i;

 max=strlen(s[0]);

 for(i=1;i<n;i++)

if(max<strlen(s[i]))   

max=strlen(s[i]);

  return max;

}

10025    字符串的连接

用字符指针实现函数str_cat(s,t),将字符串t复制到字符串s的末端,并且返回字符串s的首地址,并编写主程序。

例:(括号内为说明)

输入

abc

def

输出

abcdef

#include <stdio.h>

char *str_cat(char *s,char *t);

void main()

{

char s[80],t[80];

gets(s);

gets(t);

puts(str_cat(s,t));

}

char *str_cat(char *s,char *t)

{

int i=0,j=0;

while (s[i]!='\0') i++;

while (t[j]!='\0')

{

 s[i] =t[j];

 i++, j++;

}

s[i]='\0';

return s;

}

10026    指定位置输出字符串

编写一个程序,输入一个字符串后再输入2个字符,输出此字符串中从与第一个字符匹配的位置开始到与第二个字符匹配的位置之间的所有字符。用返回字符指针的函数实现。

例:(括号内为说明)

输入

program

r

g

输出

rog

#include <stdio.h>

char newstr[80];

void main()

{

char str[80],c_begin,c_end;

char *fun(char *p,char c_begin,char c_end);

scanf("%s",str);

getchar();

c_begin=getchar();

getchar();

c_end=getchar();

puts(fun(str,c_begin,c_end));

}

char *fun(char *p, char c_begin, char c_end)

{

    char *t;

t=newstr;

while(*(p++)!=c_begin);

p--;

while(*p!=c_end)

*(t++)=*(p++);

*(t++)=*(p++);

*t='\0';

    return newstr;

}

10027    藏尾诗(二维字符数组)

编写一个解密藏尾诗的程序。输入一首藏尾诗(假设只有4句),输出其藏尾的真实含义。用返回字符指针的函数实现。

例:

输入:

悠悠田园风

然而心难平

兰花轻涌浪

兰香愈幽静

输出:

风平浪静

#include <stdio.h>

#include <string.h>

char p[16];

void  main()

{

char *change(char s[4][20]);

char s[4][20];

int i;

for(i=0;i<4;i++)

scanf("%s",s[i]);

puts(change(s));

}

char *change(char s[4][20])

{

int i,t,len;

t=0;

        for(i=0;i<4;i++){

           len=strlen(s[i]);

          p[t++]=s[i][len-2];

          p[t++]=s[i][len-1];

      }

    p[t]='\0';

/*---------*/

return (p);

}

10028    改错题error11_2.cpp (矩阵操作)

从键盘上输入一个3×3的矩阵,求矩阵的主对角线和副对角线之和,要求定义和调用函数float matrix(float *a[3], int n),

提示,函数的形参是指针数组。

例:

输入:

8   6  12

5   9  10

7  11   5

输出:

sum=41.00

#include <stdio.h>

float matrix(float *a[3], int n){

int i,j;

float sum;

sum=0;

for(i = 0; i < n; i++)

for(j = 0; j < n; j++){

if(i==j)

sum=sum+*(*(a+i)+j);

if(i+j==(n-1) && i!=j )

sum=sum+*(*(a+i)+ n- 1-i);

}

return sum;

}

void main()

{

int i,j;

float a[3][3],*p[3];

   for(i = 0; i < 3; i++)

for(j = 0; j < 3; j++){

scanf("%f",&a[i][j]);

p[i]=a[i];

}

  printf("sum=%0.2f \n", matrix(p,3));

}

10031    调试示例error11_3.cpp(用单向链表组织学生信息)

程序填空,不要改变与输入输出有关的语句。

输入若干个学生的信息(学号、姓名、成绩),当输入学号为0时结束,用单向链表组织这些学生信息后,再按顺序输出。

输入输出示例:括号内为说明

输入:

1 zhang 78

2 wang 80

3 li 75

4 zhao 85

0

输出:

1 zhang 78

2 wang 80

3 li 75

4 zhao 85

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

struct stud_node{

     int    num;

     char  name[20];

     int    score;

     struct stud_node *next;

};

void main()

{

struct stud_node *head,*tail, *p;

int num, score;

char name[20];

int size = sizeof(struct stud_node);

head=tail=NULL;

scanf("%d", &num);

   while(num != 0){

/*---------*/

p=(struct stud_node *)malloc(size);

scanf("%s%d",name,&score);

p->num = num;

strcpy(p->name, name);

p->score = score;

p->next=NULL;

if (head==NULL) head = p;

else tail->next = p;

tail = p;

scanf("%d", &num);

}

for(p=head; p!=NULL; p=p->next)  

printf("%d %s %d\n", p->num,p->name,p->score);

}

10032    编程题(单向链表)

程序填空,不要改变与输入输出有关的语句。

输入若干个学生信息(包括学号、姓名和成绩),输入学号为0时输入结束,建立一个单向链表,再输入一个成绩值,将成绩大于等于该值的学生信息输出。

提示:

定义函数struct stud_node *Creat_Stu_Doc()完成创建链表

定义函数struct stud_node *DeleteDoc(struct stud_node *head,int min_score)将分数低于min_score的结点删除

定义函数void Ptrint_Stu_Doc(struct stud_node *head)打印链表

输入输出示例:括号内为说明

输入:

1 zhang 78

2 wang 80

3 li 75

4 zhao 85

0

80

输出:

2 wang 80

4 zhao 85

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

struct stud_node{

int num;

char name[20];

int score;

struct stud_node *next;

};

struct stud_node *Creat_Stu_Doc();

struct stud_node *DeleteDoc(struct stud_node *head,int min_score);

void Ptrint_Stu_Doc(struct stud_node *head);

void main()

{

struct stud_node *head;

int min_score;

head=Creat_Stu_Doc();

scanf("%d",&min_score);

head=DeleteDoc(head,min_score);

Ptrint_Stu_Doc(head);

}

struct stud_node *Creat_Stu_Doc()

{

int num, score;

char name[20];

int size = sizeof(struct stud_node);

struct stud_node *head, *tail, *p;

head = tail = NULL;

scanf("%d",&num);

while (num!=0) {

p = (struct stud_node *) malloc(size);

scanf("%s%d",name,&score);

p->num = num;

strcpy(p->name, name);

p->score = score;

p->next = NULL;

if (head == NULL) head=p;

else tail->next = p;

tail = p;

scanf("%d",&num);

}

return head;

}

struct stud_node *DeleteDoc(struct stud_node *head,int min_score)

{

struct stud_node *p1, *p2, *p3;

p3 = head;

for (p1 = head; p1!=NULL; p1=p2) {

p2 = p1->next;

if (p1->score < min_score) {

if (p1 != head)

p3->next=p2;

else

head = p3 = p2;

free(p1);

}

else

p3=p1;

}

return head;

}

void Ptrint_Stu_Doc(struct stud_node *head)

{

struct stud_node *p1;

for (p1 = head; p1!=NULL; p1=p1->next) {

printf("%d %s %d\n",p1->num,p1->name, p1->score);

}

}

10033    编程题(按数据的逆序建立一个链表并输出)

程序填空,不要改变与输入输出有关的语句。

输入若干个正整数(输入-1为结束标志),要求按输入数据的逆序建立一个链表并输出。

提示:

定义函数struct stud_node *Creat_Stu_Doc()完成按输入数据的逆序创建链表。

输入输出示例:括号内为说明

输入:

1 2 3 4 5 6 7 -1

输出:

7 6 5 4 3 2 1

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

struct stud_node{

int num;

struct stud_node *next;

struct stud_node *left;

};

struct stud_node *Creat_Stu_Doc();

void Ptrint_Stu_Doc(struct stud_node *head);

void main()

{

struct stud_node *head;

head=Creat_Stu_Doc();

Ptrint_Stu_Doc(head);

}

/*---------*/

struct stud_node *Creat_Stu_Doc()

{

int num;

int size = sizeof(struct stud_node);

struct stud_node *head, *tail, *p;

head = tail = NULL;

scanf("%d",&num);

while (num>=0) {

p = (struct stud_node *) malloc(size);

p->num = num;

p->left = p->next = NULL;

if (head == NULL) head=p;

else {

tail->next = p;

p->left = tail;

}

tail = p;

scanf("%d",&num);

}

return head;

}

void Ptrint_Stu_Doc(struct stud_node *head)

{

struct stud_node *ptr;

if(head==NULL){

printf("No Records\n");

return;

}

for(ptr=head;ptr->next;ptr=ptr->next);

for(ptr;ptr;ptr=ptr->left)

printf("%d ",ptr->num);

printf("\n");

}

10034    编程题(单向链表操作)

程序填空,不要改变与输入输出有关的语句。

输入若干个正整数(输入-1为结束标志),并建立一个单向链表,将其中的偶数值结点删除后输出。

定义函数struct stud_node *DeleteDoc(struct stud_node *head)删除链表中偶数值结点。

输入输出示例:括号内为说明

输入:

1 2 3 4 5 6 7 -1

输出:

1 3 5 7

#include<stdio.h>

#include<stdlib.h>

struct stud_node{

int num;

struct stud_node *next;

};

struct stud_node *Creat_Stu_Doc();

struct stud_node *DeleteDoc(struct stud_node *head);

void Ptrint_Stu_Doc(struct stud_node *head);

void main()

{

struct stud_node *head;

head=Creat_Stu_Doc();

head=DeleteDoc(head);

Ptrint_Stu_Doc(head);

}

struct stud_node *Creat_Stu_Doc()

{

struct stud_node *head,*tail,*p;

int num;

int size=sizeof(struct stud_node);

head=tail=NULL;

scanf("%d",&num);

while(num!=-1){

p=(struct stud_node *)malloc(size);

p->num=num;

p->next=NULL;

if(head==NULL)

head=p;

else

tail->next=p;

tail=p;

scanf("%d",&num);

}

return head;

}

void Ptrint_Stu_Doc(struct stud_node *head)

{

struct stud_node *ptr;

if(head==NULL){

printf("No Records\n");

return;

}

for(ptr=head;ptr;ptr=ptr->next)

printf("%d ",ptr->num);

printf("\n");

}

/*---------*/

struct stud_node *DeleteDoc(struct stud_node *head)

{

struct stud_node *p1, *p2, *p3;

p3 = head;

for (p1 = head; p1!=NULL; p1=p2) {

p2 = p1->next;

if (p1->num % 2==0) {

if (p1 != head)

p3->next=p2;

else

head = p3 = p2;

free(p1);

}

else

p3=p1;

}

return head;

}

10035    编程题 (单向链表按序合并)  

程序填空,不要改变与输入输出有关的语句。

有2个已按升序排序的单向链表,头指针分别为list1、list2,链表中每一结点的数据域是一个整数。

请编写一个函数,把2个链表拼成1个链表并对新链表升序排列后,返回新链表。编写主程序验证实现。

提示:

定义函数struct stud_node *Creat_Stu_Doc()分别创建两个链表;

定义函数void Ptrint_Stu_Doc(struct stud_node *head)打印链表;

定义函数struct stud_node *InserDoc(struct stud_node *list1,struct stud_node *list2)完成按升序将链表list2的结点依次插入链表list1中。

输入输出示例:

输入:

1 3 5 7 -1

2 4 6 -1

输出:

1 2 3 4 5 6 7

#include<stdio.h>

#include<stdlib.h>

struct stud_node{

int num;

struct stud_node *next;

};

struct stud_node *Creat_Stu_Doc();

void Ptrint_Stu_Doc(struct stud_node *head);

struct stud_node *InserDoc(struct stud_node *list1,struct stud_node *list2);

void main()

{

struct stud_node  *list1,*list2;

list1=Creat_Stu_Doc();

list2=Creat_Stu_Doc();

list1=InserDoc(list1,list2);

Ptrint_Stu_Doc(list1);

}

struct stud_node *Creat_Stu_Doc()

{

struct stud_node *head,*tail,*p;

int num;

int size=sizeof(struct stud_node);

head=tail=NULL;

scanf("%d",&num);

while(num!=-1){

p=(struct stud_node *)malloc(size);

p->num=num;

p->next=NULL;

if(head==NULL)

    head=p;

else

tail->next=p;

tail=p;

scanf("%d",&num);

}

return head;

}

void Ptrint_Stu_Doc(struct stud_node *head)

{

struct stud_node *ptr;

if(head==NULL){

printf("No Records\n");

return;

}

for(ptr=head;ptr;ptr=ptr->next)

printf("%d ",ptr->num);

printf("\n");

}

/*---------*/

struct stud_node * appEndDoc(struct stud_node *head, int num)

{

struct stud_node *tail=NULL,*p;

int size=sizeof(struct stud_node);

p=(struct stud_node *)malloc(size);

p->num=num;

p->next=NULL;

if(head==NULL)

head=p;

else {

for (tail=head; tail->next; tail=tail->next);

tail->next=p;

}

return head;

}

struct stud_node *InserDoc(struct stud_node *list1,struct stud_node *list2)

{

struct stud_node *p1,*p2, *newList=NULL;

p1 = list1; p2=list2;

while (p1 && p2) {

if(p1->num > p2->num ) {

newList = appEndDoc(newList,p2->num);

p2=p2->next;

}

else {

newList = appEndDoc(newList,p1->num);

p1=p1->next;

}

}

while(p1) {

newList = appEndDoc(newList, p1->num);

p1=p1->next;

}

while(p2) {

newList = appEndDoc(newList, p2->num);

p2=p2->next;

}

return newList;

}

10036    编程题 (单向链表)

程序填空,不要改变与输入输出有关的语句。

有一个单向链表,头指针为L,结点的数据域是一个整数,将链表L中奇数值的结点重新组成一个新的链表NEW,并输出新建链表。

输入输出示例:

输入:

1 2 3 4 5 6 7 -1

输出:

1 3 5 7

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

struct stud_node{

int num;

struct stud_node *next;

};

void Ptrint_Stu_Doc(struct stud_node *head);

void main()

{

struct stud_node *L,*tail1,*p1,*NEW;

int num;

int size=sizeof(struct stud_node);

struct stud_node *arrangeDoc(struct stud_node *head);

L=tail1=NULL;

scanf("%d",&num);

while(num!=-1){

p1=(struct stud_node *)malloc(size);

p1->num=num;

p1->next=NULL;

if(L==NULL)

    L=p1;

else

tail1->next=p1;

tail1=p1;

scanf("%d",&num);

}

/*---------*/

NEW = arrangeDoc(L);

Ptrint_Stu_Doc(NEW);

}

struct stud_node *arrangeDoc(struct stud_node *head)

{

struct stud_node *p1, *p2, *p3;

p3 = head;

for (p1 = head; p1!=NULL; p1=p2) {

p2 = p1->next;

if (p1->num % 2==0) {

if (p1 != head)

p3->next=p2;

else

head = p3 = p2;

free(p1);

}

else

p3=p1;

}

return head;

}

void Ptrint_Stu_Doc(struct stud_node *head)

{

struct stud_node *ptr;

if(head==NULL){

printf("No Records\n");

return;

}

for(ptr=head;ptr;ptr=ptr->next)

printf("%d ",ptr->num);

printf("\n");

}

  • 2
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
浙江大学C语言上机练习题&答案 第2周(M2) 2 20011求华氏温度100°F对应的摄氏温度。 2 20012 求华氏温度 150°F 对应的摄氏温度。 3 20013求摄氏温度26°C对应的华氏温度。 3 20015当n为152时,分别求出n的个位数字(digit1)、十位数字(digit2)和百位数字(digit3)的值。 3 20026 输入2个整数 num1 和 num2,计算并输出它们的和、差、积、商与余数。 4 第3周(M3) 5 20031 求1+2+3+......+100(调试示例error02_5) 5 20032 求m+(m+1)+(m+2)+......+100 5 20033 求1/m+1/(m+1)+1/(m+2)+......+1/n 6 20034 求1 + 1/3 + 1/5 + ......的前n项和 7 20035 求1-1/4+1/7-1/10+……的前n项之和 7 20036 输出华氏-摄氏温度转换表(改错题error02_6) 8 20038 求x的n次幂 9 20041 生成 3 的乘方表 10 20044 求100^0.5+101^0.5+……+1000^0.5 10 20053 计算物体自由下落的距离 11 20056 计算分段函数 11 20061 阶梯电价 12 20062 求m*m+1/m+(m+1)*(m+1)+1/(m+1)+(m+2)*(m+2)+1/(m+2)+......+n*n+1/n 13 20063 求1-2/3+3/5-4/7+5/9-6/11+…… 14 20064 求2^1+2^2+2^3+……+2^n 15 第4周(M4) 15 10007 显示图案 (复习printf()的字符串输出) 15 20042 生成阶乘表 16 20043 使用函数求 n! /(m!* (n-m)!) 16 20054 求平均值 17 20057 求1+1/2+1/3+......+1/n 18 20065 求0!+1!+2!+……+n! 18 40015 求最小值 19 40018 求a+aa+aaa+aa…a 20 第5周(M5) 21 30001 求一元二次方程的根 21 30002 求分段函数的值 23 30003 分类统计字符 23 30004 显示五级记分制成绩所对应的百分制成绩区间(使用switch) 24 30005 显示水果的价格(使用switch) 25 30007 求三角形的面积和周长 27 30008 计算个人所得税 28 30051 判断闰年 29 30052 统计学生平均成绩与及格人数 30 30053 分段计算水费(使用嵌套的if-else语句) 31 第6周(M6) 32 40011 求最小公倍数和最大公约数(调试示例error04_1) 32 40012 求1-1/4+1/7-1/10+1/13-1/16+…… 33 40014 求整数的位数 34 40023 换硬币 35 40024 找出各位数字的立方和等于它本身的数 36 40025 找完数(改错题error04_2) 38 40027 从高位开始逐位输出一个整数的各位数字(选作) 39 40052 判断素数 40 40053 逆序输出整数 41 40054 输出斐波那契序列 42 第7周(M7) 42 50002 使用函数判断数的符号 42 50003 使用函数求奇数和 43 50005 使用函数统计素数并求和 44 50006 使用函数统计一个整数中数字的个数 45 50007 使用函数找水仙花数 46 50009 使用函数求余弦函数的近似值 48 50052 使用函数找最大值 49 50062 使用函数输出指定范围内的 Fibonacci 数 50 50063 使用函数找出指定范围内的完数 51 第8周(M8) 52 40013 求奇数和 52 40062 求x+x*x/2!+x*x*x/3!+x*x*x*x/4!+……的值 53 50004 使用函数计算两点间的距离 54 50061 使用函数求a+aa+aaa+aa…a 55 60002 整数的十进制、八进制和十六进制表现形式 56 60003 分类统计字符 57 60006 验证歌德巴赫猜想 58 60007 使用函数输出整数的逆序数 59 60009 统计单词 60 60062 简单计算器 61 夏1周 2 70011 简化的插入排序 2 70012 求平均值 5 70013 将数组中的数逆序存放 6 70014 求最大值及其下标 7 70015 交换最小值和最大值 8 70016 选择法排序 9 70017 在数组中查找指定的元素 10 70021 求矩阵各行元素之和 11 70022 矩阵运算 12 70023 九九乘法表 13 夏2周 14 70024 判断上三角矩阵 14 70025 算算看,这是第几天? 15 70026 找鞍点(选作) 16 70031 将字符串逆序存放 17 70032 查找字符 18 70033 统计大写辅音字母 19 70034 字符串替换 20 70035 将十六进制字符串转换为十进制整数 21 70036 将十进制字符串转换为十进制整数 22 70052 统计字符出现次数 23 夏3周 24 10008 求1~100中能被6整除的所有整数的和 24 20014 计算三门课程的平均成绩 25 20016 计算x的平方 25 20021 计算分段函数的值 25 20022 计算摄氏温度 26 70051 找最大值并交换 27 80011 循环移动 28 80012 在数组中查找指定元素 29 80013 使用函数的选择法排序 30 80014 报数 32 夏4周 35 10012 函数程序设计 35 10024 计算最长的字符串长度 36 10025 字符串的连接 37 40017 求2/1+3/2+5/3+8/5+... 38 80021 找最大的字符串 39 80022 找最长字符串 40 80023 使用函数删除字符串中的字符 41 80024 使用函数实现字符串复制 42 80025 判断回文字符串 43 80026 分类统计字符个数 44 夏5周 45 10014 计算函数P(n,x) 45 10016 十进制转换二进制 46 10017 递归函数程序设计求Fabonacci数列 48 10019 改错题error10_1.cpp 49 10022 编程题 50 10026 指定位置输出字符串 50 10027 藏尾诗 51 10028 改错题error11_2.cpp 52 40065 分解质因数 53 40067 打印图案 54 夏6周 56 30062 输出21世纪所有闰年 56 90001 调试示例error09_1.cpp 56 90002 时间换算 57 90003 计算平均成绩 58 90004 计算两个复数之积 59 90005 查找书籍 60 90006 通讯录排序 61 90007 算算看,这是第几天? 62 90008 使用函数实现时间换算 63 90009 找出总分最高的学生 64 其它练习 65 20027计算旅途时间。 65 20028数字加密 66 教材习题3-4 (上机练习30009,统计学生成绩) 66 30061 出租车计费 67 教材习题4-12(p77) 68 教材习题4-14(p77) 69 50051 数字金字塔(此题与40067打印图案的思路相似) 69

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值