2021级C语言复习自测 - ZZULI

42 篇文章 0 订阅

6-1 打折促销(函数)

分数 5

全屏浏览题目

切换布局

作者 zzuli

单位 郑州轻工业大学

定义一个名为Zhe的函数,完成如下打折计算功能,并将结果返回。
商店打折方案如下:
商品价格满300元减100,满200元减80,低于200元按原价。
设计函数实现该打折方案。

函数接口定义:

 
 

int Zhe(int x);

该函数完成上述打折方案,并将计算结果返回。

裁判测试程序样例:

 
 

#include <stdio.h> int Zhe(int x); int main() { int a, b; scanf("%d", &a); b = Zhe(a); printf("%d", b); return 0; } /* 请在这里填写答案 */

输入样例:

300

输出样例:

200

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

代码

int Zhe(int x){
    if(x >= 300)
        x -= 100;
    else if(x >= 200)
        x -= 80;
    return x;
}

6-2 使用函数找出数组中的最大值

分数 15

全屏浏览题目

切换布局

作者 张泳

单位 浙大城市学院

本题要求实现一个找出整型数组中最大值的函数。

函数接口定义:

 
 

int FindArrayMax( int a[], int n );

其中a是用户传入的数组,n是数组a中元素的个数。函数返回数组a中的最大值。

裁判测试程序样例:

 
 

#include <stdio.h> #define MAXN 10 int FindArrayMax( int a[], int n ); int main() { int i, n; int a[MAXN]; scanf("%d", &n); for( i=0; i<n; i++ ){ scanf("%d", &a[i]); } printf("%d\n", FindArrayMax(a, n)); return 0; } /* 请在这里填写答案 */

输入样例:

4
20 78 99 -14

输出样例:

99

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB


代码

int FindArrayMax( int a[], int n ){
    int maxx = a[0];
    for(int i = 1; i < n; i++){
        if(a[i] > maxx)
            maxx = a[i];
    }
    return maxx;
}

6-3 利用指针找最大值

分数 10

全屏浏览题目

切换布局

作者 张泳

单位 浙大城市学院

本题要求实现一个简单函数,找出两个数中的最大值。

函数接口定义:

 
 

void findmax( int *px, int *py, int *pmax );

其中pxpy是用户传入的两个整数的指针。函数findmax应找出两个指针所指向的整数中的最大值,存放在pmax指向的位置。

裁判测试程序样例:

 
 

#include <stdio.h> void findmax( int *px, int *py, int *pmax ); int main() { int max, x, y; scanf("%d %d", &x, &y); findmax( &x, &y, &max ); printf("%d\n", max); return 0; } /* 你的代码将被嵌在这里 */

输入样例:

3 5

输出样例:

5

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB


代码

void findmax( int *px, int *py, int *pmax ){
    if(*px > *py)
        *pmax = *px;
    else 
        *pmax = *py;
}

6-4 按等级统计学生成绩

分数 20

全屏浏览题目

切换布局

作者 张泳

单位 浙江大学

本题要求实现一个根据学生成绩设置其等级,并统计不及格人数的简单函数。

函数接口定义:

 
 

int set_grade( struct student *p, int n );

其中p是指向学生信息的结构体数组的指针,该结构体的定义为:

struct student{
    int num;
    char name[20];
    int score;
    char grade;
};

n是数组元素个数。学号num、姓名name和成绩score均是已经存储好的。set_grade函数需要根据学生的成绩score设置其等级grade。等级设置:85-100为A,70-84为B,60-69为C,0-59为D。同时,set_grade还需要返回不及格的人数。

裁判测试程序样例:

 
 

#include <stdio.h> #define MAXN 10 struct student{ int num; char name[20]; int score; char grade; }; int set_grade( struct student *p, int n ); int main() { struct student stu[MAXN], *ptr; int n, i, count; ptr = stu; scanf("%d\n", &n); for(i = 0; i < n; i++){ scanf("%d%s%d", &stu[i].num, stu[i].name, &stu[i].score); } count = set_grade(ptr, n); printf("The count for failed (<60): %d\n", count); printf("The grades:\n"); for(i = 0; i < n; i++) printf("%d %s %c\n", stu[i].num, stu[i].name, stu[i].grade); return 0; } /* 你的代码将被嵌在这里 */

输入样例:

10
31001 annie 85
31002 bonny 75
31003 carol 70
31004 dan 84
31005 susan 90
31006 paul 69
31007 pam 60
31008 apple 50
31009 nancy 100
31010 bob 78

输出样例:

The count for failed (<60): 1
The grades:
31001 annie A
31002 bonny B
31003 carol B
31004 dan B
31005 susan A
31006 paul C
31007 pam C
31008 apple D
31009 nancy A
31010 bob B

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

代码

int set_grade( struct student *p, int n ){
    int ans = 0;
    for(int i = 0; i < n; i++){
        if((p + i)->score >= 85)
            (p + i)->grade = 'A';
        else if((p + i)->score >= 70)
            (p + i)->grade = 'B';
        else if((p + i)->score >= 60)
            (p + i)->grade = 'C';
        else{
            (p + i)->grade = 'D';
            ans ++;
        }
    }
    return ans;
}

6-5 求单链表结点的阶乘和

分数 15

全屏浏览题目

切换布局

作者 陈越

单位 浙江大学

本题要求实现一个函数,求单链表L结点的阶乘和。这里默认所有结点的值非负,且题目保证结果在int范围内。

函数接口定义:

 
 

int FactorialSum( List L );

其中单链表List的定义如下:

 
 

typedef struct Node *PtrToNode; struct Node { int Data; /* 存储结点数据 */ PtrToNode Next; /* 指向下一个结点的指针 */ }; typedef PtrToNode List; /* 定义单链表类型 */

裁判测试程序样例:

 
 

#include <stdio.h> #include <stdlib.h> typedef struct Node *PtrToNode; struct Node { int Data; /* 存储结点数据 */ PtrToNode Next; /* 指向下一个结点的指针 */ }; typedef PtrToNode List; /* 定义单链表类型 */ int FactorialSum( List L ); int main() { int N, i; List L, p; scanf("%d", &N); L = NULL; for ( i=0; i<N; i++ ) { p = (List)malloc(sizeof(struct Node)); scanf("%d", &p->Data); p->Next = L; L = p; } printf("%d\n", FactorialSum(L)); return 0; } /* 你的代码将被嵌在这里 */

输入样例:

3
5 3 6

输出样例:

846

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB


代码

int FactorialSum( List L ){
    List head = L;
    int ans = 0;
    while(head != NULL){
        int mul = 1;
        for(int i = 2; i <= head->Data; i++){
            mul *= i;
        }
        ans += mul;
        head = head->Next;//移动到下一处内存
    }
    return ans;
}

6-6 建立学生信息链表

分数 20

全屏浏览题目

切换布局

作者 张泳

单位 浙大城市学院

本题要求实现一个将输入的学生成绩组织成单向链表的简单函数。

函数接口定义:

 
 

void input();

该函数利用scanf从输入中获取学生的信息,并将其组织成单向链表。链表节点结构定义如下:

 
 

struct stud_node { int num; /*学号*/ char name[20]; /*姓名*/ int score; /*成绩*/ struct stud_node *next; /*指向下个结点的指针*/ };

单向链表的头尾指针保存在全局变量headtail中。

输入为若干个学生的信息(学号、姓名、成绩),当输入学号为0时结束。

裁判测试程序样例:

 
 

#include <stdio.h> #include <stdlib.h> #include <string.h> struct stud_node { int num; char name[20]; int score; struct stud_node *next; }; struct stud_node *head, *tail; void input(); int main() { struct stud_node *p; head = tail = NULL; input(); for ( p = head; p != NULL; p = p->next ) printf("%d %s %d\n", p->num, p->name, p->score); return 0; } /* 你的代码将被嵌在这里 */

输入样例:

1 zhang 78
2 wang 80
3 li 75
4 zhao 85
0

输出样例:

1 zhang 78
2 wang 80
3 li 75
4 zhao 85

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB


代码

void input(){
    int num;
    struct stud_node* p = NULL;
    scanf("%d", &num);
    if(num != 0){ //处理好第一处数据,之后提前读入num,防止多分配尾部内存
        p = (struct stud_node*) malloc(sizeof(struct stud_node));
        head = p;
    }
    while(num != 0){
        p->num = num;
        scanf("%s %d", p->name, &p->score);
        tail = p;
        scanf("%d", &num);
        if(num != 0 ){
            p->next = (struct stud_node*) malloc(sizeof(struct stud_node));//为下段分配内存
            p = p->next;
        }
    }
}

 下面的题允许用其他语言。c++写着比较简单。

7-1 循环-n个数最大值

分数 8

全屏浏览题目

切换布局

作者 YJL

单位 宁波财经学院

求n个整数的最大值

输入格式:

先输入n的值(0<n≤10),再输入n个整数

输出格式:

输出n个数的最大值,若n≤0则没有输出

输入样例:

在这里给出一组输入。例如:

6
11 26 33 51 16 19

输出样例:

在这里给出相应的输出。例如:

51

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB


代码

C++

#include<iostream>
using namespace std;
int main(){
   int a,b,sum =-1*0x3f3f3f3f;
    cin>>a;
    for(int i =0; i <a;i++){
        
        cin>>b;
        
        if(b>sum)
           sum=b;
    }
    if(sum>0)
   cout<<sum;
}

C

#include<stdio.h>
int main(){
   int a, b, sum = -1*0x3f3f3f3f;
    scanf("%d", &a);
    for(int i =0; i < a; i++){
        scanf("%d", &b);
        if(b > sum)
           sum = b;
    }
    if(sum > 0)
        printf("%d", sum);
}

7-2 通讯录排序

分数 20

全屏浏览题目

切换布局

作者 C课程组

单位 浙江大学

输入n个朋友的信息,包括姓名、生日、电话号码,本题要求编写程序,按照年龄从大到小的顺序依次输出通讯录。题目保证所有人的生日均不相同。

输入格式:

输入第一行给出正整数n(<10)。随后n行,每行按照“姓名 生日 电话号码”的格式给出一位朋友的信息,其中“姓名”是长度不超过10的英文字母组成的字符串,“生日”是yyyymmdd格式的日期,“电话号码”是不超过17位的数字及+-组成的字符串。

输出格式:

按照年龄从大到小输出朋友的信息,格式同输出。

输入样例:

3
zhang 19850403 13912345678
wang 19821020 +86-0571-88018448
qian 19840619 13609876543

输出样例:

wang 19821020 +86-0571-88018448
qian 19840619 13609876543
zhang 19850403 13912345678

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB


代码

C++

#include<iostream>
#include <algorithm>

using namespace std;
class Fri{
public:
    string name;
    int birth;
    string number;
    friend ostream & operator << (ostream & out, Fri & fri){
        out << fri.name << " " << fri.birth << " " << fri.number;
        return out;
    }
    friend istream & operator >> (istream & in, Fri & fri){
        in >> fri.name >> fri.birth >> fri.number;
        return in;
    }
};
int main(){
    int n;
    cin >> n;
    Fri* fri = new Fri[n];
    for(int i = 0; i < n; i++){
        cin >> fri[i];
    }
    sort(fri, fri + n, [](const Fri& f1, const Fri& f2){
        return f1.birth < f2.birth;
    });
    for(int i = 0; i < n; i++){
        cout << fri[i] << endl;
    }
}

C

#include<stdio.h>
#include <cstdlib>

struct Fri{
    char name[10];
    int birth;
    char number[17];
};
int cmp(const void*f1, const void* f2){
    const Fri* f3 = (const Fri*) f1;
    const Fri* f4 = (const Fri*) f2;
    return f3->birth > f4->birth;
}
int main(){
    int n;
    scanf("%d", &n);
    Fri* fri = new Fri[n];
    for(int i = 0; i < n; i++){
        scanf("%s %d %s", fri[i].name, &fri[i].birth, fri[i].number);
    }
    qsort(fri, n, sizeof(*fri), cmp);
    for(int i = 0; i < n; i++){
        printf("%s %d %s\n", fri[i].name, fri[i].birth, fri[i].number);
    }
}

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿白|

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值