zoukankan      html  css  js  c++  java
  • 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.碰到问题及解决办法

  • 相关阅读:
    比特币的加密算法
    区块链项目-Lisk
    以太坊(二)
    以太坊的货币发行模式
    以太坊(一)
    前端er们如何最快开发h5移动端页面?
    jQuery Ajax常用总结
    js中变量作用域
    网页引入特殊字体的几种方案
    几个有趣的WEB设备API(二)
  • 原文地址:https://www.cnblogs.com/201218zx/p/12045144.html
Copyright © 2011-2022 走看看