1.1:查閱你使用的編譯器的文檔,確定它所使用的文件命名約定。編譯并運行main程序。
頭文件后綴一般是.h或.hpp等,源文件后綴一般是.c或.cpp等。
我使用的是VS2022,命令行可以輸入 cl 文件名 可以在當前目錄下生成.exe文件,然后雙擊打開即可運行。
1.2:改寫程序,讓它返回-1。返回值-1通常被當作程序錯誤的標識。重新編譯并運行你的程序,觀察你的系統(tǒng)如何處理main返回的錯誤標識。
int main() {
return -1;
}
在Windows操作系統(tǒng)下main函數(shù)沒有報告運行失敗,因此返回0或-1在運行效果沒有什么區(qū)別。
1.3:編寫程序,在標準輸出上打印Hello,World。
#include<iostream>
int main()
{
std::cout << "Hello , World。" << std::endl;
return 0;
}
1.4:我們的程序使用加法運算符+來將兩個數(shù)相加。編寫程序使用乘法運算符*,來打印兩個數(shù)的積。
#include<iostream>
int main()
{
std::cout << "請輸入兩個數(shù)" << std::endl;
int v1 = 0, v2 = 0;
std::cin >> v1 >> v2;
std::cout << v1 << "和" << v2 << "的乘積為" << v1 * v2 << std::endl;
return 0;
}
1.5:我們將所有輸出操作放在一條很長的語句中。重寫程序,將每個運算對象的打印操作放在一條獨立的語句中。
#include<iostream>
int main()
{
std::cout << "請輸入兩個數(shù)" << std::endl;
int v1 = 0, v2 = 0;
std::cin >> v1 >> v2;
std::cout << v1;
std::cout << "和";
std::cout << v2;
std::cout << "的乘積為";
std::cout << v1 * v2 << std::endl;
return 0;
}
1.6:解釋下面程序片段是否合法。如果程序是合法的,它將輸出什么?如果程序不合法,原因何在?應(yīng)該如何修正?
錯誤代碼
#include<iostream>
int main()
{
int v1 = 10, v2 = 20;
std::cout << "The sum of" << v1;
<< "and" << v2;
<< "is" << v1 + v2 << std::endl;
}
不合法
第5行和第6行代碼最后分別有一個分號,表示語句結(jié)束。而第6行和第7行<<操作符為二元操作符,兩行第一個<<操作符沒有左操作數(shù),因此不合法。
修正代碼
#include<iostream>
int main()
{
std::cout << "The sum of" << v1
<< "and" << v2
<< "is" << v1 + v2 << std::endl;
return 0;
}
1.7:編譯一個包含不正確的嵌套注釋的程序,觀察編譯器返回的錯誤信息。
/*
* 注釋對/* */不能嵌套。
* “不能嵌套”幾個字會被認為是源碼,像剩余程序一樣處理
*/
int main() {
return 0;
}
1.8:指出下列哪些輸出語句是合法的(如果有的話):預(yù)測編譯這些語句會產(chǎn)生什么樣的結(jié)果,實際編譯這些語句來驗證你的答案,改正每個編譯錯誤。
#include<iostream>
int main()
{
std::cout << "/*"; //合法 打印/*
std::cout << "*/"; //合法 打印*/
std::cout<< /* "*/" */; //不合法 缺少右引號
//改正代碼
std::cout << /* "*/" */";
std::cout <</* "*/" /* "/*" */; //合法 打印/*
return 0;
}
1.9:編寫程序,使用while循環(huán)將50到100的整數(shù)相加。
#include<iostream>
int main()
{
int sum = 0, val = 50;
while (val <= 100)
{
sum += val;
++val;
}
std::cout << "50-100的整數(shù)和為" << sum << std::endl;
return 0;
}
1.10:除了++運算符將運算對象的值增加1之外,還有一個遞減運算符(–)實現(xiàn)將值減少1。編寫程序,使用遞減運算符在循環(huán)中按遞減順序打印出10到0之間的整數(shù)。
#include<iostream>
int main()
{
int val = 10;
while (val >= 0)
{
std::cout << val << std::endl;
--val; //每次循環(huán)val的值減1
}
return 0;
}
1.11:編寫程序,提示用戶輸入兩個整數(shù),打印出這兩個整數(shù)所指定的范圍內(nèi)的所有整數(shù)。
#include<iostream>
int main()
{
int v1 = 0, v2 = 0;
std::cout << "請輸入兩個整數(shù):";
std::cin >> v1 >> v2;
//如果v1大于v2,則交換v1和v2的值
if (v1 > v2) {
v1 = v1 - v2;
v2 = v1 + v2;
v1 = v2 - v1;
}
while (v1 < (v2-1)) {
v1++;
std::cout << v1 << std::endl;
}
system("pause"); //凍結(jié)屏幕,便于觀察程序的執(zhí)行結(jié)果
return 0;
}
1.12:下面的for循環(huán)完成了什么功能?sum的終值是多少?
sum = (-100)+(-99)+…+(-1)+0+1+…+99+100 = 0
#include<iostream>
int main()
{
int sum = 0;
for (int i = -100; i <= 100; i++)
sum += i;
std::cout << sum << std::endl;
return 0;
}
1.13:使用for循環(huán)重做1.4.1中所有練習。
#include<iostream>
int main()
{
int sum = 0, val = 50;
for(val = 50;val <= 100; ++val)
{
sum += val;
}
std::cout << "50-100的整數(shù)和為" << sum << std::endl;
return 0;
}
#include<iostream>
int main()
{
int val = 10;
for(val = 10;val >= 0; --val)
{
std::cout << val << std::endl;
}
return 0;
}
#include<iostream>
int main()
{
int v1 = 0, v2 = 0;
std::cout << "請輸入兩個整數(shù):";
std::cin >> v1 >> v2;
//如果v1大于v2,則交換v1和v2的值
if (v1 > v2) {
v1 = v1 - v2;
v2 = v1 + v2;
v1 = v2 - v1;
}
for (int i = v1 + 1; i < v2; i++) {
std::cout << i << std::endl;
}
system("pause");
return 0;
}
1.14:對比for循環(huán)和while循環(huán),兩種形式的優(yōu)缺點各是什么?
while的優(yōu)點和缺點:
- 結(jié)構(gòu)不清晰,循環(huán)控制變量的初始化在while語句之前,其改變在while循環(huán)體中
- 適用于不知道具體循環(huán)次數(shù)的情況
for的優(yōu)點和缺點:
- 結(jié)構(gòu)清晰,循環(huán)控制變量的初始化和修改都放在語句頭部分
- 適用于已知循環(huán)次數(shù)的情況
1.15:編寫程序,包含第14頁“再探編譯”中討論的常見錯誤。熟悉編譯器生成的錯誤信息。
請自行嘗試。
1.16:編寫程序,從cin讀取一組數(shù),輸出其和。
#include <iostream>
int main() {
int sum = 0, value = 0;
while (std::cin >> value)
sum += value;
std::cout << "Sum is " << sum << std::endl;
system("pause");
return 0;
}
在Windows系統(tǒng)中,輸入文件結(jié)束符的方法是Ctrl+Z,然后按Enter或Return。
在UNIX系統(tǒng)中,文件結(jié)束符輸入是Ctrl+D。
1.17 如果輸入的所有值都是相等的,本節(jié)的程序會輸出什么?如果沒有重復值,輸出又會是怎樣的?
見1.18
1.18 編譯并運行本節(jié)的程序,給它輸入全都相等的值。再次運行程序,輸入沒有重復的值。
#include <iostream>
int main() {
// currVal 是我們正在統(tǒng)計的數(shù);我們將讀入的新值存入val
int currVal = 0, val = 0;
// 讀取第一個數(shù),并確保確實有數(shù)據(jù)可以處理
if (std::cin >> currVal) {
int cnt = 1; // 保存我們正在處理的當前值的個數(shù)
while (std::cin >> val) { // 讀取剩余的數(shù)
if (currVal == val) // 如果值相同
++cnt; // 將cnt加1
else { // 否則,打印前一個值的個數(shù)
std::cout << currVal << " occurs "
<< cnt << " times" << std::endl;
currVal = val; // 記住新值
cnt = 1; // 重置計數(shù)器
}
} // while循環(huán)在這里結(jié)束
// 記住打印文件中最后一個值的個數(shù)
std::cout << currVal << " occurs " << cnt << " times" << std::endl;
} // 最外層的if語句在這里結(jié)束
system("pause");
return 0;
}
輸出:
1 1 1 1 1 1 1 1^Z
1 occurs 8 times
1 2 3 4 5 6 7^Z
1 occurs 1 times
2 occurs 1 times
3 occurs 1 times
4 occurs 1 times
5 occurs 1 times
6 occurs 1 times
7 occurs 1 times
1.19 修改你為1.4.1節(jié)練習1.11(第11頁)所編寫的程序(打印一個范圍內(nèi)的數(shù)),使其能處理用戶輸入的第一個數(shù)比第二個數(shù)小的情況。
見1.11
1.20 在網(wǎng)站http://www.informit.com/title/032174113 上,第1章的代碼目錄包含了頭文件 Sales_item.h。將它拷貝到你自己的工作目錄中。用它編寫一個程序,讀取一組書籍銷售記錄,將每條記錄打印到標準輸出上。
Sales_item.h
#pragma once
#ifndef SALESITEM_H
#define SALESITEM_H
#include <iostream>
#include <string>
class Sales_item {
public:
Sales_item(const std::string& book) :isbn(book), units_sold(0), revenue(0.0) {}
Sales_item(std::istream& is) { is >> *this; }
friend std::istream& operator>>(std::istream&, Sales_item&);
friend std::ostream& operator<<(std::ostream&, const Sales_item&);
public:
Sales_item& operator+=(const Sales_item&);
public:
double avg_price() const;
bool same_isbn(const Sales_item& rhs)const {
return isbn == rhs.isbn;
}
Sales_item() :units_sold(0), revenue(0.0) {}
public:
std::string isbn;
unsigned units_sold;
double revenue;
};
using std::istream;
using std::ostream;
Sales_item operator+(const Sales_item&, const Sales_item&);
inline bool operator==(const Sales_item& lhs, const Sales_item& rhs) {
return lhs.units_sold == rhs.units_sold && lhs.revenue == rhs.revenue && lhs.same_isbn(rhs);
}
inline bool operator!=(const Sales_item& lhs, const Sales_item& rhs) {
return !(lhs == rhs);
}
inline Sales_item& Sales_item::operator +=(const Sales_item& rhs) {
units_sold += rhs.units_sold;
revenue += rhs.revenue;
return *this;
}
inline Sales_item operator+(const Sales_item& lhs, const Sales_item& rhs) {
Sales_item ret(lhs);
ret += rhs;
return ret;
}
inline istream& operator>>(istream& in, Sales_item& s) {
double price;
in >> s.isbn >> s.units_sold >> price;
if (in)
s.revenue = s.units_sold * price;
else
s = Sales_item();
return in;
}
inline ostream& operator<<(ostream& out, const Sales_item& s) {
out << s.isbn << "\t" << s.units_sold << "\t" << s.revenue << "\t" << s.avg_price();
return out;
}
inline double Sales_item::avg_price() const {
if (units_sold)
return revenue / units_sold;
else
return 0;
}
#endif
1.20.cpp
#include <iostream>
#include "Sales_item.h"
int main() {
Sales_item book;
while (std::cin >> book)
std::cout << book << std::endl;
system("pause");
return 0;
}
結(jié)果:
0-201-70353-X 4 24.99
0-201-70353-X 4 99.96 24.99
0-201-70353-X 3 20
0-201-70353-X 3 60 20
0-201-70353-X 1 22
0-201-70353-X 1 22 22
0-201-70353-X 5 23
0-201-70353-X 5 115 23
0-201-70353-X 6 24
0-201-70353-X 6 144 24
0-201-70353-X 8 26
0-201-70353-X 8 208 26
0-201-70353-X 2 20
1.21 編寫程序,讀取兩個 ISBN 相同的 Sales_item 對象,輸出他們的和。
#include <iostream>
#include "Sales_item.h"
int main() {
Sales_item item1, item2;
std::cin >> item1 >> item2; // 讀取一對交易記錄
std::cout << item1 + item2 << std::endl; // 打印它們的和
system("pause");
return 0;
}
結(jié)果:
0-201-70353-X 2 30
0-201-70353-X 3 20
0-201-70353-X 5 120 24
1.22 編寫程序,讀取多個具有相同 ISBN 的銷售記錄,輸出所有記錄的和。
#include <iostream>
#include "Sales_item.h"
int main() {
Sales_item item, sum;
while (std::cin >> item)
sum += item;
std::cout << sum << std::endl;
system("pause");
return 0;
}
輸出:文章來源:http://www.zghlxwxcb.cn/news/detail-429722.html
1-01 2 100
1-01 2 100
1-01 3 100
1-01 7 700 100^Z
1-01 14 5600 400
1.23:編寫程序,讀取多條銷售記錄,并統(tǒng)計每個ISBN(每本書)有幾條銷售記錄。
#include<iostream>
#include "Sales_item.h"
int main() {
Sales_item currItem, item;
int cnt = 1;
if (std::cin >> currItem) {
while (std::cin >> item) {
if(currItem.isbn == item.isbn){
cnt++;
}
else {
std::cout << currItem.isbn << " has " << cnt << " records" << std::endl;
cnt = 1;
currItem = item;
}
}
std::cout << currItem.isbn << " has " << cnt << " records" << std::endl;
}
system("pause");
return 0;
}
1.24 輸入表示多個 ISBN 的多條銷售記錄來測試上一個程序,每個 ISBN 的記錄應(yīng)該聚在一起。
0-201-70353-X 4 24.99
0-201-70353-X 3 20
0-201-70353-X 2 30
0-201-70353-X 5 23
0-201-70353-X 6 24
0-201-70353-X 8 26
0-201-70351-X 2 20
0-201-70352-X 2 20^Z
0-201-70353-X has 6 records
0-201-70351-X has 1 records
0-201-70352-X has 1 records
1.25 借助網(wǎng)站上的 Sales_item.h 頭文件,編譯并運行本節(jié)給出的書店程序。
#include <iostream>
#include "Sales_item.h"
int main() {
Sales_item total; //保存下一條交易記錄的變量
//讀入第一條交易記錄,并確保有數(shù)據(jù)可以處理
if (std::cin >> total) {
Sales_item trans; //保存和的變量
//讀入并處理剩余交易記錄
while (std::cin >> trans) {
//如果我們?nèi)栽谔幚硐嗤臅?/span>
if (total.isbn == trans.isbn)
total += trans; //更新總銷售額
else {
//打印前一本書的結(jié)果
std::cout << total << std::endl;
total = trans; // total現(xiàn)在表示下一本書的銷售額
}
}
std::cout << total << std::endl; // 打印最后一本書的結(jié)果
}
else {
//沒有輸入!警告讀者
std::cerr << "No data?" << std::endl;
system("pause");
return -1; //表示失敗
}
system("pause");
return 0;
}
結(jié)果:文章來源地址http://www.zghlxwxcb.cn/news/detail-429722.html
0-201-70351-X 1 20
0-201-70351-X 1 20
0-201-70352-X 2 30
0-201-70352-X 2 30
0-201-70353-X 4 25
0-201-70353-X 5 20
0-201-70353-X 5 23
0-201-70353-X 6 24^Z
0-201-70351-X 2 40 20
0-201-70352-X 4 120 30
0-201-70353-X 20 459 22.95
到了這里,關(guān)于【C++ Primer(第5版) 課后習題題目及答案 第一章】的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!