C语言模拟考试

函数题

求两个形参的乘积和商

给定函数 fun 的功能是:求两个形参的乘积和商,并通过形参返回调用程序。

函数接口定义:

void fun ( double a, double b, double *x, double *y );

其中 abxy都是用户传入的参数。函数求 ab两个形参的乘积和商并通过形参 xy 返回。

裁判测试程序样例:

#include <stdio.h>

void fun( double a, double b, double *x, double *y );
int main ( )
{ 
	double a, b, c, d;
	scanf ("%lf%lf", &a, &b );
	fun ( a , b, &c, &d ) ;
	printf ("c=%.2f  d=%.2f\n", c, d );
	return 0;
}

/* 请在这里填写答案 */
输入样例:
61.82 12.65
输出样例:
c=782.02 d=4.89

void fun ( double a, double b, double *x, double *y ){
    *x=a*b;
    *y=a/b;
}

统计专业人数

本题要求实现一个函数,统计学生学号链表中专业为计算机的学生人数。链表结点定义如下:

struct ListNode {
    char code[8];
    struct ListNode *next;
};

这里学生的学号共7位数字,其中第2、3位是专业编号。计算机专业的编号为02。

函数接口定义:

int countcs( struct ListNode *head );

其中head是用户传入的学生学号链表的头指针;函数countcs统计并返回head链表中专业为计算机的学生人数。

裁判测试程序样例:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct ListNode {
    char code[8];
    struct ListNode *next;
};
struct ListNode *createlist(); /*裁判实现,细节不表*/
int countcs( struct ListNode *head );
int main()
{
    struct ListNode  *head;
    head = createlist();
    printf("%d\n", countcs(head));
    
    return 0;
}

/* 你的代码将被嵌在这里 */
输入样例:
1021202
2022310
8102134
1030912
3110203
4021205
#
输出样例:
3

// 第2、3位是专业编号。计算机专业的编号为02。
// 对应索引为1、2
int countcs( struct ListNode *head ){
    int count =0;
    struct ListNode* cur=head;
    while(cur){
        if(cur->code[1]=='0' &&cur->code[2]=='2')
        {
            // printf("%c %c\n",cur->code[1],cur->code[2]);
            count++;
        }
        cur=cur->next;
    }
    return count;
}

字符串指定位置插入

设计函数insert,用指针实现在字符串s1中的指定位置n处插入字符串s2。

函数接口定义:

char* insert(char* s1, char* s2, int n);

其中,s1和s2为两个待处理字符串。n为字符串插入位置。

裁判测试程序样例:

#include <stdio.h>
#include<stdlib.h>
#define Max 100

char* insert(char* s1, char* s2, int n);
int main()
{
    char s1[Max],s2[Max];
    int n;
    scanf("%s", s1);
    scanf("%s", s2);
    scanf("%d", &n);
    char* ss = insert(s1, s2, n);
    printf("%s", ss);
    return 0;
}

/* 请在这里填写答案 */
输入样例:
123456789
1234
7
输出样例:
1234567123489

// 返回s1
char* insert(char* s1, char* s2, int n){
    // 提前将s1保存到temp数组中
    char temp[109]={0};
    int cnt=0;
    for(int i=n;s1[i]!='\0';i++) temp[cnt++]=s1[i];
    int start,i=0;
    for(start=n,i=0;s2[i]!='\0';i++){
        s1[start++]=s2[i];
    }
    
    // 将s1剩余字符接入s1
    for(int i=0;temp[i]!='\0';i++) s1[start++]=temp[i];
        
    s1[start]='\0';
    return s1;
}

求字符串中整数字符之和

本题要求实现一个函数,计算一个字符串中整数字符之和。例如字符串“a2b3@7“中,整数数字字符有 237,所以整数字符之和为 12;例如字符串“xT345y28“中,整数数字字符有34528,所以整数字符之和为 22

函数接口定义:

int sumOfDigit (char *s );

s是指向一个字符串的指针。题目保证数字字符之和不超过int类型表示范围。题目保证字符串中不出现减号-,也就是说本题不用考虑负数。

裁判测试程序样例:

#include <stdio.h>
#include <string.h>

int sumOfDigit(char *s);
int main(void)
{
    char s[30];
    gets(s);
    printf("%d", sumOfDigit(s));
    return 0;
}

/* 请在这里填写答案 */
输入样例1:
a2b3@7
输出样例1:
12
输入样例2:
xT345y28
输出样例2:
22
输入样例3:
abcde
输出样例3:
0

int sumOfDigit (char *s ){
    int ans=0;
    for(int i=0;s[i]!='\0';i++){
        if(s[i]>='0' && s[i]<='9') ans =ans+s[i]-'0';
    }
    return ans;
}

编程题

这是一道计算题

对于指定的整数N,计算a_3+a_4+a_5+…+a_n 的值,其中对于任意整数i,
有 a_i = i

输入格式:
输入一个整数N,输入时保证3<N<2.1∗10 ^9
输出格式:
输出一个整数,为计算结果。

输入样例:
5
输出样例:
12
样例解释
3+4+5=12,故输出12

#include <stdio.h>
long long sum=0;
int main()
{
    long long n;
    scanf("%lld",&n);
    // for(int i=3;i<=n;i++) sum+=i;
    sum=(3+n)*(n-2)/2;// 从3 开始少;两项
    printf("%lld",sum);
    
    return 0;
}

买复印纸(误差)

某办公室到年底准备将剩余的办公经费全部用于购买复印纸。请编写程序,输入办公经费的余额和每包复印纸的单价,计算并输出最多可购买多少包复印纸。

输入格式
办公经费余额和复印纸单价
输出格式
可购复印纸的最大数量

输入样例1
660.8 47.2
输出样例1
14
输入样例2
504.9 19.8
输出样例2
25
提示:注意实数的误差。浮点数在内存中是不精确的

// 版本1
#include<stdio.h>
 
int main()
{
    double x,y;
    int z;
    scanf("%lf %lf",&x,&y);
    z=x/y+0.000001;
    printf("%d\n",z);
    return 0;
}
// 版本2
#include <stdio.h>
#include <math.h>

int main()
{
    double x,y;
    double z;
    scanf("%lf %lf",&x,&y);
    z=x/y+0.000001;
    printf("%.0f\n",floor(z));
    return 0;
}

求给定数组元素的最大值

从键盘输入不超过50个非负整数,当输入为负值时,表示输入结束。试编程求出其中的最大值。

输入格式:
在一行中给出不超过50个非负整数(空格分隔),以负数结束。
输出格式:
按输出样例的形式输出其中的最大值,并输出,见样例。

输入样例:
9 0 62 36 15 28 -1
输出样例:
max=62
输入样例:
-1
输出样例:
NULL!

#include <stdio.h>

int main()
{
    int x;
    int max=0;
    while(scanf("%d",&x) && x>=0)
    {
        if(x>max) max=x;
    }
    if(max==0) printf("NULL!");// 只输入了-1
    else printf("max=%d",max);
    return 0;
}

统计数字字符

输入一串字符(中间无空格,字符串最长80),统计其中数字字符0-9各出现多少次,输出出现过的数字(每3个字母占一行)及其出现次数。

输入格式:
字符串
输出格式:
输出出现过的数字(每3个字母占一行)及其出现次数。
例如:
1:2次 3:1次

输入样例1:
12edRRde456123232
输出样例1:
1:2次 2:4次 3:2次
4:1次 5:1次 6:1次
输入样例2:
wewQQFTSerfgs
输出样例2:
10个数字字符都没出现过

#include <bits/stdc++.h>
using namespace std;

int a[10];
int main()
{
    string s;getline(cin,s);
    int flag=0;
    int len=s.size();
    for(int i=0;i<len;i++)
    {
        if(s[i]>='0' && s[i]<='9') 
        {
            a[s[i]-'0']++;
            flag=1;// 出现数字
        }
    }
    if(flag)
    {
        int cnt=0;
        for(int i=0;i<10;i++)
        {
            if(a[i])
            {
                cnt++;
                if(cnt==3)
                {
                    printf("%d:%d次 \n",i,a[i]);
                    cnt=0;
                }
                else
                    printf("%d:%d次 ",i,a[i]);
            }
        }
    }
    else
        printf("10个数字字符都没出现过\n");
    return 0;
}

分段函数求值

已知实数x和y的函数关系如下:
f(x)
编程实现,要求输入x的值,计算并输出y的值(输出结果保留小数点后2位)。

输入格式:
输入一个实数x。
输出格式:
输出实数y的值,保留2位小数。

输入样例:
0.5
输出样例:
5.50

#include <stdio.h>
#include <math.h>

int main(){
    double x;scanf("%lf",&x);
    double y;
    if(x<5) y=x+5;
    else if(x>=5 && x<10){
        y=pow(x,2)+0.3*x;
    }
    else
        y=5*x-10;
    printf("%.2f",y);
    return 0;
}

逆序的三位数

程序每次读入一个正3位数,然后输出按位逆序的数字。注意:当输入的数字含有结尾的0时,输出不应带有前导的0。比如输入700,输出应该是7。

输入格式:
每个测试是一个3位的正整数。
输出格式:
输出按位逆序的数。

输入样例:
123
输出样例:
321

#include <stdio.h>

int main(){
    int n;scanf("%d",&n);
    int a=n/100;
    int b=n/10%10;
    int c=n%10;
    printf("%d",c*100+b*10+a);
    return 0;
}

三天打鱼两天晒网

中国有句俗语叫“三天打鱼两天晒网”。假设某人从某天起,开始“三天打鱼两天晒网”,问这个人在以后的第N天中是“打鱼”还是“晒网”?

输入格式:
输入在一行中给出一个不超过1000的正整数N。
输出格式:
在一行中输出此人在第N天中是“Fishing”(即“打鱼”)还是“Drying”(即“晒网”),并且输出“in day N”。

输入样例1:
103
输出样例1:
Fishing in day 103
输入样例2:
34
输出样例2:
Drying in day 34

#include <stdio.h>

// 3-打鱼 5-晒网  10
int main(){
    int n;scanf("%d",&n);
    int temp=n%5;
    if(temp>=1 && temp<=3) 
        printf("Fishing in day %d",n);
    else if(temp>=4 && temp<=5 || temp==0) 
        printf("Drying in day %d",n);
    return 0;
}

计算天数

本题要求编写程序计算某年某月某日是该年中的第几天。

输入格式:
输入在一行中按照格式“yyyy/mm/dd”(即“年/月/日”)给出日期。注意:闰年的判别条件是该年年份能被4整除但不能被100整除、或者能被400整除。闰年的2月有29天。
输出格式:
在一行输出日期是该年中的第几天。

输入样例1:
2009/03/02
输出样例1:
61
输入样例2:
2000/03/02
输出样例2:
62

#include <stdio.h>

int main(){
    int year,month,day;
    int months[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    scanf("%d/%d/%d",&year,&month,&day);
    // 判断闰年
    if(year%4==0 && year%100!=0 || year%400==0) months[2]+=1;
    int ans=0;
    for(int i=1;i<month;i++) ans+=months[i];
    ans+=day;
    printf("%d",ans);
    
    return 0;
}

输出个等腰梯形吧

小磊正在研究使用编程输出图形,今天小磊在研究使用特定字符(*符号)输出相应尺寸的等腰梯形。
由于梯形需要上底、下底的长度及位置,还有高度才能确定。所以现在小磊把这个问题简化了。
等腰梯形上底的长度固定为3个字符,然后根据高度H,再来确定下底的字符数。

输入格式:
输入一个正整数H代表梯形的高, 3<= H <= 100
输出格式:
输出等腰梯形,注意,等腰字符梯形的上底固定为3个字符,往下每一行,增加两个字符。
每一行最后一个字符后面直接回车换行,也就是等腰梯形的右侧不需要空格,详见样例。

输入样例:
5
输出样例:

    ***
   *****
  *******
 *********
***********
//上底的长度固定为3个字符
#include <stdio.h>

// 3 5 7 9
int main(){
    int h;scanf("%d",&h);
    int start=3;
    for(int i=0;i<h;i++){// 层数
        // 打印空格h-1个并逐层递减
        for(int j=0;j<h-1-i;j++) printf(" ");
        // 打印*,逐层增加2个
        for(int k=0;k<start;k++) printf("*");
        start+=2;
        printf("\n");
    }
    return 0;
}

幸运数字

越努力越幸运。这年诺诺读初三,3成为她的幸运数字,她光荣地加入了共青团。现在给你一串数字, 请找出其中的幸运数字(出现次数最多的那个数字,若有多个数字的出现次数都是最多,则为最大的那个数字)。

输入格式:
输入一串数字(长度不超过100)。
输出格式:
输出幸运数字。

输入样例:
320243315670920
输出样例:
3

#include <stdio.h>
#include <string.h>

// typedef struct Hash{
//     char ch;
//     int value;
// }H;
int hash[11];
int main(){
    // H h[19];
    char s[109];scanf("%s",s);
    // printf("%s",s);
    for(int i=0;s[i]!='\0';i++){
        hash[s[i]-'0']+=1;
    }
    int i=0;
    int ans=i,max=hash[i];
    for(i=0;i<10;i++){
        if(hash[i]>=max) {
            max=hash[i];
            ans=i;
        }
    }
    // printf("%d %d\n",i,hash[i]);
    printf("%d",ans);
    return 0;
}

学生的平均成绩

有五个学生,每个学生有3门课的成绩,从键盘输入以上数据(包括学生号,姓名,三门课成绩),其中学号和姓名都是以字符串方式存储,计算出每名学生的平均成绩,

输入格式:
分别在5行中输入5名学生的信息。按照学号、姓名、3门课的成绩顺序输入,学号和姓名是均不超过4个字符的字符串,字符串中不包含空格、换行符和制表符,一名学生的各个数据之间用一个空格间隔。
输出格式:
分别在5行中输出5名学生的信息。按照学号、姓名、3门课的平均成绩顺序输出,其中学号和姓名输出占5列列宽,平均成绩保留1位小数,输出占5列列宽。

输入样例:
1 aa 78 45 12
2 bb 95 85 95
3 cc 75 45 65
4 dd 74 84 95
5 ee 48 49 56
输出样例:
1 aa 45.0
2 bb 91.7
3 cc 61.7
4 dd 84.3
5 ee 51.0

#include <stdio.h>

typedef struct Students{
    int sno;
    char name[5];
    int score1;
    int score2;
    int score3;
    double avg;
}Stu;
int main(){
    Stu s[9];
    for(int i=0;i<5;i++) 
        scanf("%d %s %d %d %d",&s[i].sno,s[i].name,&s[i].score1,&s[i].score2,&s[i].score3);
    
    for(int i=0;i<5;i++) {
        s[i].avg=(double)(s[i].score1+s[i].score2+s[i].score3)/3;
        printf("%5d%5s%5.1f\n",s[i].sno,s[i].name,s[i].avg);
    }
    
    return 0;
}

找最长的字符串

本题要求编写程序,针对输入的N个字符串,输出其中最长的字符串。

输入格式:
输入第一行给出正整数N;随后N行,每行给出一个长度小于80的非空字符串,其中不会出现换行符,空格,制表符。
输出格式:
在一行中用以下格式输出最长的字符串:
The longest is: 最长的字符串
如果字符串的长度相同,则输出先输入的字符串。

输入样例:
5
li
wang
zhang
jin
xiang
输出样例:
The longest is: zhang

#include <stdio.h>
#include <string.h>

typedef struct String{
    char str[89];
    int length;
}Str;
int cmp(const void* e1,const void* e2){
    Str* a=(Str*)e1;
    Str* b=(Str*)e2;
    return a->length < b->length;
}
int main(){
    int n;scanf("%d",&n);
    Str s_struct[1009];
    for(int i=0;i<n;i++){
        scanf("%s",s_struct[i].str);
        int len=strlen(s_struct[i].str);
        s_struct[i].length=len;
    }
    qsort(s_struct,n,sizeof(Str),cmp);
    printf("The longest is: %s",s_struct[0].str);
    return 0;
}
  • 15
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值