2013-08-27 2 views
1

У меня есть текстовый файл с именем, за которым следует число, которое является приоритетом имени, теперь я пытаюсь сортировать текстовый файл по приоритету и писать новый файл.Сортировка массива второй строкой

old 
name1 1 
name2 2 
name3 3 
name4 1 
name5 1 
name6 2 
name7 1 
name8 3 

new 
name 1 1 
name4 1 
name5 1 
name2 2 
name6 2 
name3 3 
name8 3 

я достиг, чтобы получить старый текстовый файл в массиве, но я застрял с сортировкой этого массива по приоритету. Я не должен снова прокручивать файл, просто хочу отсортировать массив и записать новый отсортированный массив в новый текстовый файл. Как мне продолжить?

Код

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


typedef struct{ 
    int p; 
    char *name; 
}names; 

int main(void){ 
    FILE *old= fopen("old.txt", "r"); 
    FILE *new = fopen("new.txt", "w"); 

    char n[10]; 
    int i =0; 

    names *name= malloc(sizeof(names)); 

    for(i; i<count; i++){ 
     int p; 

     char *n= malloc(sizeof(char) * 4); 
     fscanf(old, "%s %i", n, &p); 

     names[i].name= n; 
     names[i].p= p; 

    } 
    int j=0; 

    for(i=0; i < count;i++){ 

    } 

    return 0; 
} 
+1

Почему вы это делаете в C? –

+0

Вы проделали хорошую работу. Вы протестировали его на куски, и у вас есть что-то, что решает часть головоломки. Следующий шаг - описать словами, как вы хотите сортировать данные. Являются ли элементы один и два отсортированными - да. Являются ли элементы два и три отсортированы да. Элементы 3 и отсортированы - нет. Затем сделайте то, что ... Итак, в словах описывайте, что вы хотите программировать дальше. Тогда поставьте это в вопросе и сделайте попытку сделать это. – dcaswell

+1

'fscanf (eerste,"% s% f ", name, &prio);', будьте осторожны, 'prio' является' int', и вы сканируете 'float' –

ответ

1

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

Что вам нужно для сортировки? Массив из job.

Каков ключ, по которому вам нужно сортировать? job.prio.

Итак, как сортировать? Любой общий выбор, вставка или (eek) тип пузыря будет делать. (Хотя, если вы спуститесь по пути сортировки пузырьков, по крайней мере сделайте его сексуальным и сделайте сортировку коктейля.) Просто сравните два job.prio s, оба они равны int, так что это не сложно и поменяйте местами их соответствующих структур job в массив по мере необходимости.

Вот алгоритм сортировки, который будет работать. Вы можете найти много других в Google.

void selectionSort (job* jobs, int size) { 

    int smallest; 
    job temp; 

    for (int i = 0; i < size - 1; i++) { 
     smallest = i; 
     for (int walk = i + 1; walk <= size - 1; walk++) { 
      if (jobs[walk].prio < jobs[smallest].prio) 
       smallest = walk; 
     } // end inner loop 
     temp = jobs[i]; 
     jobs[i] = jobs[smallest]; 
     jobs[smallest] = temp; 
    } // end outer loop 
    return; 
} 

Довольно просто; это похоже на любой старый выбор. Но выбор сортировки скучен. Попробуйте сделать сортировку вставки, теперь, когда сортировка выбора дает вам общее представление о том, как менять элементы в массиве.

Обратите внимание, что в вашем коде есть другие проблемы, как указывали люди: вы выделяете пространство только для одного задания в вашем массиве, но вам нужно восемь; у вас есть неопределенные переменные, такие как eerste; у вас есть name, объявленный дважды, один раз как char* и один раз в виде массива char. Таким образом, есть много очистки, но, надеюсь, у вас будет достаточно идеи, чтобы завершить свое задание.

1

Вы должны отсортировать с помощью стандартной функции библиотеки qsort().

Для обеспечения сортировки потребуется выполнить функцию, которая сравнивает две структуры job.

Вот одна попытка:

static int compare_jobs(const void *a, const void *b) 
{ 
    const job *ja = a, *jb = b; 

    return ja->prio < jb->prio ? -1 : ja->prio > jb->prio; 
} 

Вам нужно будет назвать это правильно (читать документацию!), Затем цикл над массивом и записать содержимое в новый файл.

+1

Qsort является частью libc (stdlib.h), и вы уже используют malloc, который также является частью stdlib.h, поэтому вам не понадобится дополнительная библиотека – fhahn

Смежные вопросы