Определить порядковый номер заданного слова в каждом предложении текста - C (СИ)

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

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

С помощью текстового редактора создать файл, содержащий текст, длина которого не превышает 1000 символов (длина строки текста не должна превышать 70 символов). Имя файла должно иметь расширение DAT. Написать программу, которая: • выводит текст на экран дисплея; • определяет порядковый номер заданного слова в каждом предложении текста (заданное слово вводится с клавиатуры); • по нажатию произвольной клавиши поочередно выделяет каждое предложение текста, а в выделенном предложении — заданное слово.
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <windows.h>
//--------------------------
 void WriteText(char a[], int num[])
  {
   int i = 0,j = 1;
   while (a[i]!='\0')
    {
     i++;
     putc(a[i]);
     if (a[i]=='.')
      {
       j++; 
       printf("\n %d ", num[j]);
      }
     }
   }  
 void WriteWord(char a[], int *num, int lc, int wl)
  {
   int i,j,k,k1,i1;
   char s[100];
   memset(s,'\0',100);
   i1=0;
   i=0;
   j=1;
   k=0;
   k1=0;
   if (((a[j-1]=='\0')||(a[j-1]==' ')||(a[j-1]=='(')||(a[j-1]=='{')||(a[j-1]==',')) && ((a[j+wl]==' ') || (a[j+wl]=='\n') || (a[j+wl]=='\0')||(a[j+wl]=='.')||(a[j+wl]==',')||(a[j+wl]==')')||(a[j+wl]=='}') ))
    {
     textcolor(RED);
     for (k=num;k!=(num+wl);k++)
      {
       s[k1]=s[k1]+a[k];
       k1++;
      }
      j=num+wl;
      cprintf(s);
    
     putchar (a[j]);
     j++;
     if (a[j]=='\n')
      i++;
     if (a[j]=='\0')
      break;
    }
     else
      {
       j++;
       if (a[j]=='\n')
        i++;
      
    }
    putchar (a[j]);
    j++;
  }
 
//--------------------------
 int ReadText(char a[], FILE *fi)
  {
   int i,j,veof;
   memset(a,'\0',700);
   i=1;
   j=0;
   while ((veof=fgetc(fi)) != EOF)
    {
     if (veof=='\n')
      i++;
     j++;
     a[j]=veof;
    }
   return i;
   }
//--------------------------
 void WriteText(char a[])
  {
   int i = 1;
   while (a[i]!='\0')
    {
     putchar(a[i]);
     i++;
    }
  }
//--------------------------
 void SearchWord(char str[],char a[], int *num)
  {
   int i,j,k=0,wl,l=1,varnum1;
   wl=strlen(str);
   i=1;
   j=0;
   while (a[i]!='\0')
    {
     k++;
     if (str[j]==a[i])
      j++;
     else
      j=0;
     if (a[i]=='\n')
      {
       k=0;
       l++;
      } 
     if ((j==wl) && ((a[i-j]==' ')||(a[i-j]=='\0')||(a[i-j]=='(')||(a[i-j]=='{')||(a[i-j]==',')) && ((a[i+1]==' ') || (a[i+1]=='\n') || (a[i+1]=='\0')||(a[i+1]=='.')||(a[i+1]==',')||(a[i+1]==')')||(a[i+1]=='}') ))
      *num[l]=k;
    }  
   }
//--------------------------
 
 main ()
  {
   FILE *fp;
   char a[700];
   char *fname = "D:\\Input1.dat";
   char str[80];
   int num[150];
   int lc,oldnum,varnum,lcw,wl;
   int error = 1;
   int error1 = 2;
   char mode;
   int start = 0;
   memset(str,NULL,80);
   memset(num,0,150);
   oldnum=0;
   varnum=0;
   lcw=1;
   lc=1;
   fp = fopen(fname,"r");
   if (fp != NULL)
    {
     lc=ReadText(a,fp);
     if (mode == 1)
      WriteText(a);
     if ((mode == 2)||(mode == 3))
      {
       WriteText(a);
       printf("\nInput a search word\n");
       scanf("%s",&str);
       wl=strlen(str);
       clrscr();
       while((error!=3)&&(error!=2))
        {
         error=SearchWord(str,a,&num);
         if (error==1)
          {
           clrscr();
           WriteWordInMiddle(a,oldnum,lc,lcw,wl,);
          // getch();
         //  continue;
          }
         if (error==2)
           printf("\nThe search word is not found");
         if (error==3)
           printf("\nThis is the last mention of the search word");
         getch();
        }
      }
      getch();
     fclose(fp);
    }
   else
    {
     printf("File not open");
     getch();
    }
 }
Помогите исправить ошибки.

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

textual
Листинг программы
void WriteText(char a[], int num[])
{
    int i = 0,j = 1;
    while (a[i]!='\0')
    {
        i++;
        putchar(a[i]);
        if (a[i]=='.')
        {
            j++; 
            printf("\n %d ", num[j]);
        }
    }
}  
void WriteWord(char a[], int *num, int lc, int wl)
{
    int i,j,k,k1,i1;
    char s[100];
    memset(s,'\0',100);
    i1=0;
    i=0;
    j=1;
    k=0;
    k1=0;
    if (((a[j-1]=='\0')||(a[j-1]==' ')||(a[j-1]=='(')||(a[j-1]=='{')||(a[j-1]==',')) && ((a[j+wl]==' ') || (a[j+wl]=='\n') || (a[j+wl]=='\0')||(a[j+wl]=='.')||(a[j+wl]==',')||(a[j+wl]==')')||(a[j+wl]=='}') ))
    {
        textcolor(RED);
        for (k=*num;k!=*(num+wl);k++) // num это указатель, надо поставить * для обращения
        {
            s[k1]=s[k1]+a[k];
            k1++;
        }
        j=*(num+wl);
        cprintf(s);
 
        putchar (a[j]);
        j++;
        if (a[j]=='\n')
            i++;
        //if (a[j]=='\0')
            //break; предназаначен для выхода из цикла.. тут его нет 
    }
    else
    {
        j++;
        if (a[j]=='\n')
            i++;
 
    }
    putchar (a[j]);
    j++;
}
 
//--------------------------
int ReadText(char a[], FILE *fi)
{
    int i,j,veof;
    memset(a,'\0',700);
    i=1;
    j=0;
    while ((veof=fgetc(fi)) != EOF)
    {
        if (veof=='\n')
            i++;
        j++;
        a[j]=veof;
    }
    return i;
}
//--------------------------
void WriteText(char a[])
{
    int i = 1;
    while (a[i]!='\0')
    {
        putchar(a[i]);
        i++;
    }
}
//--------------------------
void SearchWord(char str[],char a[], int *num)
{
    int i,j,k=0,wl,l=1,varnum1;
    wl=strlen(str);
    i=1;
    j=0;
    while (a[i]!='\0')
    {
        k++;
        if (str[j]==a[i])
            j++;
        else
            j=0;
        if (a[i]=='\n')
        {
            k=0;
            l++;
        } 
        if ((j==wl) && ((a[i-j]==' ')||(a[i-j]=='\0')||(a[i-j]=='(')||(a[i-j]=='{')||(a[i-j]==',')) && ((a[i+1]==' ') || (a[i+1]=='\n') || (a[i+1]=='\0')||(a[i+1]=='.')||(a[i+1]==',')||(a[i+1]==')')||(a[i+1]=='}') ))
            num[l]=k; // здесь * не нужна
    }  
}
//--------------------------
 
int main ()
{
    FILE *fp;
    char a[700];
    char *fname = "D:\\Input1.dat";
    char str[80];
    int num[150];
    int lc,oldnum,varnum,lcw,wl;
    int error = 1;
    int error1 = 2;
    char mode;
    int start = 0;
    memset(str,NULL,80);
    memset(num,0,150);
    oldnum=0;
    varnum=0;
    lcw=1;
    lc=1;
    fp = fopen(fname,"r");
    if (fp != NULL)
    {
        lc=ReadText(a,fp);
        if (mode == 1)
            WriteText(a);
        if ((mode == 2)||(mode == 3))
        {
            WriteText(a);
            printf("\nInput a search word\n");
            scanf("%s",&str);
            wl=strlen(str);
            clrscr();
            while((error!=3)&&(error!=2))
            {
                error=SearchWord(str,a,num); // & наверное лишний.. а функция SearchWord ничего не возвращает
                // поэтому нет смысла присваивать error что-то
                if (error==1)
                {
                    clrscr();
                    WriteWordInMiddle(a,oldnum,lc,lcw,wl);// этой функции нет
                    // getch();
                    //  continue;
                }
                if (error==2)
                    printf("\nThe search word is not found");
                if (error==3)
                    printf("\nThis is the last mention of the search word");
                getch();
            }
        }
        getch();
        fclose(fp);
    }
    else
    {
        printf("File not open");
        getch();
    }
    return 0;
}

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

  1. В функции WriteText есть две версии. Одна из них не использует num, поэтому в данном контексте она не нужна. В другой версии num используется для печати порядкового номера слова в каждом предложении текста.
  2. В функции WriteWord задача - определить порядковый номер заданного слова в каждом предложении текста. Для этого используется переменная num, которая, вероятно, должна быть массивом. В этой функции также используется переменная s, которая заполняется символами слова.
  3. В функции ReadText считывается текст из файла в массив a. Функция возвращает количество строк в тексте.
  4. В функции SearchWord происходит поиск заданного слова в тексте. Если слово найдено, его порядковый номер сохраняется в массиве num.
  5. В функции main происходит открытие файла для чтения, чтение текста, вывод текста на экран, поиск заданного слова и вывод сообщения о результате поиска.

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


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

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

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