当前位置:文档之家› 结构体练习题

结构体练习题

结构体练习题:第1 题:计算日期的差值(1)编写一函数,计算两个日期之间的时间差,并将其值返回。

日期以年、月、日表示。

“时间差”以天数表示。

注意考虑日期之间的闰年。

函数的输入参数为日期1和日期2,函数的返回值为时间差,单位为天数。

(2)编写一程序,在主函数中输入两个日期,调用上述函数计算两个日期之间的时间差,并将结果输出。

为了计算简便,假设用户输入的日期1总是早于日期2。

参考代码:#include<stdio.h>struct date{int year;int month;int day;};int isLeap(int year);int dif(struct date a, struct date b);void main(){struct date a, b;printf("请输入日期1(空格分隔,年月日):\n");scanf("%d%d%d", &a.year, &a.month, &a.day);printf("请输入日期2(空格分隔,年月日,晚于日期1):\n");scanf("%d%d%d", &b.year, &b.month, &b.day);printf("相差天数为:");printf(" %d 天\n", dif(a, b));}int isLeap(int year) //判断一个年份是否是闰年的函数{if(year%400==0 || (year%4==0 && year%100!=0))return 1;elsereturn 0;}int dif(struct date a, struct date b){int i;long day=0, day1=0, day2=0;intd[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},{0,31,29,31,30,31,30,3 1,31,30,31,30,31}};// day变量为年份a到年份b前一年的年份总天数for(i=a.year; i<b.year; i++)if(isLeap(i))day += 366;elseday += 365;// day1变量为年份a年初到当天的年内总天数for(i=1; i<a.month; ++i)day1 += d[isLeap(a.year)][i];day1 += a.day;// day1变量为年份b年初到当天的年内总天数for(i=1; i<b.month; ++i)day2 += d[isLeap(b.year)][i];day2 += b.day;return day + day2 - day1;}参考截图:第2 题:结构体数组应用请定义一个描述学生基本信息的结构,包括姓名,学号,籍贯,身份证号,年龄,家庭住址,性别,联系方式等。

并定义一个结构体数组。

编程:a) 编写函数input() , 输入基本信息(3~5 条记录);b) 编写函数print(),输出全体记录信息;c) 编写函数search(), 检索一个指定的学生信息并返回, 由主函数打印到屏幕上;d) 说明,访问结构的时候,什么时候应该用运算符“.”,什么时候应该用运算符“->”。

(运算符前是结构体变量时用“.”,是指向结构体变量的指针时用“->”)参考代码:#include <stdio.h>#include <string.h>#define N 3 //增加程序的可扩展性struct student{char name[20];char num[15];char place[20];char id[20];int age;char address[100];char sex;char phone[15];} stu[N];void input(struct student stu[]);void print(struct student stu[]);void search(struct student stu[], char name[]);void main(){char name[20];input(stu);print(stu);printf("\n请输入想要查找的学生姓名: ");scanf("%s", name);search(stu, name);}void input(struct student stu[]){for(int i=0; i<N; i++){printf("请输入第%d个学生的信息:\n", i+1);printf("姓名: ");scanf("%s", stu[i].name);printf("学号: ");scanf("%s", stu[i].num);printf("籍贯: ");scanf("%s", stu[i].place);printf("身份证号: ");scanf("%s", stu[i].id);printf("年龄: ");scanf("%d", &stu[i].age);printf("家庭住址: ");scanf("%s", stu[i].address);fflush(stdin);printf("性别(M/F): ");scanf("%c", &stu[i].sex);printf("电话: ");scanf("%s", stu[i].phone);printf("\n");}}void print(struct student stu[]){printf("姓名学号籍贯身份证号年龄地址性别电话\n");for(int i=0; i<N; i++)printf("%-8s%-12s%-10s%-20s%-4d%-10s%-3c%-10s\n", stu[i].name,stu[i].num, stu[i].place, stu[i].id, stu[i].age, stu[i].address,stu[i].sex,stu[i].phone);}void search(struct student stu[], char name[]){int flag=0;for(int i=0; i<N; i++)if(strcmp(stu[i].name, name)==0){printf("%-8s%-12s%-10s%-20s%-4d%-10s%-3c%-10s\n", stu[i].name,stu[i].num, stu[i].place, stu[i].id, stu[i].age, stu[i].address,stu[i].sex,stu[i].phone);flag = 1;}if(flag == 0)printf("没有该学生的信息!\n\n");}参考截图:第3 题:一元多项式加法编写一元多项式加法器,输入两个一元稀疏多项式,然后对它们进行加法操作。

在具体实现上,要求用线性链表形式来存储一个多项式,每个链表的节点包括两个成员变量,系数和指数(均为整数)。

例如A(x) 75 30x 95x8 50x9,B(x) 80x 25x7 90x8可以用下面的链表表示:说明:(1) 每个链表节点都是根据需要动态创建的;(2) 程序采用多函数形式来实现,至少包括创建链表、打印链表、加法函数等。

(3) 多项式系数可正、可负;指数肯定是非负整数,且按照递增顺序排列输入格式:第一行是一个整数M,表示第一个多项式的项数。

接下来有M行,每行有两个整数ci和ei,分别表示第i项的系数和指数。

再接下来是输入第二个多项式,方法同第一个多项式输入。

输出格式:输出两个多项式相加的结果。

第一行是整数K,表示新多项式的项数。

接下来有K行,每一行为两个整数,分别代表系数和指数。

参考代码:#include <stdio.h>#include <stdlib.h>#define LEN sizeof(struct polynomial)struct polynomial{int a;int x;struct polynomial *next;};struct polynomial *create(int);void print(struct polynomial *);struct polynomial *add(struct polynomial *, struct polynomial *); void main(){struct polynomial *head1, *head2, *p0, *p;int m1, m2, i, n=0;printf("请输入第一个多项式的项数:");scanf("%d", &m1);printf("请输入第一个多项式(一项一行升幂排列,格式: 系数指数):\n");head1 = create(m1);printf("请输入第二个多项式的项数:");scanf("%d", &m2);printf("请输入第二个多项式(一项一行升幂排列,格式: 系数指数):\n");head2 = create(m2);p0 = add(head1,head2);p = p0;while(p != NULL){n++;p = p->next;}printf("\n相加后的多项式项数为:%d\n", n);printf("\n相加后的多项式为:\n");print(p0);}struct polynomial *create(int m){struct polynomial *p1, *p2, *head=NULL;p1 = p2 = (struct polynomial *) malloc(LEN);scanf("%d %d", &p1->a, &p1->x);head = p1;for(int i=1; i<m; i++){p1 = (struct polynomial *) malloc(LEN);scanf("%d %d",&p1->a,&p1->x);p2->next = p1;p2 = p1;}p1->next = NULL;return(head);}void print(struct polynomial *head){struct polynomial *p;p = head;while(p != NULL){printf("%d %d\n", p->a, p->x);p = p->next;}}struct polynomial *add(struct polynomial *head1, struct polynomial *head2) {struct polynomial *p1, *p2, *p3;p1 = head1;while(head2 != NULL) //将后者往前者中插{p3 = head2;head2 = p3->next;while(((p1->x)<(p3->x)) && (p1->next!=NULL)) //找到插入点{p2 = p1;p1 = p1->next;}if(p1->x > p3->x) //如果p1的次数大{if(p1 == head1){head1 = p3;p3->next = p1;}else{p2->next = p3;p3->next = p1;}}else if(p1->x == p3->x) //如果相等则相加{p1->a = p1->a + p3->a;if(p1->a == 0) //若相加后该项的系数为0,则将其删去{if(p1 == head1)head1 = p1->next;else{p2->next = p1->next;p1 = p1->next;}}}else //p1移动至末尾{p1->next = p3;p3->next = NULL;}}return(head1);}参考截图:第4 题:循环淘汰有N 个同学,编号分别为1,2,3……,N,围成一圈,随便选定一个整数m,让大家按顺时针依次报数,报到m 的同学便会从圈子中退出,从而被淘汰,直到最后剩下一个人。

相关主题