資訊學奧賽複賽複習01-CSP-J2019-01-字元、字元陣列、字串、string、字串讀取

new-code發表於2024-09-23
資訊學奧賽複賽複習01-CSP-J2019-01-字元、字元陣列、字串、string、字串讀取
PDF文件公眾號回覆關鍵字:20240923
資訊學奧賽複賽複習01-CSP-J2019-01-字元、字元陣列、字串、string、字串讀取

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);
}

相關文章