Сортировка слов в предложении - 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);
}
Объяснение кода листинга программы
- Объём доступной памяти определяется функцией
malloc, а процесс выделения памяти — функциейrealloc. - В случае ошибки выделения памяти, программа выводит сообщение об ошибке и завершает своё выполнение.
- Для сортировки массива используется функция
qsort, которая принимает на вход:- массив, который необходимо отсортировать
- размер этого массива
- размер одного элемента массива (в данном случае — указатель на тип данных, в данном случае —
char*) - функцию сравнения, которая определяет порядок сортировки. В данном случае — функцию
wrdCmpDesc, которая сравнивает длину строк.
- В цикле с помощью функции
printfвыводятся слова из отсортированного массива. Каждое слово выводится на новой строке. - После вывода всех слов, с помощью цикла
forи функцииfreeпроизводится очистка памяти. В первую очередь, освобождается память, выделенная под последнее слово, затем под предыдущее и так далее до тех пор, пока не будет освобождена память под первое слово в массиве. После этого, сама память под массив слов освобождается с помощью функцииfree. - Программа завершается с помощью функции
exit, которая завершает выполнение программы и возвращает значение 0, что означает успешное выполнение программы.