凉城有梦

导航

 

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  凉城有梦  阅读(273)  评论(1)    收藏  举报