当前位置:首页 » 《休闲阅读》 » 正文

基于文件的数据管理实例(R语言版)_GYQ258的博客

2 人参与  2021年12月31日 14:16  分类 : 《休闲阅读》  评论

点击全文阅读


摘要

在学习数据库原理之前很多小伙伴可能都会接触文件系统管理,现在我们用一个实例来理解一下它。假如我们有一个教学管理系统,所有的数据都用csv文件保存,我们如何模拟对这个系统的一系列操作呢?且听我慢慢道来

目录

压缩文件说明

文件的随机生成

1.首先是记录学生选课信息的文件StudentClassChoose.csv

2.其次是记录学生每门课程分数的文件CourseGrades.csv

3.然后是课程信息文件CourseInfo.csv

4.最后是教师信息文件

模拟数据管理

1.如果我们需要查询某个学生的选课情况,请问怎么实现?

2.如果我们要查询某门课程的选课情况,如何实现?

3.如果我们要修改某个学生某门课程的分数,怎么实现?

4.如果我们要给某个学生退课,怎么操作实现?

5.如果一个教师没有开课,我们怎么查询这个教师的信息?

6.如果我们需要约束每个学生每个选课的学分不能低于20,如何实现?

总结


压缩文件说明

我将我用到的所有代码都保存为了一个R脚本文件FonctionCode.R并放在了文件夹中,里面的csv文件是我在模拟过程中用到的文件,读者也可以删除以后自己调用函数来模拟~

点这里下载~

文件的随机生成

为了模拟文件系统的管理方式,在这里我使用R语言作为工具,首先假设有一个教学管理系统,我们先为它随机生成一些数据文件:

1.首先是记录学生选课信息的文件StudentClassChoose.csv

假设我们有100个学生,这里用一个6位的学号作为其唯一标识,假设有八门课程分别为Chinese,Mathematics,English,Physical,Chemistry,Biology,History和Geography,为便于读者模拟,我把它放到函数StudentChooseClass中,调用StudentChooseClass(),即可生成文件StudentClassChoose.csv,模拟学生选课的这一过程,表中0表示为选课,1表示已选课:

StudentChooseClass <- function(){
  studentID <- as.character(sample(100000:999999,100))
  Chinese <- sample(0:1,100,replace = T)
  Mathematics <- sample(0:1,100,replace = T)
  English <- sample(0:1,100,replace = T)
  Physical <- sample(0:1,100,replace = T)
  Chemistry <- sample(0:1,100,replace = T)
  Biology <- sample(0:1,100,replace = T)
  History <- sample(0:1,100,replace = T)
  Geography <- sample(0:1,100,replace = T)
  StdClsChos <- data.frame(studentID,Chinese,Mathematics,English,Physical,Chemistry,History,Geography,Biology)
  rownames(StdClsChos) <- paste("student",1:100,sep = "")
  write.csv(StdClsChos,"StudentClassChoose.csv")
}

可以看一下随机生成的结果(这里只展示前20条):

2.其次是记录学生每门课程分数的文件CourseGrades.csv

在这里需要注意的是,学生只有在选了课程以后相应的课程才会有分数,所以在随机生成这一文件的时候是有一定的条件的,需要参照StudentClassChoose.csv里的选课信息来赋予分数,在这里我用两重循环来实现,未选的课程用NA来表示,并放到了函数RandomCourseGrades()中:

RandomCourseGrades <- function(){
  CourseGrades <- StdClsChos
  for(i in 1:nrow(CourseGrades)){
    for(j in 2:ncol(CourseGrades)){
      if(StdClsChos[i,j]==1)CourseGrades[i,j] <- sample(0:100,1)
      else if(StdClsChos[i,j]==0)CourseGrades[i,j] <- NA
    }
  }
  write.csv(CourseGrades,"CourseGrades.csv")
}

我们看一下随机生成的结果:

3.然后是课程信息文件CourseInfo.csv

假设每个课程包含课程学分和任课教师的信息,我们也同样可以通过模拟生成一个文件:

RandCourseInfo <- function(){
  AllTeacher <- paste("teacher",1:9,sep = "")
  course <- c("Chinese","Mathematics","English","Physical","Chemistry","History","Geography","Biology")
  teacher <- sample(AllTeacher,8,replace = T)
  credit <- sample(5:8,8,replace = T)
  CourseInfo <- data.frame(credit,teacher)
  row.names(CourseInfo) <- course
  write.csv(CourseInfo,"CourseInfo.csv")
}

这里假设课程学分从5到8分不等,我们可以看看生成的结果:

4.最后是教师信息文件

延续上一步的工作,假设总共有9个教师,他们的信息包括教职工ID、职称、开课信息等,这里需要注意开课信息需要和课程信息文件相吻合,具体代码如下,经实现这一功能的函数命名为RandTeacherInfo():

RandTeacherInfo <- function(){
  CourseInfo <- read.csv("CourseInfo.csv",header = T,row.names = 1)
  ID <- as.character(sample(1000:9999,9))
  AllTitle <- c("pro","resercher","assistant","lecturer")
  Title <- sample(AllTitle,9,replace = T)
  AllTeacher <- paste("teacher",1:9,sep = "")
  course <- rep("",9)
  TeacherInfo <- data.frame(ID,Title,course)
  row.names(TeacherInfo) <- AllTeacher
  for(i in 1:nrow(CourseInfo)){
    TeacherInfo[CourseInfo[i,"teacher"],"course"] <- paste(TeacherInfo[CourseInfo[i,"teacher"],"course"],row.names(CourseInfo)[i],sep = " ")
  }
  write.csv(TeacherInfo,"TeacherInfo.csv")
}

可以查看一下结果:

teacher9确实开了很多课......

模拟数据管理

1.如果我们需要查询某个学生的选课情况,请问怎么实现?

由于StudentClassChoose.csv保存了学生的选课信息,我们只需打开该文件后查询特定学生的选课情况即可,为此编写一个函数Search_StudentChoosing:

Search_StudentChoosing <- function(ID){
  StdClsChos <- read.csv("StudentClassChoose.csv",header = T,row.names = 1)
  colnames(StdClsChos)[StdClsChos[which(StdClsChos[,"studentID"]==ID),]==1]
}

比如我们要查看学号为882691的学生的选课信息:

发现该学生选的课程有语文、数学、化学、历史和生物。

2.如果我们要查询某门课程的选课情况,如何实现?

同样的道理,这一信息也存储于StudentClassChoose.csv文件中,我们同样可以编写一个函数Search_CourseChoosing来实现这一功能:

Search_CourseChoosing <- function(course){
  StdClsChos <- read.csv("StudentClassChoose.csv",header = T,row.names = 1)
  rownames(StdClsChos)[StdClsChos[course]==1]
}

假如要查看哪些同学选了生物课:

看来选生物课的同学还是挺多的哈哈哈

3.如果我们要修改某个学生某门课程的分数,怎么实现?

由于学生的课程分数保存在CourseGrades.csv文件中,我们先在其中查找某个学生的某个课程分数,如果为NA则说明他没选这门课,提示错误信息,如果有则根据给出的grades将该课程分数改为grades并保存,为实现这一功能,编写函数ModifyGrades():

ModifyGrades <- function(ID,course,grades){
  CourseGrades <- read.csv("CourseGrades.csv",header = T,row.names = 1)
  n <- which(CourseGrades$studentID==ID)
  if(is.na(CourseGrades[n,course]))print("he/she hasn't chosen this course")
  else {
    CourseGrades[n,course]=grades
    write.csv(CourseGrades,"CourseGrades.csv")
  }
}

我们先来看一下student16的成绩信息:

假如要修改它的历史和生物成绩:

4.如果我们要给某个学生退课,怎么操作实现?

学生退课涉及到要同时修改CourseGrades.csv和StudentClassChoose.csv两个文件,首先还是检查学生是否选修对应课程,若未选则报错,选择了需要同时修改该学生对该课程的选课情况为0,同时更改其分数为NA,为实现这一功能,编写函数DropOut():

DropOut <- function(ID,course){
  StdClsChos <- read.csv("StudentClassChoose.csv",header = T,row.names = 1)
  CourseGrades <- read.csv("CourseGrades.csv",header = T,row.names = 1)
  n <- which(StdClsChos$studentID==ID)
  if(StdClsChos[n,course]==0){
    print("he/she hasn't chosen this course")
  }else{
    StdClsChos[n,course] <- 0
    CourseGrades[n,course] <- NA
  }
  write.csv(StdClsChos,"StudentClassChoose.csv")
  write.csv(CourseGrades,"CourseGrades.csv")
}

来看看22号学生的信息:

假如他要退掉成绩最差的化学课:

退课成功!

5.如果一个教师没有开课,我们怎么查询这个教师的信息?

学生在选课时可以通过CourseInfo.csv中的课程信息看到开课教师的信息,但如果有的教师没有开课(比如我们这里模拟的结果总共有9个老师,但是只有teacher2、3、5、7、9五位老师有开课,其他的老师怎么办呢,这时候就只能直接查找教师信息了,由于这一工作只有一行的代码量,比较简单,我就没有单独写函数了。假如要查找teacher4的信息,直接在控制台输入:

> TeacherInfo["teacher4",]

结果如下:

可以看到这位教授确实是没有开课的

6.如果我们需要约束每个学生每个选课的学分不能低于20,如何实现?

我们来模拟一下某个学生的选课过程,由于要检测这个学生所选的学分是否低于20,我们就需要用到课程信息文件CourseInfo.csv和学生选课信息的文件StudentClassChoose.csv。如果这是学生选的最后一门课,则参数op需要改为"end",否则默认会继续进行选课,当参数op为"end"时就会检测这个学生所选的学分是否低于20,如果低于20则会给出提示信息,并强制进行继续选课

SelectCourse <- function(ID,course,op="continue"){
  StdClsChos <- read.csv("StudentClassChoose.csv",header = T,row.names = 1)
  CourseGrades <- read.csv("CourseGrades.csv",header = T,row.names = 1)
  n <- which(StdClsChos$studentID==ID)
  if(StdClsChos[n,course]==1){
    print("he/she has already chosen this course")
  }else{
    StdClsChos[n,course] <- 1
    CourseGrades[n,course] <- sample(0:100,1)
  }
  if(op=="end"){
    CourseInfo <- read.csv("CourseInfo.csv",header = T,row.names = 1)
    TotalCredit <- 0
    for(i in 2:ncol(StdClsChos)){
      if(StdClsChos[n,i]==1)TotalCredit <- TotalCredit+CourseInfo[colnames(StdClsChos)[i],"credit"]
    }
    if(TotalCredit<20){
      write.csv(StdClsChos,"StudentClassChoose.csv")
      write.csv(CourseGrades,"CourseGrades.csv")
      print("the total credits of your selected courses still less than 20!!!please input an another course and your op")
      course <- readline()
      op <- readline()
      SelectCourse(ID,course,op)
    }else{
      write.csv(StdClsChos,"StudentClassChoose.csv")
      write.csv(CourseGrades,"CourseGrades.csv")
    }
  }
  else{
    write.csv(StdClsChos,"StudentClassChoose.csv")
    write.csv(CourseGrades,"CourseGrades.csv")
    print("please input an another course and your op")
    course <- readline()
    op <- readline()
    SelectCourse(ID,course,op)
  }
}

现在我们找一个选课比较少的学生来看看:

让我们看看课程信息:

因此他只选了历史是不够的,只有6学分,我们来模拟一下选课:

第一次选了数学就想结束?不存在的,系统会让你继续选课,然后选了英语又想结束选课,同样没到标准,最后再选了一门生物才终于能结束选课,这时候我们可以来看看他的选课信息:

这时候已经选了四门课了

总结

从以上的例子可以看出,文件系统管理数据有很多麻烦的地方:

1.文件系统面向某一应用程序,共享性差,冗余度大,每次需要实现一个应用程序功能都要有一个专门为他服务的文件,这样也会造成存在很多冗余信息。

2.数据独立性差,记录内有结构,整体无结构,很容易把人绕晕。(我做完这个真的已经晕了)

3.文件系统中的程序和数据的联系很大,开发应用的人需要对数据文件也很熟悉,不能做到程序和数据相分离。

4.安全性不高,从上面我做的例子就可以看出,修改某一内容需要同时更改好几个文件里的内容,否则数据自身就可能会出现矛盾(不同文件中信息不一致)

......

这也是我们为什么要用数据库来管理数据的原因,之后有时间(等我学好了数据库)我们再一起来谈一谈数据库的管理以及它的优点~

第一篇文章不容易,还希望各位老爷点个赞多多支持呜呜呜


点击全文阅读


本文链接:http://m.zhangshiyu.com/post/32452.html

选课  文件  学生  
<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1