Напечатать все слова, которые встречаются в последовательности по одному разу - C (СИ)
Формулировка задачи:
Сам попробовал написать код,но везде одни ошибки.
Можете выручить ?
Дана последовательность, содержащая от 1 до 30 слов, в каждом из которых от 1 до 5 прописных латинских букв; между соседними словами - запятая, за последним словом - точка. Напечатать все слова, которые встречаются в последовательности по одному разу.
Листинг программы
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- int cmp(const void * a,const void *b)
- {
- return srtcmp(*(char **)b,*(char **)a);
- }
- typedef char string_t[300];
- #define GET_srting(s) (scanf("%250")[^\n]%"c",((s))==1)
- #define MAX_Words[30]
- #define DELIM ",\t\n"
- int main (void){
- string_t str;
- while ((printf("String")) && GET_srting(str)){
- char * words[MAX_WORDS],*p=strchr(str,'.');
- int cout=0;
- if(p)
- *p='\0';
- for (p=strtok(str,DELIM); p&& cout <MAX_WORDS;p=strtok(NULL,DELIM)) words[cout++]=p;
- qsort(words,cout,sizeof(char*),cmp);
- while (cout)
- printf("%s\n",words[-count]);
- }
- return 0;
- }
Решение задачи: «Напечатать все слова, которые встречаются в последовательности по одному разу»
textual
Листинг программы
- #include <stdio.h>
- #include <string.h>
- int main()
- {
- char s[] = "every,breath,you,take,every,move,you,make.";
- char word[10], *p, *start = s;
- int i = 0, j = 0, n = 0;
- while(s[i]){
- if(s[i] != ',' && s[i] != '.'){
- word[j] = s[i];
- j++;
- }
- else{
- word[j] = '\0';
- j = 0;
- while(1){
- p = strstr(start, word);
- if(p == NULL)break;
- n++;
- if(n > 1)break;
- start = p + strlen(word);
- }
- if(n <= 1)
- printf("%s,", word);
- n = 0;
- start = s;
- }
- i++;
- }
- printf("\b.");
- return 0;
- }
Объяснение кода листинга программы
В этом коде на языке C:
- Задана строка
s[]
, которая содержит последовательность слов, разделенных запятыми и точками. - Переменная
word[10]
используется для хранения текущего слова, которое встречается в последовательности. - Переменная
p
используется как указатель на текущий символ в строкеs[]
. - Переменная
start
указывает на начало текущего слова в строкеs[]
. - Переменные
i
иj
используются для индексации символов в строкеs[]
. - Переменная
n
используется для подсчета количества раз, которое каждое слово встречается в последовательности. - В цикле
while
происходит чтение каждого символа в строкеs[]
. - Если текущий символ не является запятой или точкой, он добавляется в переменную
word[j]
. - Если текущий символ является запятой или точкой, он помещается в начало следующего слова и переменная
n
сбрасывается в 0. - В цикле
while
происходит поиск всех вхождений текущего слова в оставшуюся часть строкиs[]
. - Если текущее слово встречается в последовательности менее двух раз, оно выводится на консоль вместе с запятой.
- После завершения цикла
while
выводится точка. - Функция
main
возвращает 0, что означает успешное выполнение программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д