C: Manipulation with structures

Click For Summary

Discussion Overview

The discussion revolves around a programming assignment involving the manipulation of data structures in C, specifically focusing on reading, sorting, and printing information about books and their authors. The participants are addressing issues related to code compilation errors and logic within the program.

Discussion Character

  • Homework-related
  • Technical explanation
  • Debate/contested

Main Points Raised

  • Post 1 presents a complete C program that compiles but does not produce the expected output, along with specific compiler warnings regarding pointer types.
  • Some participants propose that the warnings can be resolved by removing the '&' before the psurname and pname variables when calling the print function, as arrays are passed as pointers in C.
  • Another suggestion is to make psurname and pname local variables within the print function, as they are only used there.
  • There is a question about the logic of the do...while loop used to ensure that the variable n is greater than or equal to 1, with some participants expressing confusion about its necessity.

Areas of Agreement / Disagreement

Participants generally agree on the need to address the compiler warnings and the potential improvements to the code structure. However, there is some disagreement regarding the necessity and purpose of the do...while loop, with differing interpretations of its function.

Contextual Notes

The discussion highlights potential misunderstandings about pointer usage in C and the implications of variable scope, but does not resolve these issues definitively.

gruba
Messages
203
Reaction score
1

Homework Statement


Write a program that reads data about n number of books.
Sort data about books lexicographically by title (if the title is the same, sort by publish year), and then for every book sort data about authors.
Then, read name and surname of one of the previously read authors, and print data about all books which are from that one author.

Homework Equations


3. The Attempt at a Solution [/B]
The following code compiles successfully but doesn't give the output:
Code:
#include <stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct
{
  char surname[101];
  char name [101];
}AUTHOR;

typedef struct
{
  char title[20];
  int year;
  int number_of_authors;
  AUTHOR *author;
}BOOK;

void read_author(AUTHOR *pa)//reads data about an author
{
  printf("surname:");
  scanf("%s",pa->surname);
  printf("name:");
  scanf("%s",pa->name);

}

void read_book(BOOK *pb)//reads data about a book
{
  printf("title:");
  scanf("%s",pb->title);
  printf("publish year:");
  scanf("%d",&pb->year);
  printf("number of authors:");
  scanf("%d",&pb->number_of_authors);
  pb->author=calloc(pb->number_of_authors,sizeof(*pb->author));
  int i;
  for(i=0;i<pb->number_of_authors;i++)
  {
  printf("%d. authors:\n",i+1);
  read_author(pb->author+i);
  }
}

int compare_authors(AUTHOR *a,AUTHOR *b)//compares authors by surname (for sorting)
{
  int i;
  for(i=0;a->surname[i] && a->surname[i] == b->surname[i];i++);
  return a->surname[i]-b->surname[i];
}

void sort_authors(AUTHOR *arr,int n)//sorts authors lexicographically
{
  int i,j;
  for(i=0;i<n-1;i++)
  for(j=i+1;j<n;j++)
  if(compare_authors(arr+i,arr+j)>0)
  {
  AUTHOR temp=arr[i];
  arr[i]=arr[j];
  arr[j]=temp;
  }
}

int compare_books(BOOK *a,BOOK *b)//compares books by title (for sorting)
{
  int i;
  for(i=0;a->title[i] && a->title[i] == b->title[i];i++);
  return a->title[i]-b->title[i];
}

void sort_books(BOOK *arr,int n)//sorts books lexicographically
{
  int i,j;
  for(i=0;i<n-1;i++)
  for(j=i+1;j<n;j++)
  {
  if(compare_books(arr+i,arr+j)>0)
  {
  BOOK temp=arr[i];
  arr[i]=arr[j];
  arr[j]=temp;
  }
  else
  if((compare_books(arr+i,arr+j) == 0) )
  {
  BOOK temp=arr[i];
  arr[i]=arr[j];
  arr[j]=temp;
  }

  }
}

void print(BOOK *pb,int n,char psurname[101],char pname[101])//prints data about books of read author (if exists)
{
  int i,j;
  scanf("%s",psurname);
  scanf("%s",pname);
  for(i=0;i<n;i++)
  {
  for(j=0;j<pb->number_of_authors;j++)
  {
  if((strcmp(pb->author[j].surname,psurname)== 0) &&
  (strcmp(pb->author[j].name,pname)==0))
  printf("%s %d %d %s %s",pb->title,pb->year,pb->number_of_authors,
  pb->author[j].surname,pb->author[j].name);
  }
  }
}

void dealloc(BOOK *pb)// free allocated memory
{
  free(pb->author);
}int main()
{
  int i,n;
  BOOK *arr;
  char psurname[101],pname[101];
  do
  {
  printf("n=");
  scanf("%d",&n);
  }
  while(n<1);
  arr=(BOOK *)malloc(n*sizeof(BOOK));
  printf("enter books:\n");
  for(i=0;i<n;i++)
  {
  printf("%d. book:\n",i+1);
  read_book(arr+i);
  }
  sort_books(arr,n);
  for(i=0;i<n;i++)
  {
  printf("%d.",i+1);
  print(arr+i,n,&psurname,&pname);
  dealloc(arr+i);
  }
  free(arr);
  return 0;
}

Compiler gives the following warnings:
warning: passing argument 3 of 'print' from incompatible pointer type [enabled by default]|
note: expected 'char *' but argument is of type 'char (*)[101]'|
warning: passing argument 4 of 'print' from incompatible pointer type [enabled by default]|
note: expected 'char *' but argument is of type 'char (*)[101]'|


How to resolve these errors?
 
Physics news on Phys.org
- you need to remove the & before psurname and pname in main(). In C, if you pass an array to a funcion, a pointer the the array is always passed instead.
- If you want to pass an char array to a function in C i thinks it's better to just pass a pointer to char. (or a pointer to char + a maximum length),
- the global variables psurname and pname are only used in the print function. It would be easier to make them local.
 
while(n<1);
 
theodoros.mihos said:
while(n<1);
What is your comment?

I don't understand the purpose of the following do ... while loop, but it will always run at least once.
C:
do
  {
     printf("n=");
     scanf("%d",&n);
  } while(n<1);
 

Similar threads

  • · Replies 4 ·
Replies
4
Views
2K
  • · Replies 4 ·
Replies
4
Views
2K
  • · Replies 3 ·
Replies
3
Views
1K
  • · Replies 18 ·
Replies
18
Views
3K
  • · Replies 4 ·
Replies
4
Views
2K
  • · Replies 3 ·
Replies
3
Views
2K
  • · Replies 1 ·
Replies
1
Views
2K
Replies
2
Views
2K
  • · Replies 1 ·
Replies
1
Views
3K
  • · Replies 14 ·
Replies
14
Views
4K