zoukankan      html  css  js  c++  java
  • C语言博客作业--结构体,文件

    1.本章学习总结(2分)

    1.1 学习内容总结

    (1)结构体如何定义、成员如何赋值

    结构体的一般形式为:
         struct  结构体名
        {
         数据类型   成员名1;
         数据类型   成员名2;
         :
         数据类型   成员名n;
         };
    

    a.结构体的定义及赋值:
    先定义结构体类型再定义变量名,这是C语言中定义结构体类型变量最常见的方式。

          struct 结构体名
         {
                 成员列表;
         };
         struct 结构体名 变量名;
    

    b.直接定义结构类型变量:

    struct      //没有结构体名
     {
           成员列表;
     }变量名;
    /*这是第一类结构体的形式,有结构体名,有结构体变量*/
    struct str2{
    int a;
    int b;
    };
    /* 这是第二类结构体的形式,有结构体名,无结构体变量 */
    typedef struct {
    int a;
    int b;
    }STR3;
    /* 这是第三类结构体的形式,把结构体重定义为STR3 */
    typedef struct str4{
    int a;
    int b;
    }STR4;
    

    (2) 结构体数组排序做法
    在对结构体数组排序时,首先确定排序数组的关键字,并且在排序过程中不是交换关键字的顺序,而是交换这个结构的地址,从而使结构体数组有序。举个例子:

    #include<stdio.h>
    typedef struct {           //结构体 定义时尽量放main()外面---方便 
    	int grade;
    	int age;
    	char name[10];
    }Student;
    
    int main()
    {
    	int i, j;
    	Student temp;
    
    	Student student[3] = {
    	{550,19,"小红"},
    	{700,20,"tom"},
    	};
    
    	
    	Student* p = student;
    	for (i = 1; i <= 2; i++)
    	{
    		for (j = 0; j <= 3 - i - 1; j++)//大-->小 
    		{
    			if ((p + j)->grade < (p + j + 1)->grade)
    			{
    				temp = *(p + j);
    				*(p + j) = *(p + j + 1);
    				*(p + j + 1) = temp;//注意 temp 的类型为Student 
    
    			 /*
    			 temp=(p+j)->grade;
    			    (p+j)->grade = (p+j+1)->grade;
    			    (p+j+1)->grade = temp;
    			       错误代码 why? 注意 整体交换 
    			 */
    			}
    		}
    	}
    
    	/*以表的形式输出*/
    	printf("姓名    年龄    分数  
    
    ");//表头 
    	for (i = 0; i <= 2; i++)
    	{
    		printf("%-4s   %4d     %4d
    ", (p + i)->name, (p + i)->age, (p + i)->grade);
    	}
    
    	getchar();
    	return 0;
    
    

    (3)结构体指针怎么用
    应该注意,结构体和结构体变量是两个不同的概念:结构体是一种数据类型,是一种创建变量的模板,编译器不会为它分配内存空间,就像 int、float、char 这些关键字本身不占用内存一样;结构体变量才包含实实在在的数据,才需要内存来存储.
    定义指向结构体类型变量的指针变量:

    struct stu *p1, *p2 ;
    

    定义指针变量p1、p2,分别指向结构体类型变量。引用形式为:指针变量→成员;做一个简单的应用吧。输入一个结构体类型变量的成员,并输出:

    #include <stdlib.h> 
    #include<stdio.h>
    struct data
    {
    	int day;
    	int month;
    	int year;
    };
    struct stu
    {
    	char name[20];
    	long num;
    	struct data birthday;
    };
    int main()
    {
    	struct stu* student;
    	student = (stu*)malloc(sizeof(struct stu));
    	printf("Input name,number,year,month,day:
    ");
    	scanf("%s", student->name);
    	scanf("%ld", &student->num);
    	scanf("%d%d%d", &student->birthday.year, &student->birthday.month, &student->birthday.day);
    	printf("
    Outputname,number,year,month,day
    ");
    	/*打印输出各成员项的值*/
    	printf("%20s%10ld%10d//%d//%d
    ", student->name, student->num, student->birthday.year, student->birthday.month, student->birthday.day);
    }
    

    程序中使用结构体类型指针引用结构体变量的成员,需要通过C提供的函数malloc()来为指针分配安全的地址。函数sizeof()返回值是计算给定数据类型所占内存的字节数。
    指针所指各成员形式为:
    student->name
    student->num
    student->birthday.year
    student->birthday.month
    student->birthday.day

    • 共用体、枚举类型做法

      共用体是一种多变量共享存储空间的构造类型,它允许几种不同的变量共用同一存储空间。共用体和结构体的区别:1.结构体每一位成员都用来表示一种具体事务的属性,共用体成员可以表示多种属性(同一存储空间可以存储不同类型的数据)。结构体总空间大小,等于各成员总长度,共用体空间等于最大成员占据的空间。共用体不能赋初值。
      枚举类型是指变量的值可以全部列出,定义一个枚举变量后,变量的值确定在定义之中。它和结构体、共用体的区别在于,枚举元素是常量,只能在定义阶段赋值。

    • 文件读写,文件中数据如何读进结构体数组

    1.2 本章学习体会

    • 学习体会:本章的学习个人认为比较的综合,也比较难。刚开始学习的的时候不是太懂。但是通过做这个大作业,我把之前不懂得地方进行了巩固,学习到了很多东西。所以,学习C的过程就是要理论与实际相结合的过程。实际操作的部分更重要。我记得网络工程导论曹老师说过一句话,学任何的科目,不管会不会,先做起来,在过程中遇见不会的问题继续学习,这样才会真正学到知识。这次大作业,确实也是这个样子;
    • 代码量 1602

    2.综合作业--“我爱成语”(8分)

    2.1.文件介绍

    2.1.1头文件介绍

    • 头文件LoginCheck.h
      介绍头文件有哪些结构体及函数声明,他们的功能是什么?可以列表格,更清晰直观
    结构体名 结构体功能
    typedef struct SYSUSER 分别储存文本中的用户名信息和他的密码
    函数名 函数功能
    void LoginInterface(SYSUSER IdiomLover,FILE *fp); 登录界面;
    int CheckUser(SYSUSER IdiomLover,FILE *fp); 使用者账号密码验证;

    头文件代码截图

    • 头文件HandleInformation.h
      介绍头文件有哪些结构体及函数声明,他们的功能是什么?可以列表格,更清晰直观
    结构体名 结构体功能
    typedef struct IDIOM 分别储存文本中的成语信息和他的释义
    函数声明 函数功能
    void EnterInterface(); 欢迎菜单界面;
    IDIOM* HandleIdiomDate(IDIOM idiom[], FILE* fp); 成语文件信息处理;
    int GameInterface(IDIOM *idiomPtr); 游戏界面;
    int IdiomGame(IDIOM* idiomPtr); 成语游戏模块
    char *HandleIdiom(IDIOM *idiomPtr,int i); 成语处理,就是挖空什么的;
    int CheckAnwser(char *anwser, IDIOM *idiomPtr,int i); 检查成语是否正确;
    void IdiomDictionary(IDIOM* idiomPtr); 成语字典;
    void QueryRank(); 查询排名;

    头文件代码截图

    2.2.2函数实现文件介绍。

    • 文件1:成语游戏.c
      介绍文件功能及设计思路。
      • 文件功能:main()函数所在的cpp文件,主要负责调用各部分功能模块,让程序成为一个整体;

    主要代码截图

    • 文件2:Login.c
      介绍主要函数代码及功能。
      • 文件功能:
        (1)函数代码:

    功能:登录信息界面;
    (2)函数代码:

    功能:核对用户输入的账户密码是否存在与密码文件中,从而判断是否为合法账户;

    主要代码截图

    • 文件3:idiom.c
      • 思路介绍:这一部分是整个游戏最重要的功能实现区,主要分为四个大部分;
        • (1)游戏界面信息处理;
        • (2)对于成语文件的分装处理,即将成语与他的释义分开装进结构体数组中去;
        • (3)出题系统,进行成语的挖空处理并将题目输出;
        • (4)检查配对系统,不仅对游戏题目的答案进行匹配查看是否正确,也完成成语字典的功能;
        • (5)排名查询系统;

    主要代码截图






    2.2.3运行结果

    • 1.登录界面

    • 2.游戏界面


    • 3.排名界面

    2.3大作业总结

    1.碰到问题及解决办法

    碰到的问题 解决方法
    成语进行分装的时候内存储存冲突,变量周围值被修改 “strcpy(idiom[j++].content,(str+1+i))” 改为strcpy(idiom[j].content, (str+1+i));j++;
    排名系统解决方案 正在解决中
    如何返回上级菜单 同一个函数中用goto语句,不同函数中再调用上一级函数;

    2.小结

    通过完成这一次大作业,我学会了很多的东西,将过去没有理解的东西理解清楚了。同时,我觉得做程序真的是一件快乐的事情,尤其是你的程序能成功地运行,并且功能实现的比较完整的时候。还有体验到了程序员的辛苦,害。

  • 相关阅读:
    删除IE缓存中指定的文件
    新破天一剑合区SQL(半成品)
    获取DOS命令的返回值.
    截取 a.exe 向 b.exe 传递 的启动参数
    五、Delphi 2009 泛型容器单元(Generics.Collections): TDictionary<T>
    C#结构体
    Delphi使用Zlib
    判断数据库是否存在
    去掉CodeGear的Welcome page.
    Indy10中IdMappedPortTCP的用法
  • 原文地址:https://www.cnblogs.com/shenchao123/p/12026348.html
Copyright © 2011-2022 走看看