Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.08.2011, 18:33   #1
spoilbabe
 
Регистрация: 20.04.2010
Сообщений: 4
По умолчанию Поиск фразы в тексте

Написать программу на языке C, выполняющую поиск фразы (несколько идущих подряд слов) в текстовом файле. Слова в файле разделены пробелами, знаками препинания или начинаются с новой строки. Ищется либо строгое соответствие фразы, либо нестрогое соответствие фразы (по выбору пользователя). При строгом соответствии каждый раз фраза ищется в пределах одного предложения (знаки препинания внутри предложения не учитываются). Предложения заканчиваются точкой. При нестрогом соответствии поиск ведется внутри каждого предложения так, что искомые слова могут находиться в предложении в произвольном порядке. В случае успешного поиска вывести на экран искомую фразу, предложение с найденной фразой и "координаты" (строку и столбец) первой буквы предложения в исходном тексте фразы. Найденные слова в предложении отметить другим цветом. Программа должна уметь продолжить поиск после того, как найдет первое соответствие, второе и т.д.

Помогите пожалуйста...просто сам я в программировании полный ноль...
spoilbabe вне форума Ответить с цитированием
Старый 10.08.2011, 18:50   #2
MooNDeaR
В стагнации
Участник клуба
 
Аватар для MooNDeaR
 
Регистрация: 29.07.2011
Сообщений: 1,303
По умолчанию

Тогда тебе к фрилансерам обращатся

P.S.

Почему? Потому что есть вот этот линк
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание.

Последний раз редактировалось MooNDeaR; 10.08.2011 в 18:56.
MooNDeaR вне форума Ответить с цитированием
Старый 10.08.2011, 21:41   #3
SAMOUCHKA
Форумчанин
 
Регистрация: 07.08.2011
Сообщений: 576
По умолчанию

Идеи какие, есть? Ато мог бы помоч но только в косоли и На плюсах, на чистом си не когда не делал.
На это дело ни один вечер уйдёт. По этому тлоько помоч, а не выкладывать готовый код. Это мне не интересно будет.
так-что говори какие идеи есть, глядиш общими силами что нить сотворим
SAMOUCHKA вне форума Ответить с цитированием
Старый 10.08.2011, 21:44   #4
spoilbabe
 
Регистрация: 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;
}
spoilbabe вне форума Ответить с цитированием
Старый 10.08.2011, 21:45   #5
spoilbabe
 
Регистрация: 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;
}
Вот мои наброски
spoilbabe вне форума Ответить с цитированием
Старый 11.08.2011, 11:06   #6
spoilbabe
 
Регистрация: 20.04.2010
Сообщений: 4
По умолчанию

Вот ещё, что мне сказал препод:
Нужно считывать из файла текст по одному предложению. Затем разбить фразу которую будем искать на отдельные слова и потом уже использовать фунуцию поиска символа char* strchr(const char* строка, int символ)
spoilbabe вне форума Ответить с цитированием
Старый 11.08.2011, 21:01   #7
SAMOUCHKA
Форумчанин
 
Регистрация: 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;//если произошло несовпадение выходим из цикла
}
//если счетчик досчитал до конца, произошло совпадение

}
}
тут еще массив для хранения номеров, совпавших символов нужен
вот как то так, особо времени над этим подумать небыло.
я не знаю, в си, есть динамические массивы
а на счет выделения цвета в консоли,это вроде борландские методы , я этим не занимался. сейчас окна везде
SAMOUCHKA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск в тексте 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