Напечатать слова в алфавитном порядке - C (СИ) (71364)
Формулировка задачи:
Дана строка, содержащая от 1 до 30 слов, в каждом из которых от 1 до 5 строчных латинских букв; между соседними словами – запятая, за последним словом – точка. Напечатать:
Все слова в алфавитном порядке
Если кто знает, как делать, буду рад оказанной помощи, у меня получилось разбить слова и записать их в массив, а как сортировку сделать не могу представить, а также надо сортировку сделать при помощи указателей, я никак с ними разобраться не могу, вот есть наработки, если кто знает напишите
Листинг программы
- #include "stdafx.h"
- #include "string.h"
- #include "stdio.h"
- int _tmain(int argc, _TCHAR* argv[])
- {
- char s[100] = {"fesa,tre,qwrp,kjfo,aks,ptfgdr,odjhf,bckjd,abgfs.\n"};
- char b[100][100];
- char *str[100];
- int i, j, n = 30, r, l, kol = 0;
- char *raz;
- puts(s);
- //gets(s);
- printf( "Razbit:\n" );
- raz = strtok(s, ".,");
- while( raz != NULL )
- {
- printf("%s \n", raz);
- raz = strtok(NULL, ".,");
- kol++;
- }
- /*перенос слов в новый массив для сравнения*/
- for (int j = 0, z = 0; j < kol; j++)
- {
- for (int i = z, l = 0; s[i] != '\0' ; i++, l++)
- {
- b[j][l] = s[i];
- b[j][l + 1] = '\0';
- z++;
- }
- z++;
- }
- //сортировка по алфавиту, но не верная, она не работает
- for(j = 0;j < n; j++)
- {
- r = 0;
- for(l = 0;l < n;l++)
- {
- if (strcmp(b[j],b[l])>0)
- {
- r++;
- }
- if(l < j && strcmp(b[j],b[l])==0)
- r++;
- }
- str[r] = b[j];
- }
- for(j = 0;j < n; j++)
- {
- printf("%s\n",str[r]);
- }
- return 0;
- }
Решение задачи: «Напечатать слова в алфавитном порядке»
textual
Листинг программы
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- int cmp(const void * a, const void * b) {
- return strcmp(*(char**)b, *(char**)a);
- }
- typedef char string_t[256];
- #define get_string(s) ( scanf("%255[^\n]%*c", (s)) == 1 )
- #define MAX_WORDS (256)
- #define DELIM " ,\t\n"
- int main(void) {
- string_t str;
- while ( printf("String: ") && get_string(str) ) {
- char * words[MAX_WORDS], * p = strchr(str, '.');
- int count = 0;
- if ( p )
- *p = '\0';
- for ( p = strtok(str, DELIM); p && count < MAX_WORDS; p = strtok(NULL, DELIM) )
- words[count++] = p;
- qsort(words, count, sizeof(char*), cmp);
- while ( count )
- printf("%s\n", words[--count]);
- }
- return 0;
- }
Объяснение кода листинга программы
В этом коде на языке C:
- Написаны функции:
cmp
: функция сравнения, используемая в функцииqsort
для сортировки массива строк.get_string
: функция, которая считывает строку из стандартного ввода до первого символа новой строки, оставляя все символы новой строки в строке.main
: точка входа в программу.
- Определены типы данных и переменные:
string_t
: пользовательский тип данных, представляющий строку символов.MAX_WORDS
: максимальное количество слов в строке.DELIM
: строка, используемая для разделения слов в строке.str
: переменная типаstring_t
, которая считывается вводной функциейget_string
.words[i]
: массив указателей на строки, которые считываются изstr
.count
: счетчик количества слов в строке.p
: указатель на текущее слово в строке.
- Происходит последовательность действий:
- Сначала пользователю предлагается ввести строку.
- Если строка была введена, то код разбивает строку на слова и сортирует их в алфавитном порядке с помощью функции
qsort
и функции сравненияcmp
. - Затем код выводит отсортированные слова в обратном порядке.
- Используются директивы препроцессора и библиотеки:
#include <stdio.h>
: подключает библиотеку для ввода/вывода.#include <stdlib.h>
: подключает библиотеку для работы с памятью.#include <string.h>
: подключает библиотеку для работы со строками.#define MAX_WORDS 256
: определяет максимальное количество слов в строке.#define DELIM
,\t\n``: определяет строку, используемую для разделения слов в строке.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д