輸入
- 建議用while(cin)的形式
幾乎所有的輸入都是數字或者字符串,根據數字和字符串可以將輸入分為幾種情況:
1.先說數字(通常給定一組數,或者給定給一個數組)
(1)直接輸入一個數,對該數字進行一些操作,例如判斷是否是素數,立方根等,這種類型只需要輸入一個數即可,可用以下幾種輸入:
int N;//定義一個輸入變量用於接收系統輸入的數字
cin >> N;//方式一,直接輸入,再執行相應操作
while (cin >> N) {
//方式二,將輸入放在while后面,這種方式推薦大家用,因為C++的輸入是流的方式,因此用while來判斷接收是比較常用的方法,不容易出錯(一些情況下只能用這種輸入,所以推薦用這種,包括后面的字符串)
}
(2)給定一個數,表示有多少組數(可能是字符和數字的組合)
/*舉個例子,輸入一個數N表示學生人數,然后輸入每個學生的姓名和學號,要求按學號降序打印每個學生的信息,例子如下:
輸入:
3
liming,1410
zhangsan,1562
lisi,1355
輸出:
zhangsan,1562
liming,1410
lisi,1355*/
//對於上例,輸入一般采用以下的方法:
int N;//學生總數
while (cin >> N) { //while里面輸入總數,然后在該循環里面處理
for (int i=0; i<N; i++){ //用for循環輸入N組數據
cin >> stu[i].name >> stu[i].num;//輸入姓名和學號
}
}
//也可以不用while循環(不推薦,除非用while不好處理或者處理不了)
int N;
cin >> N;
for (int i=0; i<N; i++){ //用for循環輸入N組數據
cin >> stu[i].name >> stu[i].num;//輸入姓名和學號
}
//這種方式看似很直觀易懂,但這種方式對於系統里的測試用例來說可能不太友好,一般C++的輸入都強調流的概念,這種方式只能某些情況下可以使用,大家可以自己多刷一刷,就會發現這種方式經常會遇到莫名其妙的錯誤
3)可能直接就是要求輸入一組數,並不告知具體的數量,以(2)的例子為例,如果不告訴你多少個學生,你就無法根據學生數量用for循環輸入了,這時候用while循環就可以很好地處理(流的處理模式)
string name;//定義姓名變量
int num;//定義學號變量
while(cin >> name >> num) {//輸入一組,處理一組
student s = {name,num};
Input.push_back(s);//用一個結構體數組來接收輸入的學生信息即可
//....
}
2. 再說字符(串)(很常見)
(1)給定字符(串),進行相關地處理
//給定字符
char ch;
cin >> ch;//方式一
while (cin.get(ch))//方式二
//給定字符串
string input;
getline(cin,input);//方式一
cin >> input;//方式二
while(方式一/方式二) //方式三
//還是推薦用方式三的輸入方式,不容易出錯,字符串的一些題目用方式一和方式二可能會出錯(由於輸入格式的問題)
(2)給定不止一組字符串,告知大小
//舉個例子,先輸入一個數表示有多少個字符串,再輸入每個字符串,根據字符串長度排序
int N;//定義數量
string temp;//字符串變量
while (cin >> N){ //輸入數量
vector<string> input; //存儲所有的字符串
for(int i=0; i<N; i++){
cin >> temp; //輸入字符串
input.push_back(temp);//保存
}
}
//下面是另一種不安全的寫法
int N;//定義數量
cin>>N;//輸入數量
string temp;//字符串變量
vector<string> input; //存儲所有的字符串
for(int i=0; i<N; i++){
cin >> temp; //輸入字符串
input.push_back(temp);//保存
}
//以該例題為例,可能在本地IDE能得到正確答案,但如果是牛客網系統,由於輸入格式的問題,這樣寫編譯會通過,就是得不到正確答案
(3)輸入一組字符串,不告知大小,仍然以上個例子舉例,不告訴你有多少字符串,這樣就不能根據數量來用for循環做了,但可以用while循環處理
string temp;//字符串變量
vector<string> input; //存儲所有的字符串
while(cin >> temp){ //輸入數量
input.push_back(temp);//保存
//...
}
輸出
C++的輸出cout與輸入cin一樣都是用流來控制的,cin和cout都在iostream這個頭文件中,命名空間為std,因此使用的時候都要加上頭文件和命名空間。輸出相對來說簡單一些,不會出現輸入的一些問題,相反,cout輸出有時候還可以幫助你解決題目,一下列舉一些常見輸出語句
//輸入一個數字再輸出
int num;//定義
cin >> num;//輸入
cout << num << endl;//輸出並且換行
//輸入一個字符串再輸出
string input;//定義
cin >> input;//輸入
cout << input<< endl;//輸出並且換行
//輸入輸出多個數據
int num1,num2;
string s1,s2;
cin >> num1 >> s1;
cin >> num2 >> s2;
cout << num1 << s1 << ' ' << num2 << s2 << endl;
鏈表處理
定義鏈表對應的結構體
struct ListNode
{
int value;
ListNode *next;
//構造函數
ListNode(int valuel, ListNode *nextl = nullptr)
{
value = value1;
next = next1;
}
};
//可以用以下兩種方法創建鏈表節點
ListNode *secondPtr = new ListNode(13.5);
ListNode *head = new ListNode(12.5, secondPtr);
//等價於以下兩句
ListNode *head = new ListNode(13.5);
head = new ListNode(12.5, head);
刪除鏈表,注意內存釋放
//先構造一個臨時節點,用來記錄下一個位置,再依次刪除鏈表節點,最后刪除該臨時節點
void releaseNode(ListNode* node)
{
//創建臨時節點
ListNode* temp = NULL;
if(node == NULL)
{
cout << "鏈表節點內存為空\n";
}
else
{
while(node != NULL)
{
temp = node;
node = node ->next;
delete temp;
cout << "節點內存清除成功\n";
}
}
}