本文出处:http://blog.csdn.net/svitter
原题:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2411
题意:给你一个串,让你依据那个串来输出ppi。坑特别多。ppi的计算方法是dp / inches; dp = sqrt(wp*wp + hp * hp);
现在我来说说这个题目有多坑:
给你的串的格式是这样:
name + inches+ "inches" + num * num + Type;
编译原理最近没有好好学,之后有时间我会把这个式子的文法表示形式写出来给大家看一下,现在用语言来描叙把;
1.首先name中可以还有"inches",不一定因为出现了"inches"就会停止输入数据;
2.inches可以是0,这个是0的概念很深刻。一个double型的树,一旦小于1e-9就可以说是0;
3.Type需要进行大小写转换,然而这个转换是只有大写字母转换成小写字母,小写字母本身是不改变的;
4.name中的单词间如果有多个空格,保留一个空格就可以了。
5.求sqrt记得/10防止超精度。
6.不必在意那些空格- -,在意单词就可以。这个题目十有八九是一个编译原理搞多了的老师出的。词法分析语法分析你要是学的好应该能跟上前辈的思路。但是学的不好像我这样的半天搞不明白他这所谓的格式究竟是个神马意思。非常欢迎大家回复,找出自己之前考虑到的情况结果测试数据完全不考虑。呵呵。
什么都不说了,全是泪,帖代码。
7.对于读入整个串,最后面\n的问题如何处理可以采用如下方式。借鉴了大神的代码。大神的blog我找不到了。。= =
#include <iostream>
#include <stdio.h>
#include <cstring>
#include <cmath>
using namespace std;
char str[1000][1000];
char type[1000];
//本题目使用scanf巧妙分段,将不同数据保存在不同的数组中,受教了。
void ace()
{
int t, i, j;
scanf("%d", &t);
int no, apart, n;
double inches, wp, hp, dp, ppi;
char ch;
for(no = 1; no <= t; no++)
{
n = 0;
ch = '\0';
while(ch != '\n')
{
scanf("%s%c", str[n], &ch);
if(!strcmp(str[n], "inches"))//记录inches的位置
apart = n;
n++; //n为串数
}
sscanf(str[apart-1],"%lf", &inches);
sscanf(str[apart+1],"%lf*%lf", &wp, &hp);
//output type
i = apart + 2;
while(i <= n)
{
for(j = 0; str[i][j] != '\0'; j++)
{
if(str[i][j] >= 'A' && str[i][j] <= 'Z')
str[i][j] = str[i][j] + 'a' - 'A';
}
i++;
}
i = apart + 2;
printf("Case %d: The %s ", no, str[i]);
i++;
while(i < n)
{
printf("%s ", str[i]);
i++;
}
printf("of ");
//output name
for(i = 0; i <= apart - 2; i++)
{
if(i != apart - 2)
printf("%s ", str[i]);
else
printf("%s", str[i]);
}
//防止超精度
dp = 10 * sqrt(wp * wp / 100 + hp * hp / 100 );
if(inches <= 1e-9)
ppi = 0;
else
ppi = dp / inches;
printf("'s PPI is %.2lf.\n", ppi);
//printf case
}
}
int main()
{
ace();
return 0;
}