Сортировка массива слов по алфавиту (только по 4-му и 5-му символу) - C (СИ)
Формулировка задачи:
Есть два файла, input.txt, в котором в столбик записано некоторое количество слов, и output.txt, в который необходимы вывести эти же слова после сортировки+колонка из 4-го и 5-го символов.
Как упорядочить слова по алфавиту относительно 4-го и 5-го символов и вывести на консоль полученный текст и колонку из соответствующих словам пар символов? Смог осилить(не без гугла) только сортировку по алфавиту(по всему слову) и чтение из файла/вывод в файл.
Вот код:
#include <stdio.h>
#include <string.h>
int main(void)
{
char strings[10][32], str[32];
FILE *inputFile, *outputFile;
int count = 0, i, j;
if((inputFile = fopen ("input.txt", "r")) == NULL)
{
printf("Ошибка чтения файла!\n");
return 1;
}
if((outputFile = fopen ("output.txt", "w")) == NULL)
{
printf("Ошибка записи в файл!\n");
return 1;
}
/* Считываем слова из файла */
while (feof(inputFile) == 0 || count > 10)
{
fscanf (inputFile, "%s", str);
strcpy(strings[count++], str);
}
fclose(inputFile);
/* Выводим считаные строки */
printf("Исходный текст:\n");
for(i = 0; i < count-1; i++)
{
printf("%s\n", strings[i]);
}
putchar('\n');
/* Сортировка методом пузырька */
for(i = 1; i < count; i++)
{
for(j = 0; j < count - i; j++)
{
if(strcmp(strings[j], strings[j+1]) > 0)
{
strcpy(str, strings[j]);
strcpy(strings[j], strings[j+1]);
strcpy(strings[j+1], str);
}
}
}
/* Выводим отсортированные строки */
printf("Сортированный по алфавиту текст:\n");
fprintf(outputFile, "Сортированный по алфавиту текст:\n");
for(i = 0; i < count-1; i++)
{
printf("%s\n", strings[i]);
fprintf(outputFile, "%s\n", strings[i]);
}
return 0;
}Решение задачи: «Сортировка массива слов по алфавиту (только по 4-му и 5-му символу)»
textual
Листинг программы
#include <stdio.h>
#include <string.h>
#define MAX_STR_LEN (32 + 1)
#define MAX_STR_CNT (10)
static int Compare(void* p1,void* p2)
{
char* psz1 = *(char**)p1;
char* psz2 = *(char**)p2;
if (psz1[3] > psz2[3])
{
return 1;
}
else if (psz1[3] < psz2[3])
{
return -1;
}
else
{
if (psz1[4] > psz2[4])
{
return 1;
}
else if (psz1[4] < psz2[4])
{
return -1;
}
else
{
return 0;
}
}
}
int main(int argc,char** argv)
{
char pszTemp[MAX_STR_LEN];
char pszInput[MAX_STR_CNT][MAX_STR_LEN];
char* pSortArr[MAX_STR_CNT];
FILE* pIn = fopen("input.txt", "rt");
FILE* pOut = fopen("output.txt","wt");
int count = 0;
int ii = 0;
if (!pIn)
{
printf("Ошибка чтения файла!\n");
return -1;
}
if (!pOut)
{
printf("Ошибка записи в файл!\n");
fclose(pIn);
return -1;
}
/* Считываем слова из файла */
while (!feof(pIn) && (count < 10))
{
fscanf(pIn,"%s",pszTemp);
strcpy(pszInput[count],pszTemp);
pSortArr[count] = pszInput[count];
++count;
}
fclose(pIn);
pIn = NULL;
/* Выводим считаные строки */
printf("Исходный текст:\n");
for(ii = 0; ii < count; ++ii)
{
printf("%s\n",pszInput[ii]);
}
putchar('\n');
qsort(pSortArr,count,sizeof(char*),Compare);
/* Выводим отсортированные строки */
fprintf(pOut,"Сортированный по алфавиту (символы 4 и 5) текст:\n\n");
for ( ii = 0; ii < count; ++ii)
{
fprintf(pOut,"%s\n",pSortArr[ii]);
}
return 0;
}
Объяснение кода листинга программы
- Подключение необходимых библиотек Код начинается с подключения двух необходимых библиотек: stdio.h и string.h.
- Объявление констант Затем определяются две константы: MAX_STR_LEN (максимальная длина строки в символах) и MAX_STR_CNT (максимальное количество строк).
- Объявление функции сравнения Далее идет объявление функции сравнения Compare. Эта функция будет использоваться в алгоритме сортировки для определения порядка строк.
- Ввод данных из файла В функции main открывается файл input.txt для чтения и записывается в него строки. Файл открывается в режиме текстового чтения (rt). Если файл не может быть открыт, программа выводит сообщение об ошибке и завершает работу.
- Сортировка массива После заполнения массива pSortArr сортировка происходит с помощью функции qsort. В качестве аргументов функции указывается начало и конец массива, а также функция сравнения Compare.
- Вывод отсортированных строк Затем в файл output.txt выводятся отсортированные строки.
- Завершение работы программы В конце программы закрывается файл output.txt и возвращается 0, что означает успешное завершение работы программы.