2023年省信息技术教师培训笔记day11

字符及字符变量

字符

可以表示字母、符号等,在编程时使用一对单引号,如’a’,‘b’,‘1’,‘2’,'+'等。
注意:单引号是英文状态的单引号,单引号里只有一个符号,与字符串是英文的双引号,如"abc","123"等。

字符变量

char 标识符1,标识符2,……标识符n;
如:char c; char s=‘w’;
字符变量占用一个字节的存储空间

字符串变量

string 标识符1,标识符2,……标识符n;
如:string c;string s=“ww123”;

ASCII码

在这里插入图片描述

注意:‘0’->48 ‘A’->65 ‘a’->97

转义字符表
在这里插入图片描述

例题:

例1 将字符串中的小写字母转换成大写字母

给定一个字符串,将其中所有的小写字母转换成大写字母。
输入
输入一行,包含一个字符串(长度不超过100,可能包含空格)。
输出
输出转换后的字符串。
样例输入
helloworld123Ha

####样例输出

HELLOWORLD123HA
//自己写的代码:
#include<iostream>
#include<cstring>
using namespace std;
char s[101];
int main()
{
	//memset(s,0,sizeof(s));
	cin.get(s,101);
	for(size_t i=0;i<strlen(s);i++)
	{
		if(int(s[i])>=97 && int(s[i])<=97+26)
		//说明该字符是小写
		s[i]=s[i]-32;  
	}
	
	cout<<s;
	return 0;
}

例2 找第一个只出现一次的字符

题目描述

给定一个只包含小写字母的字符串,请你找到第一个仅出现一次的字符。如果没有,输出 no

输入格式

一个字符串,长度小于 100000 100000 100000

输出格式

输出第一个仅出现一次的字符,若没有则输出 no

样例 #1
样例输入 #1
abcabd

样例输出 #1

c
样例 #2
样例输入 #2
aabbcc
样例输出 #2
no
//第一次打的,没有AC的代码,然后加了测试语句:
#include<iostream>
#include<cstring>
using namespace std;
int a[26];    
char s[100001];
int main()
{
	//int cur=0;
	memset(a,0,sizeof(a));
	
	int sn;  
	while(cin>>s)
	{
		for(int i=0;i < strlen(s);i++)
		{
			sn = s[i]-97;
			a[sn]++;
		}
		
		for(int i=0;i<26;i++)
		{
			cout<<a[i]<<" ";    //加入的测试输出语句
			if(a[i]==1)
			{
				cout<<(char)('a'+i);
				return 0;
			}
		}
	}
	cout<<"no";
	return 0;
}
[自己测试结果]
abcbcazbam
3 3 2 0 0 0 0 0 0 0 0 0 1 m
--------------------------------
说明:程序只统计了出现1次的,然后按a~z字母序输出。
改进办法:再走一遍字符串,寻找字母表数组a[]
#include<iostream>
#include<cstring>
using namespace std;
int a[26];    //用来存每个小写字母出现了几次
char s[100001];
int main()
{
	int cur=0;
	memset(a,0,sizeof(a));
	int sn=-1;  //  字符相对应a数组的下标值        a对应的下标值为0 —'a'-97=0
	cin.get(s,100001);
	// 输入了字符串,出现一次的记录一遍
	for(size_t i=0;i < strlen(s);i++)
	{
			sn = s[i]-97;
			a[sn]++;
	}		
	
	//谁是第一个出现的?对照查字母表 a数组
	for(size_t i=0;i<strlen(s);i++)
	{
		cur=((int)s[i])-97;
		if(a[cur] == 1)
		{
			cout<<s[i];
			return 0;
		}
	}
	
	cout<<"no";
	return 0;
}
洛谷题解:
#include<iostream>
using namespace std;
bool visit[30];
bool flag[30];
int main()
{
	string str;
	cin >> str;
	for(int i = 0; i < str.size(); i++)
	{
		if(visit[str[i] - 'a'])
		{
			flag[str[i] - 'a'] = true;
		}
		visit[str[i] - 'a'] = true;
	}
	for(int i = 0; i < str.size(); i++)
	{
		if(!flag[str[i] - 'a'])
		{
			cout << str[i];
			return 0;
		}
	}
	cout << "no";
	return 0;
}
 

其实问题主要是数组空间太大了,换成string类型,通过了限制

#include<iostream>
#include<cstring>
using namespace std;
int a[26];    //用来存每个小写字母出现了几次
string s;
int main()
{
	int cur=0;
	memset(a,0,sizeof(a));
	int sn=-1;  //  字符相对应a数组的下标值        a对应的下标值为0 —'a'-97=0
	cin>>s;
	// 输入了字符串,出现一次的记录一遍
	for(size_t i=0;i < s.length();i++)
	{
			sn = s[i]-97;
			a[sn]++;
	}		
	
	//谁是第一个出现的?对照查字母表 a数组
	for(size_t i=0;i<s.length();i++)
	{
		cur=((int)s[i])-97;
		if(a[cur] == 1)
		{
			cout<<s[i];
			return 0;
		}
		
	}
	
	cout<<"no";
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值