Member 13756368 Ответов: 3

Я не могу получить общую стоимость в этой программе...


#include <stdio.h>
#include <stdlib.h>
typedef struct booklist
{
    char title[30];
    char author[30];
    int cost;
}booklist;
int main()
{
    booklist *b;
    int n,i,t=0;
    printf("Enter the number of books: ");
    scanf("%d",&n);
    b=(booklist*)malloc(n*sizeof(int));
    printf("Enter the records for %d books\n",n);
    for(i=0;i<n;i++)
    {
        printf("\nBook %d= ",i+1);
        printf("\nEnter the title ");
        scanf("%s",(b+i)->title);
        printf("\nEnter the author of the book ");
        scanf("%s",(b+i)->author);
        printf("\nEnter the cost of the book ");
        scanf("%d",&(b+i)->cost);
    }
        printf("\n The detailed record is \n");
        printf("\n Title   Author   Cost  \n");
       printf("-------------------------");
        for(i=0;i<n;i++)
        {
            printf("\n %s      %s      %d  \n",(b+i)->title,(b+i)->author,(b+i)->cost);
        }
            
    for(i=0;i<n;i++)
    {
            t=((b+i)->cost)+((b+i)->cost);
    }
            printf("Grand total cost is  %d\n",t);
    return 0;
    
}


Что я уже пробовал:

Я пытаюсь получить общую стоимость ..

3 Ответов

Рейтинг:
2

OriginalGriff

Может быть, если вы выделите достаточно места, это будет работать немного лучше?

b=(booklist*)malloc(n*sizeof(int));

Это выделяет n * 4 байта, но ваш booklist структура значительно больше, чем это:
typedef struct booklist
{
char title[30];
char author[30];
int cost;
}booklist;
Вот и все 30 + 30 + 4 байты, которые вам нужны для каждого экземпляра!
Поэтому, когда вы пытаетесь получить доступ к каждой книге, чтобы заполнить детали, вы используете "плохую память", и все может произойти.

Я бы предложил вам написать функцию для заполнения деталей книги и протестировать ее с помощью одного фиксированного экземпляра. Проделайте то же самое с функцией печати книги и проверьте ее.
Затем начните работать с несколькими из них (и я бы также использовал синтаксис массива, он намного понятнее).


Рейтинг:
1

KarstenK

Вы должны выделить достаточно памяти для своих нужд, но также должны писать более четкий код и используйте лучшие практики для работы с ним. Это помогает избежать ошибок.

Нашел учебник прямо для вас: C массив структуры.

typedef struct _Booklist
{
  char title[30];
  char author[30];
  int cost;
} Booklist;// capital letters

Booklist *booklist;// understandable name what it is
booklist =(Booklist*) malloc( n * sizeof(Booklist) );//the main bug: to less memory

scanf("%s",booklist[n] ->title);//clear access to n-th structure and its member

free( booklist );//bug: missed to free the memory

Учитесь все писать лучше и понятнее кода.


Рейтинг:
0

Patrice T

Этот код вычисляет квадрат стоимости последней книги.

for(i=0;i<n;i++)
{
  t=((b+i)->cost)+((b+i)->cost);
}

-----
Научитесь правильно делать отступы в вашем коде, это покажет его структуру, и это поможет чтению и пониманию. Это также помогает выявлять структурные ошибки.
#include <stdio.h>
#include <stdlib.h>
typedef struct booklist
{
  char title[30];
  char author[30];
  int cost;
}booklist;
int main()
{
  booklist *b;
  int n,i,t=0;
  printf("Enter the number of books: ");
  scanf("%d",&n);
  b=(booklist*)malloc(n*sizeof(int));
  printf("Enter the records for %d books\n",n);
  for(i=0;i<n;i++)
  {
    printf("\nBook %d= ",i+1);
    printf("\nEnter the title ");
    scanf("%s",(b+i)->title);
    printf("\nEnter the author of the book ");
    scanf("%s",(b+i)->author);
    printf("\nEnter the cost of the book ");
    scanf("%d",&(b+i)->cost);
  }
  printf("\n The detailed record is \n");
  printf("\n Title   Author   Cost  \n");
  printf("-------------------------");
  for(i=0;i<n;i++)
  {
    printf("\n %s      %s      %d  \n",(b+i)->title,(b+i)->author,(b+i)->cost);
  }

  for(i=0;i<n;i++)
  {
    t=((b+i)->cost)+((b+i)->cost);
  }
  printf("Grand total cost is  %d\n",t);
  return 0;

}

Профессиональные редакторы программистов имеют эту функцию и другие, такие как сопоставление скобок и подсветка синтаксиса.
Блокнот++ Главная Страница[^]
личные[^]