Присвоение выражению с ошибкой типа массива - PullRequest
0 голосов
/ 28 ноября 2018

в этой программе я стараюсь сортировать сбережения клиентов по убыванию.И я попытался скомпилировать код.И я до сих пор не понимаю насчет указателя.Произошла ошибка с сообщением «Присвоение выражению с ошибкой типа массива».Целевой продукт этой программы - отсортированные клиенты (с их именами и номерами счетов).Я ищу в интернете об этой ошибке.Но я до сих пор не понимаю решение.Может кто-нибудь помочь мне решить ошибку?Спасибо.

#include <stdio.h>
#include <stdlib.h>

struct Data
{
  long long int Savings[100], AccNo[100];
  char Name[100];
};

int main ()
{
  struct Data *ptr;
  int n, i, j, swap = 1, x, y;
  long long int max, min, temp;

  printf ("Enter number of customer(s) : ");
  scanf ("%d", &n);

  ptr = (struct Data *) malloc (n * sizeof (struct Data));

  for (i = 0; i < n; i++)
    {
      printf ("Enter customer %d", i + 1);
      printf ("\nName : ");
      getchar ();
      scanf ("%[^\n]s", &(ptr + i)->Name);
      printf ("Savings : ");
      scanf ("%d", &(ptr + i)->Savings);
      printf ("Account Number : ");
      scanf ("%d", &(ptr + i)->AccNo);
      printf ("\n");
    }

  //Sorting bubblesort
  for (x = 0; x < n; x++)
    {
      for (y = 0; y < (n - x - 1); y++)
    {
      if ((ptr + y)->Savings > (ptr + y + 1)->Savings)
        {
          temp = (ptr + y)->Savings;
          (ptr + y)->Savings = (ptr + y + 1)->Savings;
          (ptr + y + 1)->Savings = temp;
        }
    }
    }

  //Print sorted
  printf ("\n Sorted customers are (:\n");
  for (i = 0; i < n; ++i)
    {
      printf ("%s\n", (ptr + i)->Name);
      printf ("%d\n", (ptr + i)->Savings);
    }
  free (ptr);
  return 0;
}

1 Ответ

0 голосов
/ 28 ноября 2018
  1. Вам необходимо скомпилировать код с включенными предупреждениями, шаг за шагом проведет вас через отладку.Попробуйте устранить один и снова скомпилировать.Например, в GCC вы должны использовать флаг -Wall.
  2. Числовые поля вашей структуры должны быть просто числами, а не массивами.Более того, иметь их тип как long long int кажется слишком много, но я оставлю это на вас.
  3. Имея (ptr + y)->Savings для доступа к y -ому элементу массива структур и его поляИмена Savings технически правильны, но гораздо более понятны (что повышает удобочитаемость и удобство обслуживания) для записи ptr[y].Savings.Это общее правило, применимое к остальной части вашего кода.
  4. Я полагаю, что вышеизложенное привело вас к двум синтаксическим ошибкам, когда вы читали числовые данные клиентов с помощью scanf(), поскольку вы знаете, чтоцелое число в общем случае требует оператора &.Я полагаю, что если бы вы использовали чистый подход с самого начала, вы бы этого не сделали.
  5. Для long long int используйте спецификатор формата %lld, а не просто %d.
  6. В Bubblesort, когда вы найдете элементы, которые нужно поменять местами, поменяйте местами все элементы, а не только их Savings s.Я рекомендую создать для этого функцию.
  7. scanf("%[^\n]s" не имеет особого смысла, я бы изменил ее на scanf("%99s", где 99 - максимальный размер вашей строки, минус один.Читайте подробнее во 2-м абзаце в scanf («% [^ \ n] s», а) вопрос .

Собрав все воедино, мы получим:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct Data {
    long long int Savings, AccNo; // these should be numbers, not arrays
    char Name[100];
};

void swap(struct Data* a, struct Data* b) {
    struct Data tmp;
    tmp.Savings = a->Savings;
    tmp.AccNo = a->AccNo;
    strcpy(tmp.Name, a->Name);

    a->Savings = b->Savings;
    a->AccNo = b->AccNo;
    strcpy(a->Name, b->Name);

    b->Savings = tmp.Savings;
    b->AccNo = tmp.AccNo;
    strcpy(b->Name, tmp.Name);
}

int main() {
    struct Data *ptr;
    int n, i, x, y;

    printf("Enter number of customer(s) : ");
    scanf("%d", &n);

    ptr = malloc (n * sizeof(struct Data)); // do not cast malloc

    for(i=0; i<n; i++) {
        printf("Enter customer %d", i+1);
        printf("\nName : ");
        getchar();
        scanf("%99s", ptr[i].Name); // ptr is a pointer, but now you want to actually use it as an array, so use '.'
        printf("Savings : ");
        scanf("%lld", &ptr[i].Savings); // needs &, just like you did for 'n'. USe `%lld' for long lont int as the format specifier.
        printf("Account Number : ");
        scanf("%lld", &ptr[i].AccNo);   // needs &, just like you did for 'n'. USe `%lld' for long lont int as the format specifier.
        printf("\n");
    }

    //Sorting bubblesort
    for (x = 0; x < n; x++)
    {
        for (y = 0; y < n - x - 1; y++) // you don't need paranetheses in the stop condition
        {
            if (ptr[y].Savings > ptr[y + 1].Savings)
            {
                swap(&ptr[y], &ptr[y + 1]); // swap the whole element, not just its savings
            }
        }
    }

    //Print sorted
    printf("\nSorted customers are:\n");
    for(i=0; i<n; ++i)
    {
        printf("%s\n", (ptr+i)->Name);
        printf("%lld\n", (ptr+i)->Savings);
    }
    free(ptr);
    return 0;
}

Вывод (с соответствующим вводом):

Sorted customers are:
George
1
Babis
3
Theodor
20

PS: Должен ли я приводить результат malloc? Нет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...