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.碰到问题及解决办法