資訊學奧賽複賽複習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);
}