问题描述
- 求改正,不知道为什么导不出文件
-
#include
#include
#include
#include
#include
#include
#include
typedef struct student
{
char name[10];
int schoolnumber;
int classnumber;
float score[10];
struct student next;
} stu,*stupt;
stupt st=NULL;//学生信息的头指针
stupt qt=NULL;//学生信息的尾指针
FILE fp;//文件指针typedef struct user
{
char logname[10];
char passwd[6];
}*userpt,user;void clear(void)//清空缓冲区函数
{
char ch;
do
{
ch=getchar();
}
while(ch!='n');
}void Printf_help()//主菜单
{
printf(" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ n");
printf(" |*尊敬的用户请您选择操作: |n");
printf(" | 1.手动输入学生作业的分数 |n");
printf(" | 2.从文件导入学生信息 |n");
printf(" | 3.输入学号,显示某位学生作业完成情况 |n");
printf(" | 4.输入班级的班号,显示该班所有学生的作业完成情况 |n");
printf(" | 5.输入学生的学号,修改该学生的各类信息 |n");
printf(" | 6.输入学生的学号,删除该学生的信息 |n");
printf(" | 7.显示各类统计信息 |n");
printf(" | 8.菜单 |n");
printf(" | 9.清屏 |n");
printf(" | a.导出至文件 |n");
printf(" | 0.退出系统 *|n");
printf(" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ n");
printf(":");
}
//1.输入成绩
void inpu(stupt p)
{
int n;
int m=0;
int flag;
while(m
{
p->score[m]=0;
m++;
}
printf("请您输入姓名:");
scanf("%s",p->name);
clear();
printf("请您输入学号:");
scanf("%d",&p->schoolnumber);
clear();
printf("请您输入班级号(如:101):");
scanf("%d",&p->classnumber);
clear();
do
{
printf("请您输入第几次作业(1~10):");
scanf("%d",&n);
clear();
printf("请您输入该次作业成绩:");
scanf("%f",&p->score[n-1]);
clear();//清空缓冲区
printf("您是否继续输入该生成绩,退出请按q,其他键继续:");
flag=getchar();
clear();//清空缓冲区堆积
}
while(flag!='q');
}void input(stupt st,stupt qt)
{
char flag;
stupt p,q;
p=q=NULL;
printf("请问您确认输入?y.是 n.取消(注意大小写)n");
while((flag=getchar())!='n')
{
clear();//清空缓冲区
if(flag=='y')
{
p=(stupt)malloc(sizeof(st));//动态申请空间
if(p==NULL)
exit(1);
inpu(p);
if(st==NULL)
st=qt=p;
else if(qt!=NULL)
{
qt->next=p; //尾指针非空(及链表已存在)接着尾指针建立链表
qt=p;
}
}
else
{
printf("温馨提示:您存在非法输入,请进入菜单界面重新选择(按8或9):");
return;
}
printf("请问您是否继续输入?y.是 n.否(注意大小写)n");
}
if(flag=='n')
{
Printf_help();
clear();
}
if(p!=NULL&&qt!=NULL)
{
qt->next=NULL;
}}
//2.导入成绩、
void read1(stupt p,FILE* fp)
{
fscanf(fp,"%s",&p->name);
fscanf(fp,"%d",&p->schoolnumber);
fscanf(fp,"%d",&p->classnumber);
fscanf(fp,"%f",&p->score[0]);
fscanf(fp,"%f",&p->score[1]);
fscanf(fp,"%f",&p->score[2]);
fscanf(fp,"%f",&p->score[3]);
fscanf(fp,"%f",&p->score[4]);
fscanf(fp,"%f",&p->score[5]);
fscanf(fp,"%f",&p->score[6]);
fscanf(fp,"%f",&p->score[7]);
fscanf(fp,"%f",&p->score[8]);
fscanf(fp,"%f",&p->score[9]);
}
//从文件导入数据
void filep_read_to_st(stupt st,FILE* fp)
{
stupt p;
st=NULL;//置空st,准备从文件中导入学生信息
while(1)
{
p=(stupt)malloc(sizeof(stu));
read1(p,fp);
if(feof(fp)) //如果文件结束,则结束(feof:检测流上的文件结束符)
break;
if(st==NULL)st=qt=p;
else if(qt!=NULL)
{
qt->next=p; //尾指针非空(即链表已存在)接着尾指针建立链表
qt=p;
}
}
if(feof(fp))
{
qt->next=NULL; //如果文件结束,尾指针next指空
}
if(st!=NULL&&feof(fp))
printf("温馨提示:您的文件导入成功!n");
else
printf("温馨提示:您的文件导入失败,请重新导入!n");
}
void readfile(stupt st,FILE* fp)//写入数据方式
{
char flag,flag_1;
char filename[90];
printf("温馨提示:您如果在导入前有过手动输入,请先导出至文件后再进行导入,否则输入那部分数据将丢失。n");
printf("按任意键继续,退出请按q:");
flag_1=getchar();
clear();
if(flag_1=='q')
{
return;
}
printf("程序默认路径导入:");
clear();
fp=fopen("student_homework_infor.txt","r");
if(access("student_homework_infor.txt",0)==1)
{
printf("温馨提示:您的文件不存在!n");
}
if(fp==NULL)
{
printf("温馨提示:打开程序所在目录下的student_homework_infor.txt文件失败,请返回主菜单重试!n");
return;
}
else filep_read_to_st(st,fp);
fclose(fp);}
//3.按学号查询
void printf_score(stupt p)//输出该学号学生的成绩
{
int n=0;
printf("前十次成绩如下:n");
printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~n");
while(n
{
printf("%f ",p->score[n]);
n++;
}
printf("n");
}void search(stupt st,int snum)//判断学号是否合法
{
stupt p,q;
if(st==NULL)
{
printf("未建立学生信息表,请返回主菜单输入或导入所有学生的信息n");
return;
}
else
{
p=st;
q=p->next;
}
if(p->schoolnumber==snum)
{
printf_score(p); //查找成功输出并返回上级函数
return;
}
while(q!=NULL)
{
if(q->schoolnumber==snum)
{
printf_score(q); //查找成功输出并返回上级函数
return;
}
q=q->next;//下一个
}
printf("查询失败,该学号学生信息不存在n");
}void school_num_search(stupt st)
{
int snum;
char flag;
do
{
printf("请输入要查找的学生学号(如221):");
scanf("%d",&snum);
clear();//清空scanf结束时进入缓冲的enter符
search(st,snum);
printf("退出请按q,其它任意键继续查找:");
flag=getchar();
clear();//清空回车符
}
while(flag!='q');
if(flag=='q')
{
Printf_help();
}
}
//4.给定班级查询
void printf_infor(stupt p) //输出函数
{
printf("%-5d%-8s%-5d%-6.1f%-6.1f%-6.1f%-6.1f%-6.1f%-6.1f%-6.1f%-6.1f%-6.1f%-6.1fn",p->classnumber,p->name,p->schoolnumber,p->score[0],p->score[1],p->score[2],p->score[3],p->score[4],p->score[5],p->score[5],p->score[7],p->score[8],p->score[9]);
printf("──────────────────────────────────────n");
}
void search_2(stupt st,int clnum)
{
stupt p,q;
int f=0;
if(st==NULL)
{
printf("未建立学生信息表,请返回主菜单输入所有学生的信息n");
return;
}
else
{
p=st;
q=p->next;
}
printf("班级 姓名 学号 成绩1 成绩2 成绩3 成绩4 成绩5 成绩6 成绩7 成绩8 成绩9 成绩10n");
printf("──────────────────────────────────────n");
if(p->classnumber==clnum)
{
printf_infor(p);
f++;
}//查找成功输出
while(q!=NULL)
{
if(q->classnumber==clnum)
{
printf_infor(q);
f++;
}//查找成功输出
q=q->next;//下一个} if(f==0) { printf("没有该班级学生信息n"); }
}
void class_num_search(stupt st)//查找班级
{
int clnum;
char flag;
do
{
printf("请输入班级(如101):");
scanf("%d",&clnum);
clear();//清空scanf结束时进入缓冲的enter符
search_2(st,clnum);
printf("退出请按q,其它任意键继续查找:");
flag=getchar();
clear();//清空回车符
}
while(flag!='q');
if(flag=='q')
{
Printf_help();
}
}
//5.修改姓名班级成绩
void change_name(stupt p)//修改姓名
{
printf("原姓名为:%sn",p->name);
printf("请输入新姓名:");
scanf("%s",p->name);
clear();
}
void change_class(stupt p)//修改班级
{
printf("原班级为:%dn",p->classnumber);
printf("请输入新班级:");
scanf("%d",&p->classnumber);
clear();
}
void change_score(stupt p)//修改分数
{
int n;
char flag;
do
{
printf("请输入:要修改的作业的次数(1~10):");
scanf("%d",&n);
clear();//清空缓冲区
printf("原成绩为:%fn",p->score[n-1]);
printf("请输入:该次作业新成绩:");
scanf("%f",&p->score[n-1]);
clear();//清空缓冲区
printf("是否继续修改该生成绩,退出请按q,其他键继续");
flag=getchar();
clear();
}
while(flag!='q');
}
void printf_help_2()//帮助列表
{
printf(" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ n");
printf(" |* 请选择操作: |n");
printf(" | 1.修改姓名 |n");
printf(" | 2.修改班级 |n");
printf(" | 3.修改成绩 |n");
printf(" | 0.返回 *|n");
printf(" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ n");
printf(":");
}
void change(stupt p)
{
char a;
printf_help_2();
while((a=getchar())!='0')
{clear(); printf("班级 姓名 学号 成绩1 成绩2 成绩3 成绩4 成绩5 成绩6 成绩7 成绩8 成绩9 成绩10n"); printf("──────────────────────────────────────n"); printf_infor(p); switch(a) { case '1': { printf("您选择了:1.修改姓名n"); change_name(p); break; } case '2': { printf("您选择了:2.修改班级n"); change_class(p); break; } case '3': { printf("您选择了:3.修改成绩n"); change_score(p); break; } default: { printf("非法输入,请重新选择!n"); break; } } printf_help_2(); } if(a=='0') { clear(); printf("您选择了:0.返回n"); }
}
void search_3(stupt st,int snum)
{
stupt p,q;
int f=0;
if(st==NULL)
{
printf("未建立学生信息表,请返回主菜单输入或导入所有学生的信息n");
return;
}
else
{
p=st;
q=p->next;
}
if(p->schoolnumber==snum)
{
change(p); //查找成功并修改
f++;
return;
}
while(q!=NULL)
{
if(q->schoolnumber==snum)
{
change(q); //查找成功并修改
return;
}
q=q->next;//下一个
}
if(f==0)
{
printf("没有该学生信息n");
}
}
void school_num_change(stupt st)
{
int snum;
char flag;
do
{
printf("请输入要修改学生学号(如101):");
scanf("%d",&snum);
clear();//清空scanf结束时进入缓冲的enter符
search_3(st,snum);
printf("退出请按q,其它任意键继续按学号查找修改信息:");
flag=getchar();
clear();//清空回车符
}
while(flag!='q');
if(flag=='q')
{
Printf_help();
}
}
//6.删除学生信息void delete_pt(stupt st,int snum)//判断并删除
{
stupt p,q;
if(st==NULL)
{
printf("未建立学生信息表,请返回主菜单输入或导入所有学生的信息n");
return;
}
else
{
p=st;
q=p->next;
}
if(p->schoolnumber==snum)//按照学号删除
{
st=q; //查找成功删除并返回上级函数
printf("班级 姓名 学号 成绩1 成绩2 成绩3 成绩4 成绩5 成绩6 成绩7 成绩8 成绩9 成绩10n");
printf("──────────────────────────────────────n");
printf_infor(p);
free(p);
printf("上面信息删除成功!n");
return;
}
while(q!=NULL)
{
if(q->schoolnumber==snum)
{
p->next=q->next; //查找成功删除并返回上级函数
printf("班级 姓名 学号 成绩1 成绩2 成绩3 成绩4 成绩5 成绩6 成绩7 成绩8 成绩9 成绩10n");
printf("──────────────────────────────────────n");
printf_infor(q);
free(q);
printf("上面信息删除成功!n");
return;
}
else//下一个
{
p=q;
q=p->next;
}
}
printf("删除失败,该学号学生信息不存在n");}
void school_num_delete(stupt st)
{
int snum;
char flag;
do
{
printf("请输入要删除的学生学号(如221):");
scanf("%d",&snum);
clear();//清空scanf结束时进入缓冲的enter符
delete_pt(st,snum);
printf("返回请按q,其它任意键继续删除:");
flag=getchar();
clear();//清空回车符
}
while(flag!='q');
if(flag=='q')
{
Printf_help();
}
}
//7.查询成绩,按学号班级,降序void printf_help_3()//帮助菜单
{
printf(" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ n");
printf(" |*请选择操作: |n");
printf(" | 1.按学号查看学生平均成绩 |n");
printf(" | 2.按班级查看学生平均成绩 |n");
printf(" | 3.按平均成绩降序排序(操作执行后将会对学生信息排序 )*|n");
printf(" |* 0.返回主菜单 *|n");
printf(" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ n");
printf(":");
}
int aver(stupt p)//平均成绩
{
int n=0;
float sum=0;//和初始化为0
while(n
{
sum+=p->score[n];
n++;
}
return sum;
}
void search_4(stupt st,int snum)
{
stupt p,q;
int f=0;
int sum;
printf("-----------------------------------------------------------------------------n");//分行符
if(st==NULL)
{
printf("未建立学生信息表,请返回主菜单输入或导入所有学生的信息n");
return;
}
else
{
p=st;
q=p->next;
}
if(p->schoolnumber==snum)
{
sum=aver(p);
printf("姓名:%-10s学号:%-10d班级:%-10d作业完成平均成绩:%dn",p->name,p->schoolnumber,p->classnumber,sum/10);
f++;
printf("-----------------------------------------------------------------------------n");//分行符
return;
}//查找成功并输出平均值
while(q!=NULL)
{
if(q->schoolnumber==snum)
{
sum=aver(q);
printf("姓名:%-10s学号:%-10d班级:%-10d作业完成平均成绩:%dn",q->name,q->schoolnumber,q->classnumber,sum/10);
f++;
printf("-----------------------------------------------------------------------------n");//分行符
return;
}//查找成功并输出平均值
q=q->next;//下一个
}
if(f==0)
{
printf("没有该学生信息n");
}}
void snum_check_aver(stupt st)//按学号输出学生平均成绩
{
int snum;
printf("请输入学号:");
scanf("%d",&snum);
clear();//清空scanf结束时进入缓冲的enter符
search_4(st,snum);
}void search_5(stupt st,int cnum)
{
stupt p,q;
int f=0;
int sum;
printf("-----------------------------------------------------------------------------n");//分行符
if(st==NULL)
{
printf("未建立学生信息表,请返回主菜单输入或导入所有学生的信息n");
return;
}
else
{
p=st;
q=p->next;
}
if(p->classnumber==cnum)
{
sum=aver(p);
printf("姓名:%-10s学号:%-10d班级:%-10d作业完成平均成绩:%dn",p->name,p->schoolnumber,p->classnumber,sum/10);
f++;
}//查找成功并输出平均值
while(q!=NULL)
{
if(q->classnumber==cnum)
{
sum=aver(q);
printf("姓名:%-10s学号:%-10d班级:%-10d作业完成平均成绩:%dn",q->name,q->schoolnumber,q->classnumber,sum/10);
f++;
}//查找成功并输出平均值
q=q->next;//下一个
}
if(f==0)
{
printf("没有该班级的信息n");
}
printf("-----------------------------------------------------------------------------n");//分行
}
void cnum_check_aver(stupt st)
{
int cnum;
printf("请输入班级:");
scanf("%d",&cnum);
clear();//清空scanf结束时进入缓冲的enter符
search_5(st,cnum);
}void insert_emp1(stupt emp1,stupt q)
{
stupt pt1,pt2;
pt1=emp1;
pt2=pt1->next;
while(pt2!=NULL)
{
if(aver(q)>aver(pt2))//插到pt2之前
{
pt1->next=q;
q->next=pt2;
return;
}
else//指针后移
{
pt1=pt2;
pt2=pt1->next;
}
}
pt1->next=q;//比所有的都不大,插到末尾
q->next=NULL;
}
void descending_order_check(stupt st)
{
stupt emp1,head1,head2,pt;
float sum;
printf("-----------------------------------------------------------------------------n");//分行符
if(st==NULL)
{
printf("未建立学生信息表,请返回主菜单输入或导入所有学生的信息n");
return;
}
head1=(stupt)malloc(sizeof(stu));
head2=(stupt)malloc(sizeof(stu));//另一个空链表头指针,将st有序插入到head2
head1->next=st->next;
st->next=NULL;
head2->next=st;
pt=head1->next;
while(pt!=NULL)
{
head1->next=pt->next;
insert_emp1(head2,pt);
pt=head1->next;
}
emp1=head2->next;
st=emp1;
while(emp1!=NULL)
{
sum=aver(emp1);
printf("姓名:%-10s学号:%-10d班级:%-10d作业完成平均成绩:%-10.3fn",emp1->name,emp1->schoolnumber,emp1->classnumber,sum/10);
emp1=emp1->next;
}
printf("-----------------------------------------------------------------------------n");//分行符}
//-----------------------------------------------------------------------------------------------
void statistics_result(stupt st)
{
char flag;
printf_help_3();
while((flag=getchar())!='0')
{clear(); switch(flag) { case '1': { printf("您选择了:1.按学号查看学生平均成绩n"); snum_check_aver(st); break; } case '2': { printf("您选择了:2.按班级查看学生平均成绩n"); cnum_check_aver(st); break; } case '3': { printf("您选择了:3.查看学生平均成绩降序序列n"); descending_order_check(st); break; } default: { printf("非法输入,请重新选择!n"); clear(); break; } } printf_help_3(); } if(flag=='0') { printf("您选择了:0.返回主菜单n"); clear(); Printf_help(); }
}
//导出
void fileprintf(stupt st,FILE* fp)
{
stupt pt;
pt=st;
while(pt!=NULL)
{
fprintf(fp,"%s %d %d %f %f %f %f %f %f %f %f %f %fn",pt->name,pt->schoolnumber,pt->classnumber,pt->score[0],pt->score[1],pt->score[2],pt->score[3],pt->score[4],pt->score[5],pt->score[6],pt->score[7],pt->score[8],pt->score[9]);
pt=pt->next;
}
printf("文件导出成功 !n");}
void creat_files(stupt st,FILE* fp)
{char flag; char filename[90]; printf("默认路径保存(为当前目录下的student_homework_infor.txt)"); clear(); fp=fopen(".\student_homework_infor.txt","a"); if(fp==NULL) { printf("创建文件至程序所在目录下的student_homework_infor.txt文件失败,请返回主菜单重试!"); return; } else fileprintf(st,fp); fclose(fp);
}
//注册登录
void printf_log()
{
printf("ttt~~~~~~~~~~~~~~~~~~~~~~~~ n");
printf("ttt|* 请选择操作: |n");
printf("ttt| 1.登录 |n");
printf("ttt| 2.注册 |n");
printf("ttt| 0.退出 |n");
printf("ttt~~~~~~~~~~~~~~~~~~~~~~~~ n");
printf(":");
}
void write_in_file(char *a,char *name,FILE *fp)
{
fprintf(fp,"%s %sn",a,name);
fclose(fp);
printf("您已注册成功!n");
}
void read_passwd(char *a,char *name,FILE *fp)
{
fscanf(fp,"%s",a);
fscanf(fp,"%s",name);
}
int log()
{
char ch;
char a[7]={'0'};
char name[12]={'0'};//初始化
char b[7]={'0'};
FILE fp;
int i;fp=fopen("passwd.txt","r"); if(fp==NULL) { printf("注册文件无法打开,请在程序当前目录下创建passwd.txt文件并重新注册!n"); exit(1); } ch=getc(fp); if(ch==EOF) { printf("未注册,请注册!n"); return 1; } fclose(fp); fp=fopen("passwd.txt","r"); if(fp==NULL) { fp=fopen("passwd.txt","a"); exit(1); fclose(fp); } read_passwd(a,name,fp); fclose(fp); printf("用户名:%sn",name); printf("请输入密码:(6个字符)"); for(i=0;i<6;i++) { b[i]=getch(); printf("*"); } b[6]=''; clear(); if(strcmp(a,b)==0) { printf("登陆成功!n"); return 0; } else { printf("密码错误,请重新登录n"); return 1; }
}
void login()
{
char a[7]={'0'};
char b[7]={'0'};
char name[12]={'0'};//初始化
FILE* fp;
char ch;
int i;
fp=fopen("passwd.txt","r");
if(fp==NULL)
{
printf("注册文件无法打开或已损坏,请在程序当前目录下创建passwd.txt文件!n");
return;
}
ch=getc(fp);
fclose(fp);
if(ch!=EOF)
{
printf("账户已存在,请返回登陆菜单!n");
return;
}
printf("请输入用户名:(小于12字符)");
scanf("%s",name);
clear();
lab_3:printf("请输入密码:(6个字符)");
for(i=0;i<6;i++)
{
a[i]=getch();
printf("*");
}
clear();
printf("请确认密码:(6个字符)");
for(i=0;i<6;i++)
{
b[i]=getch();
printf("*");
}
clear();
if(strcmp(a,b)!=0)
{
printf("两次输入密码不一致,请重新输入!n");
goto lab_3;
}
fp=fopen("passwd.txt","wb");
write_in_file(a,name,fp);
}
int user_log()
{
char flag;
int f;
do
{
printf_log();
flag=getchar();
clear();
if(flag=='1')
{
f=log();
if(f==0)
{
return 0;
}
}
else if(flag=='2')
{
login();
}
else if(flag=='0')
{
return 1;
}
else
{
printf("非法输入!,请重新新选择:n");
}
}
while(1);}
////////////////////////////////////////////////-main-//////////////////////////////////////////////////
int main()
{
char a,ch;printf(" ┄欢迎您使用学生作业完成情况管理程序┄ n"); if(user_log()==1) { printf(" ┄谢谢您的使用┄ n"); return 0; }
lab_3:
Printf_help();
while((a=getchar())!='0')
{
clear();
switch(a)
{
case '1':
{
printf("您选择了:1.手动输入学生作业的分数n");
input(st,qt);
break;
}case '2':
{
printf("您选择了:2.从文件导入学生信息n");
readfile(st,fp);
Printf_help();
break;
}
case '3':
{
printf("您选择了:3.给定学号,显示某位学生作业完成情况n");
school_num_search(st);
break;
}
case '4':
{
printf("您选择了:4.输入班级的班号,显示该班所有学生的作业完成情况n");
class_num_search(st);
break;
}
case '5':
{
printf("您选择了:5.输入学生的学号,修改该学生的作业完成信息n");
school_num_change(st);
break;
}
case '6':
{
printf("您选择了:6.输入学生的学号,删除该学生的信息n");
school_num_delete(st);
break;
}
case '7':
{
printf("您选择了:7.显示各类统计信息n");
statistics_result(st);
break;
}
case '8':
{
printf("您选择了:8.菜单n");
Printf_help();
break;
}
case '9':
{
printf("您选择了:9.清屏n");
system("CLS");
Printf_help();
break;
}
case 'a':
{
printf("您选择了:a.导出文件n");
creat_files(st,fp);
Printf_help();
break;
}
default:
{
printf("非法输入,请重新选择!n");
Printf_help();
break;
}} } if(a=='0') { printf("您选择了:0.退出系统n"); printf("退出系统时需要导出文件,否则之前操作无效!n"); printf("按q返回,其它任意键继续n"); clear(); if((ch=getchar())=='q') { clear(); goto lab_3; } printf(" ┄谢谢使用┄ n"); } return 0;
}
解决方案
大哥,你真猛。贴这么大段代码。
建议:
1.你贴个三五行可能有人帮你分析,这么大段没人看。
2.调代码是程序员的最基本素养,要学着自己慢慢调试,刚开始可能很难,过段时间就会发现很爽的