[uva 12412]A Typical Homework(师兄帮帮忙)

这篇博客讲述了作者在解决UVA 12412编程问题时遇到的挑战,包括处理精度问题、防止除以0的错误,以及在代码实现中遇到的困难。尽管遇到挫折,作者仍决定以此作为博客的起点。
部署运行你感兴趣的模型镜像

不得不说,这一题有点6,主要有精度控制和计算平均数时不能除以0这些细节要注意,然而我是跪在了排名函数上,代码略凌乱,希望大家不要介意,就让这题作为我博客的开始吧.

#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
#include<iostream>
using namespace std;
const double EPS=1e-5;
struct point
{
    int chi,ma,eng,code,flag,sum,cid;
	string s,sid;
	point(int a=1):flag(a){}
};
vector<point> total;
bool compare(point a,point b)
{
	return a.sum<b.sum;
}
void print()
{
	printf("Welcome to Student Performance Management System (SPMS).\n\n");
	printf("1 - Add\n2 - Remove\n3 - Query\n4 - Show ranking\n5 - Show Statistics\n0 - Exit\n\n");
}

void add()
{
	for(;;)
	{  
	  int i,j,k=0;
	  point l;
	  printf("Please enter the SID, CID, name and four scores. Enter 0 to finish.\n");
	  cin>>l.sid;
	  if(l.sid=="0")break;
	  cin>>l.cid>>l.s>>l.chi>>l.ma>>l.eng>>l.code;
	  l.sum=l.chi+l.ma+l.eng+l.code;
	  for(i=0;i<total.size();i++)
      if(total[i].sid==l.sid && total[i].flag!=0)
	  {
	    k=1;
	  	break;
	  }
	  if(k==0){total.push_back(l);}
	    else printf("Duplicated SID.\n");
	}
}

int rank(point x)
{
    int sum=1;
    for(int i=0;i<total.size();i++)
    if(total[i].flag!=0 && x.sum<total[i].sum)sum++;
    return sum;
}
void DAQ(int flag)
{
	string s;
	int i,j=1,r;
	for(;;)
	{
	  printf("Please enter SID or name. Enter 0 to finish.\n");
	  cin>>s;
	  if(s=="0")return;
	  r=0;
	  for(i=0;i<total.size();i++)
	  if(total[i].flag)
	  {
  	    point &l=total[i];                          
	  	if(l.flag!=0 && ((l.s==s) || (l.sid==s)))
		{
			if(flag==1)
			{
				cout<<rank(l)<<' '<<l.sid<<' '<<l.cid<<' '<<l.s<<' '<<l.chi<<' '<<l.ma<<' '<<l.eng<<' '<<l.code<<' '<<l.sum<<' ';
				printf("%.2lf\n",l.sum/4.0+EPS);
			}
			else {l.flag=0; r++;}
		}
	  }  
	  if(!flag)printf("%d student(s) removed.\n",r);
	}
}
void writeln()
{
	int i,h,l1,len=0;
	double j;
	int a[10],b[10],ans[10];
	printf("Please enter class ID, 0 for the whole statistics.\n");
	cin>>h;
	memset(a,0,sizeof(a));
	memset(b,0,sizeof(b));
	memset(ans,0,sizeof(ans));
	for(i=0;i<total.size();i++)
	if(total[i].flag!=0 &&(total[i].cid==h || h==0))
	{
		point &l=total[i];
		int j=0;
		if(l.chi>=60){j++;a[1]++;}
		if(l.ma>=60){j++;a[2]++;}
		if(l.eng>=60){j++;a[3]++;}
		if(l.code>=60){j++;a[4]++;}
		b[1]+=l.chi; b[2]+=l.ma; b[3]+=l.eng; b[4]+=l.code;
		len++;
		ans[j]++;
	}
	for(i=1;i<=4;i++)
	{
		if(i==1)printf("Chinese\n");
		  else if(i==2)printf("Mathematics\n");
		    else if(i==3)printf("English\n");
		      else printf("Programming\n");
        if(len==0)j=0;
         else j=(b[i]*1.0)/len+EPS;
		printf("Average Score: %.2lf\n",j);
		printf("Number of passed students: %d\nNumber of failed students: %d\n\n",a[i],len-a[i]);
	}
	printf("Overall:\n");
	printf("Number of students who passed all subjects: %d\n",ans[4]);
	printf("Number of students who passed 3 or more subjects: %d\n",ans[3]+ans[4]);
	printf("Number of students who passed 2 or more subjects: %d\n",ans[3]+ans[4]+ans[2]);
	printf("Number of students who passed 1 or more subjects: %d\n",ans[1]+ans[2]+ans[3]+ans[4]);
	printf("Number of students who failed all subjects: %d\n\n",ans[0]);
} 
int main()
{
	int change;
	for(;;)
	{
		print();
		scanf("%d",&change);
		if(change==0)break;
		if(change==1)add();
		if(change==2)DAQ(0);
		if(change==3)DAQ(1);
		if(change==4)printf("Showing the ranklist hurts students' self-esteem. Don't do that.\n");
		if(change==5)writeln();
	}
	return 0;
}


您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

典型的验证环境通常包含以下几个主要组成部分及其功能: ### 待测设计(DUT, Design Under Test) 这是验证的核心对象,即需要被验证的硬件模块或系统。例如在之前提到的Verilog代码示例中,`adder`模块和`simple_system`模块就是待测设计,它们实现了具体的功能,像`adder`模块实现了加法运算功能,`simple_system`模块则是一个包含加法器的简单系统,实现了更复杂的系统级功能。 ### 激励生成器(Stimulus Generator) 激励生成器负责产生输入信号,模拟各种可能的输入场景,以测试DUT的功能。在模块级验证的测试平台`tb_adder`中,通过`initial`块对输入信号`a`和`b`进行赋值,产生不同的输入组合,如`a = 4'b0000; b = 4'b0000;` 以及后续的`a = 4'b0001; b = 4'b0010;`等,这就是在生成激励信号。在系统级验证的测试平台`tb_simple_system`中,同样通过`initial`块对输入信号`data_in1`和`data_in2`进行赋值,同时还通过`initial`块产生时钟信号`clk`,模拟系统的时钟环境,为DUT提供更真实的输入激励。 ### 监控器(Monitor) 监控器用于收集DUT的输入和输出信号,记录测试过程中的数据,以便后续分析。虽然在上述Verilog代码示例中没有显式的监控器代码,但在实际的验证环境中,会添加相应的代码来捕获和记录`adder`模块的输入`a`、`b`和输出`sum`,以及`simple_system`模块的输入`data_in1`、`data_in2`、`clk`和输出`result`等信号,用于后续的功能检查和性能分析。 ### 参考模型(Reference Model) 参考模型是一个已知正确的模型,用于与DUT的输出进行比较,以判断DUT的功能是否正确。在简单的验证场景中,可能不需要参考模型,直接通过观察输出信号是否符合预期来判断。但在复杂的系统中,参考模型可以提供一个准确的输出结果作为比较基准。例如在一个复杂的处理器系统验证中,参考模型可以模拟处理器的指令执行流程和数据处理逻辑,将其输出与实际DUT的输出进行对比,以发现潜在的功能错误。 ### 检查器(Checker) 检查器将DUT的输出与参考模型的输出或预期结果进行比较,判断DUT是否通过测试。在实际的验证代码中,会添加相应的比较逻辑,如使用`assert`语句来检查输出信号是否符合预期。例如,如果预期`adder`模块在输入`a = 4'b0001`和`b = 4'b0010`时输出`sum`为`5'b00011`,可以使用`assert`语句进行检查: ```verilog assert(sum == 5'b00011) else $error("Adder output is incorrect!"); ``` ### 计分板(Scoreboard) 计分板用于记录测试结果,统计通过和失败的测试用例数量,以及分析测试覆盖率等信息。在大型的验证项目中,计分板可以帮助验证人员快速了解验证的进展和质量,判断是否需要增加更多的测试用例来提高验证覆盖率。虽然在上述简单的Verilog代码示例中没有体现计分板的功能,但在实际的验证环境中,会添加相应的代码来实现计分板的功能。 ### 测试平台(Testbench) 测试平台是将上述各个组成部分组合在一起的框架,为DUT提供一个完整的验证环境。在之前的Verilog代码示例中,`tb_adder`和`tb_simple_system`就是测试平台,它们分别将激励生成、DUT实例化等功能组合在一起,实现了模块级和系统级的验证。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值