1. 程式人生 > >17.10.27作業 字符數組七則

17.10.27作業 字符數組七則

重復數 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 int
main() 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 }
View Code

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作業 字符數組七則