您的位置:首页 > 其它

初学acmer--读《算法竞赛经典入门》笔记(六)p45-48

2017-08-08 10:53 211 查看
1,TeX中的引号(Tex Quotes,UVa 272)

题目:在TeX中,左引号是“"”,右引号是“"”。输入一篇包含双引号的文章,你要把它转化为TeX的格式

样例输入:

"To be or not to be,"quoth the Bard,"that is the question".

样例输出;

“To be or not to be,”quoth the Bard,“that is the question”.

分析:对于字符串的输入,一般有两种方式,一是一次性全部存进去,二是一个一个存进去。针对本题,显然采用第二种比较好

下面贴代码:

#include<stdio.h>
int main() {
int c, q = 1;
while((c = getchar()) != EOF) //①
{
if(c == '"') { printf("%s", q ? "``" : "''"); q = !q; }    //②
else printf("%c", c);
}
return 0;
}
PS:①:getchar()用来读取单个字符
            fgetc(fin)  读取一个打开的文件fin,读取一个字符,然后返回一个int值(特别的,若fin=stdin,即键盘的文件指针,fgetc(stdin)就等同于getchar())

           fgets(buf,maxn,fin)从文件fin中读取完整一行,但读取最多maxn-1个字符(最后在末尾加上结束符“\0”),同fgetc一样,其实fgets也有一个“标准输入版”gets,但由于gets因为没有最大读取数,可能会造成溢出,所以在c11中已被废除

     ②这个是条件运算符,等同于一个“非此即彼”的if语句

2.WERTYU(WERTYU,UVa10082)

题目:在键盘上,有时会右错一位,Q变为W,J变为K。输入一个错位后敲出的字符串(所有字母均大写),输出正确的字符串。输入保证合法(例如不会出现A)

样例输入:

O S, GOMR YPFSU/

样例输出:

I AM FINE TODAY.

分析:这题和上一题一样,都是每输入一个字符,都可以直接输出一个字符,因此getchar是理想方法。问题在于:如何进行输入输出的变换呢?第一反应就是用if语句或者switch语句,但是操作起来很麻烦。有一种比较好的方法就是利用常量数组,下面贴上代码:

#include<stdio.h>
char s[] ="`1234567890-=QWERTYUIOP[]\\ASDFGHJKL;'ZXCVBNM,./";
int main()
{
int i,c;
while((c=getchar())!=EOF)
{
for(i=1;s[i]&&s[i]!=c;i++); //①
if(s[i]) putchar(s[i-1]);
else putchar(c);
}
return 0;
}PS:   ①首先得找出错位后的字符的位置,然后才能纠正它,输出正确的字符,但是再仔细一想,还存在一种可能,就是输入的字符不在字符数组中(如空格),这种情况的话,肯定是在字符数组中找不到的,找不到的话,最后s[i]肯定是字符数组中的最后一个字符‘\0’,即结束符。那么就可以借此作为判断输入的字符在不在字符数组中的依据(类似于判断质数函数中,判断是否正常跳出循环),当然,也不要忘记for语句判断语句中要加上s[i],否则循环无法终止
        ②除此以外,常量数组还有其他用法,即数组下标与数组中存储的内容存在对应关系,放在本题,就是对于任意字符,s[c]就为c“左边”的字符(具体可以参加后面笔记的生成元UVa 1583)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: