Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> сортировка массива структур 
V
    Опции темы
norgegoth
Дата 26.11.2009, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 5.2.2009

Репутация: нет
Всего: нет



Пишу программу на Си, не С++! для подсчета количества повторяемых слов в произвольном тексте

Код

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
#include <ctype.h>
#include <locale.h>

#define LONG 30

typedef struct addr {
           int k;
           char value[LONG];
           } addr;


void str_mas(int len, int SIZE, FILE *che);

void quick_struct(addr items[], int count);
void q_sort(addr items[], int left, int right);


int main(void)
{   
    setlocale(LC_ALL,"Russian");
    FILE *in, *out;
    fpos_t file_loc;
    char ch, och, *p, ch1, cha = '.', chs = ' ', ch_ar, *line;
    int k=0, SIZE, i=0;

    
    if((in=fopen("E:\\Dev-Cpp\\my_prog\\rat.txt", "r+"))==NULL) {
                      printf("Íåîòêðûâàåòñî ôàéë rat\n");
                      getch();
                      exit(1);
    }
    
    if((out=fopen("E:\\Dev-Cpp\\my_prog\\cat.txt", "w+"))==NULL) {
                      printf("Íåîòêðûâàåòñî ôàéë cat\n");
                      getch();
                      exit(1);
    }
    
    
    do {
        fgetpos(in, &file_loc);
        ch = fgetc(in);         
    } while (!isalnum(ch));
    
    fsetpos(in, &file_loc);
    
    while(!feof(in)) {
                     ch = tolower(fgetc(in));
                     
                     if ((ch == '\n') && (ch_ar != ' ')) {
                            fputc(chs, out);
                            ch_ar = chs;
                            continue;
                     }
                     
                     if ((ch == '\t') && (ch_ar != ' ')) {
                            fputc(chs, out);
                            ch_ar = chs;
                            continue;                          
                     }
                     
                     if ((ch == '"') && (ch_ar != ' ')) {
                            fputc(chs, out);
                            ch_ar = chs;
                            continue;
                     }
                     
                     if(!feof(in) && (isalnum(ch) || (ch ==' ') || (ch 
                     == '-') || (ch =='\n') || (ch =='\t') || (ch =='/' ) 
                     || (ch == '"') || (ch == '%') || (ch == '\\') || (ch == '_') || (ch == '+'))) {
                             
                                
                                
                                if ((ch == ' ') && (ch_ar == ' ')) continue;
                                
                                if ((ch == '\n') && (ch_ar == ' ')) continue;
                                if ((ch == ' ') && (ch_ar == '\n')) continue;
                                
                                if ((ch == '\t') && (ch_ar == ' ')) continue;
                                if ((ch == ' ') && (ch_ar == '\t')) continue;
                                
                                if ((ch == '"') && (ch_ar == ' ')) continue;
                                if ((ch == ' ') && (ch_ar == '"')) continue;
                                
                                fputc(ch, out);
                                ch_ar = ch;
                                printf("ffi %c \n", ch);
                                }
                     
                     
    }
    
    fputc(cha, out);
    rewind(out);
    
    ch = fgetc(out);
    
    while(!feof(out)) {
                     k++;
                     ch = fgetc(out);
    }
    
    k++;
      
    rewind(out);
    
    printf("all_symbols - %d\n", k-1);
 
    while(!feof(out)) {
                     ch = fgetc(out);
                     if (ch == ' ') i++;
                     if ((ch == '.') && (ch_ar == ' ')) {
                             i--;
                             break;
                     }
                     ch_ar = ch; 
    }
                                            
     SIZE = ++i;
     
     printf("SIZE = %d\n", SIZE);            
        
     str_mas(k, SIZE, out);
     fsetpos(out, &file_loc);
    
     ch = fgetc(out);    

    
    
    
    fclose(in);
    fclose(out);
    system("pause");
    
    return 0;
}



void str_mas(int len, int SIZE, FILE *che)
{
    
    int l=1;
    int i, j;
    char ch_ar[LONG], str[len], s_mas[SIZE][LONG];
    char* pstr;
    char* find = " ";
    fpos_t loc;
           
    addr *addr_list;
    
              
    rewind(che);
        
    fgets(str, len, che);
    
    pstr = strtok(str, find);
    strcpy(s_mas[0], pstr);
    
    printf("%s\n", s_mas[0]);
    
    for (i=1; i<SIZE; i++) {
                 pstr = strtok('\0', " ");
                 strcpy(s_mas[i], pstr);
              }
              
    for (i=0; i<SIZE; i++)         printf("this - %s\n", s_mas[i]);
    printf("\n");

    
    for (i=0; i<SIZE; i++) {
       addr_list[i].k = 0;
        
        strcpy(addr_list[i].value, s_mas[i]);
                      for (j=0; j<SIZE; j++) {
                          if (!strcmp((addr_list[i].value), s_mas[j])) addr_list[i].k++;
                          //printf("%d", j);
                          
        }
        
        //printf(" its struct - %s %d\n ", addr_list[i].value, addr_list[i].k);
    }
        
    quick_struct(&addr_list[0], SIZE);
    //qsort(addr_list, SIZE, sizeof(addr_list), sorting);
    
    
}    
    
void quick_struct(addr items[], int count)
{
     q_sort(items, 0, (count-1));
}

void q_sort(addr items[], int left, int right)
{
     int i, j;
     int x, y;
     addr temp;
     
     i = left; j = right;
     x = items[(left+right)/2].k;
     
     do {
         while((items[i].k < x) && (i < right)) i++;
         while((items[j].k > x) && (j > left)) j--;
         
         if (i<=j) {
                   y = items[i].k;
                   items[i].k = items[j].k;
                   items[j].k = y;
                   i++; j--;
         }
         
     } while (i<=j);
     
     if(left < j) q_sort(items, left, j);
     if(i < right) q_sort(items, i, right);
     
     for (i=0; i<(right+1); i++) printf("sorting %s %d\n", items[i].value, items[i].k);
}


Проблема возникла в самом конце при быстрой сортировке, выводяться непонятные значения и выбивает ошибку, qsort также не работает, помогите пожалуйста smile 

Это сообщение отредактировал(а) bsa - 27.11.2009, 00:13
PM MAIL   Вверх
zim22
Дата 26.11.2009, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(norgegoth @  26.11.2009,  13:22 Найти цитируемый пост)
, qsort также не работает

qsort из С standard library работает


--------------------
PM MAIL   Вверх
norgegoth
Дата 26.11.2009, 21:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 5.2.2009

Репутация: нет
Всего: нет



Цитата(zim22 @ 26.11.2009,  20:28)
Цитата(norgegoth @  26.11.2009,  13:22 Найти цитируемый пост)
, qsort также не работает

qsort из С standard library работает

вот с qsort - 

Код

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
#include <ctype.h>
#include <locale.h>

#define LONG 30

typedef struct addr {
           int k;
           char value[LONG];
           } addr;


void str_mas(int len, int SIZE, FILE *che);

void quick_struct(addr items[], int count);
void q_sort(addr items[], int left, int right);

int cmp(const void *, const void *);


int main(void)
{   
    setlocale(LC_ALL,"Russian");
    FILE *in, *out;
    fpos_t file_loc;
    char ch, och, *p, ch1, cha = '.', chs = ' ', ch_ar, *line;
    int k=0, SIZE, i=0;

    
    if((in=fopen("E:\\Dev-Cpp\\my_prog\\rat.txt", "r+"))==NULL) {
                      printf("Íåîòêðûâàåòñî ôàéë rat\n");
                      getch();
                      exit(1);
    }
    
    if((out=fopen("E:\\Dev-Cpp\\my_prog\\cat.txt", "w+"))==NULL) {
                      printf("Íåîòêðûâàåòñî ôàéë cat\n");
                      getch();
                      exit(1);
    }
    
    
    do {
        fgetpos(in, &file_loc);
        ch = fgetc(in);         
    } while (!isalnum(ch));
    
    fsetpos(in, &file_loc);
    
    while(!feof(in)) {
                     ch = tolower(fgetc(in));
                     
                     if ((ch == '\n') && (ch_ar != ' ')) {
                            fputc(chs, out);
                            ch_ar = chs;
                            continue;
                     }
                     
                     if ((ch == '\t') && (ch_ar != ' ')) {
                            fputc(chs, out);
                            ch_ar = chs;
                            continue;                          
                     }
                     
                     if ((ch == '"') && (ch_ar != ' ')) {
                            fputc(chs, out);
                            ch_ar = chs;
                            continue;
                     }
                     
                     if(!feof(in) && (isalnum(ch) || (ch ==' ') || (ch 
                     == '-') || (ch =='\n') || (ch =='\t') || (ch =='/' ) 
                     || (ch == '"') || (ch == '%') || (ch == '\\') || (ch == '_') || (ch == '+'))) {
                             
                                
                                
                                if ((ch == ' ') && (ch_ar == ' ')) continue;
                                
                                if ((ch == '\n') && (ch_ar == ' ')) continue;
                                if ((ch == ' ') && (ch_ar == '\n')) continue;
                                
                                if ((ch == '\t') && (ch_ar == ' ')) continue;
                                if ((ch == ' ') && (ch_ar == '\t')) continue;
                                
                                if ((ch == '"') && (ch_ar == ' ')) continue;
                                if ((ch == ' ') && (ch_ar == '"')) continue;
                                
                                fputc(ch, out);
                                ch_ar = ch;
                                printf("ffi %c \n", ch);
                                }
                     
                     
    }
    
    fputc(cha, out);
    rewind(out);
    
    ch = fgetc(out);
    
    while(!feof(out)) {
                     k++;
                     ch = fgetc(out);
    }
    
    k++;
      
    rewind(out);
    
    printf("all_symbols - %d\n", k-1);
 
    while(!feof(out)) {
                     ch = fgetc(out);
                     if (ch == ' ') i++;
                     if ((ch == '.') && (ch_ar == ' ')) {
                             i--;
                             break;
                     }
                     ch_ar = ch; 
    }
                                            
     SIZE = ++i;
     
     printf("SIZE = %d\n", SIZE);            
        
     str_mas(k, SIZE, out);
     fsetpos(out, &file_loc);
    
     ch = fgetc(out);    

    
    
    
    fclose(in);
    fclose(out);
    system("pause");
    
    return 0;
}



void str_mas(int len, int SIZE, FILE *che)
{
    
    int l=1;
    int i, j;
    char ch_ar[LONG], str[len], s_mas[SIZE][LONG];
    char* pstr;
    char* find = " ";
    fpos_t loc;
           
    addr *addr_list;
    
              
    rewind(che);
        
    fgets(str, len, che);
    
    pstr = strtok(str, find);
    strcpy(s_mas[0], pstr);
    
    printf("%s\n", s_mas[0]);
    
    for (i=1; i<SIZE; i++) {
                 pstr = strtok('\0', " ");
                 strcpy(s_mas[i], pstr);
              }
              
    for (i=0; i<SIZE; i++)         printf("this - %s\n", s_mas[i]);
    printf("\n");

    
    for (i=0; i<SIZE; i++) {
       addr_list[i].k = 0;
        
        strcpy(addr_list[i].value, s_mas[i]);
                      for (j=0; j<SIZE; j++) {
                          if (!strcmp((addr_list[i].value), s_mas[j])) addr_list[i].k++;
                          //printf("%d", j);
                          
        }
        
        //printf(" its struct - %s %d\n ", addr_list[i].value, addr_list[i].k);
    }
        
    qsort(addr_list, SIZE, sizeof(addr_list), cmp);
    for (i=0; i<SIZE; i++) printf("after sorting %d\n", addr_list[i].k);
}

    
    int cmp(const void *i, const void *j)
{
        return (*(int *)i - *(int *)j);
}
    
 


может я неправильно передал указатель на структуру - 
 
Код

qsort(addr_list, SIZE, sizeof(addr_list), cmp);


Это сообщение отредактировал(а) bsa - 27.11.2009, 00:13
PM MAIL   Вверх
mes
Дата 26.11.2009, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(norgegoth @  26.11.2009,  20:35 Найти цитируемый пост)
может я неправильно передал указатель на структуру - 


Код

addr *addr_list;
    
qsort(addr_list, SIZE, sizeof(addr_list), cmp); // попробуйте вывести значение  sizeof(addr_list) - будете удивлены 

smile



--------------------
PM MAIL WWW   Вверх
norgegoth
Дата 26.11.2009, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 5.2.2009

Репутация: нет
Всего: нет



[QUOTE=mes,26.11.2009,  22:20]
Цитата
Код
qsort(addr_list, SIZE, sizeof(addr_list), cmp); // попробуйте вывести значение  sizeof(addr_list) - будете удивлены 

smile


У меня выводит 4 байта, возникает вопрос - а почему собственно так мало? ведь там храняться переменные типа char и int, они поодельности занимают 8 байт?

Это сообщение отредактировал(а) bsa - 27.11.2009, 00:17
PM MAIL   Вверх
bsa
Дата 27.11.2009, 00:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



norgegoth, обрати внимание, что addr_list - это указатель. А размер указателя в 64-х битных системах 8 байт. Тебе же нужен размер структуры, на которую указывает указатель. Для этого нужно делать sizeof для разыменованного указателя: sizeof(*addr_list)
PM   Вверх
norgegoth
Дата 27.11.2009, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 5.2.2009

Репутация: нет
Всего: нет



Цитата(bsa @ 27.11.2009,  00:16)
norgegoth, обрати внимание, что addr_list - это указатель. А размер указателя в 64-х битных системах 8 байт. Тебе же нужен размер структуры, на которую указывает указатель. Для этого нужно делать sizeof для разыменованного указателя: sizeof(*addr_list)

спасибо, я понял свою ошибку, я необъявил структур массив во внутренней ф-ции и неправильно виделил место в qsort, вот работающая программа

Код


void str_mas(int len, int SIZE, FILE *che)
{
    
    int l=1;
    int i, j;
    char ch_ar[LONG], str[len], s_mas[SIZE][LONG];
    char* pstr;
    char* find = " ";
    fpos_t loc;
           
    addr addr_list[SIZE];
    
              
    rewind(che);
        
    fgets(str, len, che);
    
    pstr = strtok(str, find);
    strcpy(s_mas[0], pstr);
    
    printf("%s\n", s_mas[0]);
    
    for (i=1; i<SIZE; i++) {
                 pstr = strtok('\0', " ");
                 strcpy(s_mas[i], pstr);
              }
              
    for (i=0; i<SIZE; i++)         printf("this - %s\n", s_mas[i]);
    printf("\n");

    
    for (i=0; i<SIZE; i++) {
       addr_list[i].k = 0;
        
        strcpy(addr_list[i].value, s_mas[i]);
                      for (j=0; j<SIZE; j++) {
                          if (!strcmp((addr_list[i].value), s_mas[j])) addr_list[i].k++;
                          //printf("%d", j);
                          
        }
        
        printf(" its struct - %s %d\n ", addr_list[i].value, addr_list[i].k);
    }
        
        printf("\n %d\n", sizeof(addr_list)); 
    
    qsort(addr_list, SIZE, sizeof(addr), cmp);
    
    for (i=0; i<SIZE; i++) printf("after sorting %d\n", addr_list[i].k);
}

    int cmp(const void *i, const void *j)
    
{
        return (*(int *)i - *(int *)j);
}
 


Это сообщение отредактировал(а) bsa - 27.11.2009, 11:04
PM MAIL   Вверх
bsa
Дата 27.11.2009, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196




M
bsa
norgegoth, используй подсветку в стиле С++
если ответ на вопрос получен, то пометь тему решенной

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0619 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.