初学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) //①
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)
题目:在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)
相关文章推荐
- 初学acmer--《算法竞赛经典入门》笔记(九) P52-53
- 初学acmer--读《算法竞赛入门经典》笔记(一)P12-23
- 初学acmer--读《算法竞赛入门经典》笔记 p110-111 Uva101
- 初学acmer--读《算法竞赛入门经典》笔记(11)P61-65
- 初学acmer--《算法竞赛经典入门》第二章2.5 习题自己的解答
- 初学acmer--读《算法竞赛入门经典》笔记(五)P41-45
- 初学acmer--《算法竞赛入门经典》笔记(十)P54-56
- 初学acmer--读《算法竞赛入门经典》笔记(三)p27-34
- 初学acmer--读《算法竞赛入门经典》笔记(二) p25-27
- 初学acmer--《算法竞赛经典入门》读书笔记(暴力专题)P182
- JQuery的初学笔记——和原生JS的区别
- [1]:cocos2dx初学笔记
- NS2初学笔记(三)之 最详细讲解ns2运行机制
- python 初学笔记(待更新)
- 初学存储引擎笔记
- GIT初学的学习笔记
- JS初学笔记之一:JavaScript中 || 返回什么?
- 初学jquery之自学笔记(2)
- java笔记——初学面向对象08匿名内部类
- spring web flow初学笔记