uva -- 10194 - Football (aka Soccer)

本文分享了一位程序员在解决UVA排序检索问题时遇到的各种编译和运行时错误,并详细介绍了从读入字符串到最终AC的过程。文章强调了自我实现关键函数的重要性、数组越界警告的处理、数据类型处理的细节以及如何避免粘贴代码导致的错误。同时,文章提供了代码示例和优化建议,旨在帮助初学者避免常见陷阱。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这道题,做得我内牛满面,满脸春光淡退去,只剩下惆怅无限,我从编译错误到达了答案错误,由答案错误又走到运行时错误,再到格式错误,最后终于ac了,这人生也忒多姿多彩了有木有啊,如果有一天,有哪位骚年,莅临此地,希望能一解你心中对此题的困惑,我做题的方法没什么特殊的技巧,最最朴实基础,却坎坷无数啊!类似这种 排序-检索 问题,无非是读入字符串,截出字符串,比较字符串,排序字符串,输出字符串。

从一开始,我得到了编译错误,该死的uva不认识stricmp函数(不区分大小写的比较但有人说strcasecmp函数可以使用)和strrev(反转函数)于是乎我自己编写了stricmp函数和完成反转,另外,用gets的同胞千万注意数组越界的事情,编译器一遇gets一堆堆警告,看到警告千千万万别熟视无睹,要做到心里有数,问心无愧。

答案错误让我好找啊~先讲下我的思路:

我将字符串队名从读入的一行中截出,以‘#’为界,取‘#’后面字母装换为数字,暂时存储

另一个队从后往前操作,最后进行反转,我第一个错误,没注意到分数的范围是20分以下,也就是说我当时所存的数都只是一位数,其实可以有两位,于是我在c1 = g[i+1] - '0';后加了条语句 if(g[i+2] != '@')   c1 = c1 * 10 + (g[i+2] - '0');。第二处错误是排序时最后按字母排序不分大小写,这题目木有明确的说明,我是看网上大家说了才找到,第三处错误,是我自己改变数据后测试出来的,原因是倒转的c2 不是c2 = c2 * 10 + (g[j-2] - '0'); 而是c2 = c2 + (g[j-2] - '0') * 10;(因为是反过来的)

for(int i = 0;;i++)
{
	if(g[i] == '#') 
	{
		ch1[i] = '\0';
		c1 = g[i+1] - '0';
		if(g[i+2] != '@')
			c1 = c1 * 10 + (g[i+2] - '0');
		break;
	}
	ch1[i] = g[i];
}
int s = strlen(g) - 1;
	for(int j = s;; j--)
	{
		if(g[j] == '#') 
		{
			ch2[s - j] = '\0';
			c2= g[j-1] - '0';
			if(g[j-2] != '@')
				c2 = c2 + (g[j-2] - '0') * 10;
			break;
		}
		ch2[s - j] = g[j];
	}
吃一蛰长一智,我劝各位以后尽量不要看类似的代码只要改些地方就可以了而去粘贴,尽量自己手写,不然有错很难发现,这是我的经验,是血的教训。

另外,最后输出不留空格,祝大家顺利ac

我的代码:

#include<iostream>
#include<algorithm>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
int stricmp(char * a,char * b)//不分大小写比较函数
{
	if(!strcmp(a,b)) return 0;
	else
	{
	int i,j;
	char a1[35],b1[35];
	for(i = 0; i < strlen(a); i++)
		a1[i] = tolower(a[i]);
	a1[i] = '\0';
	for(j = 0; j < strlen(b); j++)
		b1[j] = tolower(b[j]);
	b1[j] = '\0';
	return strcmp(a1,b1);
	}
}
struct Team{
	char ch[35];
	int points;
	int games;
	int wins;
	int ties;
	int losses;
	int goal_difference;
	int goal_scord;
	int goal_against;
}team[35];
char g[75],ch1[35],ch2[35];
void clean(Team * p,int t)
{
	for(int i = 0;i < t;i++)
	{
		p[i].wins = 0;
		p[i].goal_scord = 0;
		p[i].goal_against = 0;
		p[i].ties = 0;
		p[i].losses = 0;
		p[i].games = 0;
	}
}//将数据清零函数
bool cmp(Team a,Team b)
{
	if(a.points == b.points)
	{
		if(a.wins == b.wins)
		{
			if(a.goal_difference == b.goal_difference)
			{
				if(a.goal_scord == b.goal_scord)
				{
					if(a.games == b.games)
					{
						 if(stricmp(a.ch,b.ch) < 0)
							 return true;
						 return false;
					}
					return a.games < b.games;
				}
				return a.goal_scord > b.goal_scord;
			}
			return a.goal_difference > b.goal_difference;
		}
		return a.wins > b.wins;
	}
	return a.points > b.points;
}//排序函数
int main()
{
	char get[105];
	int n;
	cin >> n;
	getchar();
	while(n--)
	{
		int T,G,c1,c2;
		gets(get);//锦标赛名称
		cin >> T;//几个队伍
		getchar();
		for(int i = 0; i < T; i++)
			gets(team[i].ch);
		clean(team,T);
		cin >> G;//几场比赛
		getchar();
		while(G--)
		{
			gets(g);
			for(int i = 0;;i++)
			{
				if(g[i] == '#') 
				{
					ch1[i] = '\0';
					c1 = g[i+1] - '0';
					if(g[i+2] != '@')
						c1 = c1 * 10 + (g[i+2] - '0');
					break;
				}
				ch1[i] = g[i];
			}//正向截取信息
			int s = strlen(g) - 1;
			for(int j = s;; j--)
			{
				if(g[j] == '#') 
				{
					ch2[s - j] = '\0';
					c2= g[j-1] - '0';
					if(g[j-2] != '@')
						c2 = c2 + (g[j-2] - '0') * 10;
					break;
				}
				ch2[s - j] = g[j];
			}//反向截取信息
			s = strlen(ch2);
			for(int i = 0; i < s/2; i++)
			{
				char t = ch2[i];
				ch2[i] = ch2[s - i-1];
				ch2[s - i - 1] = t;
			}//反转
			for(int i = 0;;i++)
			{
				if(!stricmp(ch1,team[i].ch))
				{
					team[i].games += 1;
					team[i].goal_scord += c1;
					team[i].goal_against += c2;
					if(c1 > c2) team[i].wins += 1;
					else if(c1 == c2) team[i].ties += 1;
					else team[i].losses += 1;
					break;
				}
			}
			for(int i = 0;;i++)
			{
				if(!stricmp(ch2,team[i].ch))
				{
					team[i].games += 1;
					team[i].goal_scord += c2;
					team[i].goal_against += c1;
					if(c1 < c2) team[i].wins += 1;
					else if(c1 == c2) team[i].ties += 1;
					else team[i].losses += 1;
					break;
				}
			}//记录进team
		}
		for(int i = 0; i < T; i++)
		{
			team[i].points = team[i].wins * 3 + team[i].ties;
			team[i].goal_difference = team[i].goal_scord - team[i].goal_against;
		}
		sort(team,team + T,cmp);//排序
		int rank = 0;
		cout << get << endl;
		for(int i = 0; i < T; i++)//输出
			cout << ++rank << ") " << team[i].ch << ' ' << team[i].points
			<< "p, " <<  team[i].games << "g (" << team[i].wins << '-' << team[i].ties
			<< '-' << team[i].losses << "), " << team[i].goal_difference << "gd (" 
			<< team[i].goal_scord << '-' << team[i].goal_against << ')' <<endl;
		if(n) cout << endl;
	}
	//getchar();
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值