在本篇文章中,我们将讨论如何在短短的两个月内准备并通过计算机二级C语言考试,特别是真题12。
前言
本篇我们讲解2个月搞定计算机二级C语言——真题12。
程序填空题
题目要求
提供的代码
#include <stdio.h>
#define N 3
int Fun(int (*a)[N])
{
int i, j, m1, m2, row, colum;
m1 = m2 = 0;
for (i = 0; i < N; i++)
{
j = N - i - 1; m1 += a[i][i]; m2 += a[i][j];
}
if (m1 != m2) return 0;
for (i = 0; i < N; i++) {
/**********found**********/
row = colum = __1__;
for (j = 0; j < N; j++)
{
row += a[i][j]; colum += a[j][i];
}
/**********found**********/
if ((row != colum) __2__(row != m1)) return 0;
}
/**********found**********/
return __3__;
}
main()
{
int x[N][N], i, j;
printf("Enter number for array:\n");
for (i = 0; i < N; i++)
for (j = 0; j < N; j++) scanf("%d", &x[i][j]);
printf("Array:\n");
for (i = 0; i < N; i++)
{
for (j = 0; j < N; j++) printf("%3d", x[i][j]);
printf("\n");
}
if (fun(x)) printf("The Array is a magic square.\n");
else printf("The Array isn't a magic square.\n");
getchar();
}
解题思路
第(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
即可。
return 1;
代码实现
填写完整的代码:
#include <stdio.h>
#define N 3
int fun(int (*a)[N])
{
int i, j, m1, m2, row, colum;
m1 = m2 = 0;
for (i = 0; i < N; i++)
{
j = N - i - 1; m1 += a[i][i]; m2 += a[i][j];
}
if (m1 != m2) return 0;
for (i = 0; i < N; i++) {
/**********found**********/
row = colum = 0;
for (j = 0; j < N; j++)
{
row += a[i][j]; colum += a[j][i];
}
/**********found**********/
if ((row != colum) || (row != m1)) return 0;
}
/**********found**********/
return 1;
}
main()
{
int x[N][N], i, j;
printf("Enter number for array:\n");
for (i = 0; i < N; i++)
for (j = 0; j < N; j++) scanf("%d", &x[i][j]);
printf("Array:\n");
for (i = 0; i < N; i++)
{
for (j = 0; j < N; j++) printf("%3d", x[i][j]);
printf("\n");
}
if (fun(x)) printf("The Array is a magic square.\n");
else printf("The Array isn't a magic square.\n");
getchar();
}
提示:为确保代码正常运行,请在题库编程环境的对应题目中进行测试和运行。
程序修改题
题目要求
提供的代码
#include <stdio.h>
#include <string.h>
#define N 80
int fun(char* s, char* t)
{
int n;
char* p, * r;
n = 0;
while (*s)
{
p = s;
/*********found**********/
r = p;
while (*r)
if (*r == *p) { r++; p++; }
else break;
/*********found**********/
if (*r = 0)
n++;
s++;
}
return n;
}
main()
{
char a[N], b[N]; 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();
}
解题思路
第(1)处修改:
先执行了
p = s;
,又执行了
r = p;
,此时
r
等于
p
等于
s
,下方的语句会判断
*r
和
*p
是否相等。在程序里它没有用形参
t
,也就是说程序运行起来,一直是
s
自己比较。
这里需要将
t
的地址赋值给
r
,才能达到题目要求的效果。
r = t;
第(2)处修改:
这里没啥好说的,少个等号,加上即可。
if (*r == 0)
代码实现
修改后的代码:
#include <stdio.h>
#include <string.h>
#define N 80
int fun(char* s, char* t)
{
int n;
char* p, * r;
n = 0;
while (*s)
{
p = s;
/*********found**********/
r = t;
while (*r)
if (*r == *p) { r++; p++; }
else break;
/*********found**********/
if (*r == 0)
n++;
s++;
}
return n;
}
main()
{
char a[N], b[N]; 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();
}
提示:为确保代码正常运行,请在题库编程环境的对应题目中进行测试和运行。
程序设计题
题目要求
提供的代码
#include <stdio.h>
#pragma warning (disable:4996)
#define N 5
struct mpow
{
double a;
int t;
};
double fun(struct mpow* x, int n)
{
}
void main()
{
void NONO();
struct mpow x[N] = { 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[N];
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[j].a, &x[j].t);
sum = fun(x, 4);
fprintf(out, "sum=%lf\n", sum);
}
fclose(in);
fclose(out);
}
解题思路
在数学中,幂是用来表示一个数被自身乘以若干次的运算结果。幂由两部分组成:底数和指数。
这个大家在数学中都学过,这里便不再赘述,下面主要来看如何用代码来实现功能。
我们可以采用两层循环嵌套的方式,依次求出结构体数组中计算的结果,外层循环为
n
个幂数,内层循环则将幂的底
a
自乘
t
次,计算完一个幂数之和后累加到
sum
中,这样遍历结束后即可得到
x
所指数组中
n
个幂数之和,将其返回即可。
代码实现
填写完整的代码:
#include <stdio.h;
#pragma warning (disable:4996)
#define N 5
struct 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[i].t; j++)
{
number *= x[i].a;
}
sum += number;
}
return sum;
}
void main()
{
void NONO();
struct mpow x[N] = { 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[N];
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[j].a, &x[j].t);
sum = fun(x, 4);
fprintf(out, "sum=%lf\n", sum);
}
fclose(in);
fclose(out);
}
提示:为确保代码正常运行,请在题库编程环境的对应题目中进行测试和运行。
后记
本篇博客到这就结束了,如果您有疑问或建议欢迎您在留言区留言。