文档库 最新最全的文档下载
当前位置:文档库 › 结构体练习题

结构体练习题

结构体练习题
结构体练习题

结构体练习题:

第1 题:计算日期的差值

(1)编写一函数,计算两个日期之间的时间差,并将其值返回。

日期以年、月、日表示。

“时间差”以天数表示。

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

函数的输入参数为日期1和日期2,

函数的返回值为时间差,单位为天数。

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

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

参考代码:

#include

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;

else

return 0;

}

int dif(struct date a, struct date b)

{

int i;

long day=0, day1=0, day2=0;

int

d[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

if(isLeap(i))

day += 366;

else

day += 365;

// day1变量为年份a年初到当天的年内总天数

for(i=1; i

day1 += d[isLeap(a.year)][i];

day1 += a.day;

// day1变量为年份b年初到当天的年内总天数

for(i=1; 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

#include

#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

{

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

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

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

#include

#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

{

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 的同学便会从圈子中退出,从而被淘汰,直到最后剩下一个人。编写函数实现上述循环淘汰功能。

编写一个程序测试上述函数的功能,要求用户能够任意输入N 与m;程序输入最后剩下人的编号。

参考代码:

#include

#include

#define LEN sizeof(struct stu)

struct stu

{

int num;

struct stu *next;

};

struct stu *create(int n);

int select(struct stu *head, int n, int m);

void main()

{

struct stu *head;

int m, n, last;

printf("请输入N的值: ");

scanf("%d", &n);

printf("请输入m的值: ");

scanf("%d", &m);

head = create(n);

last = select(head, n, m);

printf("最后剩下同学的编号是%d 号\n\n", last);

}

struct stu *create(int n)

{

struct stu *p1,*p2;

struct stu *head = NULL;

p2 = p1 = (struct stu*) malloc(LEN);

for(int i=1; i<=n; i++)

{

if (i == 1)

head = p1;

else

p2->next = p1;

p1->num = i;

p2 = p1;

p1 = (struct stu*) malloc(LEN);

}

p2->next = head;

return head;

}

int select(struct stu *head, int n, int m)

{

struct stu *p1=head, *p2=p1;

if (n==1 || m==1)

return n;

for(int i=1; i

{

for(int j=2; j

p1 = p1->next;

p2 = p1;

p1 = p1->next;

p1 = p1->next;

p2->next = p1;

}

return p1->num;

}

参考截图:

第5 题:工资单处理

(1)编写函数:有两个单向链表,头指针分别为list1、list2,链表中每一结点包含员工

号(员工号为关键字段,不重复)、姓名、工资基本信息,请编一函数,把两个链表拼组成一个链表,并返回拼组后的新链表,按员工号升序排列。

(2)编写函数:利用指针数组,实现按照工资进行升序排列的功能。返回排序完成的指

针数组

(3)编写一程序,分别输出按员工号排序后的新链表,以及按照工资排序的结果。

假设链表list1 初始化内容为:

{002, name002,3000}, {005, name005,2500}, {003, name003,3500}

链表list2 初始化内容为:

{006, name006,2800}, {004, name004,3700}, {001, name001,3000}, {007,

name007, 3600},

参考代码:

#include

#include

#include

#define LEN sizeof(struct sal_count)

struct sal_count

{

char number[10];

char name[10];

int salary;

struct sal_count *next;

};

void main()

{

struct sal_count *create(int);

struct sal_count *link(struct sal_count *list1, struct sal_count *list2); void sort(struct sal_count *list, struct sal_count *sorted[], int);

struct sal_count *list1, *list2, *list, *p;

struct sal_count **sorted; //定义sorted指针指向链表的各个节点

int n1, n2;

printf("请输入第一组员工的人数: ");

scanf("%d", &n1);

list1 = create(n1);

printf("请输入第二组员工的人数: ");

scanf("%d", &n2);

list2 = create(n2);

list = link(list1, list2);

printf("\n按员工号升序排列后的链表:\n");

p = list;

do

{

printf("{%s, %s, %d}\n", p->number, p->name, p->salary);

p = p->next;

}

while(p != NULL);

sorted = (struct sal_count **) malloc((n1+n2) * sizeof(struct sal_count *));

sort(list, sorted, n1+n2);

printf("\n按工资升序排列后的结果:\n");

for(int i=0; i

printf("{%s, %s, %d}\n", sorted[i]->number, sorted[i]->name,

sorted[i]->salary);

}

struct sal_count *create(int n)

{

struct sal_count *head=NULL, *p1, *p2;

for(int i=0; i

{

printf("第%d个员工的信息(空格分隔):\n", i+1);

p1 = (struct sal_count *) malloc(LEN);

if(i==0)

head = p1;

else

p2->next=p1;

p2 = p1;

scanf("%s%s%d", p1->number, p1->name, &p1->salary);

}

p2->next = NULL;

return(head);

}

struct sal_count *link(struct sal_count *list1, struct sal_count *list2) {

struct sal_count *point1, *point2;

point2 = list2;

for(point1=list1; point1->next!=NULL; point1=point1->next);//使point1

指向list1的末尾

point1->next = point2; //连接list1和list2

//此法不能考虑头结点,故另辟一块空间作为起始节点

struct sal_count *x;

x = (struct sal_count *)malloc(LEN);

x->next = list1;

struct sal_count *pre, *q=x->next, *p, *r;

x->next = NULL;//开始使用插入法排序

while(q != NULL)

{

pre = x;

p = pre->next;

while(p!=NULL && strcmp(p->number, q->number)<0)

{

pre = p;

p = p->next;

}

r = q->next;

pre->next = q;

q->next = p;

q = r;

}

return(x->next);

}

void sort(struct sal_count *list, struct sal_count *sorted[], int n)

{

int i, j, k;

struct sal_count *temp, *point;

for(point=list, i=0; point->next!=NULL; i++, point=point->next)

sorted[i] = point; //将地址赋给各元素

sorted[i] = point;

for(i=0; i

{

k = i;

for(j=i+1; j

if((sorted[j]->salary) < (sorted[k]->salary))

k = j;

temp = sorted[i];

sorted[i] = sorted[k];

sorted[k] = temp;

}

}

参考截图:

第6 题:单向链表练习

设节点结构:

学号姓名后继结点指针

链表结构:

head

编程。要求程序实现如下功能:

a) 链表生成。键盘输入学生信息,建立一个节点按学号递增有序的单链表

A={a1,a2,..,a n},比如包含5~10 条记录;//假设输入的学号依次为2010002,2010005,2010009,2010007,2010003,2010000,姓名自己随便定义

b) 节点计数。对单链表A={a1,a2,..,a n}编写节点计数函数f,求单链表中的节点个数。主函数调用节点计数函数f,并将其返回值(整数)显示到屏幕;

c) 对单链表 A={a1,a2,..,a n}编写函数fv,将它倒序为A={a n,a n-1,..,a1};

d) 编写输出单链表函数list。每次操作(插入一个新节点或者倒序)之后,调用函数list,在屏幕上显示链表的全部记录数据。

e) 编写一个函数search,输入学号,检索链表A,如果指定学号记录存在则返回指向该节点的指针,主函数打印纪录信息。若学生纪录不存在,则返回空指针,主函数

给出检索失败的信息。

参考代码:

#include

#include

struct student

{

int num;

char name[20];

struct student *next;

};

void main()

{

void list(struct student *head);

struct student *create();

struct student *add();

int f(struct student *head);

struct student *fv(struct student *head);

struct student *search(struct student *head, int n);

struct student *head, *p;

int n, num;

head = add();

n = f(head);

printf("当前链表包含的节点数为%d 个\n",n);

head = fv(head);

printf("链表逆序操作完成!\n",n);

list(head);

printf("请输入要查询学生的学号: ");

scanf("%d", &num);

p = search(head, num);

if(p==0)

printf("没有该学生的信息!\n");

else

printf("%d\t%s\n\n", p->num, p->name);

}

void list(struct student *head)

{

struct student *p;

printf("当前链表内容为:\n");

for(p=head; p!=NULL; p=p->next)

printf("%d\t%s\n", p->num, p->name);

printf("\n");

}

struct student *create()

{

struct student *p = (struct student *) malloc(sizeof(struct student)); printf("请输入学号与姓名(空格分隔,学号为0时停止输入):\n");

scanf("%d%s", &p->num, p->name);

p->next = NULL;

if(p->num == 0)

p = NULL;

return p;

}

struct student *add()

{

struct student *head, *p0, *p1, *p2;

p1 = create();

head = p1;

list(head);

p0 = create();

while(p0 != NULL)

{

p1 = head;

while((p0->num > p1->num) && (p1->next!=NULL))

{

p2 = p1;

p1 = p1->next;

}

if(p0->num < p1->num)

{

if(p1 == head)

head = p0;

else

p2->next = p0;

p0->next = p1;

}

else

{

p1->next = p0;

p0->next = NULL;

}

list(head);

p0=create();

}

return head;

}

int f(struct student *head)

{

int n;

struct student *p=head;

for(n=0; p!=NULL; n++)

p = p->next;

return n;

}

struct student *fv(struct student *head)

{

struct student *p1, *p2, *p3;

int n;

n = f(head);

if(n == 2)

{

p1 = head;

p2 = p1->next;

p2->next = p1;

p1->next = NULL;

head = p2;

}

else if(n > 2)

{

p1 = head;

p2 = p1->next;

p3 = p2->next;

p2->next = p1;

p1->next = NULL;

while(true)

{

if(p3->next == NULL)

{

p3->next = p2;

head = p3;

break;

}

else

{

p1 = p2;

p2 = p3;

p3 = p3->next;

p2->next = p1;

}

}

}

return head;

}

struct student *search(struct student *head, int num) {

struct student *p;

for(p=head; p!=NULL; p=p->next)

if(p->num == num)

break;

return p;

}

参考截图:

第7 题:循环单链表(选作)

将上一题链表结构改为下面的形式,并在其上实现功能(a)~(e)。head

循环链表结构

参考代码:

#include

#include

struct student

{

int num;

char name[20];

struct student *next;

};

void main()

{

void list(struct student *end);

struct student *create();

struct student *add();

int f(struct student *end);

struct student *fv(struct student *end);

struct student *search(struct student *end, int n);

struct student *end, *p;

int n, num;

end = add();

n = f(end);

printf("当前链表包含的节点数为%d 个\n",n);

end = fv(end);

printf("链表逆序操作完成!\n",n);

list(end);

printf("请输入要查询学生的学号: ");

scanf("%d", &num);

p = search(end, num);

if(p==0)

printf("没有该学生的信息!\n");

else

printf("%d\t%s\n\n", p->num, p->name);

}

void list(struct student *end)

{

struct student *p=end->next;

printf("当前链表内容为:\n");

printf("%d\t%s\n", p->num, p->name);

for(p=p->next; p!=end->next; p=p->next)

printf("%d\t%s\n", p->num, p->name);

printf("\n");

}

struct student *create()

{

struct student *p = (struct student *) malloc(sizeof(struct student)); printf("请输入学号与姓名(空格分隔,学号为0时停止输入):\n");

scanf("%d%s", &p->num, p->name);

p->next = NULL;

if(p->num == 0)

p = NULL;

return p;

}

struct student *add()

{

struct student *head, *p0, *p1, *p2, *end;

p1 = create();

head = p1;

end = p1;

end->next = head;

list(head);

p0 = create();

while(p0 != NULL)

{

p1 = head;

while((p0->num > p1->num) && (p1->next!=head)) {

p2 = p1;

p1 = p1->next;

}

if(p0->num < p1->num)

{

if(p1 == head)

{

head = p0;

end->next = head;

}

else

p2->next = p0;

p0->next = p1;

}

else

{

end = p0;

p1->next = p0;

p0->next = head;

}

list(end);

p0=create();

}

return end;

}

int f(struct student *end)

{

int n;

struct student *p=end->next;

p = p->next;

for(n=1; p!=end->next; n++)

p = p->next;

return n;

}

struct student *fv(struct student *end)

{

struct student *p1, *p2, *p3, *head;

int n;

head = end->next;

n = f(end);

if(n == 2)

{

head = end;

end = end->next;

}

else if(n > 2)

{

p1 = head;

p2 = p1->next;

p3 = p2->next;

p2->next = p1;

p1->next = end;

while(true)

{

if(p3->next == head)

{

p3->next = p2;

end = head;

head = p3;

break;

}

else

{

p1 = p2;

p2 = p3;

p3 = p3->next;

p2->next = p1;

}

}

}

return end;

}

struct student *search(struct student *end, int num) {

int i;

struct student *p;

for(p=end->next, i=0; inext, i++)

if(p->num == num)

break;

if(i==num)

return NULL;

else

return p;

}

参考截图:__

结构体练习题

结构体练习题: 第1 题:计算日期的差值 (1)编写一函数,计算两个日期之间的时间差,并将其值返回。 日期以年、月、日表示。 “时间差”以天数表示。 注意考虑日期之间的闰年。 函数的输入参数为日期1和日期2, 函数的返回值为时间差,单位为天数。 (2)编写一程序,在主函数中输入两个日期,调用上述函数计算两个日期之间的时间差,并将结果输出。 为了计算简便,假设用户输入的日期1总是早于日期2。 参考代码: #include 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; else return 0; } int dif(struct date a, struct date b) { int i; long day=0, day1=0, day2=0; int d[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

结构体与共用体

试卷编号:825 所属语言:C语言 试卷方案:结构体与共用体 试卷总分:90分 共有题型:5种 ━━━━━━━━━━━━━━ 一、填空共5题(共计10分) ━━━━━━━━━━━━━━ 第1题(2.0分)题号:205 结构体是不同数据类型的数据集合,作为数据类型, 必须先说明结构体【1】,再说明结构体变量. 答案: =======(答案1)======= 类型 第2题(2.0分)题号:208 将函数funl 的入口地址赋给指针变量p的语句是【1】. 答案: =======(答案1)======= p=funl; 第3题(2.0分)题号:232 设有以下结构类型说明和变量定义,且sizeof(int)=2,则变量a在内存所占字节数是【1】. struct stud { char num[6]; int s[4]; double ave; } a,*p; 答案: =======(答案1)======= 22

第4题(2.0分)题号:345 若在程序中用到"strlen()"函数时,应在程序开头写上包含命令# include "【1】". 答案: =======(答案1)======= string.h 第5题(2.0分)题号:803 预处理命令行都必须以【1】号开始. 答案: =======(答案1)======= # ━━━━━━━━━━━━━━━━━ 二、单项选择共20题(共计40分) ━━━━━━━━━━━━━━━━━ 第1题(2.0分)题号:464 以下描述中,正确的是()。 A:预处理是指完成宏替换和文件包含中指定的文件的调用 B:预处理指令只能位于C源文件的开始 C:C源程序中凡是行首以#标识的控制行都是预处理指令 D:预处理就是完成C编译程序对C源程序第一遍扫描,为编译词法和语法分析作准备答案:C 第2题(2.0分)题号:472 下列程序运行结果为: #define P 3 #define S(a) P*a*a main() {int ar; ar=S(3+5); printf("\n%d",ar); } A:192 B:29 C:27

指针测试题

C++测试(指针) 学号姓名成绩 一、选择题(每题1.5分,共24分) 1.语句int a=10,*point=&a;其值不为地址。 A. point B. &a C. &point D. *point 2.若p为指针变量,y为变量,则y = *p++;的含义是 A.y=*p;p++ B.y=(*p)++ C.y=p;p++ D.p++;y=*p 3.语句char str[]=?visual C++?;char *p=str;则p的值为 A. ?visual C++? B.str的首地址 C. \n D.?v? 4.设有说明语句char *s[]={?student?,?Teacher?,?Father?,?Month?}, *ps=s[2];执行语句:cout<<*s[1]<<’,’<next=&b; D.(*p).next=q; 9.下面正确的语句是 A. int a[3][4],(*p)[4]; p=a; B. int a[3][4],*p[4]; p=a; C. int a[3][4],*p; p=a; D. int a[3][4],**p;*p=a; 10.下面不正确的语句是 A.float *p;p=new float[3]; B. int *p;p=new int[3](1,2,3); C. float *p;p=new float(3); D. int (*p)[4];p=new int[3][4]; 11.设有函数定义:int f1(void){return 100,150;}调用函数f1()时, A.函数返回值100 B. 函数返回值150 C. 函数返回二个值100和150 D. 语句return 100,150;语法错. 12.设有语句:int fun(char *,int &);char str[100];int k;则对函数fun的正确的调用形式是 A.fun(str,&k) B.fun(str,k) C.fun(str[100],k) D.fun(str, &k) 13.数组作为函数的形参时,把数组名作为实参,传递给函数的是 A.该数组的首地址 B. 该数组的元素个数 C. 该数组中的各元素值 D. 该数组的大小 14.执行以下语句序列:则 enum {Sun,Mon,Tue,Wed,Thu,Fri,Sat}c1,c2; //A

结构体与共用体小结

结构体与共用体小结 一,结构体得概念与定义 1,结构体得定义 struct 结构体名 { 数据类型成员名1; 数据类型成员名1; 、、、 }; 这里数据类型可以就是复合类型,例如又就是一个结构体类型,即嵌套; 2,结构体变量得定义 struct 结构体名变量名1,变量名2,,,变量名n; 或: struct 结构体名 { 数据类型成员名1; 数据类型成员名1; 、、、 }结构体变量1,结构体变量2;

或: struct { 数据类型成员名1; 数据类型成员名1; 、、、 }结构体变量1,结构体变量2; 三种方式,第三种方式得话,每次要定义这个类型得结构体变量都要重复得写这一段代码; 其实定义了结构体后,struct 结构体名就就是一种新得类型,上述语句就像声明变量一样; 3,结构体变量得引用 只能对结构体变量中得各个成员分别输出,不能对一个结构体变量作为一个整体输出; 嵌套得结构体类型得引用: 结构体变量名、结构体类型成员名、内嵌结构体得成员名; 4,结构体变量得初始化 struct 结构体名变量名= {初始化数据};

或者在定义得时候就初始化: struct 结构体名 { 数据类型成员名1; 数据类型成员名1; 、、、 }变量名= {初始化数据}; 二,结构体数组 1,结构体数组得定义举例struct stu { int stu_nu; char name[20]; float score; }; struct stu student[5]; 或者: struct stu { int stu_nu;

char name[20]; float score; }student[5]; 或者: struct { int stu_nu; char name[20]; float score; }student[5]; 跟定义结构体变量得三种形式就是一样得,只不过这里每次定义得结构体变量就是一个数组;每一个student[i]都就是struct stu类型得; 2,结构体数组得初始化与引用 略; 三,结构体与指针 1,指向结构体得指针得定义,同上,也就是三种形式; struct employees employee1,*p1; 或者: struct employees

结构体练习题

算并输出每个人的学号和平均成绩。 2.已知链表结点结构如下,假设动态链表已经建立,请编写删除给定学号的结点的函 数。(只编写删除子函数即可) 3.编写函数实现动态链表的建立。链表结点结构如下,要求在主函数中将你所建立的链 表输出到屏幕上。 4.有10个学生,每个学生的信息包括学号、姓名、3门课的成绩,从键盘输入10个学 生数据存入结构体数组中,要求输出个人总分最高的学生的信息(包括学号、姓名、3门课成绩、总分)。 5.链表的结点数据类型如下: struct node{ int data; struct node *next; }; 链表的建立和输出函数如下,编写将第i个结点删除的函数,并完善主函数,调试运行整个程序。 struct node *creat() { int x; struct node *h,*s,*r; h=(struct node *)malloc(sizeof(struct node)); r=h; scanf("%d",&x); while(x!=-1) { s=(struct node*)malloc(sizeof(struct node)); s->data=x; r->next=s; r=s; scanf("%d",&x); } r->next=NULL; return h; } void print(struct node *h) //打印函数 { struct node *p; p=h->next; if(p==NULL) printf("list is empty!"); else { while(p!=NULL) { printf("%4d",p->data); p=p->next; } } }

第8章练习 结构体与共用体

第十一章习题结构体与共用体 1.以下C语言共用体类型数据的描述中,不正确的是( ) A) 共用体变量占的内存大小等于所需内存最大的成员所占的内存 B) 共用体类型可以出现在结构体类型定义中 C) 在定义共用体变量的同时允许对第一个成员的值进行初始化 D) 同一共用体中各成员的首地址不相同 2.下列对结构体类型变量定义不正确的是( ) A)struct teacher B) struct { int num; { int num; int age; }teach1; int age; }teach1,teach2; C) struct D) struct teacher { int num; { int num; int age; }teacher; int age; }; struct teacher teach1; struct teacher teach1; 3.若有定义: struct teacher { int num; char name[10]; char sex; int age; float score;}teacher1; 则变量teacher1所占用的内存字节数是( ) A) 5 B)14 C) 19 D) 20 4.以下程序的运行结果是( ) #include union Utype { int i; float y; }u[2]; void main() { printf("sizeof(u):%d\n",sizeof(u)); } A)2 B) 4 C) 6 D) 8 5.设有以下定义语句: struct student { int num; char name[10]; float score; }wang,zhang; 则变量wang所占的内存字节数是( ) A) 14 B) 16 C)18 D) 20 6.设有如下定义语句: union u_type { int i; double x; float f; }; struct str_type { char str[100]; union u_type u[2]; }; 则语句“printf("%d",sizeof(struct str_type));”的输出结果是( ) A)100 B) 116 C) 120 D) 200 第 1 页共2 页

结构体和共用体习题

习题六 1. 从下列四个选项中选择一个正确的填入括号中。 (1)在说明一个结构体变量时系统分配给它的存储空间是(D)。 A该结构体中第一个成员所需存储空间 B该结构体中最后一个成员所需存储空间 C该结构体中占用最大存储空间的成员所需存储空间 D该结构体中所有成员所需存储空间的总和 (2)在说明一个共用体变量时系统分配给它的存储空间是(D )。 A该共用体中第一个成员所需存储空间 B该共用体中最后一个成员所需存储空间 C该共用体中占用最大存储空间的成员所需存储空间 D该共用体中所有成员所需存储空间的总和 (3)共用体类型在任何给定时刻, (B)。 A所有成员一直驻留在内存中 B只有一个成员驻留在内存中 C部分成员驻留在内存中 D没有成员驻留在内存中 (4)以下定义结构体类型的变量st1,其中不正确的是(A ) A typedef stuct student { int num; int age; }STD; STD st1; B struct student { int num,age; }st1; C struct { int num; float age; }st1; D struct student { int num; int age; }; struct student st1; (5)已知职工记录描述为: struct workers {

int no; char name[20]; char sex; struct { int day; int month; int year; }birth; }; struct workers w; 设变量w中的”生日”应是”1993年10月25日”,下列对”生日”的正确赋值方式是(C)。 A day=25; month=10; year=1993; B w.day=25w.month=10; w.year=1993; C w.birth.day=25; w.birth.month=10; w.birth.year=1993; D birth.day=25; birth.month=10; birth.year=1993; (6)设有如下定义: struct sk { int a; float b; }data,*p; 若有p=&data;则对data中的a成员的正确引用是(B)。 A (*p).data.a B (*p).a C p->data.a D p.data.a 2.填空 (1)若有以下说明和定义且数组w和变量k已正确赋值,则对w数组中第k个元素中各成员的正确引用形式是w[k-1].b、w[k-1].c 、w[k-1].d 。 struct aa { int b; char c; double d; }; struct aa w[10]; int k=3; (2)若有以下说明和定义,则对x.b成员的另外两种引用形式是x->b-> 和p.b. 。 struct st { int a; struct st *b; }*p, x;

(完整word版)C语言程序设计基础-结构体习题

1、把一个学生的信息(包括学号、姓名、性别、住址)放在一个结构体变量中,然后输出这个学生的信息。 #include int main() {struct Student { long int num; char name[20]; char sex; char addr[20]; }a={10101,“Li Lin”,‘M’, “123 Beijing Road”}; printf("NO.:%ld\nname:%s\n sex:%c\naddress:%s\n",a.num,https://www.wendangku.net/doc/013021718.html,,a.sex,a.addr); return 0; } 2、输入两个学生的学号、姓名和成绩,输出成绩较高学生的学号、姓名和成绩 #include int main() { struct Student { int num; char name[20]; float score; }student1,student2; scanf("%d%s%f",&student1.num,https://www.wendangku.net/doc/013021718.html,, &student1.score); scanf(“%d%s%f”,&student2.num,https://www.wendangku.net/doc/013021718.html,, &student2.score); printf("The higher score is:\n"); if (student1.score>student2.score) printf("%d %s %6.2f\n",student1.num,https://www.wendangku.net/doc/013021718.html,, student1.score); else if (student1.score #include struct Person { char name[20];

结构体与共用体相关题目练习

结构体与共用体 1.说明一个结构体变量时系统分配给它的内存是 A)各成员所需要内存量的总和 B)结构体中第一个成员所需内存量 C)成员中占内存量最大者所需的容量 D)结构中最后一个成员所需内存量 2.C语言结构体类型变量在程序执行期间 A)所有成员一直驻留在内存中 B)只有一个成员驻留在内存中 C)部分成员驻留在在内存中 D)没有成员驻留在内存中 3.设有以下说明语句 struct stu { int a ; float b ; } stutype ; 则下面的叙述不正确的是 A) struct 是结构体类型的关键字 B) struct stu 是用户定义的结构体类型 C) stutype 是用户定义的结构体类型名 D) a和b都是结构体成员名 4.设有以下结构类型说明和变量定义,则变量a在内存所占字节数是【】。 struct stud { char num[6]; int s[4]; double ave; } a,*p; 5.程序中有下面的说明和定义 struct abc { int x;char y;} struct abc s1,s2; 则会发生的情况是 A)编译出错B)程序将顺利编译、连接、执行 C)能顺利通过编译、连接、但不能执行 D)能顺利通过编译、但连接出错 6.有如下定义 struct person { char name[9]; int age;}; struct person class[10]={ " Johu", 17,"Paul", 19,"Mary", 18,"Adam", 16}; 根据上述定义,能输出字母M的语句是 A) prinft(" %c\n",class[3].name); B) printf(" %c\n",class[3].name[1]); C) prinft(" %c\n",class[2].name[1]); D) printf(" %c\n",class[2].name[0]);7.下面程序的输出是 A)0 B)1 C)3 D)6 main() { struct cmplx { int x; int y;} cnum[2]={1,3,2,7}; printf("%d\n",cnum[0].y/cnum[0].x*cnum[1].x);} 8.下列程序的输出结果是 A)5 B)6 C)7 D)8 struct abc { int a, b, c; }; main() { struct abc s[2]={{1,2,3},{4,5,6}}; int t; t=s[0].a+s[1].b; printf("%d \n",t);} 9.有以下程序 struct stu { int num;char name[10];int age;}; void fun(struct stu *p) { printf("%s\n" ,(*p).name); } main() { struct stu students[3]={{9801,"Zhang",20} ,{9802,"Wang", 19} , {9803,"Zhao",18} }; fun(students+2);} 输出结果是 A)Zhang B)Zhao C)Wang D)18 10.设有如下定义: struct sk {int a ;float b ;}data ,*p ; 若有p=&data ;,则对data中的a域的正确引用是 A)(*p).data.a B)(*p).a C)p->data.a D)p.data.a 11.下面程序的输出结果为

结构体与联合体习题含答案

2013年结构体与联合体习题 选择题 1、若程序中有以下的说明和定义: struct abc { int x;char y; } 花括号后少了分号。 struct abc s1,s2; 则会发生的情况是______。 A) 编译时错B) 程序将顺序编译、连接、执行 C) 能顺序通过编译、连接、但不能执行D) 能顺序通过编译、但连 接出错 2、有以下程序段 struct st { int x; int *y;}*pt; int a[]={1,2};b[]={3,4}; struct st c[2]={10,a,20,b}; pt=c; 以下选项中表达式的值为11的是 A) *pt->y B) pt->x C) ++pt->x D) (pt++)->x 3、有以下说明和定义语句 struct student { int age; char num[8];}; struct student stu[3]={{20,"200401"},{21,"200402"},{19,"200403"}}; struct student *p=stu; 以下选项中引用结构体变量成员的表达式错误的是______。 A) (p++)->num B) p->num C) (*p).num D) stu[3].age 4、设有如下枚举类型定义 enum language {Basic=3,Assembly=6,Ada=100,COBOL,Fortran}; 枚举量Fortran的值为______。 A) 4 B) 7 C) 102 D) 103 5、以下叙述中错误的是_________。 A)可以通过typedef增加新的类型 B)可以用typedef将已存在的类型用一个新的名字来代表 C)用typedef定义新的类型名后,原有类型名仍有效 D)用typedef可以为各种类型起别名,但不能为变量起别名 6、有以下程序段 typedef struct NODE

C语言结构体习题及答案

C语言结构体习题及答 案 集团企业公司编码:(LL3698-KKI1269-TM2483-LUI12689-ITT289-

第9章结构体 1.定义以下结构体类型 struct s { int a; char b; float f; }; 则语句printf("%d",sizeof(struct s))的输出结果为【】。 A) 3 B) 7 C) 6 D) 4 2.当定义一个结构体变量时,系统为它分配的内存空间是【】A)结构中一个成员所需的内存容量 B)结构中第一个成员所需的内存容量 C)结构体中占内存容量最大者所需的容量 D)结构中各成员所需内存容量之和 3.定义以下结构体类型 struct s { int x; float f; }a[3]; 语句printf("%d",sizeof(a))的输出结果为【】 A) 4 B) 12 C) 18 D) 6

7.定义以下结构体类型 struct student { char name[10]; int score[50]; float average; }stud1; 则stud1占用内存的字节数是【】。 A) 64 B) 114 C) 228 D) 7 9、设有一结构体类型变量定义如下: struct date { int year; int month; int day; }; struct worklist { char name[20]; char sex; struct date birthday; } person; 若对结构体变量person的出生年份进行赋值时,下面正确的赋值语句是。。。。

第9章结构体类型与共用体类型习题及答案

第九章结构体类型与公用体类型习题及其答案9-3编写程序,使用结构体类型,输出一年十二个月的英文名称及相应天数。 解:#include "stdio.h" struct date { char month[10] ; int daynumber ; } main() { int i ; date a[12] ={{"January",31},{"February",29},{"March",31},{"Apri al",30},{"May",31},{"June",30},{"july",31},{"August",31}, {"September",30},{"October",31},{"November",30},{"Decembe r",31}} ; for(i=0;i<12;i++); printf("%d 月:%s %d\n",i+1,a[i].month,a[i].daynumber) ; } 思考:如何对结构体变量进行初始化?对结构体变量的引用为何要体现为分量(或成员)的引用? 9-4 编写程序求空间任一点到原点的距离,点用结构体描述。并请考虑求空间中任意两点的距离的程序。 解:#include "stdio.h" #include "math.h" struct point { float x ; float y ; float z ; } void main()

{ double d1,d2,d ; point p1,p2 ; printf("请输入第一个点的坐标:"); scanf("%f,%f,%f",&p1.x,&p1.y,&p1.z); printf("请输入第二个点的坐标:"); scanf("%f,%f,%f",&p2.x,&p2.y,&p2.z); d1=sqrt(p1.x*p1.x+p1.y*p1.y+p1.z*p1.z); d2=sqrt(p2.x*p2.x+p2.y*p2.y+p2.z*p2.z); d=sqrt((p2.x-p1.x)*(p2.x-p1.x)+(p2.y-p1.y)*(p2.y-p1.y)+(p 2.z-p1.z)*(p2.z-p1.z)); printf("第一个点到原点的距离:%f\n",d1); printf("第二个点到原点的距离:%f\n",d2); printf("两点间的距离:%f\n",d); } 9-5 编写输入、输出10个朋友数据的通讯录程序,每个朋友数据包括、地址、邮编、、传呼、手机等数据。 解:#include "stdio.h" struct AddressBook { char name[10] ; char address[30] ; char mailnumber[7] ; char telphone[12] ; char byphone[16] ; char movephone[1] ; } void main() { int i ; AddressBook fd[10] ; for(i=0;i<10;i++) {

C指针函数习题

C++指针函数习题 一、选择题 1.以下程序的运行结果是()。 sub(int x, int y, int *z) { *z=y-x; } void main() { int a,b; sub(10,5,&a); sub(7,a,&b); cout< #include<>

结构体习题

结构体习题 49、以下程序运行结果是______。 #include typedefstruct student{ char name[10]; longsno; float score; }STU; main() { STU a={"Zhangsan",2001,95},b={"Shangxian",2002,90}, c={"Anhua",2003,95},d,*p=&d; d=a; if(strcmp(https://www.wendangku.net/doc/013021718.html,,https://www.wendangku.net/doc/013021718.html,)>0) d=b; if(strcmp(https://www.wendangku.net/doc/013021718.html,,https://www.wendangku.net/doc/013021718.html,)>0) d=c; printf("%ld %s\n",d.sno,p->name); } 标准答案为:2002 Shangxian 1. 填空题 人员的记录由编号和出生年、月、日组成,N名人员的数据已在主函数中存入结构体数组std中,且编号唯一。函数fun的功能是:找出指定编号人员的数据,作为函数值返回,由主函数输出,若指定编号不存在,返回数据中的编号为空串。 请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。 注意:源程序存放在考生文件夹下的BLANK1.C中。 不得增行或删行,也不得更改程序的结构! #include #include #define N 8 typedefstruct { charnum[10]; intyear,month,day ; }STU; /**********found**********/ STU fun(STU *std, char *num) { int i; STU a={"",9999,99,99}; for (i=0; i

结构体共用体与枚举课后习题

1.定义一结构体,成员项包括一个字符型、一个整型。编程实现结构体变量成员项的输入、输出,并通过说明指针引用该变量。 #include void main() { struct a { char b; int c; }d,*p; p=&d; printf("输入:\n"); scanf("%c",&(*p).b); scanf("%d",&p->c); printf("输出:\n"); printf("%c\n",(*p).b); printf("%d\n",p->c); } 2.建立一结构体,其中包括学生的姓名、性别、年龄和一门课程的成绩。建立的结构体数组通过输入存放全班(最多45人)学生信息,输出考分最高的同学的姓名、性别、年龄和课 程的成绩。 #include void main() { int i,b,n; float a; printf("请输入班级的人数:"); scanf("%d",&n); getchar(); struct person { char name[20]; char sex[10]; int year; float score; }stu[45]; for(i=0;i

getchar(); } for(b=0,a=stu[0].score,i=0;i #define N 4 struct person { char name[20]; long int number; float score1; float score2; }; void shuru(struct person stu[N]) { int i; for(i=0;i

c语言结构体与共用体之间的区别

https://www.wendangku.net/doc/013021718.html,/2005/03/25/12365.html 所谓共用体类型是指将不同的数据项组织成一个整体,它们在内存中占用同一段存储单元。其定义形式为: union 共用体名 {成员表列}; 7.5.1 共用体的定义 union data { int a ; float b ; d o u b l e c ; c h a r d ; } obj; 该形式定义了一个共用体数据类型union data ,定义了共用体数据类型变量o b j。共用体 数据类型与结构体在形式上非常相似,但其表示的含义及存储是完全不同的。先让我们看一个小例子。 [例7 - 8 ] union data /*共用体* / { int a; float b; double c; char d; } m m ; struct stud /*结构体* / { int a; float b; double c; char d; } ; m a i n ( ) { struct stud student printf("%d,%d",sizeof(struct stud),sizeof(union data)); } 程序的输出说明结构体类型所占的内存空间为其各成员所占存储空间之和。而形同结构体的

共用体类型实际占用存储空间为其最长的成员所占的存储空间。详细说明如图7 - 6所示。 对共用体的成员的引用与结构体成员的引用相同。但由于共用体各成员共用同一段内存 空间,使用时,根据需要使用其中的某一个成员。从图中特别说明了共用体的特点,方便程序设计人员在同一内存区对不同数据类型的交替使用,增加灵活性,节省内存。 7.5.2 共用体变量的引用 可以引用共用体变量的成员,其用法与结构体完全相同。若定义共用体类型为: union data /*共用体* / { int a; float b; double c; char d; } m m ; 其成员引用为:m m . a , m m . b , m m . c , m m . d 但是要注意的是,不能同时引用四个成员,在某一时刻,只能使用其中之一的成员。 [例7-9] 对共用体变量的使用。 m a i n ( ) { union data { int a; float b; double c; char d; } m m ; m m . a = 6 ; printf("%d\n",mm.a); m m . c = 6 7 . 2 ; p r i n t f ( " % 5 . 1 l f \ n " , m m . c ) ; m m . d = ' W ' ; m m . b = 3 4 . 2 ; p r i n t f ( " % 5 . 1 f , % c \ n " , m m . b , m m . d ) ; }

C语言习题及答案(第九章)

9-3编写程序,使用结构体类型,输出一年十二个月的英文名称及相应天数。 解:#include "stdio.h" struct date { char month[10] ; int daynumber ; } main() { int i ; struct date a[12]={{"January",31},{"February",29},{"March",31},{"Aprial",30},{ "May",31},{"June",30},{"july",31},{"August",31},{"September",30}, {"October",31},{"November",30},{"December",31}} ; for(i=0;i<12;i++); printf("%d 月:%s %d\n",i+1,a[i].month,a[i].daynumber) ; } 思考:如何对结构体变量进行初始化?对结构体变量的引用为何要体现为分量(或成员)的引用? 9-4 编写程序求空间任一点到原点的距离,点用结构体描述。并请考虑求空间中任意两点的距离的程序。 解:#include "stdio.h" #include "math.h" struct point { float x ; float y ; float z ; } main() { double d1,d2,d ; struct point p1,p2 ; printf("请输入第一个点的坐标:");

scanf("%f,%f,%f",&p1.x,&p1.y,&p1.z); printf("请输入第二个点的坐标:"); scanf("%f,%f,%f",&p2.x,&p2.y,&p2.z); d1=sqrt(p1.x*p1.x+p1.y*p1.y+p1.z*p1.z); d2=sqrt(p2.x*p2.x+p2.y*p2.y+p2.z*p2.z); d=sqrt((p2.x-p1.x)*(p2.x-p1.x)+(p2.y-p1.y)*(p2.y-p1.y)+(p2.z-p1.z)*( p2.z-p1.z)); printf("第一个点到原点的距离:%f\n",d1); printf("第二个点到原点的距离:%f\n",d2); printf("两点间的距离:%f\n",d); } 9-5 编写输入、输出10个朋友数据的通讯录程序,每个朋友数据包括姓名、地址、邮编、电话、传呼、手机等数据。 解:#include "stdio.h" struct AddressBook { char name[10] ; char address[30] ; char mailnumber[7] ; char telphone[12] ; char byphone[16] ; char movephone[1] ; } main() { int i ; struct AddressBook fd[10] ; for(i=0;i<10;i++) { printf("请输入第%d个朋友的信息:\n",i+1); printf("姓名:"); scanf("%s",&fd[i].name) ; printf("地址:");

相关文档