c语言二级考试呢,采用的编译器是VC++6.0,如果会简单的运行以及调式,那就太妙了,本次博客记录真题中大题
一、程序填空
题目:
代码:
#include <stdio.h>
#define N 5
typedef struct student {
long sno;
char name[10];
float score[3];
} STU;
void fun(char *filename, STU n)
{ FILE *fp;
/**********found**********/
fp = fopen(filename, "rb+");
/**********found**********/
fseek(fp, -(long)sizeof(STU), SEEK_END);
/**********found**********/
fwrite(&n, sizeof(STU), 1, fp);
fclose(fp);
}
main()
{ STU t[N]={ {10001,"MaChao", 91, 92, 77}, {10002,"CaoKai", 75, 60, 88},
{10003,"LiSi", 85, 70, 78}, {10004,"FangFang", 90, 82, 87},
{10005,"ZhangSan", 95, 80, 88}};
STU n={10006,"ZhaoSi", 55, 70, 68}, ss[N];
int i,j; FILE *fp;
fp = fopen("student.dat", "wb");
fwrite(t, sizeof(STU), N, fp);
fclose(fp);
fp = fopen("student.dat", "rb");
fread(ss, sizeof(STU), N, fp);
fclose(fp);
printf("\nThe original data :\n\n");
for (j=0; j<N; j++)
{ printf("\nNo: %ld Name: %-8s Scores: ",ss[j].sno, ss[j].name);
for (i=0; i<3; i++) printf("%6.2f ", ss[j].score[i]);
printf("\n");
}
fun("student.dat", n);
printf("\nThe data after modifing :\n\n");
fp = fopen("student.dat", "rb");
fread(ss, sizeof(STU), N, fp);
fclose(fp);
for (j=0; j<N; j++)
{ printf("\nNo: %ld Name: %-8s Scores: ",ss[j].sno, ss[j].name);
for (i=0; i<3; i++) printf("%6.2f ", ss[j].score[i]);
printf("\n");
}
}
代码修改位置:
运行结果:
二、程序修改:
题目:
代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct aa
{ int data;
struct aa *next;
} NODE;
NODE *Creatlink(int n, int m)
{ NODE *h=NULL, *p, *s;
int i;
/**********found***********/
p=(NODE* )malloc(sizeof(NODE));
h=p;
p->next=NULL;
for(i=1; i<=n; i++)
{ s=(NODE *)malloc(sizeof(NODE));
s->data=rand()%m; s->next=p->next;
p->next=s; p=p->next;
}
/**********found***********/
return h;
}
outlink(NODE *h)
{ NODE *p;
p=h->next;
printf("\n\nTHE LIST :\n\n HEAD ");
while(p)
{ printf("->%d ",p->data);
p=p->next;
}
printf("\n");
}
main()
{ NODE *head;
head=Creatlink(8,22);
outlink(head);
}
代码及其修改位置:
报错情况:
这种程序修改题估计都是语法错误,逻辑错误应该很少后期遇到在解释。百度的说法是因为这是在VC++6.0的编译器,不会默认从void *(空指针)转换成普通指针,所以需要在强制类型转换哪里修改成NODE *,改了之后,还有一个逻辑错误没改,返回的值,因为后面的主函数打印,所以要返回头指针。
运行结果:
(缺失逻辑错误)
正常的运行:
三、程序设计:
题目:
代码(未修改):
#include<string.h>
#include<stdio.h>
#define N 80
int fun(char *s)
{
}
void main()
{
FILE *wf;
char line[N];
int num=0;
printf("Enter a string:\n ");
gets(line);
num=fun(line);
printf("The number of word is:%d\n\n ",num);
/******************************/
wf=fopen("out.dat","w");
fprintf(wf,"%d",fun("a big car"));
fclose(wf);
/*****************************/
}
已修改:
#include<string.h>
#include<stdio.h>
#define N 80
int fun(char *s)
{
//字符串输入gets函数每个单词间有空格,字符串数组最后有一个标志\0
//循环结束条件就是\0
//判断条件:字符不等于空字符,且下一个字符是空字符或者\0
int i=0;
int count = 0;
/*
for(i=0;s[i]!='\0';i++)
{
if(s[i]!=' ' && (s[i+1] == '\0' || s[i+1]== ' '))
count++;
}
return count;
*/
//int n = strlen(s);
//while(i<n)
while(*(s+i)!='\0')
{
if(*(s+i) != ' ' && (*(s+i+1) == ' '|| *(s+i+1)== '\0'))
count++;
i++;
}
return count;
}
void main()
{
FILE *wf;
char line[N];
int num=0;
printf("Enter a string:\n ");
gets(line);
num=fun(line);
printf("The number of word is:%d\n\n ",num);
/******************************/
wf=fopen("out.dat","w");
fprintf(wf,"%d",fun("a big car"));
fclose(wf);
/*****************************/
}
代码运行结果:
注意:
理清题目,这个题目虽然简单,但还是有坑,比如判断一个单词,如果以空格作为一个单词的判断条件,则会漏掉最后一个单词(\0),这里的判断条件是判断字符,双引号是字符串,c语言确实严谨,python就可以用双引号表示(估计在编译的时候,会自己判断),结束条件(遍历每个字符,在不知道字符数量的情况下\0,也可以调用strlen函数).
这只是第一套真题的大题,选择题可以背,但大题要跑出来才行。