凉城有梦

导航

 

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!\n");
		exit(0);
	}
	while (!feof(FP))
	{
		fgets(str, 200, FP);
		for (i = 0; str[i] != '\n' && str[i] != '\0'; i++)
		{
			if (str[i] == ' ')
			{
				str[i] = '\0';
				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("输入错误,请重新输入。\n");
			 CheakUserValid(num, p);
		 }
	 }
	 return 0;
}
int UserChoice(int num, USER* p, FILE* FP)
{
	int choice;

	printf("1.登录 2.注册\n");
	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, "\n%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!\n");
		exit(0);
	}
	rewind(fp);
	while (!feof(fp))
	{
		fgets(idiomStr, 200, fp);
		for (i = 0; idiomStr[i] != '\n' && idiomStr[i] != '\0'; i++)
		{
			if (idiomStr[i] == ':')
			{
				idiomStr[i] = '\0';
				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("输入错误,请重新输入。\n");
		GetIdiom(fp, ptr);
	}
	printf("是否继续:1.继续 2.返回主页面 0.结束程序\n");
	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("欢迎来到我爱成语!\n");
	printf("请输入你的选择:1.成语词典 2.成语游戏 0.结束程序\n");
	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!\n");
		exit(0);
	}
	rewind(fp);
	while (!feof(fp))
	{
		fgets(idiomStr, 200, fp);
		for (i = 0; idiomStr[i] != '\n' && idiomStr[i] != '\0'; i++)
		{
			if (idiomStr[i] == ':')
			{
				idiomStr[i] = '\0';
				break;
			}
		}
		strcpy(ptr->name, idiomStr);
		strcpy(ptr->mean, (idiomStr + i + 1));
		ptr++;
		num++;
	}
	for (i = 0; i < num; i++)
	{
		ptr--;
	}
	if (number <= 0)
	{
		printf("输入错误,请重新输入。\n");
		IdiomGame(fp, ptr);
	}
	
	for (i = 1; i <= number; i++)
	{
		printf("第%d题\n", i);
		GetTopic(ptr,number);
	}
	//printf("本次题目你做对了%d题!\n", count);
	printf("是否继续:1.继续 2.返回主页面 0.结束程序\n");
	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] = '\0';
		
	}
	
	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("\n");
		printf("请输入完整成语:\n");
		scanf("%s", &Name.name);
		if (strcmp(Name.name, name) == 0)
		{
			printf("答案正确!\n");
		}
		else
		{
			printf("答案错误,正确答案是:%s\n",name);
		}
	return 0;
}

2.2.运行结果

1.登录界面


2.游戏界面


3.排名界面
没弄好

2.3大作业总结

1.碰到问题及解决办法

posted on 2019-12-15 22:17  凉城有梦  阅读(188)  评论(1编辑  收藏  举报