Search code examples
arrayscglobal-variables

C Programming - Using Parallel Arrays to enter Names, Exercise Marks and Compute Average of Exercise Marks and Display


I'm doing self-study on C Programming, and I have been recommended the following C Program by my colleagues to study further, where you can enter the Name and Age and it displays and uses Insert, Delete, Display, and Exit menu options.

I'm trying to convert it to my current study stream logic scenario where I need to enter the Name, Exercise Mark 1 (up to 3), and then it computes the Average and gets displayed while employing the Insert, Delete, Display, Update (updating the scores only, not the names), Delete and Exit.

Any guidance please on how to learn this code and understand the logic, and apply it to the 2nd scenario will be much appreciated.

Here is the code:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 50
//using parallel arrays as fields in the list
typedef struct list{
    char name[MAX][31];
    int age[MAX];
    int last;
}LIST;
LIST L;//L structure is global

void save();
void retrieve();
void makenull();
void insert(char n[31],int a);
void del(char n[31]);
void display();
int locate(char n[31]);
int isfull();
int isempty();
int menu();

int main(){
char nm[31];
int ag;
makenull();
retrieve();
while(1){
    switch(menu()){
    case 1: system("cls");printf("Insert Mode\n");
            printf("Input Name: ");scanf("%s",nm);
            printf("Input Age: ");scanf("%d",&ag);insert(nm,ag);break;
    case 2: system("cls");printf("Delete Mode\n");
            printf("Input Name: ");scanf("%s",nm);del(nm);break;
    case 3: display();break;
    case 4: save();exit(0);
    default: printf("\n1-4 lang!\n");system("pause");
    }
}
return 0;
}
void makenull(){
   L.last = -1;
}
void insert(char n[31],int a){
if (isfull()){
    printf("List is full.\n");
    system("pause");
}
else {
    L.last++;
    strcpy(L.name[L.last],n);
    L.age[L.last]=a;
}

}
void del(char n[31]){
int p;
if (isempty()){
    printf("List is empty.\n");
    system("pause");
}
else {
    p=locate(n);
    if (p==-1){
        printf("Not found.\n");
        system("pause");
    }
    else{
        for(int i = p;i<L.last;i++){
            strcpy(L.name[i],L.name[i+1]);
            L.age[i]=L.age[i+1];
        }
        L.last--;
        printf("Successful delete operation.\n");
        system("pause");
    }
  }
}
void display(){
int i;
system("cls");
printf("  Name     Age \n");
for(i=0;i<=L.last;i++)
    printf("%d.) %s     %d\n",i+1,L.name[i],L.age[i]);
system("pause");
}
int locate(char n[31]){
int i;
for (i=0;i<=L.last;i++)
    if(strcmp(L.name[i],n)==0)
         return i;
return -1;
}
int isfull(){
  if (L.last==MAX-1)
    return 1;
  else
    return 0;
}
int isempty(){
  return(L.last==-1);
}
int menu(){
int op;
system("cls");
printf("MENU\n");
printf("1. Insert\n");
printf("2. Delete\n");
printf("3. Display\n");
printf("4. Exit\n");
printf("\nSelect(1-4): ");
scanf("%d",&op);
return(op);
}
void save(){
FILE *fp;
int i;
fp=fopen("Practice4.dbf","w+");
if (fp==NULL){
    printf("File Error.\n");
    system("pause");
}
else{
    for (i=0;i<=L.last;i++)
        fprintf(fp,"%s %d\n",L.name[i],L.age[i]);
}
fclose(fp);
}
void retrieve(){
FILE *fp;
char n[31];
int i,a;
fp=fopen("Practice4.dbf","r+");
if (fp==NULL){
    printf("File Error.\n");
    system("pause");
}
else {
    while(!feof(fp)){
        fscanf(fp,"%s %d\n",n,&a);
        insert(n,a);
    }

}
  fclose(fp);
}

Solution

  • Your code isn't properly formatted and there are no comments. I can't give you a direct answer with some code in it, but summing up all my comments (and of course I deleted them), this is what I've to say:

    Consider this scenario-

    if your .dbf has more than MAX 50 elements, then your while (!feof(fp)) inside retrieve() will keep calling insert() and insert() will keep executing its if () { } block.

    You should put something like while (!feof(fp) && L.last < MAX) to prevent that situation and you'll need to further modify your code in insert(). Another thing is, this code doesn't have any update() function and scores variable. You'll need to add scores in your struct as well as there must be scores fields in your .dbf.

    Now, for a moment let's say everything else is good to go in your code, then you should follow these following steps:

    • Declare variables
    char nameInput[31];
    float ex_marks[3], sum = 0, avr = 0;
    

    in main().

    • Add another case 5 in your switch () block inside main() and translate and convert the following pseudocode into C code:
    1. Read name in nameInput
    2. locate()
    3. if found then 3.a for i = 0 to 2 Read marks in ex_marks[i] sum = sum + ex_marks[i] 3.b Calculate avr = sum / 3 3.c Display name and avr
    4. else Display name is not in the list.
    5. exit

    Also read about why is while(!feof()) always wrong?