题目:自动修正
alt text

include

include

using namespace std;

int main(){
string s;
cin>>s;
for(int i = 0; i < s.length();i++){
s[i] = toupper(s[i]);
}
cout<=’a’ && a[i]<=’z’)
{
a[i]=a[i]-‘a’+’A’; //a[i]=a[i]- (‘a’ - A)
}
把大写转换成小写就是:

if(a[i]>=’A’ && a[i]<=’Z’)
{
a[i]=a[i]-‘A’+’a’;
}

题目:小书童-凯撒密码
alt text
c++
最终版本:

include

include

using namespace std;

int main(){
string s;
int n;
cin>>n>>s;
if(n >0&&n <27){
for(int i = 0; i < s.length();i++){
if (islower(s[i])) { //islower(s[i]) 是一个函数调用,用于检查字符 s[i] 是否为小写字母
s[i] = ‘a’ + (s[i] - ‘a’ + n) % 26; //string 约等于 char[],所以可用数组的方法
}
}
}
cout<<s;
return 0;
}

c语言

include

int main(){
int n;
char str[100];
scanf(“%d%s”,&n,str);
for(int i = 0; str[i] != ‘\0’;i++){
str[i] = ‘a’ + (str[i] - ‘a’ + n) % 26; // 也可写为 putchar((in[j]-‘a’+n)%26+’a’);
}
printf(“%s”,str); //使没有显式使用第二个循环来输出字符串,但由于 C 语言的特性,C 字符串以 null 结尾(即以 \0 结尾),printf(“%s”, str); 会一直输出字符直到遇到 null 终止符为止。
return 0;
}

错误原因:
1.没有想到z跳完之后要转到a的情况
2.没有想到检测小写,而是直接转小写,不符合题意
3.(str[i] - ‘a’ + n)写成(‘a’ - str[i] + n) 小- 大导致错误
重点:
1.s[i] = ‘a’ + (s[i] - ‘a’ + n) % 26;
这行代码是用来实现对小写字母进行向后移动 n 位的操作。让我们解释一下这行代码的具体功能:
s[i] - ‘a’:这部分计算了当前字符 s[i] 相对于小写字母表中的字母 ‘a’ 的偏移量。
(s[i] - ‘a’ + n):这一部分将偏移量加上移动的位数 n,以实现向后移动的效果。
(s[i] - ‘a’ + n) % 26:由于小写字母表只有 26 个字母,因此这一部分确保结果在 0 到 25 之间,以便在字母表上循环移动。
‘a’ + (s[i] - ‘a’ + n) % 26:最后,将结果映射回小写字母表,得到移动后的字符。
2.putchar()
putchar()是一个 C 语言标准库函数,用于将一个字符输出到标准输出流(通常是控制台)
eg:putchar(66) = printf(“A”)

必学方法:确保结果在 0 到 25 之间,利用 % 26得到!!!!!!

3.题目 笨小猴
alt text
代码:
正确版本:

include

include

include //提供了对基本数学运算和函数的支持

using namespace std;

//知识点2 素数的判断
bool isPrime(int num) { //bool表示布尔值的返回类型
if (num <= 1) return false;
for (int i = 2; i <= sqrt(num); i++) { //sqrt(num)开方,即使根号2小于2,但是仍然把根号2,取到2来看待
if (num % i == 0) return false;
}
return true;
}

int main() {
string str;
cin >> str;
int n[26] = {0};

// 统计每个字母出现的次数
for (char c : str) {    //知识点1 增强型for循环
    n[c - 'a']++;
}

int maxn = 0, minn = 100;  // 初始化minn为一个较大值

// 找到最大和最小的非零频率
for (int i = 0; i < 26; i++) {
    if (n[i] > 0) {
        if (n[i] > maxn) maxn = n[i];
        if (n[i] < minn) minn = n[i];
    }
}

int z = maxn - minn;

// 根据z的值判断输出
if (isPrime(z)) {
    cout << "Lucky Word" << endl << z;
} else {
    cout << "No Answer" << endl << 0;
}

return 0;

}

知识点:
1.增强型for循环(c++)
1>遍历字符串 string s;
for( int i = 0; i < s.length(); i++):通常写法
for (char c : s):复制一个s字符串再进行遍历操作(慢)
for (char& c : s):直接引用原字符串进行遍历操作(快)
2>遍历数组 int a[6] = { 3,2,1,4,9,0 };
for (int i : a)
for (int &i : a)

2.素数的判断
bool isPrime(int num) {
if (num <= 1) return false;
for (int i = 2; i <= sqrt(num); i++) {
if (num % i == 0) return false;
}
return true;
}

错误版本: 错误原因未知

include

include

include

include

using namespace std;

int main(){
string str;
cin>>str;
int n[25] = {0};
int z;
for(int i = 0; i < str.size(); i++){
n[str[i] - ‘a’]++;
}
sort(n, n + 26);
/for(int i = 0; i < 26; i++){
cout<<n[i];
}
/
for(int i = 0; i < 26; i++){
if(n[i] > 0){
z = n[25] - n[i];
break;
}
}
if(z == 2 || z==3){
cout<<”Lucky Word”;
}
else if(z == 0||z == 1){
cout<<”No Answer”;
}
else{
int c = 0;
for(int i = 2; i <= sqrt(z);i++){
if(z % i == 0){
c = 1;
break;
}
}
if(c == 1) cout<<”No Answer”;
else cout<<”Lucky Word”;
}
cout<<endl<<z;
return 0;
}

题目:口算练习题
alt text

代码:

include

include

include

include

include

using namespace std;

int main(){
int i;
cin>>i; //input amount of data
int x,y; //two caozuoshu
char z,f; //z is the last sign ,f is the new sign or data
while(i>0){
i—;
char s1[100];
char s[100];
scanf(“%s”,&s1);
if(s1[0] == ‘a’||s1[0] == ‘b’||s1[0] == ‘c’){
z = s1[0];
scanf(“%d%d”,&x,&y);
}
else{
x = atoi(s1); //知识点1
scanf(“%d”,&y);
}
if(z == ‘a’){
sprintf(s,”%d+%d=%d”,x,y,x+y);
}
else if(z == ‘b’){
sprintf(s,”%d-%d=%d”,x,y,x-y);
}
else if(z == ‘c’){
sprintf(s,”%d%d=%d”,x,y,xy);
}
//cout<stoi()
将字符串转换为int型
针对于string类型的(char也行)。stoi函数是C++11引入的,因此只有在C++11及以上的版本中才能使用该函数
同理stol()、stof()、stod(),分别将字符串类型转换成long long、float、double类型

2>atoi()
toi()函数是C语言中的一个函数,主要用于将字符串转换为整数。针对于字符数组,类似的还有atol()、atof()、atod()

3>利用ASCII

#include<iostream>
#include<cstring>
using namespace std;
char ch[]={'1','2','3','4','5'};
int main(){
    for(int i=0;i<strlen(ch);i++){
        cout<<ch[i]-'0'<<" "; //重点
    }
    return 0;
}

4>stringstream
stringstream是C++中的一个类,可以用来对字符串进行输入输出操作
它是基于字符串的流,可以用来将字符串转换为其他类型的数据,以及将其他类型的数据转换为字符串。stringstream类的头文件是,我们需要包含这个头文件才能使用stringstream类。
eg:

#include<iostream>
#include<sstream>
#include<cstring>
#include<typeinfo>

using namespace std;
int main(){
stringstream ss;
string s="12345";
int num;
ss<<s;//将字符串读入字符串流 
ss>>num;//从字符串流中读取数据转换为整数
cout<<typeid(num).name()<<" "<<num<<endl;
return 0; 
}

2.数字转为字符串
1>利用ASCII
字符转数字可以-‘0’,数字转字符那么就可以+’0’
cout<<nums[i]+’0’<<” “;

2>to_string()
用于将不同类型的数据转换为字符串
可以将int、float、double、long long等类型转换为string类型。需要包含头文件#include<cstring>(c++)

3>itoa()
toa函数用于将整数转换为字符串。类似的还有ltoa、ftoa、dtoa分别将long long、float、double转换为字符串类型。针对于字符数组

4>stringstream

include

include

include

include

using namespace std;
int main(){
stringstream ss;
string s=”12345”;
int num=54321;
ss<<num;//将int类型的数据写入字符串流中
s=ss.str();//将字符串流中的数据转换为string类型
cout<<typeid(s).name()<<” “<<num<<endl;
return 0;
}

3.sscanf()和sprintf()
实现数据与字符串之间的转换

sscanf()作用:
(1)根据格式从字符串中提取数据。如从字符串中取出整数、浮点数和字符串等。
(2)取指定长度的字符串
(3)取到指定字符为止的字符串
(4)取仅包含指定字符集的字符串
(5)取到指定字符集为止的字符串
sscanf可以支持格式字符%[]:
(1)-: 表示范围,如:%[1-9]表示只读取1-9这几个数字 %[a-z]表示只读取a-z小写字母,类似地 %[A-Z]只读取大写字母
(2)^: 表示不取,如:%1表示读取除’1’以外的所有字符 %/表示除/以外的所有字符
(3),: 范围可以用”,”相连接 如%[1-9,a-z]表示同时取1-9数字和a-z小写字母
(4)原则:从第一个在指定范围内的数字开始读取,到第一个不在范围内的数字结束%s 可以看成%[] 的一个特例 %^

sprintf()作用:
1 char str[256] = { 0 };
2 int data = 1024;
3 //将data转换为字符串
4 sprintf(str,”%d”,data);

5 //获取data的十六进制
6 sprintf(str,”0x%X”,data);
7 //获取data的八进制
8 sprintf(str,”0%o”,data);
9 const char s1 = “Hello”;
10 const char
s2 = “World”;
11 //连接字符串s1和s2
12 sprintf(str,”%s %s”,s1,s2);

4.strlen(s)

易错点:
char ss[100],并不意味着ss的长度就是100,而是界限为100,用strlen(s)来求取长度