PTA | C Final Test
1-1
若int a=3,b=4,m=0,n=0,k;
执行语句
k=(n=b>a)||(m=a<b);
后,k,m
的值为(
)
A. 0,0
B. 1,0
C. 1,1
D. 0,1
1-2
若char s[]="a\126b\\\tcd\xdf\n";
则数组s
存放的字符串长度为( )
A. 9
B. 18
C. 10
D. 11
1-3
已定义宏#define M(x,y) x*y
,则宏替换后M(4-1,1+2)*2
的值为(
)
A. 9
B. 7
C. 8
D. 18
1-4
以下程序段若要使输出值为\(2\),则应该从键盘给\(n\)输入的值是( ) int s = 0, a = 1, n;
scanf("%d", &n);
do{
s += 1;
a = a - 2;
} while (a != n);
printf("%d\\n", s);
A. -3
B. 0
C. -1
D. -5
1-5
下列叙述中不正确的是( )
A. 函数的实参可以是常量、变量或表达式,也可以是函数返回值
B. 定义函数时,可以有形参,也可以没有形参
C. 形参变量只有在函数被调用时才被分配存储单元
D. 函数中可以有多条return
语句,因此可以返回多个值
1-6
定义了一维数组 int a[3];
那么数组名a
是(
)
A. 该数组中元素个数
B. 该数组第一个元素的值
C. 该数组第一个元素的地址
D. 该数组的长度
1-7
若有定义语句 char a[100];
则以下输入语句正确的是(
)。
A. scanf("%s",a[0]);
B. gets(a[0]);
C. gets(a);
D. scanf("%c", a[0]);
1-8
若定义pf
为指向float
类型变量f
的指针,下列语句中正确的是(
)
A. float f, *pf=&f;
B. float f, *pf=f;
C. float *pf=&f, f;
D. float f, *pf=0.0;
1-9
对以下定义,不正确的叙述是( )。 struct student
{
int num;
char name[20];
} stu;
A. struct student
是结构体类型名
B. struct
是定义结构体类型的关键字
C. stu
是结构体类型名
D. num, name
都是结构体成员名
1-10
若以“a+”
方式打开一个已存在的文件,则以下叙述正确的是(
)。
A. 文件打开时,原有文件内容被删除,只可作写操作
B. 以上各种说法都不正确
C. 文件打开时,原有文件内容不被删除,位置指针移到文件末尾,可作添加和读操作
D. 文件打开时,原有文件内容不被删除,位置指针移到文件开头,可作重写和读操作
BABAD CCACC
2-1 期末-程序填空题-1-3-查找字符串
分数 6
本题要求编写程序,输入两个字符串s1
和s2
,统计字符串s2
在字符串s1
中出现的次数。
#include <stdio.h>
int find(char* str,char* substr){
int i,j,k,num=0;
for(i=0; str[i]!='\0'; i++){
k=0;
for(j=i; substr[k]==str[j]; k++,j++)
if(substr[k]=='\0'){
num++;
break;
}
}
return num;
}
int main(){
char s1[100],s2[100];
gets(s1);
gets(s2);
printf("%d\n",find(s1,s2));
return 0;
}
2-2 期末-程序填空题-2-3-定位子串
分数 6
输入字符串str1
,最大长度不超过\(80\)个字符。再输入字符串str2
,查找字符串str1
中是否包含字符串str2
.
如果包含,输出str2
在str1
中的起始位置下标,如果不包含,输出“None”
.
输入样例:
Happy new year!
ne
输出样例:
6
#include<stdio.h>
char* search(char* s,char* t){
char* a,* b;
int flag;
for(;*s!='\0';s++){
if(*s==*t){
flag=1;
a=s;
b=t;
for(_______){
if(*a!=*b){
flag=0;
break;
}
}
if(*b=='\0')
return s;
}
}
_______;
}
int main(){
char str1[80],str2[80],* pos;
gets(str1);
gets(str2);
pos=search(str1,str2);
if(pos!=NULL)
_______;
else
printf("None\n");
return 0;
}
2-3 期末-程序填空题-3-1-在链表头部插入新节点。
分数 8
通过依次在链表头部插入新节点,将学生成绩存储在单链表中,并将学生成绩按其在链表中存储的先后顺序打印出来。
#include <stdio.h>
#include <stdlib.h>
// 定义单链表节点结构
struct Node{
int data;
struct Node* next;
};
int main(){
struct Node* head=NULL;
int a[3],i;
for(i=0;i<3;i++){ // 循环语句用来输入学生成绩
scanf("%d",&a[i]);
}
// 在链表头部插入节点
for(i=0;i<3;i++){
struct Node* newNode=(struct Node*)malloc(sizeof(struct Node));
if(newNode==NULL){
printf("内存分配失败\n");
exit(1);
}
______;// newNode->data=a[i];
______;// newNode->next=NULL;
head=newNode;
}
// 打印链表
printf("链表元素:");
while(head!=NULL){
printf("%d ",head->data);
______;// head=head->next;
}
struct Node* temp;
while(head!=NULL){
temp=head;
head=head->next;
______;// free(temp);
}
return 0;
}
3-1
分数 10 本题要求实现一个函数,函数功能是将输入的一个字符串变成逆序输出。字符串最长不超过10个字符。
函数接口定义:
void reverse (char s[ ]);
裁判测试程序样例:
#include<stdio.h>
void reverse(char s[]);
int main(){
char a[80];
printf("Please input a string:\n");
gets(a);
reverse(a);
puts(a);
return 0;
}
/* 请在这里填写答案 */
输入样例:
在这里给出一组输入。例如: ABCD
输出样例:
在这里给出相应的输出。例如: DCBA
代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB
Code
void reverse(char s[]){
int len=0;
while(s[len++]!='\0');
int head=0,tail=len-2;
while(head<tail){
int temp=s[head];
s[head]=s[tail];
s[tail]=temp;
head++;
tail--;
}
}
3-2 期末-函数题-2-5-编写一个递归函数,将一个十进制的正整数转换为二进制输出在屏幕上。
分数 10
本题要求实现一个递归函数,将一个十进制的正整数转换为二进制输出在屏幕上。例如输入\(9\),输出:\(1001\)。
函数接口定义:
void change(int n);
其中 \(n\) 是用户传入的一个十进制正整数;要求递归函数能够将这个整数的二进制位依次输出到屏幕上。
裁判测试程序样例:
#include<stdio.h>
void change(int n);
int main(){
int n;
printf("请输入一个正整数:");
scanf("%d",&n);
//输出这个整数的二进制
change(n);
return 0;
}
/* 请在这里填写答案 */
输入样例:
在这里给出一组输入。例如: 9
输出样例:
在这里给出相应的输出。例如: 1001
代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB
Code
void change(int n){
if(n==0) return;
if(n>0)
change(n/2);
printf("%d",n%2);
}
3-3 R6-3 期末-函数题-3-1-阳光长跑
分数 10
临近期末,为掌握同学们本学期参与阳光长跑的数据并及时督促未完成的同学,现需要统计每个班级未完成阳光长跑的学生人数。学生信息存储在ClassA.txt
文件中,包括每位同学的姓名、学号、本学期阳光长跑次数、本学期阳光长跑距离(公里),成绩。假设每班同学不超过\(50\)人,学校要求每学期每人长跑次数不低于\(28\)次,且距离不低于\(56\)公里,及格的学生需要将成绩设为pass
,不及格则设为fail
。要求完成以下功能:
- 定义函数
FILE *GetPtr(char *filename, int flag)
函数功能为:通过文件名和flag
参数打开指定文件,并返回文件指针。具体地,flag
为\(0\)时,将文件打开为可读文件;flag
为\(1\)时,将文件打开为可写文件,并返回文件指针。
- 定义函数
int ReadData(FILE *fp, struct student cls[], int size)
函数功能为:从文件ClassA.txt
中读入学生信息,存储在学生结构体数组中,并返回本班级学生人数。
- 定义函数
void SortNum(struct student cls[], int n)
函数功能为:将所有学生信息进行排序,首先按长跑次数从高到低排序,如果长跑次数一致,按长跑距离从高到低排序。
- 定义函数
void WriteData(FILE *fp, struct student cls[],int n)
函数功能为:将未完成阳光长跑的同学信息,按功能3中的排序要求,写入到文件ClassB.txt
中。
结构体和函数接口定义:
FILE *GetPtr (char *filename, int flag);
int ReadData (FILE *fp, struct student cls[], int size);
void SortNum (struct student cls[], int n);
void WriteData (FILE *fp, struct student cls[],int n);
形参说明:
GetPtr():
filename
为需要打开的文件名,flag
是读/写控制,flag
为\(0\)时,将文件打开为可读文件;flag
为\(1\)时,将文件打开为可写文件
ReadData():
fp
是需要读取的文件指针,cls
是需要写入的数组,size
是规定的最大学生数
SortNum():
cls
是需要排序的数组,n
是数组中的学生数量
WriteData():
fp
是需要写入的文件指针,cls
是需要输出的数组,n
是数组中的学生数量
裁判测试程序样例:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define MX 16
#define IN 0
#define OUT 1
#define SIZE 50
struct student{
char name[MX]; // 姓名
int no; // 学号
int times; //次数
int mileage; // 里程
char score[10]; // 成绩
};
/*你的答案*/
int main(){
struct student Class[SIZE]={ 0 };
int n=0;
FILE* fp,* fpb;
fp=GetPtr("ClassA.txt",IN);
if(fp==NULL){
return -1;
}
n=ReadData(fp,Class,SIZE);
SortNum(Class,n);
fpb=GetPtr("ClassB.txt",OUT);
if(fpb==NULL){
return -1;
}
WriteData(fpb,Class,n);
return 0;
}
输入样例:
在这里给出一组输入,每行从左到右依次为姓名、学号、次数、距离。
ClassA.txt
John 1 29 58
Jack 2 29 66
Mile 3 22 50
Mike 4 21 60
Peter 5 30 10
输出样例:
在这里给出相应的输出每行从左到右依次为姓名、学号、次数、距离、是否合格(合格输出pass
,不合格输出fail
)。
ClassB.txt
Peter 5 30 10 fail
Mile 3 22 50 fail
Mike 4 21 60 fail
代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB
Code1
WA代码,居然能A两个点
FILE* GetPtr(char* filename,int flag){
FILE* file;
if(flag==0){
file=fopen(filename,"r");
} else if(flag==1){
file=fopen(filename,"w");
}
// else{
// file=NULL;
// printf("Error\n");
// }
return file;
}
int ReadData(FILE* fp,struct student cls[],int size){
int i=0;
while(i<size&&!feof(fp)){
fscanf(fp,"%s",cls[i].name);
fscanf(fp,"%d%d%d",&cls[i].no,&cls[i].times,&cls[i].mileage);
fscanf(fp,"%s",cls[i].score);
}
return i;
}
int cmp(const void* aa,const void* bb){
struct student* a=(struct student*)aa;
struct student* b=(struct student*)bb;
if(a->times==b->times)
return a->mileage<b->mileage;
return a->times<b->times;
}
void SortNum(struct student cls[],int n){
qsort(cls,n,sizeof(struct student),cmp);
}
void WriteData(FILE* fp,struct student cls[],int n){
for(int i=0;i<n;i++){
if(cls[i].times<28||cls[i].mileage<56){
fprintf(fp,"%s %d %d %d %s\n",cls[i].name,cls[i].no,cls[i].times,cls[i].mileage,cls[i].score);
} else{
fprintf(fp,"%s %d %d %d %d\n",cls[i].name,cls[i].no,cls[i].times,cls[i].mileage,cls[i].score);
}
}
}
Code2
还有一个点没A,考后讨论发现是cmp函数中mileage加等号
FILE *GetPtr(char *filename, int flag);
int ReadData(FILE *fp, struct student cls[], int size);
void SortNum(struct student cls[], int n);
void WriteData(FILE *fp, struct student cls[],int n);
FILE *GetPtr(char *filename,int flag){
FILE *file=NULL;
if(flag==0){
file=fopen(filename,"r");
}else if(flag==1){
file=fopen(filename,"w");
}else{
file=NULL;
printf("Error\n");
}
return file;
}
int ReadData(FILE *fp,struct student cls[],int size){
int i=0;
// while(!feof(fp)){
// fscanf(fp,"%s",cls[i].name);
// fscanf(fp,"%d%d%d",&cls[i].no,&cls[i].times,&cls[i].mileage);
// // fscanf(fp,"%s",cls[i].score);
// }
while(i<size && fscanf(fp,"%s%d%d%d",cls[i].name,&cls[i].no,&cls[i].times,&cls[i].mileage)!=EOF){
if(cls[i].times<28 || cls[i].mileage<56){
strcpy(cls[i].score,"fail");
}else{
strcpy(cls[i].score,"pass");
}
i++;
}
return i;
}
int cmp(const void *aa,const void *bb){
struct student *a=(struct student *)aa;
struct student *b=(struct student *)bb;
if(a->times==b->times)
return a->mileage<b->mileage;
return a->times<b->times;
}
void SortNum(struct student cls[],int n){
qsort(cls,n,sizeof(struct student),cmp);
}
void WriteData(FILE *fp,struct student cls[],int n){
for(int i=0;i<n;i++){
if(cls[i].times<28 || cls[i].mileage<56){
printf("%s %d %d %d %s\n",cls[i].name,cls[i].no,cls[i].times,cls[i].mileage,cls[i].score);
}
// else{
// fprintf(fp,"%s %d %d %d pass\n",cls[i].name,cls[i].no,cls[i].times,cls[i].mileage);
// }
}
}
4-1 R7-1 期末-编程题-1-4-停车收费
分数 10 自驾游已经成为一种趋势。旅游途中难免会停车,从而产生停车费用。如某景点停车场收费标准如下:
- 如果停车时间为\(1\)小时以内(含\(1\)小时),免费;
- 如果停车时间为\(8\)小时(含\(8\)小时),则按照每小时\(10\)元的价格收费;
- 如果停车时间为\(8\)小时以上,前\(8\)小时按照每小时\(10\)元的价格收费,超过\(8\)小时后,每增加\(1\)小时,按照每小时\(15\)元的价格收费。
- 应支付的停车费用封顶为\(200\)元。
输入格式:
在一行输入停车时间(整数,单位:小时)。
输出格式:
在一行输出应支付的停车费用(整数,单位:元)
输入样例1:
在这里给出一组输入。例如: 5
输出样例1:
在这里给出相应的输出。例如: 50
输入样例2:
在这里给出一组输入。例如: 8
输出样例2:
在这里给出相应的输出。例如: 80
代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB
Code
#include<stdio.h>
int main(){
int n,ans;
scanf("%d",&n);
if(n<=1){
ans=0;
}else if(n<=8){
ans=n*10;
}else{
ans=80+(n-8)*15;
}
if(ans>200){
ans=200;
}
printf("%d",ans);
return 0;
}
4-2 R7-2 期末-编程题-2-1-最佳小组
分数 10
为了使同学们强健体魄,达标争优,杭州电子科技大学计算机学院某班开展“争创阳光长跑最佳小组”的活动,活动规则如下:假设本学期全班同学恰好分成\(m\)个小组,每个小组\(n\)名同学(假设\(2<=m <=7、2<=n<=6\),且均为正整数),要求每个小组队员相互鼓励、相互促进,积极参加阳光长跑活动。期末,每个学生上报自己的跑步次数给体育委员,由体育委员进行汇总统计,评出阳光长跑最佳小组。请你编写程序,帮助体育委员统计每个小组参与阳光长跑的次数,并根据统计结果评选出阳光长跑最佳小组。(为简单起见,每个小组阳光长跑次数都不相同)
输入格式:
在第一行中输入两个正数,分别代表小组数\(m\)和每组人数\(n\),两个数用空格分隔。
接下来输入\(m\)行,每一行代表\(1\)个小组,在每一行中输入\(n\)个正整数,每个正整数表示\(1\)个同学本学期参加阳光长跑的次数,每个数之间用空格分隔。
输出格式:
输出共\(m+1\)行。
前\(m\)行,每一行输出每个小组阳光长跑的总次数。
最后一行输出获得最佳小组的组号。
输入样例:
在这里给出一组输入。例如: 3 2
15 20
16 18
21 19
输出样例:
在这里给出相应的输出。例如: 35
34
40
3
代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB
Code
#include<stdio.h>
#include<string.h>
int main(){
int m,n,t;
int sum[10];
memset(sum,0,sizeof(sum));
scanf("%d%d",&m,&n);
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
scanf("%d",&t);
sum[i]+=t;
}
}
int best=0;
for(int i=0;i<m;i++){
if(sum[best]<sum[i]){
best=i;
}
printf("%d\n",sum[i]);
}
printf("%d\n",best+1);
return 0;
}
4-3 R7-3 期末-编程题-3-4-最强大脑之最长单词搜索
分数 10
请编写一段找到最长单词的程序。一次输入多个单词,每个单词之间以空格分隔,所有单词总共的字母数量不超过\(10000\),优先输出第一个最长单词(字符数不超过\(100\)),单词仅由小写字母组成。
输入格式:
输入一行字符串包含多个单词(字符串开头无空格),单词间以空格隔开。
输出格式:
输出最长的一个单词。
输入样例1:
在这里给出一组输入。例如: life is like a box of chocolates
输出样例1:
在这里给出相应的输出。例如: chocolates
输入样例2:
在这里给出一组输入。例如: you did not read book
输出样例2:
在这里给出相应的输出。例如: read
代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB
Code
#include<stdio.h>
#include<string.h>
int main(){
int max=0;
char str[101],maxstr[101];
while(scanf("%s",str)!=EOF){
if(strlen(str)>max){
strcpy(maxstr,str);
max=strlen(str);
}
}
printf("%s",maxstr);
return 0;
}