版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
C++程序設(shè)計(jì)(ForNOIP)字符數(shù)組與字符串字符數(shù)組的定義與訪問字符串的定義與訪問字符串的輸入ASCII碼字符串的常用函數(shù)提高練習(xí)(高精度計(jì)算)主要內(nèi)容字符數(shù)組的定義
char數(shù)組名[元素個(gè)數(shù)];當(dāng)字符數(shù)組用來存放字符串時(shí),要注意字符串中包含了一個(gè)字符串結(jié)束標(biāo)志'\0',這個(gè)結(jié)束標(biāo)志也要占用一個(gè)單元。字符串結(jié)束標(biāo)志‘\0‘是字符串的重要特征。以下的示例通過多種方式定義了字符數(shù)組傳統(tǒng)C語言字符串–字符數(shù)組char
s[1000];//定義未初始化的固定長度字符數(shù)組char
s1[4]={‘a(chǎn)’,‘b’,‘c’,‘\0‘};//定義定長的字符數(shù)組,以’\0’結(jié)尾char
s2[4]={‘a(chǎn)’,‘b’,‘c’,‘d’};//定義定長字符數(shù)組,沒有’\0’char
s3[]=“hello”;//定義并初始化不定長字符串,末尾自動添加’\0’整個(gè)字符數(shù)組的訪問直接通過數(shù)組名對整個(gè)字符進(jìn)行訪問字符數(shù)組單個(gè)元素的訪問
通過數(shù)組下標(biāo)訪問字符數(shù)組中的單個(gè)字符元素,下標(biāo)從0開始字符數(shù)組的訪問chars3[]="hello";cout<<s3[4];//輸出字符’o’chars1[5]={‘a(chǎn)’,‘b’,‘c’,‘d’,‘\0‘};cout<<s1;//輸出整個(gè)字符數(shù)組,不包括’\0’字符串?dāng)?shù)據(jù)類型需要引用<string>庫,字符串?dāng)?shù)據(jù)類型有許多的成員函數(shù),如length,replace等字符串的定義以下的示例通過多種方式定義了不同的字符串變量C++中的字符串#include<string.h>//引用<string>庫strings1;//定義了未初始化的字符串變量strings2=“helloworld”;//定義并初始化字符串變量strings3(“helloworld”);//定義并初始化字符串變量strings4(8,‘a(chǎn)’);//定義由指定數(shù)量的單個(gè)重復(fù)字符組成的字符串strings5(s2,3,2);//定義由某個(gè)現(xiàn)有字符串的子串組成的字符串變量s1=s2;
//字符串變量可以像普通變量一樣進(jìn)行相互賦值整個(gè)字符串的訪問直接通過字符串變量名對整個(gè)字符進(jìn)行訪問字符串中單個(gè)字符的訪問
字符串變量可以看作一個(gè)字符數(shù)組,可以通過下標(biāo)訪問字符串中的單個(gè)字符C++中字符串變量的訪問strings2=“helloworld”;//定義并初始化字符串變量cout<<s2[6];//輸出字符’w’strings2=“helloworld”;//定義并初始化字符串變量cout<<s2;//輸出整個(gè)字符串變量字符串的輸入通過cin進(jìn)行輸入cin>>字符串變量;提取操作符
>>
遇到空格、TAB、或回車符停止提取只能接收不帶空格的字符串以下的示例先定義了一個(gè)字符串變量,然后準(zhǔn)備從鍵盤接收輸入的字符串內(nèi)容stringstr;cin>>s1;//從鍵盤接收輸入的字符串字符串的輸入通過getline函數(shù)進(jìn)行輸入getline(cin,字符串變量)遇到換行符時(shí)才停止獲取,所以能夠能讀取到空格和TAB可以讀入整行的字符串,可包括空格和TAB制表符以下的示例先定義了一個(gè)空字符串,然后準(zhǔn)備從鍵盤接收輸入的字符串內(nèi)容stringstr;getline(cin,str);//從鍵盤接收輸入的字符串cout<<str;//輸出字符串的輸入通過cin.getline函數(shù)進(jìn)行輸入cin.getline(字符數(shù)組名,字符個(gè)數(shù),結(jié)束標(biāo)志)遇到換行符時(shí)才停止獲取,所以能夠能讀取到空格和TAB第一個(gè)參數(shù)必須是字符數(shù)組名,而不是字符串變量如果指定參數(shù)“字符個(gè)數(shù)”為n,則利用cout函數(shù)輸出時(shí)只顯示字符數(shù)組中的前n-1個(gè)字符,第n個(gè)字符是不可見字符’\0’如果指定了參數(shù)“結(jié)束標(biāo)志”,則在讀取過程中,如果遇到結(jié)束標(biāo)志,即使讀取的字符數(shù)還未達(dá)到指定的“字符個(gè)數(shù)”,也會停止讀取當(dāng)?shù)谌齻€(gè)參數(shù)省略時(shí),系統(tǒng)默認(rèn)為'\0'字符串的輸入通過cin.getline函數(shù)進(jìn)行輸入cin.getline(字符數(shù)組名,字符個(gè)數(shù),結(jié)束標(biāo)志)以下的示例分別演示了接收定長字符串和提前遇到結(jié)束字符兩種情形chars1[10];//從鍵盤接收輸入的字符串//最多接收7個(gè)字符cin.getline(s1,8);//如果輸入abcdefghl//則會輸出abcdefcout<<s1;chars2[10];//從鍵盤接收輸入的字符串//最多接收7個(gè)字符,以’f’為結(jié)束字符cin.getline(s1,8,‘f’);//如果輸入abcdefghl//則會輸出abcdecout<<s1;字符串的輸入通過gets()函數(shù)進(jìn)行輸入cin.getline(字符數(shù)組名)遇到換行符時(shí)才停止獲取,所以能夠能讀取到空格和TAB參數(shù)必須是字符數(shù)組名,而不是字符串變量能夠接收到的字符數(shù)量為:數(shù)組長度-1,最后一個(gè)字符自動為’\0’下面的示例定義了字符數(shù)組,并通過gets()函數(shù)從鍵盤接收字符串chars1[10];gets(s1);//如果輸入abcdefghl(共10個(gè)字符,包括空格)//則會輸出abcdefgh(只接收9個(gè),包括空格,最后一個(gè)自動填充’\0’)cout<<s1;字符串的連接可以使用+或+=來連接C++字符串下面的示例定義了若干字符串,并通過+或+=運(yùn)算符對字符進(jìn)行連接操作strings1=“ABCD*FG”;strings2=“Robot”;strings3=“Soccer”;strings4=s1+“HIJK”;//s4變?yōu)椤癆BCD*FGHIJK”s2+=s3;//s2變?yōu)椤癛obotSoccer”字符串的常用函數(shù)C++為字符串類型定義了若干函數(shù),以方便的使用字符串常用的字符串函數(shù)與功能函數(shù)功能返回值length()/size()求字符串長度返回字符串長度,不包括‘\0’find(stringstr)查找子串返回找到的第一個(gè)子串的位置substr(intstart,intlength)取出子串返回子串erase(intstart,intlength)刪除子串返回刪除后的字符串insert(intpos,stringstr)插入子串返回插入后的字符串replace(intstart,intlength,intstr)替換子串返回替換后的字符串reverse(s.begin(),s.end())字符串翻轉(zhuǎn)返回翻轉(zhuǎn)后的子串14字符串的常用函數(shù)length()/size()函數(shù)用于統(tǒng)計(jì)字符串中存儲的字符數(shù),二者等價(jià)字符串變量.length()或者字符串變量.size()下面的示例定義并初始化了一個(gè)字符串變量,然后分別通過length和size函數(shù)獲取字符串的長度string
str=“helloworld”;intlen1=str.length();//輸出字符串長度:11(包含空格)cout<<len1;intlen2=str.size();//輸出字符串長度:11(包含空格)cout<<len2;問題描述模擬實(shí)現(xiàn)字符串類型的length()/size()函數(shù),計(jì)算輸入的字符串長度(可以包含空格)。函數(shù)定義:intMyLength(stringsrcString)其中:SrcString:源字符串返回值:為獲取到的字符串長度常規(guī)練習(xí)-模擬實(shí)現(xiàn)length/size函數(shù)輸入格式一行字符串輸出格式一個(gè)正整數(shù)輸入樣例helloworld輸出樣例11參考代碼int
MyLength(stringstr){
inti=0,cnt=0;
while(str[i]!=‘\0’)
{ cnt++ i++;
}
returncnt;}常規(guī)練習(xí)-模擬實(shí)現(xiàn)length/size函數(shù)17ASCII碼計(jì)算機(jī)中使用0-127的數(shù)字(總共128個(gè)),用來表示128個(gè)英文字符ASCII碼ASCII碼的作用一個(gè)char型字符可以用0-127之間的int型數(shù)據(jù)表示,也就是它的ASCII碼值,二者可以互換字符可以方便的轉(zhuǎn)成序號字符也可以用來進(jìn)行算術(shù)運(yùn)算大小寫可以方便的轉(zhuǎn)換,如字符‘a(chǎn)’可以轉(zhuǎn)換為’A’數(shù)字字符與其表示的數(shù)字可以方便的轉(zhuǎn)換,如字符‘9’可以轉(zhuǎn)換為數(shù)字9ASCII碼char型和int數(shù)據(jù)的互換下面的示例演示了值為65的整型變量a,可以輸出為字符‘A’,相反的,字符’a’也可以輸出為數(shù)字97,因?yàn)樽址瓵’的ASCII碼為65,字符’a’的ASCII為97inta=65;//定義整型變量acharb=‘a(chǎn)’;//定義字符型變量bcout
<<(char)a<<endl;//按字符方式輸出整型變量acout<<(int)b;
//按數(shù)字方式輸出字符型變量bASCII碼數(shù)字字符與數(shù)字的轉(zhuǎn)換首先需要理解:數(shù)字字符和實(shí)際的數(shù)字并不是一回事,比如字符‘0’只是表示一個(gè)數(shù)字字符,它和數(shù)字0是不同的兩種數(shù)據(jù)類型。和字符
‘0’等價(jià)的數(shù)字是它的ASCII值48。從ASCII碼表中可以看出:數(shù)字字符‘0’-‘9’的ASCII值是連續(xù)的,其范圍是48-57。下面的代碼演示了如何將一個(gè)數(shù)字字符轉(zhuǎn)換為對應(yīng)數(shù)字。intCharToInt(charch){
//直接用字符減去字符‘0’的ASCII值即可
returnch–‘0’;//或者returnch–48;}常規(guī)練習(xí)–職工編號校驗(yàn)問題描述某單位的職工編號共18位,由17位數(shù)字和一位校驗(yàn)碼組成校驗(yàn)碼按如下規(guī)則:將前面的17位數(shù)分別乘以不同的系數(shù)。從第1位到第17位的系數(shù)分別為:7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2將這17位數(shù)字和系數(shù)相乘的結(jié)果相加,用加出來的和除以11,看余數(shù)是多少余數(shù)只可能有0,1,2,3,4,5,6,7,8,9,10這11個(gè)數(shù)字,其分別對應(yīng)的最后一位號碼為1,0,X,9,8,7,6,5,4,3,2例如:如果余數(shù)是10,余數(shù)所對應(yīng)的最后一位是2,則校驗(yàn)碼為2要求:輸入一個(gè)職工編號,驗(yàn)證其是否有效輸入格式一行編號字符串,沒有空格輸出格式如校驗(yàn)碼正確,則輸出一行,為數(shù)字1;如果不正確,則輸出兩行,第一行為0,第二行為正確的校驗(yàn)碼輸入樣例123456789012345672輸出樣例07常規(guī)練習(xí)–職工編號校驗(yàn)參考代碼(1/2)charCodeCRC(stringcode){
intsum=0;
inta[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
charcrc[11]={'1','0','X','9','8','7','6','5','4','3','2'};
for(inti=0;i<17;i++) sum+=
(code[i]-‘0’)*a[i];//累加和 sum%=11;
returncrc[sum];}校驗(yàn)函數(shù)常規(guī)練習(xí)–職工編號校驗(yàn)參考代碼(2/2)intmain(){
stringcode;
cin
>>code;
charcrcCode=CodeCRC(code);
//調(diào)用校驗(yàn)函數(shù)計(jì)算校驗(yàn)碼
if(crcCode==code[17])
cout
<<"1";
else
{
cout
<<"0"<<
endl
<<crcCode;
}
return0;}主函數(shù)常規(guī)練習(xí)–職工編號校驗(yàn)ASCII碼大小寫字符的判斷如果字符的ASCII在65-90之間,則為大寫字符,如果在97-122
之間,則為小寫字符下面的代碼演示了如何判斷一個(gè)字符是否為大小寫字符intIsUpperOrLower(charch){
if(ch>=65&&ch<=90)return1;
//大寫
else
if(ch>=97&&ch<=122)return0;
//小寫}ASCII碼大小寫字符的相互轉(zhuǎn)換大寫字符與對應(yīng)的小寫字符固定相差32將大寫字符的ascii碼+32即可得到對應(yīng)的小寫字符,相反,將小寫字符的ascii碼-32可得到對應(yīng)的大寫字符下面的代碼演示了如何將一個(gè)大寫字符轉(zhuǎn)換為大小寫字符intUpperToLower(charch){
returnch+32;
//大寫轉(zhuǎn)小寫}ASCII碼C++提供現(xiàn)成的函數(shù)對字符進(jìn)行判斷和轉(zhuǎn)換功能islower(字符):判斷給定的字符是否是小寫字符isupper(字符):判斷給定的字符是否是大寫字符tolower(字符):將給定的字符轉(zhuǎn)換為小寫字符toupper(字符):將給定的字符轉(zhuǎn)換為大寫字符isalpha(字符):判斷給定的字符是否為英文字母isdigit(字符):判斷給定的字符是否為數(shù)字字符問題描述輸入1個(gè)大小寫混合的字符串,將其全部轉(zhuǎn)換為大寫字符并輸出。輸入格式一行字符串,大小寫可混合,可含空格,可含數(shù)字字符輸出格式一行字符串,全部為大寫字符,空格和數(shù)字字符不轉(zhuǎn)換,原樣輸出常規(guī)練習(xí)–字符串大小寫轉(zhuǎn)換輸入樣例HelloWorld123輸出樣例HELLOWORLD123常規(guī)練習(xí)–字符串大小寫轉(zhuǎn)換參考代碼#include<stdio.h>#include<string.h>usingnamespacestd;intmain(){
stringstr; getline(cin,str);
str=StrToUpper(str);
cout<<str;};stringStrToUpper(stringstr){
for(inti=0;i<str.size();i++)
{
if(islower(str[i]) toupper(str[i]);
}
returnstr;}主函數(shù)StrToUpper函數(shù)常規(guī)練習(xí)–字符串大小寫轉(zhuǎn)換ASCII碼利用ASCII碼可以進(jìn)行字符串大小的比較Air<
Boat:由于‘B’>‘A’所以Boat大(字典序在后)Air<An:
由于'n'>'i'所以An大Billy>Bill:由于'y'>''(空)所以Billy大Air<air:
由于‘a(chǎn)’>‘A’所以air大ASCII碼可以直接使用關(guān)系運(yùn)算符來比較C++字符串的大小關(guān)系運(yùn)算符中的>、<、>=、<=、==、!=可以直接用來比較字符串
下面的示例演示了如何使用關(guān)系運(yùn)算符對兩個(gè)字符串進(jìn)行比較intmain(){
strings1,s2;
cin
>>s1>>s2; if(s1>s2)cout
<<
“s1>s2”;
else
if(s1==s2)
cout
<<
“s1==s2”;
else
cout
<<
“s1<s2”;
return0;}常規(guī)練習(xí)–不使用比較運(yùn)算符對字符串大小進(jìn)行比較問題描述實(shí)現(xiàn)字符串大小比較函數(shù)StrCompare,對輸入的兩個(gè)字符串s1和s2比較其大小。輸入格式輸入兩個(gè)字符串s1和s2,每個(gè)字符串占一行,長度不超過200且不含空格輸出格式如果s1>s2的返回1;如果s1<s2的返回-1;如果s1==s2的返回0輸入樣例1輸入樣例2輸入樣例3
airboatairboatairair輸出樣例1輸出樣例2輸出樣例3-110常規(guī)練習(xí)–不使用比較運(yùn)算符對字符串大小進(jìn)行比較思路分別從兩個(gè)字符串的第一個(gè)字符開始,一一比對,按照ASCII碼值返回比較結(jié)果輸入的兩個(gè)字符串的長度不一定相等,最大的比較長度應(yīng)該為較短的字符串長度參考代碼intStrCompare(strings1,strings2){
intlen1=s1.length();
intlen2=s2.length();
intlen=(len1>len2)?len2:len1;
for(inti=0;i<len;i++)//按最短長度比較
{
if(s1[i]>s2[i])
return1;
//比較途中得到結(jié)果,提前返回
else
if(s1[i]<s2[i])
return-1;//比較途中得到結(jié)果,提前返回
}
//按最短長度比較結(jié)束,仍未得出結(jié)果,則誰長誰大
if(len1>len2)
return1;
else
if(len1<len2)
return-1;
else
return0;}常規(guī)練習(xí)–不使用比較運(yùn)算符對字符串大小進(jìn)行比較36字符串的常用函數(shù)find()函數(shù)返回給定字符串中第一次出現(xiàn)的索引,如果find()函數(shù)沒找到,返回string::nposstring::npos在string.h中定義,為一個(gè)非零值,代表沒未找到find函數(shù)區(qū)分大小寫字符串變量.find(待查找字符串)下面的示例演示了從字符串str中分別查找兩個(gè)子串,并返回不同的結(jié)果string
str=“helloworld”;intpos1=str.find(“world”);
//返回查找到的以0開始的下標(biāo)位置:6intpos2=str.find(“World”);//因?yàn)閰^(qū)分大小寫,此時(shí)將返回string::npos常規(guī)練習(xí)–使用find函數(shù)驗(yàn)證子串問題描述輸入兩個(gè)字符串s1和s2,其中一個(gè)串是否為另一個(gè)字符串的子串。輸入格式輸入兩個(gè)字符串s1和s2,每個(gè)字符串占一行,長度不超過200且不含空格輸出格式如果s2是s1的子串,輸出(s2)issubstringof(s1),若s1是s2的子串,則輸出(s1)issubstringof(s2),否則,輸出“Nosubstring”,輸入樣例
dddncabcaabc輸出樣例abcissubstringofdddncabca參考代碼intmain(){
strings1,s2;
intp1,p2;
cin
>>s1>>s2;p1=s1.find(s2);//s1中查s2p2=s2.find(s1);//s2中查s1
if(p1!=string::npos)
//s1中找到s2
cout<<s1<<
“issubstringof”<<s2;
elseif(p2!=string::npos)
//s2中找到s1
cout<<s2<<
“issubstringof”<<s1;
else
cout<<
“Nosubstring”
return0;}常規(guī)練習(xí)–使用find函數(shù)驗(yàn)證子串常規(guī)練習(xí)–模擬實(shí)現(xiàn)字符串的find函數(shù)問題描述輸入兩個(gè)字符串s1和s2,驗(yàn)證s2是否為s1的子串,并返回s2在s1中的開始位置。輸入格式輸入兩個(gè)字符串s1和s2,每個(gè)字符串占一行,長度不超過200且不含空格輸出格式如果在s1中能找到s2,返回s2在s1中的開始位置,否則返回string::npos輸入樣例1輸入樣例2dddncabcadddncabcaabcadc輸出樣例1輸出樣例25string::npos思路挪動字符串s2,對準(zhǔn)字符串s1的各個(gè)
位置;逐一比對字符,判斷是否相等s1:ababcabcs2:abc1、ababcabc|||abc2、ababcabc|||abc3、ababcabc|||abc常規(guī)練習(xí)–模擬實(shí)現(xiàn)字符串的find函數(shù)參考代碼intMyStrFind(stringstr1,stringstr2){
intlen1=str1.length();
intlen2=str2.length();
for(inti=0;i<len1-len2;i++){j=0;
while((j<len2)
&&str1[i+j]==str2[j])
j++;//逐一比對
if(j==len2)
returni;//找到子串
}
returnstring::npos;//沒有找到}常規(guī)練習(xí)–模擬實(shí)現(xiàn)字符串的find函數(shù)42字符串的常用函數(shù)substr()函數(shù)返回一個(gè)字符串的從指定位置開始的指定長度的子串字符串變量.substr(子串開始位置,子串長度)下面的示例演示了從字符串str中取出一個(gè)子串string
str1=“ABCD*FGHIJK”;string
str2=str1.substr(5,3);//str2是從str1中的下標(biāo)位置5開始,取3個(gè)字符,所以結(jié)果為“FGH”常規(guī)練習(xí)–圖書編碼校驗(yàn)問題描述(1/2)每一本正式出版的圖書都有一個(gè)圖書編碼與之對應(yīng),圖書編碼包括9位數(shù)字、1位識別碼和3位分隔符,其規(guī)定格式如”x-xxx-xxxxx-x”,其中符號’-’是分隔符,最后一位是識別碼,例如0-670-82162-4就是一個(gè)標(biāo)準(zhǔn)的圖書編碼。圖書編碼的首位數(shù)字表示書籍的出版語言;第一個(gè)分隔符”-”之后的三位數(shù)字代表出版社;第二個(gè)分隔符之后的五位數(shù)字代表該書在出版社的編號;最后一位為識別碼。識別碼生成規(guī)則為:首位數(shù)字乘以1加上次位數(shù)字乘以2……以此類推,用所得的結(jié)果mod11,所得的余數(shù)即為識別碼,如果余數(shù)為10,則識別碼為大寫字母X。例如編碼0-670-82162-4中的識別碼4是這樣得到的:對”067082162”這9個(gè)數(shù)字,從左至右,分別乘以1,2,……,9,再求和,即0×1+6×2+……+2×9=158,然后取158mod11的結(jié)果4作為識別碼。問題描述(2/2)任務(wù)是編寫程序判斷輸入的編碼中識別碼是否正確,如果正確,則僅輸出“Right”;如果錯誤,則輸出你認(rèn)為是正確的編碼。輸入格式只有一行,是一個(gè)字符序列,表示一本書的編碼(保證輸入符合編碼的格式要求)輸出格式共一行,假如輸入的識別碼正確,那么輸出“Right”,否則,按照規(guī)定的格式,輸出正確的編碼(包括分隔符“-”)常規(guī)練習(xí)–圖書編碼校驗(yàn)輸入樣例10-670-82162-4輸出樣例1Right輸入樣例20-670-82162-0輸出樣例20-670-82162-4常規(guī)練習(xí)–圖書編碼校驗(yàn)參考代碼(1/2)charIsbnCRC(stringisbn){
stringstr=isbn.substr(0,1)+isbn.substr(2,3)+isbn.substr(6,5);
intsum=0;
for(inti=0;i<9;i++) { sum=sum+(str[i]-'0')*(i+1); } sum=sum%11;
if(sum==10)return‘X’;
elsereturn(sum+‘0’);}常規(guī)練習(xí)–圖書編碼校驗(yàn)參考代碼(2/2)intmain(){
stringisbn;
cin
>>isbn;
charcrc=IsbnCRC(isbn);
if(crc==isbn[12])
//獲取校驗(yàn)碼
cout
<<“Right”;//正確
elsecout
<<
(isbn.substr(0,12)+crc);//錯誤
return0;}常規(guī)練習(xí)–圖書編碼校驗(yàn)常規(guī)練習(xí)–模擬實(shí)現(xiàn)substr()函數(shù)問題描述模擬實(shí)現(xiàn)substr()函數(shù),獲取指定字符串的子串輸入格式三行,第一行為完整字符串,不帶空格,第二行為子串的開始位置,第三行為子串的長度輸出格式一行字符串,從完整字符串中獲取的子串常規(guī)練習(xí)–模擬實(shí)現(xiàn)substr()函數(shù)輸入樣例Helloworld53輸出樣例wor參考代碼stringMySubstr(stringstr,intstart,intlen){stringrstr=“”;
for(inti=0;i<len;i++)
{rstr+=str[start+i];
}returnrstr;}50字符串的常用函數(shù)erase()函數(shù)從一個(gè)字符串中刪除指定長度的字符串,并返回刪除后的字符串字符串變量.erase(開始位置,刪除長度)下面的示例演示了從字符串str中刪除若干連續(xù)字符string
str=“ABCD*FGHIJK”;cout<<
str.erase(5,3);//從str中的下標(biāo)位置5開始,刪除3個(gè)字符,所以結(jié)果為“ABCD*IJK”常規(guī)練習(xí)–刪除單詞后綴問題描述給定一個(gè)單詞,如果該單詞以er、ly或者ing后綴結(jié)尾,則刪除該后綴(題目保證刪除后綴后的單詞長度不為0),否則不進(jìn)行任何操作。輸入格式一行,包含一個(gè)單詞(單詞中間沒有空格,每個(gè)單詞最大長度為32)輸出格式一行,如果有上述要求的后綴,則返回刪除后綴后的單詞;如果沒有,則單詞原樣返回。輸入樣例輸出樣例refererrefer常規(guī)練習(xí)–刪除單詞后綴參考代碼intmain(){stringword;
cin
>>word;
intlen=word.length();strings1=word.substr(len-2,2);//取后兩位字符strings2=word.substr(len-3,3);//取后三位字符
if(s1==“er”||s1==“l(fā)y”)word.erase(len-2,2);
else
if(s2==“ing”)word.erase(len-3,3);
cout
<<word;return0;}53字符串的常用函數(shù)replace()函數(shù)返回字符串從pos位置起始的用str1串替換length長度字符后的字符串字符串變量.replace(pos,length,str1)下面的示例演示了從字符串str中用指定字符串替換掉若干字符string
str=“ABCD*FGHIJK”;cout<<
str.replace(5,2,”xyz”);//從str中的下標(biāo)位置5開始,用“xyz”替換掉2個(gè)字符,所以結(jié)果為“ABCD*xyzHIJK”常規(guī)練習(xí)–單詞替換問題描述輸入一個(gè)字符串,以回車結(jié)束(字符串長度<=100)。該字符串由若干個(gè)單詞組成,單詞之間用一個(gè)空格隔開,所有單詞區(qū)分大小寫。現(xiàn)需要將其中的某個(gè)單詞替換成另一個(gè)單詞,并輸出替換之后的字符串。輸入格式輸入包括三行,第一行是包含多個(gè)單詞的字符串s;第二行是待替換的單詞a(長度<=100);第三行是a將被替換的單詞b(長度<=100)輸出格式一行,將s中所有單詞a替換成b之后的字符串。常規(guī)練習(xí)–單詞替換輸入樣例YouwantsomeonetohelpYouYouHe輸出樣例HewantsomeonetohelpHe思路使用find()函數(shù)查找待替換單詞,使用replace()函數(shù)進(jìn)行替換常規(guī)練習(xí)–單詞替換參考代碼(1/2)stringWordReplace(stringstr,strings1,strings2){intp=str.find(s1);//查找第一個(gè)單詞while(p!=string::npos){
str.replace(p,s1.length(),s2);//替換找到的單詞
p=str.find(s1);//繼續(xù)查找下一個(gè)}returnstr;}常規(guī)練習(xí)–單詞替換參考代碼(2/2)intmain(){
stringstr,s1,s2;getline(cin,str);
cin>>s1>>s2;str=WordReplace(str,s1,s2);cout<<str;returnstr;}58字符串的常用函數(shù)insert()函數(shù)從位置pos處插入字符串str,并返回插入后的字符串字符串變量.insert(pos,str)下面的示例演示了向字符串str中插入指定的字符串string
str=“ABCD*FGHIJK”;cout<<
str.insert(2,”xyz”);//從str中的下標(biāo)位置2開始,插入字符串“xyz”,所以結(jié)果為“ABxyzCD*FGHIJK”常規(guī)練習(xí)–笨小猴的幸運(yùn)單詞問題描述笨小猴的詞匯量很小,所以每次做英語選擇題的時(shí)候都很頭疼。但是他找到了一種方法,經(jīng)試驗(yàn)證明,用這種方法去選擇選項(xiàng)的時(shí)候選對的幾率非常大。這種方法的具體描述如下:假設(shè)maxn是單詞中出現(xiàn)次數(shù)最多的字母的出現(xiàn)次數(shù),minn是單詞中出現(xiàn)次數(shù)最少的字母的出現(xiàn)次數(shù),如果maxn-minn是一個(gè)質(zhì)數(shù),那么笨小猴就認(rèn)為這是個(gè)LuckyWord,這樣的單詞很可能就是正確的答案。輸入格式只有一行,是一個(gè)單詞,其中只可能出現(xiàn)小寫字母,并且長度小于100常規(guī)練習(xí)–笨小猴的幸運(yùn)單詞輸出格式共兩行,第一行是一個(gè)字符串,假設(shè)輸入的的單詞是LuckyWord,那么輸出“LuckyWord”,否則輸出“NoAnswer”;第二行是一個(gè)整數(shù),如果輸入單詞是LuckyWord,輸出maxn-minn的值,否則輸出0。輸入樣例1輸入樣例2errorolympic輸出樣例1輸出樣例2LuckyWordNoAnswer20參考代碼(1/2)intLuckyWord(stringword){
inta[26]={0};//每個(gè)字符有一個(gè)計(jì)數(shù)器
for(inti=0;i<word.size();i++) a[word[i]-97]++;//按字符計(jì)數(shù)
intmax=a[0];
for(inti=0;i<26;i++)
if(max<a[i])max=a[i];//查找最多字符數(shù)
intmin=max;
for(inti=0;i<26;i++)
//查找最少字符數(shù)
if(a[i]>0&&min>a[i])min=a[i];
returnmax-min;//返回最多最少數(shù)差}常規(guī)練習(xí)–笨小猴的幸運(yùn)單詞參考代碼(2/2)常規(guī)練習(xí)–笨小猴的幸運(yùn)單詞intmain(){
stringstr;
cin>>str;
inta=LuckyWord(str);//計(jì)算差值a=PrimeNumber(a);//質(zhì)數(shù)判斷
if(a==1)
cout
<<“LuckyWord”<<endl<<a;
else
cout
<<“NoAnswer”<<endl<<“0”;returnstr;}intPrimeNumber(inta)//質(zhì)數(shù)判斷{
if(a==0)
return0;
for(inti=2;i<=a-1;i++) {
if(a%i==0)
return0;//非質(zhì)數(shù) }
return1;//質(zhì)數(shù)}提高練習(xí)–單詞統(tǒng)計(jì)問題描述給出一個(gè)單詞(長度不超過10)給出一段文本(長度不超過1000)END_OF_TEXT結(jié)束,可以換行求單詞在該文本中的次數(shù)(區(qū)分大小寫)輸入格式至少三行,第一行為要統(tǒng)計(jì)的單詞,最后一行為結(jié)束標(biāo)志END_OF_TEXT輸出格式一行,為統(tǒng)計(jì)出的單詞個(gè)數(shù)輸入樣例computer
Nurturescomputerscientistsandhighly-skilledcomputerengineerswhowillcreateandexploit"knowledge"forthenewera.Providesanoutstandingcomputerenvironment.END_OF_TEXT輸出樣例3提高練習(xí)–單詞統(tǒng)計(jì)參考代碼提高練習(xí)–單詞統(tǒng)計(jì)intmain(){intcnt=0;strings,word;
cin
>>word;cin>>s;while(s!=“END_OF_TEXT”){if(s==word)cnt++;
cin
>>s;
}
return0;}提高練習(xí)–高精度加法計(jì)算問題描述在編程進(jìn)行數(shù)值計(jì)算時(shí),有時(shí)會遇到運(yùn)算的精度非常高,遠(yuǎn)遠(yuǎn)超過各種數(shù)據(jù)類型所表示的精度范圍,有時(shí)數(shù)據(jù)又特別大,遠(yuǎn)遠(yuǎn)超過各種數(shù)據(jù)類型的極限值。要求輸入兩個(gè)超大的數(shù)據(jù),計(jì)算兩數(shù)之和。輸入格式兩行,每行均為一個(gè)全部由數(shù)字字符組成的字符串,不限長度輸出格式一行,為兩個(gè)數(shù)字字符串相加的和值,以數(shù)字字符串的形式輸出提高練習(xí)–高精度加法計(jì)算思路模擬數(shù)字相加的過程,從兩數(shù)字字符串的最右側(cè)開始,一一相加,組裝結(jié)果兩串輸入不一定誰長誰短,計(jì)算前調(diào)整一下,固定使串1短串2長或串2短串1長,以使計(jì)算更方便參考代碼stringStrAdd(stringadd1,stringadd2){
if(add1.size()>add2.size())//看看誰短誰在前面補(bǔ)0
for(inti=0;i<add1.size()-add2.size();i++) add2='0’+add2;
else
for(inti=0;i<add2.size()-add1.size();i++) add1='0'+add1;
intb=0;//進(jìn)位
stringres;//結(jié)果存放
for(inti=add1.size()-1;i>=0;i--)
{
inta=(add1[i]-‘0’)+(add2[i]-‘0’)+b;//計(jì)算當(dāng)前位置 b=a/10;//進(jìn)位值 a=a%10;//當(dāng)前位置的結(jié)果值 res=(char)(a+‘0’)+res;//組裝結(jié)果
}
if(b==1)res=‘1’+res;//最高位可能仍有進(jìn)位
returnres;}提高練習(xí)–高精度加法計(jì)算intmain(){
stringa,b;
cin>>a>>b;
cout<<StrAdd(a,b);
return0;}提高練習(xí)–高精度減法計(jì)算問題描述在編程進(jìn)行數(shù)值計(jì)算時(shí),有時(shí)會遇到運(yùn)算的精度非常高,遠(yuǎn)遠(yuǎn)超過各種數(shù)據(jù)類型所表示的精度范圍,有時(shí)數(shù)據(jù)又特別大,遠(yuǎn)遠(yuǎn)超過各種數(shù)據(jù)類型的極限值。要求輸入兩個(gè)超大的數(shù)據(jù),計(jì)算兩數(shù)之差。輸入格式兩行,第一行為被減數(shù),第二行為減數(shù),必須全部為數(shù)字字符,不限長度輸出格式一行,為兩個(gè)數(shù)字字符串相減的差值,以數(shù)字字符串的形式輸出提高練習(xí)–高精度減法計(jì)算思路模擬數(shù)字相減的過程,從兩數(shù)字字符串的最右側(cè)開始,一一相減,組裝結(jié)果存在被減數(shù)小于減數(shù)的情況,為減少編程復(fù)雜度,可以先固定調(diào)整為串1大串2小,最后根據(jù)調(diào)整情況決定是否將結(jié)果加負(fù)號最終結(jié)果可能存在前面有若干個(gè)0的情況,要全部去掉參考代碼(1/2)stringStrSubt(strings1,strings2){
stringresult;
intexch=0,b=0,a;//exch:是否已做交換b:借位標(biāo)志
if(s1.length()<s2.length()||//1短2長
(s1.length()==s2.length()&&s1<s2)){//等長1小2大stringtemp=s1;s1=s2;s2=temp;//交換,保證1大2小exch=1;//交換標(biāo)志,說明1小2大,結(jié)果應(yīng)為負(fù)
}
intd=s1.size()–s2.size();//長度差用來計(jì)算錯位
for(inti=s1.size()-1;i>=0;i--) { a=s1[i]-‘0’-b;//減借位的1
if(i-d>=0)a-=(s2[i-d]-‘0’);//還在短串范圍內(nèi)
if(a<0){b=1;a=a+10;}
//仍需借位
elseb=0; result=(char)(a+‘0’)+result;//組裝結(jié)果
}//接下頁……
提高練習(xí)–高精度減法計(jì)算intmain(){
stringa,b;
cin>>a>>b;
cout<<StrSubt(a,b);
return0;}參考代碼(2/2)//接上頁stringStrSubt(strings1,strings2)//可能存在前導(dǎo)0,去掉
intk;
for(k=0;k<result.size();k++)
{
if(result[k]!='0')
break; } result=result.substr(k,result.size()-k);
if(exch==1)result=“-”+result;//存在交換,結(jié)果為負(fù)
returnresult;}提高練習(xí)–高精度減法計(jì)算提高練習(xí)–高精度乘法計(jì)算問題描述在編程進(jìn)行數(shù)值計(jì)算時(shí),有時(shí)會遇到運(yùn)算的精度非常高,遠(yuǎn)遠(yuǎn)超過各種數(shù)據(jù)類型所表示的精度范圍,有時(shí)數(shù)據(jù)又特別大,遠(yuǎn)遠(yuǎn)超過各種數(shù)據(jù)類型的極限值。要求輸入兩個(gè)超大的數(shù)據(jù),計(jì)算兩數(shù)之乘積。輸入格式兩行,第一行為被乘數(shù),第二行為乘數(shù),必須全部為數(shù)字字符,不限長度輸出格式一行,為兩個(gè)數(shù)字字符串相乘的積,以數(shù)字字符串的形式輸出思路模擬數(shù)字相乘的過程,從兩數(shù)字字符串的最右側(cè)開始,一一相乘,組裝結(jié)果為方便編程,可以先固定調(diào)整為串1長串2短提高練習(xí)–高精度乘法計(jì)算參考代碼intmain(){
stringa,b;
cin>>a>>b;
cout<<StrPlus(a,b);
return0;}提高練習(xí)–高精度乘法計(jì)算stringStrPlu
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024影樓與化妝師合作化妝造型服務(wù)合同書3篇
- 2024年高端酒店租賃服務(wù)詳細(xì)協(xié)議
- 2024年綠色環(huán)保家居建材供應(yīng)與安裝合同3篇
- 2024年航空航天器零部件制造合同
- 2024年貨物清關(guān)代理合同
- 2024年短期租賃轎車協(xié)議
- 2024林業(yè)土地承包合同涉及林地征收補(bǔ)償協(xié)議
- 2024橋梁工程橋梁加固設(shè)計(jì)與施工承包合同樣本2篇
- 2024年銅門行業(yè)質(zhì)量認(rèn)證與標(biāo)準(zhǔn)執(zhí)行合同3篇
- 2024年石油化工產(chǎn)品海運(yùn)出口合同
- 電商直播帶貨運(yùn)營方案(電商直播運(yùn)營部門職責(zé)說明與KPI指標(biāo) 電商直播運(yùn)營部門KPI績效考核指標(biāo))
- 110kV變電站專項(xiàng)電氣試驗(yàn)及調(diào)試方案
- 地質(zhì)勘探勞務(wù)分包合同
- 上海市徐匯區(qū)位育中學(xué)六年級上學(xué)期期末英語試題(含聽力)
- 2023中國光大銀行杭州分行招聘客戶經(jīng)理筆試歷年典型考題及考點(diǎn)剖析附帶答案詳解
- 2024中國食藥同源大健康產(chǎn)業(yè)消費(fèi)洞察與產(chǎn)業(yè)發(fā)展分析白皮書
- 2023-2024學(xué)年廣東省佛山市南海區(qū)、三水區(qū)九年級(上)期末英語試卷
- 蘇教版科學(xué)六年級上冊期末測試卷附完整答案【典優(yōu)】
- 二年級上冊數(shù)學(xué)解決問題60道附參考答案【典型題】
- DZ∕T 0215-2020 礦產(chǎn)地質(zhì)勘查規(guī)范 煤(正式版)
- 山東省濟(jì)南市槐蔭區(qū)2023-2024學(xué)年九年級上學(xué)期期末語文試題(含答案解析)
評論
0/150
提交評論