信息学奥赛复赛复习01-CSP-J2019-01-字符、字符数组、字符串、string、字符串读取

new-code / 2024-09-24 / 原文

信息学奥赛复赛复习01-CSP-J2019-01-字符、字符数组、字符串、string、字符串读取
PDF文档公众号回复关键字:20240923

1 2019 CSP-J 题目1 数字游戏

[题目描述]

小 K 同学向小 P 同学发送了一个长度为 8 的 01 字符串来玩数字游戏,小 P 同学想要知道字符串中究竟有多少个 1。

注意:01 字符串为每一个字符是 0 或者 1 的字符串,如 101 为一个长度为 3 的 01 字符串。

[输入格式]

输入文件只有一行,一个长度为 8 的 01 字符串 s

[输出格式]

输出文件只有一行,包含一个整数,即 01 字符串中字符 1的个数

[输入输出样例]

输入 #1

00010100

输出 #1

2

输入 #2

11111111

输出 #2

8

说明/提示

样例 1 说明

该 01 字符串中有 2 个字符 1

样例 2 说明

该 01 字符串中有 8 个字符 1

数据规模与约定

对于 20% 的数据,保证输入的字符全部为 0

对于 100%的数据,输入只可能包含字符 0 和字符 1,字符串长度固定为 8

2 相关知识点

1) 字符

C语言有字符类型,也就是char类型,char类型的数据占内存大小为1字节。

C语言中不存在字符串类型,可以使用字符数组表示

字符是一种图形符号,不同国家不同地区都有自己特殊的字符,于是就衍生了“字符集合”这个名词。其中ASCII (American Standard Code for Information Interchange: 美国信息交换标准代码)是国际通用的标准字符集

例如

char a='0';
char b='P';
char c='@';
char c='65';//ascii 码 对应大写字母A

2) 字符数组

用来存放字符的数组称为字符数组

例如

//定义一个,总长度为5,有效长度为5的字符数组
char c1[5]={'h','e','l','l','o'};

//定义一个,总长度为10,有效长度为5的字符数组
char c2[10]={'h','e','l','l','o'};

//定义一个总长度为5,有效长度为5的字符数组
char c3[]={'h','e','l','l','o'};

字符数组输出的字符

#include <bits/stdc++.h>
using namespace std;
int main(){
	//int 数组直接输出是地址
	int a[5]={1,2,3,4,5};
	cout<<a<<endl;
	// 字符数组输出 不是地址 直接输出字符
	char c[5]={'1','2','3','4','5'};
	cout<<c;
	return  0;
}
/*
输出
0x71fe00
12345 
*/

3) 字符串

是由“ ”包括起来的字符序列字符串的结束标志是‘\0’,用双引号括起来的一串字符就是字符串常量,它的末尾将由系统自动添加一个字符串结束标志‘\0’

在c语言中不能定义字符串,但是在c语言中使用字符串,通常会用字符数组来模拟字符串,必须是’\0'结尾的字符数组。如果字符数组中没有‘\0'结尾,那该字符数组就是普通的字符数组,不是字符串

例如

字符串赋值

//定义一个,总长度为10,有效长度为5的字符串 \0为结束符号
char c1[10]={'h','e','l','l','o','\0'};

//定义一个总长度为10,有效长度为4的字符串 \0 有效长度只包括\0 前面的
char c2[10]={'h','e','l','l','\0','o'};

//定义一个总长度为10,有效长度为9的字符串
char c3[10]="hello 123";

4) C++字符串 string

在 C++ 中,std::string 是一个表示字符串的类,它提供了许多方便的操作来处理字符串。std::string 是 C++ 标准库的一部分,因此你需要在代码中包含 <string> 头文件来使用它

//定义
string s;
//定义时赋值
string s1="abcd";
string s2("abcdef");  // s2 = "abcd"
string s3(4, 'a');  // s3 = "aaaa"
string s4("abcdef", 1, 3);  //s4 = "bcd",即 "abcdef" 的从下标 1 开始,长度为 3 的子串 

5) 字符串读取

cin 读取

cin 是 C++ 标准库中的一个输入流对象,它用于从标准输入设备(通常是键盘)读取数据

可以自动识别和处理不同类型的数据,如整数、浮点数、字符和字符串等

读取整数

#include <iostream>
using namespace std;

int main() {
    int age;
    cout << "请输入您的年龄: ";
    cin >> age;
    cout << "您的年龄是: " << age << endl;
    return 0;
}
/*
请输入您的年龄: 19
您的年龄是: 19
*/

读取字符串

#include <iostream>
#include <string>
using namespace std;

int main() {
    string name;
    cout << "请输入您的名字: ";
    cin >> name;
    cout << "您的名字是: " << name << endl;
    return 0;
}
/*
请输入您的名字: newcode
您的名字是: newcode
*/

getline函数

getline() 是 C++ 标准库中的一个函数,用于从输入流中读取一行文本

使用语法

std::istream& getline(std::istream& is, std::string& str, char delim);
参数说明:
is:输入流对象,通常使用 std::cin
str:用于存储读取到的字符串的 std::string 对象
delim:分隔符,默认为换行符 \n

#include <iostream>
#include <string>
using namespace std;

int main() {
    string line;
    cout << "请输入一行文本: ";
    getline(cin, line);
    cout << "您输入的文本是: " << line << endl;
    return 0;
}
/*
请输入一行文本: newcode
您输入的文本是: newcode
*/

3 思路分析

思路1

定义1个字符,逐一接收8次字符

每次接收到字符后,判断是否为1,如果为1累加到变量cnt

#include<bits/stdc++.h>
using namespace std;
int cnt;
char c;
int main(){
	for(int i=0;i<8;i++){
		cin>>c;
		if(c=='1'){
			cnt++;
		}
	}
	cout<<cnt;
	return 0;
}

思路2

定义1个字符数组,读取8个字符到c字符数组

循环字符数组每个元素,判断是否为1,如果为1累加到变量cnt

#include<bits/stdc++.h>
using namespace std;
int cnt;
char c[8];
int main(){
	cin>>c;
	for(int i=0;i<8;i++){
		if(c[i]=='1'){
			cnt++;
		}
	}
	cout<<cnt;
	return 0;
}

思路3

定义1个字符串s1,读取8个字符到字符串s1中

循环字符数组每个元素,判断是否为1,如果为1累加到变量cnt

#include<bits/stdc++.h>
using namespace std;
string s1;
int cnt;
int main(){
	getline(cin,s1);
	for(int i=0;i<8;i++){
		if(s1[i]=='1'){
			cnt++;
		}
	}
	cout<<cnt;
	return 0;
}

思路4

由于只有0和1这2个数字
10除以9余数为1
10/9=1......1
如果后面继续是0,此时余数不变
100=11.......1
如果后面是1,此时余数加1
101=11.......2
根据这个规则,可以读取整数后和9取余数
此方法只能计算最多8位

#include<cstdio>
int main(){
  int n;
  scanf("%d",&n);
  printf("%d",n%9);
}