C言語構造体問題1


質問です。


この問題は構造体を使わないで、このようにしました.

計算日の差


(1)関数を記述し,2つの日付間の時間差を計算し,その値を返す.
日付は年、月、日で表します.
時間差は日数で表されます.
注意日付間の閏年を考慮します.
関数の入力パラメータは日付1と日付2です.
関数の戻り値は時間差、単位は日数です.
(2)主関数に2つの日付を入力し、上記の関数を呼び出して2つの日付間の時間差を計算し、結果を出力するプログラムを作成する.
計算を簡単にするために、ユーザが入力した日付1が常に日付2より早いと仮定する.
#include<stdio.h>
const int Yn[12] = {31,29,31,30,31,30,31,31,30,31,30,31};
const int Pn[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
int YorP(int y) {
	int answer;
	if (y % 4 == 0) {
		if (y % 100 == 0) {
			if (y % 400 == 0) {
				answer = 1;
			}
			else answer = 0;
		}
		else answer = 1;
	}
	else answer = 0;

	return answer;
}
int cal_Date(int D1, int D2) {
	int y1 = D1 / 10000;
	int m1 = D1 % 10000 / 100;
	int d1 = D1 % 10;
	int y2 = D2 / 10000;
	int m2 = D2 % 10000 / 100;
	int d2 = D2 % 10;
	int a1 = 0, a2 = 0;
	for (int i = y1; i < y2; i++) {
		if (YorP(i)) a2 += 366;
		else a2 += 365;
	}
	for (int i = 0; i < m1 - 1; i++) {
		if (YorP(y1)) a1 += Yn[i];
		else a1 += Pn[i];
	}
	a1 += d1;
	for (int i = 0; i < m2 - 1; i++) {
		if (YorP(y2)) a2 += Yn[i];
		else a2 += Pn[i];
	}
	a2 += d2;

	return a2 - a1;

}
int main(void) {
	int answer;
	int D1, D2;
	printf("input DATE1,DATE2:");
	scanf_s("%d %d", &D1, &D2);
	printf("answer:%d", cal_Date(D1, D2));
	return 0;
}
実行画面

質問です。


構造体配列の適用


名前、学生番号、出身地、身分証明書番号、年齢、住所、性別、連絡先など、学生の基本情報を記述する構造を定義してください.プログラミング:
a)関数input()を作成し、学生数を入力し、構造体配列を作成し、基本情報を入力する.
b)関数print()を作成し、学生全員の記録情報を出力する.
c)関数search()を記述し、指定された学生情報を取得し、メイン関数に戻り、メイン関数から画面に印刷する.
d)主関数を作成し、input、print関数呼び出しを完了し、学生学号を入力し、searchを呼び出して検索結果を返し、結果情報を印刷する.
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct _students {
	char name[20];
	char num[20];
	char sex;
	int age;
} students;
int input(students** pps) {
	int n=0;
	printf("input n:");
	scanf_s("%d", &n);
	*pps = malloc(sizeof(students) * n);
	for (int i = 0; i < n; i++) {
		printf("input name,num,age,sex:");
		scanf_s("%s %s %d %c",(*pps+i)->name,20,(*pps+i)->num,20,&((*pps+i)->age),&((*pps+i)->sex));
		//printf("%s %s %d %c", (*pps + i)->name, (*pps + i)->num,  (*pps + i)->age, (*pps + i)->sex);
	}
	return n;
}
void print(students* ps ,int n) {
	for (int i = 0; i < n; i++) {
		printf("%d :%s %s %d %c \n",i+1, (ps + i)->name, (ps + i)->num, (ps + i)->age, (ps + i)->sex);
	}
}
void search(students* ps, char num[],int n) {
	for (int i = 0; i < n; i++) {
		if (!strncmp((ps + i)->num, num, 20)) {
			printf("search num  info :%s %s %d %c \n", (ps + i)->name, (ps + i)->num, (ps + i)->age, (ps + i)->sex);
		}
	}

}
int main(void) {
	int n;
	students* ps;
	char s_num[20];
	n=input(&ps);
	print(ps,n);
	printf("input search number:");
	scanf_s("%s", s_num, 20);
	search(ps, s_num, n);
	free(ps);
	return 0;
}
実行画面

質問です。


一方向チェーンテーブルの練習


ノード構造を設定するには:

チェーン構造:

プログラムを作成します.プログラムは次の機能を実現する必要があります.
a)チェーンテーブルの生成.キーボードは学生情報を入力し、一つのノードが学号によって順序付けされた単一チェーンテーブルA={a 1,a 2,.,an}を確立し、例えば5~10個の記録を含む;//仮に入力した学号は2010,2002,2010,052010,09200720100032,000の順で、名前は自分で勝手に定義する
b)ノードカウント.単一チェーンテーブルA={a 1,a 2,.,an}に対してノードカウント関数fを記述し、単一チェーンテーブルのノード個数を求める.主関数はノードカウント関数fを呼び出し、その戻り値(整数)を画面に表示する.
c)単鎖表A={a 1,a 2,.,an}に対して関数fvを記述し、それをA={an,an-1,.,a 1}に逆順にする.
d)出力単一チェーンテーブル関数listを作成する.操作(新しいノードを挿入するか逆順序にする)のたびに関数listを呼び出し、チェーンテーブルのすべての記録データを画面に表示する.
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct _student {
	struct student* next;
	int num;
	char name[20];
} student;

void addFirst(student *target,int num,char name[]) {
	student* newNode = malloc(sizeof(student));
	newNode->next= target->next;
	target->next = newNode;
	strcpy_s(newNode->name, 20, name);
	newNode->num = num;
}
int f(student *target) {
	student* curr;
	curr= target->next;
	int i = 1;
	while (curr->next != NULL) {
		i++;
		curr = curr->next;
	}
	return i;
}
student* fv(student* target) {//연결리스트 역순 알고리즘 여러번 볼것 
	student* q, * p, * n;
	q = target->next;
	p = NULL;
	n = NULL;
	while (q != NULL) {
		n = p;
		p = q;
		q = q->next;
		p->next = n;
	}

	return p;
}
void list(student* target) {
	student* curr = target->next;
	while (curr != NULL) {
		printf("%s %d \n", curr->name, curr->num);
		curr = curr->next;
	}
}


int main(void) {
	int n,k;
	int num;
	char name[20];
	printf("input n:");
	scanf_s("%d", &n);
	student* head=malloc(sizeof(student));
	head->next = NULL;
	for (int i = 0; i < n; i++) {
		printf("input name num:");
		scanf_s("%s %d \n", name, 20, &num);
		addFirst(head, num, name);
	}
	list(head);
	k = f(head);
	printf("total %d students \n", k);
	head->next = fv(head);
	list(head);
    student *curr = head->next;
    while(curr!=NULL){// ㅁㅔ모리 해제 코드
		struct *next = curr->next;
        free(curr);
        curr = next;
	}
    

	free(head);
	return 0;
}
実行画面

質問です。


いちじたこうしきかさん


1元多項式加算器を作成し、2つの1元疎多項式を入力し、加算操作を行います.
具体的な実装では、各チェーンテーブルのノードが2つのメンバー変数、係数、指数(いずれも整数)を含む多項式を線形チェーンテーブル形式で格納することが要求される.

説明:
(1)各チェーンテーブルノードは、必要に応じて動的に作成される.
(2)プログラムは、少なくともチェーンテーブルの作成、チェーンテーブルの印刷、加算関数などを含む多関数形式で実現される.
(3)多項式係数は正、負であり、指数は必ず非負の整数であり、増分順に配列されている
入力フォーマット:最初の行は整数Mで、最初の多項式の項数を表します.
次にM行があり、各行に2つの整数ciとeiがあり、それぞれi番目の係数と指数を表す.
次に2番目の多項式を入力し、方法は1番目の多項式と入力します.
出力フォーマット:2つの多項式が加算された結果を出力します.最初の行は整数Kで、新しい多項式の項数を表します.
次にK行があり,各挙動の2つの整数は,それぞれ係数と指数を表す.
#include<stdio.h>
#include<stdlib.h>
#include<math.h>

typedef struct _pnm {
	struct pnm* next;
	int ci;
	int ei;
} pnm;
void addNode(pnm* target,int ci,int ei) {
	pnm* curr = malloc(sizeof(pnm));
	pnm* temp = malloc(sizeof(pnm));
	pnm* q;
	if (target->next == NULL) {
		curr->next = target->next;
		curr->ci = ci;
		curr->ei = ei;
		target->next = curr;
	}
	else {
		curr = target->next;
		q = target;
		while (curr != NULL) {
			if ((curr->ei) > ei) {
				q->next = temp;
				temp->next = curr;
				temp->ci = ci;
				temp->ei = ei;
				break;
			}
			else if ((curr->ei) == ei) {
				curr->ci = curr->ci + ci;
				break;
			}
			else {
				q = curr;
				curr = curr->next;
				if (curr == NULL) {
					temp->next = curr;
					q->next = temp;
					temp->ci = ci;
					temp->ei = ei;
				}
			}
		}
	}
}
void print(pnm* target) {
	pnm* curr = malloc(sizeof(pnm));
	curr = target->next;
	while (curr != NULL) {
		printf("%d %d\n", curr->ci, curr->ei);
		curr = curr->next;
	}

}
void addPnm(pnm *head1,pnm *head2) {
	pnm* curr2 = head2->next;
	while (curr2 != NULL) {
		addNode(head1, curr2->ci, curr2->ei);
		curr2 = curr2->next;
	}

}
int calPnm(pnm *target) {
	pnm* curr = target->next;
	int i =0;
	while (curr!=NULL) {
		i++;
		curr = curr->next;
	}
	return i;

}
int main(void) {
	int k,m,n;
	int ci, ei;
	pnm* head1 = malloc(sizeof(pnm));
	pnm	*head2= malloc(sizeof(pnm));
	head1->next = NULL;
	head2->next = NULL;
	printf("input k:");
	scanf_s("%d", &k);
	for (int i = 0; i < k; i++) {
		printf("input ci ei:");
		scanf_s("%d %d", &ci, &ei);
		addNode(head1, ci, ei);
	}
	printf("input m:");
	scanf_s("%d", &k);
	for (int i = 0; i < k; i++) {
		printf("input ci ei:");
		scanf_s("%d %d", &ci, &ei);
		addNode(head2, ci, ei);
	}
	addPnm(head1, head2);
	printf("%d: \n", calPnm(head1));
	print(head1);

	free(head1);
	free(head2);
	return 0;
}
実行結果

質問です。


循環淘汰


N人の学生がいて、番号はそれぞれ1,2,3......,Nで、1周して、勝手に1つの整数mを選んで、みんなに時計回りに順番に数えさせて、mに報告した学生は輪の中から退出して、それによって淘汰されて、最後に一人になるまで.
記述関数はチェーンテーブルを用いて上述したループ淘汰機能を実現する.
上記の関数をテストするプログラムを作成する機能は、ユーザが任意にNとmを入力できることを要求し、プログラムは最後に残りの人の番号を入力する.
#include<stdio.h>
#include<stdlib.h>

typedef struct _link {
	int num;
	struct link* next;
} link;
void addNode(link *target,int i) {
	link* curr = malloc(sizeof(link));
	curr->next= target->next;
	target ->next = curr;
	curr->num = i;
}
void circleLink(link *target) {
	link* head = malloc(sizeof(link));
	link* curr = malloc(sizeof(link));
	head = target->next;
	curr = target->next;
	while (curr->next != NULL) curr = curr->next;
	curr->next = head;
}

int deleteNode(link *target,int m) {
	link* curr = target->next;
	link* p = target->next;
	while (curr->num != m) {
		p = curr;
		curr = curr->next;
	}
	if (curr->next == p) {
		p->next = NULL;
		free(curr);
		return 0;
		
	}
	else {
		p->next = curr->next;
		free(curr);
		return 1;
	}
}
int main(void) {
	int n;
	int flag = 1;
	int m;
	link* head = malloc(sizeof(link));
	head->next = NULL;
	link *answer = malloc(sizeof(link));
	printf("input n:");
	scanf_s("%d", &n);
	for (int i = 0; i < n; i++) addNode(head, i + 1);
	circleLink(head);
	while (flag) {
		printf("input m:");
		scanf_s("%d", &m);
		flag = deleteNode(head, m);
	}
	answer = head->next;
	printf("%d", answer->num);
	free(answer);
	free(head);
	return 0;
}
一度も間違った実行結果が得られなかったことに感謝します.
実行結果