Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Ада и другие языки _ поиск слова в тексте,выделение,замена регистра букв в слове

Автор: Tribunal 7.11.2006 20:13

Задание вот такое:
С помощью текстового редактора создать файл,содержащий текст, длина которого не превышает 100 символов(длина строки не должна превышать 70 символов).
Имя файла должно иметь расширение dat.Написать программу,которая:
-выводит текст на экран дисплея;
-по нажатию произвольной клавиши выделяет в тексте заданное слово(ввести слово с клавиатуры);
-выводит текст на эккран дисплея еще раз, заменяя в заданном слове строчные букв прописными.

я воспользовалась поиском и нашла решение задачи на паскале,но всё же работа со строками там сильно отличается от с++.

вот например,можно ли с файла(ну или с экрана) считать тект в массив по словам?как осуществлять поиск конкретного слова,особенно если есть несколько вхождений.

и вот насчет смены букв строчных на пописные...кажется у них код различается на определенную величину...или как их можно заменить?

очень прошу о помощи)

Автор: volvo 7.11.2006 20:19

Ищи внимательнее, я и на С++ эту программу уже делал...
Вот тут: http://forum.pascal.net.ru/index.php?s=&showtopic=10806&view=findpost&p=68720

Цитата
насчет смены букв строчных на пописные...кажется у них код различается на определенную величину...или как их можно заменить?
Уже все сделано за нас smile.gif tolower/toupper из CTYPE.H

Автор: Tribunal 7.11.2006 21:33

Цитата(volvo @ 7.11.2006 23:19) *

Ищи внимательнее, я и на С++ эту программу уже делал...
Вот тут: http://forum.pascal.net.ru/index.php?s=&showtopic=10806&view=findpost&p=68720

это я тоже смотрела)
но мне там не очень понятна ф-ия sinsert...я видела файл,который ее подключает...
но всё равно иначе можно сделать?
или может дадите какие-нибудь комментарии?

Цитата(volvo @ 7.11.2006 23:19) *

Уже все сделано за нас smile.gif tolower/toupper из CTYPE.H

отлично)
а как ими пользоваться,не подскажете?

Автор: volvo 7.11.2006 21:47

Цитата
но всё равно иначе можно сделать?
Всегда можно сделать иначе, только вот вопрос: если сделать по-другому, тебе сразу все будет понятно? Ты уверена в этом? Посмотрим:
#include <fstream.h>
#include <iostream.h>
#include <conio.h>;
#include <string.h>;

#include <ctype.h>

int main() {

char s[71];

ifstream infile("Text700.txt");
while (!infile.eof()) {
infile.getline(s, 80);
cout << s << endl;
}

cout << "Enter the Word: ";
char word[50];
cin >> word;


infile.seekg(0, ios::beg);
infile.clear();

while(!infile.eof()) {

infile.getline(s, 80);
do {

char *p;
p = strstr(s, word);
if(p) {
for(int i = 0; i < strlen(word); i++) *(p+i) = toupper(*(p+i));
}
else break;

} while(1);
cout << s << endl;
}

cout << "Press any key" << endl;
getche();
return 0;
}



Цитата
как ими пользоваться
Как обычно:
     int length, i;
char *string = "this is a string";

length = strlen(string);
for (i=0; i<length; i++)
{
string[i] = toupper(string[i]);
}
(пример - из справки Turbo C++ 3.0)

Автор: Tribunal 10.11.2006 21:06

нда...
понятно действительно далеко не всё...хотя разобраться можно)
плюс ко всему я не могу разобраться, как выделить это слово в тексте,ведь оно должно выделяться в уже выведенном тексте .
помогите пожалуйста...

Автор: volvo 10.11.2006 21:32

Ну, так оно же выделяется:

          if(p) {
for(int i = 0; i < strlen(word); i++) *(p+i) = toupper(*(p+i));
}
- переводится в верхний регистр...

Автор: Tribunal 10.11.2006 21:39

не)
оно должно помимо этого еще и в исходном тексте сначала выделить цветом.
вот это как делается?)

Автор: volvo 10.11.2006 21:53

Не знаю. Я этого в задании, например, не увидел... Там вообще нет про ЦВЕТ ни слова. Как задание поставлено, так программа и работает...

А цвет и потоки - вообще понятия несовместимые...

Автор: Tribunal 10.11.2006 22:04

под словом выделить там подразумевается именно цвет(
а как же тогда поступить,если с потоками работать нельзя?(

Автор: Tribunal 10.11.2006 22:30

вот такой штукой можно весь текст выделить),а как конкретное слово я не знаю(

COORD start;
start.X=0;
start.Y=0;
HANDLE hConsole=GetStdHandle(STD_OUTPUT_HANDLE);

SetConsoleTextAttribute(hConsole,BACKGROUND_BLUE|
FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);

Автор: Алена 12.11.2006 23:50

Значит, смотри, какая есть идея: работа с консольным приложением в MSVC и с DOS-приложением в Turbo C++ существенно различается, поэтому делаем так:


// Я отлаживала программу под DOS - компилятором (TC 3.0), поэтому я это слово определила...
// Тебе (как я понимаю, для консольного приложения Windows), эту строчку надо убрать...
// (к сожалению, MSVC у меня нет, поэтому проверить вывод не могу, но должно работать)
#define RUN_IN_DOS

#ifndef RUN_IN_DOS
#include <windows.h>
#endif

#include <fstream.h>
#include <iostream.h>
#include <conio.h>;
#include <string.h>;

#include <ctype.h>


int main() {

char s[71];

ifstream infile("Text700.txt");
while (!infile.eof()) {
infile.getline(s, 80);
cout << s << endl;
}

cout << "Enter the Word: ";
char word[50];
cin >> word;

// Делаем 2 прохода: на первом - выделяем слово красным цветом,
// а на втором - меняем регистр символов
for(int pass = 0; pass < 2; pass++) {

infile.seekg(0, ios::beg);
infile.clear();

while(!infile.eof()) {

infile.getline(s, 80);
char *pp = &s[0];

do {

char *p;

p = strstr(pp, word);
if(p) {

while(pp != p)
#ifdef RUN_IN_DOS
cprintf("%c", *pp++);
#else
cout << *pp++;
#endif

// первый проход - pass = 0, установить цвет выводимых символов в красный
if(!pass) {
#ifdef RUN_IN_DOS
textcolor(RED);
#else
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
FOREGROUND_RED);
#endif
}
// А вот это - второй проход, тут меняем регистр ...
else {
for(int i = 0; i < strlen(word); i++)
*(p+i) = toupper(*(p+i));
}

for(int i = 0; i < strlen(word); i++)
#ifdef RUN_IN_DOS
cprintf("%c", *pp++);
#else
cout << *pp++;
#endif

// первый проход, pass = 0 - восстановить серый цвет
if(!pass) {
#ifdef RUN_IN_DOS
textcolor(LIGHTGRAY);
#else
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
#endif
}

}
else break;

} while(1);

while(*pp)
#ifdef RUN_IN_DOS
cprintf("%c", *pp++);
cprintf("\n\r");
#else
cout << *pp++;
cout << endl;
#endif
}
cout << "Press any key" << endl;
getche();

}
return 0;
}

Возникает вопрос: "Зачем вообще понадобилось ключевое слово RUN_IN_DOS?"... Затем, что я просто напросто без существенной правки приложения перекомпилирую его под другую OS, и оно должно работать. Просто гораздо удобнее... smile.gif

Автор: Tribunal 13.11.2006 14:32

спасибо огромное,только вот я не очень разобралась с самой программой...
поэтому не могу сообразить,как сделать так,чтобы выводилось так же,как и в исходном тексте,
в смысле перенос строки в том же месте.здесь же программа выводит чуть ли не по одной букые в строку...
а если убрать там в одном месте переном строки,то выводится текст сплошником
unsure.gif

Автор: Алена 13.11.2006 14:47

Цитата
не могу сообразить,как сделать так,чтобы выводилось так же,как и в исходном тексте
То есть? В каком "исходном"? Что выводится не так? MinGW + GCC 3.3.4 (Win32 Console Application) работает неотличимо от TC... Проблема в MSVC? Это обращайся в MS к Дяде Биллу, и говори ему спасибо...

Цитата
а если убрать там в одном месте переном строки,то выводится текст сплошником
Ну, если я его добавила, значит, не надо убирать, наверное?

Я, кстати, вообще не понимаю, тебе надо чтоб программа работала, или чтоб было "как раньше"? Тогда пользуйся тем, что было раньше... Какая, например, разница, выводится текст построчно или посимвольно? При длине текста в несколько сотен мегабайт это, конечно, может быть критично... Но
Цитата
текст, длина которого не превышает 100 символов
blink.gif blink.gif

Автор: Tribunal 13.11.2006 19:21

хочется,чтобы это было читаемо...ну и красиво как-то

Цитата(Алена @ 13.11.2006 17:47) *

То есть? В каком "исходном"?

форма в смысле та же,как в файле

Автор: Tribunal 13.11.2006 20:20

а что такое

Код
p = strstr(pp, word);
?

Автор: Tribunal 18.11.2006 14:15

ну вроде теперь всё нормально.
вот только не могли бы вы дать не большие комментарии к

Цитата
for(int i = 0; i < strlen(word); i++)
*(p+i) = toupper(*(p+i));

Цитата
p = strstr(pp, word);
<----вот это поиск подстроки в строке...ну или что-то подобное?