954,498 Members — Technology Publication meets Social Media
Username:
Password:
Lost login information?
Have something to say? Contribute New Article Reply to this Article

How to redo the same code using structs

This is the code that i have, my project is to do this exact code, but with structs. I'm obviously very shaky on the structs concepts, however, i really need to get this assignment done.

Any help in this matter would be greatly appreciated!

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define SIZE 5
#define LENGTH 41
#define COSTPERCREDITHOUR 120.25
#define ID_FEE 35.00

//need to do same project using only structs
typedef struct{
	int id;
	int crn[4];
	int name[40];
}STUDENT;

//void addStudent (char name[SIZE][LENGTH], int id[SIZE], int crn[SIZE][4]);
void addStudent(STUDENT []);
void menu (int *option);
int linearSearch (int id[SIZE], int key);
void addDelete (char name[SIZE][LENGTH], int crn[SIZE][4], int location);
void getInfo (int crn, char prefix[7], int *hours);
void printInvoice (int id[SIZE], char name[SIZE][LENGTH], int crn[SIZE][4], int location);
void sortInvoice (int id[SIZE], char name[SIZE][LENGTH], int crn[SIZE][4], int location);
//------------------------------------------------------------------------------
int main ()
{
    char name[SIZE][LENGTH] = {""};
    int id[SIZE] = {0};
    int crn[SIZE][4] = {{0}};
    char invoice;
	
    int option = 0, loop = 0, key = 0, location = 0;   
	
	while (loop == 0)
	 {
		 menu (&option);
		 
		 switch (option)
	  {
		  case 1:
	   {
		   addStudent (name, id, crn);                    
		   break;
	   }
		  case 2:
	   {
		   printf ("Enter the students ID: ");
		   scanf  ("%d", &key);
		   location = linearSearch (id, key);
		   addDelete (name, crn, location);
		   printf ("\nWould you like to display a new invoice? (Y/N): ");
		   fflush (stdin);
		   scanf  ("%c", &invoice);
		   if (invoice == 'y' || invoice == 'Y')
			{
				printInvoice (id, name, crn, location);
			}
		   break;
	   }
		  case 3:
	   {
		   printf ("Enter the students ID: ");
		   scanf  ("%d", &key);
		   location = linearSearch (id, key);
		   if (location == -1)
			   printf ("\nNo student found!\n");
		   else
			   printf ("\nStudent found @ index location %d.\n", location);
		   break;
	   }
		  case 4:
	   {
		   printf ("Enter the students ID: ");
		   scanf  ("%d", &key);
		   location = linearSearch (id, key);
		   printInvoice (id, name, crn, location);
		   break;
	   }
		  case 5:
	   {
		   printf ("Enter the students ID: ");
		   scanf  ("%d", &key);
		   location = linearSearch (id, key);
		   sortInvoice (id, name, crn, location);
		   break;
	   }
		  case 0:
	   {
		   loop=1;
		   break;
	   }
		  default:
	   {
		   printf ("Invalid option, try again.\n");
		   break;
	   }
			  
	  }
	 }  
	
	printf ("Goodbye!\n\n\n");
    
    system ("pause");
    return 0;
}/*end main function*/

void addStudent (char name[SIZE][LENGTH], int id[SIZE], int crn[SIZE][4])
{
	char temp[LENGTH];
	int i=0 , n , j;
	int finder;
	
	
	printf("Enter the ID: ");
	scanf("%d", &finder);
	while ( i < 4 && finder != id[i])
		i++;
	if(finder == id[i])
     {
		 printf("\nThe ID %d is already assigned to a student", finder);
		 return;
     }else if (finder != id[i])
	  {
		  
		  
		  printf ("Enter the name of the student: ");
		  //fflush (stdin);
		  gets (temp);
		  gets (temp);
		  
		  for ( i=0; i<SIZE; i++)
		   {
			   if ( strcmp (name[i] , "") == 0 )
				{
					id[i] = finder;
					strcpy ( name[i], temp);
					printf ("Enter how many CRNs %s is taking: ", temp);
					scanf  ("%d", &n);
					if (n > 4)
					 {
						 printf ("\nYou cannot take more than 4 classes.\n");
						 strcpy (name, "");
						 id[i] = 0;
						 return;
					 }
					
					else if (n < 0) 
					 {
						 printf ("\nYou must take at least one class.\n");
						 strcpy (name, "");
						 id[i] = 0;
						 return;
					 }
					
					else
					 {
						 printf ("Enter the %d CRNs: ", n);
						 for (j=0; j<n ; j++)
						  {
							  scanf ("%d", &crn[i][j]);
						  }
						 printf ("\nStudent added!\n");
						 break;
					 }
				}
		   }
	  }
}/*end addStudent function*/


void menu (int *option)
{
	printf ("\tWelcome!\n");
	printf ("Choose from the following options:\n\n");
	printf("=============================================\n");
	printf ("1 - Add a new student\n");
	printf ("2 - Add/delete a course\n");
	printf ("3 - Search for a student\n");
	printf ("4 - Print fee invoice\n");
	printf ("5 - Print fee invoice sorted by CRN\n");
	printf ("0 - Exit program\n");
	printf ("\nEnter your selection: ");
	scanf  ("%d", option);
	
}/*end menu option*/


int linearSearch (int id[SIZE], int key)
{
    int i;
    int location = -1;
    
    for ( i= 0; i<SIZE; i++)
	 {
		 if (id[i] == key )
		  {
			  location = i; 
			  break;
		  }
	 }
    
    return location;
}/*end linearSearch function */

void addDelete (char name[SIZE][LENGTH], int crn[SIZE][4], int location)
{
	int i, temp;
	//char invoice;
	char prefix[7];
	int hours;
	char selection;
	
	printf ("\nHere are the courses [%s] is taking: ", name[location]);
	printf ("\nCRN\tPREFIX\tCR HOURS");
	for ( i= 0; i<4; i++)
     {
         if (crn[location][i] != 0)
		  {    
			  getInfo ( crn[location][i], prefix , &hours);
			  printf ("\n%d\t\t%s\t\t%d", crn[location][i], prefix, hours);
		  }
         else
			 break;
     }
	printf ("\n\nChoose from:");
	printf ("\nA - Add a new course for [%s]", name[location]);
	printf ("\nD - Delete a course from [%s]'s schedule", name[location]);
	printf ("\nC - Cancel operation");
	printf ("\nEnter your selection here: ");
	fflush (stdin);
	scanf  ("%c", &selection);
	
	if (selection == 'A' || selection == 'a')
     {
		 
		 for ( i= 0; i<4; i++)
          {
              if (crn[location][i] == 0)
			   {
				   printf ("\nEnter course number to add: ");
				   scanf  ("%d", &crn[location][i]);
				   getInfo (crn[location][i], prefix, &hours);
				   printf ("\n[%d %s] successfully added!\n", crn[location][i], prefix);
				   break;
			   }
              
              if (i==3 && crn[location][i] != 0)
			   {
				   printf ("\nYou cannot have more than 4 courses.");
				   return;
			   }
          }
		 
		 
     }
	
	else if (selection == 'D' || selection == 'd')
     {
		 printf ("\nEnter course number to delete: ");
		 scanf  ("%d", &temp);
		 for ( i= 0; i<4; i++)
          {    
              if (temp == crn[location][i])
			   {
				   getInfo (crn[location][i], prefix, &hours);
				   printf ("\n[%d %s] successfully deleted!\n", crn[location][i], prefix);
				   crn[location][i]=0;
				   while ( i<4)
					{
						crn[location][i] = crn[location][i+1];
						i++;
					}
				   break;
			   }
          }
     }       
	else if (selection == 'C' || selection == 'c')
     {
		 return;
     }
	else
     {
         printf ("\nInvalid selection.");
     }
	
	
	
	
}

void getInfo (int crn, char prefix[7], int *hours)
{ 
    switch (crn)
 {
	 case 4587:
  {
	  strcpy (prefix, "MAT 236");
	  *hours = 4;
	  break;
  }
	 case 4599:
  {
	  strcpy (prefix, "COP 220");
	  *hours = 3;
	  break;
  }
	 case 8997:
  {
	  strcpy (prefix, "GOL 124");
	  *hours = 1;
	  break;
  }
	 case 9696:
  {
	  strcpy (prefix, "COP 100");
	  *hours = 3;
	  break;
  }
 }
}

void printInvoice (int id[SIZE], char name[SIZE][LENGTH], int crn[SIZE][4], int location)
{
	
    double total = 0;
    int hours;
    char prefix[7];
    int i;
    double subTotal;
    
    total = ID_FEE;
	
    printf ("\n\n\n\n\t\tVALENCE COMMUNITY COLLEGE");
    printf ("\n\t\tORLANDO FL 10101");
    printf ("\n\t\t*************************");
    printf ("\n\n\t\tFee Invoice Prepared for Student:");
    printf ("\n\t\t%d - [%s]", id[location], name[location]);
    printf ("\n\n\t\t1 Credit Hour = $%.2lf", COSTPERCREDITHOUR);
    printf ("\n\n\t\tCRN\tPREFIX\t    HOURS");
    for ( i= 0; i<4; i++)
	 {
         if (crn[location][i] != 0)
		  {
			  getInfo ( crn[location][i], prefix , &hours);
			  subTotal = hours * COSTPERCREDITHOUR;
			  printf ("\n\t\t%d\t%s\t\t%d\t$%.2lf", crn[location][i], prefix , hours, subTotal);
			  
			  total = total + subTotal;
		  }else if (crn[location][i] == 0)
			  break;
	 }
    printf ("\n\n\t\t\tHealth & ID Fees\t$ %.2lf", ID_FEE);
    printf ("\n\n\t\t---------------------------------------");
    printf ("\n\t\t\tTotal Payments\t\t$%.2lf\n\n", total);     
}

void sortInvoice (int id[SIZE], char name[SIZE][LENGTH], int crn[SIZE][4], int location)
{
	double total = 0;
    int hours;
    char prefix[7];
    int i;
    double subTotal;
    int j, temp ;
	
	
    for ( j= 0; j<SIZE ; j++)
	 {
		 for ( i=0; i<=SIZE-2 ; i++)
		  {
			  if ( crn[location][i] > crn[location][i+1] && crn[location][i+1] != 0 )
			   {
				   temp = crn[location][i];
				   crn[location][i] = crn[location][i+1];
				   crn[location][i+1] = temp;
			   }
		  }
	 }
    
    
    total = ID_FEE;
	
    printf ("\n\n\n\n\t\tVALENCE COMMUNITY COLLEGE");
    printf ("\n\t\tORLANDO FL 10101");
    printf ("\n\t\t*************************");
    printf ("\n\n\t\tFee Invoice Prepared for Student:");
    printf ("\n\t\t%d - [%s]", id[location], name[location]);
    printf ("\n\n\t\t1 Credit Hour = $%.2lf", COSTPERCREDITHOUR);
    printf ("\n\n\t\tCRN\tPREFIX\t    HOURS");
    for ( i= 0; i<4; i++)
	 {
         if (crn[location][i] != 0)
		  {
			  getInfo ( crn[location][i], prefix , &hours);
			  subTotal = hours * COSTPERCREDITHOUR;
			  printf ("\n\t\t%d\t%s\t\t%d\t$%.2lf", crn[location][i], prefix , hours, subTotal);
			  
			  total = total + subTotal;
		  }else if (crn[location][i] == 0)
			  break;
	 }
    printf ("\n\n\t\t\tHealth & ID Fees\t$ %.2lf", ID_FEE);
    printf ("\n\n\t\t---------------------------------------");
    printf ("\n\t\t\tTotal Payments\t\t$%.2lf\n\n", total);     
}
jahmassive
Newbie Poster
2 posts since Apr 2009
Reputation Points: 10
Solved Threads: 0
 

jahmassive> This is the code that i have, my project is to do this exact code, but with structs

Instead of dumping some source code in a post, and expecting others to find out what it is intended to do, you could explain what the code is supposed to do, and where are you having problems in the implementations of structures. Just a thought.

Aia
Nearly a Posting Maven
2,392 posts since Dec 2006
Reputation Points: 2,224
Solved Threads: 218
 

ok, maybe that reply was deserved so i'll take that one. The purpose of the assignment is to create a fee invoice for students at a college. They can add classes, delete them, you can search for a student, print a fee invoice, and print a fee invoice sorted by a crn.

This program works the way it is, the only thing i am trying to do is the exact same thing with structs.

:$

jahmassive
Newbie Poster
2 posts since Apr 2009
Reputation Points: 10
Solved Threads: 0
 

jahmassive> This program works the way it is
Which doesn't mean it will always do.

gets() is a deal breaker. If you forget that gets() exist, you'll be doing yourself a favor.

fflush (stdin) is another deal breaker. It was not intended to be used with stdin but rather stdout.

system ("pause"); is foreigner to many causes. It works with OS that knows what to do with it.

scanf() is a wolf in sheep's clothing. Using it to obtain input from user can destroy your program.

Here's a simplistic example of the use of structures. Because I am not using pointers, any structure passed as parameter is a copy of the original.

/* structures.c
 * testing how structures works in C
 */
#include <stdio.h>
#include <string.h>

/* defining a structure */
struct student {
	char name[40]; /* This is an array of chars and not ints */
	int id;
	int whatever;
};

void disply_student(struct student s);
struct student add_student(struct student s);

int main(void)
{
	/* declare a student structure */
	struct student pupil;

	/* calling add function */
	pupil = add_student(pupil);

	/* display resut */
	disply_student(pupil);

	return 0;
}

/* define a function to use structure student */
struct student add_student(struct student s)
{
	/* adding name*/
	strcpy(s.name, "John");

	/* adding id */
	s.id = 3;

	/* adding whatever */
	s.whatever = 15;
	
	/* returning s copies data to original student */
	return s;
}

void disply_student(struct student s)
{
	printf("Name: %s\n", s.name);
	printf("ID: %d\n", s.id);
	printf("Whatever: %d\n", s.whatever);
}
Aia
Nearly a Posting Maven
2,392 posts since Dec 2006
Reputation Points: 2,224
Solved Threads: 218
 
Dave Sinkula
long time no c
Team Colleague
5,058 posts since Apr 2004
Reputation Points: 2,780
Solved Threads: 314
 

This article has been dead for over three months

Post: Markdown Syntax: Formatting Help
You