Сортировка массива слов по алфавиту (только по 4-му и 5-му символу) - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Есть два файла, input.txt, в котором в столбик записано некоторое количество слов, и output.txt, в который необходимы вывести эти же слова после сортировки+колонка из 4-го и 5-го символов. Как упорядочить слова по алфавиту относительно 4-го и 5-го символов и вывести на консоль полученный текст и колонку из соответствующих словам пар символов? Смог осилить(не без гугла) только сортировку по алфавиту(по всему слову) и чтение из файла/вывод в файл. Вот код:
Листинг программы
  1. #include <stdio.h>
  2. #include <string.h>
  3. int main(void)
  4. {
  5. char strings[10][32], str[32];
  6. FILE *inputFile, *outputFile;
  7. int count = 0, i, j;
  8. if((inputFile = fopen ("input.txt", "r")) == NULL)
  9. {
  10. printf("Ошибка чтения файла!\n");
  11. return 1;
  12. }
  13. if((outputFile = fopen ("output.txt", "w")) == NULL)
  14. {
  15. printf("Ошибка записи в файл!\n");
  16. return 1;
  17. }
  18. /* Считываем слова из файла */
  19. while (feof(inputFile) == 0 || count > 10)
  20. {
  21. fscanf (inputFile, "%s", str);
  22. strcpy(strings[count++], str);
  23. }
  24. fclose(inputFile);
  25. /* Выводим считаные строки */
  26. printf("Исходный текст:\n");
  27. for(i = 0; i < count-1; i++)
  28. {
  29. printf("%s\n", strings[i]);
  30. }
  31. putchar('\n');
  32. /* Сортировка методом пузырька */
  33. for(i = 1; i < count; i++)
  34. {
  35. for(j = 0; j < count - i; j++)
  36. {
  37. if(strcmp(strings[j], strings[j+1]) > 0)
  38. {
  39. strcpy(str, strings[j]);
  40. strcpy(strings[j], strings[j+1]);
  41. strcpy(strings[j+1], str);
  42. }
  43. }
  44. }
  45. /* Выводим отсортированные строки */
  46. printf("Сортированный по алфавиту текст:\n");
  47. fprintf(outputFile, "Сортированный по алфавиту текст:\n");
  48. for(i = 0; i < count-1; i++)
  49. {
  50. printf("%s\n", strings[i]);
  51. fprintf(outputFile, "%s\n", strings[i]);
  52. }
  53. return 0;
  54. }

Решение задачи: «Сортировка массива слов по алфавиту (только по 4-му и 5-му символу)»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. #define MAX_STR_LEN              (32 + 1)
  5. #define MAX_STR_CNT              (10)
  6.  
  7. static int Compare(void* p1,void* p2)
  8. {
  9.    char*    psz1 = *(char**)p1;
  10.    char*    psz2 = *(char**)p2;
  11.  
  12.    if (psz1[3] > psz2[3])
  13.    {
  14.       return 1;
  15.    }
  16.    else if (psz1[3] < psz2[3])
  17.    {
  18.       return -1;
  19.    }
  20.    else
  21.    {
  22.       if (psz1[4] > psz2[4])
  23.       {
  24.          return 1;
  25.       }
  26.       else if (psz1[4] < psz2[4])
  27.       {
  28.          return -1;
  29.       }
  30.       else
  31.       {
  32.          return 0;
  33.       }
  34.    }
  35. }
  36.  
  37. int main(int argc,char** argv)
  38. {
  39.    char     pszTemp[MAX_STR_LEN];
  40.    char     pszInput[MAX_STR_CNT][MAX_STR_LEN];
  41.    char*    pSortArr[MAX_STR_CNT];
  42.  
  43.    FILE*    pIn  = fopen("input.txt", "rt");
  44.    FILE*    pOut = fopen("output.txt","wt");
  45.  
  46.    int   count = 0;
  47.    int   ii = 0;
  48.    
  49.    if (!pIn)
  50.    {
  51.       printf("Ошибка чтения файла!\n");
  52.       return -1;
  53.    }
  54.    
  55.    if (!pOut)
  56.    {
  57.       printf("Ошибка записи в файл!\n");
  58.       fclose(pIn);
  59.       return -1;
  60.    }
  61.    
  62.    /* Считываем слова из файла */
  63.    while (!feof(pIn) && (count < 10))
  64.    {  
  65.       fscanf(pIn,"%s",pszTemp);
  66.  
  67.       strcpy(pszInput[count],pszTemp);
  68.      
  69.       pSortArr[count] = pszInput[count];
  70.      
  71.       ++count;
  72.    }
  73.    
  74.    fclose(pIn);
  75.    pIn = NULL;
  76.    
  77.    /* Выводим считаные строки */
  78.    printf("Исходный текст:\n");
  79.    
  80.    for(ii = 0; ii < count; ++ii)
  81.    {  
  82.       printf("%s\n",pszInput[ii]);
  83.    }
  84.    
  85.    putchar('\n');
  86.    
  87.    qsort(pSortArr,count,sizeof(char*),Compare);
  88.  
  89.    /* Выводим отсортированные строки */
  90.    fprintf(pOut,"Сортированный по алфавиту (символы 4 и 5) текст:\n\n");
  91.    
  92.    for ( ii = 0; ii < count; ++ii)
  93.    {  
  94.       fprintf(pOut,"%s\n",pSortArr[ii]);
  95.    }
  96.      
  97.    return 0;
  98. }

Объяснение кода листинга программы

  1. Подключение необходимых библиотек Код начинается с подключения двух необходимых библиотек: stdio.h и string.h.
  2. Объявление констант Затем определяются две константы: MAX_STR_LEN (максимальная длина строки в символах) и MAX_STR_CNT (максимальное количество строк).
  3. Объявление функции сравнения Далее идет объявление функции сравнения Compare. Эта функция будет использоваться в алгоритме сортировки для определения порядка строк.
  4. Ввод данных из файла В функции main открывается файл input.txt для чтения и записывается в него строки. Файл открывается в режиме текстового чтения (rt). Если файл не может быть открыт, программа выводит сообщение об ошибке и завершает работу.
  5. Сортировка массива После заполнения массива pSortArr сортировка происходит с помощью функции qsort. В качестве аргументов функции указывается начало и конец массива, а также функция сравнения Compare.
  6. Вывод отсортированных строк Затем в файл output.txt выводятся отсортированные строки.
  7. Завершение работы программы В конце программы закрывается файл output.txt и возвращается 0, что означает успешное завершение работы программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4.071 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут