代码

2025年12月12日
// 万能头文件:包含C++所有标准库(无需单独引入queue、iostream、cstring等)
// 优点:简化代码编写;缺点:编译体积稍大,适用于算法竞赛/课堂练习场景
#include <bits/stdc++.h>
// 字符串操作专用头文件(虽然万能头已包含,此处单独引入是为了明确依赖,兼容纯C环境)
#include <cstring>
// 使用std命名空间:简化代码书写,避免重复写std::前缀(如std::cin -> cin)
using namespace std;

// 主函数1:核心功能是「忽略大小写+忽略空格」比较两个字符串是否一致
// 程序运行时默认执行此main函数(C++中只能有一个可执行的main函数)
int main(){
	// 定义两个字符数组,用于存储输入的原始字符串,长度100表示最多存储99个有效字符(末尾留1个存字符串结束符'\0')
	char s1[100],s2[100];
	// cin.getline():读取一整行字符串(包含空格),直到遇到换行符为止,避免cin默认以空格/制表符分割字符串的问题
	// 第一个参数是字符数组名,第二个参数是数组长度,防止输入超出数组范围导致溢出
	cin.getline(s1,100);
	cin.getline(s2,100);
	
	// strlwr函数:C语言字符串操作函数,功能是将字符数组中的所有大写字母(A-Z)转换为小写字母(a-z)
	// 注意:strupr函数是其反向操作,将所有小写字母转换为大写字母
	strlwr(s1);
	strlwr(s2);
	
	// 注释代码:用于调试查看转换小写后的字符串内容
	// cout<<s1<<endl<<s2; 
	
	// 定义两个新的字符数组,用于存储「去除空格后」的字符串
	char new1[100],new2[100];
	// 定义两个索引变量,用于记录new1、new2数组的有效字符位置(初始化为0,表示从数组第1个位置开始存储)
	int i1 =0,i2=0;
	
	// 遍历第一个原始字符串s1,去除其中的所有空格
	// strlen(s1):计算字符串s1的有效长度(不包含末尾的'\0'),作为循环终止条件
	for(int i = 0;i<strlen(s1);i++){
		// 判断当前字符是否不是空格
		if(s1[i]!=' '){
			// 将非空格字符存入new1数组的第i1个位置
			new1[i1]=s1[i];
			// 索引i1自增,为下一个非空格字符预留位置
			i1++;
		}
	}

	// 遍历第二个原始字符串s2,去除其中的所有空格(逻辑与s1一致)
	for(int i = 0;i<strlen(s2);i++){
		if(s2[i]!=' '){
			new2[i2]=s2[i];
			i2++;
		}
	}
	
	// strcmp函数:C语言字符串比较函数,用于比较两个字符数组的内容是否一致
	// 比较规则:按ASCII码值逐字符比较,直到遇到不同字符或'\0'
	// 返回值:0 表示两个字符串完全一致;>0 表示第一个字符串大于第二个字符串;<0 表示第一个字符串小于第二个字符串
	if(strcmp(new1,new2)==0){
		// 若返回0,说明「忽略大小写+忽略空格」后两个字符串一致,输出yes
		cout<<"yes";
	} else{
		// 若返回非0,说明两个字符串不一致,输出no
		cout<<"no";
	}

	// 主函数返回0,表示程序正常结束
	return 0;
} 

// 主函数3(命名为main3,不可直接执行,仅作演示):功能是找出一组姓名对应的最高分数,并输出对应姓名
int main3(){
	// 定义变量t:存储输入的测试用例组数(即姓名-分数对的数量)
	int t ;
	// 定义字符数组max_name:存储当前最高分数对应的姓名,长度201防止姓名过长溢出
	// 定义变量score:存储当前最高分数
	char max_name[201];
	double score;
	
	// 读取测试用例组数t
	cin >> t;
	// 读取第一组姓名和分数,作为初始的「最高姓名」和「最高分数」
	// 注意:cin读取字符串(char数组)时,默认以空格/换行符分割,适合此处姓名不含空格的场景
	cin >> max_name >> score;//第一组 
	
	// 循环读取剩余的t-1组数据(因为已经读取了第一组)
	while(t>1){
		// 定义临时字符数组n:存储当前读取的姓名
		// 定义临时变量m:存储当前读取的分数
		char n[201];
		double m;
		cin >> n>> m;//下一组 
		// 比较当前分数m是否大于已记录的最高分数score
		if(score<m){
			// strcpy函数:C语言字符串复制函数,功能是将第二个参数的字符串(n)完整复制到第一个参数的字符数组(max_name)中
			// 注意:会覆盖max_name原有的内容,且自动在末尾添加'\0'
			strcpy(max_name,n);
			// 更新最高分数为当前分数m
			score=m;
		} 
		// 测试用例组数减1,直到t=1时退出循环
		t--;
	}
	// 输出最终最高分数对应的姓名
	cout<<max_name<<endl;
	
	return 0;
}

// 主函数2(命名为main2,不可直接执行,仅作演示):功能是通过strlen函数获取字符串长度,实现字符串反转输出
int main2(){
	// 定义字符数组str,存储输入的字符串
	char str[100];
    // 读取一整行输入(包含空格)
    cin.getline(str,100);
	// strlen(str):计算字符串str的有效长度(不含'\0'),赋值给变量n
	// 作用:获取字符串长度后,可直接作为反向遍历的起始索引(n-1)
	int n = strlen(str);//strlen方法/函数 -> 作用:计算字符串的有效长度(不包含结束符'\0')
	
	// 反向遍历字符串:从最后一个有效字符(索引n-1)遍历到第一个字符(索引0)
	for(int l = n-1;l>=0;l--){
		// 逐个输出反向的字符,最终实现字符串反转效果
		cout<<str[l];
	}
	
	return 0;
}

// 主函数1(命名为main1,不可直接执行,仅作演示):功能是通过手动判断'\0'获取字符串长度,实现字符串反转输出
int main1(){
    // 定义字符数组str,存储输入的字符串
    char str[100];
    // 读取一整行输入(包含空格)
    cin.getline(str,100);
    // 定义变量l,用于记录字符串的长度
    int l;
    // 手动遍历字符串,计算有效长度(不使用strlen函数)
    // 循环条件:str[l]!='\0'('\0'是字符串结束符,标志着字符串的末尾)
    // 循环体为空(分号表示空语句),仅通过l++遍历到字符串末尾
    for(l = 0;str[l]!='\0';l++) ;
    // 循环结束后,l的值是字符串长度+1(因为最后一次l++后str[l]='\0'),所以需要l--得到最后一个有效字符的索引
    l--;
	// 反向遍历字符串,从最后一个有效字符(索引l)遍历到第一个字符(索引0),实现反转输出
	for(;l>=0;l--){
		cout<<str[l];
	}
    return 0;
}

// 手动实现大写转小写函数(基于ASCII码操作,区别于库函数strlwr)
// 参数:string类型的str(C++字符串类型,区别于C语言字符数组)
// 返回值:int类型(此处返回0仅作占位,实际可修改为返回转换后的string)
int toLowerByAscii(string str) {
    // 遍历C++字符串str的所有字符,str.size():获取字符串的有效长度(功能等同于strlen)
    for (int i = 0; i < str.size(); ++i) {
        // 判断当前字符是否为大写字母:ASCII码中,'A'对应65,'Z'对应90,此区间内的字符都是大写字母
        if (str[i] >= 'A' && str[i] <= 'Z') {
            // 大写字母转小写字母的核心原理:大写字母与对应小写字母的ASCII码差值固定为32
            // 例如:'A'(65) +32 = 'a'(97),'B'(66)+32='b'(98)
            str[i] += 32;
        }
        // 非大写字母(小写字母、数字、符号、空格等)不做任何处理,保持原样
    }
    return 0;
}