第9章 用户自己建立数据类型

前言

某不知名学校C语言作业 这一次是结构体的使用和链表的操作 你会发现 这一期的分析变少了 因为写着写着就发现这次考的基本都是操作 思路并不是那么重要 如果硬要写反而变成了学习笔记 而且基本都是基础知识 更适合写一篇文章(绝对不鸽)

已经学过了指针知识 加上这次老师也给了答案(甚至有些还有注释)所以代码应该还是能看懂的

(好吧其实是我自己懒得写那么多注释了)

而且我们学校老师出题那是真的恶心 输入输出一点不给 一般的题还好 你结构体和链表这样搞我真的谢了 还有**的清览题库,输入到5行之后还自动给你省略,根本看不出自己错哪了, 卡输出了半个小时发现是逗号前面少一个空格 实在逆天 与其说在写程序 更觉得自己在玩找不同

算了 看题目吧 吐槽也改变不了什么

 第一题

工资明细

编写程序用结构体存放下表中的数据,然后输出每人的姓名和工资实发数(基本工资+浮动工资-支出)。

 分析:考的是结构体的基础知识点 等我有时间再补上一篇文章写结构体的知识点 这道题 只要学过结构体 基本都会 

老师答案:

#include  "stdio.h"
#include  "string.h"
struct PERSON {
	char name[10];
	double bSalary;
	double cSalary;
	double pay;
} P[3]={"zhao",240.00,420.00,45.00,"qian",360.00,120.00,30.00,"sun",560.00,0.0,180.00};
int main()
{
for(int i=0;i <3;i++)
        printf("%s:%.2lf\n",P[i].name,P[i].bSalary+P[i].cSalary-P[i].pay);
     return 0;
}

个人答案:

# include <stdio.h>

	struct person{//定义一个结构体 别名为person
	char name[20];
	float bwage;
	float fwage;//输出用浮点数
	float pay;
	
}; 
//struct person zhao;
//struct person qian;有很多种初始化方法
//struct person sun;

//struct person zhao = {"zhao",240.00,420.00,45.00};
//struct person qian = {"qian",360.00,120.00,30.00};
//struct person sun = {"sun",560.00,000.00,180.00};

//我跟老师答案一样用的是结构体数组的方法 最简便
struct person people[3]={
	{"zhao",240.00,420.00,45.00},
	{"qian",360.00,120.00,30.00},
	{"sun",560.00,000.00,180.00}
};

int main()
{

	//像遍历数组一样的操作
	for(int i=0;i<3;i++){
		//struct person per = people[i]; 一种简便的写法 后面有用到 这里不用先
		printf("%s:%.2f",people[i].name,people[i].bwage+people[i].fwage-people[i].pay);
		printf("\n");
	}

	

	return 0;
}

第二题

实现链表的反转

链表节点类型如下: struct linka { int data; linka* next; }; 创建一个这样的链表:1->2->3->4->5,编写程序实现该链表的反转,即5->4->3->2->1。

分析:暂无 知识点太大 感觉得写个文章

老师答案:

#include  "stdio.h"
#include  "stdlib.h"
#define N 5
int E[N];
typedef int ElemType;
typedef struct linka { //单链表结点类型
	int data; //数据域
	struct linka *next; //指针域:指向直接后继结点
} LNode, *LinkList; //LNode为单链表结构体类型,LinkList为单链表指针类型

void CreateLinkF(LinkList *L)
{	//头插法创建单链表
	LinkList s;
	*L=(LinkList)malloc(sizeof(LNode)); //创建头结点
	(*L)->next=NULL; //初始时为空表
	int n=N,i=0;
	for (; n>0; n--,i++) { //创建n个结点链表
		s=(LinkList)malloc(sizeof(LNode)); //创建新结点
		s->data=E[i];
		s->next=(*L)->next; //将s增加到开始结点之前
		(*L)->next=s; //头结点之后
	}
}

void CreateLinkR(LinkList *L)
{	//尾插法创建单链表
	LinkList p,s;
    p=*L=(LinkList)malloc(sizeof(LNode));
	int n=N;
	int c=1;
	for (; n>0; n--,c++) { //创建n个结点链表
		s=(LinkList)malloc(sizeof(LNode)); //创建新结点
		s->data=c;
		s->next=(*L)->next; //将s增加到开始结点之前
		p->next=s, p=s;
	}
	p->next=NULL; //尾结点
}

void ListSave(LinkList L)
{	//遍历L中的每个元素,并将其节点数据按顺序存在数组中
	LinkList p=L->next; //p指向开始结点
	int i=0;
	while(p!=NULL) { //若不是链尾继续
		E[i]=p->data;
		p=p->next; //p指向直接后继结点
		i++;
	}
}

void ListTraverse(LinkList L)
{	//遍历L中的每个元素
	LinkList p=L->next; //p指向开始结点
	int i=0;
	while(p!=NULL) { //若不是链尾继续
		printf("%d ",p->data);
		p=p->next; //p指向直接后继结点
		i++;
	}
}

int main()
{
     LinkList H;
     CreateLinkR(&H);
     ListSave(H);
     CreateLinkF(&H);
     ListTraverse(H);
     return 0;
}

个人答案

#include<stdio.h>
#include<stdlib.h>
typedef struct Node{
	int val;
	struct Node *next;
}node;
node *initNode(){
	node *end=(node *)malloc(sizeof(node));//尾指针 
	node *p=(node *)malloc(sizeof(node));//首元节点 
	p->val=1;
	p->next=NULL;//习惯操作
	end=p;
	for(int i=2;i<=5;i++){
		node *newnode=(node *)malloc(sizeof(node));
		newnode->val=i;
		newnode->next=NULL;
		//尾插法 和老师相反
		end->next=newnode;
		end=newnode;
	}
	return p;
}
void print(node *p){
	node *temp=p;
	while(temp){
		printf("%d ",temp->val);
		temp=temp->next;
	}
	printf("\n");
}
node *iteration(node *p){
	if(p==NULL||p->next==NULL){
		return p;
	}else{
		node *pre=NULL;
		node *mid=p;
		node *end=p->next;
		while(1){
			mid->next=pre;
			if(end==NULL){
				break;
			}
			pre=mid;
			mid=end;
			end=end->next;
		}
		p=mid;
		return p; 
	}
}
int main(){
	node *p=initNode();
	p=iteration(p);
	print(p);
	return 0;
}

第三题

结点插入到表中

已知带头结点的动态单向链表L中的结点是按整数值递增排列的,试编写函数将值x为的结点插入到表L中,使L仍然有序。

老师答案

#include  "stdio.h"
#include  "stdlib.h"
typedef int ElemType;
typedef struct linka { //单链表结点类型
	int data; //数据域
	struct linka *next; //指针域:指向直接后继结点
} LNode, *LinkList; //LNode为单链表结构体类型,LinkList为单链表指针类型

void CreateLinkR(LinkList *L,int n,int A[])
{	//尾插法创建单链表,调用input输入函数输入数据
	LinkList p,s;
	p=*L=(LinkList)malloc(sizeof(LNode)); //创建头结点
	for (; n>0; n--) { //创建n个结点链表
		s=(LinkList)malloc(sizeof(LNode)); //创建新结点
		s->data=A[n-1]; //调用input输入数据域
		p->next=s, p=s; //将s插入到当前链表末尾
	}
	p->next=NULL; //尾结点
}
int ListInsert(LinkList *L,int e)
{	//在链表中按照顺序插入元素e
	LinkList s,p=*L,r=(*L)->next; //p指向头结点
	while(p!=NULL &&r!=NULL&&r->data <e) { //寻找插入位置
		p=p->next; //p指向直接后继结点
		r=r->next;
	}
	if(p==NULL) return 0; //i值不合法返回假(0)
	else{
        s=(LinkList)malloc(sizeof(LNode)); //创建新结点
        s->data=e;
        s->next=p->next, p->next=s; //结点插入算法
	}
	return 1; //操作成功返回真(1)
}

void ListTraverse(LinkList L)
{	//遍历L中的每个元素
	LinkList p=L->next; //p指向开始结点
	while(p!=NULL) { //若不是链尾继续
		printf("%d ",p->data); //调用函数visit()访问结点
		p=p->next; //p指向直接后继结点
	}
}

int main()
{
     LinkList H;
     int A[9]={10,9, 8,6,5,4,3,2,1};
     CreateLinkR(&H,9,A);
     int n;
     scanf("%d",&n);
     ListInsert(&H,n);
     ListTraverse(H);
     return 0;
}

个人答案

#include <stdio.h>
#include <stdlib.h>
 
#define N 9
 
struct LNode
{  	  		   	 
    int data;
    struct LNode *next;
} ;

struct LNode* create_rear(int a[], int n)
{  	  		   	 
    /*新建一个链表h,每个结点依次插入到链尾,将链表的头指针返回 */
    struct LNode *h = NULL;
    struct LNode *s, *r; /*用s指向要插入结点,r指向链表的尾结点*/
    int i;
 
    for (i = 0; i < n; i++)
    {  	  		   	 
        s = (struct LNode *)malloc(sizeof(struct LNode));
        s->data = a[i];
        s->next = NULL;
        if (h == NULL)
            h = s;  /*如果链表为空,则头指针h指向s*/
        else
            r->next = s;    /*否则将s链接到尾结点r之后*/
        r = s;            /*将r指向尾结点*/
    }
    return h;  /*返回链表的头指针*/
}  	  		   	 
 
void output(struct LNode *h)
{  	  		   	 
    /*将链表h的各个结点的数据域依次输出,即遍历该链表*/
    struct LNode *p = h;/*从第一个结点开始,用p依次指向各个结点*/
    while (p)
    {  	  		   	 
        /*只要p是一个非空结点,则输出其数据域,然后将p后移*/
        printf("%d ", p->data);
        p = p->next;  //将p后移
    }
    printf("\n");
}  	  		   	 
 
struct LNode* insert_sort(struct LNode* h, int x)
{  	  		   	 
    //返回头指针。
    struct LNode *s, *pre, *p;//s表示插入结点,pre为p的前驱
    s = (struct LNode *)malloc(sizeof(struct LNode));
    s->data = x;
 
    if (h == NULL)
    {  	  		   	 
        
        s->next = NULL;
        h = s;
    }
    if (x <= h->data)
    {  	  		   	 
        //防止x不大于链表中第一个结点的数据域,将s插入链首
        s->next = h;
        h = s;
    }
    else
    {  	  		   	 
        p = h;
        while (p && x > p->data)
        {  	  		   	 
            //果p不空,且x不大于p所指结点的数据域,p后移,pre为p的前驱
            pre = p;
            p = p->next;
        }
        //将s插入到pre所指结点之后。
        s->next = pre->next;
        pre->next = s;
    }
    return h;
} 
 

 
int main()
{  	  		   	 
    int i, x;
    struct LNode* head;
    int a[]={1,2,3,4,5,6,8,9,10};//初始化
 
    
//    for (i = 0; i < N; i++)
//        scanf("%d", &a[i]); 原来题目直接初始化...
    
 
    //创建链表并利用数组初始化
    head = create_rear(a, N);
 
    scanf("%d", &x);
    //插入x
    head = insert_sort(head, x);
    
    //调用函数输出
    output(head);
 
    return 0;
}  	  		   	 
 
 	  	

第四题

计算日期是当年的第几天

定义一个结构体变量(包括年、月、日)。计算该日在本年中是第几天,注意闰年问题

分析:复习一下闰年判断:能被4整除但不能被100整除 或者能被400整除

老师答案:

#include  "stdio.h"
struct {
	int year;
	int month;
	int day;
} date;
int main() {
	int i,days;
	int day_tab[13]= {0,31,28,31,30,31,30,31,31,30,31,30,31};
	
	scanf("%d %d %d",&date. year,&date.month,&date.day);
	days=0;
	for(i=1; i < date.month; i++)
		days=days+day_tab[i];
	days=days+date.day;
	if((date.year%4==0 && date.year%100!=0 || date.year%400==0) && date.month>=3)
		days=days+1;
	printf("%d/%d is the %dth day in %d.\n",date.month,date.day,days,date.year);
	return 0;
}

个人答案:

# include<stdio.h>
struct Date
{
	int year;
	int month;
	int day;
}Date1;
int main()
{
	int m,n=0,i,j,k,flag=0;
	scanf("%d %d %d",&Date1.year,&Date1.month,&Date1.day);
	if(Date1.year%4==0)  //判断闰年问题
	{
		if(Date1.year%100!=0)
		{
			flag=1;
		}
	}
	if(Date1.year%400==0)
	{
		flag=1;
	}
	for(i=1;i<Date1.month;i++)  //天数的累加
	{
      //老师用数组存月份天数 我用swicth吧
			switch(i)
		{
			case 1:
			case 3:
			case 5:
			case 7:
			case 8:
			case 10:
			case 12: m=31;break;
			case 4:
			case 6:
			case 9:
			case 11: m=30;break;
		 } 
		 if(i==2)
		 {
		 	if(flag)
		 	{
		 		m=29;
			 }
			 else
			 {
			 	m=28;
			 }
		  } 
	 n+=m;
	}
	n+=Date1.day;
	 printf("%d/%d is the %dth day in %d.",Date1.month,Date1.day,n,Date1.year);
	 return 0;
}

第五题

输入10个学生数据,计算总平均成绩,以及最高分的学生数据

有5个学生,每个学生的数据包括学号、姓名、3门课程的成绩,从键盘输入10个学生数据,要求输出3门课程总平均成绩,以及最高分的学生数据(包括学号、姓名、3门课程平均成绩、平均分数)

分析:

老师答案:

#include  "stdio.h"
#define N 5
struct student {
	char num[6];
	char name[8];
	float score[3];
	float avr;
} stu[N];

int main() {
	int i,j,maxi;
	float sum,max,average;
	for (i=0; i <N; i++) {
		scanf("%s",stu[i].num);
		scanf("%s",stu[i].name);
		for (j=0; j <3; j++) {
			scanf("%f",&stu[i].score[j]);
		}
	}

	average=0;
	max=0;
	maxi=0;
	for (i=0; i <N; i++) {
		sum=0;
		for (j=0; j <3; j++)
			sum+=stu[i].score[j];
		stu[i].avr=sum/3.0;
		average+=stu[i].avr;
		if (sum>max) {
			max=sum;
			maxi=i;
		}
	}
	average/=N;

	printf("NO. name score1 score2 score3 average\n");
	for (i=0; i <N; i++) {
		printf("%s %s ",stu[i].num,stu[i].name);
		for (j=0; j <3; j++)
			printf("%.2f ",stu[i].score[j]);
		printf("%.2f\n",stu[i].avr);
	}
	printf("average=%5.2f\n",average);
	printf("The highest score is : student %s,%s\n",stu[maxi].num,stu[maxi].name);
	printf("his scores are:%6.2f,%6.2f,%6.2f,average:%5.2f.\n",stu[maxi].score[0],stu[maxi].score[1],stu[maxi].score[2],stu[maxi].avr);
	return 0;
}

个人答案:(小心卡输出

# include <stdio.h>

	struct person{
    int num;
	char name[20];
	float score;
	float score2;
	float score3;	
}; 

struct person student[5];

int main()
{   
    float average[10],allaver;//开数组存平均数
    
    float max,sum=0;
    
    int cnt;
    
	for(int i=0;i<5;i++){
	scanf("%d%s%f%f%f",&student[i].num,student[i].name,&student[i].score,&student[i].score2,&student[i].score3);
}
	printf("NO. name score1 score2 score3 average\n");
	
	struct person temp;
	
	for (int i = 0;i< 5; i++) {
		average[i] = (student[i].score+student[i].score2+student[i].score3)/3;
		
		sum+=average[i];
		if(max<average[i]){
			max=average[i];
			cnt=i;
		}
	}
	allaver=sum/5;

	for(int i=0;i<5;i++){
		struct person per = student[i];
		printf("%d %s %.2f %.2f %.2f %.2f",per.num,per.name,per.score,per.score2,per.score3,average[i]);
		printf("\n");
	}
	printf("average=%.2f\n",allaver);
	printf("The highest score is : student %d,%s\n",student[cnt].num,student[cnt].name);
	printf("his scores are:%.2f, %.2f, %.2f,average:%.2f.",student[cnt].score,student[cnt].score2,student[cnt].score3,max);

	

	return 0;
}

第六题

剔除链表中的重复数据

有两个链表a和b,设结点中包含学号、姓名。从a链表中删去与b链表中有相同学号的那些结点。 链表a= {{101,"Wang"},{102,"Li"},{105,"Zhang"},{106,"Wei"}}; 链表b= {{103,"Zhang"},{104,"Ma"},{105,"Chen"},{107,"Guo"},{108,"lui"}};

老师答案:

#include  "stdio.h"
#include  "string.h"
#define LA 4
#define LB 5
struct  student {
	int num;
	char name[8];
	struct student *next;
} a[LA],b[LB];

int main() {
	struct student a[LA]= {{101,"Wang"},{102,"Li"},{105,"Zhang"},{106,"Wei"}};
	struct student b[LB]= {{103,"Zhang"},{104,"Ma"},{105,"Chen"},{107,"Guo"},{108,"lui"}};
	int  i;
	struct student *p,*p1,*p2,*head1,*head2;

	head1=a;
	head2=b;
	printf("list A:\n");
	for (p1=head1,i=1; i <=LA; i++) {
		if(i <LA)
			p1->next=a+i;
		else
			p1->next=NULL;
		printf("%d %s\n",p1->num,p1->name);
		if(i <LA)
			p1=p1->next;
	}
	printf("list B:\n");
	for (p2=head2,i=1; i <=LB; i++) {
		if (i <LB)
			p2->next=b+i;
		else
			p2->next=NULL;
		printf("%d %s\n",p2->num,p2->name);
		if (i <LB)
			p2=p2->next;
	}

	p1=head1;
	while(p1!=NULL) {
		p2=head2;
		while ((p1->num != p2->num) && (p2->next!=NULL))
			p2=p2->next;
		if (p1->num == p2->num) {
			if (p1==head1)
				head1=p1->next;
			else {
				p->next=p1->next;
				p1=p1->next;
			}
		} else {
			p=p1;
			p1=p1->next;
		}
	}

	printf("result:\n");
	p1=head1;
	while(p1!=NULL) {
		printf("%d %s\n",p1->num,p1->name);
		p1=p1->next;
	}
	return 0;
}

个人答案:

#include <stdio.h>
typedef struct student
{
	int num;
	char name[20];
	struct student *next;
} student;
student *del(student *a, student *b)
{
	student *pre, *current, *head;
	head = a;

	while (b != NULL)
	{
		//重置指针指向a链表的头部
		pre = head;
		current = head->next;
		//a 链表的头等于b
		if (pre->num == b->num)
		{
			pre->next = NULL;
			pre = current;
			current = current->next;
			//更新表头
			head = pre;
		}
		else
		{
			while (pre->next != NULL)
			{
				if (current->num == b->num)
				{
					//找到就删除
					pre->next = current->next;
					break;
				}
				else
				{
					//否则继续遍历
					pre = pre->next;
					current = current->next;
				}
			}
		}
		b = b->next;
	}
	return head;
}

void printList(student *root)
{
	
	while (root != NULL)
	{
		printf("%d %s\n", root->num, root->name);
		root = root->next;

	}
}

int main()
{
	student a[4] = { { 101, "Wang" }, { 102, "Li" }, { 105, "Zhang" } ,{ 106, "Wei" } };
	for (int i = 0; i < 3; i++)
	{
		a[i].next = &a[i + 1];
	}
	a[3].next = NULL;
	printf("list A:\n");
	printList(&a[0]);

	student b[5] = { { 103, "Zhang" }, { 104, "Ma" }, { 105, "Chen" } , { 107, "Guo" }, { 108, "lui" }};
	for (int i = 0; i < 4; i++)
	{
		b[i].next = &b[i + 1];
	}
	b[4].next = NULL;
	printf("list B:\n");
	printList(&b[0]);
	student *combine = del(a, b);
	printf("result:\n");
	while (combine != NULL)
	{
		printf("%d %s\n", combine->num, combine->name);
		combine = combine->next;
	}

	return 0;
}

第七题

按要求实现程序

编写程序,创建一个按学号(第一个成员)升序排列的新链表并输出链表中的数据,当学号相同时保留较高的成绩。链表中每个结点的学号、成绩来自结构数组,数组中数据用测试数据初始化 {20304,75},{20311,89},{20303,62},{20304,87},{20320,79}

分析:这题我没有用链表也写出来了 老师的答案还是用了链表 代码量比我高的不是一点。。但是用链表可以练练手 还是推荐看链表写法

老师答案:

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
typedef struct node{
	long num;
	int score;
	struct node *next; 
}NODE;

NODE *creat(void){
	NODE *head=NULL,*p1=NULL,*p2=NULL;
	long num;
	int score;
	int n=0;
	while(1){
		scanf("%ld %d",&num,&score);
		if(num==0)break;
		n++;
		p1=(NODE *)malloc(sizeof(NODE));
		p1->num=num;
		p1->score=score;
		p1->next=NULL;
		if(n==1)
			head=p2=p1;
		else
			p2->next=p1;
			p2=p1;
	}
	return head;
}

NODE *insert(NODE *head,NODE *p0){
	NODE *p1=NULL,*p2=NULL;
	if(head==NULL){
		head=p0;
		p0->next=NULL;
	}
	else{
		p1=head;
		while((p0->num>p1->num)&&(p1->next!=NULL)){
			p2=p1;
			p1=p1->next;
		}
		if(p1==head&&p0->num <=p1->num){
			p0->next=head;
			head=p0;
		}
		else if(p0->num <=p1->num){
			p2->next=p0;
			p0->next=p1;
		}
		else{
			p1->next=p0;
			p0->next=NULL;
		}
	}
	return head;
}

NODE *sort(NODE *head){
	NODE *p=NULL,*temp=NULL;
	p=head->next;
	head->next=NULL;
	while(p!=NULL){
		temp=p->next;
		head=insert(head,p);
		p=temp;
	}
	return head;
}

void print(NODE *head){
	NODE *p=NULL;
	p=head;
	while(p!=NULL){
		printf("%ld %d\n",p->num,p->score);
		p=p->next;
	}
}

NODE *delNODE(NODE *head,NODE *p1,NODE *p2){
	if(p1==head){
		head=p1->next;
		free(p1);
	}
	else{
		p2->next=p1->next;
		free(p1);
	}
	return head;	
}

int main(void){
	NODE *p=NULL,*p1=NULL,*p2=NULL,*p3=NULL;
	p=creat();
	p=sort(p);
	p1=p2=p;
	while(p1!=NULL){
		p2=p1->next;
		if(p2==NULL)break;
		if(p1->num==p2->num&&p1->score <=p2->score){
			p=delNODE(p,p1,p3);
			p1=p2;
		}
		else if(p1->num==p2->num&&p1->score>p2->score){
			p=delNODE(p,p2,p1);
		}
		else{
			p3=p1;
			p1=p1->next; 
		}				
	}
	print(p);
}

个人答案:

#include<stdio.h>
struct Student {
	int number;
	int score;
} stu[99], temp;
int main() {
	int n, i, j,cnt;

	for (int i = 0; i < 5; i++) {
		scanf("%d", &stu[i].number);
	
		scanf("%d", &stu[i].score);
	}
	for (i = 0; i < 4; i++) {
		for (j = i + 1; j < 5; j++) {
				if(stu[i].number==stu[j].number){
				if(stu[i].score>stu[j].score){
					cnt=j;
				}
				else cnt=i;
			}
			if (stu[j].number < stu[i].number) {
				temp = stu[j];
				stu[j] = stu[i];
				stu[i] = temp;
			}
		
		}
	}
	
	for (int i = 0; i < 5; i++) {
		if(i!=cnt)
		printf("%d %d\n", stu[i].number, stu[i].score);
	}
	return 0;
}

第八题

比对结构体中的成绩,由高到低输出

有n个学生的信息(学号、姓名、成绩),要求按照成绩的高低输出各学生的信息 {{10101,"Zhang",78},{10103,"Wang",98.5},{10106,"Li",86},{10108,"Ling",73.5},{10110,"Fun",100}

分析:本质考的就是一个排序 把结构体中的data拿出来排序就好

老师答案:

#include  "stdio.h"
struct student {
	int num;
	char name[20];
	float score;
};
int main() {
	struct student stu[5]= {{10101,"Zhang",78},{10103,"Wang",98.5},{10106,"Li",86},
		{10108,"Ling",73.5},{10110,"Fun",100}
	};
	struct student temp;
	const int n=5;
	int i,j,k;
	for(i=0; i <n-1; i++) {
		k=i;
		for(j=i+1; j <n; j++)
			if(stu[j].score>stu[k].score)
				k=j;
		temp=stu[k];
		stu[k]=stu[i];
		stu[i]=temp;
	}
	for(i=0; i <n; i++)
		printf("%d %s %.2f\n",stu[i].num,stu[i].name,stu[i].score);
	printf("\n");
	return 0;
}

个人答案:

# include <stdio.h>

	struct person{
    int num;
	char name[20];
	float score;	
}; 


struct person student[5]={//推荐数据分开分行写 不然小心第二天拿工资
	{10101,"Zhang",78},
	{10103,"Wang",98.5},
	{10106,"Li",86},
	{10108,"Ling",73.5},
	{10110,"Fun",100}
};

int main()
{
	struct person temp;
	for (int i = 0; i < 5; i++) {
		for (int j = i + 1; j < 5; j++) {
			if (student[j].score > student[i].score) {
				temp = student[j];
				student[j] = student[i];
				student[i] = temp;
			}
		}
	}

	for(int i=0;i<5;i++){
		struct person per = student[i];//简便写法 用指针也行
		printf("%d %s %.2f",per.num,per.name,per.score);
		printf("\n");
	}

	

	return 0;
}

第九题

输出使用结构体中的数据

有3个学生的信息,放在结构体数组中,要求输出全部学生的信息 {{10101,"Li Lin",'M',18},{10102,"Zhang Fun",'M',19},{10104,"Wang Min",'F',20}}

分析:水题?水题! 把第一题代码改一改而已

老师答案:

#include  "stdio.h"
struct student {
	int num;
	char name[20];
	char sex;
	int age;
};
struct student stu[3]= {{10101,"Li Lin",'M',18},{10102,"Zhang Fun",'M',19},{10104,"Wang Min",'F',20}};

int main() {
	struct student *p;
	printf("No. Name sex age\n");
	for (p=stu; p < stu+3; p++)
		printf("%d %s %c %d\n",p->num, p->name, p->sex, p->age);
	return 0;
}

个人答案:

# include <stdio.h>

	struct person{
    int num;
	char name[20];
	char sex;
	int age;	
}; 


struct person student[3]={
	{10101,"Li Lin",'M',18},
	{10102,"Zhang Fun",'M',19},
	{10104,"Wang Min",'F',20}
};

int main()
{

	printf("No. Name sex age\n");
	for(int i=0;i<3;i++){
		struct person per = student[i];
		printf("%d %s %c %d",per.num,per.name,per.sex,per.age);
		printf("\n");
	}

	

	return 0;
}

第十题

结构题指针应用

通过指向结构体变量的指针变量输出结构体变量中成员的信息

分析:这。。。硬要我用指针 直接放弃思考 化身打表哥

老师答案

#include  "stdio.h"
#include  "string.h"
int main() {
	struct student {
		long num;
		char name[20];
		char sex;
		float score;
	};
	struct student stu_1;
	struct student * p;
	p=&stu_1;
	stu_1.num=10101;
	strcpy(stu_1.name,"Li Lin");
	stu_1.sex='M';
	stu_1.score=89.5;
	printf("No.:%ld\nname:%s\nsex:%c\nscore:%5.1f\n",stu_1.num,stu_1.name,stu_1.sex,stu_1.score);
	printf("No.:%ld\nname:%s\nsex:%c\nscore:%5.1f\n",(*p).num,(*p).name,(*p).sex, (*p).score);
	return 0;

个人答案:

# include <stdio.h>
//No.:10101
//name:Li Lin
//sex:M
//score: 89.5
//No.:10101
//name:Li Lin
//sex:M
//score: 89.5
struct person{
	int No;
	char name[20];
	char sex;
	float score;
};
struct person a={10101,"Li Lin",'M',89.5};
struct person b={10101,"Li Lin",'M',89.5};
struct person *pa=&a;
struct person *pb=&b;


int main()
{
	printf("No.:%d\n", pa->No);
    printf("name:%s\n", pa->name);
    printf("sex:%c\n", pa->sex);
    printf("score: %.1f\n", pa->score);
    printf("No.:%d\n", pb->No);
    printf("name:%s\n", pb->name);
    printf("sex:%c\n", pb->sex);
    printf("score: %.1f\n", pb->score);

	return 0;
}

OKK 作业终于做完啦 伸个懒腰~

要期末了 心力憔悴~

 

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr丶锤子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值