C ++ Primer第5版演習の回答[一般リスト]:https://blog.csdn.net/Dust_Evc/article/details/114334124
2.1
C ++では、 `short`と` int`は少なくとも16ビット、 `long`は少なくとも32ビット、` longlong`は少なくとも64ビットである必要があると規定されています。
符号付きタイプは正、負、および0を表すことができますが、符号なしタイプは0および正の整数のみを表すことができます。
使用法:
1。一般に、 `int`は整数演算に使用されますが、` short`は小さすぎるため、実際にはほとんど使用されません。`long`は通常 `int`と同じサイズです。データが非常に大きい場合は、 `longlong`を使用できます。
2.データが負でないことを確認した場合は、「unsigned」符号なしタイプを使用します。
3.浮動小数点演算を実行するときは、「double」を使用します。これは、「float」は通常、精度が不十分であり、倍精度浮動小数点数と単精度浮動小数点数の計算コストがほぼ同じであるためです。
2.2
`double`または` float`を使用します。
2.3
unsigned u = 10, u2 = 42;
std::cout << u2 - u << std::endl; //32
std::cout << u - u2 << std::endl; //4294967264
int i = 10, i2 = 42;
std::cout << i2 - i << std::endl; //32
std::cout << i - i2 << std::endl; //-32
std::cout << i - u << std::endl; //0
std::cout << u - i << std::endl; //0
2.4
#include <iostream>
int main()
{
unsigned u = 10, u2 = 42;
std::cout << u2 - u << std::endl; // 32
std::cout << u - u2 << std::endl; // 4294967264
int i = 10, i2 = 42;
std::cout << i2 - i << std::endl; // 32
std::cout << i - i2 << std::endl; // -32
std::cout << i - u << std::endl; // 0
std::cout << u - i << std::endl; // 0
return 0;
}
2.5
(a):文字リテラル、ワイド文字リテラル、文字列リテラル、ワイド文字ストリングリテラル
(b):10進整数、10進符号なし整数、10進長整数、8進整数、16進整数
(c):double、float、long double
(d):10進整数、10進符号なし整数、double、double
2.62.6
最初の行は10進整数を定義します。
2行目は8進数の整数を定義していますが、8進数に9がないため、month変数は無効です。
2.7
(a):ファーガスと一緒に行くのは誰ですか?(改行)、文字列タイプ
(b):ロングダブル
(c):接尾辞fは浮動小数点リテラルにのみ使用でき、1024は整数であるため、無効です。
(d):ロングダブル
2.8
int main()
{
std::cout << 2 << "\115\012";
std::cout << 2 << "\t\115\012";
return 0;
}
2.9
(a): 应该先定义再使用。
int input_value = 0;
std::cin >> input_value;
(b): 用列表初始化内置类型的变量时,如果存在丢失信息的风险,则编译器将报错。
double i = { 3.14 };
(c): 在这里 wage 是未定义的,应该在此之前将其定义。
double wage;
double salary = wage = 9999.99;
(d): 不报错,但是小数部分会被截断。
double i = 3.14;
2.10
`global_str`と` global_int`はグローバル変数であるため、初期値はそれぞれ空の文字列と0です。
`local_int`はローカル変数であり、初期化されていません。初期値は未定義です。
`local_str`は文字列クラスのオブジェクトです。その値はクラスによって決定され、空の文字列です。
2.11
(a):定義
(b):定義
(c):宣言
2.12
`(a)`、 `(c)`、 `(d)`は違法です。
2.13
`j`の値は` 100`であり、ローカル変数 `i`はグローバル変数` i`をカバーします。
2.14
正当な。出力は `10045`です。
2.15
`(b)`と `(d)`は不正です。`(b) `参照はオブジェクトにバインドする必要があり、`(d) `参照は初期化する必要があります。
2.16
(a):法務。3.14159の値をdに割り当てます。
(b):法務。自動変換(int-> double)が実行されます。
(c):法務。10進数のインターセプトが発生します。
(d):法務。10進数のインターセプトが発生します。
2.17
10、10
2.18
int a = 0, b = 1;
int *p1 = &a, *p2 = p1;
// change the value of a pointer.
p1 = &b;
// change the value to which the pointer points
*p2 = b;
2.19
1.参照は別のオブジェクトのエイリアスであり、ポインタ自体はオブジェクトです。
2.参照を初期化する必要があります。参照が定義されると、他のオブジェクトにバインドできなくなります。ポインタは、定義時に初期値を割り当てる必要はありません。また、他のオブジェクトを指すように再割り当てすることもできます。
2.20
ポインタ `pi`が` i`を指すようにしてから、 `i`の値を42 * 42(1764)に再割り当てします。
2.21
(a):違法。`double`へのポインタを` int`にポイントすることはできません。
(b):違法。`int`変数をポインタに割り当てることはできません。
(c):法務。
2.22
`if(p)// ...` pがnullポインタかどうかを判断し、
`if(* p)// ...` pが指すオブジェクトの値が0かどうかを判断します
2.23
いいえ、ポインタが指すオブジェクトが正当であるかどうかを判断する前に、まずポインタが正当であるかどうかを判断する必要があるためです。
2.24
`void *`はC言語から継承され、任意のタイプのオブジェクトを指すことができます。他のポインタタイプは、ポイントされたオブジェクトと厳密に一致する必要があります。
2.25
(a):ipはintへのポインター、iはint、rはiへの参照です。
(b):iはint、ipはnullポインターです。
(c):ipはintへのポインター、ip2はintです。
2.26
const int buf; //違法、constオブジェクトは初期化する必要があります
int cnt = 0; //合法
constint sz = cnt; //合法
++ cnt; ++ sz; //違法、constオブジェクトは変更できません
2.27
int i = -1、&r = 0; //不正、rはオブジェクトを参照する必要があります
int * const p2 =&i2; //正当な
constint i = -1、&r = 0; //正当な
constint * const p3 = &i2; // legal
const int * p1 =&i2; // legal
const int&const r2; //違法、r2は参照、参照にはトップレベルのconst
const int i2 = i、&r = i; //合法
2.28
int i、* const cp; //不正、constポインタを初期化する必要があります
int * p1、* const p2; //不正、constポインタを初期化する必要があります
const int ic、&r = ic; //不正、constintを初期化する必要があります
const int * const p3; //不正、constポインタを初期化する必要があります
const int * p; //有効。constintへのポインタ
2.29
i = ic; //通常の変数への合法的な定数代入
p1 = p3; //違法、p3はconstポインターであり、通常のポインターに割り当てることはできません
p1 =&ic; //違法、通常のポインターは定数
p3 =&icを指すことができません; / /リーガル、p3は定数ポインターであり、定数
p2 = p1を指します; //リーガル、定数ポインターに通常のポインターを割り当てることができます
ic = * p3; //リーガル、p3の値を取得した後、はintであり、それをicに割り当てます
2.30
const int v2 = 0; int v1 = v2;
int * p1 =&v1、&r1 = v1;
const int * p2 =&v2、* const p3 =&i、&r2 = v2;
2.31
r1 = v2; //合法、コピーしても最上位のconstは影響を受けません
p1 = p2; //違法、p2は最下位のconstです。コピーする場合は、p1を最下位にする必要があります。 const
p2 = p1; //合法、int *はconstint *に変換できます
p1 = p3; //違法、p3は低レベルのconst、p1は
p2 = p3ではありません; //合法、p2とp3は両方とも低い-レベルconst、コピー時に最上位constは無視されます
2.32
正当な。ポインターを0に初期化して、ヌルポインターを示すことができます。
2.33
A = 42; // intで
// bは、(コピー時のCIのトップCONSTは無視される)INT; B = 42
、C = 42; // Cもint型である
D = 42; // D int *であるため、ステートメントは不正です
e = 42; // eはconstint *であるため、ステートメントは不正です
g = 42; // gはconstintへの参照であり、参照はすべて基礎となるconstです。割り当てられないので
2.34
#include <iostream>
int main()
{
int i = 0, &r = i;
auto a = r; // a是一个整数(r是i的别名,而i是以一个整数)
const int ci = i, &cr = ci;
auto b = ci; // b是一个整数(ci的顶层const特性被忽略掉了)
auto c = cr; // c是一个整数(cr是ci的别名,ci本身是一个顶层const)
auto d = &i; // d是一个整型指针(整数的地址就是指向整数的指针)
auto e = &ci; // e是一个指向整数常量的指针(对常量对象去地址是一种底层const)
const auto f = ci; // ci的推演类型是int,f是const int
auto &g = ci; // g是一个整型常量引用,绑定到ci
std::cout << a << std::endl;
std::cout << b << std::endl;
std::cout << c << std::endl;
std::cout << d << std::endl;
std::cout << e << std::endl;
std::cout << f << std::endl;
std::cout << g << std::endl;
std::cout << "--------------" << std::endl;
a = 42; b = 42; c = 42; //d = 42; e = 42; g = 42;
std::cout << a << std::endl;
std::cout << b << std::endl;
std::cout << c << std::endl;
std::cout << d << std::endl;
std::cout << e << std::endl;
std::cout << f << std::endl;
std::cout << g << std::endl;
return 0;
}
2.35
jはint、kはconst intへの参照、pはconst int *、j2はconst int、k2はconstintへの参照です。
2.36
cは、値が4のint型です。dはint&型で、aにバインドされ、aの値は4です。
2.37
cは、値が3のint型です。dはint&型であり、aにバインドされています。
2.38
decltypeはトップレベルのconstと参照をautoとは異なる方法で処理し、decltypeはトップレベルのconstと参照を保持します。
int i = 0, &r = i;
//相同
auto a = i;
decltype(i) b = i;
//不同 d 是一个 int&
auto c = r;
decltype(r) d = r;
2.39
セミコロンを入力するように求められます。
2.40
struct Sale_data
{
std::string bookNo;
std::string bookName;
unsigned units_sold = 0;
double revenue = 0.0;
double price = 0.0;
//...
}
2.41
1.5.1
#include <iostream>
#include <string>
struct Sale_data
{
std::string bookNo;
unsigned units_sold = 0;
double revenue = 0.0;
};
int main()
{
Sale_data book;
double price;
std::cin >> book.bookNo >> book.units_sold >> price;
book.revenue = book.units_sold * price;
std::cout << book.bookNo << " " << book.units_sold << " " << book.revenue << " " << price;
return 0;
}
1.5.2
#include <iostream>
#include <string>
struct Sale_data
{
std::string bookNo;
unsigned units_sold = 0;
double revenue = 0.0;
};
int main()
{
Sale_data book1, book2;
double price1, price2;
std::cin >> book1.bookNo >> book1.units_sold >> price1;
std::cin >> book2.bookNo >> book2.units_sold >> price2;
book1.revenue = book1.units_sold * price1;
book2.revenue = book2.units_sold * price2;
if (book1.bookNo == book2.bookNo)
{
unsigned totalCnt = book1.units_sold + book2.units_sold;
double totalRevenue = book1.revenue + book2.revenue;
std::cout << book1.bookNo << " " << totalCnt << " " << totalRevenue << " ";
if (totalCnt != 0)
std::cout << totalRevenue / totalCnt << std::endl;
else
std::cout << "(no sales)" << std::endl;
return 0;
}
else
{
std::cerr << "Data must refer to same ISBN" << std::endl;
return -1; // indicate failure
}
}
1.6
#include <iostream>
#include <string>
struct Sale_data
{
std::string bookNo;
unsigned units_sold = 0;
double revenue = 0.0;
};
int main()
{
Sale_data total;
double totalPrice;
if (std::cin >> total.bookNo >> total.units_sold >> totalPrice)
{
total.revenue = total.units_sold * totalPrice;
Sale_data trans;
double transPrice;
while (std::cin >> trans.bookNo >> trans.units_sold >> transPrice)
{
trans.revenue = trans.units_sold * transPrice;
if (total.bookNo == trans.bookNo)
{
total.units_sold += trans.units_sold;
total.revenue += trans.revenue;
}
else
{
std::cout << total.bookNo << " " << total.units_sold << " " << total.revenue << " ";
if (total.units_sold != 0)
std::cout << total.revenue / total.units_sold << std::endl;
else
std::cout << "(no sales)" << std::endl;
total.bookNo = trans.bookNo;
total.units_sold = trans.units_sold;
total.revenue = trans.revenue;
}
}
std::cout << total.bookNo << " " << total.units_sold << " " << total.revenue << " ";
if (total.units_sold != 0)
std::cout << total.revenue / total.units_sold << std::endl;
else
std::cout << "(no sales)" << std::endl;
return 0;
}
else
{
std::cerr << "No data?!" << std::endl;
return -1; // indicate failure
}
}
2.42
Sale_data.h
struct Sale_data
{
std::string bookNo;
std::string bookName;
unsigned units_sold = 0;
double revenue = 0.0;
double price = 0.0;
}
1.5.1
#include <iostream>
#include "Sale_data.h"
int main()
{
Sales_data book;
double price;
std::cin >> book.bookNo >> book.units_sold >> price;
book.CalcRevenue(price);
book.Print();
return 0;
}
1.5.2
#include <iostream>
#include "Sale_data.h"
int main()
{
Sales_data book1, book2;
double price1, price2;
std::cin >> book1.bookNo >> book1.units_sold >> price1;
std::cin >> book2.bookNo >> book2.units_sold >> price2;
book1.CalcRevenue(price1);
book2.CalcRevenue(price2);
if (book1.bookNo == book2.bookNo)
{
book1.AddData(book2);
book1.Print();
return 0;
}
else
{
std::cerr << "Data must refer to same ISBN" << std::endl;
return -1;
}
}
1.6
#include <iostream>
#include "Sale_data.h"
int main()
{
Sales_data total;
double totalPrice;
if (std::cin >> total.bookNo >> total.units_sold >> totalPrice)
{
total.CalcRevenue(totalPrice);
Sales_data trans;
double transPrice;
while (std::cin >> trans.bookNo >> trans.units_sold >> transPrice)
{
trans.CalcRevenue(transPrice);
if (total.bookNo == trans.bookNo)
{
total.AddData(trans);
}
else
{
total.Print();
total.SetData(trans);
}
}
total.Print();
return 0;
}
else
{
std::cerr << "No data?!" << std::endl;
return -1;
}
}