Metamorphosis 2k24: GoLang Project
Student-DB
├── main.go
├── db.txt
└── features
└── features.go
package main
import (
"fmt"
)
func main () {
fmt .Println ("Hello, World!" )
}
package features
//Note these are final dependencies and if they give any error just comment unused ones for time being.
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
type Student struct {
Name string
RollNo string
Marks int
}
type Class struct {
Engineers []Student
}
func inputName () string {
fmt .Println ("Enter your first name" )
var name string
fmt .Scanln (& name )
return name
}
func inputRoll () string {
fmt .Println ("Enter your roll no" )
var roll string
fmt .Scanln (& roll )
return roll
}
func inputMarks () int {
fmt .Println ("Enter your marks" )
var marks int
fmt .Scanln (& marks )
return marks
}
func (c * Class ) NewClass () {
// fmt.Println(entry)
var studentsArray []Student
file , err := os .Open ("db.txt" )
if err != nil {
panic (err )
}
scanner := bufio .NewScanner (file )
for scanner .Scan () {
line := scanner .Text ()
fields := strings .Split (line , " " )
marks , _ := strconv .Atoi (fields [2 ])
entry := Student {
Name : fields [0 ],
RollNo : fields [1 ],
Marks : marks ,
}
studentsArray = append (studentsArray , entry )
}
// fmt.Println(studentsArray)
c .Engineers = studentsArray
}
func (c * Class ) AddStudent () {
name := inputName ()
roll := inputRoll ()
marks := inputMarks ()
entry := Student {
Name : name ,
RollNo : roll ,
Marks : marks ,
}
c .Engineers = append (c .Engineers , entry )
fmt .Println ("Student Added Successfully" )
fmt .Println ()
//Update this data in the db.txt
}
func (c * Class ) ShowStudents () {
for _ , student := range c .Engineers {
name , roll , marks := student .Name , student .RollNo , student .Marks
fmt .Printf ("Name: %s\n Roll No: %s\n Marks: %d\n " , name , roll , marks )
fmt .Println ()
}
}
func (c * Class ) UpdateStudent () {
roll := inputRoll ()
// find the student
index := 0
for ind , stu := range c .Engineers {
if stu .RollNo == roll {
index = ind
break
}
}
// get the data
newName := inputName ()
newMarks := inputMarks ()
// change the data
c .Engineers [index ] = Student {
RollNo : roll ,
Name : newName ,
Marks : newMarks ,
}
}
func (c * Class ) DeleteStudent () {
// get the data
roll := inputRoll ()
index := 0
// find the index
for idx , student := range c .Engineers {
if student .RollNo == roll {
index = idx
}
}
// remove the student
c .Engineers = append (c .Engineers [:index ], c .Engineers [index + 1 :]... )
}
func (c * Class ) writeToFile (wg * sync.WaitGroup ) {
// convert []Student into string
var result []string
for _ , val := range c .Engineers {
current := fmt .Sprintf ("%v %v %v" , val .Name , val .RollNo , val .Marks )
result = append (result , current )
}
err := os .WriteFile ("db.txt" , []byte (strings .Join (result , "\n " )), 0644 )
if err != nil {
fmt .Println (err .Error ())
}
}
package main
import (
"fmt"
"os"
features "student-db/Features"
)
func displayChoices () {
fmt .Println ("Select one of the choices" )
fmt .Println ("1. Add a new Student" )
fmt .Println ("2. Show all Students" )
fmt .Println ("3. Update Student" )
fmt .Println ("4. Delete Student" )
fmt .Println ("5. Exit" )
}
func main () {
fmt .Println ("Welcome to student DB" )
var class features.Class
class .NewClass ()
for {
displayChoices ()
var choice int
fmt .Scanln (& choice )
switch choice {
case 1 :
class .AddStudent ()
case 2 :
class .ShowStudents ()
case 3 :
class .UpdateStudent ()
case 4 :
class .DeleteStudent ()
case 5 :
os .Exit (0 )
default :
fmt .Println ("Invalid choice" )
}
}
}
package features
//Note these are final dependencies and if they give any erro just comment unused ones for time being.
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
"sync"
)
type Student struct {
Name string
RollNo string
Marks int
}
type Class struct {
Engineers []Student
}
func inputName () string {
fmt .Println ("Enter your first name" )
var name string
fmt .Scanln (& name )
return name
}
func inputRoll () string {
fmt .Println ("Enter your roll no" )
var roll string
fmt .Scanln (& roll )
return roll
}
func inputMarks () int {
fmt .Println ("Enter your marks" )
var marks int
fmt .Scanln (& marks )
return marks
}
func (c * Class ) NewClass () {
// fmt.Println(entry)
var studentsArray []Student
file , err := os .Open ("db.txt" )
if err != nil {
panic (err )
}
scanner := bufio .NewScanner (file )
for scanner .Scan () {
line := scanner .Text ()
fields := strings .Split (line , " " )
marks , _ := strconv .Atoi (fields [2 ])
entry := Student {
Name : fields [0 ],
RollNo : fields [1 ],
Marks : marks ,
}
studentsArray = append (studentsArray , entry )
}
// fmt.Println(studentsArray)
c .Engineers = studentsArray
}
func (c * Class ) AddStudent () {
name := inputName ()
roll := inputRoll ()
marks := inputMarks ()
entry := Student {
Name : name ,
RollNo : roll ,
Marks : marks ,
}
c .Engineers = append (c .Engineers , entry )
fmt .Println ("Student Added Successfully" )
fmt .Println ()
//Update this data in the db.txt
}
func (c * Class ) ShowStudents () {
for _ , student := range c .Engineers {
name , roll , marks := student .Name , student .RollNo , student .Marks
fmt .Printf ("Name: %s\n Roll No: %s\n Marks: %d\n " , name , roll , marks )
fmt .Println ()
}
}
func (c * Class ) UpdateStudent () {
roll := inputRoll ()
// find the student
index := 0
for ind , stu := range c .Engineers {
if stu .RollNo == roll {
index = ind
break
}
}
// get the data
newName := inputName ()
newMarks := inputMarks ()
// change the data
c .Engineers [index ] = Student {
RollNo : roll ,
Name : newName ,
Marks : newMarks ,
}
}
func (c * Class ) DeleteStudent () {
// get the data
roll := inputRoll ()
index := 0
// find the index
for idx , student := range c .Engineers {
if student .RollNo == roll {
index = idx
}
}
// remove the student
c .Engineers = append (c .Engineers [:index ], c .Engineers [index + 1 :]... )
}
func (c * Class ) writeToFile (wg * sync.WaitGroup ) {
// convert []Student into string
var result []string
for _ , val := range c .Engineers {
current := fmt .Sprintf ("%v %v %v" , val .Name , val .RollNo , val .Marks )
result = append (result , current )
}
err := os .WriteFile ("db.txt" , []byte (strings .Join (result , "\n " )), 0644 )
if err != nil {
fmt .Println (err .Error ())
}
}