精华内容
下载资源
问答
  • 在学习了文件操作以后,便想到可以通过读写文件来对数据进行操作,于是尝试编写了一个简单基于文件学生信息管理系统学生信息可以提前按特定的格式存储在文件当中,打开程序后会先对文件进行读操作,将文件中的...

    一般来说程序运行时的数据都是存储在内存当中的,当程序结束数据也就消失了。在学习了文件操作以后,便想到可以通过读写文件来对数据进行操作,于是尝试编写了一个简单基于文件的学生信息管理系统。

    学生信息可以提前按特定的格式存储在文件当中,打开程序后会先对文件进行读操作,将文件中的字符数据保存到程序的链表当中,在程序中可以对链表进行增删改查的操作来管理学生的信息,当结束程序时,会重新将链表中的数据按特定的格式存储到文件当中,这样即使程序结束也可以将数据保存下来,当下一次运行程序时还会重新将数据读取。

    下面是具体的实现。


    用来存储学生信息的链表,这里只涉及学号和姓名。

    typedef struct Student_information
    {
        char *stu_num;
        char *stu_name;
        struct Student_information *next;
    }S;

    将学生信息存储到链表中的函数。

    void input_inf(S **head,char *num,char *name)
    {
        S *tmp = malloc(sizeof(S));
        S *find = *head;
        char *buf = malloc(20);
        char *buf1 = malloc(20);
        strcpy(buf,name);
        strcpy(buf1,num);
    
        tmp->stu_num = buf1;
        tmp->stu_name = buf;
        tmp->next = NULL;
        if(*head == NULL)
        {
            *head = tmp;
        }
        else
        {
            while(find->next!=NULL)
            {
                find = find->next;
            }
            find->next = tmp;
        }
    }

    将文件中学生信息存入链表,返回学生人数。

    int read_file(FILE *fp,S **head)
    {
        int sum=0;
        ssize_t len;
        size_t l = 0;
        char *buf=NULL;
        int i=0,j=0;
        while((len = getline(&buf,&l,fp))!=-1)
        {
            char *name=malloc(20);
            char *num=malloc(20);
            while(*(buf+i)>='0'&&*(buf+i)<='9')
            {
                *(num+j++) = *(buf+i++);
            }
            j = 0;
            i++;
            while(*(buf+i)!='\n')
            {
                *(name+j++)=*(buf+i++);
            }
            input_inf(head,num,name);
            num = 0;
            i = 0;
            j = 0;
            free(name);
            free(buf);
            buf = NULL;
            l = 0;
            sum++;
        }
        return sum;
    }

    将链表数据按格式写入文件。

    void write_file(FILE *fp,S *head)
    {
        S *find = head;
        if(head==NULL)
            return;
        while(find->next!=NULL)
        {
            fputs(find->stu_num,fp);
            fputc(' ',fp);
            fputs(find->stu_name,fp);
            fputc('\n',fp);
            find = find->next;
        }
        fputs(find->stu_num,fp);
        fputc(' ',fp);
        fputs(find->stu_name,fp);
        fputc('\n',fp);
    }
    

    显示所有学生信息。

    
    void show_all_inf(S *head)
    {
        S *find = head;
        if(find==NULL)
        {
            printf("请先输入学生信息!\n");
            return;
        }
        while(find->next!=NULL)
        {
            printf("Student No.%s\tStudent Name:%s\n",find->stu_num,find->stu_name);
            find = find->next;
        }
        printf("Student No.%s\tStudent Name:%s\n",find->stu_num,find->stu_name);
    }

    通过学号查找输出学生信息。

    void search(S* head,char *num)
    {
        S *find = head;
        while(strcmp(find->stu_num,num)!=0)
        {
            if(find->next==NULL)
            {
                printf("未找到该学生!\n");
                   return;
            }
            find = find->next;
        }
        printf("学号No.%s的学生姓名为%s\n",num,find->stu_name);
    }
    

    查看链表中是否存在相同学号,存在返回1,不存在返回0。用在添加学生信息时,保证学号为主键。

    int if_in(S *head,char *num)
    {
        S *find = head;
        if(head==NULL)
        {
            return 0;
        }
        while(strcmp(find->stu_num,num)!=0)
        {
            if(find->next==NULL)
                return 0;
            find = find->next;
        }
        return 1;
    }

    通过学号删除学生信息。

    void del(S **head,char *num,int *sum)
    {
        S *find = *head;
        S *front = NULL;
        if(*head == NULL)
        {
            printf("已无学生信息!\n");
            return;
        }
        while(strcmp(find->stu_num,num)!=0)
        {
            if(find->next==NULL)
            {
                printf("该学号不存在!\n");
                return;
            }
            front = find;
            find = find->next;
        }
        printf("学号No.%s的学生姓名为%s\n[1]确认删除 [其他]取消(请勿输入字符!)\n",num,find->stu_name);
        int select;
        scanf("%d",&select);
        if(select==1)
        {
            if(find==*head)
            {
                *head = find->next;
                find->next = NULL;
                free(find);
            }
            else
            {
                front->next = find->next;
                find->next = NULL;
                free(find);
            }
            *sum--;
            printf("删除成功!");
        }
    }

    主函数通过printf和switch实现了简单的界面。这里注意在switch之后需要加一个getchar( ),因为在选择功能时虽然通过scanf输入了一个字符,但实际上还多输入了一个回车,即换行符’\n’,而switch结束后进入下一次循环选择功能时scanf会直接把这个回车符读入进行选择,而不是等待用户的输入,在linux redhat是这样的,所以通过getchar( )来将多余的’\n’读掉。

    int main()
    {
        S *head = NULL;
        int sum = 0;
        char select = '1';
    
        //读文件信息
        FILE *fp = fopen(FILENAME,"r");
        if(fp == NULL)
        {
            printf("数据库错误!");
            exit(EXIT_FAILURE);
        }
        sum = read_file(fp,&head);
        fclose(fp);
        system("clear");
    
        //主程序功能部分
        while(select!='q')
        {
            char *name = malloc(20);
            char *num = malloc(20);
            char *search_num = malloc(20);
            printf("***  Student Manage System  ***\n");
            printf("***  [1] 添加学生信息       ***\n");
            printf("***  [2] 列出所有学生信息   ***\n");
            printf("***  [3] 查询学生信息       ***\n");
            printf("***  [4] 学生总数查询       ***\n");
            printf("***  [5] 删除学生信息       ***\n");
            printf("***  [q] 退出               ***\n");
            printf("请选择:");
            scanf("%c",&select);
            switch(select)
            {
                case '1':
                    printf("学生学号:");
                    scanf("%s",num);
                    printf("学生姓名:");
                    scanf("%s",name);
                    printf("您要添加的学生学号为No.%s,姓名为%s\n",num,name);
                    printf("*** [1] 确认添加 [其他]取消(请勿输入字符!)\n");
                    printf("请选择:");
                    int chose = 0;
                    scanf("%d",&chose);
                    if(chose==1)
                    {
                        if(if_in(head,num))
                        {
                            printf("学号已存在!请重新输入!\n");
                        }
                        else
                        {
                            input_inf(&head,num,name);
                            sum++;
                            printf("添加成功!\n");
                        }
                    }
                    else
                    {
                        printf("已取消!\n");
                    }
                    printf("---  3s后返回主页面  ---\n");
                    sleep(3);
                    system("clear");
                    break;
    
                case '2':
                    show_all_inf(head);
                    printf("---  3s后返回主页面  ---\n");
                    sleep(3);
                    system("clear");
                    break;
                case '3':
                    printf("输入学生学号:");
                    scanf("%s",search_num);
                    search(head,search_num);
                    printf("---  3s后返回主页面  ---\n");
                    sleep(3);
                    system("clear");
                    break;
                case 'q':
                    break;
                default:
                    printf("请重新选择!\n");
                    select = '1';
                    search(head,search_num);
                    printf("---  3s后返回主页面  ---\n");
                    sleep(3);
                    system("clear");
                    break;
    
                case '4':
                    printf("学生总数为%d人。\n",sum);
                    printf("---  3s后返回主页面  ---\n");
                    sleep(3);
                    system("clear");
                    break;
    
                case '5':
                    printf("输入要删除学生的学号:");
                    scanf("%s",search_num);
                    del(&head,search_num,&sum);
                    printf("---  3s后返回主页面  ---\n");
                    sleep(3);
                    system("clear");
                    break;
            }
            getchar();//这个getchar非常重要!用来读掉回车符!
        }
        FILE *fw = fopen(FILENAME,"w+");
        write_file(fw,head);
    
        return 0;
    }

    以下是需要的头文件

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #define FILENAME "Stu_data"
    展开全文
  • 这次完成的学生管理系统只是实现基本功能,其中还有很多可以改善的地方,例如对用户输入的数据合法性判断,用位域操作减小性别存储所需的空间,枚举限制性别参数的输入来保证合法性,添加文件读写操作等。 分为三个...

    C高级初步学完,综合学习内容并借此熟悉接下来的数据结构的顺序表内容
    这次完成的学生管理系统只是实现基本功能,其中还有很多可以改善的地方,例如对用户输入的数据合法性判断,用位域操作减小性别存储所需的空间,枚举限制性别参数的输入来保证合法性,添加文件读写操作等。
    ps:还应添加学号重复性的检查
    分为三个部分,student.h,student.c,main.c

    student.h

    #ifndef _STUDENT_H_
    #define _STUDENT_H_
    
    #include<stdio.h>
    #include<stdlib.h>
    
    #define MAX 30 //最大学生数
    
    typedef struct
    {
    	char name[20];
    	int id;
    	int gender;
    	int age;
    	double grade;
    }STU;
    
    typedef struct
    {
    	STU *stu;
    	int num;
    }CLASS;
    
    void menu();
    int Init_input();
    int Init();//顺序表初始化
    int input();//基础输入
    int add();//插入
    void output();//输出
    void find();//id查找
    int del();//删除
    int change();//修改
    void rank();//排序
    void all_out();//将所有学生信息输出打印
    
    #endif
    
    

    student.c

    #include "student.h"
    //表初始化
    int Init(CLASS *L)
    {
    	L->stu = (STU *)malloc(MAX*sizeof(STU));
    	if(!L->stu)
    		return 1;
    	L->num = 0;//空表
    	return 0;
    }
    
    
    void output(CLASS L,int n)
    {
    	printf("%d\t\t",L.stu[n].id);
    	printf("%s\t",L.stu[n].name);
    	printf("%s\t",L.stu[n].gender > 0 ? "男" : "女" );
    	printf("%d\t",L.stu[n].age);
    	printf("%.1lf\n",L.stu[n].grade);
    	
    	return;
    }
    
    int add(CLASS *L)
    {
    	
    	int n = 0, i = 0;	
    	printf("请输入要插入的位置:");
    	scanf("%d",&n);
    	getchar();
    
    	if(n < 1 || n>(L->num +1))
    	{
    		printf("无效位置\n");
    		return 0;
    	}
    
    	if(L->num >= MAX)
    	{
    		printf("空间已满\n");
    	}
    	
    	for(i = L->num+1 ;i >= n ;--i)
    	{
    		L->stu[i] = L->stu[i-1];
    	}
    	input(L,n);
    	return 1;
    }
    
    int  input(CLASS *L,int n)//插入兼输入,n为插入位置
    {
    
    	L->num++;
    	printf("学号:");
    	scanf("%d",&L->stu[n].id);
    	getchar();
    	printf("姓名:");
    	scanf("%s",L->stu[n].name);
    	printf("年龄:");
    	scanf("%d",&L->stu[n].age);
    	printf("性别(男为1,女为0):");
    	scanf("%d",&L->stu[n].gender);
    	printf("成绩:");
    	scanf("%lf",&L->stu[n].grade);
    	getchar();
    }
    
    void find(CLASS L)
    {
    	int ID = 0;	
    	int i = 1;
    	printf("请输入要查找的ID");
    	printf("num=%d\n",L.num);
    	scanf("%d",&ID);
    	getchar();
    	for(i = 1;i <= L.num;++i)
    	{ 
    		if(L.stu[i].id == ID)
    		{
    			printf("序号\t学号\t\t姓名\t性别\t年龄\t成绩\n");
    			output(L,i);
    			int x;
    			printf("按任意键返回");
    			getchar();
    			return;
    		} 
    
    	}
    	printf("该学号未注册\n");
    	return;
    
    }
    
    void rank(CLASS *p)
    {	
    	STU t_rank;
    	for(int i = 1;i <= p->num ; ++i)
    	{
    		for(int j = 1;j <= p->num -i;++j)
    		{
    			if((p->stu[j].grade) < (p->stu[j+1].grade))
    			{
    				t_rank=p->stu[j];
    				p->stu[j]=p->stu[j+1];
    				p->stu[j+1]=t_rank;
    			}
    				
    		}
    			
    	}
    
    	return;
    }
    
    void all_out(CLASS L)
    {
    	if(L.num == 0)
    	{
    		printf("暂无学生信息\n");
    		return;
    	}
    	printf("序号\t学号\t\t姓名\t性别\t年龄\t成绩\n");
    	for(int i = 1;i <= L.num; ++i)
    	{	
    		printf("%d\t",i);
    		output(L,i);
    	}
    	return;
    }
    
    int Init_input(CLASS *L)
    {
    	L->num = 0;
    	int n = 0;
    loop_input:
    	printf("要输入的学生个数为:");
    	scanf("%d",&n);
    	if( n > MAX || n < 1)
    	{
    		int x;
    		printf("1.重新输入\n其他.返回菜单\n");
    		scanf("%d",&x);
    		if(x == 1)
    			goto loop_input;
    		else
    			return 0;
    	}
    	for(int i =1;i<=n;++i)
    	{
    		input(L,i);
    	}
    
    
    }
    
    int change(CLASS *L)
    {
    	
    	int n = 0, i = 0;	
    	printf("请输入要修改的位置:");
    	scanf("%d",&n);
    	getchar();
    
    	if(n < 1 || n > L->num)
    	{
    		printf("无效位置\n");
    		return 0;
    	}
    
    	
    	input(L,n);
    	L->num--;
    	return 1;
    }
    
    int del(CLASS *L)
    {
    	
    	int n = 0, i = 0;	
    	printf("请输入要删除的位置:");
    	scanf("%d",&n);
    	getchar();
    	if(n < 1 || n > L->num)
    	{
    		printf("无效位置\n");
    		return 0;
    	}
    
    	for(i = n ;i <= L->num -1 ; ++i)
    	{
    		L->stu[i] = L->stu[i+1];
    	}
    
    
    	L->num--;
    	return 1;
    }
    
    
    

    main.c

    #include <stdio.h>
    #include "student.h"
    
    int main(int argc,char *argv[])
    {
    	
    	CLASS L;
    	STU stu;
    	Init(&L);
    	system("clear");//清空终端
    	int set;
    	int cmd = 0;
    	while(1)
    	{
    		printf("=====================\n");
    		printf("==1.初始化\n");
    		printf("==2.插入学生信息\n");
    		printf("==3.查看所有学生信息\n");
    		printf("==4.按ID查找学生信息\n");
    		printf("==5.按成绩降序输出\n");
    		printf("==6.修改学生信息\n");
    		printf("==7.删除学生信息\n");
    		printf("==8.退出系统\n");
    		scanf("%d",&cmd);
    		system("clear");
    		switch(cmd)
    		{
    			case 1://初始化系统
    				Init_input(&L);
    				break;
    			case 2://插入
    				add(&L);
    				getchar();
    				break;
    			case 3://输出所有学生信息
    				all_out(L);
    				getchar();
    				break;
    			case 4://按ID查找
    				find(L);
    				break;
    			case 5:
    				rank(&L);
    				all_out(L);
    				getchar();
    				break;
    			case 6:
    				change(&L);
    				getchar();
    				break;
    			case 7:
    				del(&L);
    				getchar();
    				break;
    			case 8:
    				return 0;
    			default:
    				system("clear");
    				break;
    		}
    	}
    	return 0;
    }
    
    

    对顺序的基本操作有,初始化,插入(添加),删除,销毁。
    以上代码,并没有进行free()销毁操作。
    对顺序表操作时要注意防止越界造成对非法内存的访问。
    ps:2020.08.17再次测试时发现两个错误,修改函数缺少L->num–;
    删除函数–i应为++i,并删除多余代码
    原代码,仅保留for循环,并将–i修改为++i即可

    	STU T;
    	if(L->num == 1)
    	{
    		L->stu[1] = T;
    
    	}
    	else
    	{
    		for(i = n ;i <= L->num -1 ;--i)
    		{
    			L->stu[i] = L->stu[i+1];
    		}
    		L->stu[L->num] = T;
    	}
    
    展开全文
  • python写的简单的学生管理系统,练习python语法。可以运行在windows和linux下,python 2.7。#!/usr/local/bin/python# -*- coding:utf-8 -*-import osimport re#定义学生类class Student:def __init__(self):self....

    python写的简单的学生管理系统,练习python语法。

    可以运行在windows和linux下,python 2.7。

    #!/usr/local/bin/python

    # -*- coding:utf-8 -*-

    import os

    import re

    #定义学生类

    class Student:

    def __init__(self):

    self.name = ''

    self.ID = ''

    self.score = 0

    #根据学生分数进行从大到小的冒泡排序

    def BuddleSortByScore( stulist ):

    n = len( stulist )

    for i in range( n ):

    for j in range( n - i - 1):

    if stulist[j].score < stulist[j+1].score:

    #tmp = stulist[j+1]

    #stulist[j+1] = stulist[j]

    #stulist[j] = tmp

    stulist[j],stulist[j+1] = stulist[j+1],stulist[j]

    #按顺序输出所有学生的信息

    def PrintAllStudentInfo( stulist ):

    print u"______________________学生列表_______________"

    for i in range( len(stulist) ):

    print u"姓名:" ,

    print stulist[i].name,

    print " " ,

    print u"学号:" ,

    print stulist[i].ID ,

    print " " ,

    print u"分数:" ,

    print stulist[i].score

    print "____________________________________________"

    #增加一个学生,增加成功返回True,否则返回False

    def Add( stulist , stu ):

    if searchByID( stulist , stu.ID ) == 1:

    print u"此ID已经存在!"

    return False

    stulist.append( stu )

    #给出是否保存更新数据的选择

    print "Do you want to save the result ?"

    nChoose = raw_input("Choose:Y/N:")

    if nChoose == 'Y' or nChoose == 'y':

    #将改变后的结果写入文件中,追加写文件

    file_object = open("students.txt","a")

    file_object.write( stu.ID )

    file_object.write( " " )

    file_object.write( stu.name )

    file_object.write( " " )

    file_object.write( str(stu.score) )

    file_object.write( " " )

    file_object.close()

    return True

    else:

    stulist.remove(stu)

    #根据ID删除一个学生的信息,删除成功则返回True,否则返回false

    def DeleteByID( stulist , ID ):

    for stu in stulist:

    if stu.ID == ID:

    stulist.remove( stu )

    #选择是否保存已经改变的内容

    print "Do you want to save the changed result ?"

    nChoose = raw_input("Choose:Y/N:")

    if nChoose == 'Y' or nChoose == 'y':

    file_object = open("students.txt" , "w+")

    for stu2 in stulist:

    file_object.write(stu2.ID)

    file_object.write(" ")

    file_object.write(stu2.name)

    file_object.write(" ")

    file_object.write(str(stu2.score))

    file_object.write(" ")

    file_object.close()

    print u"删除成功!"

    return True

    print u"删除失败!"

    return False

    #根据姓名删除一个学生的信息,删除成功返回True,否则返回False

    def DeleteByName( stulist , name ):

    pos = searchByName( stulist , name )

    if pos != -1:

    del stulist[pos]

    #选择是否保存已经改变的内容

    print "Do you want to save the changed result ?"

    nChoose = raw_input("Choose:Y/N:")

    if nChoose == 'Y' or nChoose == 'y':

    file_object = open("students.txt" , "w+")

    for stu2 in stulist:

    file_object.write(stu2.ID)

    file_object.write(" ")

    file_object.write(stu2.name)

    file_object.write(" ")

    file_object.write(str(stu2.score))

    file_object.write(" ")

    file_object.close()

    print u"删除成功!"

    return True

    else:

    print u"删除失败!"

    print pos

    return False

    #根据学号查找一个学生是否存在,存在返回学生在列表中的下标,否则返回-1

    def searchByID( stulist , ID ):

    for i in range( len(stulist) ):

    if stulist[i].ID == ID:

    print u"姓名:" ,

    print stulist[i].name ,

    print " " ,

    print u"学号:" ,

    print stulist[i].ID ,

    print " " ,

    print u"分数:" ,

    print stulist[i].score

    return i

    return -1

    #根据姓名查找一个学生是否存在,存在返回学生在列表中的下标,否则返回-1

    def searchByName( stulist , name ):

    for i in range( len(stulist) ):

    if stulist[i].name == name:

    print u"姓名:" ,

    print stulist[i].name ,

    print " " ,

    print u"学号:" ,

    print stulist[i].ID ,

    print " " ,

    print u"分数:" ,

    print stulist[i].score

    return i

    return -1

    #初始化,读取文件,更新学生信息

    def Init( stulist ):

    print u"初始化......"

    file_object = open("students.txt","r")

    #按行读取文件中学生的信息

    for line in file_object:

    stu = Student()

    line = line.strip(" ")

    s = line.split(" ")

    stu.ID = s[0]

    stu.name = s[1]

    stu.score = s[2]

    stulist.append(stu)

    print u"初始化成功!"

    #查找菜单

    def QueryMenu( stulist ):

    while True:

    print "******************************"

    print u"根据学生的学号进行查找-------1"

    print u"根据学生的姓名进行查找-------2"

    print u"离开查找模块----------------3"

    print "******************************"

    nChoose = raw_input("请输入你的选择")

    if nChoose == "1":

    ID = raw_input("请输入你要输入查找的ID:")

    searchByID( stulist , ID )

    elif nChoose == "2":

    name = raw_input("请输入你要查找的姓名:")

    searchByName( stulist , name )

    elif nChoose == "3":

    return

    else:

    print u"选择输入错误,请重新输入!"

    #删除模块

    def DeleteMenu( stulist ):

    while True:

    print "*****************************"

    print u"根据学生的学号进行删除------1"

    print u"根据学生的姓名进行删除------2"

    print u"离开删除模块---------------3"

    print "******************************"

    nChoose = raw_input("请进行选择:")

    if nChoose == "1":

    ID = raw_input("请输入你要删除的ID:")

    DeleteByID( stulist , ID )

    elif nChoose == "2":

    name = raw_input("请输入你要删除的姓名:")

    DeleteByName( stulist , name )

    elif nChoose == "3":

    return

    else:

    print u"您的选择有误,请重新输入!"

    #菜单

    def menu( stulist ):

    while True:

    print "***********************"

    print u"--------菜单------------"

    print u"增加学生信息---------1"

    print u"查找一个学生的信息----2"

    print u"删除一个学生的信息----3"

    print u"输出所有学生的信息----4"

    print u"根据分数排序---------5"

    print u"退出程序-------------6"

    print "------------------------"

    print "************************"

    nChoose = raw_input("请输入你的选择:")

    if nChoose == "1":

    stu = Student()

    stu.name = raw_input("请输入学生的姓名:")

    #匹配学生ID是否满足0--9中的数字

    while True:

    stu.ID = raw_input("请输入学生的ID:")

    #创建编译一个正则表达式的模板

    p = re.compile( '^[0-9]{3}$' )

    if p.match( stu.ID ):

    break

    else:

    print "学生的ID输入错误,正确形式应该为0--9之间的三位数字!"

    #匹配学生的分数是否满足0--100之间

    while True:

    stu.score = eval( raw_input("请输入学生的分数:") )

    #利用普通的符号来判断分数是否符合标准

    #if stu.score >= 0 and stu.score <= 100:

    # break

    #利用正则表达式来判断分数是否符合标准

    if re.match( "^[0-9]" ,str(stu.score) ) and stu.score<=100 and stu.score >= 0 :

    break

    else:

    print u"分数不满足实际情况,应该为0--100之间的数字!"

    if Add( stulist , stu ) == 1:

    print u"学生信息增加成功!"

    else:

    print u"学生信息增加失败!"

    elif nChoose == "2":

    QueryMenu( stulist )

    elif nChoose == "3":

    DeleteMenu( stulist )

    elif nChoose == "4":

    PrintAllStudentInfo( stulist )

    elif nChoose == "5":

    BuddleSortByScore( stulist )

    print "Do you want to save the sorted result?"

    choose = raw_input("please input your choice:Y/N:")

    if choose == 'Y' or choose == 'y':

    file_object = open("students.txt","w+")

    for stu2 in stulist:

    file_object.write(stu2.ID)

    file_object.write(" ")

    file_object.write(stu2.name)

    file_object.write(" ")

    file_object.write(str(stu2.score))

    file_object.write(" ")

    elif nChoose == "6":

    return

    else:

    print u"输入有误,请重新输入!"

    #测试函数部分

    if __name__ == '__main__':

    #定义一个列表用来存储所有学生的信息

    stulist = []

    #初始化,从文件中读取信息

    Init( stulist )

    #菜单函数

    menu( stulist )

    运行需要读写文件Students.txt。文件格式如下图:

    2018011110480839.png

    更多学习资料请关注专题《管理系统开发》。

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

    本文标题: python实现学生管理系统

    本文地址: http://www.cppcns.com/jiaoben/python/217602.html

    展开全文
  • Linux下系统分区管理 设备查看命令 命令 功能 fdisk -l 查看真实存在的设备 cat /proc/partitions 查看系统识别的设备 blkid 查看系统可使用的设备 df 查看系统正在挂载的...

    Linux下的系统分区管理

    设备查看命令

    命令 功能
    fdisk -l 查看真实存在的设备
    cat /proc/partitions 查看系统识别的设备
    blkid 查看系统可使用的设备
    df 查看系统正在挂载的设备

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    设备的挂载卸载(mount 与 umount命令)

    1|mount /dev/sdb /mnt							##挂载sdb到mnt
    2|umount /mnt | /dev/sdb						##卸载
    3|mount -o ro /dev/sdb /mnt					##只读挂载
    4|mount										##查看挂载信息
    5|mount -o remount,rw /dev/sdb /mnt			##重新读写挂载
    

    出现设备正忙情况问题

    在挂载目录中或者有其他用户在挂载目录的情况下,如果进行卸载的时候会提示设备正忙
    解决的方法如下:
    方法一:

    fuser -vm /mnt					##查看正在使用的设备
    fuser -kvm /mnt					##停止正在使用的设备
    umount /mnt						##卸载设备
    

    方法二:

    lsof /mnt     				##查看正在使用的设备
    kill -9 PID					##强行将pid为...的设备退出
    umount /mnt					##卸载
    

    主分区表及磁盘分区类型

    在这里插入图片描述
    MBR下的硬盘分区有三种,主磁盘分区、扩展磁盘分区、逻辑分区。(ps:现在的GPT分区至少可以划分128个主分区,未来很有可能将不存在扩展分区和逻辑分区的概念。)

    主分区:也叫引导分区,最多可能创建4个,当创建四个主分区时候,就无法再创建扩展分区了,当然也就没有逻辑分区了。主分区是独立的,对应磁盘上的第一个分区,“一般”就是C盘。在Windows系统把所有的主分区和逻辑分区都叫做“盘”或者“驱动器”,并且把所有的可存储介质都显示为操作系统的“盘”。因此,从“盘”的概念上无法区分主分区和逻辑分区。并且盘符可以在操作系统中修改,这就是要加上“一般”二字的原因。
    扩展分区:除了主分区外,剩余的磁盘空间就是扩展分区了,扩展分区可以没有,最多1个。严格地讲它不是一个实际意义的分区,它仅仅是一个指向下一个分区的指针,这种指针结构将形成一个单向链表。这样在主引导扇区中除了主分区外,仅需要存储一个被称为扩展分区的分区数据,通过这个扩展分区的数据可以找到下一个分区(实际上也就是下一个逻辑磁盘)的起始位置,以此起始位置类推可以找到所有的分区。无论系统中建立多少个逻辑磁盘,在主引导扇区中通过一个扩展分区的参数就可以逐个找到每一个逻辑磁盘。
    逻辑分区:在扩展分区上面,可以创建多个逻辑分区。逻辑分区相当于一块存储截止,和操作系统还有别的逻辑分区、主分区没有什么关系,是“独立的”。
    注意:
    一个硬盘的主分区也就是包含操作系统启动所必需的文件和数据的硬盘分区,要在硬盘上安装操作系统,则该硬盘必须得有一个主分区。扩展分区也就是除主分区外的分区,但它不能直接使用,必须再将它划分为若干个逻辑分区才行。逻辑分区也就是我们平常在操作系统中所看到的D、E、F等盘。 不管使用哪种分区软件,我们在给新硬盘上建立分区时都要遵循以下的顺序:建立主分区→建立扩展分区→建立逻辑分区→激活主分区→格式化所有分区。

    如何对磁盘分区

    下面我们以/dev/vdb/为例进行分区
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    如何使用新建立的分区

    mkfs.xfs /dev/vdb1								##默认格式化磁盘
    blkid 											##查看系统可用设备
    mkfs.xfs /dev/vbd1 -L haha -f 				##给格式化的磁盘添加标签 -f强制格式化
    mount /dev/vdb1 /mnt							##挂载(这里的挂载是临时的  如果要永久挂载,编辑/etc/fstab)
    vim /etc/fstab									##自动挂载策略文件,实现永久挂载
    mount -a										##自动挂载
    

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    永久挂载的方法

    vim /etc/fstab									##自动挂载策略文件,实现永久挂载
    

    在这里插入图片描述

    swap分区管理

    swap分区的作用
    Linux系统的Swap分区,即交换区,Swap空间的作用可简单描述为:当系统的物理内存不够用的时候,就需要将物理内存中的一部分空间释放出来,以供当前运行的程序使用。那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到Swap空间中,等到那些程序要运行时,再从Swap中恢复保存的数据到内存中。这样,系统总是在物理内存不够时,才进行Swap交换。其实,Swap的调整对Linux服务器,特别是Web服务器的性能至关重要。通过调整Swap,有时可以越过系统性能瓶颈,节省系统升级费用。

    建立新的 swap 分区,只需要执行以下几个步骤。
    1.分区:用fdisk 命令先分区。并设定分区标签为82,然后用partprobe同步磁盘分区
    2.格式化:格式化命令稍有不同,使用 mkswap 命令把分区格式化成 swap 分区。
    3.使用 swap 分区。

    step1选择分区,并且设定分区的标签
    在这里插入图片描述
    step2 使用mkswap命令进行格式化

    1|mkswap	/dev/vdb1										##把/dev/vdb1格式化成swap格式
    2|swapon -a /dev/vdb1										##激活(这里的激活是临时的  如果要开机自动激活,编辑/etc/fstab)
    3|swapon -s												##查看系统中的swap分区
    

    在这里插入图片描述
    开机自动激活

    1|vim /etc/fstab
    

    在这里插入图片描述
    swap分区删除

    1|swapoff /dev/vdb3											##关闭激活的swap分区
    

    删除/etc/fstab中的swap开机自动激活条目

    应急磁盘建立

    dd if=/dev/zero of=/swapfile bs=1M count=500 			##分一个大小为500M的swapfile目录出来
    du-sh /swapfile											##查看大小	
    mkswap /swapfile										##把划分好的swapfile格式化成swap格式
    swapon -a /swapfile										##激活
    swapon -s												##查看swap分区
    

    用完后删除的方法:

    swapoff /swapfile										##关闭激活的swapfile
    rm -fr /swapfile										##删除swapfile目录
    

    在这里插入图片描述

    磁盘配额

    磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。
    实现磁盘限额的条件
    需要Linux内核支持,安装quota软件包
    step1 先建立一个磁盘,把它格式化- - - mkfs.xfs命令

    mount -o usrquota /dev/vdb3 /mnt						##挂载一个可配额的磁盘
    chmod 777 /mnt											##更改权限
    edquota -u student /dev/vdb3							##在该磁盘中给student用户配额
    

    在这里插入图片描述
    在这里插入图片描述
    注意:要更改文件权限,要先挂载了再改。如果改了权限以后再挂载,权限又会被改回去。以上这个挂载配额的方法是临时的,如果要开机自动挂载可配额磁盘

    1|vim /etc/fstab
    

    在这里插入图片描述
    测试:
    登录限制配额的学生用户
    当大于20时,系统会默认创建只有20M的文件。
    在这里插入图片描述

    磁盘加密

    1.概念简介
    LUKS(linyx统一密钥设置)是标准的设备加密格式;可以对分区或卷进行加密。

    目的:根据需要,一般会在系统中对文件和磁盘进行加密,但是文件的加密比较容易破解,不安全。所以在特殊需要下,会对磁盘进行加密,磁盘加密后在磁盘损坏的同时,其中的数据也会损坏
    加密的特点:
    使用cryptsetup对分区进行了加密后,这个分区就不再允许直接挂载,必须首先对加密的卷进行解密才能挂载。
    如果要使用这个分区,必须对这个分区做一个映射,映射到/dev/mapper这个目录里去,我们只能挂载这个映射才能使用。然而做映射的时候是需要输入解密密码的。

    2加密步骤

    cryptsetup luksFormat /dev/vdb7						##加密
    cryptsetup open /dev/vdb7 haha					##打开加密的设备(解密)
    mkfs.xfs /dev/mapper/haha							##用管理文件格式化设备
    mount /dev/mapper/haha /mnt						##挂载(使用设备)
    umount /mnt											##卸载设备
    cryptsetup close haha								##关闭加密的设备
    

    在这里插入图片描述
    在这里插入图片描述
    若要使用该磁盘,直接输入解密和后续的操作,该方法存在着缺点,降低磁盘读写速度,增加cpu负载

    加密磁盘开机自动挂载及如何取消自动挂载

    自动挂载

    vim /etc/fstab					##在其中编辑自动挂载部分
    vim /etc/crypttab				##在其中编辑自动解密部分
    vim /root/westoskey				##在其中写入密码
    
    

    完成以上三个文件的编辑后,输入以下命令完成设定``

    cryptsetup luksAddKey /dev/vdb7 /root/westoskey						##把密码记录文件与设备关联
    

    在这里插入图片描述
    在这里插入图片描述

    取消开机自动挂载
    取消开机自动挂载设定,首先删除设定的三个文件,然后执行下面的操作

    umount /dev/mapper/westos					##取消挂载
    cryptsetup close westos						##关闭加密设备
    mkfs.xfs /dev/vdb5 -f						##格式化
    

    如何转换分区方式

    1 |parted /dev/vdb
    

    在这里插入图片描述
    在这里插入图片描述

    一条命令新建swap分区功能

    实验目的:编辑脚本实现swap分区功能,使操作过程快捷有效
    实验步骤
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 学生管理系统

    2021-05-10 16:53:44
    4、进入学生管理系统后,有每一次的操作记录。这些记录都会放入日志文件中 .c文件说明 1个.h头文件(stu_main.h)、1个.c主函数文件(stu_main.c)、1个大的makefile 和3个文件夹 3个文件夹分别是读写配置文件rea
  • 这是C语言写的一个学生管理系统,基本功能都已实现,在linux环境写的,通用链表,文件读写
  • Linux系统下的分区储存管理(下) 五、磁盘加密 磁盘加密,是指将计算机用户的磁盘进行加密,防止信息泄漏。可以通过分区加密启用数据保密。 LUKS ( Linux 统一密钥设置)是标准的设备加密格式。 LUKS 可以对分区或...
  • 基于SSM的学生信息管理系统(选课)

    万次阅读 多人点赞 2019-04-15 19:40:52
    由SpringMVC+MyBatis为主要框架,mysql8.0配置主从复制实现读写分离,主机丛机分别为腾讯云的服务器,而项目部署在阿里云上。前端主要由bootstrap完成,背景用particles.js插件。数据库交互查询用到pagehelper分页。...
  • linux系统文件介绍

    千次阅读 2020-01-08 16:48:38
    linux系统文件介绍 一、简介: Linux操作系统中,以文件来表示所有的逻辑实体与非逻辑实体。逻辑实体系指文件与目录;非逻辑实体则泛指硬盘、终端机、打印机等。...Linux文件系统中,结构上以rootfi...
  • 文章目录前言项目简介说明程序示意程序代码问题分析编码规范程序...这是一个纯C语言实现的学生信息管理系统,以本人一年后的编程习惯来看,有些不尽人意,所以此博客在分享代码的同时会指出其中可改进之处。 此外...
  • 本篇文章主要介绍:- 如何在linux下添加、删除以及修改用户信息- 详解文件所属者、所属组以及文件读写执行等等操作?> linux下系统管理员称为root,对应的uid为0,在linux下有三种不同的用户- 管理员:其uid为0;...
  • 这个实在linux系统下写的,参考了一下网上的代码,然后按照自己的想法一个一个敲进去的,存在一些不严谨的地方,但能用,不想花太多的时间去修改,,我会尽量解释清楚,因为有时候自己参考别人的代码,有一些自己没...
  • Linux多线程编程之员工信息管理系统

    千次阅读 2017-12-06 22:20:31
    员工信息管理系统是基于Linux C编程,由服务器端和客户端构成,客户端可以运行在多个不同的主机上连接服务器,服务器对员工信息的操作结果通过“员工信息文件”来保存,即:“员工信息”存放在后台的文件中,相当于...
  • 操作系统课程设计--为linux系统设计一个简单的二级文件系统 (13页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦!19.90 积分操作系统课程设计报告操作系统课程设计报告...
  • Linux文件管理命令大全

    千次阅读 2018-07-06 15:56:20
    1.cat命令cat 命令用于连接文件并打印到标准输出设备上。 使用权限所有使用者语法格式cat [-AbeEnstTuv] [--help] [--version] fileName参数说明:-n 或 --number:由 1 开始对所有输出的行数编号。-b 或 --number-...
  • Linux系统文件目录

    千次阅读 2011-11-15 21:27:03
    一、简介: Linux操作系统中,以文件来表示所有的逻辑实体与非逻辑实体。逻辑实体系指文件与目录; 非逻辑实体则泛指硬盘、终端机、打印机等。...Linux文件系统中,结构上以root file system 位最上位也最为重
  • linux 文件IO系统学习

    2019-06-29 16:32:08
    所有的IO操作打开的文件系统都会生成一个文件描述符fd来表示已经打开的文件。fd是一个整数。 fd = open(pathname, flags, mode) 函数打开pathname所标识的文件,并返冋文件描述符,用以在后续函数调用中指代打开的...
  • Linux系统文件介绍

    千次阅读 2011-12-01 14:37:14
    Linux作业系统中,以档案来表示所有的逻辑实体与非逻辑实体。逻辑实体指档案与目录; 非逻辑实体则泛指硬碟、终端机、印表机等。 一般而言,Linux档案名称的组成除由连续字母、标点符号、数字等构成外,中间不能有...
  • 第十五章、磁碟配额(Quota)与进阶文件系统管理 最近升级日期:2009/09/10 如果您的 Linux 服务器有多个用户经常存取数据时,为了维护所有使用者在硬盘容量的公平使用,磁碟配额 (Quota) 就是一项非常有用的...
  • 文件系统使用树形结构来管理文件的,凡是涉及管理的,都是以树形结构来管理的,比如班级学生组织结构,政府、公司的人员组织结构,都是以树形结构来管理的。 对于文件系统来说,目录是非常重要的文件组织节点。 ...
  • 这两天看了linux内核里面经典的list.h文件,看的似懂非懂,心想要是就这样放过去了,过段时间肯定连影子记不起来了,所以决定自己动手试试,能否将这个文件里面的函数和宏应用起来。想法很完美,但时间起来确实费了...
  • 学号*************学院课 程 设 计课程名称 操作系统课程设计题目 为LINUX 设计一个简单的二级文件系统专 业 *********班 级 *******姓 名 ********成 绩指导教师 *********2011年1月17日 至 2011年1月21日课程设计...
  • 一、简介:Linux操作系统中,以文件来表示所有的逻辑实体与非逻辑实体。逻辑实体系指文件与目录; 非逻辑实体则泛指硬盘、终端机、打印机等。 一般而言,Linux文件名称的... Linux文件系统中,结构上以root file system 位
  • Linux系统安全

    2021-07-13 21:55:09
    Linux系统诞生于1991年,由芬兰大学生(linus Torvalds)和后来陆续加入的众多爱好者共同开发完成。 Linux是开源软件,是源代码开放的Linux分支。具备现代一切功能完整的UNIX系统所具备的全部特征。 Linux的发行遵守...
  • 一、简介:  Linux操作系统中,以文件来表示所有的逻辑实体与非逻辑实体。逻辑实体系指文件与目录; 非逻辑实体则泛指硬盘、终端机、打印机等。  一般而言,Linux文件...Linux文件系统中,结构上以root file system
  • Linux-系统文件

    2017-08-03 15:11:27
    操作系统作同样做为一个软件,也需要大量使用数据,而这些很多的数据都是来自于系统自身的数据文件,本章基本只讲解口令/etc/passwd、组文件/etc/group和阴影口令文件这三个系统文件。 /etc/passwd:存放了所有用户...
  • 最近看了《鸟哥的Linux私房菜》之后,对文件的权限管理有了新的认识,对文件和目录的权限也有了系统的认知,其中最让我容易混淆的就是“x”权限了! 1.用户和用户组 在我们要学习文件权限的时候,用户和用户组是一个...
  • 文章目录1.Linux介绍、命令1.1操作系统(科普章节)目标1. 操作系统(Operation System,OS)1.1 操作系统的作用1.2 不同应用领域的主流操作系统1> 桌面操作系统2> 服务器操作系统3> 嵌入式操作系统4> ...
  • Linux系统初识

    2018-12-18 22:49:16
    Linux是一个操作系统(Operating System),主要负责分配底层硬件的抽象能力,协调各个程序的运行的程序1。 然而对于刚入门的我们而言,这个回答似乎并没有让我们明白,遂本文章将从最基础的概念开始说起,说明该...
  • Linux系统内核笔记

    2019-09-24 10:49:42
    UNIX/Linux环境C语言,借助学习操作系统的接口的方法来学习、理解操作系统的 运行机制以及一些网络协议 C/C++、数据结构和算法 与平台无关,重点是算法逻辑 Uinx/Linux/Android/IOS 平台相关,系统接口 嵌入式/驱动/...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,640
精华内容 2,656
关键字:

linux下文件读写学生管理系统

linux 订阅