Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.11.2013, 01:16   #1
enerlol
Пользователь
 
Регистрация: 26.03.2011
Сообщений: 24
По умолчанию Сортировка структур по двум полям

Всем привет.
Пытаюсь отсортировать структуру с таким условиями: сортировка по полю country, а если поля имеют одинаковое значения, то внутри их по полю zip.
Пытаюсь сделать это при помощи qsort(), но сталкиваюсь с ошибкой в строке 21:
Код:
C:\Users\enerlol\Desktop\lab 2.1 05112013\lab 2.2 15112013\main.c|21|error: expected expression before ')' token|
и
Код:
C:\Users\enerlol\Desktop\lab 2.1 05112013\lab 2.2 15112013\main.c|52|error: 'el' undeclared (first use in this function)|
Вот мой код:
Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 50
#define LINE "----------------------------------------------------------------------"

struct el {
  char country[15];
  char name[20];
  char chem[20];
  /*unsigned long*/ int zip;
} el_list[MAX];

void init_list(void), enter(void);
void delete(void), list(void);
int menu_select(void), find_free(void);



int name_cmp(const void *a, const void *b){
    return strcmp(((el_list*)a)->country, ((el_list*)b)->country);
}

int main(){
/* el_list arr[6] = {
        {.country = "Czehy", .name = "krzytal gorsky", .chem = "SiO2", .zip = 10002},
        {"Polska", "betyl", "Be3Al2Si6O18", 30001},
        {"Polska", "krzytal gorsky","SiO2", 10101},
        {"Polska", "agat","SiO2", 10001},
        {"Polska", "warezyt","ZnS", 00001},
        {.country = "Rosja", .name = "krzytal gorsky",.chem = "SiO2", .zip = 10003},
        };*/
  char choice;
//  register int slot;
//  char s[80];
  init_list(); /* инициализация массива структур */
  while ( 1 ){
        choice = menu_select();
        switch ( choice ){
            case 2 :
                enter();
                break;
            case 3 :/*
                  printf("vvedite # zapisi: ");
                  gets(s);
                  slot = atoi(s);*/
                delete();
                enter();
                break;
            case 1: list();
                break;
            case 4: qsort(el, MAX, sizeof(el_list), country_cmp);
                break;
            case 5: exit(0);
                break;
            case 0: exit(0);
            default :
                printf("Wrong menu index!\n");
        }
    }
  return 0;
}

/* Инициализация списка. */
void init_list(void)
{
  register int t;
  for(t=0; t<MAX; ++t) el_list[t].country[0] = '\0';
}

/* Получения значения, выбранного меню. */
int menu_select(void)
{   int c;
    printf("\nChoice one:\n1 - Show all\n2 - Add new\n3 - Edit title\n4 - Sort by country/name\n5 - Sort by country/element\n0 - exit\n> ");
    if (scanf("%d%*c",&c)!= 1) return -1;
    return c;
}

/* Ввод адреса в список. */
void enter(void)
{
  int slot;
  char s[80];
  int i=0, error=0;

  slot = find_free();

  if(slot==-1) {
    printf("\nSpisiok zapolnen");
    return;
  }
  do{
  printf("Country: ");
  gets(el_list[slot].country);
  el_list[slot].country[0] = toupper(el_list[slot].country[0]);

  printf("El.name: ");
  gets(el_list[slot].name);
  i=0;
  while (el_list[slot].name[i]){
        if(el_list[slot].name[i]>='0'&&el_list[slot].name[i]<='9'){
            printf("ERROR NAME\n");
            error=1;
            break;
        }
    i++;
    }

  printf("Chem: ");
  gets(el_list[slot].chem);
  i=0;
  while (el_list[slot].name[i]){
        if  (el_list[slot].name[i]=='/' || el_list[1].name[i]=='*' || el_list[1].name[i]=='+' || el_list[1].name[i]=='-'){
            printf("ERROR NAME\n");
            error=1;
            break;
        }
    i++;
    }

  printf("Indx: ");
  gets(s);
  el_list[slot].zip = strtoul(s, '\0', 10);
  if (el_list[slot].zip==0 || el_list[slot].zip>99999){
      printf("ERROR INDEX\n");
      error=1;
      }
  }
  while (error==1);
}

/* Поиск свободной структуры. */
int find_free(void)
{
  register int t;
  for(t=0; el_list[t].country[0] && t<MAX; ++t) ;
  if(t==MAX) return -1; /* свободных структур нет */
  return t;
}

/* Вывод списка на экран. */
void list(void)
{
  register int t;
  int e=0;

printf("\n%s\nCOUNTRY                  NAME           NUMBER            CHEM\n%s\n", LINE, LINE);
  for(t=0; t<MAX; ++t) {
    if(el_list[t].country[0]) {
        e=1; printf("%-20s%-20s%05d%18s\n", el_list[t].country, el_list[t].name, el_list[t].zip, el_list[t].chem);
    }
    if (e==0){printf("EMPTY"); break; }
  }
  printf("\n%s\n", LINE);
  printf("\n\n");
}

/* Удаление адреса.*/
void delete(void)
{
  register int slot;
  char s[80];

  printf("vvedite # zapisi: ");
  gets(s);
  slot = atoi(s);

  if(slot>=0 && slot < MAX)
    el_list[slot++].country[0] = '\0';
}
Что я делаю не так?
enerlol вне форума Ответить с цитированием
Старый 19.11.2013, 10:12   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Что я делаю не так?
не указываешь какая строка является 21
Цитата:
C:\Users\enerlol\Desktop\lab 2.1 05112013\lab 2.2 15112013\main.c|21|error: expected expression before ')' token|
Перед какой-то закрывающей скобкой ')' чего-то не хватает. А может просто не там ее поставил.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 19.11.2013 в 10:18.
evg_m вне форума Ответить с цитированием
Старый 19.11.2013, 12:10   #3
nikmoon
Форумчанин
 
Регистрация: 13.11.2013
Сообщений: 149
По умолчанию

У тебя el используется в качестве первого параметра функции qsort. Но el - тип структуры, а не переменная. Кажется там должно быть el_list вместо el.
Ппц, а в функции name_cmp наоборот в качестве типа приведения используется переменная el_list. Что за каша?

Последний раз редактировалось nikmoon; 19.11.2013 в 12:12.
nikmoon вне форума Ответить с цитированием
Старый 19.11.2013, 13:26   #4
enerlol
Пользователь
 
Регистрация: 26.03.2011
Сообщений: 24
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
не указываешь какая строка является 21

Перед какой-то закрывающей скобкой ')' чего-то не хватает. А может просто не там ее поставил.
В строке
Код:
return strcmp(((el_list*)a)->country, ((el_list*)b)->country);
Цитата:
Сообщение от nikmoon Посмотреть сообщение
У тебя el используется в качестве первого параметра функции qsort. Но el - тип структуры, а не переменная. Кажется там должно быть el_list вместо el.
Ппц, а в функции name_cmp наоборот в качестве типа приведения используется переменная el_list. Что за каша?
Да, каша.
Много чего не знаю. На лекциях только начали проходить структуры, а у нашей группы дедлайн лабораторки уже завтра. Вот такая борода.

Последний раз редактировалось Stilet; 19.11.2013 в 15:31.
enerlol вне форума Ответить с цитированием
Старый 19.11.2013, 14:02   #5
nikmoon
Форумчанин
 
Регистрация: 13.11.2013
Сообщений: 149
По умолчанию

Измени то, что я написал, компиляция должна пройти.
А, не, не пойдет

Последний раз редактировалось nikmoon; 19.11.2013 в 14:06.
nikmoon вне форума Ответить с цитированием
Старый 19.11.2013, 17:33   #6
enerlol
Пользователь
 
Регистрация: 26.03.2011
Сообщений: 24
По умолчанию

в строке
Код:
return strcmp(((el_list*)a)->country, ((el_list*)b)->country);
осталась ошибка

C:\Users\enerlol\Desktop\lab 2.1 05112013\lab 2.2 15112013\main.c|21|error: expected expression before ')' token|
enerlol вне форума Ответить с цитированием
Старый 19.11.2013, 17:37   #7
enerlol
Пользователь
 
Регистрация: 26.03.2011
Сообщений: 24
По умолчанию

А там, да, изменил, спасибо.
Не вникнул в ту строку, потому что не смог пройти первую.
enerlol вне форума Ответить с цитированием
Старый 19.11.2013, 19:02   #8
nikmoon
Форумчанин
 
Регистрация: 13.11.2013
Сообщений: 149
По умолчанию

Цитата:
Сообщение от enerlol Посмотреть сообщение
в строке
Код:
return strcmp(((el_list*)a)->country, ((el_list*)b)->country);
осталась ошибка

C:\Users\enerlol\Desktop\lab 2.1 05112013\lab 2.2 15112013\main.c|21|error: expected expression before ')' token|
Я ж тебе написал уже. Цитирую
Цитата:
Ппц, а в функции name_cmp наоборот в качестве типа приведения используется переменная el_list.
Ты делаешь приведение переменной одного типа к другому типу, ну так и указывай ТИП ПЕРЕМЕННОЙ, а не el_list. Мягонько так намекну: переменная el_list имеет тип el
nikmoon вне форума Ответить с цитированием
Старый 19.11.2013, 20:58   #9
enerlol
Пользователь
 
Регистрация: 26.03.2011
Сообщений: 24
По умолчанию

Код:
int name_cmp(const void *a, const void *b){
    return strcmp(((el*)a)->country, ((el*)b)->country);
}
Код:
 case 4: qsort(el, MAX, sizeof(el_list), country_cmp);
Я опять чего не понимаю.
enerlol вне форума Ответить с цитированием
Старый 20.11.2013, 07:52   #10
nikmoon
Форумчанин
 
Регистрация: 13.11.2013
Сообщений: 149
По умолчанию

Во, с функцией name_cmp теперь порядок
А вместо el в функцию qsort передавай el_list, это же так просто
nikmoon вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сортировка по двум полям по выбору пользователя DerFluch C# (си шарп) 12 18.11.2012 00:00
count по двум полям _SERGEYX_ БД в Delphi 3 05.06.2012 17:44
фильтр по двум полям Alex003 Помощь студентам 2 03.12.2011 11:39
Отбор по двум полям MPa БД в Delphi 4 06.02.2008 20:14
Фильтрация по двум полям Dunkas БД в Delphi 11 21.01.2008 23:59