写在前面
让我说啥是好,,,这周临时起意要写学生管理系统,结果半中间没猝死,,,详情请看下文
本周学习了什么
这周就写了个学生管理系统,因为在摸鱼 有点短,闲暇时候还看了会html
这期周报的主要内容有
1.文件的学习与学生管理系统的撰写。
2.HTML,,(了解,真的就只是了解)
3.下周计划
文件的学习与学生管理系统的撰写
学生管理系统的第一步,刚开始的时候一定是没有学生的,所以先用fopen创建一个空文件
FILE *p=fopen("学生管理系统.txt","a+");
这里用了fopen函数,里面需要两个东西,第一个是文件名,第二个呢是打开类型,然后这个p就成了文件的指针,刚开始看这个·特别懵,啥玩意文件还能有指针。。。。。
还有就是关于打开类型这里引用一下别人写的:
打开方式 | 含义 | 指定文件不存在时 | 指定文件存在时 |
---|---|---|---|
r | 只读方式打开文本文件 | 出错 | 正常打开 |
w | 只写方式打开文本文件 | 建立新文件 | 文件原有内容丢失 |
a | 追加方式打开文本文件 | 建立新文件 | 在原有内容末尾追加 |
r+ | 读/写方式打开文本文件 | 出错 | 正常打开 |
w+ | 读/写方式创建新的文本文件 | 建立新文件 | 文件原有内容丢失 |
a+ | 读/追加方式建立新的文本文件 | 建立新文件 | 在原有内容末尾追加 |
rb | 只读方式打开二进制文件 | 出错 正常打开 | |
wb | 只写方式打开二进制文件 | 建立新文件 | 文件原有内容丢失 |
ab | 追加方式打开二进制文件 | 建立新文件 | 在原有内容末尾添加 |
rb+ | 读/写方式打开二进制文件 | 出错 | 正常打开 |
wb+ | 读/写方式创建新的二进制文件 | 建立新文件 | 文件原有内容丢失 |
ab+ | 读/追加方式创建新的二进制文件 | 建立新文件 | 在原有内容末尾追加 |
这里用a+来打开同时满足创建新文件,在后面追加的功能;
创建好了开始框架就该思考如何往文件里面写东西了,这涉及到几个函数,我面前用的有两个fgets和fputs
flag=fgets(head->name,6,p)
当把文件读完时fgets函数会返回0;
fputs(currrent->name,p);
理解起来很简单就是将前面的字符串写到后面的文件里面去。学了这两个函数先不论后面有关链表的增删改查应该可以把输入和输出写完了
2020/11/30 20:07
写个两个小时。。。。
一直把数据写不到文件里面去,麻了。
明天再写。
接着上面
昨天搞清楚了为啥数据写不到文件里面去,理由挺简单的。。。没有在函数里面打开文件,我也是服了我自己。
能写进去就要求还能读出来,由于前面之了解了fgets考虑到输入数据的长度是不定的所以读入的长度也是不定的,所以我这里选择了fscanf函数,原型如下
fscanf(p,"%s",s);
第一个参数是你打开的文件指针名称,第二个参数是读取类型,第三个是你读取后要存的地方。
这中间还有一个小插曲。。。由于调试函数的时候在刚开始放了一句fputs写了写东西进去,导致最后的文件里面总有一些乱码,还以为是程序出错了,最后才发现。。。。
会读之后就要判断啥时候读完
这里要用到一个foef函数原型如下feof(p)
这里面怕和上面一样是打开文件名称的指针。
当文件读完时其返回值为1;未读完时返回值为0;
但这个函数有一个缺点,就是当你没有读文件的内容时候,即使文件为空,其返回值也为0;
为了解决这个问题,我选择了下面方法
char s[20];
fsacnf(p,"%s",s);
whiel(!feof(p))
{
......
}
也就是先在外面读一次,然后再往所构建的链表当中写。
放一段读取的代码吧
写到这里面一个基本的输入输出就完成了,接下来就应该着手各种功能。
在组长的指点下,灵光乍现,想着其实写进文件的话只需要开始读进去,最后写进去,写进去的打开文件方式只要用“w+”就行了呀,不过这样也有一个弊端,就是如果中途强制截至程序所有的操作都会付之一炬,先放这样,等有时间了在优化。
最终写进去的函数
void end(student *head)
{
student *current=head;
FILE *fp=fopen("学生管理系统.txt","w+");
for(;current!=NULL;current=current->next)
{
fprintf(fp,"%s\t\t%s\t\t%s\t\t%s\n",current->name,current->id,current->cless,current->grade);
}
fclose(fp);
return;
}
比以前写一句录一句方便多了;
2020/12/3
这个管理系统先停一会吧偷个懒反正预计的是50%
具体实现的功能就简单的链表增删改查也没出啥新意
具体如下:
1 | 录入学生信息 |
---|---|
2 | 修改学生信息 |
3 | 输入所有学生信息 |
4 | 改动学生信息 |
5 | 删除学生信息 |
6 | 输出某班全部学生 |
各种函数声明如下
void begin();
void withdraw();
void increase(student **head);
void change(student **head);
void open(student *head);
void dele(student **head);
void start(student **head);
void end(student *head);
void isfree(student **head);
int checkinformation(student *current);
void printclass(student *head);
结构体声明如下
//以下均用cless代替cless
typedef struct students{
char name[20];
char id[10];
char cless[30];
char grade[10];
struct students *next;
}student;
主函数
int main()
{
int vaule;
student *head=NULL;
FILE *p=fopen("学生管理系统.txt","a+");
printf("\n\n\n\n\n\n");
printf("\t\t\t\t\t-----这是一个学生管理系统--------\n");
printf("\t\t\t\t\t|----输入 1 开始操作------------|\n");
printf("\t\t\t\t\t-----输入 0 退出系统-------------\n\t\t\t\t");
scanf("%d",&vaule);
if(vaule==0)
{
withdraw();
}
else if(vaule==1)
{
start(&head);
while(1)
{
system("cls");
begin();
printf("\t\t\t\t");
scanf("%d",&vaule);
if(vaule==1)
{
increase(&head);
}
else if(vaule==2)
{
change(&head);
}
else if(vaule==3)
{
dele(&head);
}
else if(vaule==4)
{
open(head);
}
else if(vaule==5)
{
printclass(head);
}
else if(vaule==0)
{
withdraw();
break;
}
else
{
printf("\t\t\t\t-----输入错误--------\n");
Sleep(2000);
}
}
}
else
{
printf("\t\t\t\t-----输入错误--------\n");
withdraw();
}
end(head);
isfree(&head);
fclose(p);
return 0;
}
直接放大招,对我来说很长~~组长表示就这?~~的代码
void withdraw()
{
system("cls");
printf("\n\n\n\n\n\n");
printf("\t\t\t\t-----即将退出系统--------\n");
Sleep(1000);
}
void increase(student **head)
{
int number;
student *current,*tail;
system("cls");
printf("\n\n\n\n\n\n");
printf("\t\t\t\t-----请输入要增加学生的数量--------\n\t\t\t\t");
scanf("%d",&number);
if(number==0)
{
return;
printf("\t\t\t\t\t录入完毕");
Sleep(2000);
}
printf("\t\t\t\t姓名\t\t学号\t\t班级\t\t成绩\n");
if(*head==NULL)
{
for(;number>0;number--)
{
printf("\t\t\t\t");
current=(student*)malloc(sizeof(student));
if(*head==NULL)
{
*head=current;
}
else
{
tail->next=current;
}
scanf("%s",current->name);
scanf("%s",current->id);
scanf("%s",current->cless);
scanf("%s",current->grade);
current->next=NULL;
tail=current;
}
printf("\t\t\t\t录入完毕");
Sleep(2000);
return;
}
else
{
for(current=*head;current->next!=NULL;current=current->next);
tail=current;
for(;number>0;number--)
{
printf("\t\t\t\t");
current=(student*)malloc(sizeof(student));
tail->next=current;
scanf("%s",current->name);
scanf("%s",current->id);
scanf("%s",current->cless);
scanf("%s",current->grade);
current->next=NULL;
tail=current;
}
printf("\t\t\t\t录入完毕");
Sleep(2000);
return;
}
}
void open(student *head)
{
system("cls");
student *current=head;
FILE *p=fopen("学生管理系统.txt","a+");
printf("\n\n\n\n\n");
char temp[20];
fscanf(p,"%s",temp);
fclose(p);
if(feof(p))
{
printf("\t\t\t\t您还未输入任何学生信息。\n");
system("pause");
return;
}
printf("\t\t\t\t姓名\t\t学号\t\t班级\t\t成绩\n");
for(;current!=NULL;current=current->next)
{
printf("\t\t\t\t");
printf("%s\t\t%s\t\t%s\t\t%s\n",current->name,current->id,current->cless,current->grade);
}
system("pause");
return;
}
void dele(student **head)
{
system("cls");
char id[10],name[20];
int way;
student *current,*temp=NULL;
printf("\n\n\n\n\n\t\t\t\t");
printf("-----删除学生信息的方式-----\n");
printf("\t\t\t\t1.姓名删除\n\t\t\t\t2.按学号删除\n");
printf("\t\t\t\t");
scanf("%d",&way);
if(way==2)
{
printf("\t\t\t\t请输入该学生学号\n\t\t\t\t");
scanf("%s",id);
for(current=*head;current!=NULL;current=current->next)
{
if(!strcmp(current->id,id))
{
temp=*head;
*head=current->next;
free(temp);
break;
}
if(!strcmp(current->next->id,id))
{
temp=current->next;
if(current->next->next==NULL)
{
current->next=NULL;
free(temp);
break;
}
current=current->next->next;
free(temp);
break;
}
}
}
else if(way==1)
{
printf("\t\t\t\t请输入该学生姓名\n\t\t\t\t");
scanf("%s",name);
for(current=*head;current!=NULL;current=current->next)
{
if(!strcmp(current->name,name))
{
if(checkinformation(current))
{
continue;
}
temp=*head;
*head=current->next;
free(temp);
break;
}
if(current->next!=NULL&&!strcmp(current->next->name,name))
{
if(checkinformation(current->next))
{
continue;
}
temp=current->next;
if(current->next->next==NULL)
{
current->next=NULL;
free(temp);
break;
}
current=current->next->next;
free(temp);
break;
}
}
}
if(temp==NULL)
{
printf("\t\t\t\t未找到该学生的信息,请检验输入是否正确。\n");
Sleep(2000);
return;
}
printf("删除成功");
Sleep(2000);
return;
}
void start(student **head)
{
student *current,*tail;
FILE *p=fopen("学生管理系统.txt","a+");
char temp[20];
fscanf(p,"%s",temp);
while(!feof(p))
{
current=(student*)malloc(sizeof(student));
if(*head==NULL)
{
*head=current;
}
else
{
tail->next=current;
}
strcpy(current->name,temp);
fscanf(p,"%s",current->id);
fscanf(p,"%s",current->cless);
fscanf(p,"%s",current->grade);
current->next=NULL;
tail=current;
fscanf(p,"%s",temp);
}
fclose(p);
return;
}
void end(student *head)
{
student *current=head;
FILE *fp=fopen("学生管理系统.txt","w+");
for(;current!=NULL;current=current->next)
{
fprintf(fp,"%s\t\t%s\t\t%s\t\t%s\n",current->name,current->id,current->cless,current->grade);
}
fclose(fp);
return;
}
void isfree(student **head)
{
student *current;
for(;*head!=NULL;*head=(*head)->next)
{
current=*head;
free(current);
}
}
int checkinformation(student *current)
{
char ch;
printf("\n\t\t\t\t这是您所要改动学生的信息吗?\n");
printf("\t\t\t\t姓名\t\t学号\t\t班级\t\t成绩\n");
printf("\t\t\t\t%s\t\t%s\t\t%s\t\t%s\n",current->name,current->id,current->cless,current->grade);
printf("\t\t\t\t是的按回车键确定\n");
printf("\t\t\t\t不是的话按ESC键\n\t\t\t\t");
ch=getch();
if(ch!=13)
{
printf("正在为您继续查询\n\n");
Sleep(2000);
return 1;
}
else
{
return 0;
}
}
void change(student **head)
{
system("cls");
int way,vaule;
char ischange[20],changed[20];
student *current=*head;
printf("\n\n\n\n\t\t\t\t-----修改学生信息的方式-----\n");
printf("\t\t\t\t1.按姓名修改\n\t\t\t\t2.按学号修改\n");
printf("\t\t\t\t");
scanf("%d",&way);
if(way==1)
{
printf("\t\t\t\t请输入该学生姓名\n\t\t\t\t");
scanf("%s",ischange);
for(;current!=NULL;current=current->next)
{
if(!strcmp(current->name,ischange))
{
if(!checkinformation(current))
{
printf("请输入修改项目\n");
printf("\t\t\t\t1.修改姓名\n\t\t\t\t2.修改学号\n\t\t\t\t3.修改班级\n\t\t\t\t4.修改成绩\n\t\t\t\t");
scanf("%d",&vaule);
break;
}
}
}
}
else if(way==2)
{
printf("\t\t\t\t请输入该学生姓名\n\t\t\t\t");
scanf("%s",ischange);
for(;current!=NULL;current=current->next)
{
if(!strcmp(current->id,ischange))
{
if(!checkinformation(current))
{
printf("请输入修改项目\n");
printf("\t\t\t\t1.修改姓名\n\t\t\t\t2.修改学号\n\t\t\t\t3.修改班级\n\t\t\t\t4.修改成绩\n\t\t\t\t");
scanf("%d",&vaule);
break;
}
}
}
}
else
{
printf("\t\t\t\t输入错误");
Sleep(2000);
return;
}
if(vaule==1)
{
printf("\t\t\t\t输入修改姓名:");
scanf("%s",changed);
printf("\t\t\t\t正在修改中\n\t\t\t\t");
Sleep(2000);//拉低速度提高仿真度
strcpy(current->name,changed);
}
else if(vaule==2)
{
printf("\t\t\t\t输入修改学号:");
scanf("%s",changed);
printf("\t\t\t\t正在修改中\n\t\t\t\t");
Sleep(2000);//拉低速度提高仿真度
strcpy(current->name,changed);
}
else if(vaule==3)
{
printf("\t\t\t\t输入修改班级:");
scanf("%s",changed);
printf("\t\t\t\t正在修改中\n\t\t\t\t");
Sleep(2000);//拉低速度提高仿真度
strcpy(current->name,changed);
}
else if(vaule==4)
{
printf("\t\t\t\t输入修改成绩:");
scanf("%s",changed);
printf("\t\t\t\t正在修改中\n\t\t\t\t");
Sleep(2000);//拉低速度提高仿真度
strcpy(current->name,changed);
}
else
{
printf("\t\t\t\t输入错误");
Sleep(2000);
return;
}
printf("\t\t\t\t修改成功");
Sleep(2000);
return;
}
void printclass(student *head)
{
student *current;
int flag=0;
char iscless[20];
system("cls");
printf("\n\n\n\n\t\t\t\t请输入你要查看的班级\n\t\t\t\t");
scanf("%s",iscless);
printf("\t\t\t\t姓名\t\t学号\t\t班级\t\t成绩\n");
for(current=head;current!=NULL;current=current->next)
{
if(!strcmp(current->cless,iscless))
{
//printf("\t\t\t\t%s\t\t%s\t\t%s\t\t%s\n",current->name,current->id,current->cless,current->grade);
flag=1;
break;
}
}
if(!flag)
{
printf("\t\t\t\t查无此班级\n\t\t\t\t");
Sleep(2000);
return;
}
for(current=head;current!=NULL;current=current->next)
{
if(!strcmp(current->cless,iscless))
{
printf("\t\t\t\t%s\t\t%s\t\t%s\t\t%s\n",current->name,current->id,current->cless,current->grade);
flag=1;
}
}
printf("\t\t\t\t");
system("pause");
return;
}
void begin()
{
printf("\n\n\n\n\n\n");
printf("\t\t\t\t--------请按照下面提示开始操作----------\n");
printf("\t\t\t\t|-------输入 1 录入学生信息------------|\n");
printf("\t\t\t\t|-------输入 2 修改学生信息------------|\n");
printf("\t\t\t\t|-------输入 3 删除学生信息------------|\n");
printf("\t\t\t\t|-------输入 4 显示现有学生信息--------|\n");
printf("\t\t\t\t|-------输入 5 输出某班现有学生名单----|\n");
//printf("\t\t\t\t\t|-------输入 6 按成绩从低到高显示--------|\n");
//printf("\t\t\t\t\t|-------输入 7 不排序显示--------|\n");
printf("\t\t\t\t--------输入 0 退出系统-----------------\n");
}
经过我的各种惨绝人道细致的检查,只要按照提示使用运行起来基本没啥问题,只不过界面太丑,下次写的时候美化一i下。。。
html学习
废话少说,直接上笔记
《a》《/a》链接标签其中的“href”后面跟链接的地址<br>
空链接href="#";<br>
下载链接地址链接的是文件 .exe或者.zip,href="***.zip"<br>
<a href="https://www.baidu.com/" target="_self"> 百度</a><br>
任何元素都可以添加超链接<br>
target 打开窗口的方式 默认 _self当前窗口打开 还有_blank型窗口打开<br>
<img src="https://www.baidu.com/img/PCdong_eab05f3d3a8e54ca5a0817f09b39d463.gif" width="300"/><br>
锚点链接定位页面中的,某个位置<br>
《a herf=“#???”》*****《\a》<br>
<h2 id="???">*****</h2>
<!--这是注释标签--><br>
<!-- ctrl+/快速添加注释 --><br>
特殊字符空格 一个空格<br>
<小于号>大于号<br>
表格标签<br>
<!-- <table></table>用于定义表格表格标签<tr><\tr>用于定于行<td><\td>-->
<table>
<tr><td>第一个单元格</td><td>第二个单元格</td></tr>
</table>
<!-- 表头单元格 -->
<table>
<tr><th>表头1</th>表头2</tr>
<tr><td>文件1</td>文件2</tr>
</table>
<!-- 表格属性 -->
<!-- 要写到table里面去 -->
<!--align 属性left,center,right 对齐方式 -->
<!--borde 属性1表示有边框 “”无边框 -->
<!-- cellpadding 像素值 规定单元格与之间的空白,默认1像素 -->
<!-- cellspacing规定单元格之间的空白默认2两素 -->
<!-- width height规定表格宽度长度 -->
<!-- <thead>里面必须拥有<tr>标签<\thead>一般位于第一行 -->
<!--<tbody>用于定义表格的主体主要放数据主体 -->
<!--合并单元格 -->
<!-- 合并单元格的方式 -->
<!-- 跨行合并 :rowspan=“合并单元格个数”,最上侧单元格为目标单元格,写合并代码-->
<!-- 跨列合并 :colspan=“合并单元格个数”,最左侧单元格为目标单元格,写合并代码-->
<!-- 列表 -->
<!--无序列表 -->
<!-- 格式如下 -->
<!--
<ul>
<li>123</li>
<li>789</li>
<li>456</li>
</ul>
-->
<!-- ul之中只能出现li其余都不可以 -->
<!-- <li>里面啥都能放 -->
<!-- 自带格式,及就是前面的小黑点 -->
<!-- 有序列表 -->
<!--
<ol>
<li>123</li>
<li>123</li>
<li>789</li>
<ol>
-->
<!-- 注意事项同上 -->
<!-- 自定义列表 -->
<!--
<dl>
<dt>
<dd>
</dd>
</dt>
</dl>
-->
<!-- <dl>里面只能有dt与dd -->
<!-- 表单 -->
<!-- 由表单域,表单控件,提示信息3个部分组成-->
<!-- 表单域 -->
<!-- 把表单域内的元素信息传给服务器 -->
<form action="" method="POST" name=""> <!--里面的东西把不用管-->
用户名<input type="text"><!--text输入文本文件-->
密码<input type="password"><!--隐藏输入的-->
<!-- 单选选点radio 同一个name值实现多选一 -->diyi1<input type="radio" name="123">diyi1<input type="radio" name="123"><br>
<!--多选点<checkbox-->123<input type="checkbox">123<input type="checkbox"><br>
<input type="submit",vaule="123">
<!-- 点击按钮就可以把表单域<form>里面的值提交了 -->
<!-- <input type="reset">重置按钮 -->
<input type="button" value="anniu">
<a href="https://www.baidu.com/" target="_self"> <input type="button" value="anniu"></a><br>
</form>
<!-- 表单元素 -->
<!-- <input> 收集用户信息,单标签-->
<!-- 除了type之外其他的元素 name定义input元素的名称,vaule规定input的值-->
<!-- 单选框和复选框可以设置checked属性,当页面打开的时候就可以选择中这个按钮 -->
<!-- maxlength用户可输入的最大字符数 -->
<!-- 普通按钮button -->
<!-- 文件域按钮file -->
<!-- label标签 -->
<!-- 可以绑定表单元素 -->
<label for="123">yonghuhh</label>
<input type="text" id="123"><br>
<!--下拉表单-->hah
<select>
123<option value="#">12</option>
34<option value="#">14</option>
6576<option value="#">13</option>
</select>
<!-- <textarea ></textarea>文本域标签 -->
<!-- 里面有两个属性, cols rows不用记-->
下周安排
下周就不看html了,主要任务就三个字,刷算法,简单枯燥而乏味,毕竟跟组长许诺了**道。。。
本周的周报就到此结束了,欢迎下次观赏。