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

  1. Есть два файла, input.txt, в котором в столбик записано некоторое количество слов, и output.txt, в который необходимы вывести эти же слова после сортировки+колонка из 4-го и 5-го символов. Как упорядочить слова по алфавиту относительно 4-го и 5-го символов и вывести на консоль полученный текст и колонку из соответствующих словам пар символов? Смог осилить(не без гугла) только сортировку по алфавиту(по всему слову) и чтение из файла/вывод в файл. Вот код:C1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 #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; }


textual

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

#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;
}

СДЕЛАЙТЕ РЕПОСТ

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



Похожие ответы
  1. Задана последовательность из N вещественных чисел. Определить сколько чисел меньше K, равно K и больше K. (массив random )

  1. Добрый вечер! Дан массив M*N. Необходимо отсортировать ее по строкам так, чтобы вначале шли все положительные элементы, отсортированные по убыванию, а затем все остальные, отсортированные по возрастанию (если в строке имеются нули - переставить их в конец строки). Вывести получившуюся матрицу. У меня проблема с перестановкой нулей. C1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 #include     int main()     {   int N, M,t, i,j,k, mas[10][10]={0}, q;         printf("VVEDITE N,M \n");     scanf("%d%d", &N,&M);     printf("VVEDITE MASSIV \n");       for (i=0; i < N; i++)        for (j=0; j < M; j++)            scanf ("%d", &mas[i][j]);       for(k = 0; k < N; k++){     for(i = 0 ; i < M; i++){         for(j = i + 1; j < M; j++){               if((mas[k][i] < mas[k][j]) && (mas[k][i]!=0)){                       t = mas[k][i];                     mas[k][i] = mas[k][j];                     mas[k][j] = t;               }         }     } }   if (mas[i][j]<0) {     } {   for(k = 0; k < N; k++){         for(i = 0 ; i < M; i++){             for(j = i + 1; j < M; j++){                   if(mas[k][i] < mas[k][j]) {                       t = mas[k][i];                     mas[k][i] = mas[k][j];                     mas[k][j] = t;               }         }     } } } for(i = 0 ; i < M; i++)     {         for(j = 0; j < M; j++)             if (mas[i][j]==0)         {                 for ( q = j; q < N-1 ; q++)                 {                     mas[i][q] = mas[i][q + 1];                 }                 mas[N-1][M-1] = 0;           }     }   for (i=0; i < N; i++)        {for (j=0; j < M; j++)               printf ("%d\t", mas[i][j]);        printf (" \n");}   getch();}

  1. Есть быстрая сортировка:C++1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 void quick_sort(int* sarr, int j) {     int size = j;     int k = 0;     int c = sarr[(int)(j / 2)];     int tmp = 0;     do {         while (sarr[k] < c) k++;         while (sarr[j] > c) j--;           if (k <= j) {             tmp = sarr[k];             sarr[k] = sarr[j];             sarr[j] = tmp;             k++;             j--;         }     } while (k <= j);     if (j > 0) quick_sort(sarr, j);     if (j > 0) quick_sort(sarr + k, size - k); }Как сделать что бы сортировались только четные числа?

  1. C1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 void save_birnar(){ int i; FILE *fp; fp = fopen( "output.bin", "ab+" ); int N=100; for ( i = 0; i < N; i ++ )     fp = fopen( "output.bin", "ab+" ); // открыть двоичный файл на запись fwrite ( contacts[i].name, sizeof(contact), fp ); fwrite ( contacts[i].last_name, sizeof(contacts), N, fp ); // записать весь массив fwrite ( contacts[i].number, sizeof(contact), N, fp ); fwrite ( contacts[i].viber, sizeof(contact), N, fp ); fclose ( fp ); // закрыть файл   }Столкнулась с проблемой не могу сохранить структуруC1 2 3 4 5 6 7 8 struct contact { char name[30]; char last_name[30]; char number[30]; char viber[10]; int del; } *contacts;в двоичный фаил, не могу пользоваться нормально функцией fwrite. Вопрос, как записать массив структур в фаил и как прочитать потом данный фаил для дальнейшей работы с ним?

  1. Сформировать массив из элементов исходных массивов, больших второго элемента первого массива и положительных элементов второго массива. Требуется сформировать новый массив по заданию. В программе реализовать: 1) генерацию случайным образом элементов исходных массивов; 2) выполнение действия в соответствии с условием задачи; 3) порядок вывода: • исходные массивы, • сформированный массив, если он был сформирован. В противном случае – соответствующее сообщение. Помогите, а то не могу сделать

  1. Нужна программа, в которую вводишь текст и она расставляет буквы по алфавиту (обязательно с помощью пузырьковой сортировки) и выводит на экран с пробелами между группой букв. Пример: Ввод: Annulo cingitul tenui, plano, nusquam cohaerente, ad eclipticam inclinato. Вывод: aaaaaaa cccc d eeeee g h iiiiiii lllll mm nnnnnnnnn oooo pp q r s ttttt uuuuu

  1. C1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 #include   double sum2d(int a, int b, const double  mass[a][b]);   int main(void) {     const int YEARS = 5;     const int MONTHS = 12;     const float rain[YEARS][MONTHS] =     {         { 4.3, 4.3, 4.3, 3.0, 2.0, 1.2, 0.2, 0.2, 0.4, 2.4, 3.5, 6.6 },         { 8.5, 8.2, 1.2, 1.6, 2.4, 0.5, 2.0, 9.0, 3.0, 9.1, 4.7, 3.0 },         { 9.1, 8.5, 6.7, 4.3, 2.1, 0.8, 0.2, 0.2, 1.1, 2.3, 6.1, 8.4 },         { 7.2, 9.9, 8.4, 3.3, 1.2, 0.8, 0.4, 0.0, 0.6, 1.7, 4.3, 6.2 },         { 7.6, 5.6, 3.8, 2.8, 3.8, 0.2, 0.0, 0.0, 0.0, 1.3, 2.6, 5.2 },     };       printf("Среднегодовое количество осадков за 5 лет = %f",sum2d(YEARS, MONTHS, rain[YEARS][MONTHS])/YEARS); return 0; }   double sum2d(int a, int b, const double  mass[a][b]) {     int i, j;     int total;     double **pt;     **pt = mass[0][0];       for (i = 0; i < a; ++i)     {         for(j = 0; j < b; ++j)         {             total+=**pt;             ++pt;         }     } return total; }При компиляции помимо куци предупреждений выдается следующие ошибки: rain.c:20:2: error: incompatible type for argument 3 of ‘sum2d’ printf("Среднегодовое количество осадков за 5 лет = %f",sum2d(YEARS, MONTHS, rain[YEARS][MONTHS])/YEARS); ^ rain.c:3:8: note: expected ‘const double (*)[(sizetype)(b)]’ but argument is of type ‘float’ double sum2d(int a, int b, const double mass[a][b]);Добавлено через 23 секунды по заданию считать нужно с применением указателей.

  1. Найти максимальный элемент и поменять его местами с последним элементом массива. В программе предусмотреть и реализовать: 1) генерацию элементов исходного массива с помощью датчика случайных чисел; 2) выполнение в соответствии с условием задачи; 3) порядок вывода: • исходный массив, • максимальный или минимальный элемент массива и его номер, • массив, полученный в результате выполнения задания.

  1. Заполнить одномерный массив случайными числами. Вывести на экран все элементы массива, являющимся двухзначными числами. Буду благодарен)))

  1. Приветствую всех. Долго мучался, как же сформулировать вопрос, и все таки... Есть массив строк(аля char**) в цикле он заполняется(в функцию, где это происходит просто кидают большую строку со '\n'-ами, а в функции в цикле она разбивается на несколько строк). Так вот, в самом цикле все нормально происходит, а вот при выходе на месте первого элемента массива строк красуются несколько(всегда 3) кракозябер, в то время, как с остальными строчками все нормально. Не можете подсказать что либо по этому поводу?? Собственно код функции C1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 unsigned int menu(unsigned int mask, char* str){     FILE* flog = fopen("menu.log", "w+");     char **txt = (char**)malloc(sizeof(char*));     int i = 0;     int j = 0;     do{         txt[i] = (char*)malloc(32*sizeof(char));         int k = 0;         k = snprintf(txt[i], 32, "%d. ", i + 1);         txt[i] = (char*)realloc(txt[i], (k + 2)*sizeof(char));         do{             txt[i][k] = str[j]; fprintf(flog, "  j=%i, k=%i, txt[%i][%i]=%c.\n", j, k, i, k, txt[i][k]);             txt[i] = (char*)realloc(txt[i], (k + 2)*sizeof(char));             j++; k++;         }while(str[j - 1] != '\n');         txt[i][k] = '\0';         i++;     }while(str[j] != '\0');       if(mask < 1 || mask >= (1 << i + 1))         return 0;       for (int h = 0; h < i; h++)         fprintf(flog, "txt[%i]=%s\n", h, txt[h]);         int b = 0;     unsigned int l = 0;     for(int l = 1; l < (2 << i); l *= 2, b++){         fprintf(flog, "i=%i, l=%i, (2 << i)=%i, b=%i.\n",i ,l, 2 << i, b);         if(l & mask){             printf("%s", txt[b]);         }     }     fclose(flog);     do{         printf("Выберите действие(Введите число): ");         scanf("%i", &l);     }while(!((mask >> (l - 1)) & 1));         for(int c = 0; c < i; c++)         free(txt[c]);     free(txt);     return l; } p. s. string.h низзя.