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

本题要求编写程序,输入两个字符串s1s2,统计字符串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. 如果包含,输出str2str1中的起始位置下标,如果不包含,输出“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。要求完成以下功能:

  1. 定义函数 FILE *GetPtr(char *filename, int flag)

函数功能为:通过文件名和flag参数打开指定文件,并返回文件指针。具体地,flag\(0\)时,将文件打开为可读文件;flag\(1\)时,将文件打开为可写文件,并返回文件指针。

  1. 定义函数 int ReadData(FILE *fp, struct student cls[], int size)

函数功能为:从文件ClassA.txt中读入学生信息,存储在学生结构体数组中,并返回本班级学生人数。

  1. 定义函数 void SortNum(struct student cls[], int n)

函数功能为:将所有学生信息进行排序,首先按长跑次数从高到低排序,如果长跑次数一致,按长跑距离从高到低排序。

  1. 定义函数 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;
}

PTA | C Final Test
https://acm.nanyan.cc/posts/f669.html
作者
nanyan
发布于
2024年1月18日
许可协议