第3章予備プログラム設計
アルゴリズム:問題を解決するために使用される方法と手順(数値アルゴリズムと非数値アルゴリズム)
C ++プログラムには次のものが含まれます。
(1)前処理コマンド:#includeまたは#define
(2)宣言部分:データ型と関数の宣言、関数内の宣言、関数外の宣言
(3)機能
プログラムの3つの基本構造:シーケンス構造、選択構造、ループ構造
グローバル変数とローカル変数:関数で宣言されたローカル変数、プログラムの最後までのスコープ;関数の外で宣言されたグローバル変数、スコープは関数の外で終わります
C ++の9種類の制御ステートメント:
(1)if条件文
(2)forループステートメント
(3)whileループステートメント
(4)do ... whileループステートメント
(5)このサイクルを終了し、次のサイクルを開始し続けます
(6)ブレークは終了し、スイッチ構造またはループ構造でのみ使用できます。
(7)スイッチブランチ選択ステートメント
(8)後藤文
(9)関数からの戻り値を返す
C ++でのステートメントの定義:特定の操作を実行でき、セミコロンで終わるステートメントはすべてステートメントです
C ++の基本的な入力および出力メソッド:
(1)入力および出力ストリーム:cin cout
(2)単一文字の入出力用のgetcharおよびputchar関数
(3)入出力用のscanfおよびprintf関数
Cと比較すると、C ++は論理データ、つまりブール型を導入し、その値はtrueまたはfalseのいずれかです。
条件式:この感覚はあまり一般的ではありません。その式は、たとえば(a> b)?a:bです。角かっこがtrueの場合、コロンの前の値が使用されます。角かっこがfalseの場合、コロンの後の値が使用されます。値が取られます。この条件演算子は、C ++の唯一の三項演算子でもあります。
switchステートメントまたは複数のifステートメントに使用されるのはどれですか?
switchステートメントで実現できる場合はifで実現できますが、必ずしもその逆ではありません。区間範囲の場合はifを使用し、同等の場合はswitchを使用します。
ループステートメント内のwhileステートメントとforステートメント:ループ時間がわかっている場合はforステートメントの方が優れています。ループ時間が不明な場合は、whileステートメントの方が優れています(whileステートメントはループ条件のみを示します)。実際、forステートメントは最も広範で柔軟性があり、未知のループ時間に使用でき、whileステートメントを完全に置き換えることができます。
例:円周率を推定するためのプログラム(π/ 4の数式に基づく)
#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
int main(void)
{
int s = 1;
double n = 1, t = 1, pi = 0;
while (fabs(t) > 1e-7)
{
pi = pi + t;
n = n + 2;
s = -s;
t = s / n;
}
pi = pi * 4;
cout << "pi = " << pi << endl;
return 0;
}
さらに、関連するループの小さなアルゴリズムには、ウサギの繁殖のフィボナッチ数列の問題、素数の検索の問題、コードの暗号化の問題などがあります。
第4章関数と前処理
大規模なプログラムはモジュールに分割するのが最適です。メイン関数は他の関数を呼び出し、他の関数も相互に呼び出すことができます(ただし、関数をネストされた定義にすることはできません)。メイン関数は非常に単純に記述されることが多く、その役割はスケジュールです。
呼び出し元の関数が呼び出された関数を呼び出すと、呼び出し元の関数は実際のパラメーター値を呼び出された関数の仮パラメーターに渡します。C++では、関数を定義するときに関数タイプと関数パラメータータイプを同時に指定する必要があります。
関数呼び出しに関する注意:
(1)呼び出される関数は、ライブラリ関数またはユーザーが定義した関数です。
(2)ライブラリ関数の場合は、ファイルの先頭で#includeコマンドを使用して、関連するヘッダーファイルをこのフォルダーにインクルードする必要があります。
(3)ユーザーが定義した関数の場合、関数と呼び出し元の関数は同じプログラムユニット内にある必要があり、場所に応じて宣言が必要かどうかを判断します。
関数のオーバーロード:
一般的に、関数は関数に対応しますが、同じタイプの関数を実現したい場合もあります(たとえば、サイズが大きい関数では、入力データ型が異なる場合があるため、異なるデータ型で書き込む必要があります。関数、これはあまりにも面倒です)。したがって、C ++では、同じ関数名で複数の関数を個別に定義できます。これらの関数のパラメーターの数とパラメーターの種類は異なります。これは、関数のオーバーロードです[1つ、複数の用途]。例として、<<は入力および出力ストリーム演算子として使用できますが、シフト演算子としても使用できます。
関数テンプレート:
関数のオーバーロードと比較すると、関数のオーバーロードでは複数の関数を定義する必要がありますが、関数名は一貫しています。関数テンプレートの優れている点は、一般的な関数を確立し、その関数型と仮パラメーター型が指定されていないことです。
関数テンプレートの使用例:
template <typename T> //模板声明,其中 T 为类型参数
T max(T a,T b,T c) //定义一个通用函数,用 T 做虚拟的类型名
{
if (b>a)
a = b;
if (c>a)
a = c;
return a;
}
デフォルトのパラメータを持つ関数:
関数の定義時に仮パラメーターにデフォルト値が与えられるため、仮パラメーターは実際のパラメーターから値を取得する必要はありません。仮パラメーターにデフォルト値を使用させたくない場合は、実際のパラメータ。たとえば、次のような関数宣言:
float area(float r = 6.5); //函数声明
area() //形参拿到了6.5,相当于 area(6.5)
area(7.5) //形参拿到了7.5
再帰的な関数呼び出し:
再帰を実装するプロセスの詳細を考慮する必要はありません。再帰式と再帰終了条件(つまり境界条件)を記述するだけで、再帰関数を簡単に記述できます。
レジスタを使用してレジスタ変数を宣言する:一部の変数が非常に頻繁に使用される場合、変数セッションにアクセスするのに時間がかかるため、次のように変数をレジスタに入れることができます。
register int i;
C ++の前処理関数には、次の3つのタイプがあります。
(1)マクロの定義
#define PI 3.1415
(2)ファイルに含まれるもの
#include "file2.cpp" //用户编写的头文件,在当前路径下
#include "C:\tan\C++\file2.cpp" //用户编写的头文件,带绝对地址
#include <iostream> //系统头文件常用<>
(3)条件付きコンパイル
あまり使用されていないため、ここでは省略しています。
第5章配列
配列は、同じデータ型に属する順序付きデータのコレクションです。配列内の要素を検索するには、配列名と添え字の2つの要素が必要です(C ++では、角括弧は添え字を示すために使用されます)。配列のストレージ。は連続的で、1つのブロックを占有します。連続したメモリ空間。
配列の定義はインデックス作成(参照)の方法と非常に似ていることに注意してください。混同しないでください。
1次元配列の初期化の例:
int a[5] = {1,2,3,4,5};
int a[] = {1,2,3,4,5}; //赋初值时可以不指定数组的长度
int a[5] = {1,2,3}; //赋初值时可以只给一部分元素赋值
2次元配列の初期化の例:
int a[2][3] = {
{1,2,3},{4,5,6}}; // 同理也可以写在一个花括号内
Cと比較して、C ++は新しいデータ型(文字列型文字列)を追加します。この文字列型を使用しない前は、文字列配列のみを使用でき、strcat(接続)、strcmp(比較)などの操作には文字列関数を使用する必要があります。 )およびstrcpy(copy)、および単純な演算子は文字列型に直接使用できます。たとえば、割り当て記号=は文字列のコピーに直接使用でき、プラス記号+は文字列の連結に直接使用できます。 >などは文字列の比較に直接使用できます。symbol。例えば:
//字符串复制
string1 = string2
//字符串连接
string = string1 + string2
第6章ポインタ
ポインタは変数のメモリアドレスであり、ポインタ変数はアドレスを持つ変数です!
int * pは、int *型のポインタ変数pを定義します。
* pは、pに格納されているアドレスに格納されている値にアクセスするためのものです。
p =&iは、iのアドレスをint型のポインタに与えることです*
ポインターの重要な役割もあります!!!つまり、ポインタはパラメータとして関数に渡されます!これの用途は何ですか?前に説明した関数を振り返ると、値を返すだけです。呼び出し元の関数で定数を定義し、関数を呼び出してこの定数を変更するとします。次に、この定数を呼び出された関数に渡すだけで問題ありません。呼び出された関数の実行後にメモリが解放されるためです。このとき、この定数のアドレスをパラメータとして呼び出された関数に渡す必要があります。関数は、呼び出し元の関数の値を変更できます。
配列とポインタ:配列の名前は、配列の最初の要素のアドレスであり、ポインタと一致します。たとえば、ポインタと配列は自然に密接に関連しています。
//下面两者等价
p = &a[0];
p = a;
したがって、p [i] = a [i] = *(p + i)= *(a + i)であり、それぞれ添え字メソッドとポインターメソッドに対応します。
C ++-参照のもう1つの重要な概念。これは、C ++のCへの補足です。参照の機能は、変数にエイリアスを与えることです。たとえば、ここでbとaは、エイリアスと同等の1つのものであり、&は参照宣言シンボルであるため、ポインタでしか解決できない多くの問題は、参照で解決できます。
int a;
int &b = a; //声明b是a的引用
第7章カスタムデータ型
構造体タイプ:struct
構造体と配列を比較すると、配列内の要素は同じ型に属していますが、単一のデータ処理タスクでは不十分な場合があるため、構造型があります
構造変数とポインター:
//下面三者等价
stu.num;
(*p).num;
p->num
構造変数とポインターが組み合わされて、リンクリストが形成されます
静的リンクリストと動的リンクリスト(使用する場合)は、動的リンクリストに基づいています。
C ++での動的メモリ割り当てとC言語での動的メモリ割り当ての違い: C ++はnewとdeleteを使用してmalloc関数とfree関数を置き換えますが、ここでのnewとdeleteはどちらも演算子であり、関数ではないため、実行効率が高いことに注意してください。非常に高いです。mallocとfreeはC ++で予約されていますが、お勧めしません。
newの使用例:
int * p = new int; //开辟一个放整形的存储空间,返回一个指向该空间的地址
int * p = new int(100); //开辟一个放整形的存储空间,并赋这个整形初值为100,返回地址
float * p = new float(3.14); //开辟一个空间,里面放初值3.14,返回该空间地址给指针变量p
削除の使用例
delete p;
共用体タイプ:共用体
構造に似ていますが、同じメモリに複数の異なる変数を格納することであり、メモリの長さは最長のメンバーの長さに等しい、つまり、それらは互いにカバーしているため、ユニオンと呼ばれます
列挙型:列挙型
enum weekday {sun,mon,tue,wed,thu,fri,sat}
typedefを使用して型を宣言する例:
typedef struct Node
{
int id;
char name[5];
}NODE, * PNODE;