![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Регистрация: 20.04.2010
Сообщений: 4
|
![]()
Написать программу на языке C, выполняющую поиск фразы (несколько идущих подряд слов) в текстовом файле. Слова в файле разделены пробелами, знаками препинания или начинаются с новой строки. Ищется либо строгое соответствие фразы, либо нестрогое соответствие фразы (по выбору пользователя). При строгом соответствии каждый раз фраза ищется в пределах одного предложения (знаки препинания внутри предложения не учитываются). Предложения заканчиваются точкой. При нестрогом соответствии поиск ведется внутри каждого предложения так, что искомые слова могут находиться в предложении в произвольном порядке. В случае успешного поиска вывести на экран искомую фразу, предложение с найденной фразой и "координаты" (строку и столбец) первой буквы предложения в исходном тексте фразы. Найденные слова в предложении отметить другим цветом. Программа должна уметь продолжить поиск после того, как найдет первое соответствие, второе и т.д.
Помогите пожалуйста...просто сам я в программировании полный ноль... |
![]() |
![]() |
![]() |
#2 |
В стагнации
Участник клуба
Регистрация: 29.07.2011
Сообщений: 1,303
|
![]()
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание. Последний раз редактировалось MooNDeaR; 10.08.2011 в 18:56. |
![]() |
![]() |
![]() |
#3 |
Форумчанин
Регистрация: 07.08.2011
Сообщений: 576
|
![]()
Идеи какие, есть? Ато мог бы помоч но только в косоли и На плюсах, на чистом си не когда не делал.
На это дело ни один вечер уйдёт. По этому тлоько помоч, а не выкладывать готовый код. Это мне не интересно будет. так-что говори какие идеи есть, глядиш общими силами что нить сотворим |
![]() |
![]() |
![]() |
#4 |
Регистрация: 20.04.2010
Сообщений: 4
|
![]()
#include <windows.h>
#include "cyr_io.h" #include <string.h> #include <conio.h> #include <stdio.h> #include "congraph.h" #include <stdio.h> #include <iostream> #include <process.h> #include <iostream> using namespace std; //=================================== ========================= //=================================== ========================= const int KEY_ENTER = 13; // Клавиша Enter const int KEY_UP = 72; // Клавиша Cursor Up const int KEY_DOWN = 80; // Клавиша Cursor Down //=================================== ========================= int smenu=1; // Выбранный пункт меню //=================================== ========================= // Функция меню // выводит меню и обрабатывает команды пользователя в нём int menu(); // Рисуем рамочку вокруг меню // В параметрах передаётся дескриптор консоли void DrawBorder(HANDLE); // Рисуем пункты меню // В параметрах передаётся выбранный пункт меню void DrawMenu(HANDLE,int); //=================================== ========================= // Ввод текста void TextEntering(); // Поиск строгого соответствия фразы void FirstChoose(); // Поиск нестрогого соответствия фразы void SecondChoose(); //=================================== ========================= //=================================== ========================= char filename[50]; int n,i; // Головная программа void main() { setlocale(0,""); int choose; // Выбранный пункт меню system("cls"); // Очистка экрана // Основной цикл работы программы while (1) { // Выбор пункта меню choose = menu(); // В зависимости от выбранного пункта делаем: switch (choose) { case 1: // Вводим текст TextEntering(); break; case 2: // Ищем строгое соответствие с фразой из текста FirstChoose(); break; case 3: // Ищем нестрогое соответствие с фразой из текста SecondChoose(); break; case 4: // Выходим exit(0); } } return; } //=================================== ========================= // Выбор пункта меню int menu() { system("cls"); HANDLE dysplay; // дескриптор консоли dysplay = GetStdHandle(STD_OUTPUT_HANDLE); // DrawBorder(dysplay); // Рисуем рамочку вокруг меню // Опрос клавиш int key=0; DrawMenu(dysplay,smenu); // Рисуем пункты меню while (key!=KEY_ENTER) { key = getch(); // Нажали вверх? if (key==KEY_UP) { // Переходим к предыдущему пункту меню, // если можем и перерисовываем меню if (--smenu<1) smenu=1; DrawMenu(dysplay,smenu); } // нажали вниз? else if (key==KEY_DOWN) { // Переходим к следующему пункту меню, // если можем и перерисовываем меню if (++smenu>4) smenu=4; DrawMenu(dysplay,smenu); } } return smenu; } //=================================== ========================= // Рисуем пункты меню // В параметрах передаётся выбранный пункт меню void DrawMenu(HANDLE dys,int select) { // Константы выбирающие место вывода на экран const int left = 80/2-32/2+1; const int top = 20/2-6/2+1; COORD pos; char textmenu[4][31]; // Пункты меню strcpy(textmenu[0]," 1. Ввод текста "); strcpy(textmenu[1]," 2. Строгое соответствиe "); strcpy(textmenu[2]," 3. Нестрогое соответствие "); strcpy(textmenu[3]," 4. Выход "); // Вывод пунктов меню for (int i=0; i<4; i++) { // В зависимости от выбранного пункта меню выставляем цвет if (select==i+1) SetConsoleTextAttribute(dys,BACKGRO UND_GREEN); else SetConsoleTextAttribute(dys,FOREGRO UND_BLUE|FOREGROUND_GREEN|FOREGROUN D_INTENSITY); // Выводим pos.X = left; pos.Y = top+i; SetConsoleCursorPosition(dys,pos); printf("%s",textmenu[i]); } // Устанавливаем курсор в левый верхний угол pos.X = 0; pos.Y = 0; SetConsoleCursorPosition(dys,pos); SetConsoleTextAttribute(dys,FOREGRO UND_GREEN|FOREGROUND_BLUE|FOREGROUN D_RED); return; } |
![]() |
![]() |
![]() |
#5 |
Регистрация: 20.04.2010
Сообщений: 4
|
![]()
//=================================== =================================== ============
// Функция обеспечивает ввод текста void TextEntering() { // очищаем экран. system("cls"); char s[400]; cout << "Введите имя файла, в котором будет находиться текст:"; gets(filename); FILE*fp; if((fp=fopen(filename,"w"))==NULL) { printf("Невозможно открыть файл.\n"); exit(1); } printf("Введите текст:\n"); gets(s); //Считываем данные с клавиатуры OemToChar(s,s); fputs(s,fp); //Записываем их в файл fclose(fp); getch(); return; } //=================================== =================================== ============ //функция разбивает введенную строку на слова //=================================== =================================== ============ // Функция производит поиск фразы при строгом соответствии void FirstChoose() { // очищаем экран. system("cls"); char s[400]; char s2[40][50]; char str[400]; char str2[40][50]; int k; cout << "Введите имя файла:\n"; gets(filename); FILE*fp; if((fp=fopen(filename,"r"))==NULL) { printf("Невозможно открыть файл.\n"); exit(1); } while(!feof(fp)) { fgets(s,400,fp); puts(s); } int p=0,pred=0; for(int j=0,i=0;j<30;j++) { p=strchr(s+p,' ')-s; if(p<0) p=strlen(s); for(i=pred;i<p;i++) s2[j][i-pred]=s[i]; s2[j][p-pred]=NULL; p++; pred=p; } cout << "Введите фразу, которую будем искать:\n"; gets(str); OemToChar(str,str); n=strlen(str); int m=1; for(i=0;i<n;i++) { if(str[i]==' ') m++; } p=0; pred=0; for(int j=0,i=0;j<30;j++) { p=strchr(str+p,' ')-str; if(p<0) p=strlen(str); for(i=pred;i<p;i++) str2[j][i-pred]=str[i]; str2[j][p-pred]=NULL; p++; pred=p; } int l=0; for(i=0;i<40;i++) { if(strcmp(str2[0],s2[i])==0) { for(int j=0;j<40;j++) { k=strcmp(str2[j],s2[i+j]); if(k!=0) break; l++; } } } if(m==l) cout << "1"; else cout << "Совпадение не найдено"; getch(); return; } //=================================== =================================== ============ // Функция производит поиск фразы при нестрогом соответствии void SecondChoose() { // очищаем экран. system("cls"); getch(); return; } Вот мои наброски |
![]() |
![]() |
![]() |
#6 |
Регистрация: 20.04.2010
Сообщений: 4
|
![]()
Вот ещё, что мне сказал препод:
Нужно считывать из файла текст по одному предложению. Затем разбить фразу которую будем искать на отдельные слова и потом уже использовать фунуцию поиска символа char* strchr(const char* строка, int символ) |
![]() |
![]() |
![]() |
#7 |
Форумчанин
Регистрация: 07.08.2011
Сообщений: 576
|
![]()
Задача оказалась сложнее, чем кажется на первый взгляд.
тут ещё загвоздка как узнать сколько символов находится в фразе и тексте, но с этим позже разберёмся я бы предложил, для начала, такой алгоритм. Считываем из файла в массив типа char(как в си делается не пробовал) Фраза, у нас хранится в другом массиве. сравниваем оба массива вот таким образом char text[100];//сюда надо считать текст из файла hcar phrase[10];//здесь хранится фраза for (int i = 0; i <= 99; i++)// { for (int j = 0; <= 9; j++) { if (text[i] != prase[j]) { break;//если произошло несовпадение выходим из цикла } //если счетчик досчитал до конца, произошло совпадение } } тут еще массив для хранения номеров, совпавших символов нужен вот как то так, особо времени над этим подумать небыло. я не знаю, в си, есть динамические массивы а на счет выделения цвета в консоли,это вроде борландские методы , я этим не занимался. сейчас окна везде |
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Поиск в тексте | Terikon | Общие вопросы Delphi | 2 | 06.05.2011 23:01 |
Поиск последнего слова фразы в дереве предложения. | the_deer_one | Свободное общение | 5 | 17.08.2010 14:48 |
Поиск в тексте | Whiter | Общие вопросы Delphi | 10 | 30.07.2009 15:55 |
Поиск в тексте | Rigard | Общие вопросы Delphi | 8 | 15.10.2008 00:06 |
Поиск в тексте | jone | Общие вопросы Delphi | 14 | 28.09.2008 12:42 |