wowoqu 发表于 2025-2-7 02:51:08

2个月搞定计算机二级C语言——真题(12)解析

1. 前言

本篇我们讲解2个月搞定计算机二级C语言——真题12

2. 程序填空题

2.1 题目要求


2.2 提供的代码

#include<stdio.h>#define   N   3int fun(int(*a)){    inti, j, m1, m2, row, colum;    m1 = m2 = 0;    for (i = 0; i < N; i++)    {      j = N - i - 1;m1 += a;m2 += a;    }    if (m1 != m2) return0;    for (i = 0; i < N; i++) {      /**********found**********/      row = colum = __1__;      for (j = 0; j < N; j++)      {            row += a;colum += a;      }      /**********found**********/      if ((row != colum) __2__(row != m1)) return 0;    }    /**********found**********/    return__3__;}main(){    intx, i, j;    printf("Enter number for array:\n");    for (i = 0; i < N; i++)      for (j = 0; j < N; j++)scanf("%d", &x);    printf("Array:\n");    for (i = 0; i < N; i++)    {      for (j = 0; j < N; j++)printf("%3d", x);      printf("\n");    }    if (fun(x)) printf("The Array is a magic square.\n");    else printf("The Array isn't a magic square.\n");    getchar();}2.3 解题思路

第(1)处填空:
在这条语句的下方,使用了一个for循环将数组的行和列累加至row和colum中,所以这里需要对他俩进行初始化为 0。
和上方的m1 = m2 = 0;是同种作用,在实际应用中可以直接在变量定义时初始化,例如:int m1 = 0,m2 = 0;。
row = colum = 0;第(2)处填空:
if中的语句是返回 0,则需要判断检查当前行的和是否等于当前列的和,或当前行的和是否等于对角线的和(幻方的要求),这两个中只要有一个为不等于,则可以说明该数组不是幻方。
其中判断的条件已经给出,我们只需要在中间填入||,表示有其中一个条件符合就会执行return 0;。
if ((row != colum) || (row != m1)) return 0;第(3)处填空:
经过前面一系列的判断,都没有执行到return 0;,则说明该数组是幻方,返回1即可。
return1;2.4 代码实现

填写完整的代码:
#include<stdio.h>#define   N   3int fun(int(*a)){    inti, j, m1, m2, row, colum;    m1 = m2 = 0;    for (i = 0; i < N; i++)    {      j = N - i - 1;m1 += a;m2 += a;    }    if (m1 != m2) return0;    for (i = 0; i < N; i++) {      /**********found**********/      row = colum = 0;      for (j = 0; j < N; j++)      {            row += a;colum += a;      }      /**********found**********/      if ((row != colum) || (row != m1)) return 0;    }    /**********found**********/    return1;}main(){    intx, i, j;    printf("Enter number for array:\n");    for (i = 0; i < N; i++)      for (j = 0; j < N; j++)scanf("%d", &x);    printf("Array:\n");    for (i = 0; i < N; i++)    {      for (j = 0; j < N; j++)printf("%3d", x);      printf("\n");    }    if (fun(x)) printf("The Array is a magic square.\n");    else printf("The Array isn't a magic square.\n");    getchar();}提示:为确保代码正常运行,请在题库编程环境的对应题目中进行测试和运行。
3. 程序修改题

3.1 题目要求


3.2 提供的代码

#include <stdio.h>#include <string.h>#define    N   80intfun(char* s, char* t){    intn;    char* p, * r;    n = 0;    while (*s)    {      p = s;      /*********found**********/      r = p;      while (*r)            if (*r == *p) { r++;p++; }            elsebreak;      /*********found**********/      if (*r = 0)            n++;      s++;    }    returnn;}main(){    chara, b;    int   m;    printf("\nPlease enter string a : "); gets(a);    printf("\nPlease enter substring b : "); gets(b);    m = fun(a, b);    printf("\nThe result is :m = %d\n", m);    getchar();}3.3 解题思路

第(1)处修改:
先执行了p = s;,又执行了r = p;,此时r等于p等于s,下方的语句会判断*r和*p是否相等。在程序里它没有用形参t,也就是说程序运行起来,一直是s自己比较。
这里需要将t的地址赋值给r,才能达到题目要求的效果。
r = t;第(2)处修改:
这里没啥好说的,少个等号,加上即可。
if (*r == 0)3.4 代码实现

修改后的代码:
#include <stdio.h>#include <string.h>#define    N   80intfun(char* s, char* t){    intn;    char* p, * r;    n = 0;    while (*s)    {      p = s;      /*********found**********/      r = t;      while (*r)            if (*r == *p) { r++;p++; }            elsebreak;      /*********found**********/      if (*r == 0)            n++;      s++;    }    returnn;}main(){    chara, b;    int   m;    printf("\nPlease enter string a : "); gets(a);    printf("\nPlease enter substring b : "); gets(b);    m = fun(a, b);    printf("\nThe result is :m = %d\n", m);    getchar();}提示:为确保代码正常运行,请在题库编程环境的对应题目中进行测试和运行。
4. 程序设计题

4.1 题目要求


4.2 提供的代码

#include <stdio.h>#pragma warning (disable:4996)#define N 5struct mpow{    double a;    int t;};double fun(struct mpow* x, int n){}void main(){    void NONO();    struct mpow x = { 12,0,9,2,23,1,7,2 };    double sum;    sum = fun(x, 4);    printf("sum=%lf\n", sum);    NONO();}void NONO(){/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,输出数据,关闭文件。 */    FILE* in, * out;    struct mpow x;    int i, j;    double sum;    in = fopen("in.dat", "r");    out = fopen("out.dat", "w");    for (i = 0; i < 10; i++) {      for (j = 0; j < 4; j++) fscanf(in, "%lf,%d,", &x.a, &x.t);      sum = fun(x, 4);      fprintf(out, "sum=%lf\n", sum);    }    fclose(in);    fclose(out);}4.3 解题思路

在数学中,幂是用来表示一个数被自身乘以若干次的运算结果。幂由两部分组成:底数和指数。
这个大家在数学中都学过,这里便不再赘述,下面主要来看如何用代码来实现功能。
我们可以采用两层循环嵌套的方式,依次求出结构体数组中计算的结果,外层循环为 n个幂数,内层循环则将幂的底a自乘t次,计算完一个幂数之和后累加到sum中,这样遍历结束后即可得到x所指数组中n个幂数之和,将其返回即可。
4.4 代码实现

填写完整的代码:
#include <stdio.h>#pragma warning (disable:4996)#define N 5struct mpow{    double a;    int t;};double fun(struct mpow* x, int n){    double sum = 0.0, number = 1.0;    int i = 0, j = 0;    for (i = 0; i < n; i++)    {      number = 1.0;      for (j = 0; j < x.t; j++)      {            number *= x.a;      }      sum += number;    }    return sum;}void main(){    void NONO();    struct mpow x = { 12,0,9,2,23,1,7,2 };    double sum;    sum = fun(x, 4);    printf("sum=%lf\n", sum);    NONO();}void NONO(){/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,输出数据,关闭文件。 */    FILE* in, * out;    struct mpow x;    int i, j;    double sum;    in = fopen("in.dat", "r");    out = fopen("out.dat", "w");    for (i = 0; i < 10; i++) {      for (j = 0; j < 4; j++) fscanf(in, "%lf,%d,", &x.a, &x.t);      sum = fun(x, 4);      fprintf(out, "sum=%lf\n", sum);    }    fclose(in);    fclose(out);}提示:为确保代码正常运行,请在题库编程环境的对应题目中进行测试和运行。
5. 后记

本篇博客到这就结束了,如果您有疑问或建议欢迎您在留言区留言。
页: [1]
查看完整版本: 2个月搞定计算机二级C语言——真题(12)解析