素数+名次与分数

**

《程序设计实践》第A2练——素数+名次与分数

**

注意:打开相关源程序后,只能在//********与//=======之间编写程序,若修改其它部分可能得0分。

  1. 取序号判定素数:prime.cpp(本题40分)

【题目描述】 一个数组a[0]到a[n-1]存放有n整数,其中2≤n≤100。求出n个整数中最大的数a[m1]和次最大的数a[m2]的下标m1和m2,并判定m1+m2是否为素数。

【输入】
输入文件prime.in包含n个整数。
【输出】
输出文件prime.out包含两行,第1行是m1和m2,第2行若m1+m2为素数则输出Yes否则输出No。
【输入输出样例1】
prime.in prime.out
8
2 3 5 1 5 8 -2 -1 5 2
Yes
【输入输出样例2】
prime.in prime.out
5
123456789 33333 777 54321 99999 0 4
No
【限制】
10-10≤整数a[i] ≤10+10,2≤n≤100。
2. 名次与分数:score.cpp(本题60分)
**

在这里插入代码片
#include <stdio.h>
#include <math.h>

#define N0 100				//N0-最大数据个数
#define INF -1000000001		//表示负无穷小

int a[N0], n=0;				//a[]-数据数组; n-数据个数

/*扫描数组a[],获得最大和次大的两个数的下标 保存在指针m1 & m2指向的内存空间中*/
void max12(int *m1, int *m2){
	int i, max1=INF, max2=INF; //i-循环变量; x-输入数据; max1 & max2-最大和次大的两个数
	
	//遍历数组, 获得最大和次大的数m1 和 m2
	//******************************************************
	for( i=0; i<n; i++){
		if( a[i] > max1 ){ //比当前最大的数max1还大, 则更新最大max1 和 次大max2
			//(a)更新次大的
			max2 = max1; //更新次大【数】
			*m2 = *m1;	 //更新次大数的【下标】
			
			//(b)更新最大的
			max1 = a[i]; //更新最大【数】
			*m1 = i;     //更新最大数的【下标】
		}else if( a[i] > max2 ){
			max2 = a[i];  //更新次大【数】
			*m2 = i;	  //更新次大数的【下标】
		}
	}
	//======================================================
}

/*判断给定的整数n是否为素数*/
bool isPrime( int n ){
	int i; //i-循环变量
	
	//(1)若数组n为1 || 2, 则直接返回是素数
	if( n==1 || n==2 ){ 
		return true;
	}
	
	//(2)对n, 判断i=2~sqrt(n)之间是否有数字能n整除? 若有, 则n不可能是素数, 直接返回false 
	//******************************************************	
	for( i=2; i<=(int)sqrt(n);i++){
		if( n%i==0 ){
			return false;
		}
	}
	
	//(2.*)遍历完 i=2~sqrt(n), 没有发现能被n整除的数组, 则n是素数
	return true;
	//======================================================
}

int main(){
	int i, m1, m2; //i-循环变量; max1&max2-一组数里的最大和次大的数的下标
		
	FILE *fp;
	if((fp=fopen("prime.in", "r")) != NULL ){
		fclose(fp);  //存在的话,要先把之前打开的文件关掉
		
		freopen("prime.in", "r", stdin);
		freopen("prime.out", "w", stdout);
	}
	
	scanf("%d", &n); //输入数据的个数n
	for(i=0; i<n;i++){
		scanf("%d", &a[i]);	//读取第2行的n个整数->存储在数组a[...]中
	}
	
	max12( &m1, &m2); //寻找一组数里的最大max1和次大max2数的下标
	
	printf("%d %d\n", m1, m2); //输出最大max1和次大max2
	
	printf("%s\n", isPrime( m1+m2 )?"Yes":"No"); //判断最大max1和次大max2的和 是否为素数?
	
	return 0;
}

【问题描述】 输入数据是我校ACM集训队参加某次ACM网络联赛的成绩和账号,数据分上下两部分,数据上半部分为成绩(榜单),第1列为名次,第2列为账号,第3列为AC(完成的)题目数。数据下半部分为我校ACM集训队队员信息,第1列为姓名,第二列为账号。

**
任务1:将我校ACM集训队队员的成绩排序,即做一个队内排名。我校参赛队员的特征是账号以字符串"FJAU"开头。注意:不是每个ACM集训队的队员都在榜单上!
任务2:计算我校每个参赛队员的成绩。成绩计算方法如下:
i. 没有参加网赛,则成绩=0;
ii. 有参加网赛,但网赛完成0题,则成绩=10;
iii. 网赛AC题数≥1,则成绩=101-队内名次sqrt(队内名次) 【注:sqrt为平方根】
例如:李饶立同学队内名次=1,则其成绩=101-1
sqrt(1)=100.000
再如:林哲斌同学队内名次=2,则其成绩=101-2*sqrt(2)= 98.172。
输出结果为两列:姓名和成绩,成绩保留3位小数,第4位四舍五入,按成绩由高到低排列。
【输入】
输入文件score.in为ACM网络联赛的成绩和帐号。
【输出】
输出文件score.out为按成绩由高到低排序的两列:姓名和成绩,成绩保留3位小数,第4位四舍五入。
【输入输出样例1】
score.in score.out
1 SZU2011_FM1_002 4
2 ZHBIT2011_FM1_001 3
3 SZU2011_FM1_014 3
4 FJUT2011_FM1_001 3
5 SZU2011_FM1_004 3
6 SZU2011_FM1_013 3
7 FJAU2011_FM1_002 3
8 SZU2011_FM1_010 3
9 FJUT2011_FM1_004 3
10 FJUT2011_FM1_009 3
11 FJUT2011_FM1_002 3
12 ZHBIT2011_FM1_002 3
13 FJAU2011_FM1_007 2
14 SZU2011_FM1_008 2
15 FJAU2011_FM1_018 2
16 FJAU2011_FM1_005 2
17 SZU2011_FM1_001 2
18 SZU2011_FM1_009 2
19 SZU2011_FM1_007 2
20 FJAU2011_FM1_022 2
21 FJAU2011_FM1_011 2
22 ZHBIT2011_FM1_003 2
23 FJUT2011_FM1_011 2
24 FJAU2011_FM1_015 2
25 FJAU2011_FM1_006 2
26 FJAU2011_FM1_008 2
27 FJUT2011_FM1_010 2
28 SZU2011_FM1_018 2
29 FJNU2011_FM1_010 2
30 SZU2011_FM1_015 2
31 FJAU2011_FM1_014 2
32 FJAU2011_FM1_020 2
33 FJAU2011_FM1_009 2
34 FJUT2011_FM1_006 1
35 SZU2011_FM1_011 1
36 SZU2011_FM1_005 1
37 FJUT2011_FM1_012 1
38 FJAU2011_FM1_025 1
39 FJUT2011_FM1_007 1
40 FJAU2011_FM1_001 1
41 FJUT2011_FM1_008 1
42 FJAU2011_FM1_023 1
43 FJUT2011_FM1_013 1
44 FJNU2011_FM1_009 1
45 FJUT2011_FM1_005 1
46 FJAU2011_FM1_024 1
47 FJNU2011_FM1_020 0
48 FJAU2011_FM1_012 0
49 FJAU2011_FM1_017 0
50 SZU2011_FM1_016 0

姓名 账号
朱智佳 FJAU2011_FM1_001
李饶立 FJAU2011_FM1_002
彭秦中 FJAU2011_FM1_003
陈竞郴 FJAU2011_FM1_004
林剑辉 FJAU2011_FM1_005
李光泽 FJAU2011_FM1_006
林哲斌 FJAU2011_FM1_007
程千兴 FJAU2011_FM1_008
黄艳丽 FJAU2011_FM1_009
吴胜杰 FJAU2011_FM1_010
谢荣祥 FJAU2011_FM1_011
杨少群 FJAU2011_FM1_012
郑志强 FJAU2011_FM1_013
沈炬 FJAU2011_FM1_014
罗雄飞 FJAU2011_FM1_015
邱一潮 FJAU2011_FM1_016
卢丽娜 FJAU2011_FM1_017
李绍江 FJAU2011_FM1_018
林雪勇 FJAU2011_FM1_019
李华均 FJAU2011_FM1_020
吴灿南 FJAU2011_FM1_021
李福彬 FJAU2011_FM1_022
苏桂明 FJAU2011_FM1_023
魏述文 FJAU2011_FM1_024
陈贻劲 FJAU2011_FM1_025 李饶立 100.000
林哲斌 98.172
李绍江 95.804
林剑辉 93.000
李福彬 89.820
谢荣祥 86.303
罗雄飞 82.480
李光泽 78.373
程千兴 74.000
沈炬 69.377
李华均 64.517
黄艳丽 59.431
陈贻劲 54.128
朱智佳 48.617
苏桂明 42.905
魏述文 37.000
杨少群 10.000
卢丽娜 10.000
彭秦中 0.000
陈竞郴 0.000
吴胜杰 0.000
郑志强 0.000
邱一潮 0.000
林雪勇 0.000
吴灿南 0.000
【输入输出样例2】
score.in score.out
1 FJAU2011023 6
2 FJNU2011001 5
3 FJNU2011009 5
4 FJAU2011008 5
5 FJUT2011001 4
6 TJRAC2011001 4
7 FJAU2011021 4
8 NUIST2011006 3
9 FJAU2011006 3
10 FJAU2011002 3
11 FJNU2011005 3
12 FJAU2011020 3
13 FJNU2011006 3
14 FJUT2011011 3
15 FJNU2011007 3
16 FJAU2011012 3
17 FJUT2011008 3
18 SZU2011004 2
19 NUIST2011002 2
20 MJU2011014 2
21 SZU2011003 2
22 lfs 2
23 FJUT2011004 2
24 FJNU2011004 2
25 FJNU2011002 2
26 xingyunshi 2
27 FJUT2011009 2
28 FJUT2011003 2
29 FJAU2011015 2
30 maiyuetong 2
31 NUIST2011001 2
32 FJAU2011016 2
33 FJAU2011003 2
34 FJAU2011007 2
35 FJAU2011018 2
36 FJNU2011030 1
37 NUIST2011003 1
38 NUIST2011005 1
39 FJAU2011022 1
40 FJNU2011008 1
41 FJUT2011007 1
42 FJUT2011006 1
43 FJNU2011003 1
44 FJAU2011001 1
45 FJUT2011002 1
46 FJUT2011005 1
47 MJU2011027 1
48 SZU2011022 0
49 只想听音乐 0
50 MJU2011028 0
51 SZU2011001 0
52 MJU2011023 0
53 MJU2011001 0
54 FJAU2011009 0

姓名 账号
陈竞郴 FJAU2011001
程千兴 FJAU2011002
杜志伟 FJAU2011003
黄艳丽 FJAU2011004
李福杉 FJAU2011005
李光泽 FJAU2011006
李华均 FJAU2011007
李饶立 FJAU2011008
李绍江 FJAU2011009
林剑辉 FJAU2011010
林雪勇 FJAU2011011
林哲斌 FJAU2011012
卢丽娜 FJAU2011013
罗雄飞 FJAU2011014
彭秦中 FJAU2011015
邱一潮 FJAU2011016
沈炬 FJAU2011017
吴灿南 FJAU2011018
吴胜杰 FJAU2011019
谢荣祥 FJAU2011020
杨少群 FJAU2011021
郑志强 FJAU2011022
朱智佳 FJAU2011023
苏桂明 FJAU2011024
魏述文 FJAU2011025
韩明祥 FJAU2011026
陈开珉 FJAU2011027
陈贻劲 FJAU2011028
郑松波 FJAU2011029 朱智佳 100.000
李饶立 98.172
杨少群 95.804
李光泽 93.000
程千兴 89.820
谢荣祥 86.303
林哲斌 82.480
彭秦中 78.373
邱一潮 74.000
杜志伟 69.377
李华均 64.517
吴灿南 59.431
郑志强 54.128
陈竞郴 48.617
李绍江 10.000
黄艳丽 0.000
李福杉 0.000
林剑辉 0.000
林雪勇 0.000
卢丽娜 0.000
罗雄飞 0.000
沈炬 0.000
吴胜杰 0.000
苏桂明 0.000
魏述文 0.000
韩明祥 0.000
陈开珉 0.000
陈贻劲 0.000
郑松波 0.000

【提示】
(1)strstr(…)函数
包含文件:string.h
函数名: strstr
函数原型:extern char *strstr(char str1, const char str2);
语法:
strstr(str1,str2)
str1: 被查找目标 string expression to search.
str2: 要查找对象 The string expression to find.
返回值:若str2是str1的子串,则先确定str2在str1的第一次出现的位置,并返回此位置到str1末尾的所有字符;如果str2不是str1的子串,则返回NULL。(注:若想返回str2在str1第一次出现的位置,不是这个函数)
例子:
charstr[]=“1234xyz”;
char
str1=strstr(str,“34”);
cout<<str1<<endl; 输出结果: 34xyz

(2)sscanf (…)函数
sscanf() - 从一个字符串中读进与指定格式相符的数据。

在这里插入代码片
#include <stdio.h>
#include <string.h>
#include <math.h>

#define N0 100

struct node{
	int rank, ac; //rank-排名; ac-完成的题数
	char name[10], account[30]; //name-姓名; account[]-账号
	double score; //score-得分
}stu[N0];

struct node1{
	char name[10], account[30]; //name-姓名; account[]-账号
	bool atend; //是否参加了参加网赛
}acc[N0];

int n, num; //n-(榜单上)我校FJAU的参赛选手数目; num-姓名账号信息中我校选手的数目

/*读取输入数据的(上&下)两部分数据(名次+账号+完成题数)*/
void readData(){
	char s[150]; //s[]-字符数字,用于接收输入的一串字符

	/*(一)读取上部分数据(榜单)*/
	n = 0; //初始化: 榜单中, 我校(FJAU)参赛选手数目
	while( gets(s) != NULL ){
		//(1)若读取的字符串s中包含有"姓名"两个字, 则 --> 退出循环
		if( strstr( strupr(s), "姓名") != NULL ) { //若读到了账号信息
			break;
		}

		//(2)若读取的字符串s中包含没有"FJAU"几个字符, 则次参赛选手不是福建农林大学的学生 --> 略过此行
		if( strstr( strupr(s), "FJAU") == NULL ) {
			continue; //不是FJAU的参赛选手, 跳过...
		}

		n++; //参赛选手数目+1

		//sscanf(s, "%d%s%d", &stu[n].rank, stu[n].account, &stu[n].ac); //从字符串s中读取账号\完成题数
		sscanf(s, "%*d%s%d", stu[n].account, &stu[n].ac); //从字符串s中读取账号\完成题数(忽略不读第一个整数[排名])
	}

	/*(二)读取下部分数据(选手姓名+账号)*/
	num = 0; //初始化: 姓名账号信息中, 我校选手的数目
	while( gets(s) != NULL ){
		//(2)若读取的字符串s中包含没有"FJAU"几个字符, 则次参赛选手不是福建农林大学的学生 --> 略过此行
		if( strstr( strupr(s), "FJAU") == NULL ){
			continue;
		}

		num++; //参赛选手数目+1

		sscanf(s, "%s%s", acc[num].name, acc[num].account); //从字符串s中读取账号\完成题数(忽略不读第一个整数[排名])
	}
}

/*计算我校(FJAU)参赛选手的成绩*/
void cal(){
	int rank=0, i, j; //i,j-循环变量

	//[1]维护榜单中的FJAU队员的信息(1.拷贝姓名; 2.队内排名)
	//******************************************************
	for( i=1; i<=n; i++ ){ //遍历榜单中的FJAU选手(stu[i])
		for( j=1; j<=num; j++ ){ //遍历学号姓名中的FJAU选手(acc[j])
			if( strcmp( stu[i].account, acc[j].account ) == 0 ){ //若该FJAU选手(acc[j])上了榜单
				//(1)拷贝选手的姓名
				strcpy( stu[i].name, acc[j].name); 

				//(2)排名+1(第1,2,3...名)
				rank++; 
				
				//(3)计算选手的成绩. 若完成题数=0, 则成绩=10
				if( stu[i].ac == 0 ){ 
					stu[i].score = 10;
				}else{
					stu[i].score = 101 - rank*sqrt(rank);
				}
				
				//(4)队员名单中,  此选手(acc[j])有参赛且在榜单上
				acc[j].atend = true;

				//(5)榜单中的FJAU选手(stu[i]) 信息已更新完毕
				break;
			}
		}
	}
	//======================================================

	//[2]将那些没有在榜单上的FJAU队员的信息-->增加到榜单中
	//******************************************************
	for( j=1; j<=num; j++){
		if( !acc[j].atend ){ //此FJAU队员没有参赛(没在榜单中)
			n++; //队员数目+1

			strcpy(stu[n].name, acc[j].name); //拷贝队员的[姓名];
			//strcpy(stu[n].account, acc[j].account); //拷贝队员的[账号];
		}
	}
	//======================================================
}

/*打印输出学生的姓名和成绩(3位有效数字)*/
void printData(){
	int i;
	for( i=1; i<=n; i++){
		if( stu[i].name[0] != 0 ){
			printf("%s %.3f\n", stu[i].name, stu[i].score);
		}
	}
}

int main(){
	FILE *fp;
	if((fp=fopen("score.in", "r")) != NULL ){
		fclose(fp);  //存在的话,要先把之前打开的文件关掉
		
		freopen("score.in", "r", stdin);
		freopen("score.out", "w", stdout);
	}
	
	readData(); //读取上下两部分数据(榜单+姓名账号)
	
	cal();	//计算
	
	printData(); //打印输出学生的姓名和成绩(3位有效数字)

	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值