Пузырьковая сортировка матрицы для получения некоторых символов в порядке возрастания - PullRequest
0 голосов
/ 20 июня 2020

У меня есть файл с именем testing.txt, где у меня есть следующая матрица символов:

h 3 l l 0 t h
3 r 3 h 0 w a
r e y 0 u d 0
1 n g 2 d a y

С кодом, который вы видите в конце вопроса, я разделяю символы на два списка названы следующим образом: numbers и characters, чтобы я мог распечатать их на своем экране следующим образом (сначала числа, а затем буквы):

0 0 0 0 1 2 3
3 3 h l l t h
r h w a r e y
u d n g d a y

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

У меня вопрос: все работает нормально, кроме порядка число. Это означает, что числа упорядочиваются в коде, однако, когда я печатаю матрицу на своем экране, я получаю только следующее:

h l l t h r
h w a r e y
u d n g d a
y

Значит, числа отсутствуют. Как я могу решить эту проблему?

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

int main()
{

FILE *fich;
char c = 'f', *characters = NULL, *numbers = NULL, *final_list = NULL, aux = 'a';
int character = 0, number = 0, i = 0, j = 0, rows = 1, columns = 0;

fich = fopen("testing.txt", "r");

/*Check if file is available*/

if(fich == NULL)
{
   puts("The file couldn't be opened");
   return 1;
}

/*Allocate dynamic memory*/

characters = (char*) calloc(character, sizeof(char));
numbers = (char*) calloc(number, sizeof(char));

/*Save the list of characters and numbers*/

rewind(fich);

number = character=0;

while ((c = fgetc(fich)) != EOF)
{
   if (c >= 'a' && c <= 'z')
   {
      *(characters+number) = c;
      number++;
   } else if (c >= '1' && c <= '9')
      {
         *(numbers+character) = c;
         character++;
      } else if (c == '\n') 
         {
            rows++;
         }
} 

fclose(fich); 
fich = NULL;

/*Order the lists*/

for (i = 0; i < (number-1); ++i)
{
   for (j = i+1; j < number; ++j)
   {
      if (*(numbers+i)>*(numbers+j))
      {
         aux = *(numbers+j);
         *(numbers+j) = *(numbers+i);
         *(numbers+i) = aux;
      }
   }
}

/*Concat the lists*/

final_list = (char*) calloc((number+character), sizeof(char));

strcat(final_list, numbers);
strcat(final_list, characters);

/*Print the new matrix*/

columns = (number+character)/rows;

for (i = 0; i < (number+character); ++i)
{  
   printf("%c ", *(final_list+i));
   if ((i+1)%columns == 0)
         printf("\n");
}

return 0;
}

1 Ответ

1 голос
/ 20 июня 2020

Вы поменяли местами счетчики number и character внутри while l oop, используемого для чтения файла. Измените его следующим образом:

while ((c = fgetc(fich)) != EOF)
{
   if (c >= 'a' && c <= 'z')
   {
       *(characters+character) = c;
       character++;
   } else if (c >= '1' && c <= '9')
   {
       *(numbers+number) = c;
       number++;
   } else if (c == '\n') 
   {
       rows++;
   }
}

Кроме того, вам необходимо позвонить calloc для numbers и characters с размером, по крайней мере, равным no. из numbers и characters в файле соответственно.

...