I had to write a program to do this, This is a program that will sort information on when the TAs for COP 3223 are available. The program is expected to read in data on all TA office hour shifts, then sort the data, and then print out the information in a pre-specified format. It is assumed that the maximum number of shifts is 100.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* Given structure format that is needed to be used in the program. */
struct Shift
{
char name[100];
char day_of_week[100];
int start_hour;
int end_hour;
};
/* Functions that will be used in the program. */
int read_data(struct Shift shift_data[], int *num_shifts);
void sort_data(struct Shift shift_data[], int *num_shifts);
void print_data(struct Shift shift[], int num_shifts);
int main(void)
{
struct Shift shift_data[100];
struct Shift temp;
/*Declare and initialize variables, and statements to call each function. */
int num_shifts;
read_data(shift_data, &num_shifts);
sort_data(shift_data, &num_shifts);
print_data(shift_data, num_shifts);
return 0;
}
/*** Preconditions: array of structure "Shift" to store data
Postconditions: number of shifts read in from data file
Actions: Ask user for name of input file. Read the number of shifts, then read in the data for all
of the shifts. Return the number of shifts. ***/
int read_data(struct Shift shift_data[], int *num_shifts)
{
/*Declare and initialize variables. */
char input_schedule[100];
int i;
char shift_name[100], shift_day[100];
/*Prompt user to enter the input file. */
printf("Enter the name of the file name.\n");
scanf("%s", &input_schedule[100]);
/*Declare file and read in the needed values. */
FILE *ifp;
ifp = fopen("input_schedule.txt", "r");
fscanf(ifp, "%d", &num_shifts);
/*For loop to read in each value from the file and store them in the shift_data array. */
for(i=0; i<(*num_shifts); i++)
{
fscanf(ifp, "%s %s %d %d\n", &shift_data[i].name, &shift_data[i].day_of_week, &shift_data[i].start_hour, &shift_data[i].end_hour);
}
/*Close file.*/
fclose(ifp);
return num_shifts;
}
/*** Preconditions: array of structure "Shift" integer value indicating number of shifts
Postconditions: none - this function does not return anything.
Actions: Sort the shifts by the TA's first name. ***/
void sort_data(struct Shift shift_data[], int *num_shifts)
{
/*Declare and initialize variables. */
int i,j;
/*For loop to run through each array.*/
for(i=0; i<(*num_shifts); i++)
{
/*For loop to use the next element in the array to compare to the element before it.*/
for(j=i+1; j<(*num_shifts); j++)
{
/*If statements using strcmp to compare the two strings and sort the data in order.*/
if(strcmp(shift_data[i].name,shift_data[i].name) < 0)
{
memcpy(temp.name, shift_data[i].name, strlen(shift_data[i].name) + 1);
memcpy(shift_data[i].name, shift_data[j].name, strlen(shift_data[j].name) + 1);
memcpy(shift_data[j].name, temp.name, strlen(temp.name) + 1);
}
if(strcmp(shift_data[i].day_of_week,shift_data[i].day_of_week) < 0)
{
temp.day_of_week = shift_data[i].day_of_week;
shift_data[i].day_of_week = shift_data[j].day_of_week;
shift_data[j].day_of_week = temp.day_of_week;
}
if(strcmp(shift_data[i].start_hour,shift_data[i].start_hour) < 0)
{
temp.start_hour = shift_data[i].start_hour;
shift_data[i].start_hour = shift_data[j].start_hour;
shift_data[j].start_hour = temp.start_hour;
}
if(strcmp(shift_data[i].end_hour,shift_data[i].end_hour) < 0)
{
temp.end_hour = shift_data[i].end_hour;
shift_data[i].end_hour = shift_data[j].end_hour;
shift_data[j].end_hour = temp.end_hour;
}
}
}
}
/*** Preconditions: array of structure "Shift" integer value indicating number of shifts
Postconditions: none - this function does not return anything.
Actions: Print the sorted data in the format described below. **/
void print_data(struct Shift shift_data[], int num_shifts)
{
/*Declare and initialize variables.*/
int i;
printf("\n\n\n");
/*For loop to print out the sorted data to the user.*/
for(i=0; i<num_shifts; i++)
{
printf("%s\t\t", shift_data[i].name);
printf("%s\t", shift_data[i].day_of_week);
printf("%d to ", shift_data[i].start_hour);
printf("%d\n", shift_data[i].end_hour);
/*If statements to change the shift times from military time to standard time.*/
if(shift_data[i].start_hour > 12)
{
shift_data[i].start_hour = shift_data[i].start_hour - 12;
printf("%2d:00 pm to ", shift_data[i].start_hour);
}
else if(shift_data[i].start_hour < 12)
{
printf("%2d:00 am to ", shift_data[i].start_hour);
}
else if(shift_data[i].start_hour == 12)
{
printf("%2d:00 pm to ", shift_data[i].start_hour);
}
if(shift_data[i].end_hour > 12)
{
shift_data[i].end_hour = shift_data[i].end_hour - 12;
printf("%2d:00 pm\n", shift_data[i].end_hour);
}
else if(shift_data[i].end_hour < 12)
{
printf("%2d:00 am\n", shift_data[i].end_hour);
}
else if(shift_data[i].end_hour == 12)
{
printf("%2d:00 pm\n", shift_data[i].end_hour);
}
}
}
The problem I am having is in the sort_data function. I keep getting an error that says incompatibable types when assigning to type 'char[100]' from type 'char *'. It's with my temp variable, but I can't seem to figure out how to fix it.
shift_data[j].name = temp.name;. You cannot change the value of an array itself. To change the contents of the array you probably wantstrncpy(shift_data[j].name, temp.name, sizeof(shift_data[j].name))if(strcmp(shift_data[i].start_hour,shift_data[i].start_hour) < 0). You should doif(shift_data[i].start_hour < shift_data[i].start_hour).scanf("%s", &input_schedule[100]);is a blunder. You just told it to start writing after the end of the array... Instead it should bescanf("%99s", input_schedule)fscanf(ifp, "%d", &num_shifts);is also an error. Think about whatnum_shiftsis.strcmpa string with itself - this will always match