【CODEMATE】CMT0018:字母派对(party) 粤港澳信息学创新大赛 C++/Python 小学组/初中组/高中组 文件读写/字符串/逻辑运算/数组/列表 C/C++/Python解题思路

问题描述

知识点: 基础算法 简单模拟  上传者:CM01

  问题描述:

  小明是一个热爱字母的小学生,他喜欢研究字母的奇妙之处。最近,他发现了一种有趣的现象,并称之为“字母派对"。在这个字母派对中,字母按照特殊的规则进行着有趣的互动。规则是这样的:字符串中奇数位置(字符串的第1位、第3位、第5位.…)的字母都是“派对小伙伴",它们必须是小写英文字母;而偶数位置(字符串的第2位、第4位、第6位.….)的字母则是“派对大咖",它们必须是大写英文字母。 现在小明想要开一个真正热闹的字母派对,他需要你帮忙编写一个程序,判断给定的字符电是否适合成为字母派对的参与者。对于给定的多组测试数据,你需要分别判断每个字符串是否适合成为字母派对的参与者,并输出相应的结果。

  输入格式:

  从文件 party.in 中读入数据。

  第一行包含一个正整数 T,表示测试数据的组数。

  接下来的 T 行,每行包含一个字符串 S (长度|S|≤100,字符串只包含大小写英文字母),表示一个待判断的字符串。

  输出格式:

  输出到文件 party.out 中。

  对于每组测试数据,输出一行,包含一个字符串,表示给定字符串是否适合成为字母派对的参与者。 如果是,输出 Yes;如果不是,输出 NO。

  样例输入:

  输入数据 1

4
a
A
aAa
aba

  样例输出:

  输出数据 1

Yes
No
Yes
No

  样例解释

  对于第三组测试数据,因为第一位和第三位的 a 是小写字母,第二位的 A 是大写字母,因此适合成为字母派对的参与者。而第四组测试数据中,第二位的 b 是小写字母,因此不适合成为字母派对的参与者。

  数据范围

  对于100%的数据,满足 1≤T≤103,1≤|S|≤102


  
  

做题思路,解决过程

  这题的难点在于输入格式是由文件 party.in 中的数据格式决定的,文件 party.in 并没有直接提供给我们,但我们可以参考题目中的样例输入自己创建一个文件 party.in 。

  确定了输入文件 party.in,接着解决文件读写问题,读写时需要注意 “换行符” 的读写。

  除了文件读写,还需要对字符串进行操作,题目中要求奇数位为小写,偶数位为大写,对于字母大小写判断我第一张时间想到 ASCII 码表,大小写字母的 ASCII 值是有范围的,大写字母 65-90,小写字母 97-122。对于奇偶的判断就用 for 循环。

核心代码

C / C++ 文件读写

  读文件既可以一个一个字符读取 fgetc(FILE *stream),也可以读取一行字符串 fgets(char *str, int n, FILE *stream)

  除了文中方法判断奇偶位大小写,还可以使用 for() 循环逐个字符读取并判断,如果不符合规则则中断本行读取,直接读取下一行,可能这样会比较节省内存,这里只是提供另一种解题思路,大家伙可以自行尝试。

FILE *fin=fopen("party.in", "r");	// r 读文件
char str[101];	//读取文件字符串
FILE *fout=fopen("party.out", "w");	// w 写文件

//读文件
printf("读取文件结果:\n");
printf("读取单个字符:%c\n", fgetc(fin));	//读取单个字符 fgetc
fgetc(fin);   //读取 4 后换行符

/*
	读取 101 个字符 fgets,如果都到换行则结束,为什么是 101,因为题目 “数据范围” 有规定 1≤|S|≤10^2
	则字符有 100 个,加上行末的换行符 '\n' 就是 101 个字符
*/
printf("读取一行字符串(包括换行符):%s", fgets(str, 101, fin));

//写文件
fprintf(fout, "Yes\n");
fprintf(fout, "No\n");

  
  

  party.in、party.out 都是和代码放同一文件夹的,用的是 “相对路径”
c文件位置


  
  

  party.in 文件
party.in文件


  
  

  读取结果:可以看出字符串 “a” 的后面是有换行的,记住这个换行,后面要处理掉它
c读取结果


  
  

  写入结果 party.out :
c写入结果


  
  

C / C++ 判断奇偶字母大小写

  整体思路:

  读取文件字符串时会把换行符也当作一个字符,在获取字符串长度应注意实际值需要 -1。

  1.先判断奇数位字母是否全小写:如果其中一个字母不是小写,则余下的字符(包括偶数位字母)都不用判断,字符串不符合 “奇数位小写”,返回 “No”;如果奇数位都是小写,则需要结合偶数位是否全大写的结果在返回 “Yes / No”;

  2.判断偶数位字母是否全大写:如果其中一个字母不是大写,则余下的偶数位字符都不用判断,字符串不符合 “偶数位大写”,返回 “No”;如果奇数位都是小写、偶数位都是大写则返回 “Yes”。

  发现了没有,返回 “Yes” 则奇数位与偶数位同时成立,返回 “No” 则奇数位与偶数位任一不成立,返回结果符合 “逻辑与” 运算。则写代码的时候添加 “奇数位标志”、“偶数位标志”,“奇数位标志” 或 “偶数位标志” 为 “0” 则退出判断,返回 “No”;“奇数位标志” 和 “偶数位标志” 同时为 “1” 则返回 “Yes”。

char str[3]="aAa";	//以字符串 aAa 为例(注意这里没有换行符),可以自行修改字符串以及添加换行符测试
char jishu=1, oushu=1;

//打印字符串
printf("%s\n", str);

// 判断奇数位小写
for(int j=0; j<strlen(str); j+=2)	//如果字符串包含换行符则需要 j<strlen(str)-1
{
   
   
    if(jishu && str[j]<=90)
    {
   
   
        jishu=0;
        break
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值