C语言PAT刷题 - 1009 说反话
作者的话:若有朋友复制代码去PAT试着运行遇到问题的:
1.可能是格式问题,可以先把从本站复制的代码粘贴到记事本,再把记事本里的代码复制,然后粘贴到PAT的代码区,提交本题回答,应该就可以了;
2.可能是注释原因,PAT有时候检测到注释会编译错误,所以可以先把注释删了,再进行提交回答。
3.可能是作者当初根据题目写出来的代码仍存在一些疏漏,而恰好当时的测试机制没那么完善,没检测出问题。后面测试机制有所更新,故出现问题,若有相关需要的可以评论区留言或私信作者,我看到的话会去再查一下疏漏之处,然后更新文章。
一、题目描述
给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。
输入格式:
测试输入包含一个测试用例,在一行内给出总长度不超过 80 的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用 1 个空格分开,输入保证句子末尾没有多余的空格。
输出格式:
每个测试用例的输出占一行,输出倒序后的句子。
输入样例:
Hello World Here I Come
输出样例:
Come I Here World Hello
二、解题思路
读题:
接收一串总长度不超过80的字符串(字符串为单词+空格+单词+…的形式),将单词的排列顺序颠倒输出。
思路:
1.定义需要的变量(实际解题时是先定义认为需要用到的变量,后面遇到问题需要新定义变量时再回到上头来定义新的变量),利用循环从键盘接收整个字符串存储在字符数组a中;
2.利用循环和判断语句从后往前遍历整个字符数组,以空格和换行符为判断条件,打印空格和空格之间、空格和换行符之间的一连串字符(因为是从后往前遍历,所以打印顺序是先打印最后一个单词,再打印前面一个单词,以此类推)。打印完一个单词后,再打印一个空格字符;
3.打印字符串的第一个单词(字符串的第一个单词由于并不被空格、字符串包围,所以思路2并不会打印第一个单词)。
三、具体实现
0.标准C源程序框架
#include <stdio.h>
int main()
{return 0;
}
1.定义需要的变量(实际解题时是先定义认为需要用到的变量,后面遇到问题需要新定义变量时再回到上头来定义新的变量),利用循环从键盘接收整个字符串存储在字符数组a中;
char a[82];int i = 0;int j = 0;do{scanf("%c",&a[i++]);} while (a[i-1] != '\n');
2.利用循环和判断语句从后往前遍历整个字符数组,以空格和换行符为判断条件,打印空格和空格之间、空格和换行符之间的一连串字符(因为是从后往前遍历,所以打印顺序是先打印最后一个单词,再打印前面一个单词,以此类推)。打印完一个单词后,再打印一个空格字符;
for (; i > 0; i--){if (a[i - 1] == ' '){j = i;while ((a[j]!=' ')&&(a[j]!='\n')){printf("%c", a[j++]);}printf(" ");}}
3.打印字符串的第一个单词(字符串的第一个单词由于并不被空格、字符串包围,所以思路2并不会打印第一个单词)。
while ((a[i] != ' ') && (a[i] != '\n')){printf("%c", a[i++]);}
四、全部代码
#include <stdio.h>
int main()
{//目标:hello world\n -> world hello//我最先想到的是创建二维数组a[80][80],一行代表一个单词,可是数组内容学的不到家,弄了半天没弄好,只能回归一维数组char a[81];//后面接收字符串时,会存储输入的一连串字符加回车字符,所以考虑最坏的情况,数组必须能存储81个字符int i = 0;//循环变量,挺多地方用到的int j = 0;do{scanf("%c",&a[i++]);//一轮循环接收一个字符,直到接收到换行符,循环结束,此时i的值比接收了换行符的元素的下标大1} while (a[i-1] != '\n');for (; i > 0; i--)//从后往前遍历{if (a[i - 1] == ' ')//当当前元素的前面一个元素是空格时,执行分支{ //这个分支用来将空格和空格/换行符之间的一连串字符(单词)和空格打印出来j = i;//打印完一个单词后,i还要继续向前遍历,所以要保留i的值,但又要打印后面几位元素的值while ((a[j]!=' ')&&(a[j]!='\n'))//所以我们用j复制i的值,用j来打印后面几位元素的值{ //while循环,除非a[j]为空格/换行符,否则一直执行循环体,逐个打印空格后面的字符printf("%c", a[j++]);}printf(" ");//用来打印一个单词的循环结束,根据题意需要打印一个空格}}while ((a[i] != ' ') && (a[i] != '\n')){printf("%c", a[i++]);}return 0;
}
五、优化代码
PAT上很多题目被我以前老师拿来给我们布置作业,可惜那个时候我不认真,代码都是网上复制粘贴的。接下来这个代码就是我以前拷贝来的,出处已经找不到了,但我觉得比我写的更有水平,拿出来给大家参考一下。
#include <stdio.h>
int main()
{char a[80][80];//定义二维数组,后面会一行存储一个单词int i = 0;do {scanf("%s", a[i++]);//scanf("%s")遇到空白符(空格,tab,\n)会停止接收,并且空格留在输入缓存区中} while (getchar()!='\n');//getchar()用于接收空格,当它接收到换行符时说明字符串输入结束,故终止循环while (--i)//当前a[i]在最后一个单词所在行的后面一行,是一个空白行,所以需要先自减,再使用i打印最后一个单词,然后依次往前{printf("%s ",a[i]);}printf("%s", a[i]);//当i为0时(a[0]为第一个单词所在行)上述循环结束,并没有打印第一个单词,所以在这里打印return 0;
}
C语言PAT刷题 - 1009 说反话相关推荐
- C语言PAT刷题 - 1020 月饼
作者的话:若有朋友复制代码去PAT试着运行遇到问题的: 1.可能是格式问题,可以先把从本站复制的代码粘贴到记事本,再把记事本里的代码复制,然后粘贴到PAT的代码区,提交本题回答,应该就可以了: 2.可 ...
- C语言PAT刷题 - 1019 数字黑洞
作者的话:若有朋友复制代码去PAT试着运行遇到问题的: 1.可能是格式问题,可以先把从本站复制的代码粘贴到记事本,再把记事本里的代码复制,然后粘贴到PAT的代码区,提交本题回答,应该就可以了: 2.可 ...
- C语言PAT刷题 - 1027 打印沙漏
作者的话:若有朋友复制代码去PAT试着运行遇到问题的: 1.可能是格式问题,可以先把从本站复制的代码粘贴到记事本,再把记事本里的代码复制,然后粘贴到PAT的代码区,提交本题回答,应该就可以了: 2.可 ...
- C语言PAT刷题 - 1023 组个最小数
作者的话:若有朋友复制代码去PAT试着运行遇到问题的: 1.可能是格式问题,可以先把从本站复制的代码粘贴到记事本,再把记事本里的代码复制,然后粘贴到PAT的代码区,提交本题回答,应该就可以了: 2.可 ...
- C语言PAT刷题 - 1032 挖掘机技术哪家强
作者的话:若有朋友复制代码去PAT试着运行遇到问题的: 1.可能是格式问题,可以先把从本站复制的代码粘贴到记事本,再把记事本里的代码复制,然后粘贴到PAT的代码区,提交本题回答,应该就可以了: 2.可 ...
- C语言百日刷题第七天
C语言百日刷题第七天 61. 写一个函数isPowerOfTwo判断是不是2的幂次方 62. 写一个函数isPowerOfThree判断是不是3的幂次方 63.n 的第 k 个因子 64.有效的完全平 ...
- PAT刷题之乙级1033 旧键盘打字
目录 PAT刷题之乙级1033(cpp) 题目描述 输入格式 输出格式 输入样例 输出样例 问题分析 代码实现 运行实现 PAT刷题之乙级1033(cpp) 题目描述 旧键盘上坏了几个键,于是在敲一段 ...
- C语言百日刷题第二天
C语言百日刷题第二天 11. 统计输入数据的正负个数 12.学生基本信息输入输出 13.杨辉三角的前n行 14.模拟用户登录情景 15.演示多个字符从两端移动,向中间汇聚 16.计算短信费用 17.编 ...
- C语言百日刷题第十三天
前言 今天是刷题第13天,放弃不难,但坚持一定很酷~ 临近期末,再刷一套模拟题 C语言百日刷题第十三天 前言 选择题 判断题 编程题 选择题 1.若由定义int*p1,*p2,m=5,n;以下赋值语句 ...
最新文章
- 计算机系统崩溃重新装机,当计算机系统崩溃时如何用U盘重新安装Win7系统
- pickle与cpickle的用法
- 如何让touchmove之后不触发touchend的事件
- ITextSharp导出PDF表格和图片(C#)
- oracled update_oracle中要谨慎使用update交叉更新!
- diy gps for mio 686
- 盛大 传奇 的网游启示录
- truncate table(截断表)
- linux下这输入法切换大小写,Life With Arch:让Capslock成为输入法切换快捷键
- 用python实现PR对视频处理的基本操作
- 计算机一级exc除法函数,excel除法函数 excel除法如何表示
- 幼儿园网络图怎么绘制_幼儿园主题网络图的绘制要注意什么
- [CSP-S模拟测试]:赤壁情(DP)
- ​分享 17 款你可能会用的上 Chrome 插件
- 企业微信批量导入用户
- 进制为2的10次方的世界
- 我的世界服务器显示弹幕,[娱乐]RaiixDM —— 在mc中接收b站直播弹幕[1.12.x-1.15.x]...
- RGB接口屏和SPI接口屏的引脚
- 01 KVM虚拟化简介
- Android手机中获取手机号码和运营商信息