Added files from first programming course at OSU

This commit is contained in:
2019-07-09 18:14:25 -07:00
parent 4a591de966
commit 8c92e250d9
48 changed files with 2858 additions and 0 deletions

View File

@@ -0,0 +1,4 @@
Shelby Estrada 3 Test1 78.000000 Test2 87.650000 Test3 76.540000
Nick Newell 3 Test1 98.670000 Test2 92.560000 Test3 34.560000
Corwin Perren 3 Test1 78.320000 Test2 98.000000 Test3 89.000000
Will Seble 3 Test1 86.560000 Test2 89.900000 Test3 92.250000

View File

@@ -0,0 +1,104 @@
/*
* Original Authors: Corwin A. Perren (perrenc) and Will H. Seble (seblew)
* File: perrenc_hw2.c
* Created: 2012 March 16, 22:20 by perrenc and seblew
* Last Modified: 2012 March 16, 22:20 by perrenc and seblew
*
* This is the main dot c file for a gradebook. It gives the user a menu and calls
* necessary funtions.
*
*/
/* Includes */
#include <stdio.h>
#include <math.h>
#include "perrenc_hw2.h"
int main(int argc, char **argv){
int menuloop = 1; //Used to loop the menu
struct student *head = NULL; //Creates head node struct
while(menuloop != 0){
int menuchoice; // Used for selecting a menu item
system("clear"); //Clears the screen
/* Prints a pretty menu */
printf("----------Gradebook Menu----------\n\n");
printf("Please note: Some functions will require pressing enter ");
printf("multiple times\nin order to return to this menu.\n\n");
printf("------------Read Write------------\n");
printf("1 -- Load Gradebook from File\n");
printf("2 -- Write Current Gradebook to File\n\n");
printf("-------View Grades Statistics-----\n");
printf("3 -- View Entire Gradebook\n");
printf("4 -- View the First Student's Information/Assignments\n");
printf("5 -- View the Last Student's Information/Assignments\n");
printf("6 -- View a Student's Information/Assignments by Name Search\n");
printf("7 -- View the n'th Student's Information/Assignments\n");
printf("8 -- View a specific Student's Statistics\n");
printf("9 -- View a specific Assignment's Statistics\n\n");
printf("------------Add Grades------------\n");
printf("10-- Add Assignment/s & Grade/s to Student\n\n");
printf("---------Add Remove Students------\n");
printf("11-- Add a New Student\n");
printf("12-- Remove a Student\n\n");
printf("-----------Extra Functions--------\n");
printf("13-- Display the Number of Students in the Class\n");
printf("14-- Exit Program\n\n");
printf("Enter Selection: ");
scanf("%d", &menuchoice);
/*Allows the user to choose a function to run*/
switch(menuchoice){
case 1:
head = read_from_file(head);
class_print(head);
break;
case 2:
write_to_file(head);
break;
case 3:
class_print(head);
break;
case 4:
print_head(head);
break;
case 5:
tail_print(head);
break;
case 6:
name_search_print(head);
break;
case 7:
print_nth(head);
break;
case 8:
student_statistics(head);
break;
case 9:
assignment_statistics(head);
break;
case 10:
update_assignments(head);
break;
case 11:
head = add_student(head);
break;
case 12:
head = remove_student(head);
break;
case 13:
num_students(head);
break;
case 14:
menuloop = 0; //Ends the program
break;
}
}
printf("\n"); //Prints a newline to make things nice
system("clear"); //Clears the screen
return 0;
}

View File

@@ -0,0 +1,787 @@
/*
* Original Author: Corwin A. Perren (perrenc) and Will H. Seble (seblew)
* Contain code by: D. Kevin McGrath (dmcgrath)
* File: perrenc_hw2.h
* Created: 2012 March 16, 20:26 by perrenc and seblew
* Last Modified: 2012 March 16, 20:26 by perrenc and seblew
*
* This file includes all of the functions necessary to make a gradebook.
* It is called from perrenc_hw2.c
*
*/
/* Includes */
#include <stdlib.h>
#include <stdio.h>
#include <float.h>
#include <string.h>
#include <math.h>
#ifndef perrenc_hw2
#define perrenc_hw2
/* Defines */
/* --------------------Begin dmcgrath Functions-------------------- */
/*These were copied directly off of the 311 code page*/
struct assignment{
char *name; /*!< \brief string to hold the name of the assignment */
double value; /*!< \brief hold the given score of the assignment, normalized */
};
struct student{
struct student *next;
/*! \brief self referential pointer to link to nodes behind */
struct student *previous;
/*! \brief string to hold the first name of the student */
char *first_name;
/*! \brief string to hold the last name of the student */
char *last_name;
/*! \brief pointer to the dynamic assignments array */
struct assignment *assignments;
/*! \brief keep a count of the number of assignments */
long int num_assignments;
};
struct stats{
double mean;
double median;
double stddev;
};
int compare(const void *s, const void *t){
int comp = 1;
double is = *(double *)s;
double it = *(double *)t;
if (is < it){
comp = -1;
}else if (is == it){
comp = 0;
}
return comp;
}
double median(double *list, long int length){
double med = 0.0;
/* use the built in quicksort function to sort the list to extract the median */
/* requires the use of a function pointer */
qsort(list, length, sizeof(double), compare);
if (length % 2 == 0){
/* if the list is an even length, return average of middle 2 elements*/
med = list[length/2 - 1] + list[length/2];
med /= 2.0;
}else{
/* otherwise return the middle element (correct due to 0 offset) */
med = list[length/2];
}
return med;
}
double mean(double *list, long int length){
double total = 0.0;
long int i;
for (i = 0; i < length; ++i){
total += list[i];
}
return total / length;
}
double stddev(double *list, long int length){
double mu = mean(list, length);
double sigma_2 = 0.0;
double square = 2.0;
int i;
/* sum the deviants (squares of the differences from the average) */
for (i = 0; i < length; ++i){
sigma_2 += pow(list[i] - mu, square);
}
sigma_2 /= (length - 1);
return sqrt(sigma_2);
}
/* --------------------End dmcgrath Functions-------------------- */
/* --------------------Begin perrenc Functions-------------------- */
/*This function is used to let a user manually add a student*/
struct student* temp_student_userin(void){
int loop = 0; //Used for looping
system("clear"); //Clears screen
struct student *tmp; //Tmp stuct to hold student
/*Allocate space*/
tmp = (struct student*) malloc(sizeof(struct student));
tmp->first_name = (char *) malloc(100*sizeof(char));
tmp->last_name = (char *) malloc(100*sizeof(char));
/*Get name of student*/
printf("Please enter user's first name...\n");
scanf("%s", tmp->first_name);
printf("Please enter user's last name...\n");
scanf("%s", tmp->last_name);
system("clear"); //Clear Screen
/*Print student name, ask for number of assignments*/
printf("The name you entered was: %s %s\n\n", tmp->first_name, tmp->last_name);
printf("How many assignments would you like to add for this user: ");
scanf("%d", &tmp->num_assignments);
printf("\n\n");
/*Allocate space for assignments*/
tmp->assignments = (struct assignment*) malloc(tmp->num_assignments * sizeof(struct assignment));
/*Add assignments with names and grades*/
for(loop = 0 ; loop < tmp->num_assignments ; loop++){
tmp->assignments[loop].name = (char *) malloc(100 * sizeof(char));
printf("Please enter the assignment %d name with no spaces: ", loop+1);
scanf("%s", tmp->assignments[loop].name);
printf("\n");
printf("Please enter the assignment grade: ");
scanf("%lf", &tmp->assignments[loop].value);;
printf("\n");
printf("You added assignment %s with grade %.2lf\n", tmp->assignments[loop].name
, tmp->assignments[loop].value);
printf("\n\n");
}
return tmp; //Return new student
}
/*This function is called to manually add a new student*/
struct student* add_student(struct student *head){
struct student *tmp; //tmp student struct
struct student *cursor = head; //cursor struct
tmp = temp_student_userin (); //gets new student
/*insert sorts the new student into the gradbook*/
while(1){
if(head == NULL){
head = tmp;
print_student(head);
pause();
return head;
}else if((strcmp(tmp->last_name, cursor->last_name) < 0) |
(strcmp(tmp->last_name, cursor->last_name) == 0)){
if(cursor->previous == NULL){
tmp->previous = NULL;
tmp->next = cursor;
cursor->previous = tmp;
head = tmp;
return head;
}else if(cursor->previous != NULL){
tmp->previous = cursor->previous;
tmp->next = cursor;
cursor->previous->next = tmp;
tmp->next->previous = tmp;
return head;
}
}else if(strcmp(tmp->last_name, cursor->last_name) > 0){
if(cursor->next != NULL){
cursor = cursor->next;
}else{
tmp->previous = cursor;
tmp->next = NULL;
cursor->next = tmp;
return head;
}
}
}
}
/*This function resets pointers on surround students when one is removed*/
struct student* remove_reset_pointers(struct student *cursor, struct student *head){
int loop; //For loops
/*Resets pointers on surrounding students depeind on whether the one that was
* removed was at the head/tail/or middle
*/
if((cursor->next == NULL) & (cursor->previous == NULL)){
head = NULL;
}else if(cursor->next == NULL){
cursor->previous->next = NULL;
}else if(cursor->previous == NULL){
head = cursor->next;
cursor->next->previous = NULL;
}else{
cursor->previous->next = cursor->next;
cursor->next->previous = cursor->previous;
}
/*Frees the deleted student assignments*/
for(loop = 0 ; loop < cursor->num_assignments ; loop++){
free(cursor->assignments[loop].name);
}
/*Frees the student struct entries and struct itself*/
free(cursor->first_name);
free(cursor->last_name);
free(cursor->assignments);
free(cursor);
return head; //Returns the new head
}
/*This function is used to remove a student from the gradebook*/
struct student* remove_student(struct student *head){
struct student *cursor = head; //cursor struct
char *firstname = (char *) malloc(100 * sizeof(char)); //For user input
char *lastname = (char *) malloc(100 * sizeof(char)); //For user imput
int loop; //For looping
system("clear"); //Clear Screen
/*Asks the user which student they want to delete*/
printf("Please enter student's first name to delete: ");
scanf("%s", firstname);
printf("\n");
printf("Please enter student's last name to delete: ");
scanf("%s", lastname);
printf("\n\n");
/*Finds the student in the gradebook by name seach*/
while(1){
if(strcmp(cursor->last_name, lastname) != 0 ){
if(cursor->next != NULL){
cursor = cursor->next;
}else{
system("clear");
printf("No user by that name was found\n");
pause();
return NULL;
}
}else if(strcmp(cursor->last_name, lastname) == 0){
if(strcmp(cursor->first_name, firstname) != 0){
cursor = cursor->next;
}else if(strcmp(cursor->first_name, firstname) == 0){
head = remove_reset_pointers(cursor, head);
return head;
}
}
}
}
/*This function is used by the read_file function to sort and place students in the
* gradebook.
*/
struct student* file_insert(struct student *head, struct student *tmp){
struct student *cursor = head; //cursor struct
/*
* Determines wherer in the gradebook the student needs to be places, and puts them
* there.
*/
while(1){
if(head == NULL){
head = tmp;
return head;
}else if((strcmp(tmp->last_name, cursor->last_name) < 0) |
(strcmp(tmp->last_name, cursor->last_name) == 0)){
if(cursor->previous == NULL){
tmp->previous = NULL;
tmp->next = cursor;
cursor->previous = tmp;
head = tmp;
return head;
}else if(cursor->previous != NULL){
tmp->previous = cursor->previous;
tmp->next = cursor;
cursor->previous->next = tmp;
tmp->next->previous = tmp;
return head;
}
}else if(strcmp(tmp->last_name, cursor->last_name) > 0){
if(cursor->next != NULL){
cursor = cursor->next;
}else{
tmp->previous = cursor;
tmp->next = NULL;
cursor->next = tmp;
return head;
}
}
}
}
/*
* This function opens a file and turns it's input into structs to be placed in the
* gradbook, then places them there
*/
struct student* read_from_file(struct student *head){
struct student *tmp; //Tmp struct
FILE *gradebook; //File input stream
int loop; //For loops
gradebook = fopen("gradebook.db", "r"); //Points file to stream
/*
* Creates structs for each student in the file until a null character is recieved
* and then puts the students in the gradbook
*/
while(!feof(gradebook)){
tmp = (struct student*) malloc(sizeof(struct student)); //Make space for student
tmp->first_name = (char *) malloc(100*sizeof(char)); //Make space for student
tmp->last_name = (char *) malloc(100*sizeof(char)); //Make space for student
/*Fills struct with student data and assignment data*/
if(fscanf(gradebook, "%s\t%s\t%d", tmp->first_name, tmp->last_name,
&tmp->num_assignments) == 3){
tmp->assignments = (struct assignment*)
malloc(tmp->num_assignments * sizeof(struct assignment));
for(loop = 0 ; loop < tmp->num_assignments ; loop++){
tmp->assignments[loop].name = (char *)
malloc(100 * sizeof(char));
fscanf(gradebook, "%s", tmp->assignments[loop].name);
fscanf(gradebook, "%lf", &tmp->assignments[loop].value);
}
head = file_insert(head, tmp);
}else{
free(tmp->first_name);
free(tmp->last_name);
free(tmp);
}
}
fclose(gradebook);
return head;
}
/*This function writes the current gradebook to a file to be opened later*/
int write_to_file(struct student *head){
struct student *cursor = head; //cursor struct
int loop; //for loops
FILE *gradebook; //file stream
gradebook = fopen("gradebook.db", "w"); //points file to stream
/*Properly formatas and places students into the file*/
while(cursor != NULL){
fprintf(gradebook, "%s\t%s\t%d\t", cursor->first_name, cursor->last_name,
cursor->num_assignments);
for(loop = 0 ; loop < cursor->num_assignments ; loop++){
if(loop < (cursor->num_assignments - 1)){
fprintf(gradebook, "%s\t%lf\t",
cursor->assignments[loop].name,
cursor->assignments[loop].value);
}else{
fprintf(gradebook, "%s\t%lf\n",
cursor->assignments[loop].name,
cursor->assignments[loop].value);
}
}
cursor = cursor->next;
}
fclose(gradebook);
}
/*This function searches for the student the user specifies, then prints out their data*/
int name_search_print(struct student *head){
struct student *cursor = head; //cursor struct
char *firstname = (char *) malloc(100 * sizeof(char)); //space for name
char *lastname = (char *) malloc(100 * sizeof(char)); //space for name
int loop;
system("clear"); //clears screen
/*Asks the user the student they'd like to print*/
printf("Please enter student's first name: ");
scanf("%s", firstname);
printf("\n");
printf("Please enter student's last name: ");
scanf("%s", lastname);
printf("\n\n");
/*finds student and prints them*/
while(1){
if(strcmp(cursor->last_name, lastname) != 0 ){
if(cursor->next != NULL){
cursor = cursor->next;
}else{
system("clear");
printf("No user by that name was found\n");
pause();
return 1;
}
}else if(strcmp(cursor->last_name, lastname) == 0){
if(strcmp(cursor->first_name, firstname) != 0){
cursor = cursor->next;
}else if(strcmp(cursor->first_name, firstname) == 0){
system("clear");
printf
("The searched user \"%s %s\" has %d assignment/s:\n\n",
cursor->first_name, cursor->last_name,
cursor->num_assignments);
printf("Assignment Number\tName\t\tGrade %\n\n");
for(loop = 0 ; loop < cursor->num_assignments ; loop++){
printf("\t%d\t\t%s\t\t%.2lf\n", loop+1,
cursor->assignments[loop].name,
cursor->assignments[loop].value);
}
printf("\n\n");
pause();
return 0;
}
}
}
}
/*This function prints the nth student*/
int print_nth(struct student *head){
struct student *cursor = head; //cursor struct
int nth; //for user input
int loop; //for looping
system("clear"); //clears screen
/*asks which number the user would like to print*/
printf("Which number in the list would you like to print?\n");
printf("Lower numbers are last names closer to a...\n\n");
printf("Please enter a number: ");
scanf("%d", &nth);
/*moves cursor to that location*/
for(loop = 0 ; loop < (nth-1) ; loop++){
cursor = cursor->next;
}
/*prints out that student*/
system("clear");
printf("\"%s %s\" has %d assignment/s and is user #%d:\n\n", cursor->first_name,
cursor->last_name, cursor->num_assignments, nth);
printf("Assignment Number\tName\t\tGrade %\n\n");
for(loop = 0 ; loop < cursor->num_assignments ; loop++){
printf("\t%d\t\t%s\t\t%.2lf\n", loop+1, cursor->assignments[loop].name,
cursor->assignments[loop].value);
}
printf("\n\n");
pause();
}
/*prints the last item in the gradebook*/
int tail_print(struct student *head){
int loop; //for looping
struct student *cursor = head; //cursor struct
system("clear"); //clears the screen
/*moves the cursor to the last position and prints it*/
while(1){
if(cursor->next != NULL){
cursor = cursor->next;
}else{
printf("The tail/last user \"%s %s\" has %d assignment/s:\n\n",
cursor->first_name, cursor->last_name, cursor->num_assignments);
printf("Assignment Number\tName\t\tGrade %\n\n");
for(loop = 0 ; loop < cursor->num_assignments ; loop++){
printf("\t%d\t\t%s\t\t%.2lf\n", loop+1,
cursor->assignments[loop].name,
cursor->assignments[loop].value);
}
printf("\n");
pause();
return 0;
}
}
}
/*Prints the entire gradebook*/
int class_print(struct student* head){
struct student *cursor = head; //cursor struct
int loop; //looping
system("clear"); //clears the screen
/*prints a header and all students and assignments in the class*/
printf("--------- Class Gradebook ----------\n\n");
while(cursor != NULL){
printf("%s, %s\t\t",cursor->last_name, cursor->first_name);
for(loop = 0 ; loop < cursor->num_assignments ; loop++){
printf("%s\t%.2lf\t", cursor->assignments[loop].name,
cursor->assignments[loop].value);
}
printf("\n");
cursor = cursor->next;
}
printf("\n");
pause();
}
//prints out a students information after they've been entered manually*/
int print_student(struct student *tmp){
int loop; //for looping
system("clear"); //clears the screen
/*prints out all user's information and assignments*/
printf("The user \"%s %s\" has %d assignment/s:\n\n", tmp->first_name,
tmp->last_name, tmp->num_assignments);
printf("Assignment Number\tName\t\tGrade %\n\n");
for(loop = 0 ; loop < tmp->num_assignments ; loop++){
printf("\t%d\t\t%s\t\t%.2lf\n", loop+1, tmp->assignments[loop].name,
tmp->assignments[loop].value);
}
printf("\n");
pause();
}
/*prints the student at the beginning of the list*/
int print_head(struct student *head){
int loop; //for looping
system("clear"); //clears the screen
/*prints out that user's information and assignments*/
printf("The head/first user \"%s %s\" has %d assignment/s:\n\n", head->first_name,
head->last_name, head->num_assignments);
printf("Assignment Number\tName\t\tGrade %\n\n");
for(loop = 0 ; loop < head->num_assignments ; loop++){
printf("\t%d\t\t%s\t\t%.2lf\n", loop+1, head->assignments[loop].name,
head->assignments[loop].value);
}
printf("\n");
pause();
}
/*This function lets a user add an assignment to a user*/
int update_assignments(struct student *head){
struct student *cursor = head; //cursor struct
char *firstname = (char *) malloc(100 * sizeof(char)); //space for name
char *lastname = (char *) malloc(100 * sizeof(char)); //space for name
int loop = 0; //for looping
system("clear"); //clears the screen
/*asks the user for the student's name*/
printf("Please enter student's first name: ");
scanf("%s", firstname);
printf("\n");
printf("Please enter student's last name: ");
scanf("%s", lastname);
printf("\n\n");
/*finds the student and lets the user enter a new assignment and grade*/
while(1){
if(strcmp(cursor->last_name, lastname) != 0 ){
if(cursor->next != NULL){
cursor = cursor->next;
}else{
system("clear");
printf("No user by that name was found\n");
pause();
return 1;
}
}else if(strcmp(cursor->last_name, lastname) == 0){
if(strcmp(cursor->first_name, firstname) != 0){
cursor = cursor->next;
}else if(strcmp(cursor->first_name, firstname) == 0){
cursor->assignments[cursor->num_assignments].name = (
char *) malloc(100 * sizeof(char));
printf("Please enter the assignment name with no spaces: ");
scanf("%s", cursor->assignments[cursor->num_assignments].name);
printf("\n");
printf("Please enter the assignment grade: ");
scanf("%lf", &cursor->assignments[cursor->num_assignments].value);
printf("\n");
printf("You added assignment %s with grade %.2lf\n",
cursor->assignments[loop].name, cursor->assignments[loop].value);
printf("\n\n");
cursor->num_assignments = (1 + cursor->num_assignments);
return 0;
}
}
}
}
/*determines and prints the numer of students in the gradebook*/
int num_students(struct student *head){
struct student *cursor = head; //cursor struct
int numstudents = 0; //for storing num of students
/*loops through until null and incriments*/
while(cursor != NULL){
cursor = cursor->next;
numstudents++;
}
system("clear"); //clears the screen
/*prints out the number of students*/
printf("There are %d students in the class.\n\n", numstudents);
pause();
return numstudents;
}
/*this prints the statistics for a specific assignment for all users in teh class*/
int assignment_statistics(struct student *head){
struct student *cursor = head; //cursor struct
char *assignmentname; //for user specification
int loop; //for looping
int length = 0; //num of values stored
int numassignments = 0;
/*determines max num of assignments*/
while(cursor != NULL){
cursor = cursor->next;
numassignments++;
}
double stats[numassignments]; //makes array for values
system("clear"); //clears the screen
assignmentname = (char *) malloc(100*sizeof(char));
/*asks for the assignment name*/
printf("Please enter the name of the assignment you'd like statistics for: ");
scanf("%s", assignmentname);
/*compiles data into array*/
cursor = head;
while(cursor != NULL){
for(loop = 0 ; loop < cursor->num_assignments ; loop++){
if(strcmp(cursor->assignments[loop].name, assignmentname) == 0){
stats[length] = cursor->assignments[loop].value;
length++;
}
}
cursor = cursor->next;
}
if(length == 0){
system("clear");
printf("There was no assignment by that name...");
system("sleep 6");
}
/*prints out statistics after sending data and length tho those functions*/
system("clear");
printf("The mean for assignment \"%s\" is \"%.2lf%\".\n", assignmentname,
mean(stats, length));
printf("The median for assignement\"%s\" is \"%.2lf%\".\n", assignmentname,
median(stats, length));
printf("The standard deviation for assignment \"%s\" is \"%.2lf%\".\n",
assignmentname, stddev(stats, length));
free(assignmentname);
pause();
}
/*prints out statistics for a specifc user on all assignments*/
int student_statistics(struct student *head){
struct student *cursor = head; //cursor struct
char *firstname = (char *) malloc(100 * sizeof(char)); //space for name
char *lastname = (char *) malloc(100 * sizeof(char)); //space for name
int loop; //for loops
int length = 0; //for # of data
double stats[50]; //for holding data
system("clear"); //clears the scren
/*asks for the student's name*/
printf("Please enter student's first name: ");
scanf("%s", firstname);
printf("\n");
printf("Please enter student's last name: ");
scanf("%s", lastname);
printf("\n\n");
/*finds the student, compiles data, and prints out statistics*/
while(1){
if(strcmp(cursor->last_name, lastname) != 0 ){
if(cursor->next != NULL){
cursor = cursor->next;
}else{
system("clear");
printf("No user by that name was found\n");
pause();
return 1;
}
}else if(strcmp(cursor->last_name, lastname) == 0){
if(strcmp(cursor->first_name, firstname) != 0){
cursor = cursor->next;
}else if(strcmp(cursor->first_name, firstname) == 0){
for(loop = 0 ; loop < cursor->num_assignments ; loop++){
stats[length] = cursor->assignments[loop].value;
length++;
}
system("clear");
printf("The mean for student \"%s %s\" is \"%.2lf%\".\n",
firstname, lastname, mean(stats, length));
printf("The median for student \"%s %s\" is \"%.2lf%\".\n"
, firstname, lastname, median(stats, length));
printf("The standard deviation for student \"%s %s\" is "
, firstname, lastname);
printf("\"%.2lf%\".\n", stddev(stats, length));
pause();
return 0;
}
}
}
}
/* Generic Functions */
/*pauses until user hits enter*/
int pause(void){
printf("Press enter to return to the menu.");
getchar();
while('\n' != getchar()){
; //VOID
}
}
/* --------------------End perrenc Functions-------------------- */
#endif