Для каждого слова текста подсчитать число вхождений в текст - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Ввести массив строк символов (текст). Для каждого слова текста подсчитать число вхождений в текст. Словами считать группы символов, разделённые одним или несколькими пробелами. Функцию ввода текста я написал она работает, а вот с остальным не получается. Функция ввода:
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<alloc.h>

char **getxt(void)
 
{char **txt,buf[128];
int i=0,n,cnt=1;
txt=(char**)malloc(sizeof(char*));
while((gets(buf))&&strlen(buf)!=0)
{n=strlen(buf);
txt[i]=(char*)malloc((n+1)*sizeof(char));
strcpy(txt[i],buf);
txt=(char**)realloc(txt,++cnt*sizeof(char*));
 
return txt;
 
}

Решение задачи: «Для каждого слова текста подсчитать число вхождений в текст»

textual
Листинг программы
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<alloc.h>
char** gettxt();
void laba(char**);
 
main()
{
clrscr();
char **txt;
int i,j;
clrscr();
printf("Programma pods4itivaet kolli4estvo vhozhdeniy kazhdogo slova v text\n(slovom s4itetsia gruppa simvolov ograni4ennih 1 ili neskolkimi probelami)");
printf("\nVvedite text:\n");
txt=gettxt();
laba(txt);
getch();
}
 
char** gettxt()
{
char **txt, buf[128]="A";
int i=0,n,cht=1;
txt=(char**)malloc(sizeof(char*));
 while(strlen(buf)!=0)
 {
 
 gets(buf);
 n=strlen(buf);
 txt[i]=(char*)malloc((n+1)*sizeof(char));
 strcpy(txt[i],buf);
 txt=(char**)realloc(txt,(++cht)*sizeof(char*));
 i++;
 }
 txt[i]=NULL;
return txt;
}
 
void laba(char **txt)
{
int i=0;
char **words;
char *pch;
int slov=0; 
int y,kol;
char* buf;
words=(char**)malloc(sizeof(char*));
words[0]=NULL;
 while(*(txt+i))
 {
 pch=strtok(*(txt+i)," ,.-"); 
  while (pch!=NULL)
  {
  words=(char**)realloc(words,(slov+1)*sizeof(char*));
  words[slov]=(char*)malloc((strlen(pch)+1)*sizeof(char));
  words[slov]=pch;
  pch = strtok(NULL, " ,.-");     
  ++slov;
  words[slov]=NULL;
  }
 ++i;
 }
 
 buf=(char*)malloc(sizeof(char));
 for(i=0;i<=slov;++i)
 {
 if(words[i]==NULL) continue;
  {
  buf=(char*)realloc(buf,(strlen(words[i])+1)*sizeof(char));
  strcpy(buf,words[i]);
  kol=0;
   for(y=0;y<=slov;++y)
   {
    if(words[y]==NULL) continue;
    if(strcmp(buf,words[y])==0)
    {
    kol++;
    words[y]=NULL;
    }
   }
  if(strlen(buf)!=1) printf("slovo='%s' vstretilos' %d raz\n",buf,kol);
  }
 }
for(int z=0;z<=slov;++z)
{
free(words[z]);
}
free(words);
free(buf);
}

Объяснение кода листинга программы

В этом коде выполняется подсчет числа вхождений каждого слова в тексте. Вот список действий, которые выполняются в коде:

  1. В функции main() пользователю предлагается ввести текст.
  2. Введенный текст сохраняется в массиве символов, разделенных пробелами, запятыми, точками и дефисами.
  3. В функции gettxt() текст извлекается из введенного пользователем массива и разделяется на отдельные слова. Каждое слово сохраняется в двумерном массиве txt.
  4. В функции lab() каждое слово из массива txt проверяется. Если слово встречается в массиве более одного раза, его количество вхождений увеличивается на единицу.
  5. После завершения проверки всех слов, их количество вхождений выводится на экран.
  6. Все выделенные памяти освобождаются.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4.154 из 5
Похожие ответы