Программа для пузырьковой сортировки текстового файла в C - PullRequest
0 голосов
/ 04 мая 2020

Я пишу программу C, которой нужно дать txt-файл, содержащий имена игроков и сколько у них выигрышей (это для большого игрового проекта), и сортирую их по наибольшему количеству выигрышей. В то время как код компилируется и успешно упорядочивает выигрыши, я испытываю проблему с именами, где они, кажется, накладываются друг на друга.


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

    char name[20];
    int wins[20];


void main()
{

    FILE *fp;
    int i=0,size,j,swap;
    char ch; 

    fp=fopen("record.txt","r");
    if(fp==NULL)
    { 
    printf("\n Cannot open the file \n");
    exit(0);
    }
    while(ch!=EOF)
    {
    fscanf(fp,"%s %d",&name[i],&wins[i]);  
    ch=fgetc(fp); 
    i++;  
    } 
    size=i-1;
    for(i=1;i<size;++i)
    for(j=0;j<size-i;j++)
    if(wins[j+1]>wins[j])

    {

        swap    = wins[j];
        wins[j]   = wins[j+1];
        wins[j+1] = swap;

        swap      = name[j];
        name[j]   = name[j+1];
        name[j+1] = swap;
    }
    fp=fopen("sortedRecord.txt","w");
    for(i=0;i<size;i++){
    fprintf(fp,"%s %d \n",&name[i],wins[i]);
    printf ("%s %d \n", &name[i],wins[i]); 
    }


    fclose(fp); 

}

Вот входной файл "record.txt"

Andrew 5
Billboy 10
Hill 7
Mill 1

И вот что я получаю, когда запускаю его.

BHAMill 10 
HAMill 7 
AMill 5 
Mill 1 

Я новичок в коде, поэтому я знаю, что мой отстой, но что касается меня, я не могу точно понять, где все идет не так , Любая помощь или совет приветствуется.

1 Ответ

1 голос
/ 04 мая 2020

Как сказал jwdonahue, проблема в вашем определении name. char name[20] создает массив из 20 char с, а не из 20 строк.

Когда вы запускаете while(ch!=EOF) l oop, что происходит? В первый раз вы находите адрес 0-го элемента в name и пишете Andrew, поэтому name имеет ['A', 'n', 'd', 'r', 'e', 'w', '\0', '\0', '\0', '\0'] (\0 - это конец строки). Во второй раз вы найдете адрес 1-го элемента в name и напишите Billboy, но 0-й элемент все еще там и не изменился, так что вы получите содержимое ['A', 'B', 'i', 'l', 'l', 'b', 'o', 'y', '\0', '\0']. Добавление Hill ко второй позиции приводит к ['A', 'B', 'H', 'i', 'l', 'l', '\0', 'y', '\0', '\0']. Затем, наконец, добавление Mill дает массив ['A', 'B', 'H', 'M', 'i', 'l', 'l', '\0', '\0', '\0'].

Когда вы затем go сортируете баллы, вы сортируете символы в этом массиве, которые заканчиваются на ['B', 'H', 'A', 'M', 'i', 'l', 'l', '\0', '\0', '\0'] (ваша сортировка будет влиять только на первые четыре символа). В своем выражении печати вы затем печатаете массив символов, начиная с 0-й, 1-й, 2-й и 3-й позиций соответственно, так что вы получите BHAMill, HAMill, AMill и Mill.

Надеемся, что должно помочь вам достаточно, чтобы вы отклеились. :)

...