• c博客06-2019-结构体&文件


    1.本章学习总结

    1.1 学习内容总结

    1.结构的定义
     结构类型定义的一般形式为:
        struct 结构名{
            类型名 结构成员1;
            类型名 结构成员2;
            ······
            类型名 结构成员n;
         };
     例如:
     ```
      struct USER
      {
    char account[100];
    char  password[200];
      };
     ```
    2.结构的嵌套定义
     先定义成员的结构类型,再定义主结构类型。
     例如:
     ```
        struct address{
          char city[10];
          char street[20];
        };
        struct nest_student{
          int num;
          char name[10];
          struct address addr;
        };
     ```
    3.结构变量的定义和初始化
     (1)单独定义
        先定义一个结构类型,再定义这种结构类型的变量。
     (2)混合定义
        在定义结构类型的同时定义结构变量。
        一般形式为:
        struct 结构名{
            类型名 结构成员1;
            类型名 结构成员2;
            ······
            类型名 结构成员n;
         }结构变量名表;
        例如:
     ```
        struct student {
          int num;
          char name[10];
          int computer,english,math;
        }s1,s2;
     ```
     (3)无类型名定义
        在定义结构变量的同时省略结构名。
        一般形式为:
        struct {
            类型名 结构成员1;
            类型名 结构成员2;
            ······
            类型名 结构成员n;
         }结构变量名表;
        例如:
     ```
        struct {
          int num;
          char name[10];
          int computer,english,math;
        }s1,s2;
     ```
     (4)初始化
        结构变量也可初始化,即在定义时对其赋初值。例如:
            struct student s1={101,"zhang",78,87,79};
    4.结构变量的使用
     (1)结构变量成员的引用
        在c语言中,使用结构成员操作符“.”来引用结构成员,格式为:
            结构变量名.结构成员名
        注:和一般运算符混合运算时,结构成员运算符优先。
     (2)结构变量的整体赋值
        只有相同结构类型的变量之间才可以直接赋值。
     (3)结构变量作为函数参数
        特定:可以传递多个数据且参数形式较简单。
    5.结构数组操作
    (1)定义
        与结构变量相似,例如:
           struct student students [50];
     (2) 初始化
        定义的同时可以初始化,格式与二维数组类似。例如:
            struct student students [50] = {{101,"zhang",78,87,79},{102,"wang",83,92,78}};
     (3) 引用
        通过使用数组下标与结构成员操作符“.”相结合的方式来实现的,一般格式为:
        结构数组名 [下标].结构成员名
     (4)排序做法
        选择排序:
        伪代码:
        ```
            for 0 to n-1
                index=i;
                for j=i to n
                    比较数组i元素和数组index元素的大小,index=j;
                交换数组元素;
            end for
        ```
        代码:
        ```
            for(i=0;i<n-1;i++)
            {
                index=i;
                for(j=i+1;j<n;j++)
                {
                                                                                          if(students[j].average>students[index].average)
                     index=j;
                }
                teemp=students[index];
                students[index]=students[i];
                students[i]=temp;
            }
        ```
     6.结构指针
     (1)概念
        结构指针就是指向结构变量类型的指针。结构指针的值实际上是结构变量的首地址,即第一个成员的地址。
        a.用*p访问结构成员
          如:(*p).num=101;
            *p表示的是p指向的结构变量。
        b.用指向运算符->访问指针指向的结构成员
          如:p->num=101;
     (2)作为函数参数
          使用结构指针作为函数参数只要传递一个地址值,提高了参数传递的效率。
     7.共用体
        指使用同一段内存单元存放不同类型的变量,或者说使几个不同的变量共享同一段内存的结构,称为“共用体”类型的结构,声明与定义如下:
        ```
            union date{
                int num;
                char ch;
                doudle fu;
            };
            union date a,b,c;
        ```
     8.枚举类型
        定义:是指将变量的值一一列出来,变量的值只限于列举出来的值的范围内.
        一般格式为:enum 枚举名{枚举值1,枚举值2,···} 变量列表;
        枚举变量声明与赋值: 定义枚举类型后,可以声明该枚举类型的变量,然后使用该变量存储枚举元素的数值.
        声明枚举:enum 枚举名 变量列表;
        枚举变量:指用枚举类型定义的变量.变量和参数都可以定义为枚举类型.过程的返回值也可以是枚举类型.
     9.文件的概念
        文件系统功能是操作系统的重要功能和组成部分。
     10.文件结构与文件类型指针
      (1)文件结构与自定义类型typedef
        FILE类型是用typedef重命名的,在头文件stdio.h中定义。
        自定义类型的一般格式为:
            typedef <已有类型名><新类型名>;
            如:typedef int INTEGER;
      (2)文件类型指针
        定义文件类型指针的格式为:FILE *fp;
        c程序只使用文件指针fp,用fp代表文件整体。
        文件操作具有顺序性的特点。
     11.打开文件和关闭文件
      (1)打开文件
        一般调用形式:fopen("文件名","文件打开方式");
        文件打开方式:
        "r" 打开文本文件进行只读;"rb" 打开二进制文件进行只读
        "w" 建立新文本文件进行只写;"wb" 建立二进制文件进行只写
        "a" 打开文本文件进行追加;"ab" 打开二进制文件进行写/追加
        "r+" 打开文本文件进行读/写;"rb+" 打开二进制文件进行读/写
        "w+" 建立新文本文件进行读/写;"wb+" 建立二进制新文件进行读/写
        "a+" 打开文本文件进行读/写/追加;"ab+" 打开二进制文件进行读/写/追加
      (2)关闭文件
         一般调用形式:fclose (文件指针)
     12.文件读写
      (1)字符方式文件读写函数
            ch=fgetc(fp)  getchar()
            fputc(ch,fp)  putchar(ch)
      (2)字符串方式文件读写函数
            fputs(s,fp)
            fgets(s,n,fp)
      (3)格式化方式文件读写函数
            fscanf(文件指针,格式字符串,输入表);
            fprintf(文件指针,格式字符串,输出表);
      (3)数据块方式文件读写函数
            fread(buffer,size,count,fp);
            fwrite(buffer,size,count,fp);
     13.其他相关函数
       (1)重定位文件首函数
            rewind (FILE *fp);
       (2)指针移动控制函数
            fseek (fp,offset,from);
       (3)获取指针当前位置函数
            ftell (文件指针);
       (4)文件末尾检测函数
            feof (fp);
       (5)读写错误检查函数
            ferrof (文件指针);
       (6)出错标记函数
            clearer (文件指针)
    

    1.2 本章学习体会

    1.学会了结构体和文件的基本操作,对于这些内容基本掌握了,并在大作业中得到了运用,但还不是很熟悉。有点难!
    2.代码量:900行
    

    2.综合作业--“我爱成语”

    2.1文件介绍

    2.1.1头文件介绍

    user.h
    定义用户结构体

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<time.h>
    
    typedef struct
    {
    	char account[100];
    	char  password[200];
    }USER;
    

    得到用户信息,用户登录,用户注册,用户选择

    int GetUserValid(FILE* FP, USER* p);
    int CheakUserValid(int num, USER* p);
    void UserLogin(FILE* FP, USER* p,int num);
    int UserChoice(int num, USER* p, FILE* FP);
    

    idiom.h
    定义成语结构体

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<time.h>
    typedef struct
    {
    	char name[12];
    	char mean[200];
    }IDIOM;
    

    得到成语信息,菜单,成语游戏,游戏选择

    int GetIdiom(FILE* fp, IDIOM* ptr);
    int ListMenu(FILE* fp, IDIOM* ptr);
    int IdiomGame(FILE* fp, IDIOM* ptr);
    int GetTopic(IDIOM* ptr, int number);
    

    2.1.2函数实现文件介绍。

    idiomMain.cpp
    定义全局变量,调用函数实现其功能

    #include"idiom.h"
    #include"user.h"
    int main(void)
    {
    	srand(time(NULL));
    	FILE* fp;
    	FILE* FP;
    	IDIOM idiom[200];
    	int count = 0;
    	USER *p;
    	IDIOM *ptr;
    	int num=0;/*成语总数*/
    
    	fp = fopen("idiom.txt", "r");
    	FP = fopen("user.txt", "a+");
    	p = (USER*)malloc(20 * sizeof(USER));
    	ptr = (IDIOM*)malloc(200 * sizeof(IDIOM));
    	num = GetUserValid(FP, p);
    	UserChoice(num, p, FP);
    	ListMenu(fp,ptr);
    
    	return 0;
    }
    

    checkuser.cpp
    获取用户信息,用户登录信息比较,用户选择,用户注册

    #include"user.h"
    #include"idiom.h"
    int GetUserValid(FILE *FP, USER *p)
    {
    	int i;
    	int num = 0;
    	char str[200];
    	int cheak = 0;
    	FP = fopen("user.txt", "r");
    	if (FP == NULL)
    	{
    		printf("File open error!
    ");
    		exit(0);
    	}
    	while (!feof(FP))
    	{
    		fgets(str, 200, FP);
    		for (i = 0; str[i] != '
    ' && str[i] != ''; i++)
    		{
    			if (str[i] == ' ')
    			{
    				str[i] = '';
    				break;
    			}
    		}
    		strcpy(p->account, str);
    		strcpy(p->password, (str + i + 1));
    		p++;
    		num++;
    	}
    	for (i = 0; i < num; i++)
    	{
    		p--;
    	}
    	return num;
    }
    int CheakUserValid(int num, USER* p)/*用户登录*/
    {
    	 USER su;
    	 int i;
    	 int flag=0;
    	 printf("请输入你的账号:");
    	 scanf("%s", &su.account);
    	 printf("请输入你的密码:");
    	 scanf("%s", &su.password);
    	 for (i = 0; i < num; i++)
    	 {
    		 if (strcmp(su.account, p->account) == 0 && strcmp(su.password, p->password) == 0)
    		 {
    			 flag=1;
    		 }
    		 p++;
    	 }
    	 while (1)
    	 {
    		 if (flag == 1)
    		 {
    			 break;
    		 }
    		 else if (flag == 0)
    		 {
    			 system("cls");
    			 printf("输入错误,请重新输入。
    ");
    			 CheakUserValid(num, p);
    		 }
    	 }
    	 return 0;
    }
    int UserChoice(int num, USER* p, FILE* FP)
    {
    	int choice;
    
    	printf("1.登录 2.注册
    ");
    	scanf("%d", &choice);
    	switch (choice)
    	{
    	case 1:
    		CheakUserValid(num, p);
    		break;
    	case 2:
    		UserLogin(FP,p,num);
    		return 0;
    		
    	}
    	return 0;
    }
    void UserLogin(FILE* FP, USER* p,int num )/*用户注册*/
    {
    	USER su;
    	int i;
    	int flag = 0;
    	printf("请输入你的账号:");
    	scanf("%s", &p->account);
    	printf("请输入你的密码:");
    	scanf(" %s", &p->password);
    
    	fprintf(FP, "
    %s %s", &p->account, &p->password);
    	
    }
    

    idiom.cpp
    读取成语信息,实现成语词典功能;菜单函数,供用户选择;实现成语填空游戏;得到成语填空题目并检测答案是否正确

    #include"idiom.h"
    int GetIdiom(FILE* fp, IDIOM* ptr)
    {
    	char idiomStr[200];
    	int i;
    	int num=0;
    	IDIOM idiom;
    	int choice;
    	printf("请输入你的成语: ");
    	scanf("%s", idiom.name);
    	getchar();
    	if (fp == NULL)
    	{
    		printf("File open error!
    ");
    		exit(0);
    	}
    	rewind(fp);
    	while (!feof(fp))
    	{
    		fgets(idiomStr, 200, fp);
    		for (i = 0; idiomStr[i] != '
    ' && idiomStr[i] != ''; i++)
    		{
    			if (idiomStr[i] == ':')
    			{
    				idiomStr[i] = '';
    				break;
    			}
    		}
    		strcpy(ptr->name, idiomStr);
    		strcpy(ptr->mean, (idiomStr + i + 1));
    		ptr++;
    		num++;
    	}
    	for (i = 0; i < num; i++)
    	{
    		ptr--;
    	}
    
    	for (i = 0; i < num; i++)
    	{
    		if (strcmp(idiom.name, ptr[i].name) == 0)
    		{
    			printf("%s:%s", idiom.name,ptr[i].mean);
    			break;
    		}
    	}
    	if (i==num)
    	{
    		printf("输入错误,请重新输入。
    ");
    		GetIdiom(fp, ptr);
    	}
    	printf("是否继续:1.继续 2.返回主页面 0.结束程序
    ");
    	scanf("%d", &choice);
    	switch (choice)
    	{
    	case 1:
    		GetIdiom(fp, ptr);
    		break;
    	case 2:
    		ListMenu(fp, ptr);
    	case 0:
    		return 0;
    		break;
    	}
    	return 0;
    }
    int ListMenu( FILE* fp, IDIOM* ptr)
    {
    	int choice;
    	system("cls");
    	printf("欢迎来到我爱成语!
    ");
    	printf("请输入你的选择:1.成语词典 2.成语游戏 0.结束程序
    ");
    	scanf("%d", &choice);
    	switch (choice)
    	{
    	case 1:
    		GetIdiom(fp, ptr);
    		break;
    	case 2:
    		IdiomGame(fp, ptr);
    		break;
    	case 0:
    		return 0;
    	}
    	return 0;
    }
    int IdiomGame(FILE* fp, IDIOM* ptr)/*成语游戏*/
    {
    	int choice;
    	char idiomStr[200];
    	int i;
    	int number;
    	int num = 0;
    	IDIOM idiom;
    
    	printf("请选择题量:");
    	scanf("%d", &number);
    	if (fp == NULL)
    	{
    		printf("File open error!
    ");
    		exit(0);
    	}
    	rewind(fp);
    	while (!feof(fp))
    	{
    		fgets(idiomStr, 200, fp);
    		for (i = 0; idiomStr[i] != '
    ' && idiomStr[i] != ''; i++)
    		{
    			if (idiomStr[i] == ':')
    			{
    				idiomStr[i] = '';
    				break;
    			}
    		}
    		strcpy(ptr->name, idiomStr);
    		strcpy(ptr->mean, (idiomStr + i + 1));
    		ptr++;
    		num++;
    	}
    	for (i = 0; i < num; i++)
    	{
    		ptr--;
    	}
    	if (number <= 0)
    	{
    		printf("输入错误,请重新输入。
    ");
    		IdiomGame(fp, ptr);
    	}
    	
    	for (i = 1; i <= number; i++)
    	{
    		printf("第%d题
    ", i);
    		GetTopic(ptr,number);
    	}
    	//printf("本次题目你做对了%d题!
    ", count);
    	printf("是否继续:1.继续 2.返回主页面 0.结束程序
    ");
    	scanf("%d", &choice);
    	switch (choice)
    	{
    	case 1:
    		system("cls");
    		IdiomGame(fp, ptr);
    		break;
    	case 2:
    		ListMenu(fp, ptr);
    	case 0:
    		break;
    
    	}
    	return 1;
    }
    int GetTopic(IDIOM* ptr, int number)/*得到游戏题目*/
    {
    	
    	int i,j,k=0;
    	int b;
    	char name[10];
    	IDIOM Name;
    	char idiom[5][3];
    	int a,c;
    	b = rand() % 55;
    	strcpy(name, (ptr + b)->name);
    	for (i = 1; i < 5; i++)
    	{
    		for (j = 0; j <2; j++)
    		{
    			idiom[i][j] = name[k++];
    		}
    		idiom[i][j] = '';
    		
    	}
    	
    	do
    	{
    		a = rand() % 4 + 1;
    		c = rand() % 4 + 1;
    	} while (a == c);
    	for (i = 1;i < 5; i++)
    	{
    		if (i == a || i == c)
    		{
    			printf("( )", idiom[i]);
    		}
    		else
    		{
    			printf("%s", idiom[i]);
    		}
    	}
    	printf("
    ");
    		printf("请输入完整成语:
    ");
    		scanf("%s", &Name.name);
    		if (strcmp(Name.name, name) == 0)
    		{
    			printf("答案正确!
    ");
    		}
    		else
    		{
    			printf("答案错误,正确答案是:%s
    ",name);
    		}
    	return 0;
    }
    

    2.2.运行结果

    1.登录界面


    2.游戏界面


    3.排名界面
    没弄好

    2.3大作业总结

    1.碰到问题及解决办法

  • 相关阅读:
    Binary Search Tree Iterator 解答
    Invert Binary Tree 解答
    Min Stack 解答
    Trapping Raining Water 解答
    Candy 解答
    Jump Game II 解答
    Implement Hash Map Using Primitive Types
    Gas Station 解答
    Bucket Sort
    HashMap 专题
  • 原文地址:https://www.cnblogs.com/201218zx/p/12045144.html
Copyright © 2020-2023  润新知