プログラミングチュートリアル

 

技術的に進歩した世界では、プログラミングとコンピューター サイエンスは、イノベーションを推進し、社会を形作る変革的な学問となっています。

芸術形式としてのプログラミングは、創造性、論理、問題解決を組み合わせて、エレガントで効率的なソリューションを作成します。

  • サイエンスとクリエイティビティの融合
    コンピューター サイエンスはプログラミングの科学的基礎として機能し、コンピューター プログラムの開発と実装のための理論、アルゴリズム、および方法論をカバーします。ただし、プログラミング自体には想像力と創意工夫が必要です。空白のキャンバス アーティストのように、プログラマーはコード行を複雑なアルゴリズムに織り込み、業界に革命を起こし、タスクを簡素化し、ユーザー エクスペリエンスを向上させるデジタル傑作を作成します。オブジェクト指向プログラミング (OOP) は、プログラマーがコードを再利用可能なモジュール式オブジェクトに編成することで複雑さを管理できるようにするコンピューター サイエンスの重要なパラダイムです。データと動作をオブジェクトにカプセル化することで、プログラマは、理解しやすく、保守し、拡張しやすいソリューションを創造的に設計できます。

  • デザインとユーザーエクスペリエンスにおける創造性
    プログラミングには問題解決だけではなく、使いやすいインターフェイスの設計や魅力的なユーザー エクスペリエンスも含まれます。この側面では、芸術的感性と技術的知識が組み合わされています。プログラマーは、美学、直感的なナビゲーション、目を引くビジュアルを使用してユーザー インターフェイス (UI) とユーザー エクスペリエンス (UX) をデザインし、ユーザーを喜ばせ、魅了するソフトウェアを作成します。その技術は、機能性と美的魅力をシームレスに融合させ、複雑な機能を直感的で視覚的に楽しいデザインに変換することにあります。 OOP を使用すると、プログラマはタスクを分離し、ソフトウェアのさまざまな側面を担当する個別のオブジェクトを作成できます。このモジュール式のアプローチにより、プログラマーは個々のオブジェクト、オブジェクトの相互作用、およびシステム全体の動作に集中できるため、設計における創造性が促進されます。継承やポリモーフィズムなどの OOP 原則を使用すると、プログラマは、直感的なインターフェイス、ユーザーフレンドリーなインターフェイス、そして視覚的に魅力的な美しさを備えたソフトウェアを開発できます。

  • 芸術としてのソフトウェアエンジニアリング
    ソフトウェア エンジニアリングはコンピューター サイエンスの分野であり、プログラミングの芸術的な側面を重視します。要件の収集から展開、メンテナンスに至るまで、ソフトウェア開発ライフサイクル全体をカバーします。ソフトウェア エンジニアは建築家のようにプログラミングに取り組み、信頼性、拡張性、保守性の高いシステムとプラットフォームを設計します。コードのモジュール性、再利用性、アーキテクチャ パターンなどの要素を考慮して、機能性と優雅さを兼ね備えたソフトウェア ソリューションを作成します。ソフトウェア開発の技術は、技術的な制約、ユーザーのニーズ、 設計目標のバランスをとって、機能的で見た目にも美しいソフトウェアを作成することです。 OOP は、複雑さを管理するための構造化されたアプローチを提供することで、ソフトウェア開発において重要な役割を果たします。コードをクラスとオブジェクトに分離することで、ソフトウェア開発者はモジュール式で再利用可能で保守可能なシステムを設計できます。適切な抽象化とカプセル化により、ソフトウェア開発者はバランスを取り、機能的かつエレガントなソフトウェアを実現できます。

  • イノベーションと社会的影響
    プログラミングとコンピューター サイエンスの芸術はテクノロジー分野を超え、産業と社会全体に影響を与えます。ヘルスケアから金融、教育からエンターテインメントに至るまで、プログラミングとコンピューター サイエンスは、私たちの働き方、コミュニケーション、生活の仕方に革命をもたらしています。人工知能、仮想現実、ブロックチェーン技術などのイノベーションは業界を変革し、新たな地平を切り開きます。プログラマーとコンピューター科学者は、可能性の限界を押し広げ、アイデアを現実に変えることで、これらの変革的な進歩において重要な役割を果たしています。 OOP を使用すると、プログラマーはさまざまな分野に革命を起こす革新的なソリューションを作成できます。 OOP のモジュール式で拡張可能な性質によって複雑さを管理することにより、プログラマは人工知能アルゴリズム、没入型仮想現実体験、安全なブロックチェーン アプリケーションなどの複雑なシステムを開発できます。これらの進歩は業界を変え、生産性を向上させ、世界中の人々の生活の質を向上させています。

複雑さの管理はソフトウェア開発の重要な側面です。システムが複雑になるにつれて、効果的なアプローチを使用して複雑さを管理し、保守性と拡張性を確保することが必要になります。

オブジェクト指向パラダイムは、複雑さを管理する上で大きな利点をもたらす強力なアプローチです。オブジェクト指向パラダイムは、データと動作をオブジェクトにカプセル化し、カプセル化、継承、ポリモーフィズムなどの概念を使用することにより、複雑さを管理するための強固な基盤を提供します。

  1. カプセル化。
    カプセル化は、オブジェクト内のデータとメソッドの関連付けを促進するオブジェクト指向パラダイムの基本原理です。このカプセル化により、オブジェクトの内部の複雑さが隠蔽され、オブジェクトと対話するために必要なインターフェイスのみが公開されます。カプセル化は実装の詳細を隠すことによってシステムの他の部分の複雑さを軽減し、開発者がより高いレベルの抽象化に集中できるようにします。これによりモジュール性が促進され、コードの可読性が向上し、複雑なシステムの理解と保守が容易になります。

  2. 抽象化。
    抽象化は、複雑さを管理するのに役立つオブジェクト指向パラダイムのもう 1 つの重要な概念です。これにより、開発者は複雑な現実世界のオブジェクトをクラスとして表現し、不必要な詳細を抽象化することができます。開発者は、抽象クラスとインターフェイスを作成することで、複数のサブクラスによって継承および実装できる共通の動作と属性を定義できます。このクラスの階層構造により、開発者は複雑なシステムをより小さく、より管理しやすいコンポーネントに分割することで複雑さを管理できます。各クラスはその特定の責任に焦点を当てており、その結果、よりモジュール化された理解しやすいコードベースが得られます。

  3. 継承。
    継承は、コードの再利用を促進し、冗長性を削減するオブジェクト指向パラダイムによって提供される強力なメカニズムです。これにより、新しいクラスは、それらの間に「である」関係を確立することによって、既存のクラスからプロパティと動作を継承できるようになります。継承は、開発者が共通の属性と動作を持つ基本クラスを定義し、それを継承する特殊なクラスを作成できるようにすることで、複雑さを管理するのに役立ちます。このクラスの階層構造により、コードの重複が排除され、複雑さが軽減され、保守性が向上します。

  4. 多態性。
    ポリモーフィズムはオブジェクト指向パラダイムの重要な機能であり、異なるタイプのオブジェクトを共通のインターフェイスに基づいて交換可能に扱うことができます。ポリモーフィズムにより、開発者は各オブジェクトの特定の実装の詳細を扱うことなく、より高いレベルの抽象化で動作するコードを作成できるため、複雑さの管理が簡素化されます。ポリモーフィズムを使用すると、既存のコードに影響を与えることなく新しいクラスを追加できるため、開発者はより柔軟で拡張可能なシステムを作成できます。これにより、モジュール式でスケーラブルな開発が促進され、長期的には複雑さが軽減されます。

複雑さの管理はソフトウェア開発の重要な側面であり、オブジェクト指向パラダイムはこのタスクに強力なフレームワークを提供します。

カプセル化、抽象化、継承、ポリモーフィズムなどの原則を通じて、オブジェクト指向パラダイムにより、開発者は複雑さを効果的に管理し、保守可能でスケーラブルなモジュール式システムを作成できます。オブジェクト指向パラダイムは、データと動作をオブジェクトにカプセル化し、不必要な詳細を抽象化し、継承によるコードの再利用とポリモーフィズムを使用することにより、複雑さを管理するための包括的なアプローチを提供します。オブジェクト指向パラダイムの使用により、ソフトウェア開発プロセスが大幅に改善され、信頼性が高く管理しやすいソフトウェア システムの作成に貢献します。

プログラミングの芸術は、科学的原理と創造性、問題解決、イノベーションを組み合わせたものです。技術力と芸術的ビジョンの両方が必要な分野です。オブジェクト指向のアプローチで複雑さを管理することはプログラミングにおいて不可欠であり、これによりプログラマーは洗練された効率的なソリューションを開発し、ユーザー エクスペリエンスを向上させ、社会に永続的な影響を与えることができます。

テクノロジーが進歩するにつれて、ソフトウェアは引き続きデジタル世界を形成し、将来のイノベーションを推進していきます。

 

プログラミングの芸術



プログラミングの芸術

プログラミングの芸術はコードを書くだけにとどまりません。これには、私たちの思考プロセス、問題解決のアプローチ、そして私たちが世界に与える影響が含まれます。プログラミングは、アイデアに命を吹き込み、テクノロジーを通じて自分自身を表現できる創造的な言語です。革新的に考え、型破りな解決策を見つけ、世界と自分自身についての理解を広げることが私たちに求められます。このビデオでは、基本的な構文やデータ構造から高度なアルゴリズムやプログラミング パラダイムに至るまで、基本的なプログラミングの概念を説明します。さぁ、始めよう。

コードの編集には、主にテキスト エディタと IDE の 2 種類のツールがあります。テキスト エディタはプレーン テキストの編集に重点を置いていますが、IDE は追加機能を提供します。ただし、ほとんどの目的では、この 2 つの区別はあまり重要ではなく、これらの用語は同じ意味で使用できます。テキスト エディターと IDE の一般的なオプションには、Vim、Atom、Sublime Text、Eclipse、IntelliJ、PyCharm、Visual Studio Code などがあります。特に Visual Studio Code はカスタマイズ性が高く、広く推奨されています。

コードを実行するには、それをコンピュータが理解できるマシンコードにコンパイルする必要があります。これには、言語コンパイラまたはランタイムをインストールする必要があります。さまざまな言語には、GCC、Java SDK、Python インタープリター、Node.js ランタイム、.NET SDK などの独自のコンパイラーまたはランタイムがあります。これらのツールの詳細を理解する必要はありません。知っておく必要があるのは、コードを実行するための言語をインストールすることだけです。

コードの実行には、コマンド ライン インターフェイスへのアクセスを提供するターミナルの使用が含まれます。一般的に使用されるターミナルには、Powershell や Bash などがあります。ターミナルを使用すると、ディレクトリの作成、ファイルの一覧表示、プログラムの実行などのコマンドを実行できます。 Node.js の npm や Python の pip などのパッケージ マネージャーを使用して、コマンド ラインを通じてリポジトリからソフトウェアをインストールできます。バージョン管理システムである Git は、コードの変更を管理し、他のユーザーと共同作業するために不可欠です。

コーディングを開始するには、適切なテキスト エディターまたは IDE、言語コンパイラー、およびターミナル コマンドの基本的な知識が必要です。テキスト エディターまたは IDE として Visual Studio Code を選択することをお勧めします。プログラミング言語をインストールし、ターミナル コマンドに慣れると、コードを作成して実行できるようになります。プログラミング言語を学習するには、その構文、環境、規則を理解する必要があります。言語が異なれば複雑さのレベルも異なりますが、構造と概念においてはすべて類似点があります。

さまざまなプログラミング言語での印刷出力は、各言語に固有の関数またはメソッドを使用して実行できます。たとえば、Python には組み込みの print 関数があり、JavaScript には console.log メソッドがあり、Java と C++ には標準出力に出力するための独自の構文があります。

変数は、さまざまなデータ型の値を保存するために使用されます。変数は宣言、定義され、値を使用して初期化されます。プログラミング言語は静的に型指定することも動的に型指定することもでき、変数の構文は異なります。静的型付けでは変数の型を明示的に宣言する必要がありますが、動的型付けではその必要はありません。変数にはスコープがあり、プログラム内のどこで変数にアクセスして使用できるかを決定します。スコープはグローバルまたはローカルにすることができ、より適切に整理してエラーを防止することができます。

データ型は、文字列、ブール値、整数、浮動小数点数、文字、配列などのさまざまな種類のデータを表します。データ構造は、データを整理および操作する方法を提供します。一般的なデータ構造には、配列、スタック、ヒープ、ツリー、リンク リスト、ハッシュ テーブル、ハッシュ マップ、グラフなどがあります。配列とマップは、さまざまなアプリケーションで一般的に使用される 2 つのデータ構造です。

要約すると、プログラミングは、コードを通じて思考し、問題を解決し、世界を形作ることを含む芸術です。これには、テキスト エディターまたは IDE の使用、コンパイラーまたはランタイムによるコードの実行、ターミナル コマンドとバージョン管理の理解が含まれます。プログラミング言語を学習するには、構文、変数、データ型、データ構造を理解する必要があります。このビデオでは、プログラミングの旅を始めるために、これらの概念の概要を説明します。

The Art Of Programming
The Art Of Programming
  • 2023.05.11
  • www.youtube.com
In this video, we'll explore the basics of programming, including the different programming paradigms such as procedural, object-oriented, and functional pro...
 

ソフトウェアを書く技術


ソフトウェアを書く技術

コンピューターは楽器と同様、受け取った指示に基づいて特定のタスクを実行するように設計された、細心の注意を払って作られた機械です。コードで書かれたこれらの命令は、その動作をガイドするソフトウェアです。楽譜が作曲家によって使用されるコードであるのと同じように、コンピューター プログラマーはソフトウェア コードを使用してプログラムを作成します。

プログラミングは、詩人や音楽家が経験する感情に似た、喜びと満足感の源となり得ます。初期のコンピューターは、問題解決と複雑さを楽しむ人々にとって魅力的であり、力を与えてくれました。これらは驚くべき速度で動作し、コンピュータのネイティブ コマンドを使用して表現されている限り、幅広い問題を解決することができました。しかし、コンピュータは本質的に愚かであり、何をすべきかを理解するには正確な指示が必要です。初期のプログラマーは、バイナリ コマンドを表す数値を使用して機械語を作成する必要がありました。このプロセスは退屈でエラーが発生しやすいものであったため、より人間に優しいプログラミング言語の開発につながりました。

Fortran や COBOL などの高水準言語の導入により、プログラミングがよりアクセスしやすくなりました。プログラマーは、よく知られた科学的公式や、自分にとって意味のある論理的ステートメントを使用して指示を表現できます。次に、コンパイラを使用して、これらの命令をコンピュータのバイナリ言語に翻訳しました。この画期的な進歩により、プログラマーが各コンピューター固有の機械語を学習する必要がなくなり、ソフトウェア革命が開かれました。

長年にわたり、さまざまなニーズに応えるために何百ものプログラミング言語が開発されてきました。これらの言語と機械語の間のギャップは拡大し、プログラマーは低レベルの詳細ではなく、達成したいことに集中できるようになりました。コンピューティングがより個人的なものになるにつれて、プログラミング言語はより多様になり、使いやすくなりました。現在、人々は日常的にコンピューターとコミュニケーションをとり、平均値の計算やデータの整理など、何をすべきかを指示しています。プログラミングは個人に力を与えるツールとなり、コンピューター システムをニーズに合わせてカスタマイズして適応させることができます。

ソフトウェアの作成には、コーディングだけでなく、データの表現方法や編成方法の定義も含まれます。データは、要件に応じて文字列、リスト、テーブル、ツリーなどに編成できます。言語とデータ構造の選択は、プログラミングの問題を効果的に解決するために重要です。プログラマーは、問題を解決するためのアルゴリズムと呼ばれる段階的な手順を作成します。これらのアルゴリズムは、望ましい結果を達成するために必要な操作を指定します。ただし、特定の問題に対して最も効率的なアルゴリズムを見つけるのは複雑な作業となる場合があります。注意深い思考、集中力、そして時には専門分野における広範な知識が必要です。

ソフトウェア開発は、多くの側面を同時に念頭に置く必要がある、挑戦的で創造的な取り組みです。プログラマーは常にテクノロジーの進歩に適応し、コンピューターが達成できる限界を押し広げています。コードの優雅さと一貫性を追求し、機能的で見た目にも美しいソフトウェアを作成します。ソフトウェア プログラマーは彼らの努力によって私たちの能力を拡張し、かつては魔法だと考えられていた方法で膨大な量の情報を活用し、世界と対話できるようになりました。プログラミングは、コンピューターを機能させ、今日私たちが住むハイテク世界を形作る原動力です。

The Art of Writing Software
The Art of Writing Software
  • 2014.11.17
  • www.youtube.com
CHM Exhibition "Revolution: The First 2000 Years of Computing"Software is more than obscure computer code. It’s an art form: a meticulously-crafted literatur...
 

初心者向け C++ チュートリアル - フルコース


初心者向け C++ チュートリアル - フルコース

00:00:00 - 01:00:00 このビデオは、C++ でコーディングする方法を学びたい初心者向けのチュートリアルです。文字列、数値、変数の操作の基本について説明します。また、他のファイルからコードをインポートするという概念も導入されています。

01:00:00 - 02:00:00 初心者向けのこの C++ チュートリアルでは、4 関数電卓の構築方法について説明します。このチュートリアルでは、データを入力し、演算子の等価性をチェックし、その条件に基づいてコードを実行する方法を説明します。

02:00:00 - 03:00:00 このビデオでは、for ループを使用して特定の結果を計算することに重点を置き、C++ プログラミングの基本を紹介します。デモされている関数は、数値を特定の累乗した結果を計算します。

03:00:00 - 04:00:00 初心者向けのこの C++ チュートリアルでは、インストラクターが継承を使用してクラス階層の機能を拡張する方法を示します。継承により、クラスは別のクラスと同じ機能を持ちながら、その機能を追加機能で拡張できます。インストラクターは、クラスの動作を変更するために継承された関数をオーバーライドする方法も示します。

パート1

  • 00:00:00 このビデオ チュートリアルでは、初心者に基本的な C++ コードの書き方を教えます。最初のステップは、テキスト エディターと C++ コンパイラーをインストールすることです。これらは両方ともコードブロック パッケージに含まれています。次に、チュートリアルでは、コードブロックで単純なプロジェクトをセットアップする方法を示します。

  • 00:05:00 このチュートリアルでは、C++ プログラミング言語と、C++ プログラムの作成と実行に必要なツールについて簡単に説明します。チュートリアルの最初の部分では、Mac に必要なツールをインストールする方法を示し、2 番目の部分では、コード ブロックで新しい C++ プロジェクトを作成する方法を説明します。

  • 00:10:00 このビデオ チュートリアルでは、プレゼンターが C++ プログラムの作成の基本を説明します。 C++ プロジェクトとファイルの必要性について説明し、関数を説明し、プログラムを構築して実行する方法を示します。

  • 00:15:00 このチュートリアルでは、C++ で基本的なコードを記述する方法と、print ステートメントを使用して情報をコンソールに出力する方法について説明します。

  • 00:20:00 このビデオでは、プレゼンターは、ストーリーを出力するプログラムの例を示して、変数がプログラミングでどのように役立つかを示しています。次に、プレゼンターは、キャラクターの名前を格納する「キャラクター名」という名前の変数を作成して値を割り当てる方法を示します。次に、プレゼンターは、キャラクターの年齢を格納する「age」という名前の変数を作成して値を割り当てる方法を示します。最後に、発表者は変数を使用して複数のデータを保存する方法を示します。

  • 00:25:00 このビデオでは、プレゼンターが変数の概念を紹介し、それを使用してプログラムにデータを保存する方法を示します。これらは、print ステートメントを使用して変数に格納されたデータにアクセスして操作する方法を示します。最後に、データが別の文字列で出力されるように、print ステートメント内に変数を含める方法を示します。

  • 00:30:00 このビデオでは、C++ の変数とデータ型の概念を紹介します。変数はデータを保存するコンテナであり、これを使用してあらゆる種類の情報を保存できます。文字列は一般的なタイプの変数であり、一連の文字です。整数を使用して整数を保存したり、負の整数を使用して負の数を保存したりすることもできます。 10 進数を整数に格納することもできます。

  • 00:35:00 このチュートリアルでは、単純なテキストと数値から始めて、文字列やブール値などのより複雑なデータ型に進む、C++ を使用したプログラミングの基本を説明します。

  • 00:40:00 このビデオでは、C++ 文字列関数の長さと文字列インデックスを使用して文字列を出力し、文字列内の特定の文字の位置を特定する方法と、文字列内の特定の文字を変更する方法について説明します。

  • 00:45:00 このビデオでは、引数を関数に渡す方法や、さまざまな数学関数を使用して文字列を操作する方法など、C++ での文字列の操作の基本を説明しています。

  • 00:50:00 この C++ チュートリアルでは、数値、加算、減算、乗算、除算の基本について説明します。モジュラス演算子も導入されており、2 つの数値を除算して剰余を計算するのに便利です。最後に、数値を変数に格納する方法を示します。

  • 00:55:00 この初心者向けの C++ チュートリアルでは、数学関数を使用して問題を解決する方法を説明します。関数には、平方根、pow、およびroundが含まれます。他のファイルからコードをインポートする方法についても説明します。

パート2

  • 01:00:00 初心者向けのこの C++ チュートリアルでは、ユーザーは年齢と名前を入力するように求められます。次に、プログラムはその情報を age という変数に保存し、ユーザーの名前と年齢を出力します。

  • 01:05:00 このビデオ チュートリアルでは、C++ で基本的な電卓を作成する方法と、Mad Libs ゲームを構築する方法を示します。

  • 01:10:00 このビデオでは、C++ で配列を作成および使用する方法を説明します。配列は変数に似ていますが、複数の値を保持できます。

  • 01:15:00 このビデオ チュートリアルでは、C++ の配列の基本について説明します。配列は複数のデータを格納できるコンテナであり、インデックスによって、または配列の「size」プロパティに値を割り当てることによって、個々の要素にアクセスできます。

  • 01:20:00 このチュートリアルでは、作成者が C++ で関数を作成する方法を示します。関数は特定のタスクを実行するコードのブロックであり、プログラム全体で再利用できます。関数の戻り値の型は void または整数のいずれかになります。著者は関数を呼び出す方法も示しています。

  • 01:25:00 このビデオでは、関数の仕組みと関数の再利用方法について著者が説明しています。また、関数のシグネチャを作成する方法と、そのシグネチャを使用して関数を呼び出す方法も示します。最後に、C++ の戻り値、つまり関数が呼び出し元に情報を返すときについて説明します。

  • 01:30:00 このビデオでは、C++ で関数を作成する方法と、関数の実行が終了したことを示す return キーワードの使用方法について説明します。このビデオでは、cube 関数を使用して数値の 3 乗の結果を返す方法も示しています。

  • 01:35:00 このチュートリアルでは、著者が初心者に C++ の if ステートメントについて教えます。 if ステートメントは、プログラムがさまざまな状況に対応できるようにするプログラミング構造です。著者は、if ステートメントを使用して条件を確認する方法と、より複雑な if ステートメントを作成する方法を示します。

  • 01:40:00 このビデオ チュートリアルでは、C++ で and および or 演算子を使用して 2 つの条件をチェックする方法を説明します。いずれかの条件が false の場合、if ブロック全体が false になり、コードは実行されません。

  • 01:45:00 このチュートリアルでは、著者は初心者に if ステートメントについて教え、比較を使用して true または false の値を作成する方法を説明します。この関数は 2 つの数値を入力として受け取り、最大の数値を返します。

  • 01:50:00 このビデオでは、C++ での比較の仕組みと、「より大きい」、「より小さい」、「等しい」を使用して 2 つの数値が等しいか大きいか等しいかを確認する方法について説明します。

  • 01:55:00 初心者向けのこの C++ チュートリアルでは、データの入力方法、演算子の等価性のチェック方法、その条件に基づいたコードの実行方法など、4 関数電卓の構築方法を説明します。

パート 3

  • 02:00:00 このビデオ チュートリアルでは、整数値を曜日に変換する関数が示されています。関数が作成され、if ステートメントを使用して、指定された日数が 1 以上であるかどうかが判断されます。 1 の場合、関数は「Sunday」を返します。 1 でない場合、関数は「月曜日」を返します。

  • 02:05:00 このビデオでは、switch ステートメントを使用して if ステートメント内のコードをより効率的にする方法を説明します。このビデオでは、曜日ごとに switch ステートメントを作成する方法を説明し、入力として渡された数値の曜日を出力する機能を示しています。

  • 02:10:00 このビデオでは、ビデオ「初心者向け C++ チュートリアル - フルコース」の概要を説明します。このビデオでは、条件が満たされている間に while ループを使用してコード ブロックを反復処理する方法を示します。

  • 02:15:00 初心者向けのこの C++ チュートリアルでは、while ループや do while ループの作成方法など、ループの基本について説明します。このビデオでは、無限ループとその回避方法についても説明しています。最後に、for ループを示します。

  • 02:20:00 このチュートリアルでは、while ループと do while ループを使用して推測ゲームを作成する方法を示します。このゲームは、ユーザーが無制限に推測できるという意味で最初は不公平ですが、チュートリアルでは推測制限を課すことでゲームをより公平にする方法を示しています。

  • 02:25:00 このビデオでは、著者が for ループの仕組みと C++ での使用方法を説明しています。また、for ループを使用して問題を解決する方法の例も示しています。

  • 02:30:00 このビデオでは、著者が while ループ、つまり変数が実行されるたびに変化するループ構造について説明します。 for ループも同様の構造ですが、変数宣言、初期化、およびループ条件が含まれます。

  • 02:35:00 このビデオ チュートリアルでは、for ループを使用して配列の内容を反復処理する方法と、数値を特定の累乗にする関数を構築する方法を説明します。

  • 02:40:00 このビデオ チュートリアルでは、for ループを使用して特定の結果を計算することに重点を置き、C++ プログラミングの基本を紹介します。デモされている関数は、数値を特定の累乗した結果を計算します。

  • 02:45:00 このチュートリアルでは、著者は 2 次元配列の作成方法と使用方法を示し、その中の要素にアクセスする方法について説明します。

  • 02:50:00 このビデオ チュートリアルでは、C++ 言語を紹介し、for および int イテレータを使用してデータの配列をループする方法を示します。ネストされた for ループにより、配列内のデータを簡単に反復できます。

  • 02:55:00 このビデオでは、ポインターとは何か、ポインターがどのように役立つか、C++ でポインターを作成する方法について説明します。

パート 4

  • 03:00:00 このビデオでは、変数と定数を使用して情報を保存する方法の例を示し、C++ プログラミングの初心者向けの入門を提供します。このビデオでは、メモリ アドレスにアクセスして、メモリ アドレス内に保存されている情報を取得する方法も示しています。

  • 03:05:00 このビデオでは、ビデオ「初心者向け C++ チュートリアル - フルコース」の概要を説明します。ビデオでは、プレゼンターがポインタを使用して変数のメモリ アドレスにアクセスする方法を示しています。ポインタは単なるデータの一種であるメモリ アドレスであり、これを使用して別の変数へのポインタを格納できます。

  • 03:10:00 このチュートリアルでは、プログラミングでポインタを使用する方法を説明し、特定のメモリ アドレスに格納されている値にアクセスするためにポインタを逆参照する方法を示します。さらに、このチュートリアルでは C++ のクラスとオブジェクトについて説明し、クラスの作成方法と使用方法を示します。

  • 03:15:00 このビデオは初心者向けの C++ チュートリアルで、著者は本を表すクラスを作成します。クラスには、タイトルと作成者という 2 つの属性があります。次に、著者は書籍オブジェクトを作成し、タイトルと著者を設定します。

  • 03:20:00 このビデオでは、初心者に C++ でオブジェクトを作成して操作する方法を説明します。オブジェクトはクラスの実際のインスタンスであり、クラスはデータ型のテンプレートです。オブジェクトは印刷したり、値を変更したりできます。

  • 03:25:00 このビデオでは、C++ でコンストラクターがどのように機能するか、およびコンストラクターを使用してオブジェクトをデフォルト値で初期化する方法について説明します。

  • 03:30:00 このビデオ チュートリアルでは、タイトル、作成者、ページを入力値として受け入れる C++ コンストラクターを作成する方法を説明します。初期化されると、コンストラクターを使用して、毎回値を渡すことなく新しいオブジェクトを作成できます。

  • 03:35:00 このビデオでは、C++ の関数を使用して学生に優等生があるかどうかを判断する方法を説明します。関数は、各オブジェクトがオブジェクト自身の GPA に応じて true または false を返すために使用できるテンプレートです。

  • 03:40:00 このビデオでは、C++ クラスでゲッターとセッターを使用する方法を初心者に説明します。ゲッターとセッターを使用すると、クラス内の属性と要素へのアクセスを制御できます。この例では、ゲッターとセッターを使用して映画に有効な評価を強制する方法を示します。

  • 03:45:00 初心者向けのこの C++ チュートリアルでは、作成者は、ゲッターとセッターを使用して、ムービー オブジェクトに割り当てることができる評価を制限する方法を示します。渡された評価が有効な評価の 1 つではない場合、エラーがスローされるか、評価が設定されません。

  • 03:50:00 このビデオでは、著者が C++ を使用してビデオの評価を設定する方法を説明します。まず、C++ で評価がどのように表されるかについて説明します。評価は 13 などの正の値、または -3 などの負の値に相当します。次に、set Rating という名前の関数を使用してビデオの評価を設定する方法を示します。この関数は、評価を表す文字列である 1 つのパラメータを取ります。入力された評価が無効な場合、関数は評価されていない評価を表す文字列を返します。最後に、著者は get Rating という名前の関数を使用してビデオの評価を出力する方法を示します。この関数はパラメータをとらず、単にビデオの評価を返します。

  • 03:55:00 初心者向けのこの C++ チュートリアルでは、インストラクターが関数を継承する方法と、クラス階層で関数をオーバーライドする方法を示します。これにより、クラスが別のクラスと同じ機能を持ちながら、その機能を追加の機能で拡張できるようになります。
C++ Tutorial for Beginners - Full Course
C++ Tutorial for Beginners - Full Course
  • 2018.08.24
  • www.youtube.com
This course will give you a full introduction into all of the core concepts in C++. Want more from Mike? He's starting a coding RPG/Bootcamp - https://simula...
 

プログラミングとコンピューター サイエンスの入門 - フルコース



プログラミングとコンピューター サイエンスの入門 - フルコース

このビデオは、コーディングの背景がほとんどまたはまったくない人を対象とした、プログラミングとコンピューター サイエンスの初心者ガイドです。あらゆるプログラミング言語に適用される基本的な概念とテクニックをカバーします。このビデオでは、統合開発環境 (IDE) でのコード作成の基本を説明し、プログラミング文法の重要性を強調しています。

ビデオで取り上げられるトピックは次のとおりです。

  1. 構文やプログラミング ルールを含む、プログラミングとコンピューター サイエンスの入門。
  2. コンソールを使用してプログラムからテキストを出力します。
  3. プログラミングにおける基本的な数学演算と剰余演算子。
  4. 文字列をコンソールに出力します。
  5. 変数、データ型、および命名規則を理解する。
  6. プログラム内で変数がどのように定義、参照、操作されるか。
  7. 条件付き実行の if ステートメント、elsif ステートメント、else ステートメントを調べます。
  8. 関連する変数を保存する方法として配列を導入しました。
  9. for ループ、while ループ、do-while ループなどのループの基本。
  10. さまざまな種類のプログラミング エラー (構文エラー、実行時エラー、論理エラー) を理解します。
  11. print ステートメント、ブレークポイント、コメントの使用などのデバッグ手法。
  12. プログラミングにおけるエラーを回避するための戦略。
  13. 関数を使用してコードを整理し、繰り返しを減らします。
  14. ライブラリからの関数のインポートと関数の命名規則。
  15. さまざまな種類の関数とその目的。
  16. 柔軟なデータ ストレージ オプションとしての辞書の紹介。
  17. 線形検索や二分検索などの検索アルゴリズムの概要。
  18. 再帰的プログラミングとそのユースケース (基本ケースの概念を含む)。
  19. 問題解決や計画など、コンピューター サイエンスのソフト スキル。
  20. コードを記述するための計画ツールとして擬似コードを使用します。
  21. フローチャートや時系列計画など、コードを計画および作成するためのさまざまな方法。
  22. プログラミング言語と学習に利用できるリソースの概要。

このビデオはプログラミングとコンピューター サイエンスの包括的な紹介を提供し、視聴者がコーディング作業を開始するために必要な基礎を提供します。また、このトピックをさらに詳しく調べるための追加のリソースや Web サイトも提案します。

  • 00:00:00 このビデオでは、ビデオの主要なポイントを説明しています。コンピュータ サイエンスとプログラミングに興味はあるが、どこから始めればよいか分からず、コーディングに関する背景情報がほとんどまたはまったくない人を対象としています。このビデオでは、学習したいあらゆるプログラミング言語に適用できるコンピューター プログラミングの基本について説明します。

  • 00:05:00 このビデオでは、プログラミングの基本、統合開発環境 (IDE) でコードを記述する方法、およびプログラミング文法の重要性について説明します。

  • 00:10:00 このビデオでは、プログラミングとコンピューター サイエンスを紹介し、構文とプログラミング ルールの基本について説明します。コンソールの主な用途は、プログラムからテキストを出力することです。

  • 00:15:00 このビデオでは、算術、加算、減算、乗算、除算を含む基本的な数学と、多くのプログラミング言語の基本演算子であるモジュラスを説明します。コンソールへの文字列の出力についても説明します。

  • 00:20:00 このビデオでは、変数、型、名前などのプログラミングとコンピューター サイエンスの概念を紹介します。プリミティブ変数には、整数、ブール値、浮動小数点数、および倍精度浮動小数点数が含まれます。文字列変数には文字列が格納されます。 Char 変数は 1 文字を保持します。変数は、情報を簡単に参照できる形式で保存するために不可欠です。

  • 00:25:00 このビデオでは、変数を定義または作成すると何が起こるか、変数を参照する方法、プログラムで変数を操作する方法について説明します。理解すべき主な点は、変数は特定の値を格納する単なるメモリ内のスペースであり、数値を更新でき、その位置はコード全体で一定のままであるということです。

  • 00:30:00 変数は、プログラミング中に情報を保存できる場所です。変数の命名規則は読みやすさにとって重要です。 if ステートメント内の条件が true の場合、中括弧内のコードが実行されます。 if ステートメントと同様に機能する 2 つの追加ステートメント、elsif と eltons があります。 elsif の条件が true の場合、elsif に続くコードが実行されます。それ以外の場合は、elsif に続くコード
    スキップされます。 elsif の条件が true でない場合、elsif に続くコードはスキップされ、if ステートメントに続くコードが実行されます。

  • 00:35:00 配列は、相互に関連する変数のリストです。これらは、プログラマが相互に関連する情報を含む多数の変数を保存したい場合に便利です。

  • 00:40:00 プログラミングとコンピューター サイエンスの入門コースでは、配列、インデックス、サイズ、配列内の配列について説明します。ループもカバーされています。

  • 00:45:00 このビデオでは、for、while、do while ループなど、さまざまなタイプのループについて説明します。ループ条件の設定方法と無限ループを回避する方法について説明します。

  • 00:50:00 このビデオでは、プログラミング中に発生する可能性のある 3 種類のエラー (構文エラー、実行時エラー、論理エラー) について説明します。構文エラーは通常数秒以内に修正できるため、修正するのが最も簡単です。ランタイム エラーは、論理的には適切であるように見えるコード内のステートメントによって発生しますが、コンピュータには物理的に適切な時間内にタスクを完了する方法がありません。ロジック エラーは最も厄介で、プログラムが意図したとおりに動作しなくなる可能性があるため、デバッグが困難です。コードをデバッグするには、コードを段階的にテストし、構文エラーと実行時エラーを探す必要があります。

  • 00:55:00 コード内でエラーが発生した場合は、print ステートメントとコンソールを使用してコードのどこが間違っているかを特定し、ブレークポイントを使用してエラーの原因を追跡し、コメントを使用してマークアウトすることができます。このコードはコンピュータではなく、ユーザー向けのものです。最後に、エラーを回避するための戦略について説明します。

  • 01:00:00 このビデオでは、インストラクターがエラーや関数を含むプログラミングとコンピューター サイエンスの基本を説明します。彼は続けて、関数内で引数がどのように機能するか、またコード内の繰り返しを減らすために関数を使用する方法について説明します。

  • 01:05:00 このプログラミングとコンピューター サイエンスの入門ビデオでは、4 つの異なるタイプの関数、その目的、およびコードでの使用方法について説明します。関数は、コードを整理し、時間を節約し、プログラム全体を実行することなくコードに大きな変更を加えるのに役立ちます。

  • 01:10:00 このビデオでは、プログラミングとコンピューター サイエンスの基礎が紹介されています。ライブラリから関数をインポートする方法について説明し、関数の名前付けの規則について説明します。引数の型と数に基づいて関数を作成するためのルールも紹介されています。

  • 01:15:00 このビデオでは、関数、スコープ、引数の受け渡しなど、プログラミングとコンピューター サイエンスの基本について講師が説明しています。また、値を返さない関数の作成方法についても説明します。

  • 01:20:00 このビデオでは、プレゼンターが配列、関数、辞書をレビューします。配列は一緒に保存される値のリストのようなもので、関数はたどったパスに応じて変数を返します。注意すべき点は、別の型を返す関数をすでに定義している場合、ある型の変数を返すことはできないということです。配列リストは、リストのサイズが 10 要素を超えると自動的に大きくなり、辞書には複数の値が格納されます。

  • 01:25:00 コンピューターはさまざまな方法でデータを保存するため、理解するのが難しい場合があります。辞書はデータ ストレージの一種であり、従来の配列よりも流動的で編成が簡単です。検索アルゴリズムは、値のリスト内の特定のデータをすばやく見つけるために使用されます。

  • 01:30:00 このビデオでは、検索アルゴリズムの概念とその効率を紹介します。線形検索は、ソートされていないリストに対しては優れた基本アルゴリズムですが、最悪のシナリオでは非効率的です。二分探索は、リストがソートされているという事実を利用した、ソートされたリストの効率的な検索アルゴリズムです。

  • 01:35:00 二分検索アルゴリズムは、並べ替えられたリスト内の項目を見つける場合、線形検索よりも高速かつ効率的です。再帰関数は、再帰プログラミング ステートメントの一例です。再帰的ステートメントの基本ケースは、すべての再帰的ステートメントが満たさなければならない明確な値です。 n が 1 以下でない場合、再帰的ステートメントは n の合計を返し、その後、再帰的合計メソッドの戻り値から 1 を引いた値を返します。

  • 01:40:00 このビデオでは、プログラミングとコンピューター サイエンスを紹介し、再帰がなぜ有用なテクニックであるかを説明します。コンピューター サイエンスに必要なソフト スキルには、問題解決と計画が含まれます。擬似コードは、この計画に役立つプログラミングの簡略化された形式です。

  • 01:45:00 擬似コードは、論文のアウトラインを作成するのと同様に、コンピューター コードを計画する視覚的な方法です。フローチャートを作成することと、プログラムに実行してもらいたいことを時系列に書き出すことは、2 つの一般的な方法です。

  • 01:50:00 このビデオでは、コードを計画および作成するためのさまざまな方法や疑似コードの重要性など、プログラミングとコンピューター サイエンスの概念を紹介します。また、さまざまなプログラミング言語とその使用法についても説明します。

  • 01:55:00 このシリーズでは、著者は構文やルールなどのプログラミングの基本を取り上げ、特定の言語の学習方法を教えます。また、開始に役立つ Web サイトやリソースも提供しています。
Introduction to Programming and Computer Science - Full Course
Introduction to Programming and Computer Science - Full Course
  • 2020.04.21
  • www.youtube.com
In this course, you will learn basics of computer programming and computer science. The concepts you learn apply to any and all programming languages and wil...
 

C++ プログラミング コース - 初心者から上級者まで


C++ プログラミング コース - 初心者から上級者まで

このコースでは、C++ プログラミングのさまざまな側面をカバーします。

取り上げられたトピック:

  1. C++ 開発環境のセットアップ: ビデオでは、さまざまなプラットフォームで C++ 開発環境をセットアップする方法の概要が説明されています。これには、さまざまなコンパイラのインストール、およびコンパイラと C++ 標準ライブラリを使用するための Visual Studio Code の構成が含まれます。この手順は、Windows、Mac、Linux などのプラットフォームをカバーしています。

  2. C++ でのプログラミングの基礎: ビデオでは、変数、データ型、関数、フロー制御ステートメントなどの基本的な概念を説明します。変数の宣言、関数の定義、ループや条件文などの制御構造の使用方法について説明します。ビデオでは、コメントや C++ の main 関数などの概念も紹介しています。

  3. 文字列操作: 特定のビデオでは、C++ での文字列の操作に焦点を当てています。 strcmp や strcat などの関数を使用して文字列を比較および連結する方法について説明します。このビデオでは、strcpy 関数を使用して文字列をコピーする方法も示しています。

  4. 配列: ビデオでは、C++ の配列の概念を紹介しています。配列の宣言と初期化、ポインターを使用した要素へのアクセス、文字配列の出力などのトピックを扱います。

  5. 動的メモリ割り当てとポインタ: これらのビデオでは、C++ でメモリがどのように管理されるか、および動的メモリ割り当て技術を使用してプログラムに追加のメモリを割り当てる方法について説明します。これらは、ポインタ、メモリ マップ、およびメモリ管理ユニットの概念をカバーしています。このビデオでは、ポインターを安全に使用する方法、クラッシュを回避する方法、同じメモリ位置を指す複数のポインターを処理する方法についても説明します。

  6. 関数テンプレートとラムダ関数: ビデオでは、C++ で関数テンプレートを使用して汎用関数を作成する方法を説明しています。これらのビデオでは、コンパイラーが渡されたパラメーターのタイプに基づいて関数定義を生成する方法を示しています。さらに、ビデオでは、名前を付けずに呼び出すことができる匿名関数であるラムダ関数についても説明しています。ラムダ関数の構文と戻り値の型の仕様について説明します。

  7. クラスと継承: これらのビデオでは、C++ のクラスの概念を紹介し、クラス内でメンバー変数と関数を定義する方法を説明します。コンストラクター、デストラクター、アクセス指定子 (プロテクトおよびプライベート)、ポリモーフィズムを実現するための静的および動的バインディングの使用などのトピックを取り上げます。このビデオでは、継承を使用して既存のクラスに基づいて派生クラスを作成および使用する方法も示します。

  8. デバッグとエラー処理: ビデオでは、C++ プログラムのデバッグに関するガイダンスを提供します。ブレークポイントの設定方法、ローカル スコープ内の変数の検査方法、および初期化されていないポインターやメモリ リークに関連するエラーの処理方法について説明します。このビデオでは、オブジェクトのスライスや基本クラスのコンストラクターのオーバーライドなどの概念も取り上げています。

  9. インターフェイスとポリモーフィズム: 一部のビデオでは、C++ のインターフェイスとポリモーフィズムに焦点を当てています。動的バインディング、参照、および override キーワードを使用してプログラムで多態性の動作を実現する方法について説明します。ビデオでは、仮想メソッドを Final としてマークし、派生クラスでオーバーライドされるのを防ぐために使用できる Final 指定子についても説明します。

  10. その他のトピック: デフォルト パラメーター、自動出力ストリーム印刷のためのストリーム挿入可能なインターフェイス、およびより読みやすいコードを作成するためのインターフェイスの利用などの追加トピックも取り上げます。

このビデオでは、インストールと構成から、オブジェクト指向プログラミング、メモリ管理、ポリモーフィズムなどのより高度な概念まで、初心者が C++ プログラミングを学ぶのに役立つ段階的な手順、デモンストレーション、説明が提供されています。このコンテンツは、C++ プログラミングの基礎を学びたい初心者と、スキルをリフレッシュしたい、または特定のトピックを深く探求したい経験豊富なプログラマーの両方に適しています。

コード: https://github.com/rutura/The-C-20-Masterclass-Source-Code


第 1 章: ツールのセットアップ

  • 00:04:32 C++ 開発ツール
  • 00:11:06 Windows への C++ コンパイラーのインストール
  • 00:24:27 Windows への VS Code のインストール
  • 00:28:00 Windows での C++ 用の Visual Studio コードの構成
  • 00:57:27 Linux への C++ コンパイラのインストール
  • 01:04:02 Linux への Visual Studio コードのインストール
  • 01:07:40 Linux 上で Visual Studio コードを C++ 用に構成する
  • 01:22:45 MacOS への C++ コンパイラのインストール
  • 01:28:07 MacOS に Visual Studio コードをインストールする
  • 01:30:16 MacOS で C++ 用に Visual Studio コードを構成する
  • 01:35:37 オンライン コンパイラー


第 2 章: 飛び込む

  • 01:43:01 初めての C++ プログラム
  • 01:55:56 コメント
  • 02:01:56 エラーと警告
  • 02:13:12 ステートメントと関数
  • 02:31:34 入力出力
  • 02:49:57 C++ プログラムの実行モデルとメモリ モデル
  • 02:56:42 C++ コア言語 VS 標準ライブラリ VS STL


第 3 章: 変数とデータ型


第 4 章: データの操作


第 5 章: フロー制御


第 7 章: 配列


第 8 章: ポインタ


第 9 章: 参考資料


第 10 章: 文字操作と文字列


第 11 章: 関数

  • 14:12:47 1 つの定義ルール
  • 14:28:25 初めての機能体験
  • 15:00:50 関数の宣言と定義
  • 15:15:30 複数のファイルにわたる関数 - コンパイル モデルの再考
  • 15:42:30 値によるパス
  • 15:50:30 ポインターを通過
  • 15:57:46 参照により通過


第 12 章: 関数からの取り出し

  • 16:03:20 関数からの取り出し はじめに
  • 16:03:58 入力パラメータと出力パラメータ
  • 16:17:54 関数から戻る


第 13 章: 関数のオーバーロード

  • 16:32:35 関数のオーバーロードの概要
  • 16:34:17 異なるパラメータによるオーバーロード


第 14 章: Lambda 関数

  • 16:49:00 Lambda 関数の概要
  • 16:49:38 Lambda 関数の宣言と使用
  • 17:20:25 キャプチャリスト
  • 17:34:24 コンテキスト内ですべてをキャプチャ


第 15 章: 関数テンプレート

  • 17:40:08 関数テンプレートの概要
  • 17:41:45 関数テンプレートを試してみる
  • 18:19:52 テンプレートのタイプ推定と明示的な引数
  • 18:35:47 参照によるテンプレート タイプ パラメータ
  • 18:48:55 テンプレートの特化


第 16 章: 概念

  • 19:04:31 コンセプトの紹介
  • 19:06:47 コンセプト
  • 19:25:32 コンセプト: 独自のコンセプトを構築する
  • 19:42:45 句が必要: ズームイン
  • 19:59:53 概念の論理的組み合わせ
  • 20:09:39 コンセプトと自動車


第 17 章: クラス

  • 20:15:40 授業紹介
  • 20:16:33 初めての C++ クラス
  • 20:38:03 コンストラクター
  • 20:53:35 デフォルトのコンストラクター
  • 20:59:42 セッターとゲッター
  • 21:10:06 複数のファイルにわたるクラス
  • 21:30:49 ポインタによるクラス オブジェクトの管理
  • 21:42:48 デストラクター
  • 22:05:44 コンストラクターとデストラクターの呼び出し順序
  • 22:11:03 ディス ポインタ
  • 22:33:33 構造体
  • 22:42:37 クラスオブジェクトのサイズ


第 18 章: 継承

  • 22:52:43 継承の紹介
  • 22:55:59 継承の最初の試行
  • 23:21:10 保護されたメンバー
  • 23:32:06 基本クラスのアクセス指定子: ズームイン
  • 23:36:49 基本クラスのアクセス指定子: デモ
  • 24:07:42 私的相続に迫る
  • 24:26:36 メンバーをスコープに復活させる
  • 24:46:59 継承のあるデフォルトの Arg コンストラクター
  • 24:57:37 継承を伴うカスタム コンストラクター
  • 25:26:56 継承を使用してコンストラクターをコピーする
  • 25:51:53 基本コンストラクターの継承
  • 26:06:00 デストラクターによる継承
  • 26:12:20 継承で再利用されたシンボル


第19章: ポリモーフィズム

  • 26:21:03 ポリモーフィズムの概要
  • 26:26:54 継承による静的バインディング
  • 26:55:24 仮想関数を使用したポリモーフィズム (動的バインディング)
  • 27:14:31 多態性オブジェクトのサイズとスライス
  • 27:26:37 コレクションに保存された多態性オブジェクト
  • 27:45:42 オーバーライド
  • 27:52:45 オーバーロード、オーバーライド、および非表示
  • 28:07:35 さまざまなレベルでの継承とポリモーフィズム
  • 28:33:03 静的メンバーの継承と多態性
  • 28:49:13 決勝
  • 29:07:42 デフォルトの引数を持つ仮想関数
  • 29:23:18 仮想デストラクター
  • 29:35:38 Dynamic_cast<>()
  • 30:08:17 コンストラクターとデストラクターから仮想 (多態性) 関数を呼び出さないでください
  • 30:24:45 純粋な仮想関数と抽象クラス
  • 30:43:37 インターフェイスとしての抽象クラス
C++ Programming Course - Beginner to Advanced
C++ Programming Course - Beginner to Advanced
  • 2022.02.17
  • www.youtube.com
Learn modern C++ 20 programming in this comprehensive course.💻 Source code: https://github.com/rutura/The-C-20-Masterclass-Source-Code✏️ Course developed by...
 

データ構造の簡単から上級までのコース - Google エンジニアによる完全なチュートリアル (パート 1 ~ 4)


データ構造の簡単から上級までのコース - Google エンジニアによる完全なチュートリアル

簡単な要約:

00:00:00
- 01:00:00インストラクターは、データ構造と、より高速で強力なアルゴリズムを作成する際のその重要性について説明します。このチュートリアルでは、Big O 表記法と、アルゴリズムに必要な時間とスペースの量を標準化するために Big O 表記法を使用する方法について説明し、さまざまな時間計算量に対する具体的な例が提供されます。このチュートリアルでは、静的配列と動的配列の実装についてもその利点と欠点を含めて説明し、単一リンク リストと二重リンク リストでのノードの作成と挿入について詳しく説明します。最後に、チュートリアルではスタック データ構造を紹介し、その主な操作を簡単に説明します。

01:00:00
- 02:00:00 「データ構造の簡単から上級までのコース」チュートリアルのこのセクションでは、さまざまなデータ構造とその機能について包括的に説明します。このチュートリアルでは、スタックとキューの動作原理、配列とリンク リストを使用したそれらの実装、グラフ トラバーサルやサーバー リクエストの管理などのさまざまなアプリケーションにおけるスタックとキューの重要性について説明します。このチュートリアルでは、優先キューとヒープを使用したその実装についても説明し、優先キューとヒープの違い、およびヒープの種類を明確にします。このチュートリアルは、バイナリ ヒープに要素を追加および削除する方法を段階的にデモンストレーションして終了します。

02:00:00 - 03:00:00  Google エンジニアはデータ構造に関する完全なチュートリアルを提供し、バイナリ ヒープ データ構造からノードを削除する方法、優先キューでヒープ不変を維持する方法、およびスイムおよびバイナリ ヒープ データ構造内のシンク ノード。このビデオでは、結合していないセットに分割された要素を追跡し、2 つのグループを結合するために使用される Union Find データ構造についても説明しており、データ構造がどのように機能するかを説明するための磁石の例も含まれています。さらに、グラフ内の最小スパニング ツリーを見つけるための Kruskal のアルゴリズムが説明され、結合データ構造をより効率的に見つけるためにパス圧縮の概念が導入されます。

03:00:00 - 04:00:00 このチュートリアルでは、union-find データ構造とそのメソッド (find、connected、parent、size、unify など) から始まるさまざまなデータ構造について説明します。次に、チュートリアルはツリー、ルート付きツリー、バイナリ ツリー、およびバイナリ検索ツリーの定義を含むツリーに進みます。このビデオでは、二分探索ツリーへのノードの挿入と削除の例、および事前順序、順序内、事後順序、レベル順序などのさまざまな走査アルゴリズムを示し、Python と Java でこれらの構造を実装する方法を説明します。さらに、ビデオではハッシュ テーブルを紹介し、ハッシュ関数の重要性と一般的な衝突解決方法について説明します。

04:00:00
- 05:00:00 このセクションでは、ハッシュ テーブルとその実装のさまざまな側面について説明します。キーを値にマッピングするハッシュ関数の重要性と、個別のチェーンやオープン アドレス指定などの技術を使用してハッシュの衝突を処理する方法について説明します。このチュートリアルでは、ハッシュ テーブル内のエントリの挿入、削除、検索、および負荷係数のサイズ変更と管理の方法についても説明します。講演者は、無限ループやパフォーマンスの問題を回避するために、適切なプローブ関数とテーブル サイズを選択することの重要性を強調しました。チュートリアル全体で、概念を説明するために実際の例が使用されます。

05:00:00
- 06:00:00 このセクションでは、衝突解決におけるハッシュ テーブル、ダブル ハッシュ、二次プローブの包括的な概要を説明します。このビデオでは、ハッシュ テーブルのサイズ変更と拡大、衝突と削除の処理、二次プローブを使用したハッシュ テーブルの実装の概念について説明します。このビデオでは、線形構築時間で対数時間での範囲クエリとポイント更新をサポートするデータ構造であるフェンウィック ツリーも紹介しています。このビデオでは、フェンウィック ツリーを使用してプレフィックス合計と範囲クエリを実行する方法を段階的に説明しています。

06:00:00 - 07:00:00 ビデオ チュートリアルでは、クイック レンジ クエリとポイント更新のためのフェンウィック ツリーの概念、一意の部分文字列と最長の共通部分文字列を検索するためのサフィックス配列と LCP 配列の使用、問題を解決するためのフェンウィック ツリーの概念など、さまざまなトピックを取り上げています。スライディング ウィンドウ手法を使用した最長共通部分文字列問題。このチュートリアルでは、LCP 配列を使用して最も長く繰り返される部分文字列を効率的に見つける方法についても説明し、バランスの取れた二分探索ツリー (特に AVL ツリー) のプロパティと重要性、およびツリーの回転を使用してバランスを保つ方法についても説明します。このビデオでは、詳細な説明、例、および GitHub で入手可能な Java のソース コードが提供されています。

07:00:00 - 08:00:00 このセクションでは、さまざまなデータ構造とその実装について詳しく説明します。このビデオでは AVL ツリーについて説明し、挿入および削除の方法と、AVL ツリーの二分探索ツリーの削除方法を拡張する方法について説明します。インストラクターは、Java での再帰的 AVL ツリー実装のソース コードも提供し、プライベート挿入メソッドと更新およびバランス メソッドについて説明します。このビデオではその後、インデックス付き優先キューについて詳しく説明し、インデックス値をキーに割り当てる方法を説明し、挿入、更新、削除などの便利な操作の疑似コードを提供します。このビデオでは、ノード位置ルックアップを使用して、線形時間計算量から対数時間計算量へのノード削除を改善する方法についても詳しく説明しています。

パート1

  • 00:00:00 講演者は、データを効率的に整理する方法としてのデータ構造の概念と、より高速で強力なアルゴリズムを作成するためにデータ構造がいかに重要であるかを紹介します。講演者は、目の前のタスクに適切なデータ構造をいつ、どのように使用するかを理解することの重要性と、データ構造によってコードがどのようにクリーンで理解しやすくなるかを理解することの重要性について語ります。抽象データ型の概念については、抽象データ型がインターフェイスのみを提供し、データ構造の実装方法に関する具体的な詳細は提供しない方法の例とともに説明します。さらに、ビデオでは、データ構造のパフォーマンスを理解するために、計算の複雑さについても簡単に触れています。

  • 00:05:00 Big O 記法の概念は、入力の最悪の配置に基づいてアルゴリズムを実行するために必要な時間とスペースを標準化する方法として導入されました。 Big O は、入力が非常に大きくなったときに何が起こるかのみを考慮し、big O 表記に追加された定数値を削除します。関数 f の概念も導入され、n の f のビッグ O はちょうど n の 3 乗であり、これがその関数の最大かつ最も支配的な項であると述べられています。

  • 00:10:00 Google エンジニアは、Big O 記法がどのように使用されるかの具体的な例を提供しています。例は、時間計算量 (定数時間、線形時間、二次時間、対数時間) に基づいて分類されています。また、二分探索の例を使用して、対数時間計算量がどのように達成されるかについて段階的に説明しています。さらに、より複雑なアルゴリズムの時間計算量を計算する方法を示し、アルゴリズムの複雑さを決定するための規則を説明します。

  • 00:15:00 講演者は、外側のループと内側のループを含む入れ子になったループの複雑さの分析について説明します。内側のループには一定の作業量があり、外側のループには可変の作業量があります。 n^3 が支配項であるため、関数の大きな O は O(n^4) です。次に、講演者は静的配列を紹介します。静的配列は、メモリの連続したチャンクであるインデックス可能な要素を含む固定長のコンテナです。静的配列は、オブジェクトの一時的な保存から入力または出力ストリームからの情報の保存まで、あらゆる場所で使用されます。講演者は、配列の基本構造、配列に対して実行できる一般的な操作、および配列の複雑さの分析について概説します。

  • 00:20:00 インストラクターは、戻り値を 1 つだけ許可する言語の回避策や動的プログラミングなど、プログラミングにおける配列の使用について説明します。同氏は、配列にはインデックス可能な特性があるため、アクセス時間は一定ですが、最悪の場合、検索には直線的な時間がかかる可能性があると説明しています。静的配列からの挿入、追加、および削除は実行できませんが、動的配列の場合、追加のために内部配列のサイズを変更すると、まれではありますが一定時間の操作が発生します。最後に、要素は for-each ループを使用して反復できること、コンピューター サイエンスにおける配列のインデックス付けは 0 から始まるため、一部の初心者にとっては混乱する可能性があることを指摘しています。

  • 00:25:00 このビデオでは、配列のインデックス付けの概念 (角括弧はインデックス付けを示します) と、動的配列が必要に応じて拡大および縮小して、静的配列と同様の get set 操作を可能にする方法について説明します。動的配列を実装するには静的配列が使用され、容量を超えると配列のサイズが 2 倍になり、すべての要素が新しい静的配列にコピーされます。このビデオでは、T 型のジェネリックスをサポートし、内部静的配列、長さ、容量のインスタンス変数を持つ配列クラスのソース コードも示しています。

  • 00:30:00 インストラクターは、size、inset、clear、add、remove、index of、contains、toString など、動的配列のいくつかのメソッドの実装を説明します。 add メソッドでは、容量に達したときにサイズを 2 倍にして配列のサイズを変更します。remove メソッドでは、2 つのインデックスを使用して、削除インデックスを除く配列のすべての要素をコピーします。また、インストラクターは、動的配列のイテレータを作成する方法を実演し、配列の要素を反復するためにイテレータを使用する利点についても説明します。全体として、このチュートリアルでは、動的配列の実装について、シンプルかつ包括的な概要を提供します。

  • 00:35:00 インストラクターは、単一リンク リストと二重リンク リストについて説明し、それらがデータを保持し、データを含む他のノードを指すノードの連続リストであることを説明します。リンク リストは、リスト、スタック、キューの実装に使用されるほか、循環リスト、ハッシュ テーブルの個別の連鎖、隣接リストやグラフにも使用されます。インストラクターは、リンク リストの作成に役立ついくつかの用語についても説明します。さらに、単一リンク リストと二重リンク リストの長所と短所についても説明します。単一リンク リストはメモリ効率が高くなりますが、前の要素にアクセスする機能がありません。一方、二重リンク リストは逆方向にたどることができ、ノードを簡単に削除できます。

  • 00:40:00 インストラクターは、単一リンク リストと二重リンク リストへのノードの作成と挿入の実装の詳細を説明します。単一リンクされたリストにノードを挿入するには、新しいポインタが作成され、トラバーサ ポインタが目的の位置まで進められ、その後、新しいノードが作成されて他のノードにリンクされます。一方、二重リンクリストは次のポインタと前のポインタの両方を持ち、新しいノードを挿入する場合、隣接するノードと新しいノードの両方のポインタを更新する必要があります。単一リンクリストからノードを削除するには、2 つのポインタを使用して目的のノードに進み、削除し、後でそのメモリの割り当てを解除する必要があります。

  • 00:45:00 講演者は、二重リンク リストからノードを削除する方法を説明します。これは、最後のノードへの参照を手動で維持する必要がないため、単一リンク リストからノードを削除するよりも簡単です。講演者は Java での実装を示し、先頭または末尾からの要素の検索や削除など、リンク リスト内のさまざまな操作の複雑さについて説明します。リンクされたリスト内の検索は最悪の場合でも線形ですが、先頭への挿入または先頭の削除は一定時間になります。末尾からの削除には、単一リンク リストでは線形時間がかかりますが、二重リンク リストでは前のノードへの参照があるため、線形時間がかかりません。

  • 00:50:00 ビデオのこのセクションでは、プレゼンターが、リストのクリア、サイズの取得と空かどうかの確認、リストの先頭と末尾へのノードの追加などのメソッドを含む二重リンク リストの実装について説明します。また、リストの最初または最後の要素を参照する方法、最初または最後の要素を削除する方法、およびリストの中央にある任意のノードを削除する方法についても説明しています。発表者は、メモリの割り当てを適切に解除することの重要性を強調し、ユーザーがノード クラスに直接アクセスできないようにノード クラスをプライベートとして設定します。

  • 00:55:00ビデオのこのセクションでは、講師は、ノードに明示的にインデックスが付けられていない場合でも、リンク リストから特定のインデックスのノードを削除する方法を説明します。 Remove メソッドは、リンク リストからの任意の値の削除と null 値の検索をサポートします。リンクリスト内のオブジェクトのインデックスを取得するメソッドのインデックスとイテレータメソッドについても説明します。最後に、講師はスタック データ構造を紹介し、その主要な操作であるプッシュとポップの概要を簡単に説明します。講師はまた、シリーズの今後のビデオで、スタックの実装、スタックを使用して解決される問題、スタック操作に関連する時間の複雑さについて取り上げることも強調しています。

パート2

  • 01:00:00 このビデオでは、スタック データ構造がどのように機能するか、またプログラミングにおけるそのさまざまな用途について説明します。このビデオでは、スタックに操作を追加およびスタックから削除する方法の詳細な例を示し、テキスト エディター、コンパイラー、および再帰のサポートでスタックがどのように使用されるかを説明します。さらに、このビデオでは、スタックを使用してグラフ上で深さ優先検索を実行する方法を強調し、スタックを使用して括弧シーケンスが有効かどうかを判断する方法に関する優れた問題例を示しています。最後に、ビデオにはスタックの複雑さの分析と、スタックがリンク リストとしてどのように機能するかが含まれています。

  • 01:05:00 Google エンジニアは、スタック データ構造を使用してブラケット シーケンスが有効かどうかを確認する方法をデモンストレーションします。彼はアルゴリズムを段階的に実行し、左括弧をスタックにプッシュし、右括弧に遭遇したときにポップオフして、それらが一致するかどうかを確認します。また、各ペグがスタックを表し、ディスクが特定の条件下でのみ移動できる要素を表すため、ハノイの塔ゲームがスタックとどのように関係するのかについても説明しました。最後に、配列またはリンク リストを使用してスタックを実装する方法について説明します。

  • 01:10:00 Java プログラミング言語でのスタック データ構造の単純な実装で、単一リンク リストを使用してスタックを作成し、スタックから要素をポップする方法について学びます。スタックは、ヘッドがヌル ノードを指すことによって作成されます。これは、スタックが空であることを意味します。新しい要素はヘッドの前に挿入され、要素のポップはヘッド ポインタを次のノードに移動し、最後のノードの割り当てを解除することによって行われます。データ構造におけるメモリ リークは問題を引き起こす可能性があるため、すべてのデータ構造でメモリ リークに注意し、必要に応じて修正することが重要です。

  • 01:15:00 インストラクターは、キューへの登録とキューからの取り出しという 2 つの主要な操作で実際のキューをモデル化するために使用される線形データ構造であるキューについて説明します。キューの前部と後部は、それぞれ要素の挿入と削除に使用されます。インストラクターは、キューに関連するさまざまな用語についても説明します。キューに入れることは追加と呼ばれることがあり、キューから取り出すことはキューの先頭からのポーリングまたは削除と呼ばれることもあります。キューの典型的な例は、映画館やレストランの列です。キューは、シーケンス内の最新の x 個の要素を追跡するのに役立ちます。

  • 01:20:00 このビデオでは、キューを使用してサーバー リクエストを管理し、グラフ上で幅優先検索トラバーサルを実行する方法を説明しています。リクエストのキューイングの概念が導入され、アイドル状態のサーバーは一度に一定数のリクエストのみを処理でき、超過したリクエストはキューに入れられます。このビデオでは、開始ノードからの距離の順にグラフのノードを訪問する幅優先検索の基本についても説明しています。このビデオは、キュー データ構造を使用した n キューイングおよびデキュー要素の実装を説明して終わります。

  • 01:25:00 このチュートリアルではキューについて詳しく説明し、配列またはさまざまな種類のリンク リスト (単一リンク リストと二重リンク リスト) を使用してキューの抽象データ型を実装する方法を説明します。このチュートリアルでは、キューの単一リンク リストの実装がどのように機能するかの例を示し、Java プログラミング言語を使用したピーク、ポーリング、オファーなどのさまざまなキュー メソッドの実装についても説明します。このチュートリアルでは、github.com でキュー実装のソース コードへのリンクも共有しています。

  • 01:30:00 チュートリアルのこのセクションでは、Google エンジニアがデータ構造、特にキューと優先キューの概念と実装について説明します。彼は、優先キューがどのように通常のキューと同様に動作するかについて説明しますが、唯一の違いは、各要素には特定の優先順位があり、優先順位の高い要素が最初にキューから出てくることです。また、優先キューは同等の要素のみをサポートすること、つまり優先キューに挿入するデータは順序付けする必要があることも強調しています。さらに、ポーリングと優先キューへの要素の追加の操作を説明する例を示しています。チュートリアルの次のセクションでは、優先キューで実行される一般的な操作、最小優先キューの最大優先キューへの変換、複雑さの分析、優先キューの実装方法について詳しく説明します。

  • 01:35:00 Google エンジニアが、ヒープを使用して優先キューを実装する方法を説明します。ヒープは、ヒープ不変条件を満たすツリーベースのデータ構造です。これは、すべてのノードにおいて、親ノードの値が常に子ノードの値以上であることを意味し、結果として 2 種類のヒープになります。 最大ヒープそして最小の山。ヒープは、優先キューの標準的な基礎となるデータ構造を形成するため、重要です。次に、Google エンジニアは構造の例を示し、それがヒープであるかどうかを聴衆に尋ね、すべてのヒープがツリーであり、ヒープの不変条件を満たす必要があることを示します。

  • 01:40:00 ダイクストラの最短パス アルゴリズムやハフマン エンコーディングなどのアルゴリズムにおける優先キューの重要性について説明します。優先キューは、次に最適な要素または最悪の要素を動的にフェッチする必要がある状況で役立ちます。主な焦点は、バイナリ ヒープとして実装された優先キューと、要素の追加、要素の削除、包含のチェック、最小優先キューから最大優先キューへの変更などの操作です。ハッシュ テーブルを使用すると、単純な方法ではすべての要素に対して線形スキャンが実行され、除去時間の複雑さが対数的に改善されます。このセクションは、最小優先度キューを最大優先度キューに変換するハックで終わります。

  • 01:45:00 Google エンジニアは、優先キューにリバース ヒープを実装する簡単な方法として否定を使用する方法を説明しています。彼は、標準の辞書編集コンパレータと否定コンパレータを備えた最小優先キューを使用した数値と文字列の両方の操作の例を示しています。このエンジニアは、バイナリ ヒープの概念とバイナリ ヒープに要素を追加する方法も紹介します。

  • 01:50:00 インストラクターは、バイナリ ヒープを使用して優先キューに要素を効果的に追加する方法を理解するために必要な重要な用語と概念を説明します。彼は、プライオリティ キューはヒープではなく、プライオリティ キューが持つべき動作を定義する抽象データ型であり、ヒープは実際にその動作を実装できるデータ構造にすぎないことを明確にしました。また、バイナリ ヒープを含むヒープの種類についても説明し、完全なバイナリ ツリー プロパティと、配列構造を使用してバイナリ ヒープを表現する方法について説明します。

  • 01:55:00 Google エンジニアは、バイナリ ヒープにノードを追加し、ノードの子ノードと親ノードに簡単にアクセスする手法を使用してヒープの不変性を維持する方法を説明します。最小ヒープに値を挿入する例を示し、ヒープの不変条件を満たすためにノードをバブルアップする方法を示します。次のセクションでは、エンジニアはバイナリ ヒープからの要素の削除について説明し、最も優先度の高い対象ノードであるルート値を削除することの重要性を強調します。

パート 3

  • 02:00:00 Google エンジニアは、プル方式を使用してバイナリ ヒープ データ構造からノードを削除するプロセスを説明します。プルは、ルート ノードを削除する場合と特定のノードを削除する場合の 2 つの場合に行われます。ルート ノードを削除すると、ノードは配列内の最後のノードと交換され、バブリング ダウンによってヒープの不変性が保証されます。特定のノードを削除する場合、ノードは線形に検索され、ヒープ内の最後のノードとスワップされ、スワップされたノードの値に応じてバブリングアップまたはバブリングダウンを通じてヒープの不変性が保証されます。エンジニアは、プルにはルート ノードでは対数時間がかかり、特定のノードでは線形時間がかかると結論付けました。

  • 02:05:00 チュートリアルのこのセクションでは、Google エンジニアが、ハッシュ テーブルを使用して時間計算量を改善してヒープ内のノードを削除する方法を説明します。削除するノードのインデックスを見つけるために線形スキャンを実行する代わりに、各ノードは見つかったインデックスにマップされます。特定のノードを削除したい場合は、そのインデックスを検索するだけで削除を開始できます。このビデオでは、ヒープ内の複数の値の問題に対処する方法と、ツリー内の値の位置を追跡する方法についても説明します。エンジニアは、ヒープの不変条件を満たしている限り、どのノードを削除しても問題ないと説明します。このチュートリアルには、提案された新しいスキームを使用した要素の追加、取得、削除の例が含まれています。

  • 02:10:00 講演者は、ヒープ データ構造を使用して優先キューにヒープ不変条件を挿入、削除、維持する方法を説明します。次に、ソース コードを詳しく調べ、優先キューの実装に必要ないくつかの重要なインスタンス変数とコンストラクターを強調表示します。彼は、優先キューで許可される要素は同等のインターフェイスを実装する必要があり、ヒープ内の要素の位置を表す一連の整数に要素をマップするマップを使用してロギングと削除を追跡できると説明します。

  • 02:15:00 チュートリアルのこのセクションでは、Google エンジニアがプライオリティ キューを作成するさまざまな方法について説明します。これには、設定された容量を持つ最初は空のキューの作成、定義された初期容量を持つキューの作成、線形キューの構築などがあります。 heapify 操作を使用した時間。また、エンジニアは、空、クリア、サイズ、ピーク、ポーリング、包含など、優先キューのいくつかの簡単なメソッドについても説明します。 add メソッドについても説明し、要素をキューに追加する方法と、マップ内の要素を追跡する重要性について詳しく説明します。スイム関数も、リストの最後に要素を追加した後に必要なステップとして強調表示されます。

  • 02:20:00 ビデオのこのセクションでは、Google エンジニアがバイナリ ヒープ データ構造内でノードをスイミングおよびシンクする方法を説明しています。スイミング方法では、ノードをその親と交換し、ノードがその値に基づいて正しい位置に配置されるまで上に移動します。シンキング方法も似ていますが、ノードとその子ノードを比較し、正しい位置に到達するまで小さい方のノードと交換する必要があります。エンジニアは、バイナリ ヒープに実装されている swap、remove、remove add メソッドについても説明します。削除追加メソッドには、削除されたノードをヒープ内の最後の要素と交換し、新しいノードを適切な位置にシンクまたはスイミングすることが含まれます。

  • 02:25:00 チュートリアルのこのセクションでは、インストラクターがヒープ データ構造からノードを削除し、スワップがヒープに影響を与えるかどうかに応じてノードをシンクまたはスイムする方法を使用してヒープの最小限の整合性が維持されるようにする方法を説明します。注文。このセクションでは、union find データ構造と、その 2 つの主要な操作である find と Union についても紹介します。これらの操作は、それぞれ、素なセットに分割された要素を追跡したり、2 つのグループをマージしたりするために使用されます。

  • 02:30:00 講演者は磁石の例を使用して、union find データ構造がどのように機能するかを説明します。 Union Find は、項目または項目のグループを効率的に結合し、それらに任意の色を割り当てます。 Union Find データ構造は、最小スパニング ツリー アルゴリズムやグリッド パーコレーションなどのさまざまなアルゴリズムで使用されます。 Union Find は非常に複雑で、その構築は線形時間であり、そのカウント コンポーネント関数は定数時間でコンポーネントの数を決定できるため、優れたデータ構造となります。

  • 02:35:00 チュートリアルのこのセクションでは、Google エンジニアが、グラフ内の最小スパニング ツリーを見つけるための Kruskal のアルゴリズムを説明します。このアルゴリズムでは、エッジの重みを昇順にしてエッジをソートし、すべての頂点が 1 つのグループに統合されるまで、同じグループに属さないノードを統合します。 Union Find データ構造は、グループを効率的にマージし、循環を防ぐために使用されます。エンジニアはグラフの例を提供し、アルゴリズムのステップを順を追ってアルゴリズムがどのように機能するかを説明します。

  • 02:40:00 チュートリアルでは、union find データ構造とそれが内部でどのように機能するかを説明します。最初のステップは、オブジェクトと、0 から N (N は要素の数を含む) までの範囲の整数との間のマッピングを作成することです。次に、配列が構築され、各インデックスには関連付けられたオブジェクトが含まれます。これはマッピングを通じて行われます。配列の位置の値は最初はその配列のインデックスであり、各ノードはそれ自体にマッピングされるルート ノードです。オブジェクトをグループに統合する命令が実行されると、配列内の値が他のオブジェクトにマップされるように変更されます。小さなコンポーネントは大きなコンポーネントにマージされ、ルート ノードはグループを統合するために使用されます。

  • 02:45:00 講演者は、union find データ構造を使用して要素を異なるグループにマージする方法について話します。各コンポーネントのルート ノードの親ノードを見つけてたどることで、要素がどのコンポーネントに属しているかを判断できます。 2 つのコンポーネントを統合するには、ルート ノードの 1 つが他のルートの親になることをポイントします。コンポーネントの数は残っているルート ノードの数に等しく、コンポーネントを統合するとルート ノードの数は減少するだけです。講演者はまた、この構造の実装では、現時点ではパス圧縮を使用しないと時間計算量が償却されないことにも言及しています。最適化については次のビデオで説明します。

  • 02:50:00 パス圧縮の概念は、ユニオン検索データ構造をどのように効率化するかを示すために導入されています。パス圧縮には、ルート ノードへのパスに沿ったすべてのノードの圧縮が含まれるため、任意のコンポーネントのルート ノードを一定時間検索できるようになります。 2 つの方法を比較対照するために、パス圧縮ありとなしでグループを統合する例を示し、パス圧縮によって得られる効率を示します。

  • 02:55:00 インストラクターは、パス圧縮とユニオン検索がどのように連携して効率的なデータ構造を作成するかについて説明します。彼は、パス圧縮が最終状態に到達するまでの途中でどのようにパスを動的に圧縮するかを示します。結合検索コードはビデオで紹介されており、インデックス付けと親子関係の追跡のための配列の使用方法が説明されています。さらに、コードにはルート ノードを確認し、そのノードへのパスを圧縮するメソッドが含まれています。インストラクターは、このトピックを完全に理解するために、ユニオン・ファインドに関する他のビデオを見ることの重要性を強調します。

パート 4

  • 03:00:00 インストラクターは、union-find データ構造とそのメソッド (find、connected、parent、size、unify など) を紹介します。彼は、構造のルート ノードに各接続コンポーネントのサイズがどのように含まれているか、また、unify メソッドが小さなグループを大きなグループにマージする方法を示しています。ツリーに移り、インストラクターは無向グラフとしてのツリーの概要を説明し、二分木と二分探索ツリーを紹介します。彼は、二分探索ツリーでのノードの挿入と削除の方法、ツリーのトラバーサル、およびそれらを一般のツリーに適用する方法について、後のチュートリアルで説明することを約束しています。

  • 03:05:00 ツリーの概念が導入され、複数の定義が提供されます。ツリーは、接続された非循環の無向グラフ、n 個のノードと n-1 個のエッジを持つグラフ、または任意の 2 つの頂点間に 1 つのパスしか存在しないグラフとして定義できます。ルート付きツリーも導入されており、任意のノードがルートになり、子ノードと親ノードが定義されます。ルート ノードの親はそれ自体であり、リーフ ノードは子のないノードとして定義されます。サブツリーの概念も導入され、ツリー内の三角形で示されます。さらに、バイナリ ツリーの定義は、すべてのノードに最大 2 つの子を持つツリーとして説明されます。

  • 03:10:00 このビデオでは、二分探索ツリーの不変式を満たす二分木である二分探索ツリーについて説明します。これは、左側のサブツリーの値が常に現在のノードより小さく、右側のサブツリーの値が大きいことを意味します。このビデオでは、二分探索ツリーのさまざまな例が示されており、不変条件を満たすかどうかを視聴者に判断してもらいます。二分探索ツリーは、抽象データ型の多くの実装で役立ち、バランスの取れた二分探索ツリーと構文ツリーで使用されます。また、ランダム データの挿入や検索などの操作では、平均的な場合に対数的な時間計算量になります。

  • 03:15:00 チュートリアルのこのセクションでは、Google エンジニアがバイナリ検索ツリーとそこに要素を挿入する方法について説明します。二分探索ツリーは平均して対数的な動作をするため、実装が簡単で、ほとんどの場合に効率的です。ただし、最悪の場合、バイナリ ツリーは線形データ構造になる可能性があり、これは理想的ではありません。二分探索ツリーに要素を挿入するには、要素が比較可能である必要があり、次の 4 つのケースのいずれかが発生します。左のサブツリーを再帰する、右のサブツリーを再帰する、重複値を処理する、または新しいノードを挿入する。最後に、エンジニアはアニメーションを使用して二分探索ツリーに値を挿入する方法を示します。

  • 03:20:00 Google エンジニアは、二分探索木に値を挿入する際に線形構造になるという最悪のシナリオを説明しています。この動作は、ノードの検索や値の削除などの操作の速度を低下させるため、望ましくないです。次に、エンジニアは 2 つのステップで二分探索ツリーから要素を削除する方法を説明します。まず、削除するノードを見つけます。次に、それを後続ノードに置き換えて二分探索ツリーの不変性を維持します。このビデオでは、プロセスの理解に役立つように、二分探索ツリーで値を検索する方法の例が示されています。

  • 03:25:00 Google エンジニアが、二分探索木を扱う際の削除フェーズの 4 つのケースについて説明します。最初のケースは、削除するノードがリーフ ノードの場合で、2 番目と 3 番目のケースは、左側または右側にサブツリーが 1 つしかないときに発生します。 4 番目のケースは、ノードに左右両方のサブツリーがある場合に発生します。問題は、ノードの後続サブツリーがどちらになるかということです。答えは、後続者は左側のサブツリーの最大値または右のサブツリーの最小値のいずれかであり、後続者は 2 つ存在する可能性があるということです。

  • 03:30:00 コースのこのセクションでは、インストラクターは、後続ノードの概念を使用して二分探索ツリーからノードを削除する方法を説明します。後続ノードは、右側のサブツリーの最小ノードまたは左側のサブツリーの最大ノードのいずれかです。インストラクターは、いくつかの例を通じてノードの削除を示し、削除後にツリーのバランスを再調整することの重要性を強調します。このセクションは、事前順序、順序どおり、事後順序、レベル順序などのさまざまなツリー トラバーサルの概要で終わります。

  • 03:35:00 インストラクターは、バイナリ ツリーにおける事前順序、順序内、および順序後の走査の概念を説明します。彼は、pre-order が現在のノードの値に続いてその左右のサブツリーを出力することを説明し、その後、どのノードが訪問されたかを追跡するために呼び出しスタックを維持しながら、バイナリ ツリー内で pre-order トラバーサルがどのように機能するかの例を示します。同様に、彼は、左のサブツリーを走査し、値を出力し、次に右のサブツリーを走査するという、順序通りの走査がどのように機能するかを説明しています。インストラクターは例として二分探索ツリーを使用し、走査中にノードが訪問され、出力される順序を強調します。

  • 03:40:00 このチュートリアルでは、バイナリ ツリーのさまざまな走査アルゴリズムについて説明します。 1 つ目は、ノードの値を昇順に出力する順序トラバーサルです。次に、ポストオーダートラバーサルは、左側のサブツリー、次に右側のサブツリーをトラバースし、両方のサブツリーをトラバースした後にのみ、ノードの値を出力します。このチュートリアルでは、幅優先検索と、ノードを一度に 1 層ずつ出力するレベル順序トラバーサルにそれを使用する方法について説明します。キューは、探索されるノードを追跡するために使用され、ノードは、その親ノードが訪問されるとキューに追加されます。

  • 03:45:00 ビデオのこのセクションでは、インストラクターがキュー データ構造を使用して幅優先検索を実行する方法を説明します。彼は、ノードを探索し、その順序に従ってその子をキューに追加するプロセスを示しています。彼は、レベル順序のトラバーサルを実行するときにスタックの代わりにキューを使用することの重要性を強調しています。次に、ビデオは Java での二分探索ツリーの実装に焦点を移し、インストラクターがクラス構造、インスタンス変数、およびツリーに要素を追加するために使用されるメソッドについて説明します。彼はまた、二分探索ツリーを操作するときに比較可能な型を選択することの重要性も強調しています。

  • 03:50:00 インストラクターは、二分探索木からノードを削除するプロセスを説明します。彼らはまず、ノードを削除するための公開メソッドについて議論し、ツリー内にノードが存在する場合にのみノードを削除し、それが最初にチェックされることを説明します。次に、ノードを削除するために使用される再帰的方法を詳しく調べます。これには、削除するノードを見つけて、そのノードに左サブツリーがあるか右サブツリーがあるかに基づいて実際にノードを削除することが含まれます。インストラクターは、左または右のサブツリーのいずれか、または左と右の両方のサブツリーを含む、削除の 3 つの異なるケースについて説明します。また、ツリーを走査して後続ノードを見つけるためのヘルパー メソッドも提供します。

  • 03:55:00 Google エンジニアは、新しいノードの挿入、特定の要素の検索、ツリーの高さの計算など、Python で二分探索ツリーを実装する方法を説明します。また、「traverse」と呼ばれるカスタム メソッドを使用してバイナリ ツリー トラバーサルを反復的に実装する方法も示しています。このメソッドは、ツリー トラバーサル順序を入力として受け取り、その順序のイテレータを返します。次に、彼はハッシュ テーブルを紹介し、ハッシュ関数の重要性と、セパレート チェーンやオープン アドレスなどの一般的な衝突解決方法について説明します。
Data Structures Easy to Advanced Course - Full Tutorial from a Google Engineer
Data Structures Easy to Advanced Course - Full Tutorial from a Google Engineer
  • 2019.09.19
  • www.youtube.com
Learn and master the most common data structures in this full course from Google engineer William Fiset. This course teaches data structures to beginners usi...
 

データ構造の簡単から上級までのコース - Google エンジニアによる完全なチュートリアル (パート 5 ~ 8)


データ構造の簡単から上級までのコース - Google エンジニアによる完全なチュートリアル

パート5

  • 04:00:00 インストラクターは、ハッシュ テーブルの概念と、ハッシュ技術を使用したその実装を紹介します。ハッシュ テーブルは、キーから値へのマッピングを構築するために使用されます。各キーは一意であり、値に関連付けられます。キーを値にマップするには、キーをある固定範囲の整数にマップするハッシュ関数が使用されます。インストラクターは、文字列内の文字の ASCII 値を使用して、文字列などの任意のオブジェクトのハッシュ関数を定義する方法を示します。ハッシュ テーブルは、キーがハッシュ可能であれば、値の頻度を追跡し、キーと値のペア間のマッピングを構築するためによく使用されます。このセクションは、3 つのフィールドを持つ人々のデータベースのハッシュ関数を定義するというミニチャレンジで終わります。

  • 04:05:00 インストラクターはハッシュ関数とそのプロパティについて説明します。ハッシュ関数は任意に定義され、無限の可能性があります。講師は、ハッシュ テーブルの混乱を避けるためにハッシュ関数は決定論的でなければならないと強調します。ハッシュ関数の均一性は、2 つのオブジェクトが同じ値にハッシュするときに発生するハッシュの衝突を最小限に抑えるためにも重要です。講師はまた、ハッシュ値がどのようにオブジェクトの比較を高速化できるかを説明し、さらに、ハッシュ テーブルに使用されるハッシュ関数の代わりに、暗号化ハッシュ関数やチェックサムなどの高度なハッシュ関数がファイルに使用されることを説明しました。

  • 04:10:00 このチュートリアルでは、タイプ「t」のキーがハッシュ可能になる理由と、均一なハッシュ関数を使用してハッシュ テーブルにインデックスを付ける方法を説明します。ハッシュ関数は決定論的である必要があり、不変の文字列や整数など、固定された定数の不変キーを強制する必要があると述べられています。ハッシュ テーブルにインデックスを付ける方法としてハッシュ関数を使用すると、一定時間内で迅速な挿入、検索、削除を実現できます。このチュートリアルでは、最終的にハッシュの衝突を引き起こすキーと値のペアをテーブルに挿入する例も示し、衝突の処理方法についても説明します。

  • 04:15:00 講演者は、ハッシュ衝突解決技術、特に分離チェーンについて説明します。個別のチェーンは、特定の値にハッシュするすべての異なるキーと値のペアを保持する補助データ構造 (通常はリンク リスト) を維持することにより、ハッシュの衝突に対処する方法です。ハッシュ テーブルの時間計算量により、挿入、削除、検索は平均して一定時間で実行できますが、均一ではないひどいハッシュ関数では、線形時間になる可能性があります。また、講演者は、個別のチェーンがどのように機能するか、また配列内の各インデックスのリンク リスト データ構造を維持することにより、個別のチェーンを使用してハッシュ テーブル内の衝突を処理する方法の例を提供します。

  • 04:20:00 講演者は、リンクされたリストを使用して衝突を処理する、個別のチェーンを持つハッシュ テーブルでルックアップがどのように機能するかを説明します。講演者は、指定されたキーを使用して、キーをハッシュし、ハッシュ テーブルの対応するバケット内のリンク リストを検索することによって、対応する値を見つける方法をデモンストレーションします。また、講演者は、一定の時間計算量の維持、キーと値のペアの削除、およびハッシュ テーブル内のバケットを処理するための異なるデータ構造の使用に関するいくつかの一般的な質問にも対処します。最後に、講演者は、個別のチェーンを使用したハッシュ テーブル実装のソース コードを共有します。

  • 04:25:00 このビデオでは、ハッシュ テーブルと、ハッシュ テーブルが Java でどのように実装されるかを紹介します。まず、ジェネリックス、ハッシュ コード、equals メソッドに焦点を当てて、エントリ クラスについて説明します。次に、最大負荷係数、容量、しきい値などのインスタンス変数と、リンクされたリストの配列であるテーブル自体を含むハッシュ テーブル自体について説明します。サイズ、空、クリア、キーを含む、ハッシュなどのさまざまなメソッドについても、実装の詳細とともに説明します。最後に、ハッシュ値をハッシュテーブル検索用のインデックスに変換する正規化インデックス方式について説明します。

  • 04:30:00 ビデオのこのセクションでは、講演者が、挿入、取得、削除、エントリのシーク、テーブルのサイズ変更など、ハッシュ テーブルの実装に関連するメソッドを説明します。 insert メソッドはハッシュ テーブルに新しいエントリを追加するか、既存のエントリを更新します。一方、get は特定のキーに関連付けられた値を取得します。 Remove はハッシュ テーブルからキーと値のペアを削除し、seek エントリ メソッドは特定のバケット インデックスでエントリを見つけるのに役立ちます。最後に、テーブルのサイズ変更は、テーブルの容量を 2 倍にしてテーブルのサイズを変更し、新しい容量で新しいテーブルを作成し、古いテーブルから新しいテーブルにデータを移動して、古いデータを削除します。

  • 04:35:00 インストラクターは、ハッシュ テーブルの衝突を解決するためのオープン アドレッシング手法について説明します。この方法では、キーと値のペアを補助データ構造ではなくテーブル自体に保存します。したがって、ハッシュ テーブルのサイズとその中の要素の数を管理することが重要です。テーブルのサイズに対する項目の比率である負荷率は、指数関数的に悪化するのを防ぐために、特定のしきい値未満に維持する必要があります。新しいキーを挿入する場合、ハッシュ関数はキーの元の位置を示しますが、衝突がある場合は、プローブ シーケンスを使用して次の空いているスポットが見つかります。線形プローブ シーケンスは、多数の中から選択できる 1 つです。

  • 04:40:00 インストラクターは、オープン アドレス指定について説明します。これは、元のハッシュ インデックスがすでに占有されているときに項目が別の場所に配置される、ハッシュ テーブル内の衝突を処理する方法です。線形プローブ、二次プローブ、ダブル ハッシュ、擬似乱数発生器プローブ関数などのさまざまなプローブ関数が導入されており、それぞれが次のスロットを見つけるために異なる数式を使用します。ただし、オープン アドレッシングの主な問題は、ハッシュ テーブルのサイズよりも短いサイクルが生成される可能性があり、無限ループにつながる可能性があることです。この問題を説明するために実際の例を示します。

  • 04:45:00 講演者は、ハッシュ テーブルで使用されるプローブ関数におけるサイクルの問題とその処理方法について説明します。講演者は、線形プローブ、二次プローブ、ダブル ハッシュなどの手法はすべて、このサイクルの問題の影響を受けますが、要素の挿入中に無限ループに陥るのを避けるために、一定の長さのサイクルを生成するように再定義できると説明します。線形プローブの定数「b」は時代遅れであると考えられており、講演者は、一部の線形関数は次数「n」の完全なサイクルを生成できない可能性があると述べています。この問題の解決策は、定数「a」とテーブル サイズ「n」が互いに素であることを確認して、正確に「n」のサイクルを生成するプローブ関数を選択することです。

  • 04:50:00 インストラクターは、ハッシュ テーブルとその仕組み (プローブ関数、テーブル サイズ、負荷係数、サイズ変更など) について説明します。彼は、線形プローブの例を使用して、キーと値のペアをハッシュ テーブルに挿入し、ハッシュの衝突によって引き起こされる無限ループを回避する方法を示しています。ただし、プローブ関数とテーブル サイズの選択はパフォーマンスに大きな影響を与える可能性があり、テーブル サイズとの最大公約数が 1 でない関数を選択するとサイクルが発生し、問題が発生する可能性があると氏は指摘します。

  • 04:55:00 プローブ関数を使用して、衝突することなくキーと値のペアをハッシュ テーブルに挿入する例を示します。衝突が発生した場合、プローブ機能は空のスポットが見つかるまでプローブを続け、サイクルの発生を回避します。要素の数がテーブルのしきい値を超えると、GCD N を維持しながらテーブル サイズが 2 倍になります。その後、古い要素は、同じプローブ機能を維持しながら、新しいテーブル サイズを使用して新しいテーブルに配置されます。最後に、新しいキーと値のペアが挿入されます。スポットが空いていれば問題はありません。

パート6

  • 05:00:00 インストラクターは、オープン アドレス指定での衝突に対処するために使用される、ハッシュ テーブルでの 2 次プローブについて説明します。これには、ランダムなプローブ関数の選択を使用した二次公式に従ったプローブが含まれます。インストラクターは、二次関数は順序のサイクルを生成しないため無限ループに陥るため、すべての二次関数が実行可能であるわけではないが、ランダムに選択されたほとんどの二次関数は最終的にサイクルを生成すると説明します。インストラクターは、プローブ関数を選択する最も一般的な 3 つの方法を説明し、p of x が x の 2 乗と x を 2 で割った値に等しく、テーブル サイズが 2 の累乗である 2 番目の方法に焦点を当てます。

  • 05:05:00 講演者は、ダブル ハッシュおよびオープン アドレス衝突解決技術を使用して要素をハッシュ テーブルに挿入するプロセスについて説明します。テーブル サイズが 2 のべき乗であることの重要性と、プローブを使用して衝突を処理する方法について説明しています。講演者は、負荷率が特定のしきい値を超えた場合にテーブルのサイズを変更するプロセスも実演します。彼らは続けて、既存の要素を更新する方法と新しい要素をテーブルに挿入する方法について話し合います。

  • 05:10:00 インストラクターは、ハッシュ テーブルの衝突を処理するために使用されるプローブ方法であるダブル ハッシュの概念を説明します。ダブル ハッシュ スキームには、2 次ハッシュ関数と呼ばれる別のハッシュ関数の定数倍に従ってプローブすることが含まれます。インストラクターは、ダブル ハッシュの場合に発生する可能性のある無限サイクルの問題について警告し、テーブル サイズの素数を選択し、デルタと呼ばれる値を構築することを含む、問題を修正するための戦略を提供します。また、同じ基本的な構成要素を使用して、さまざまなデータ型に対して新しいハッシュ関数を生成する体系的な方法についても説明します。

  • 05:15:00 講演者は、ハッシュ関数の概念と、それらを組み合わせて新しいハッシュ関数を作成する方法を説明します。ユニバーサル ハッシュ関数の使用について言及し、ダブル ハッシュを使用する例を示しています。彼らは、ハッシュの衝突と更新を処理しながら、キーと値のペアをハッシュ テーブルに挿入するプロセスについて説明します。この例では、テーブル サイズ 7 と最大負荷係数 0.75 を使用し、ハッシュ関数は構成要素として整数と実数を使用します。

  • 05:20:00 このチュートリアルでは、ダブル ハッシュを使用してハッシュ テーブルのサイズを変更および拡張するプロセスについて説明します。これには、テーブル サイズを 2 倍にし、その値より上の次の素数を見つけ、新しいテーブルを割り当て、古い要素を新しいテーブルに挿入することが含まれます。テーブル。このチュートリアルでは、5 つの要素を挿入した後に元のテーブルが最大しきい値に達し、テーブルのサイズが新しいサイズ 17 に変更される例を示します。また、オープン アドレス指定を使用してハッシュ テーブルから要素を削除するときに発生する問題についても説明します。スキーム、および挿入および削除操作中の衝突を回避することの重要性について説明します。

  • 05:25:00 このビデオでは、ハッシュ テーブル内のハッシュの衝突と削除を処理する方法を説明しています。バケットの内容を単にクリアするだけの単純な削除方法には、ハッシュ テーブル内の要素を適切に検索する機能に影響を与えるため、欠陥があることが示されています。代わりに、ビデオでは、削除された要素の代わりにトゥームストーンと呼ばれる独自のマーカーを配置することを推奨しています。このマーカーは、後で新しいキーと値のペアに置き換えたり、ハッシュ テーブルのサイズ変更中に削除したりできます。このビデオでは、二次プローブを使用して、ハッシュ テーブルの検索中にトゥームストーンがどのように使用されるかを示す例が提供されています。

  • 05:30:00 Google エンジニアは、衝突解決スキームとしてオープン 2 アドレスを使用するハッシュ テーブルの概要を提供します。エンジニアは、遅延削除または遅延再配置について説明します。これには、プローブ時に大量の廃棄石にヒットすることを避けるためにキーと値のペアを再配置することが含まれます。このエンジニアは、二次プローブを使用するハッシュ テーブルのコードのウォークスルーも提供します。これには、エントリのラッパー クラスを含む 1 つの配列を持たせるのではなく、キーと値のペアを配列内に直接格納することが含まれます。エンジニアは、ハッシュ テーブルのコンストラクターとデフォルトの定数を調査します。これにより、ユーザーはパラメーターなしでハッシュ テーブルを初期化できるようになります。

  • 05:35:00 コースのこのセクションでは、インストラクターが二次プローブを使用したハッシュ テーブルの実装について説明します。この方法には、しきい値の計算、インデックスの正規化、テーブルの初期化が含まれます。挿入メソッド情報は、キーと値のペアがハッシュ テーブルに挿入される場所、またはキーがすでに存在する場合は更新される場所に提供されます。インストラクターは、挿入方法に進む前に、キーの数、ハッシュ テーブルの空のチェック、および加算についても説明します。キーを挿入する do-while ループについて詳しく説明します。

  • 05:40:00 インストラクターは、ハッシュ テーブル実装の contains key、has key、get、remove メソッドについて説明します。 contains key メソッドと has key メソッドは、get メソッドを呼び出して、ハッシュ テーブルにキーが存在するかどうかを確認します。このメソッドは、contains フラグに対して true または false の値を返します。 get メソッドはハッシュ インデックスを見つけてキーを探します。キーが存在する場合、contains フラグが true に設定され、値が返されます。削除方法はより単純で、最初にハッシュ テーブルでキーが見つかり、次にデクリメントされ、その場所にトゥームストーンがダンプされます。テーブル サイズ変更メソッドは、テーブル サイズを拡大するために新しい要素が挿入されるときに呼び出されます。新しいテーブルが割り当てられ、現在のテーブルが新しいテーブルと交換されて挿入メソッドが呼び出されます。

  • 05:45:00 バイナリ インデックス ツリーとも呼ばれるフェンウィック ツリーは、配列に対する範囲クエリを効率的に計算し、ポイント更新を実行するためのデータ構造として導入されています。フェンウィック ツリーの背後にある動機は、配列内の範囲を計算する際の線形クエリの非効率性にあります。配列のすべてのプレフィックスの合計を計算することにより、範囲クエリを一定時間で計算できます。ただし、配列を更新するにはすべてのプレフィックスの合計を再計算する必要があるため、プロセスが非効率的になります。フェンウィック ツリーは、線形構築時間で対数時間での範囲クエリとポイント更新をサポートすることで、この問題を解決するために作成されました。フェンウィック ツリーは、各セルがその最下位ビットの値に基づいて他のセルの範囲を担当するように機能します。

  • 05:50:00 ビデオのこのセクションでは、インストラクターがフェンウィック ツリーとそれが範囲クエリでどのように機能するかについて説明します。彼は、1 から始まる配列と各数値のバイナリ表現を含む図を示しています。この図は、それ自体を担当する最下位ビットと、2、4、8、または 16 セルの範囲を担当する他のすべてのセルを示しています。範囲クエリを実行するために、インストラクターは、ゼロに達するまで下方にカスケードして、特定のインデックスまでのプレフィックスの合計を計算する方法を説明します。彼は、特定のインデックスのプレフィックス合計を見つける方法と、指定された 2 つのインデックス間の区間合計を計算する方法を示します。

  • 05:55:00 カスケード ダウン効果を使用したプレフィックスの合計の計算と、フェンウィック ツリーを使用した範囲クエリ アルゴリズムの実行方法について学びます。プレフィックス合計の計算には、指定されたインデックスから開始して、ゼロに達するまで値から最下位ビットを減算し、減算のたびにすべての値を加算することが含まれます。範囲クエリ アルゴリズムはフェンウィック ツリーを使用し、範囲クエリのプレフィックス合計の差を取得します。このアルゴリズムにはビット操作が必要で、計算を高速化するためのきちんとした小さなアルゴリズムが提供されます。ビデオの作成者は、以前のフェンウィック ツリー範囲クエリのビデオをチェックして、ツリーの設定方法と操作の実行方法について詳しく知ることをお勧めします。

パート 7

  • 06:00:00 ポイント更新の概念とフェンウィックツリー構築についてGoogleエンジニアが説明。ポイントの更新には、特定のインデックスでツリーに値を追加し、その責任範囲を担当するセルを見つけることが含まれます。一方、フェンウィック ツリーの線形構築には、値を適切なツリー全体に伝播することによって、値を担当する直接のセルを更新することが含まれ、その結果、完全に機能するフェンウィック ツリーが得られます。伝播プロセスは、特定の値を担当する親を更新するというカスケード的な考え方に基づいています。

  • 06:05:00 チュートリアルのこのセクションでは、フェンウィック ツリーの概念について詳しく説明します。フェンウィック ツリーは、値の配列に対して範囲クエリとポイント更新を迅速に実行するために使用されるデータ構造です。データ構造は、各セルがその値をその親などに伝達する役割を担う、一種のバイナリ インデックスを利用します。フェンウィック ツリーの構築アルゴリズムについても説明します。これには、元の配列を複製し、新しいツリー構造の各要素の親セルを計算することによって、値の配列をフェンウィック ツリーに変換することが含まれます。 Java でのフェンウィック ツリー実装のソース コードが示されており、GitHub リポジトリで入手できます。

  • 06:10:00 インストラクターは、フェンウィック ツリー クラスとそのさまざまなコンストラクターを作成する方法を説明します。また、プレフィックスの合計についても説明しています。これにより、1 から i までのプレフィックスの合計を計算できます。このビデオでは、ポイント更新から追加する方法と、インデックスを k に等しく設定する追加の方法についても説明しています。講師は、文字列処理に非常に役立つバイナリ操作とサフィックス配列データ構造を使用することの重要性を強調しています。

  • 06:15:00 接尾辞と接尾辞配列の概念が導入され、単語「camel」の接尾辞配列を構築する例が示されています。サフィックス配列は、ソートされたインデックスの配列であり、サフィックス自体を保存せずにソートされたサフィックスの圧縮表現を可能にし、サフィックス ツリーに代わるスペース効率の高い代替手段となります。最長共通プレフィックス (LCP) 配列は、ソートされた 2 つのサフィックスが相互に共通する文字数を格納するもので、サフィックス配列に関連する重要な情報として、特定のサフィックスに対して LCP 配列を構築する例とともに紹介されています。弦。

  • 06:20:00 このビデオでは、多くのスペースを必要とする単純なアルゴリズムよりも効率的な方法で一意の部分文字列を検索およびカウントする際のサフィックス配列と LCP 配列の応用について説明しています。 LCP アレイ内に保存された情報を使用することで、迅速なだけでなくスペース効率の高いソリューションが提供されます。 LCP 配列は、元の文字列の 2 つの隣接するサフィックス間の共有文字数を表します。 LCP 値を調べることによって、どの部分文字列が繰り返されているかを判断し、それらを削除して、すべての一意の部分文字列を効果的にカウントすることができます。

  • 06:25:00 講演者は、与えられた n 個の文字列のうち少なくとも k 個の間で共有される最長の共通部分文字列を見つける問題について議論します。この問題を解決するアプローチの 1 つは動的プログラミングですが、すぐに扱いにくくなる可能性があります。より良いアプローチは、線形時間で解を見つけることができるサフィックス配列を使用することです。これを行うには、まずすべての文字列をより大きな文字列に連結し、サフィックスの混在を避けるために各文字列の間に一意のセンチネル値を追加すると説明します。次に、この連結文字列のサフィックス配列を構築します。これにより、最大の LCP 値を共有する異なる色の K 個の文字列を検索することで、K 個の文字列の最長の共通部分文字列を見つけることができます。

  • 06:30:00 ビデオ チュートリアルでは、スライディング ウィンドウ手法を使用して、文字列内の k 個の異なる色の最も長い共通部分文字列を見つける方法について説明します。このアプローチは、異なる色の k 個のサフィックスを含むようにウィンドウ サイズを調整し、その範囲内の最小 LCP 値をクエリすることです。最小範囲クエリは、線形解またはセグメント ツリーなどの最小範囲クエリ データ構造を使用して解決できます。このチュートリアルでは、ウィンドウ内の色を追跡するためにハッシュ テーブルを使用することも推奨しています。スライディング ウィンドウは、欠落している色を捕捉するために下方向に拡大し、基準が満たされると縮小します。

  • 06:35:00 ビデオのこのセクションでは、インストラクターがサフィックス配列を使用した最長共通部分文字列問題の解決例を示しています。ウィンドウ LCP およびウィンドウ LCS 値は、現在のウィンドウの最長共通プレフィックスおよび最長共通サブストリング値を追跡するのに役立ちます。一方、LCS 長および LCS セットは、これまでの最良の値を追跡します。この例では、4 つの文字列と、4 つの文字列のプールのうちの少なくとも 2 つの文字列を使用して、最長の共通部分文字列を共有します。インストラクターは、最長の共通部分文字列を検索しながらウィンドウを拡大および縮小する方法をデモンストレーションし、視聴者がキャスト Web サイトでチェックアウトするための課題を示唆し、GitHub 上のアルゴリズムの実装へのリンクを提供します。

  • 06:40:00 このビデオでは、スライディング ウィンドウ手法を使用して最長共通部分文字列問題を解決するプロセスを説明しています。ウィンドウ サイズを拡大および縮小し、最長の共通プレフィックス配列を使用して共通部分文字列を識別することにより、アルゴリズムは線形時間計算量で解決策を見つけます。次にビデオでは、最長反復部分文字列の問題を紹介し、N 乗時間と大量のメモリを必要とする素朴なアプローチと比較して、最長共通プレフィックス配列を使用して特定の文字列内で最長反復部分文字列を効率的に見つける方法を説明します。

  • 06:45:00 Google エンジニアは、サフィックス配列と LCP 配列を使用して、最も長く繰り返される部分文字列を見つける方法について教えています。インデックスの LCP 値は、2 つの隣接するサフィックス間の最長の共通プレフィックスの長さを示します。 LCP 配列の最大値は、最も長く繰り返される部分文字列の長さを示します。同点の場合は、考えられる最長の値をすべて見つける必要があります。次にエンジニアは、バランスの取れた二分探索ツリーの重要性と、保持するノードの数に応じて対数の高さを維持するように自動調整され、挿入と削除が非常に高速になるという点で、バランスのとれた二分探索ツリーが従来の二分探索ツリーとどのように異なるかを説明します。これを達成するための重要な概念はツリーの回転であり、これについてはビデオで詳しく説明します。

  • 06:50:00 平衡二分探索ツリーにおけるツリー不変性とツリー回転の概念が説明されています。ツリーの不変条件は、すべての操作の終了時に満たされるようにツリーに課せられるルールであり、一連のツリーの回転を適用することで保証されます。ツリー回転は、ノードの順序と配置が維持されている場合に、二分探索ツリーの不変条件を壊すことなくツリー内のノードを移動する正当な変換です。右回転のプロセスが詳細に説明され、ノードが子ノードと親ノードの両方への参照を持つ場合にポインタを更新する手順について説明します。

  • 06:55:00 ビデオ チュートリアルでは、ツリー回転手法を使用して AVL ツリーにノードを挿入する方法を示すことに重点を置き、同時に AVL ツリーのバランスを保つプロパティについても説明します。まず、ビデオでは AVL ツリーとは何か、そして最初のタイプの平衡二分探索ツリーとしてのその重要性について説明します。次に、ビデオでは、右側のサブツリーと左側のサブツリーの高さの差であるバランス係数を紹介します。このビデオでは、AVL ツリーのバランスを維持するには、すべてのノードのバランス係数がマイナス 1、ゼロ、またはプラス 1 のいずれかである必要があることを強調しています。次にチュートリアルでは、これが当てはまらない場合の処理方法について説明します。これはツリーの回転で解決できます。

パート8

  • 07:00:00 インストラクターは、AVL ツリー内の左に重いツリーのバランスをとるために必要な回転の 4 つの異なるケースについて説明します。インストラクターは、AVL ツリーにノードを挿入するための疑似コードも提供し、更新およびバランスの方法について説明します。 update メソッドはノードの高さとバランス係数を計算しますが、balance メソッドはノードのバランス係数が AVL ツリー プロパティに違反しているかどうかを確認し、ツリーのバランスを再調整するための適切な回転を決定します。左-右および右-左の場合も、最初の回転後に左-左および右-右の場合に縮小されるので説明されます。

  • 07:05:00 このビデオでは、アビエル ツリーから要素を削除する方法を説明しています。これは、通常の二分探索ツリーから要素を削除するのとよく似ています。削除プロセスは 2 つのステップに分けることができます。要素を見つけて、それを後続ノードに置き換えてバイナリ検索ツリーの不変性を維持します。ノードの検索には、一致するものが見つかるか、検索がツリーの最後に到達するまで、ターゲット要素とツリー内のノードを比較することが含まれます。置換プロセスは、削除するノードがリーフ ノードであるか、左または右のサブツリーのみを持つかによって異なり、後者の 2 つのケースでは後続ノードが直接の子になります。

  • 07:10:00 インストラクターは、二分探索木からノードを削除する方法を説明し、削除の 3 つのケースの例を示します。最初のケースは、削除するノードに子がない場合、2 つ目は 1 つの子がある場合、最後のケースは 2 つの子がある場合です。また、インストラクターは、2 行のコードを追加するだけで AVL ツリーの二分探索ツリーの削除方法を拡張し、ツリーのバランスを保ち、バランス係数と高さの値を最新の状態に保つ方法も説明します。最後に、インストラクターは、視聴者が AVL ツリーのソース コードと動作中の AVL ツリーのライブ デモンストレーションを見つけることができる GitHub リポジトリへのリンクを提供します。

  • 07:15:00 インストラクターは、Java での再帰 AVL ツリー実装のソース コードについて説明します。 AVL ツリーはジェネリック型の引数を受け入れ、比較可能な値である必要がある値をノード内に格納します。ノードのサブクラスには、左右の子ポインター、ノードの高さおよびバランス係数が格納されます。ツリーは、ツリー プリンタ インターフェイスを使用して端末に表示でき、size、is empty、set contains などのパブリック メソッドがコード内で提供されます。挿入方法についても、基本ケースと、挿入が成功したかどうかを判断するための比較値を使用して説明します。

  • 07:20:00 AVL ツリーでのプライベート挿入メソッドについて説明します。これは、新しいノードを左側または右側のサブツリーに挿入し、それに応じてノードのバランス係数と高さを更新します。 update メソッドはノードの高さとバランス係数を更新し、balance メソッドはツリーのバランスを維持するために必要な回転メソッドを呼び出します。左-左、左-右、右-右、右-左の場合について説明し、回転後の更新メソッドの順序が AVL ツリーのバランスを維持するために重要であることを強調します。

  • 07:25:00 インストラクターが二分探索木のデータ構造の削除方法について説明します。彼は、要素を削除するには、メソッドが最初に要素がツリー内に存在するかどうかを確認し、その後プライベートの削除メソッドを呼び出すと説明しています。インストラクターは、削除中に発生する可能性のある 4 つのケースの概要を説明し、両方のサブツリーを持つノードを削除しようとするときにどのサブツリーから削除するかを決定するためのヒューリスティックを提案します。最後に、ノードが削除されてもツリーのバランスが保たれるように、remove メソッドのコールバックで update および rebalance メソッドを呼び出すように視聴者に注意を促しました。

  • 07:30:00 Google エンジニアは、キーと値のペアの迅速な更新と削除をサポートするデータ構造であるインデックス付き優先キューを導入しました。これにより、優先キューの値を迅速に検索して動的に変更できるという問題が解決されます。これは、最初に最高の優先順位で患者に対応する必要がある病院の待合室など、さまざまな状況で役立ちます。エンジニアは、さまざまな優先順位を持つ患者の例と、インデックス付き優先キューがその場で優先順位を更新するのにどのように役立つかを示します。

  • 07:35:00 このビデオでは、特定の項目の優先順位を効率的に動的に更新できるインデックス優先キューについて説明します。インデックス優先キューを使用する最初のステップは、すべてのキーにインデックス値を割り当て、双方向マッピングを作成することです。このマッピングは双方向である必要があり、双方向ハッシュ テーブルを使用して容易に行うことができます。キーにインデックス値を使用する理由は、配列へのインデックス付けを有効にするためです。これは、多くの場合、優先キューの実装方法です。

  • 07:40:00 講演者は、インデックス優先キューの概念を紹介し、キーの削除、キーに関連付けられた値の取得、優先キューにキーが存在するかどうかの確認、キー インデックスの取得など、インデックス優先キューがサポートする必要がある操作を説明します。最小値の取得、インデックス内の最小値の取得、キーと値のペアの挿入と更新、および特殊な更新操作によるキーの増減が可能です。これらすべての操作の時間計算量は一定または対数です。また、バイナリ ヒープの仕組み、優先キューに新しい値を挿入する方法、優先キューから項目を削除する方法など、従来の優先キューのデータ構造についても復習します。

  • 07:45:00 バイナリ ヒープを使用してインデックス付き優先キューを実装するにはどうすればよいですか?最初のステップは、各項目に一意のインデックス値とインデックス優先キューの初期値を割り当てることです。次に、最小インデックス付き優先キューを使用して、最初に最小値でソートし、特定のキー インデックスに対するヒープ内のノードのインデックスを示す位置マップを維持します。さらに、特定のノードのキーを見つけるために逆ルックアップ テーブルを維持します。この情報により、病院の患者やレストランの顧客の優先順位付けなど、さまざまな用途で優先キューに効率的にアクセスして操作できるようになります。

  • 07:50:00 このビデオでは、インデックス優先キューでのキーと値のペアの挿入、更新、削除などの便利な操作を実行する方法について説明します。挿入のプロセスは通常の優先キューと似ていますが、位置マップと逆マップを更新するステップが追加されています。このビデオでは、挿入プロセスの疑似コードを提供し、ヒープの不変条件が満たされるまでノードがどのようにヒープ内を移動するかを示しています。交換プロセスには位置マップと逆マップの更新が含まれますが、値配列の更新は含まれません。値配列はノード インデックスではなくキー インデックスによってインデックス付けされたままになります。このビデオでは、キーと値のペアのポーリングと削除についても簡単に触れています。これには、挿入と同様の手順が含まれますが、その逆の手順が必要です。

  • 07:55:00 このビデオでは、定数時間になったノード位置ルックアップを利用して、インデックス付き優先キューからの要素の削除が線形時間計算量から対数時間計算量にどのように改善されるかを説明しています。このビデオでは、ノードのスワップ、削除前のキー値ペアの保存、削除されたノードのクリーンアップ、スワップされたノードを上下に移動することによるヒープ不変条件の復元など、ノードを削除する方法のステップバイステップの例を示しています。さらに、キーと値のペアを削除するための疑似コードが提供されており、短い 5 行の実装と 3 行のクリーンアップ プロセスが示されています。最後に、ビデオでは同期方法とその仕組み、およびキーと値のペアの更新について説明しています。これは削除と似ていますが、対数的な時間がかかります。
Data Structures Easy to Advanced Course - Full Tutorial from a Google Engineer
Data Structures Easy to Advanced Course - Full Tutorial from a Google Engineer
  • 2019.09.19
  • www.youtube.com
Learn and master the most common data structures in this full course from Google engineer William Fiset. This course teaches data structures to beginners usi...
 

Cプログラミングフルコース無料


Cプログラミングフルコース無料

00:00:00 - 01:00:00 「無料の C プログラミング フルコース」ビデオでは、gcc コンパイラーのインストール、IDE のセットアップ、C コードの作成方法を視聴者に教えています。このビデオでは、printf ステートメント、コメント、エスケープ シーケンス、さまざまなデータ型を表示する形式指定子の使用方法など、C プログラミングの基本について説明します。インストラクターは、変数の作成と初期化の方法、算術演算子とインクリメント/デクリメント演算子の使用方法を説明します。さらに、ビデオでは、scanf を使用したユーザー入力の受け入れと、printf を使用した出力のフォーマットについて説明します。また、講師は、C の便利な数学関数と、その関数を使用してユーザーの半径入力に基づいて円周と面積を計算する方法についても説明します。このビデオでは、C は難しい言語ではあるが、粘り強く努力すれば誰でも習得できることを強調しています。

01:00:00 - 02:00:00 YouTube ビデオ「無料 C プログラミング フルコース」では、C 言語でプログラミングの概念を学びます。このビデオ セクションでは、インストラクターが if/else ステートメント、switch ステートメント、論理演算子、関数、ループなどのトピックを取り上げます。インストラクターは、プログラムが条件に基づいて選択できるようにする条件文と、switch 文が else if 文のより効率的なバージョンである方法について説明します。さらに、インストラクターは、温度単位の変換方法、簡単な計算プログラムの作成方法、論理演算子を使用してプログラムの効率を向上させる方法、およびコードの冗長性を最小限に抑えるための関数の使用方法を詳しく説明します。最後に、講師は三項演算子と文字列関数がプログラム作成にどのように役立つかを説明します。

02:00:00 - 03:00:00この C プログラミング フル コースでは、while ループと do-while ループの違いの説明から始まり、ネストされたループを使用してシェイプを作成する方法まで、幅広いトピックを取り上げます。次にビデオでは、配列の基本と、1 次元配列の要素をループして表示する方法を説明した後、2 次元配列と 2D グリッドまたはデータ テーブルの作成方法に進みます。次に、インストラクターは、変数の交換の概念、バブル ソートなどの並べ替えアルゴリズムを紹介し、C の構造体と typedef、さらに乱数の生成と数字推測ゲームの作成について教えます。全体として、このコースでは C プログラミングの概念を包括的かつ深く理解できます。

03:00:00 - 04:00:00 「無料の C プログラミング フルコース」というタイトルのこの YouTube ビデオでは、数字推測やクイズ ゲームなどのゲームの作成を含む C プログラミングのトピックを包括的にカバーし、メモリなどの概念もカバーしています。ポインター、ビット演算子、ファイル I/O。さらに、ビデオでは、ネストされた for ループと if ステートメントを使用して勝者を確認し、コンピューター プレーヤーにランダムな手を生成する三目並べゲームの作成方法についても説明しています。インストラクターはビデオ全体で明確な説明とデモンストレーションを提供しており、C プログラミングの学習に興味がある人にとって貴重なリソースとなっています。

04:00:00 - 04:00:00インストラクターは C で三目並べゲームの構築を続け、手を置く前に選択した場所が空であることを確認するチェックを追加し、勝者を出力する関数を作成します。次に、do while ループを使用して「もう一度再生」オプションを追加し、各ループの先頭で変数をリセットします。コードはユーザーが使用できるようにコメント セクションで共有されます。

パート1

  • 00:00:00 著者は、高レベルのソフトウェアと低レベルのハードウェアの間の橋渡しとして機能する中級言語である C を学習することの重要性を説明します。 C は 1970 年代に誕生し、コンパイラ、オペレーティング システム、データベースの作成など、さまざまな目的で広く使用されています。この YouTuber は、C コードの作成を開始するために IDE をセットアップし、必要な拡張機能とコンパイラーをインストールする方法についても説明します。ただし、YouTuber は、C は初心者にとっては難しい言語ですが、粘り強く努力すれば誰でも習得できると警告しています。

  • 00:05:00 このビデオでは、Mac または Linux システムに gcc をインストールする方法と、環境変数の下に gcc コンパイラへのパスを追加する方法を説明しています。 gcc がインストールされると、ビデオは、VS Code がプログラムのコンパイル方法を認識できるように、デフォルトのビルド タスクを構成する方法を説明します。このビデオでは、将来面倒な問題を避けるために、フォント サイズを大きくし、自動保存を有効にすることを推奨しています。このビデオでは、C プログラミングの基本についても説明しており、ハッシュタグ include、標準 io 入出力の std、括弧の出力などの重要な関数も含まれています。最後に、ビデオでは、エラーをチェックするために main 関数の最後に return 0 ステートメントを追加する必要性を強調しています。

  • 00:10:00 C プログラミング チュートリアルのこのセクションでは、インストラクターが printf ステートメントを使用してテキストを出力する方法と、エスケープ シーケンスを使用して改行文字を追加する方法を示します。また、コマンド プロンプトを使用して C ファイルをコンパイルおよび実行する方法を示し、C プログラミングにおけるコメントの目的についても説明します。このビデオでは、C でのプログラミングの基本を説明し、初心者に役立つヒントを提供します。

  • 00:15:00 C プログラミングに関するビデオ チュートリアルのこのセクションでは、インストラクターがコード内でコメントとエスケープ シーケンスを使用する方法を説明します。コメントは、コードを読む人への説明、説明、メモとして使用されます。単一行のコメントは 2 つのスラッシュを使用して作成されますが、複数行のコメントはスラッシュの後にアスタリスクが続き、最後にアスタリスクの後にスラッシュが続くことを使用して作成されます。一方、エスケープ シーケンスは、テキスト行または文字列内のアクションを指定する文字の組み合わせです。最も一般的に使用されるエスケープ シーケンスは、テキスト文字列内に新しい行やタブを作成するために使用されます。インストラクターは、エスケープ シーケンスを使用して引用符、一重引用符、バックスラッシュを表示する方法も示します。

  • 00:20:00 ビデオのでは、C プログラミングで変数を作成する方法について説明しています。まず、変数を宣言し、この変数に名前とデータ型を割り当てる必要があります。次に、この変数を何らかの値に設定して初期化する必要があります。このビデオでは、整数、浮動小数点、文字、配列などのさまざまなデータ型の例を示しています。このビデオでは、printf ステートメントと書式指定子を使用して変数内に格納された値を表示する方法も説明しています。

  • 00:25:00 ビデオのこのセクションでは、インストラクターが書式指定子を使用して C プログラミングでさまざまなデータ型を表示する方法を説明します。たとえば、文字配列を表示するには、文字列としてパーセント記号の後に「s」を使用します。文字変数を表示するにはパーセント c を使用し、浮動小数点数を表示するにはパーセント f を使用します。インストラクターは、char、float、integer、double などのデータ型についても説明します。double は 64 ビットの精度を持ち、float よりも多くの有効数字を保持します。ブール値も導入され、true または false を格納し、1 バイトのメモリを使用します。さまざまな形式指定子とそれらをカスタマイズする方法については、次のビデオで説明します。

  • 00:30:00 ブール値はパーセント d を使用して表示できることを学びます。1 は true、0 から false を指します。文字は、負の 128 から正の 127 の範囲内の整数を格納でき、その表現はパーセント d またはパーセント c 書式指定子を使用して表示されます。符号なし変数は文字と short の両方で正の数値の範囲を 2 倍にするため、char は 0 ~ 255 の数値を格納できますが、short は符号付きの場合はマイナス 32,768 からプラスの 32,767、符号なしの場合は 0 ~ 65,535 の数字を格納できます。短縮表現として short int の代わりに short を使用できることを学びました。整数には、正または負の値のいずれかの整数を格納できます。

  • 00:35:00 データ型ごとに異なる形式指定子があり、間違った形式指定子を使用すると、エラーや予期しない出力が発生する可能性があることに注意することが重要です。 C プログラミングでは多くのデータ型を使用できますが、このコースでは主に char、char の配列、double、boolean、および integer に焦点を当てます。

  • 00:40:00 インストラクターは、指定された方法で表示されるデータの種類を定義および書式設定する書式指定子について説明します。出力を表示するための最小フィールド幅を設定するには、パーセント記号の後に数値を追加して特定のスペースを割り当てます。パーセント記号の後に負号を使用すると、データが左揃えになります。このビデオでは、プログラムの実行中に変更できない固定値である定数についても説明します。変数を定数に変換するには、データ型の前にキーワード「const」を付け、定数の命名には大文字の規則に従います。加算、減算、乗算、除算などの算術演算子もカバーされています。整数による除算では小数部分が切り捨てられるため、結果を格納するために float または double を使用する必要があり、除算の剰余を取得するには剰余演算子が使用されます。

  • 00:45:00 インストラクターは、2 で割ったときの余りを求めて数値が偶数か奇数かをすばやく判断するために使用できる法を含む、C プログラミングの算術演算子について説明します。ビデオでは、インクリメント演算子とデクリメント演算子も取り上げています。変数を 1 ずつ増減するために使用できます。また、ショートカットを使用して変数に対して算術演算を実行し、その結果を同じ変数に割り当てることができる拡張代入演算子を使用できます。最後に、インストラクターは、C プログラミングでの scanf 関数とプロンプトを使用したユーザー入力の受け入れの概要を説明します。

  • 00:50:00 インストラクターは、使用されている変数のタイプに適切な形式指定子を指定した scanf 関数を使用して、C プログラミングでユーザー入力を受け入れる方法を説明します。このセクションでは、整数と文字列の受け入れについて説明します。ただし、スペースを含む文字列を受け入れるには、空白があるため、scanf ではなく fgets 関数が必要であることに注意してください。講師は、fgets を使用して改行文字を削除した後に文字列をフォーマットする方法についても説明します。このセクションは、読みやすさを向上させるための printf ステートメントの書式設定の概要で終わります。

  • 00:55:00 ビデオのこのセクションでは、講師が数学ヘッダー ファイルをインクルードするときに役立つ C の数学関数について説明します。平方根、累乗、四捨五入 (天井と床を使用)、絶対値、対数、三角関数について、コードでの使用方法の例を示して説明します。その後、インストラクターは、ユーザーによる半径の入力に基づいて円の円周を計算するプログラムの作成方法をデモンストレーションし、さらに半径の 2 乗の式に pi を掛けた値を使用して円の面積を計算して表示します。

パート2

  • 01:00:00 ビデオのこのセクションでは、インストラクターが、C プログラミング言語を使用して円の円周と面積を計算する方法と、平方根関数を使用する必要がある直角三角形の斜辺を見つける方法をデモンストレーションします。 math.h ヘッダー ファイルから。講師は、if ステートメントと、条件をチェックしてそれに応じてコードを実行することでプログラムに選択肢を追加するために if ステートメントを使用する方法についても紹介します。以上の条件と 2 つの等号比較演算子の使用方法、および条件が false の場合に else ステートメントを使用して別の出力を提供する方法を示します。

  • 01:05:00 ビデオのでは、C プログラミングの if ステートメントと else if ステートメントについて説明しています。これらのステートメントを使用すると、プログラムは条件が真であるかどうかをチェックし、真である場合はコードの特定のサブセットを実行できます。そうでない場合は、プログラムは次のブロックに移動して別の条件をチェックします。すべての条件が false と評価された場合、プログラムは else ブロック内のコードを実行します。さらに、ビデオでは、複数の else if ステートメントを使用するより効率的な代替手段として switch ステートメントの使用を紹介しています。 switch ステートメントを使用すると、case キーワードを使用して、多くのケースに対して値が等しいかどうかをテストできます。最後に、ビデオでは、switch ステートメントの各ケースの後に Break ステートメントを追加して、一致するケースが見つかったらスイッチを終了することの重要性を強調しています。

  • 01:10:00 ビデオのこのセクションでは、インストラクターが温度を摂氏から華氏に、またはその逆に変換するプログラムの作成方法を教えます。プログラムは、測定単位 (摂氏または華氏) と現在の温度のユーザー入力を受け入れ、if/else ステートメントと適切な数式を使用して変換を実行します。また、to_upper 関数を使用して大文字と小文字を区別する方法と、scanf を使用して浮動小数点数を受け入れる方法も説明します。プログラムはユーザーに入力を求め、変換された温度を表示します。

  • 01:15:00 コースのこのセクションでは、インストラクターが、ユーザー入力に基づいて温度単位 (摂氏から華氏、またはその逆) を変換するプログラムを C で作成する方法を示します。プログラムはユーザーに温度と測定単位の入力を求め、scanf を使用して入力を受け入れ、一連の条件文を使用して必要に応じて温度単位を変換します。インストラクターは、プログラム フローでさまざまな種類の操作を処理するための書式指定子、摂氏から華氏への変換式、switch ステートメントの使用法について説明します。最終的なプログラムは、ダウンロードしてレビューできるようにコメント セクションに投稿されます。

  • 01:20:00 ビデオのこのセクションでは、インストラクターが、加算、減算、乗算、除算を実行できる簡単な計算機プログラムを C で作成する方法をデモンストレーションします。プログラムは switch ステートメントを使用して、ユーザーの入力に基づいて実行する操作を決定します。さらに、論理演算子の使用法、特に一連の条件が true かどうかをチェックする「and」演算子についても説明します。インストラクターは、論理演算子を使用して温度が特定の範囲内にあるかどうかを確認する方法と、条件チェックにブール変数を含める方法の例を示します。

  • 01:25:00 or 論理演算子と not 論理演算子について説明します。 or 論理演算子は少なくとも 1 つの条件が true かどうかを確認し、not 論理演算子は条件の状態を反転します。 or 演算子を使用すると、縦棒をさらに追加して複数の条件をチェックできます。一方、not 演算子は、プログラムの記述方法により多くのオプションを提供できます。これらの論理演算子は、より複雑な条件を作成し、プログラムの効率を向上させるのに役立ちます。

  • 01:30:00 インストラクターは、同じコードの繰り返しを避けるために C プログラミングで関数を使用する方法について教えます。新しい関数を作成すると、コードを一度記述すれば、その関数を呼び出すだけで何度も再利用できます。次に、インストラクターは、文字配列と整数を引数として関数に渡す例を挙げて、引数とパラメーターについて説明します。関数に渡される変数を関数に認識させるには、関数宣言でパラメーターを宣言する必要があります。一致するパラメータのセットがなければ、関数を呼び出すことはできません。

  • 01:35:00 トランスクリプトのこのセクションでは、講演者が return ステートメントの概念と、呼び出し元の関数に値を返す方法について説明します。これらは、1 つの引数を受け入れ、その引数を 2 乗して、結果を呼び出し元の関数に返す「square」と呼ばれる関数の例を示しています。また、値を代入または返すときに if-else ステートメントを使用するためのショートカットである三項演算子の構文についても説明し、それを使用して最大 2 つの整数を見つける方法の例を示します。講演者は、関数宣言内で return キーワードを使用するときにデータ型を一致させることの重要性も強調しました。

  • 01:40:00 三項演算子について学びます。これは、値を代入したり返したりするときに if-else ステートメントを使用するためのショートカットとして機能します。演算子は、条件、その後に続く疑問符、条件が true の場合に返される値、コロン、および条件が false の場合に返される値で構成されます。また、関数のプロトタイプについても説明します。これにより、関数の呼び出しが正しい数と型の引数で行われるようになります。 main 関数の前に関数プロトタイプを追加することで、予期しない動作を回避し、間違った引数が使用された場合にエラーが発生することを回避できます。

  • 01:45:00 ビデオのこのセクションでは、インストラクターが C の関数プロトタイプとその利点について説明し、文字列長、文字列比較、文字列下位、文字列など、すでに C で記述されているいくつかの便利な文字列関数を紹介します。上と紐猫。インストラクターは、これらの各機能がどのように機能するかの例を示し、その出力を実演します。文字列比較関数は、比較される 2 つの文字列が同じである場合は 0 を返し、異なる場合は他の数値を返します。インストラクターは、これらの文字列関数を使用するコード スニペットを含めてセクションを終了します。

  • 01:50:00 インストラクターは、コードのセクションを限られた回数だけ繰り返す for ループについて説明します。彼は、for ループを使用して 1 から 10 まで数える例を示し、for ループに必要な 3 つのステートメント、つまりインデックスの宣言、コードを繰り返す期間の条件の定義、インデックスをインクリメントまたはデクリメントする方法について説明します。また、インデックスを増減するさまざまな方法も示しています。次に、インストラクターは while ループについて説明します。これは、特定の条件が true である限り、コードのセクションをおそらく無制限に繰り返し、ユーザーが有効な応答を入力するまでユーザーに名前の入力を求める例を示します。

  • 01:55:00 ビデオのこのセクションでは、インストラクターが、C プログラミングでのユーザー入力に scanf の代わりに fgets を使用する方法をデモンストレーションします。次に、while ループを使用してユーザーに名前の入力を促し、名前が正しく入力されなかった場合は怒鳴ります。次に、インストラクターは do-while ループの説明に移り、ゼロより大きい数値を必要なだけ入力するようユーザーに要求し、それらの数値の合計を計算するプログラムのデモンストレーションを行います。

パート 3

  • 02:00:00 C プログラミング フル コースのこのセクションでは、インストラクターが C の while ループと do-while ループの違いを説明します。 while ループは最初に条件をチェックし、条件が満たされていればコードを実行します。 true の場合、do-while ループはコードを 1 回実行し、続行する前に条件をチェックして true かどうかを確認します。インストラクターはサンプルコードを使ってこれを実証し、while ループを do-while ループに変更する方法を説明します。このセクションでは、別のループ内のループであるネストされたループについても説明し、ネストされたループを使用して、行、列、シンボルのユーザー入力値に基づいてシンボルの四角形を印刷する例を示します。

  • 02:05:00 ビデオのこのセクションでは、インストラクターが、C でネストされたループを使用して四角形を作成する方法をデモンストレーションします。ユーザーはシンボルと四角形の行数と列数を入力できますが、その方法も示しています。ユーザーが適切に入力できるように入力バッファをクリアします。インストラクターは、C ループのコンテキスト内での continue ステートメントと Break ステートメントの違いについても説明します。 continue はコードの残りのセクションをスキップしてループの次の反復を強制しますが、break はループから完全に抜け出します。最後に、インストラクターは、同じデータ型の多くの値を格納できるデータ構造として配列の概念を定義し、変数を配列に変換する方法を示します。

  • 02:10:00 このビデオでは、C プログラミング言語の配列の概念について説明します。配列は、同じデータ型の複数の値を固定サイズのデータ構造に格納する方法です。このビデオでは、配列を初期化し、インデックス番号を使用して特定の要素にアクセスする方法を示します。配列を初期化するには、すぐに値を割り当てる方法や、プログラムの後半で値を割り当てる方法など、さまざまな方法があります。このビデオでは、for ループを使用して配列のすべての要素をループして出力する方法も説明しています。

  • 02:15:00 このビデオでは、C プログラミングで配列の要素をループして表示する方法を説明しています。インストラクターは、for ループと printf ステートメントの使用法を示します。for ループのインデックスは配列の要素にアクセスするために使用されます。また、演算子のサイズを使用してループの反復回数を計算する方法も示します。演算子のサイズは、配列に要素が追加または配列から削除された場合に自動的に更新されます。次に、インストラクターは 2 次元配列の作成に進みます。これは、各要素自体が配列である配列です。単純なグリッドまたはデータ テーブルの例を使用して、2 次元配列を初期化および編成する方法を示します。

  • 02:20:00 インストラクターは、C プログラミングで 2 次元配列を宣言して値を割り当てる方法を説明します。また、ネストされたループと書式指定子 "d" を使用して 2 次元配列の要素を表示する方法についても説明します。次に、インストラクターは、演算子のサイズと行の 1 つのサイズ、および最初の行内にある要素の 1 つのサイズを使用して、2 次元配列の行と列の数を計算する方法を示します。このセクションは、2D 配列に新しい行を追加してコードをテストする方法の例で終わります。

  • 02:25:00 ビデオのこのセクションでは、インストラクターが C で 2 次元配列を作成する方法を説明します。2 次元配列とは、各要素が配列全体である配列の配列です。要素の 1 つにアクセスするには 2 つのインデックスが使用されます。1 つは行用、もう 1 つは列用です。インストラクターは、各要素が文字列であることを除いて、個々の文字の 2D 配列である文字列の配列を作成する方法も示します。文字列の配列を表示するには、for ループを使用できます。最後に、インストラクターは、値の一時ストレージとして 3 番目の変数を導入することで、C で変数を交換する方法を説明します。変数の交換は並べ替えアルゴリズムで重要です。これについては次のトピックで説明します。

  • 02:30:00 インストラクターは、整数配列と文字配列の両方について、C の 2 つの変数の値を交換する方法を教えます。講師は、一時変数と文字列コピー関数を使用して、2 番目の引数の長さが最初の引数より短い場合に値を交換し、文字配列での予期しない動作を回避する方法を示します。また、インストラクターは、値の交換をよりよく理解するために、変数を液体が入ったガラスとして想像することを提案し、コメント セクションでサンプル コードを提供しています。これに続いて、インストラクターは、最初に整数の配列、次に文字の配列を使用して、配列内の要素を並べ替えるプログラムの作成方法を説明します。インストラクターは並べ替え用の別の関数を宣言し、入れ子になった for ループを使用して配列を反復処理し、並べ替えのための値を比較します。

  • 02:35:00 講演者は、バブル ソート アルゴリズムを使用して C で配列の要素をソートする方法について説明します。一時変数と if ステートメントの使用方法、および並べ替えられる数値のサイズが配列内の最終位置にどのように影響するかについて説明します。講演者は、データ型と印刷関数を変更して文字の配列を並べ替える方法も実演します。次に、関連するメンバーをメモリの 1 ブロックに編成する方法として構造体の概念を導入し、現実世界のオブジェクトを模倣する機能を備えています。構造体は、struct キーワードの後にタグ名とそのメンバーを表す中括弧のセットを使用して定義されます。

  • 02:40:00 ビデオのこのセクションでは、インストラクターが C プログラミング言語の構造体と typedef について教えます。構造体を使用すると、プログラマは関連する値をメモリ ブロック内の 1 つの名前でグループ化でき、これらを使用して、異なるデータ型のメンバーに値を割り当てることができます。 typedef キーワードを使用すると、既存のデータ型にニックネームが付けられ、コード内でそのデータ型を使用しやすくなります。インストラクターは、3 つのメンバーを含む構造体を作成し、それらに値を割り当てる例も示します。ビデオでは、サンプルコードを使用したいユーザー向けにサンプルコードが提供されています。

  • 02:45:00 構造体は main 関数の外で作成され、タグ名「student」が付けられ、名前の文字配列と GPA の float 変数が含まれます。 4 人の学生の配列が初期化され、「students」という配列内に配置されます。 for ループを使用して、プログラムは配列をループし、ドット メンバー アクセス演算子を使用して各学生の名前と GPA を出力します。最後に、ビデオでは、構造体で「typedef」キーワードを使用すると、構造体を作成するために struct キーワードを使用する必要がなくなり、代わりに構造体に割り当てたニックネームを使用できることが説明されています。

  • 02:50:00 インストラクターは、C での構造体の配列の作成について教えます。配列内の各要素は、名前や GPA などの各生徒のデータを含む構造体です。講師は、列挙型の使用方法についても説明します。列挙型は、ユーザー定義型の名前付き整数識別子であり、整数値を関連する名前に置き換えることでプログラムを読みやすくし、プログラマやコードをレビューする人にとってコードを理解しやすくします。 enum の構造の概要が説明され、講師は if-else ステートメントで enum を使用して enum 変数の値に基づいてさまざまな出力を出力する方法を実演します。

  • 02:55:00 ビデオのこのセクションでは、インストラクターが C プログラミングで乱数を生成する方法をデモンストレーションします。現在の時刻は、0 ~ 32767 の範囲の乱数を生成する rand 関数のシードを生成するために使用されます。指定された範囲内の乱数を取得するには、法演算子を使用できます。インストラクターは、1 から 6 までの乱数を生成する例 (サイコロを振る場合) と 3 つのサイコロを振る例を示します。乱数生成の知識を利用した数字当てゲームも紹介されています。最小範囲と最大範囲の定数が設定され、ユーザーはその数値を推測するように求められます。プログラムは rand 関数を使用して指定された範囲内の乱数を生成し、ユーザーはフィードバックを取得して正しい数値が入力されるまで推測を調整します。

パート 4

  • 03:00:00 インストラクターは、C で数字推測ゲームを作成する方法を教えます。このゲームでは、プログラムが 2 つの指定された値の間の乱数を生成し、ユーザーに数字を推測するように促し、推測が高すぎるか低すぎる場合にフィードバックを提供します。 、または正しい。プログラムは do-while ループを使用して、少なくとも 1 つの推測が行われることを保証し、ユーザーによる推測の数をカウントします。インストラクターは、出力をより視覚的に魅力的なものにするために、いくつかのテキスト装飾も追加します。この例では、C での条件文、ループ、ユーザー入力、および乱数生成の使用方法を示します。

  • 03:05:00 インストラクターは、C でクイズ ゲームを作成する方法を示します。ゲームでは、2 次元の文字配列を使用して質問を保存し、別の 2 次元の文字配列を使用して選択肢を保存します。正解は 1 次元の文字配列に格納されます。ゲームは質問の数を計算し、for ループを使用して質問を 1 つずつ循環し、考えられる選択肢とともに表示します。これを行うために、インストラクターは、オプション配列内の 4 つおきの文字列で始まるネストされた for ループを使用します。これは for ループを 4 回繰り返し、質問ごとに 4 つの可能な選択肢を表示します。

  • 03:10:00 インストラクターは、ユーザーに質問を促し、その答えを確認する簡単なクイズ ゲームを C で作成する方法を説明します。このコードは、入れ子になった for ループを使用して質問とオプションを表示し、scanf を使用してユーザー入力を受け入れ、「toupper」関数を使用して小文字を大文字に変換します。次に、プログラムはユーザーの推測が正しい答えと一致するかどうかをチェックし、それに応じてスコアを増分します。すべての質問に回答すると、プログラムは最終スコアを表示します。また、インストラクターはビット演算子について簡単に説明し、C で 5 つの異なるビット演算子を使用する方法を実演します。

  • 03:15:00 C プログラミングのビット単位の演算について学びます。まず AND 演算子から始めます。この演算子は、2 つの 2 進数に適用されると、対応する両方のビットが 1 の場合にのみ結果に 1 を割り当てます。次に、OR 演算子に進みます。OR 演算子は、対応するビットのいずれかが 1 の場合、結果に 1 を割り当てます。排他的 OR 演算子は、対応するビットが 1 つだけ 1 の場合、結果に 1 を割り当てます。また、2 進数のビットを左または右にシフトする左シフト演算子と右シフト演算子についても学習します。ビットを左にシフトすると実質的に数値が 2 倍になりますが、右にシフトすると逆の効果があります。

  • 03:20:00 このビデオでは、C プログラミングにおけるメモリについて説明しています。メモリとは、RAM 内のバイトの配列であり、各単位は値を保持できるメモリ ブロックです。メモリ アドレスは、RAM 内のメモリ ブロックが配置されている場所を指し、番地に似ています。変数を宣言すると、メモリ アドレスに関連付けられた値を保持するためにいくつかのメモリ ブロックが確保されます。各変数は 1 バイトのメモリ ブロックを使用し、ビデオでは例としてさまざまな文字のメモリ アドレスとサイズが表示されます。このビデオでは、0 ~ 9 の数字と a ~ f の文字を使用して各桁に 16 個の可能な値を作成する 16 進値についても簡単に説明しています。最後に、ビデオでは 2 バイトのメモリを使用する短いデータ型について説明します。

  • 03:25:00 インストラクターは、変数がメモリ ブロックをどのように使用するか、配列がサイズとデータ型に基づいて複数のメモリ ブロックをどのように使用するかなど、C プログラミングにおけるメモリの基本を説明します。また、メモリ アドレスを別の変数の値として保持するポインタの概念も紹介し、特定のタスクをより簡単に実行するためにポインタを使用する方法についても説明します。インストラクターは、変数の値とアドレスを表示する方法と、変数が指す変数と同じデータ型のポインターを作成する方法をデモンストレーションします。

  • 03:30:00 C プログラミングのポインタについて学びます。ポインターは、間接演算子としてアスタリスクを使用して宣言され、一般的な命名規則では、小文字の「p」の後に最初の文字を大文字にした変数名を使用します。ポインタの値はアドレスであり、間接演算子を使用してそのアドレスに格納されている値にアクセスできます。ポインターとそれが指す変数のデータ型が一貫していることを確認することが重要です。ポインタを引数として関数に渡すこともでき、関数がポイント先の変数に格納されている値にアクセスして変更できるようになります。さらに、ポインタは 2 つのステップで宣言して初期化できますが、すぐに値を割り当てることをお勧めします。

  • 03:35:00 インストラクターが C プログラミングのポイントを説明します。ポインタは、別の変数や配列などへのメモリ アドレスを保持する変数です。ポインターを宣言するには、間接演算子を使用します。ポインターに値を割り当てるには、同じ演算子を使用します。インストラクターは、ポインター、fopen、fwrite、および fclose を使用して C でファイルに書き込む方法を示します。ファイルに書き込むには、ファイルへのポインタを作成し、`fprintf` を使用してファイルに書き込む必要があります。インストラクターは、ファイルを削除したり、コンピューターのディレクトリ上の特定の場所にあるファイルに書き込むことによるファイル I/O も実演します。

  • 03:40:00 インストラクターは、データ型「file」のポインターを作成し、fopen 関数を使用してファイルを開くことにより、C プログラミングでファイルの内容を読み取る方法を示します。講師は、バッファーを使用して文字の配列を格納し、テキスト ドキュメントを一度に 1 行ずつ保持する方法と、fgets 関数を使用してファイルから 1 行を読み取る方法を示します。このセクションには、while ループを使用してファイルのすべての行を表示する方法と、ファイルを読み取る前にファイルが存在するかどうかを確認するファイル検出を追加する方法も含まれます。

  • 03:45:00 ビデオのこのセクションでは、インストラクターが、ボードのリセット、ボードの印刷、空きスペースの確認、プレーヤーの移動、コンピューターの移動、勝者の確認などの関数を含む、プログラムで使用される関数のプロトタイプを説明します。 、印刷物の勝者。これらの関数を宣言した後、インストラクターは、board という名前のキャラクターの 2D 配列や、プレーヤーとコンピューターのキャラクターの定数など、使用するいくつかのグローバル変数について説明します。次に main 関数について説明します。この関数では、勝者のローカル変数を宣言し、それを空のスペースに設定し、ボードをリセットし、それを出力します。このビデオには、リセット ボード関数で使用されるネストされた for ループと、プリント ボードで使用される printf ステートメントの詳細も含まれています。

  • 03:50:00 C プログラミング フル コースのこのセクションでは、インストラクターが、プリント ボード関数を囲む main 関数で while ループを作成する方法を説明します。 while ループの条件は、勝者が空スペースであり、空きスペース検査関数の呼び出しからの戻り値がゼロに等しくない場合、ループは継続します。空きスペースのチェック関数も、2 つのネストされた for ループを使用して作成され、文字の 2D 配列をループし、スポットが占有されている場合は空きスペースのローカル変数をデクリメントします。ユーザーが移動するために行番号と列番号を入力し、その場所が占有されているかどうかを確認するプレーヤー移動機能について説明します。各行の勝利条件をチェックし、各列の勝利条件をチェックするために、勝者チェック関数も作成されます。

  • 03:55:00 インストラクターは、三目並べゲームで勝者を決定するための行、列、対角線をチェックするためのコードを説明します。ゲームボード内の要素を反復処理して一致をチェックするための for ループと if ステートメントの使用法について説明します。勝者がいる場合、関数は勝者の要素の文字値を返します。そうでない場合は、空の文字が返されます。次に、インストラクターはコンピューターの動きのコードを提供します。これには、ボード上にシンボルを配置するためのランダムな座標を生成することが含まれます。乱数を生成する前に、プログラムはボード上に利用可能なスペースがあるかどうかを確認します。

  • 04:00:00 インストラクターは C で三目並べゲームの構築を続けます。移動を行う前に、生成されたスポットが空きスペースであることを確認するチェックを追加します。利用可能なスペースがもうない場合は、空のスペースで「印刷勝者」関数が呼び出され、ゲームが引き分けであることを意味します。この関数は、勝者がプレイヤーの場合は「あなたの勝ち」、勝者がコンピュータの場合は「あなたの負け」、勝者がいない場合は「引き分け」と表示されるため、非常に簡単であると説明されています。インストラクターは、do while ループを使用して「もう一度プレイ」オプションを実装し、各ループの開始時に勝者変数と応答変数をリセットします。ゲームは複数回実行され、テストされ、インストラクターが各ステップを説明します。最後に、コードはユーザーが使用できるようにコメント セクションに投稿されると述べています。
C Programming Full Course for free 🕹️
C Programming Full Course for free 🕹️
  • 2021.10.07
  • www.youtube.com
C tutorial for beginners full course#C #tutorial #beginners⭐️Time Stamps⭐️#1 (00:00:00) C tutorial for beginners 🕹️#2 (00:12:36) compile and run a C pro...
 

オブジェクト指向プログラミングの基本概念


オブジェクト指向プログラミングの基本概念

オブジェクト指向プログラミングの 4 つの基本概念は、抽象化、カプセル化、継承、ポリモーフィズムです。それらの意味を掘り下げる前に、オブジェクトが何であるかを理解することが重要です。オブジェクトは現実世界の何かを表します。これは、車や本などの物理的なものから、歯科の予約や銀行口座などの非物理的なものまであります。

オブジェクト指向プログラミングのコンテキストでは、オブジェクトとは、開発中のソフトウェア アプリケーションにとって関心のあるもの、つまりデータを保存して処理する必要があるものを指します。オブジェクトはエンティティとも呼ばれます。

抽象化は最初の基本概念であり、オブジェクトに関連する関連データとタスクのみに焦点を当てて現実を単純化することが含まれます。たとえば、人物に関するデータを処理するアプリケーションを設計する場合、必要なデータと操作のみが考慮されます。

プログラムでオブジェクトを作成するには、クラスが必要です。クラスはオブジェクトを作成するためのテンプレートとして機能し、オブジェクトの属性 (フィールドまたはプロパティとも呼ばれます) および操作 (動作またはメソッドとも呼ばれます) を定義するためにプログラマによって作成されます。属性はオブジェクトのデータを記述し、操作はオブジェクトによって実行できるアクションを表します。

カプセル化は 2 番目の基本概念であり、オブジェクトの内部動作の複雑さを他のプログラムやプログラマから隠すことが含まれます。オブジェクト内のデータと機能が結合され、外部干渉から保護されるため、これは情報隠蔽と呼ばれることがよくあります。経験豊富なプログラマは、若手プログラマが使用するクラスを作成することが多く、コンパイルされたクラス ライブラリは知的財産を保護します。

継承は 3 番目の基本概念であり、クラスがそのメソッドとプロパティを別のクラスから派生できるようにします。これにより、サブクラスがスーパークラスを継承するクラスの階層が形成されます。たとえば、employee クラスは person クラスを継承し、customer クラスも person クラスを継承します。これにより、サブクラスがスーパークラスのプロパティとメソッドを拡張するという、一種の関係が作成されます。

最後の基本概念であるポリモーフィズムにより、クラスは継承されたメソッドを独自の方法で実装できます。同じスーパークラスの異なるサブクラスは、継承されたメソッドの異なる実装を持つことができます。ポリモーフィズムにより、同じインターフェイスを持つさまざまな形式のオブジェクトが、その特定のサブクラス実装に応じて異なる動作を行うことができます。

要約すると、抽象化は現実を単純化し、カプセル化は複雑さを隠し、継承はクラス階層を確立し、ポリモーフィズムは継承されたメソッドの多様な実装を可能にします。これらの基本的な概念は、オブジェクト指向プログラミングの基礎を形成します。

Fundamental Concepts of Object Oriented Programming
Fundamental Concepts of Object Oriented Programming
  • 2020.11.01
  • www.youtube.com
This video reviews the fundamental concepts of Object Oriented Programming (OOP), namely: Abstraction, which means to simplify reality and focus only on the ...
 

C++ のオブジェクト指向プログラミング (OOP) コース


C++ のオブジェクト指向プログラミング (OOP) コース

このビデオでは、C++ のオブジェクト指向プログラミング (OOP) の概要を説明します。クラス、オブジェクト、メソッドなどの OOP の基本概念について説明します。インストラクターは、C++ クラスとそのメンバーの作成を実演し、変数をユーザー定義のデータ型として宣言することの重要性を強調します。 private、public、protected などのアクセス修飾子は、オブジェクト メンバーへのアクセスに関連して説明されています。

このビデオでは、カプセル化、抽象化、継承、ポリモーフィズムなどの OOP 原則の実装についても説明しています。コンストラクターや抽象クラスの作成など、これらの原則がコードにどのように適用されるかの例を示します。インストラクターは、ソフトウェア開発の簡素化やユーザーからの複雑さの隠蔽など、OOP の利点を強調します。

さらに、ビデオでは、派生クラスが基本クラスからプロパティを継承する継承の概念についても説明します。インストラクターは、派生クラスの作成プロセスを実演し、継承されたクラスに加えて独自の一意のプロパティをどのように持つことができるかを説明します。

このビデオは、仮想関数とポリモーフィズムに関するディスカッションで終わります。ポリモーフィズムによってオブジェクトとメソッドが複数の形式を持つことができ、親クラスの参照を子クラスのオブジェクトで使用できるようにする方法について説明します。仮想関数の概念が導入され、関数の最も派生したバージョンが呼び出し時に実行されることが強調されます。

全体として、このビデオは C++ の OOP を包括的に理解することを目的としており、重要な概念、原則、実際の実装をカバーしています。インストラクターは視聴者に自身のチャンネル Code Beauty をフォローするよう勧めており、動画に対するフィードバックを歓迎しています。

  • 00:00:00 このビデオでは、オブジェクト指向プログラミングの基本とそれが実際にどのように機能するかを説明します。クラスはオブジェクト指向プログラミングの重要な概念であり、変数を使用するにはユーザー定義のデータ型として宣言する必要があります。

  • 00:05:00 このビデオでは、C++ クラスが作成され、メンバーが追加されます。このクラスには、名前、会社名、年齢の 3 つの属性があります。クラスのインスタンスが作成され、変数番号が割り当てられます。

  • 00:10:00 このビデオでは、インストラクターが C++ でオブジェクトのメンバーにアクセスする方法を説明します。 private、public、protected などのアクセス修飾子によって、オブジェクトのメンバーにどのようにアクセスできるかが決まります。クラスメソッドを使用して、オブジェクトの動作を記述することができます。

  • 00:15:00 このビデオでは、C++ でオブジェクト指向プログラミング (OOP) がどのように機能するかを説明します。戻り値の型が void の関数が作成され、その関数は導入された関数と同じ構文を使用して呼び出されます。その後、この関数は 5 回呼び出され、毎回異なる従業員名と会社が使用されます。次に、従業員名と会社の値が新しい従業員オブジェクトにコピーされ、従業員オブジェクトの属性が新しくコピーされた値の値に設定されます。

  • 00:20:00 このビデオでは、インストラクターが C++ でコンストラクターを作成するための 3 つのルールを説明します。 1 つ目のルールは、コンストラクターはそれが属するクラスと同じ名前を持つということ、2 つ目はコンストラクターはパブリックである必要がある、3 つ目はコンストラクターはアクセス可能である必要があるということです。コンストラクターを作成するときは、このビデオで概説されているルールに留意することが重要です。コンストラクターがこれらのルールのいずれかに従っていない場合、エラーが生成されます。

  • 00:25:00 このビデオでは、インストラクターがクラス、オブジェクト、メソッドの概念を含むオブジェクト指向プログラミングの基本を説明します。次に、オブジェクト指向プログラミングの 4 つの主要な原則、カプセル化、抽象化、継承、ポリモーフィズムについて説明します。最後に、コード例でこれらの概念を実装する方法を説明します。

  • 00:30:00 このビデオでは、C++ のオブジェクト指向プログラミング (OOP) を紹介します。クラスは、他のクラスがデータにアクセスして変更するために呼び出すことができるデータとパブリック メソッドをカプセル化する構造です。カプセル化を行うために、クラス フィールドはプライベートであり、ゲッターとセッターはパブリックです。

  • 00:35:00 このビデオでは、C++ コースのインストラクターがオブジェクト指向プログラミング (OOP) の原則について説明します。インストラクターは、カプセル化と抽象化が、簡略化されたインターフェイスの背後に複雑なデータを隠すのにどのように役立つかについて説明します。インストラクターは、プライベート プロパティのセッター メソッドに検証ルールを適用する方法についても説明します。

  • 00:40:00 このビデオでは、プレゼンターが、オブジェクト指向プログラミング (OOP) によって複雑さをユーザーから隠し、ソフトウェア開発をどのように簡素化できるかを説明します。彼らはスマートフォンの例を使用して、OOP によって複雑なプロセスがどのように単純に見えるかを説明しています。次に、システムの複雑さをユーザーから隠しながら、システムの片側をシンプルに見せるコントラクトを作成する方法をデモンストレーションします。

  • 00:45:00 このビデオでは、C++ のオブジェクト指向プログラミング (OOP) の概念について説明します。このビデオでは、仮想関数の実装を必要とする抽象クラスを作成する方法と、その関数をテストして特定の従業員が昇進できるかどうかを確認する方法について説明します。

  • 00:50:00 このビデオでは、著者が昇進しますが、その人が 30 歳未満の場合、その人は昇進しません。これにより、実際には抽象クラスであるコントラクトを実装することができます。その抽象クラスまたはそのコントラクトにはルールが 1 つだけあり、そのルールはここでは昇格要求と呼ばれる純粋な仮想関数です。したがって、どのクラスがこのコントラクトに署名しても、どのクラスがこの抽象従業員から継承しても (ここではこのクラスです)、このメソッドの実装をここで提供する必要があります。私たちはそれをテストしましたが、ご覧のとおり、私は昇進できず、ジョンが昇進しました。これが抽象化の考え方です。このプロモーションの依頼方法は、この章の冒頭でスマートフォン上のボタンについて説明したまさにそのボタンです。私が話したいオブジェクト指向プログラミングの 3 番目の原則は、継承と呼ばれます。継承の概念は次のとおりです。スーパー クラスまたは親クラスとも呼ばれるこの基本クラスがあり、次に子クラスまたはサブクラスとも呼ばれる派生クラスがあります。

  • 00:55:00 このビデオでは、C++ コースのインストラクターが、既存の基本クラスから派生クラスを作成することによって、オブジェクト指向プログラミングがどのように機能するかをデモンストレーションします。その後、基本クラスのプロパティは派生クラスによって継承され、派生クラスは開発者クラスに固有の独自のプロパティも取得します。

  • 01:00:00 このビデオでは、インストラクターが C++ でオブジェクト指向プログラミングがどのように機能するかについて説明します。彼は、開発者クラスが従業員クラスからどのように継承するか、および従業員クラスのコンストラクターを使用して開発者クラスの特定のプロパティを初期化する方法について説明します。次に、インストラクターは、プロパティが正しく設定されているかどうかをテストするメソッドを開発者クラスで作成する方法を示します。最後に、開発者クラスを閉じる方法を示します。

  • 01:05:00 このビデオでは、インストラクターがオブジェクト指向プログラミング (OOP) の継承とポリモーフィズムの概念について説明します。コード例を使用して、これらの概念を使用して問題を解決する方法を示します。最後に、インストラクターは、別のクラスを継承するクラスの作成方法をデモンストレーションします。

  • 01:10:00 このビデオでは、C++ のオブジェクト指向プログラミング (OOP) の概要を説明します。このビデオでは、従業員クラスを継承し、レッスンの準備機能を実装する教師クラスを作成する方法を説明します。このビデオでは、OOP クラスの作成および使用時に発生する可能性のあるいくつかの問題とその解決方法についても説明します。

  • 01:15:00 このビデオでは、インストラクターが C++ のオブジェクト指向プログラミング (OOP) の概念を説明します。ポリモーフィズムとは、オブジェクトまたはメソッドが多くの形式を持つ能力を指します。プログラミングにおけるポリモーフィズムの一般的な使用法の 1 つは、親クラスの参照を使用して子クラスのオブジェクトを参照する場合です。この例では、メイン関数に戻り、従業員クラスから継承している開発者クラスと教師クラスで新しい作業メソッドを呼び出すことによってポリモーフィズムがどのように機能するかを示します。

  • 01:20:00 このビデオでは、C++ でのオブジェクト指向プログラミングの基本について説明します。ビデオの最初の部分では、オブジェクト指向プログラミングの歴史と、他のプログラミング パラダイムとの違いについて説明します。ビデオの 2 番目の部分では、基本クラスへのポインターを作成する方法と、従業員クラスで仮想ワーク メソッドを作成する方法について説明します。最後に、ビデオではポインターがどのように機能するか、そしてその結果としてプログラムがどのように機能するかを示します。

  • 01:25:00 このビデオでは、インストラクターが C++ の仮想関数とポリモーフィズムの概念について説明します。彼は、仮想関数が呼び出されると、その関数の最も派生したバージョンが実行されると説明しています。これは、関数がクラスの派生クラスに実装されていない場合、代わりにクラスの開発者クラスが呼び出されるということを意味します。また、ポリモーフィズムを使用すると、さまざまな種類の従業員を 1 つの大きなオブジェクトであるかのように扱うことができ、基底クラス ポインタで従業員を参照できるようになるとも述べています。

  • 01:30:00 このビデオでは、C++ のオブジェクト指向プログラミング (OOP) を紹介します。 OOP によってどのようにプログラミングがより体系化され、理解しやすくなるかについて説明します。プレゼンターはまた、視聴者が彼女のチャンネル、コードビューティーをフォローし、そこに登録することを推奨します。最後に、プレゼンターは視聴者に自分のビデオについてフィードバックを残すよう勧めています。
Object Oriented Programming (OOP) in C++ Course
Object Oriented Programming (OOP) in C++ Course
  • 2021.02.02
  • www.youtube.com
Object Oriented Programming (OOP) is commonly used when writing code with C++. In this crash course, you will learn what OOP is and how to implement it using...
理由: