[]データ構造とアルゴリズムの研究ノート - 「アルゴリズム・ノート」-4

構造

  • 構造の基本的な形式は:
    名前{ストラクト
    //基本的なデータ構造、またはカスタム・データ・タイプ
    ;}
    の例えば。
	struct studentInfo {
		int id;
		char gender;
		char name[20];
		char major[20];
	}Alice, Bob, sru[1000];
  • 構造自体を定義しますが、ポインタ変数の独自のタイプ定義することができません
    例えば
	struct node {
		node n;//错误!!! 不能定义node型变量
		node* next;//可以定义node*型指针变量
	};
  • 2つの構造、操作にアクセスする方法、およびがありますが、「」 『 - >』操作
    例:
	struct studentInfo {
		int id;
		char name[20];
		studentInfo* next;
	}stu, *p;

そのような文言としてSTUアクセス変数、:stu.id / stu.name / stu.next、
アクセスポインタ変数p文言要素など:
(* p)は.ID /(P *).nameの/(P *).next / P-> ID / P->名 / P->次の

  • コンストラクタは、構造の初期化
    、戻り値の型を記述する必要はありませんし、同じ関数名や構造体の名前:コンストラクタを
	struct studentInfo {
		int id;
		char gender;
		//下面的参数用以对结构体内部变量进行赋值
		studentInfo(int _id, char _gender) {
			//赋值
			id = _id;
			gender = _gender;
		}

または行に書かれました

	struct studentInfo {
		int id;
		char gender;
		//下面的参数用以对结构体内部变量进行赋值
		studentInfo(int _id, char _gender):id(_id),gender(_gender){}
	};

必要なときだから、の変数の直接割り当てを構造化することができます。

	studentInfo stu = studentInfo(10086, 'm');

すなわち、生成されたデフォルトコンストラクタstudentInfo {}しかし、彼らはコンストラクタを再定義した場合、構造の初期化変数の定義を通過し、
ケースが覆われ、オーダー構造の定義の両方の変数を初期化するだけでなく、楽しむことではありません利便性をもたらす初期化は、手動で「studentInfo」を追加することができます。限り、パラメータの数と種類が同一でないとして、異なる状況の初期化に適応するために、多くのコンストラクタとして定義することができ、この手段

例えば

	struct studentInfo {
		int id;
		char gender;
		//用以不初始化就定义结构体变量
		studentInfo(){}   //没有分号!
		//只初始化gender
		studentInfo(char _gender) {
			gender = _gender;
		}
		//同时初始化id和gender
		studentInfo(int _id, char _gender):id(_id),gender(_gender){}
	}stu,*p;

例えば

	struct Point {
		int x, y;
		Point() {}
		Point(int _x, int _y) :x(_x), y(_y) {}
	}pt[10];
	int main() 
	{
		int num = 0;
		for (int i = 1; i <= 3; i++) {
			for (int j = 1; j <= 3; j++) {
				pt[num++] = Point(i, j);
			}
		}
		for (int i = 0; i < num; i++) {
			printf("%d,%d\n", pt[i].x, pt[i].y);
		}
		return 0;
	}

組合

  • 連合(また、ジョイントとしても知られる)、データ構造の一種である、それは異なるタイプのデータを共同で編成されているが、メモリの同じ部分、データ構造の種類を占めます。

  • 型宣言組合と構造と同様の方法

  • キーワード労働組合の連合

  • 一般的な形式:
    ユニオン共通名{本体
    メンバーリスト;
    };

  • 匿名の構造体と共用体、もはや匿名のプログラム後の声明。

  • 共通の構造と身体との間の差:
    構造可変長メモリは、アカウントのメンバーとメモリ長によって占有されているが、各メモリセルの各メンバーは、それらの占める
    組合可変メモリは最長によって占有部材の長さです。アドレスとそのメンバーのアドレスは、すなわち、労働組合の変数が同じアドレスです。

  • 連合変数参照:
    唯一のメンバ変数がある使用して割り当てを含む組合変数、、の使用。
    表現:組合員の変数名

  • 割り当てのために初期化可組合変数、プログラムでの割り当てのみ

  • https://wenku.baidu.com/view/e2c46dfd83d049649a665848.html

運動
C-11.1

タイトル説明は
投票の候補者のための統計プログラムを完了します。3つの候補があると仮定し、名前は李、張と楽しいです。各候補者の得票とストレージ構造の名前を使用してください。すべての投票の票名、各候補者の最終投票の出力を記録します。次のような構造形式が定義されてもよい:
構造体人{
文字名[20である];
[3]; INT COUNT}リーダー= {0 "のLi"、 "張"、0、 "楽しい"、0}。

入力の最初の行は、n次の情報が投票を入力する指示があり、そこ整数であるN。100ない以上n以下のことを確実にします。
n行の後、各行は、投票のために投票した人の名前が含まれています。すべての個人名が一つに李、張と楽しされていることを確認します。

出力の3行は投票李、張人あたりのファンの数は、それぞれ、があります。出力形式のための最初の名前は、出力は、コロンで投票する候補者の最終的な出力を行いました。
行の折り返しの出力端ことに注意してください。

  • 出会いの問題は、
    if文は(namei ==リーダー[j]があるかのように書かれている場合 .nameの)、 プログラムが正しく動作しません。解きのstrcmp関数を使用してこの問題は、理由の一つは、直接比較することはできません文字列の大きさだと思います
#include <cstdio>
#include <cstring>


int main() 
{
	struct person {
		char name[20];
		int count;
	}leader[3] = { "Li",0,"Zhang",0,"Fun",0 };
	int n;
	char namei[20] = {};
	scanf("%d\n", &n);
	if (n > 100)
		return 0;
	for (int i = 0; i < n; i++)
	{
		scanf("%s", namei);
		for (int j = 0; j <= 2; j++)
		{
		//如果下面这个if语句写成if(namei==leader[j].name),程序无法正常运行。
			if (!strcmp(namei, leader[j].name))
			{
				leader[j].count ++;
			}
		}
	}
	for (int i = 0; i < 3; i++)
	{
		printf("%s:%d\n", leader[i].name, leader[i].count);
	}
	return 0;
}

11.2 C言語

タイトル説明
各学生のためのすべての情報を読み取るための構造の学生、生徒の学校数記憶、名前、性別や年齢の定義、構造および出力に保存します。次のように構造の学生定義:
構造体学生{
; INT NUM
文字名[20である];
char型性別;
INT年齢;};入力と出力に使用される構造体の配列へのタイトル請求ポインタポイント。

入力の最初の行が整数であるN、次の情報の学生が入る表します。以上、nは20のことを確認してください。
n行の後、各行は、スペースで区切って対応する生徒の学生番号、氏名、性別や年齢を、含まれています。個々の名前は、スペースではなく、15以上の長さが含まれていないことを確実にするために、性別はMとFの2つの文字で表されます。

n個の出力ライン、スペースで区切って出力生徒の学生番号、氏名、性別や年齢の各ラインは、あります。行の折り返しの出力端ことに注意してください。

#include <cstdio>
	#include <cstring>


	int main() 
	{
		struct student {
			int num;
			char name[20];
			char sex;
			int age;
			student(){};
		}*p,stu[20];//不可以没有stu[20]
		p = stu;//!!!看这里
		int n;
		scanf("%d\n", &n);
		for (int i = 0; i < n; i++)
		{
			//scanf("%d %s %c %d", &((p+i)->num), ((p + i)->name), &((p + i)->sex),&((p + i)->age));
			//这里要取址符!!
			scanf("%d %s %c %d", &((*(p + i)).num), (*(p + i)).name, &((*(p + i)).sex), &(( *(p + i)).age));
		}
		for (int i =0 ; i < n; i++)
		{
			printf("%d %s %c %d\n", (p + i)->num, (p + i)->name, (p + i)->sex, (p + i)->age);
			//printf("%d", ((*p).num));
		}
		return 0;
}

上記のコード記述されたポインタがあります。

		for (int i = 0; i < n; i++)
		{
			scanf("%d %s %c %d", &((*p).num), (*p ).name, &((*p).sex), &(( *(p)).age));
			p++;
		}

11.4 C言語

タイトル説明は、
生徒と教師が含まスタッフの数、のためのデータを提供しました。生徒データが含まれます:番号、名前、性別、職業、クラスを。教師が含まれます:番号、名前、性別、職業、仕事を。図から分かるように、データは、生徒と教師が異なる含まれています。今、同じテーブルに格納されたデータを必要とし、構造が組合を達成するために使用されます。次のように構造が定義される:
構造体{
int型NUM;
チャー名[10];
char型性別;
チャージョブ;
ユニオン{
int型のクラス;
チャー位置[10];
}カテゴリ;}; Sとして上記構成において、もしジョブ・アイテム(学生)、次いで、項目5クラス(クラス);ジョブは用語T(教師)、次いで、項目5ポジション(位置)である場合。
共通のボディよりも含有構造、及び出力のアレイに記憶された数人の入力データ。

最初の行の入力整数nは、それぞれ、より少ない人員のn行nのデータがあります。Nなし100以上のことを確認してください。
空間5によって分離されたコンテンツの各ラインの後にN行。4人の数(整数)である前に、名称(文字列の長さがスペースなし9を超えない)、性別(文字MまたはF)、及び職業(文字、SまたはT)。アイテム4がSである場合、項目5には、クラスを表す整数である、項目4がTである場合、項目5の位置を示すスペースなし9とこれ以上の文字列以下の長さ。

n個の出力線は、入力形式と同じ、の合計は、すべてのコンテンツの出力を読み取ります。行の折り返しの出力端ことに注意してください。

	#include <cstdio>
	#include <cstring>


	int main() 
	{ 
		struct {
			int num;
			char name[10];
			char sex;
			char job;
			union {
				int classnum;
				char position[10];
			}category;
		}sta[100],*p;
		int n;
		scanf("%d", &n);
		p = sta;
		for (int i = 0; i < n; i++)
		{
			scanf("%d %s %c %c", &((*p).num), (*p).name, &((*p).sex), &((*p).job));
			if (((*p).job) == 's') scanf("%d", &((*p).category.classnum));
			else if (((*p).job) == 't') scanf("%s", ((*p).category.position));
			p++;
		}
		p = sta;
		for (int i = 0; i < n; i++)
		{
			printf("%d %s %c %c ",((*p).num), (*p).name, ((*p).sex),((*p).job));
			if (((*p).job) == 's') printf("%d\n", ((*p).category.classnum));
			else if (((*p).job) == 't') printf("%s\n", ((*p).category.position));
			p++;
		}
		return 0;
}

11.7 C言語

説明タイトル
の書き込み2入力機能やプリント、それぞれ、5生徒データレコードを入力すると、5つの生徒のレコードを印刷。そのレコードを学生番号、名前が含まれている各学生については、5の3つのコースの合計スコア。そして、マスタ機能付きの入力は、それぞれ、印刷機能の入力と出力を呼び出します。
達成するために構造体の配列を使用する必要があり、それが構造体5つの各生徒のレコードを含みます。

5行の合計を入力して、生徒の生徒番号(整数)、名前(空白文字列の長さが19を超えないない)と3つのコースグレード(0と100の間の整数)を含む各々は、スペースで区切ら。

同じ入力および出力形式、学生のすべてのレコードの出力の各行。行の折り返しの出力端ことに注意してください。

#include <cstdio>
#include <cstring>

struct student {
	char name[10];
	int num;
	int score[3];
}stu[5], *p;

void input(student* stu)
{
	p = stu;
	for (int i = 0; i < 5; i++)
	{
		scanf("%d %s",  &((*p).num),(*p).name);
		for (int j = 0; j < 3; j++)
			scanf("%d", &((*p).score[j]));
		p++;
	}
}

void output(student * stu)
{
	p = stu;
	for (int i = 0; i < 5; i++)
	{
		printf("%d %s ", (*p).num, (*p).name);
		for (int j = 0; j < 3; j++)
		{
			printf("%d ", (*p).score[j]);
			if (j == 2) printf("\n");
		}
		p++;
	}
}

int main() 
{ 
	p = stu;
	input(p);
	p = stu;
	output(p);
	return 0;
}

11.8 C言語

タイトル説明
番号、名前、3つのコースを含む10人の学生、各生徒の成績データがあります。これらの10人の学生は、データ出力は3つのコースの全体的な平均スコアだけでなく、(学生番号、名前、3コースのグレード、平均スコアを含む)最高の平均学生の個人的なデータを必要と読みます。

入力
10行の合計を、生徒の生徒番号(整数)、名前(空白文字列の長さが19を超えないない)と3つのコースグレード(0と100の間の整数)を含む各行は、スペースで区切ら。

出力は、最初の行は、3つの実数値は3つのコース、小数点以下2桁、各番号の後にスペースの出力の平均総スコアを表す含まれています。
個人データ、同じフォーマットで入力データの最高学生平均出力の2行目。一次の入出力最高のスコアに応じて、最高の平均学生個々の生徒データが多数存在する場合。
行の折り返しの出力端ことに注意してください。

#include <cstdio>
#include <cstring>

struct student {
	char name[10];
	int num;
	int score[3];
}stu[10], *p;

void input(student* stu)
{
	p = stu;
	for (int i = 0; i < 10; i++)
	{
		scanf("%d %s",  &((*p).num),(*p).name);
		for (int j = 0; j < 3; j++)
			scanf("%d", &((*p).score[j]));
		p++;
	}
}

void output1(student * stu)
{
	for (int i = 0; i < 3; i++)
	{
		double sum = 0;
		p = stu;
		for (int j = 0; j < 10; j++)
		{
			sum += p->score[i];
			p++;
		}
		printf("%.2lf ", (double)(sum/10));
	}
	printf("\n");
}

void output2(student* stu)
{
	p = stu;
	double sco[10] = {0},maxsco=0;
	int maxnum;
	for (int i = 0; i < 10; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			sco[i] += p->score[j];
		}
		sco[i] = (double)(sco[i] / 10);
		if (sco[i] > maxsco)
		{
			maxsco = sco[i];
			maxnum = i;
		}
		p++;
	}
	p = stu + maxnum;
	printf("%d %s ", (*p).num, (*p).name);
	for (int j = 0; j < 3; j++)
	{
		printf("%d ", (*p).score[j]);
	}
}

int main() 
{ 
	p = stu;
	input(p);
	p = stu;
	output1(p);
	p = stu;
	output2(p);
	return 0;
}
公開された43元の記事 ウォンの賞賛4 ビュー1223

おすすめ

転載: blog.csdn.net/weixin_42176221/article/details/99709160