2个月搞定盘算机二级C语言——真题(9)剖析

打印 上一主题 下一主题

主题 843|帖子 843|积分 2529

1. 前言

本篇我们解说2个月搞定盘算机二级C语言——真题9

2. 步伐填空题

2.1 题目要求


2.2 提供的代码
  1. #include  <stdio.h>
  2. double f1(double  x)
  3. {
  4.     return x * x;
  5. }
  6. double f2(double  x, double  y)
  7. {
  8.     return  x * y;
  9. }
  10. /**********found**********/
  11. __1__ fun(int  i, double  x, double  y)
  12. {
  13.     if (i == 1)
  14.         /**********found**********/
  15.         return __2__(x);
  16.     else
  17.         /**********found**********/
  18.         return  __3__(x, y);
  19. }
  20. main()
  21. {
  22.     double  x1 = 5, x2 = 3, r;
  23.     r = fun(1, x1, x2);
  24.     r += fun(2, x1, x2);
  25.     printf("\nx1=%f, x2=%f, x1*x1+x1*x2=%f\n\n", x1, x2, r);
  26.     getchar();
  27. }
复制代码
2.3 解题思绪

第(1)处填空:
题目要求输出浮点型,所以返回值可以利用main函数中利用的类型double。
  1. double fun(int  i, double  x, double  y)
复制代码
第(2)处填空:
这里填写的参数只有x,所以是调用的函数f1。
  1. return f1(x);
复制代码
第(3)处填空:
参数为x,y,对应着函数f2。
  1. return  f2(x, y);
复制代码
2.4 代码实现

填写完整的代码:
  1. #include  <stdio.h>
  2. double f1(double  x)
  3. {
  4.     return x * x;
  5. }
  6. double f2(double  x, double  y)
  7. {
  8.     return  x * y;
  9. }
  10. /**********found**********/
  11. double fun(int  i, double  x, double  y)
  12. {
  13.     if (i == 1)
  14.         /**********found**********/
  15.         return f1(x);
  16.     else
  17.         /**********found**********/
  18.         return  f2(x, y);
  19. }
  20. main()
  21. {
  22.     double  x1 = 5, x2 = 3, r;
  23.     r = fun(1, x1, x2);
  24.     r += fun(2, x1, x2);
  25.     printf("\nx1=%f, x2=%f, x1*x1+x1*x2=%f\n\n", x1, x2, r);
  26.     getchar();
  27. }
复制代码
提示:为确保代码正常运行,请在题库编程环境的对应题目中举行测试和运行。
3. 步伐修改题

3.1 题目要求


3.2 提供的代码
  1. #include   <stdio.h>
  2. void fun(int  n)
  3. {
  4.     int  j, b, c, m, flag = 0;
  5.     for (b = 1; b <= n / 2; b++) {
  6.         /**********found**********/
  7.         n = m;
  8.         c = b;
  9.         while (m != 0 && m >= c) {
  10.             /**********found**********/
  11.             m = m - c;    c++
  12.         }
  13.         /**********found**********/
  14.         if (m != 0)
  15.         {
  16.             printf("%d=", n);
  17.             for (j = b; j < c - 1; j++)   printf("%d+", j);
  18.             printf("%d\n", j);
  19.             flag = 1;
  20.         }
  21.     }
  22.     if (flag == 0)
  23.         printf("不能分解\n");
  24. }
  25. main()
  26. {
  27.     int  n;
  28.     printf("请输入一个整数 :   ");   scanf("%d", &n);
  29.     fun(n);
  30.     getchar();
  31. }
复制代码
3.3 解题思绪

第(1)处修改:
原来的步伐是n = m;,由于m这个变量在界说时没有初始化,它内部存储的大概是垃圾值,赋值给n后会导致n不再存储传入的 100,而是存储的垃圾值,这没有实际的意义,反而会导致步伐跑飞。
所以这里必要让m初始化为n,在while (m != 0 && m >= c)这个循环中不断从m中减去c(当前序列的值),并且让c递增以考虑下一个正整数。
  1. m = n;
复制代码
第(2)处修改:
C语言中每条语句是以;作为结束,在语句c++后面少了;,加上即可。
  1. m = m - c;    c++;
复制代码
第(3)处修改:
假如在while (m != 0 && m >= c)循环结束时,变量m的值为 0,说明通过不断减去当前的正整数c,正好将m减到 0。我们前面将n赋值给了m、b赋值给了c,这就意味着从b开始的一连正整数的和恰好等于n。
所以说假如m等于 0,代表找到了和为n的一组一连正整数,则举行相应的输出。
  1. if (m == 0)
复制代码
3.4 代码实现

修改后的代码:
  1. #include   <stdio.h>
  2. void fun(int  n)
  3. {
  4.     int  j, b, c, m, flag = 0;
  5.     for (b = 1; b <= n / 2; b++) {
  6.         /**********found**********/
  7.         m = n;
  8.         c = b;
  9.         while (m != 0 && m >= c) {
  10.             /**********found**********/
  11.             m = m - c;    c++;
  12.         }
  13.         /**********found**********/
  14.         if (m == 0)
  15.         {
  16.             printf("%d=", n);
  17.             for (j = b; j < c - 1; j++)   printf("%d+", j);
  18.             printf("%d\n", j);
  19.             flag = 1;
  20.         }
  21.     }
  22.     if (flag == 0)
  23.         printf("不能分解\n");
  24. }
  25. main()
  26. {
  27.     int  n;
  28.     printf("请输入一个整数 :   ");   scanf("%d", &n);
  29.     fun(n);
  30.     getchar();
  31. }
复制代码
提示:为确保代码正常运行,请在题库编程环境的对应题目中举行测试和运行。
4. 步伐设计题

4.1 题目要求


4.2 提供的代码
  1. #include   <stdio.h>
  2. #include  <string.h>
  3. void NONO();
  4. int  fun(char* t)
  5. {
  6. }
  7. main()
  8. {
  9.     char  s[26];
  10.     printf("请输入一个字母组成的字符串 :  "); gets(s);
  11.     if (fun(s))  printf("%s 是由连续字母组成的字符串.\n", s);
  12.     else   printf("%s 不是由连续字母组成的字符串!\n", s);
  13.     NONO();
  14.     getchar();
  15. }
  16. void NONO()
  17. {/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
  18.     FILE* fp, * wf;
  19.     int i;
  20.     char s[26], * p;
  21.     fp = fopen("in.dat", "r");
  22.     wf = fopen("out.dat", "w");
  23.     for (i = 0; i < 10; i++) {
  24.         fgets(s, 26, fp);
  25.         p = strchr(s, '\n');
  26.         if (p) *p = 0;
  27.         if (fun(s)) fprintf(wf, "%s\n", s + 2);
  28.         else  fprintf(wf, "%s\n", strrev(s));
  29.     }
  30.     fclose(fp);
  31.     fclose(wf);
  32. }
复制代码
4.3 解题思绪

我给出了两种解法,第二种在文末,先来看第一种。
对于这个题,我们首先必要知道t所指字符串的首位是什么字母,也就是t[0]的值,这里我利用char c = t[0]来存储,在知道值后可以根据t的大小遍历它,同时每次举行c++;作为一连递增字母序列的比较,在循环中只要找到一次t不等于c的值,就说明t所指字符串是不一连的,直接返回 0 即可。当遍历完所有的元素均相等,则说明是一连的递增字母序列,返回 1。
下面假设t所指的字符串是acd,举行不一连字符串步伐的演示:
  1.       i    c    t[i]
  2. 1.    0    a    a---- > 相等进行下一次
  3. 2.    1    b    c---- > 不相等返回 0
复制代码
反之一连字符串会实行完for循环后,返回 1。
4.4 代码实现

填写完整的代码:
  1. #include   <stdio.h>
  2. #include  <string.h>
  3. void NONO();
  4. int  fun(char* t)
  5. {
  6.     char c = t[0];
  7.     int i = 0;
  8.     for (i = 0; i < strlen(t); i++)
  9.     {
  10.         if (t[i] != c)    // 当检测到一处不相等时,说明不是连续递增的
  11.         {
  12.             return 0;    // 则返回 0
  13.         }
  14.         c++;
  15.     }
  16.     return 1; // 将字符串全部遍历,没有发现不相等的,返回 1
  17. }
  18. main()
  19. {
  20.     char  s[26];
  21.     printf("请输入一个字母组成的字符串 :  "); gets(s);
  22.     if (fun(s))  printf("%s 是由连续字母组成的字符串.\n", s);
  23.     else   printf("%s 不是由连续字母组成的字符串!\n", s);
  24.     NONO();
  25.     getchar();
  26. }
  27. void NONO()
  28. {/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
  29.     FILE* fp, * wf;
  30.     int i;
  31.     char s[26], * p;
  32.     fp = fopen("in.dat", "r");
  33.     wf = fopen("out.dat", "w");
  34.     for (i = 0; i < 10; i++) {
  35.         fgets(s, 26, fp);
  36.         p = strchr(s, '\n');
  37.         if (p) *p = 0;
  38.         if (fun(s)) fprintf(wf, "%s\n", s + 2);
  39.         else  fprintf(wf, "%s\n", strrev(s));
  40.     }
  41.     fclose(fp);
  42.     fclose(wf);
  43. }
复制代码
提示:为确保代码正常运行,请在题库编程环境的对应题目中举行测试和运行。
另有一种方法是先根据首位元素和长度天生一个一连的递增字母序列,利用函数strcmp()用t与之比较,也可以判断是否一连,下面给出代码供各人参考:
  1. int  fun(char* t)
  2. {
  3.     char c[26] = { 0 };
  4.     int i = 0;
  5.     // 先根据 t[0]的值,和它的大小生产连续的递增字母序列
  6.     c[0] = t[0];
  7.     for (i = 0; i < strlen(t); i++)
  8.     {
  9.         c[i] = c[0] + i;
  10.     }
  11.     // 使用 strcmp() 函数判断这两个字符串是否相等
  12.     if (strcmp(c, t) == 0)    // strcmp() 返回 0 则说明两个字符串相等
  13.     {
  14.         return 1;    // 则返回 1
  15.     }
  16.     else {
  17.         return 0;    // 不相等的,返回 0
  18. }
复制代码
5. 跋文

本篇博客到这就结束了,假如您有疑问或发起欢迎您在留言区留言。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

冬雨财经

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表