Напечатать слова в алфавитном порядке - 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``: определяет строку, используемую для разделения слов в строке.