Сортировка слов в предложении - 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, что означает успешное выполнение программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д