17.10.27作業 字符數組七則
阿新 • • 發佈:2017-10-28
重復數 get 比較 pow pen stream sin 定義 dff
例題(12.3) 忽略大小寫的字符串比較 (1016)
描述 | |
一般我們用strcmp可比較兩個字符串的大小,比較方法為對兩個字符串從前往後逐個字符相比較(按ASCII碼值大小比較),直到出現不同的字符或遇到‘\0‘為止。如果全部字符都相同,則認為相同;如果出現不相同的字符,則以第一個不相同的字符的比較結果為準。但在有些時候,我們比較字符串的大小時,希望忽略字母的大小,例如"Hello"和"hello"在忽略字母大小寫時是相等的。請寫一個程序,實現對兩個字符串進行忽略字母大小寫的大小比較。 | |
關於輸入 | |
輸入為兩行,每行一個字符串,共兩個字符串。(每個字符串長度都小於80) | |
關於輸出 | |
如果第一個字符串比第二個字符串小,輸出一個字符"<" 如果第一個字符串比第二個字符串大,輸出一個字符">" 如果兩個字符串相等,輸出一個字符"=" | |
例子輸入 | |
Hello, how are you?
hello, How are you?
|
|
例子輸出 | |
=
|
|
提示 | |
編寫C程序時,請用gets錄入每行字符串,scanf無法錄入整行。 不要使用 strlwr()和strupr()函數來做。 |
1 #include <iostream> 2 using namespace std; 3 4 intView Codemain() 5 { 6 char ch1[80],ch2[80];int judge=0;//定義兩個符號型數組來輸入,設置一個判斷數初始化為0 7 cin.getline(ch1,80); 8 cin.getline(ch2,80);//輸入兩行數組 9 for (int i = 0; ch1[i] != ‘\0‘ || ch2[i] != ‘\0‘; i++) 10 { 11 if (ch1[i] < 97) 12 ch1[i] += 32; 13 if (ch2[i] < 97) 14 ch2[i] += 32;//當ASCII碼小於97時數字為大寫,此時把它們轉換成小寫 15 if (ch1[i] > ch2[i])//判斷兩個元素的大小,要是兩個元素不等把判斷值設為1 16 { 17 cout << ">" << endl; 18 judge = 1; 19 break; 20 } 21 else if (ch1[i] < ch2[i]) 22 { 23 cout << "<" << endl; 24 judge = 1; 25 break; 26 } 27 } 28 if (judge == 0)//當判斷條件為0的時候輸出等號 29 cout << "=" << endl; 30 }
wrong answer:2
將字符串中的小寫字母轉換成大寫字母
描述 | |
給定一個字符串,將其中所有的小寫字母轉換成大寫字母。 | |
關於輸入 | |
若幹行,每行是一個字符串(長度不超過100)。 輸入以Ctrl+Z結束,也就是強行中斷輸入流,此時cin表達式運行結果為false。在正常情況下cin表達式的運行結果都是true。因此,本題可以使用 while(cin>>str) { 處理當前行的字符串 } | |
關於輸出 | |
將輸入的字符串中所有小寫字母轉換成大寫字母後的字符串。 | |
例子輸入 | |
helloworld123Ha
|
|
例子輸出 | |
HELLOWORLD123HA
|
1 #include <iostream> 2 using namespace std; 3 4 int main() 5 { 6 char str[101], i = 0;//定義一個符號數組和一個循環數 7 while (cin >> str)//在終止符前一直可以輸入 8 { 9 for (i = 0; str[i] != ‘\0‘; i++)//循環判斷將小寫字母改為大寫 10 { 11 if (str[i] >= 97 && str[i] <= 122) 12 str[i] -= 32; 13 } 14 cout << str;//輸出整個字符串 15 cout << endl; 16 continue; 17 }}View Code
註意while(cin>>str)用法
單詞替換
描述 | |
輸入一個字符串,以回車結束(字符串長度<=100)。該字符串由若幹個單詞組成,單詞之間用一個空格隔開,所有單詞區分大小寫。現需要將其中的某個單詞替換成另一個單詞,並輸出替換之後的字符串。 | |
關於輸入 | |
輸入包括3行: 第1行是包含多個單詞的字符串 s 第2行是待替換的單詞 a (長度<=100) 第3行是a將被替換的單詞 b (長度<=100) s, a, b 最前面和最後面都沒有空格。 |
|
關於輸出 | |
輸出只有 1 行: 將s中所有單詞a替換成b之後的字符串。 如果s中單詞a沒有出現,則將s原樣輸出。 |
|
例子輸入 | |
You want someone to help you
You
I
|
|
例子輸出 | |
I want someone to help you
|
|
提示 | |
可以用 gets() 函數來輸入帶空格的字符串。 |
1 #include <iostream> 2 #include<string.h> 3 using namespace std; 4 5 int main() 6 { 7 char s[101][101], a[101], b[101], ch; int len, lin = 0, col = 0; //定義一個二維符號數組s,兩個一維的a和b,定義一個符號ch以備程序中判斷,定義b的長度len,初始化行數lin和列數col 8 for (int i = 0;;) 9 { 10 cin.get(ch);//把輸入的每個元素賦值給ch 11 if (ch == ‘ ‘)//如果ch為空格,把最後輸入的值後面那一格賦為null,然後增加行數,使列數歸0,如果ch為回車,那麽結束輸入並填入null值,如果ch為一個字母,就把它填入當前行列,達到每行一個單詞的目的 12 { 13 s[lin][col] = ‘\0‘; 14 lin++; col = 0; 15 } 16 else if (ch == ‘\n‘) 17 { 18 s[lin][col] = ‘\0‘; 19 break; 20 } 21 else 22 { 23 s[lin][col] = ch; col++; 24 } 25 } 26 cin.getline(a, 101); cin.getline(b, 101); 27 len = strlen(b); 28 for (int i = 0; i <= lin; i++) 29 { 30 if (strcmp(s[i], a) == 0) //當某一行的單詞和a一樣時,將這一行替換為b 31 for (int j = 0; s[i][j] != ‘\0‘||b[j]!=‘\0‘; j++) 32 { 33 if (j < len) 34 s[i][j] = b[j]; 35 else 36 s[i][j] = ‘\0‘; 37 s[i][j + 1] = ‘\0‘; 38 } 39 } 40 for (int i = 0; i < lin; i++) 41 cout << s[i] << " "; 42 cout << s[lin] << endl; 43 }View Code
wrong answer:2(字符串長度考慮漏了)
1079 統計字符數
描述 | |
判斷一個由a-z 這26 個字符組成的字符串中哪個字符出現的次數最多 | |
關於輸入 | |
第1 行是測試數據的組數n,每組測試數據占1 行,是一個由a-z 這26 個字符組成的字符串 每組測試數據之間有一個空行,每行數據不超過1000 個字符且非空 | |
關於輸出 | |
n 行,每行輸出對應一個輸入。一行輸出包括出現次數最多的字符和該字符出現的次數,中 間是一個空格。 如果有多個字符出現的次數相同且最多,那麽輸出ascii 碼最小的那一個字符。 | |
例子輸入 | |
2
abbccc
adfadffasdf
|
|
例子輸出 | |
c 3
f 4
|
1 #include <iostream> 2 using namespace std; 3 int main() { 4 int n, count[27], word, max; //定義整數n,用來計算字母個數的數組count,最多字母編號word,以及最大重復數max 5 cin >> n; 6 cin.ignore(); //吸收掉輸入n後的回車符 7 char str[1001], result; //定義符號型數組來儲存字符串,以及出現最多的字母result 8 for (int i = 0; i<n; i++) 9 { 10 for (int j = 1; j <= 26; j++) //初始化數組count 11 count[j] = 0; 12 cin.getline(str, 1001); //輸入字符串 13 cin.ignore(); 14 for (int j = 0; str[j] != ‘\0‘; j++) //在循環中計算所有字母個數的出現次數 15 count[str[j] - 96]++; 16 max = count[1]; word = 1; //初始化max和word 17 for (int j = 1; j <= 26; j++) //在循環中比較max和count中元素的大小確定出結果 18 { 19 if (max<count[j]) 20 { 21 max = count[j]; 22 word = j; 23 } 24 } 25 result = word + 96; 26 cout << result << " " << max << endl; 27 } 28 }View Code
驗證子串
描述 | |
輸入兩個字符串,驗證其中一個串是否為另一個串的子串 | |
關於輸入 | |
兩個字符串,長度小於100 | |
關於輸出 | |
若第一個串s1是第二個串s2的子串,則輸出(s1) is substring of (s2) 否則,若第二個串s2是第一個串s1的子串,輸出(s2) is substring of (s1) 否則,輸出 No substring | |
例子輸入 | |
abc
dddncabca
|
|
例子輸出 | |
abc is substring of dddncabca
|
|
提示 | |
字符串匹配算法 |
1 #include <iostream> 2 #include<string.h> 3 using namespace std; 4 int main() { 5 char s1[100], s2[100]; //定義兩個數組來儲存兩條字符串 6 int judge = 1, len1, len2; //設置一個判斷值judge,定義兩個字符串的長度 7 cin.getline(s1, 100); 8 cin.getline(s2, 100); 9 len1 = strlen(s1); 10 len2 = strlen(s2); 11 if (len1 > len2) //當第一條字符串比較大,另一條有可能是它的子串 12 { 13 for (int i = 0; i <= len1 - len2; i++) //對以s1[len1-len2]前的所有元素為首的,len2長度的子串和s2進行比較(忘了用strcmp) 14 { 15 for (int j = 0; s2[j] != ‘\0‘; j++) 16 { 17 judge = 1; 18 if (s1[i + j] != s2[j]) 19 { 20 judge = 0; break; 21 } 22 23 } 24 if (judge == 1) 25 { 26 cout << s2 << " is substring of " << s1 << endl; 27 break; 28 } 29 } 30 if (judge == 0) 31 cout << "No substring" << endl; 32 } 33 if (len1<= len2) //然後考慮len2比較長的情況 34 { 35 for (int i = 0; i <= len2 - len1; i++) 36 { 37 for (int j = 0; s1[j] != ‘\0‘; j++) 38 { 39 judge = 1; 40 if (s2[i + j] != s1[j]) 41 { 42 judge = 0; break; 43 } 44 45 } 46 if (judge == 1) 47 { 48 cout << s1 << " is substring of " << s2 << endl; 49 break; 50 } 51 } 52 if (judge == 0) //如果兩種情況下都沒有找到 53 cout << "No substring" << endl; 54 } 55 }View Code
例題(12.9) 數制轉換
描述 | |
求任意兩個不同進制非負整數的轉換(2進制~36進制),所給整數在long所能表達的範圍之內。 不同進制的表示符號為(0,1,...,9,a,b,...,z)或者(0,1,...,9,A,B,...,Z)。 | |
關於輸入 | |
輸入只有一行,包含三個整數a,n,b。a表示其後的n 是a進制整數,b表示欲將a進制整數n轉換成b進制整數。 a,b是十進制整數,2 ≤ a,b < 36。 | |
關於輸出 | |
輸出包含一行,該行有一個整數為轉換後的b進制數。輸出時字母符號全部用大寫表示,即(0,1,...,9,A,B,...,Z)。 | |
例子輸入 | |
15 Aab3 7
|
|
例子輸出 | |
210306
|
|
提示 | |
可以用字符串表示不同進制的整數 |
1 #include <iostream> 2 #include<string.h> 3 #include<math.h> 4 using namespace std; 5 int main() { 6 int a, b, mutNum, over,len,mut,bMut; //定義整數a,b,備用變量mutNum,over分別代表次方數和除數,字符串的長度len,結果的最大長度mut,和b的mut次方bMut 7 char ch, numStr[100]; //定義符號ch為一個中間量,供刪去回車符和輸出字符,定義一個儲存輸入的進制數 8 long num=0; //初始化輸入的進制數的十進制形式num 9 cin >> a; 10 cin.get(ch); //刪減回車符 11 cin.get(numStr, 100,‘ ‘); //輸入字符串,遇到空格停止 12 cin >> b; 13 len = strlen(numStr); 14 if (a != b) 15 { 16 for (int i = 0; numStr[i] != 0; i++) //得出num 17 { 18 if (numStr[i] >= ‘a‘) 19 numStr[i] -= 32; 20 if (numStr[i] <= 57) 21 numStr[i] += 7; 22 mutNum = pow(a, len - i - 1); 23 num += mutNum*(numStr[i] - 55); 24 } 25 mut = 1; bMut = b; //初始化mut和bMut 26 while (bMut <= num) //得出mut 27 { 28 bMut = bMut*b; 29 mut++; 30 } 31 for (int i = mut - 1; i >= 0; i--) //輸出結果 32 { 33 over = num / pow(b, i); 34 if (over <= 9) 35 cout << over; 36 else 37 { 38 ch = over + 55; 39 cout << ch; 40 } 41 mutNum = pow(b, i); 42 num = num%mutNum; 43 } 44 } 45 else 46 cout << numStr << endl; 47 }View Code
wrong answer:1(ASCII碼)
大整數減法
描述 | |
求2個大的正整數相減的差 | |
關於輸入 | |
第1行是測試數據的組數n,每組測試數據占2行,第1行是被減數a,第2行是減數b(a > b)。每組測試數據之間有一個空行,每行數據不超過100位 | |
關於輸出 | |
n行,每組測試數據有一行輸出是相應的整數差 | |
例子輸入 | |
2
9999999999999999999999999999999999999
9999999999999
5409656775097850895687056798068970934546546575676768678435435345
1
|
|
例子輸出 | |
9999999999999999999999990000000000000
5409656775097850895687056798068970934546546575676768678435435344
|
#include <iostream> #include<string.h> using namespace std; int main() { char s1[101], s2[101]; //定義兩個數組分別儲存兩個大整數 int n, a1[101], a2[101],a3[101],len1,len2,num; //定義n,數組a1和a2分別儲存大整數的每一位,a3數組儲存這兩個大整數的差,定義兩個字符串的長度,定義s1位數與a3位數差的值num cin >> n; cin.ignore(); //刪去回車 for (int j = 0; j < n; j++) { cin.getline(s1, 101); cin.getline(s2, 101); len1 = strlen(s1); len2 = strlen(s2); for (int i = 0; i < len1; i++) //把s1中表示的每一位數輸入a1,初始化a2為和a1相同長度的數組 { a2[i] = 0; a1[i] = s1[i] - ‘0‘; } for (int i = 0; i < len2; i++) //把s2中的數字輸入 a2[i + len1 - len2] = s2[i] - ‘0‘; for (int i = len1-1; i >=0; i--) //逐位數做差得到a3 { a3[i] = a1[i] - a2[i]; if(a3[i]<0) { a1[i - 1]--; a3[i] += 10; } } for(int i=0;i<len1;i++) //得出num if(a3[i]!=0) { num = i; break; } for (int i = num; i < len1; i++) cout << a3[i] ; cout << endl; cin.ignore(); } }
wrong answer:2(算法註意)
17.10.27作業 字符數組七則