Сортировка слов в предложении - C (СИ)

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

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

Приветствую всех, подскажите пожалуйста с заданием вроде всё написал но не сортирует до конца....Суть программы заключается в следующем С клавиатуры вводится предложение. Вывести на экран монитора слова из этого предложения в порядке убывания их длины. Вот код--->
#include "stdafx.h"
#include <windows.h>
#include <string.h>
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <ctype.h>
#include "stdafx.h"
#include <iostream>
using namespace std;
 
void main()
{
char str[255],slova[255][255],temp[255];
int i,j=0,k=0,dlina[255],tempint,m=0;
printf("vvedite stroku\n");
gets(str);
str[strlen(str)]=' ';
for (i=0;i<strlen(str);i++)  
{
    if (str[i]!=' ') 
    {
        slova[j][m]=str[i];    
        m++;
        k++;
    }
    else 
    {
        slova[j][m]='\0';
        k++;
        dlina[j]=k;
        j++;
        m=0;
        k=0;
    }
}
//for (i=0;i<j;i++)
   // cout<<dlina[i]<<endl;
 
for (i=0;i<j-2;i++)
    for (k=i;k<j-1;k++)
        if (dlina[k]<dlina[k+1])
        {
            tempint=dlina[k];
            dlina[k]=dlina[k+1];
            dlina[k+1]=tempint;
            for (m=0;m<dlina[k+1];m++)
            {
                temp[m]=slova[k][m];
                slova[k][m]=slova[k+1][m];
                slova[k+1][m]=temp[m];
            }
 
        }
 
cout<<endl;
for (i=0;i<j;i++)
{
    for(k=0;k<dlina[i];k++)
        cout<<slova[i][k];
    cout<<endl;
}
}

Решение задачи: «Сортировка слов в предложении»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
    
/* сравнивалка строк по длинне для qsort */
int wrdCmpDesc(const void *a, const void *b){
    return strlen(*(char**)b) - strlen(*(char**)a);
}
 
/* 
    вывести слово, содержащее максимальное и минимальное количество символов, 
    строку пользователь вводит с клавиатуры.
*/
 
int main(void){
    char **words, *pWord, buf[BUFSIZ];
    size_t size, i;
    
    while ( 1 ){ /* бесклнечный цикл */
        printf("\nString: ");
        if ( !fgets(buf, BUFSIZ, stdin) ){ /* прочитать строку */
            fprintf(stderr, "Can't get string!\n");
            exit(1);
        }
        if ( pWord = strrchr(buf, '\n') )
            *pWord = '\0'; /* удалить символ перевода строки */
        
        if ( !*buf )
            break; /* если строка пустая - на выход */
        
        /* разделение строки на массив слов */
        words = NULL;
        size = 0;
        for ( pWord = strtok(buf, " \t"); pWord != NULL; pWord = strtok(NULL, " \t") ){
            if ( ( words = (char**)realloc(words, sizeof(char*) * (size + 1)) ) == NULL ){
                fprintf(stderr, "Memory error!\n");
                exit(1);
            }
            if ( ( words[size] = strdup(pWord) ) == NULL ){
                fprintf(stderr, "Memory error!\n");
                exit(1);
            }
            ++size;
        }
        if ( !words ){
            fprintf(stderr, "Can't find some words!\n");
            exit(1);
        }
        
        /* сортировка массива слов */
        qsort(words, size, sizeof(char*), wrdCmpDesc);
        /* конец сортировки */
        
        /* вывод слов от самого длинного до самого короткого */
        for ( i = 0; i < size; ++i )
            printf("%s\n", words[i]);
        
        /* очистка памяти */
        do {
            free(words[--size]);
        } while ( size );
        free(words);
    }
    
    /* завершение программы */
    exit(0);
}

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

  1. Объём доступной памяти определяется функцией malloc, а процесс выделения памяти — функцией realloc.
  2. В случае ошибки выделения памяти, программа выводит сообщение об ошибке и завершает своё выполнение.
  3. Для сортировки массива используется функция qsort, которая принимает на вход:
    • массив, который необходимо отсортировать
    • размер этого массива
    • размер одного элемента массива (в данном случае — указатель на тип данных, в данном случае — char*)
    • функцию сравнения, которая определяет порядок сортировки. В данном случае — функцию wrdCmpDesc, которая сравнивает длину строк.
  4. В цикле с помощью функции printf выводятся слова из отсортированного массива. Каждое слово выводится на новой строке.
  5. После вывода всех слов, с помощью цикла for и функции free производится очистка памяти. В первую очередь, освобождается память, выделенная под последнее слово, затем под предыдущее и так далее до тех пор, пока не будет освобождена память под первое слово в массиве. После этого, сама память под массив слов освобождается с помощью функции free.
  6. Программа завершается с помощью функции exit, которая завершает выполнение программы и возвращает значение 0, что означает успешное выполнение программы.

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


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

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

10   голосов , оценка 3.9 из 5
Похожие ответы