Определить порядковый номер заданного слова в каждом предложении текста - 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
происходит открытие файла для чтения, чтение текста, вывод текста на экран, поиск заданного слова и вывод сообщения о результате поиска.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д