Определить порядковый номер заданного слова в каждом предложении текста - 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;
}
Объяснение кода листинга программы
- В функции
WriteTextесть две версии. Одна из них не используетnum, поэтому в данном контексте она не нужна. В другой версииnumиспользуется для печати порядкового номера слова в каждом предложении текста. - В функции
WriteWordзадача - определить порядковый номер заданного слова в каждом предложении текста. Для этого используется переменнаяnum, которая, вероятно, должна быть массивом. В этой функции также используется переменнаяs, которая заполняется символами слова. - В функции
ReadTextсчитывается текст из файла в массивa. Функция возвращает количество строк в тексте. - В функции
SearchWordпроисходит поиск заданного слова в тексте. Если слово найдено, его порядковый номер сохраняется в массивеnum. - В функции
mainпроисходит открытие файла для чтения, чтение текста, вывод текста на экран, поиск заданного слова и вывод сообщения о результате поиска.