C언어 구조체 문제1

성민개발로그·2021년 7월 14일
0

C언어

목록 보기
7/9
post-thumbnail

문제1

이 문제는 구조체를 안쓰고 그냥 했다.

计算日期的差值

(1)编写一函数,计算两个日期之间的时间差,并将其值返回。
日期以年、月、日表示。
“时间差”以天数表示。
注意考虑日期之间的闰年。
函数的输入参数为日期1和日期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;
}

실행화면

문제2

结构体数组应用

请定义一个描述学生基本信息的结构,包括姓名,学号,籍贯,身份证号,年龄,家庭住址,性别,联系方式等。编程:
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;
}

실행화면

문제3

单向链表练习

设节点结构:

链表结构:

编程。要求程序实现如下功能:
a) 链表生成。键盘输入学生信息,建立一个节点按学号递增有序的单链表A={a1,a2,..,an},比如包含5~10条记录; //假设输入的学号依次为 2010002,2010005,2010009,2010007,2010003,2010000,姓名自己随便定义
b) 节点计数。对单链表A={a1,a2,..,an}编写节点计数函数f,求单链表中的节点个数。主函数调用节点计数函数f,并将其返回值(整数)显示到屏幕;
c) 对单链表A={a1,a2,..,an}编写函数fv,将它倒序为A={an,an-1,..,a1};
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;
}

실행화면

문제4

一元多项式加法

编写一元多项式加法器,输入两个一元稀疏多项式,然后对它们进行加法操作。
在具体实现上,要求用线性链表形式来存储一个多项式,每个链表的节点包括两个成员变量,系数和指数(均为整数)。例如

说明:
(1) 每个链表节点都是根据需要动态创建的;
(2) 程序采用多函数形式来实现,至少包括创建链表、打印链表、加法函数等。
(3) 多项式系数可正、可负;指数肯定是非负整数,且按照递增顺序排列
输入格式:第一行是一个整数M,表示第一个多项式的项数。
接下来有M行,每行有两个整数ci和ei,分别表示第i项的系数和指数。
再接下来是输入第二个多项式,方法同第一个多项式输入。
输出格式:输出两个多项式相加的结果。第一行是整数K,表示新多项式的项数。
接下来有K行,每一行为两个整数,分别代表系数和指数。

#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;
}

실행결과

문제5

循环淘汰

有N个同学,编号分别为1,2,3……,N,围成一圈,随便选定一个整数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;
}

한번도 오류없이 나온 실행결과 감격 ㅜㅜ
실행결과

0개의 댓글