2019年9月青少年软件编程等级考试(C语言)二级试卷及C语言版答案

共5题:
1. 计算书费
【描述】
下面是一个图书的单价表:
计算概论 28.9 元/本
数据结构与算法 32.7 元/本
数字逻辑 45.6元/本
C++程序设计教程 78 元/本
人工智能 35 元/本
计算机体系结构 86.2 元/本
编译原理 27.8元/本
操作系统 43 元/本
计算机网络 56 元/本
JAVA程序设计 65 元/本
给定每种图书购买的数量,编程计算应付的总费用。
【输入】
输入一行,包含10个整数(大于等于0,小于等于100),分别表示购买的《计算概论》、《数据结构与算法》、《数字逻辑》、《C++程序设计教程》、《人工智能》、《计算机体系结构》、《编译原理》、《操作系统》、《计算机网络》、《JAVA程序设计》的数量(以本为单位)。每两个整数用一个空格分开。
【输出】
输出一行,包含一个浮点数f,表示应付的总费用。精确到小数点后一位。
【样例输入】
1 5 8 10 5 1 1 2 3 4
【样例输出】
2140.2
【参考范例】

#include<stdio.h>
int main()
{
    int a,i;//a[10]改成a
    double sum=0,b[]= 8.9,32.7,45.6,78,35,86.2,27.8,43,56,65};
//    for(i=0; i<10; i++)
//        scanf("%d",&a[i]);
    for(i=0; i<10; i++)
    {
        scanf("%d",&a);
		sum+=a*b[i];
    }
    printf("%.1lf\n",sum);
    return 0;
}

2. 大小写字母互换
【描述】

把一个字符串中所有出现的大写字母都替换成小写字母,同时把小写字母替换成大写字母。
【输入】
输入一行:待互换的字符串。
【输出】
输出一行:完成互换的字符串(字符串长度小于80)。
【样例输入】
If so, you alreadyhave a GoogleAccount. You can sign in on the right.
【样例输出】
iF SO, YOU ALREADYHAVE A gOOGLEaCCOUNT. yOU CAN SIGN IN ON THE RIGHT.
【参考范例】

#include<stdio.h>
#include<string.h>
int main()
{
	int i,len;//循环变量和字符串长度变量
	char s[80]={0};//定义字符串s
	gets(s);//读入字符串s
	len=strlen(s);//获取输入的字符串s的长度
	for(i=0;i<len;i++)//循环比对字符串里每一个字符
	{
		if(s[i]>='A'&&s[i]<='Z')//如果字符是大写字母
		{
			s[i]=s[i]+32;//将大写转换为小写
		} 
		else if(s[i]>='a'&&s[i]<='z')//如果字符是小写字母
		{
			s[i]=s[i]-32;//将小写转换为大写
		}
	}
	puts(s);//输出转换后的字符串
	return 0;
}

3、肿瘤检测
【描述】

一张CT扫描的灰度图像可以用一个N*N(0 <N <= 100)的矩阵描述,矩阵上的每个点对应一个灰度值(整数),其取值范围是0-255。我们假设给定的图像中有且只有一个肿瘤。在图上监测肿瘤的方法如下:如果某个点对应的灰度值小于等于50,则这个点在肿瘤上,否则不在肿瘤上。我们把在肿瘤上的点的数目加起来,就得到了肿瘤在图上的面积。任何在肿瘤上的点,如果它是图像的边界或者它的上下左右四个相邻点中至少有一个是非肿瘤上的点,则该点称为肿瘤的边界点。肿瘤的边界点的个数称为肿瘤的周长。现在给定一个图像,要求计算其中的肿瘤的面积和周长。
【输入】
输入第一行包含一个正整数N(0 < N <= 100),表示图像的大小;接下来N行,每行包含图像的一行。图像的一行用N个整数表示(所有整数大于等于0,小于等于255),两个整数之间用一个空格隔开。
【输出】
输出只有一行,该行包含两个正整数,分别为给定图像中肿瘤的面积和周长,用一个空格分开。
【样例输入】
6
99 99 99 99 99 99
99 99 99 50 99 99
99 99 49 49 50 51
99 50 20 25 52 99
40 50 99 99 99 99
99 99 99 99 99 99
【样例输出】
9 8
【参考范例】

#include<stdio.h>
int sz[120][120],n;//数字二维数组,图像大小
int main()
{
	scanf("%d",&n);//输入图像大小(行列数)
	int i,j,s=0,c=0;//i行循环,j列循环,s表示面积,c表示周长
	for(i=0;i<n;i++)//循环输入数据
	{
		for(j=0;j<n;j++)
		{
			scanf("%d",&sz[i][j]);//依次输入数字
		}
	}
	for(i=0;i<n;i++)//循环判断每一个数字
	{
		for(j=0;j<n;j++)
		{
			if(sz[i][j]<=50)//如果该数字<=50,即在肿瘤上
			{
				s++;//肿瘤面积累加
				if(i==0 || i==n-1 ||j==0 || j==n-1) // 如果在图像的边缘一定是边界点 
					c++;//肿瘤周长累加
				//如果在方阵中,它的上下左右四个相邻点中至少有一个是非肿瘤上的点则该点为边界点
				else if(sz[i-1][j]>50 || sz[i+1][j]>50 || sz[i][j-1]>50 || sz[i][j+1]>50) 
					c++;//肿瘤周长累加
			}
		}
	}
	printf("%d %d\n",s,c);//输出面积和周长
}

4. 病人排队
【描述】
病人登记看病,编写一个程序,将登记的病人按照以下原则排出看病的先后顺序:
1.老年人(年龄 >= 60岁)比非老年人优先看病。
2.老年人按年龄从大到小的顺序看病,年龄相同的按登记的先后顺序排序。
3.非老年人按登记的先后顺序看病。
【输入】
第1行,输入一个小于100的正整数,表示病人的个数;
后面按照病人登记的先后顺序,每行输入一个病人的信息,包括:一个长度小于10的字符串表示病人的ID(每个病人的ID各不相同且只含数字和字母),一个整数表示病人的年龄,中间用单个空格隔开。
【输出】
按排好的看病顺序输出病人的ID,每行一个。
【样例输入】
5
021075 40
004003 15
010158 67
021033 75
102012 30
【样例输出】
021033
010158
021075
004003
102012
【参考范例】

#include<stdio.h> 
#include<string.h>
char id[100][10];//病人ID 
char old[100][10];//老人组ID 
char young[100][10];//青组ID 
char IDtmp[10];//暂存交换数据用
int oldage[100];//老人组年龄,用于排序 
int n,age,temp,oldm=0,youngm=0;//病人数量,年龄,交换临时变量,老人数量,青年数量
int main()
{
	//先输入病人数量n 
	scanf("%d",&n);
	
	//依次输入n个病人的信息并成老年组和青年组 
	int i,j;
	for(i=0;i<n;i++)
		{
			scanf("%s %d",id[i],&age);//输入病人ID和年龄 
			if (age>=60)//如果年龄60以上 
			{
				oldage[oldm]=age;//年龄存入数组 
				oldm++;//老年数量+1 
				strcpy(old[oldm-1],id[i]);//写入老年组 
			}
			else
			{
				youngm++;//青年数量+1 
				strcpy(young[youngm-1],id[i]);//写入青年组 
			}
		}
	//老年组按年龄高低排序,冒泡排序法 
	for (i=0;i<oldm;i++) 
		for (j=0;j<oldm-i;j++) 
		{
			if(oldage[j]<oldage[j+1])
			{
				temp=oldage[j+1];
				oldage[j+1]=oldage[j];
				oldage[j]=temp;
				strcpy(IDtmp,old[j+1]);
				strcpy(old[j+1],old[j]);
				strcpy(old[j],IDtmp);
			} 
		}
	//先输出老年组 
	for(i=0;i<oldm;i++)
		printf("%s\n",old[i]);
	//再输出青年组 
	for(i=0;i<youngm;i++)
		printf("%s\n",young[i]);
	return 0; 
}

5.实数加法
【描述】

求两个实数相加的和。
题目中输入输出里出现的浮点数都有如下的形式:
P1P2…Pi.Q1Q2…Qj。对于整数部分,P1P2…Pi是一个非负整数且当整数部分不为0时,P1不等于0;对于小数部分,Qj不等于0。
【输入】
2行,每行是一个加数。每个加数的长度不超过100。
【输出】
一行,即相应的和。输出保证一定是一个小数部分不为0的实数。
【样例输入】
0.111111111111111111111111111111
0.111111111111111111111111111111
【样例输出】
0.222222222222222222222222222222
【参考范例】

#include<stdio.h>
#include<string.h>
int main()
{
    int i,j,k,t=0;
    int alen,blen;//两个实数的长度
    char a[150],b[150];//两个实数
    int a1[150]={0},b1[150]={0},a2[150]={0},b2[150]={0},ans1[150]={0},ans2[150]={0};
    //a1[150]存放第1个实数整数部分
    //b1[150]存放第2个实数整数部分
    //a2[150]存放第1个实数小数部分
    //b2[150]存放第2个实数小数部分
	//ans1[150]存放小数部分相加的和
	//ans2[150]存放整数部分相加的和
    
	//输入两个加数
	scanf("%s",&a);
    scanf("%s",&b);
    //获得两个加数长度
    alen=strlen(a);
    blen=strlen(b);
        
	//处理第一个加数,整数部分存入数组a1,小数部分存入数组a2
	for(i=0;i<alen;i++)
	{
        if(a[i]=='.')//找到小数点
		{
            k=0;
            for(j=i-1;j>=0;j--)//处理小数点前整数部分
			{
                a1[k++]=a[j]-'0';//整数部分字符转数字,存入a1
            }
            k=0;
            for(j=i+1;j<alen;j++)//处理小数点后部分
			{
                a2[++k]=a[j]-'0';//小数部分字符转数字,存入a2
                //注意这里是从a2[1]开始存放数据
            }
        }
        }
        
		
	//同样方法处理第二个加数,存入b1和b2
	for(i=0;i<blen;i++)
	{
        if(b[i]=='.')
		{
            k=0;
            for(j=i-1;j>=0;j--)
			{
                b1[k++]=b[j]-'0';
            }
            k=0;
            for(j=i+1;j<blen;j++)
			{
                b2[++k]=b[j]-'0';
                //同样这里是从b2[1]开始存放数据
            }
        }
    }
        
    //小数部分逐位相加
	for(i=140;i>0;i--)
	{
        ans1[i]+=a2[i]+b2[i];//小数部分从后往前逐位对齐相加。
        if(ans1[i]>=10)//如果该位和>10则进位
		{
            ans1[i-1]+=1;
            ans1[i]-=10;;
        }
    }
    if (ans1[0]!=0) a1[0]=a1[0]+1;//如果小数有进位到整数,则进位到整数部分a1[0]中
    
	//整数部分逐位相加
	for(i=0;i<=140;i++)
	{
        ans2[i]+=a1[i]+b1[i];
        if(ans2[i]>=10)
		{
            ans2[i]%=10;
            ans2[i+1]+=1;
        }
    }
        
	//输出整数部分
	for(i=140;i>=0;i--)
	{
        if(ans2[i]!=0)
		{
            for(j=i;j>=0;j--)
			{
                printf("%d",ans2[j]);
            }
            break;
        }
    }
    if(i==-1) printf("0");
        
	//输出小数点
	printf(".");
        
    //输出小数部分
	for(i=140;i>0;i--)
	{
        if(ans1[i]!=0)
		{
            for(j=1;j<=i;j++)
			{
          		printf("%d",ans1[j]);
            }
            break;
        }
    }
    if(i==0) printf("0");
    printf("\n");
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

江湖之远izxg

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

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

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

打赏作者

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

抵扣说明:

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

余额充值