zoukankan      html  css  js  c++  java
  • 第九章 结构体与共用体

    C程序设计实验报告

    实验项目:

    9.3.1 结构体变量的应用
    9.3.2 结构体数组的应用
    9.3.3 共用体的应用
    9.3.4 结构体指针的应用

    姓名:王锦辉 实验地点: 514实验室 实验时间:2019年6月26日


    一、实验目的与要求

    9.3.1 结构体变量的应用
    • 定义结构体类型struct date,它含有年、月、日3个成员;
    • 定义struct date类型的变量,并从键盘输入初值;
    • 利用循环语句,计算天数;
    • 利用分支结构,判断闰年。
    9.3.2 结构体数组的应用
    • 定义候选人struct person结构体数组,含有姓名、得票数两个成员;
    • 定义struct person结构体数组,人数自定,初始票数为0;
    • 利用循环输入候选人名字,该人员票数加1;
    • 输入的候选人不是规定的候选人时,相当于废票,不累计。
    9.3.3 共用体的应用
    • 定义结构体类型,其成员有编号、姓名、职业和班级(或职务);
    • 定义该结构体类型的数组,可有若干个数组元素;
    • 利用该循环语句输入每条记录的数据,若该记录的职业为‘s’,则该记录是学生,输入该学生的班级;若该记录的职业是’t‘,则该记录是教师的,输入该教师的职务;
    • 根据记录的职业来判断,使用哪个printf()语句输出记录。
    9.3.4 结构体指针的应用
    • 定义结构体类型,其成员有人员编号、下一人员编号(地址);
    • 定义该结构体类型的数组,可有n个数组元素;
    • n个人围成一圈,可以考虑用结构体数组元素中的“下一人员编号”来实现,但最后一个元素的“下一人员编号”指向第一个。

    二、实验内容

    1、实验9.3.1

    1、问题的简单描述:试利用结构体类型描述年、月、日,输入一个日期,统计该日期是该年度第多少天。

    流程图如图所示:

    2、实验代码:

    #include<stdio.h>
    main()
    {
    	struct date
    	{
    		int year,month,day;
    	}a;
    	int i,days=0;
    	printf("输入年,月,日:");
    	scanf("%d,%d,%d",&a.year,&a.month,&a.day);
    	for(i=1;i<a.month;i++)
    	{
    		if(i==1||i==3||i==5||i==7||i==8||i==10)
    		{
    			days+=31;
    		}
    		else if(i==4||i==6||i==9||i==11)
    		{
    			days+=30;
    		}
    		else if(a.year%4==0&&a.year%100!=0)
    		{
    			days+=29;
    		}	
    		else 
    		{
    			days+=28;
    		}
    	 } 
    	days+=a.day;
    	printf("%d年%d月%d日是该年的第%d天",a.year,a.month,a.day,days);
    }
    

    附图

    3、问题分析:这道题刚开始没有将days定义为0天,导致输出结果总会多一天。

    2、实验9.3.2

    1、问题的简单描述:在选举中,假设有6位候选人,有10个人参加投票(只能对一位候选人投票),用结构体数据统计各候选人的得票数。

    流程图如图所示:

    2、实验代码:

    #include<stdio.h>
    #include<string.h>
    struct preson
    {
    	char name[20];
    	int count;
    }a[6]={"zhang",0,"li",0,"wang",0,"zhao",0,"liu",0,"zhu",0};
    main()
    {
    	int i,j;
    	char abc[20];
    	for(i=1;i<=10;i++)
    	{
    		printf("请输入候选人名字:");
    		scanf("%s",abc);	
    	    for(j=0;j<6;j++)
    	    {
    	    	if(strcmp(abc,a[j].name)==0)
    	    	a[j].count++;
    		}
        }
    	for(j=0;j<6;j++)
    	{
    		printf("%s:%d
    ",a[j].name,a[j].count);
    	}
    }
    

    附图

    3、问题分析:这道题目刚开始没有用strcmp函数所以问题很难解决。

    3、实验9.3.3

    1、问题的简单描述:编写程序填写表格。从键盘输入学生和教师的信息,若是学生,则班级职务栏填写班级;若是教师,则班级职务栏填写职称。

    流程图如图所示:

    2.实验代码:

    #include"stdio.h"
    #include<stdlib.h>
    struct 
    {
        int number;
        char name[10];
        char job;
        union
        {   int classes;
            char position[10];
        }category;
    }person[2];
    main()
        { int i;
        for(i=0;i<2;i++)
        {
            fflush(stdin);
            scanf("%c,%d,%s",&person[i].job,&person[i].number,person[i].name );
            if(person[i].job=='s')
            {
                printf("请输入班级
    "); 
                scanf("%d",&person[i].category.classes);
            }
                
            else if(person[i].job=='t')
            {
                printf("请输入职业
    ");
                scanf("%s",person[i].category.position);
            }
            else
                { 
                  printf("input error!");
                  abort();
                  return 0;
                }
         } 
         printf("
    ");
         printf("编号   姓名   职业   班级/职务
    ");
         for(i=0;i<2;i++)
         {
              if(person[i].job=='s')
                 printf("%d  %s  %c   %d
    ",person[i].number,person[i].name,person[i].job,person[i].category.classes);
             else
                printf("%d  %s  %c   %s
    ",person[i].number,person[i].name,person[i].job,person[i].category.position);
    
         }
        }
    

    附图

    3、问题分析:这个实验要把*name改成name【10】才能正确输出。

    4、实验9.3.4

    1、问题的简单描述:n个人围成一个圈,从第s个人开始按顺时钟1,2,3,...,m的顺序报数,数到m的人出圈,然后从出圈的下一个人开始重复此过程,输出所有出圈人的顺序,n,s,m从键盘输入。

    流程图如图所示:

    2.实验代码:

    #include<stdio.h>
    #define N 10
    struct child
    {
        int no;
        int next;
    };
    struct child link[N]; 
    main()
    {
        int i,n,m,s,count,h;
        printf("输入围圈人数,出圈报数,开始报数位置:");
        scanf("%d,%d,%d",&n,&m,&s);
        for(i=1;i<=n;i++)
        {
            if(i==n)
                link[i].next=1;
            else
                link[i].next=i+1;
                link[i].no=i;
         }
         count=0;
         if(s==1)
         h=n;
         else h=s-1;
         printf("出圈顺序为:");
         while(m<n-1)
         {
             i=0;
             while(i!=m)
             {
                 h=link[h].next;
                 if(link[h].no)
                 i++;
             }
             printf("%d, ",link[h].no);
             link[h].no=0;
             count++;
         }
         for(i=1;i<=n;i++)
         if(link[i].no!=0)
         printf("最后留在圈中的人数为%d",link[h].next);
     } 
    

    附图

    3、问题分析:这个实验按照流程图很快就能解决。


    三、实验总结

           这次实验时间比较短,我在课上只完成了前两个实验。我认为学的基础还是不算牢靠,导致我在很多情况时并不能很好地将问题解决,而且还有许多的知识点没有掌握,往后我会尽量将短处补齐的。
  • 相关阅读:
    定义类和类的实例化
    python学习第二天-文件的读写
    python学习第二天 pyhon字符串操作
    PYTHON的元组和字典丶深拷贝丶浅拷贝丶集合的常用操作方法
    python 数组的常识操作和切片
    Python字符串、集合练习_密码校验
    Python字典练习_注册校验
    获取随机的字符串
    PHP 阿拉伯数字转中文表述
    小程序发送验证码倒计时
  • 原文地址:https://www.cnblogs.com/chenxiqiming/p/11111156.html
Copyright © 2011-2022 走看看