C++ primer 第一章筆記及習題
阿新 • • 發佈:2018-11-01
本章的Github地址:https://github.com/hwl19951007/Cpp_Primer_Exercise/tree/master/Chapter1
筆記
-
<< 運算子為輸出運算子。接受左右兩個物件,左邊必須是一個ostream物件,右邊則是要列印的值。在 << 運算子的鏈中,左側物件始終是第一個接收的物件。
>> 運算子為輸入運算子,在 >> 運算子的鏈中,邏輯同輸出運算子。
舉例如下:
std::cout << "Enter two numbers:" << std::endl;
實際上等價於:
std::cout << "Enter two numbers:";
std::cout << std::endl;
前一句將字串列印到輸出中,第二句將列印句結束。
Std是標準庫的簡寫,std::cout指的是在標準庫這個名稱空間下的cout物件。
- 後續介紹的主要是一些基礎語句,如for迴圈,while迴圈,if語句,以及類的簡介。
練習
練習1.3:編寫程式,在標準輸出上列印Hello, world。
#include <iostream> int main() { std::cout << "Hello World!\n" << std::endl; }
練習1.4:我們的程式使用加法運算子+來將兩個數相加。編寫程式使用乘法運算子*,來列印兩個數的積。
#include <iostream> int main() { std::cout << "Enter two numbers:" << std::endl; int v1 = 0, v2 = 0; std::cin >> v1 >> v2; std::cout << "The sum of " << v1 << " and " << v2 << " is " << v1 * v2 << std::endl; return 0; }
練習1.5:我們將所有輸出操作放在一條很長的語句中。重寫程式,將每個運算物件的列印操作放在一條獨立的語句中。
#include <iostream>
int main()
{
std::cout << "Enter two numbers:" << std::endl;
int v1 = 0, v2 = 0;
std::cin >> v1 >> v2;
std::cout << "The sum of ";
std::cout << v1;
std::cout << " and ";
std::cout << v2;
std::cout << " is ";
std::cout << v1 * v2;
std::cout << std::endl;
return 0;
}
練習1.6:解釋下面程式片斷是否合法:
std::cout << "The sum of " << v1;
<< " and " << v2;
<< " is " << v1 + v2 << std::endl;
不合法,因為在語句中加了分號,使語句邏輯破碎了。解決方法:
std::cout << "The sum of " << v1
<< " and " << v2
<< " is " << v1 + v2 << std::endl;
練習1.7:編譯一個包含不正確的巢狀註釋的程式,觀察編譯器返回的錯誤資訊。
1>c:\users\hwl1995\c++projects\helloworld\helloworld\helloworld.cpp(10): warning C4138: 在註釋外找到“*/”
1>c:\users\hwl1995\c++projects\helloworld\helloworld\helloworld.cpp(10): error C2059: 語法錯誤:“/”
練習1.8: 指出下列哪些輸出語句是合法的(如果有的話):
std::cout << "/*"; //合法 輸出/*
std::cout << "*/"; //合法 輸出*/
std::cout << /* "*/" */; //非法 可修改為std::cout << /* " */"/* */;
std::cout << /* "*/" /* "/*" */; //合法 構成了兩個完整的/**/註釋界定符。只有" /* "沒有落在註釋界定符中, 得以正常輸出。
(C++中可以在句中包含註釋。)
練習1.9:編寫程式,使用while迴圈將50到100的整數相加。
#include <iostream>
int main()
{
int i=50, sum=0;
while (i <= 100) {
sum += i, ++i;
}
std::cout << sum;
return 0;
}
練習1.10:除了++運算子將運算物件的值增加1之外,還有一個遞減運算子(–)實現將值減少1。編寫程式,使用遞減運算子在迴圈中按遞減順序打印出10到0之間的整數。
#include <iostream>
int main()
{
int i = 10;
while (i >= 0) {
std::cout << " " << i;
--i;
}
return 0;
}
練習1.11:編寫程式,提示使用者輸入兩個整數,打印出這兩個整數所指定的範圍內的所有整數。
#include <iostream>
int main()
{
int v1 = 0, v2 = 0;
std::cout << "Enter two numbers:" << std::endl;
std::cin >> v1 >> v2;
while (v2 - v1 >= 0) { //預設v2 > v1
std::cout << " " << v1;
++v1;
}
return 0;
}
練習1.12:下面的for迴圈完成了什麼功能?sum的終值是多少?
int sum = 0;
for (int i = -100; i <= 100; ++i)
sum += i;
完成了從-100到100 的整數相加的過程。終值為0。
練習1.13:使用for 迴圈重做練習1.9,1.10,1.11。
1.9
#include <iostream>
int main()
{
int sum = 0;
for (int i = 50; i <= 100; ++i)
sum += i;
std::cout << sum;
return 0;
}
1.10
#include <iostream>
int main()
{
for (int i = 10; i >= 0; --i)
std::cout << " " << i;
return 0;
}
1.11
#include <iostream>
int main()
{
int v1 = 0, v2 = 0;
std::cout << "Enter two numbers:" << std::endl;
std::cin >> v1 >> v2;
for (;v2 - v1 >= 0; ++v1) //預設v2>v1
std::cout << " " << v1;
return 0;
}
練習1.14:對比for迴圈和while迴圈,兩種形式的優缺點各是什麼?
1、在for迴圈中,迴圈控制變數的初始化和修改都放在語句頭部分,形式較簡潔,且特別適用於迴圈次數已知的情況。
2、在while迴圈中,迴圈控制變數的初始化一般放在while語句之前,迴圈控制變數的修改一般放在迴圈體中,形式上不如for語句簡潔,但它比較適用於迴圈次數不易預知的情況(用某一條件控制迴圈)。
3、兩種形式各有優點,但它們在功能上是等價的,可以相互轉換。
練習1.16:編寫程式,從cin讀取一組數,輸出其和。
#include <iostream>
int main()
{
int value = 0, sum = 0;
std::cout << "Enter some numbers:" << std::endl;
while (std::cin >> value) {
sum += value;
}
std::cout << "The sum of numbers is:" << sum << std::endl;
return 0;
}
練習1.17:如果輸入的所有值都是相等的,本節的程式會輸出什麼?如果沒有重複值,輸出又會是怎麼樣?
1)沒有輸出。2)每輸入一個不同的值,就會輸出前一個值出現了一次的資訊(xxx occurs 1 times)。
練習1.18:編譯並執行本節的程式,給它輸入全都相等的值。再次執行程式,輸入沒有重複的值。
練習1.19:修改你為練習1.11所編寫的程式(列印一個範圍內的數),使其能處理使用者輸入的第一個數比第二個數小的情況。
#include <iostream>
int main()
{
int v1 = 0, v2 = 0;
std::cout << "Enter two numbers:" << std::endl;
std::cin >> v1 >> v2;
if (v1 > v2){
int t;
t = v2;
v2 = v1;
v1 = t;
}
while (v2 - v1 >= 0) {
std::cout << " " << v1;
++v1;
}
return 0;
}
練習1.20:在網站http://www.informit.com/title/0321714113上,第一章的程式碼目錄中包含了標頭檔案Sales_item.h。將它拷貝到你自己的工作目錄中,用它編寫一個程式,讀取一組書籍銷售記錄,將每條記錄列印到標準輸出上。
#include <iostream>
#include "Sales_item.h"
int main()
{
Sales_item item;
while (std::cin >> item)
std::cout << item << std::endl;
return 0;
}
練習1.21:編寫程式,讀取兩個ISBN相同的Sales_item物件,輸出它們的和。
#include <iostream>
#include "Sales_item.h"
int main()
{
Sales_item item1, item2;
std::cout << "Please enter two items that have same ISBN: " << std::endl;
std::cin >> item1 >> item2;
std::cout << "The sum is :" << item1 + item2 << std::endl;
return 0;
}
練習1.22:編寫程式,讀取多個具有相同ISBN的銷售記錄,輸出所有記錄的和。
#include <iostream>
#include "Sales_item.h"
int main()
{
Sales_item item1, item2;
std::cin >> item1;
while (std::cin >> item2 and item1.isbn()==item2.isbn()) {
item1 += item2;
}
std::cout << "The sum is :" << item1 << std::endl;
return 0;
}
練習1.23:編寫程式,讀取多條銷售記錄,並統計每個ISBN(每本書)有幾條銷售記錄。
#include <iostream>
#include "Sales_item.h"
int main()
{
Sales_item item1, item2;
int count = 1;
std::cin >> item1;
while (std::cin >> item2) {
if (item1.isbn() == item2.isbn()) {
count += 1;
}
else {
std::cout << item1.isbn() << " have " << count << " sale records." << std::endl;
item1 = item2;
count = 1;
}
}
return 0;
}