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

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

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

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

очень прошу о помощи)
volvo
Ищи внимательнее, я и на С++ эту программу уже делал...
Вот тут: Работа с файлом

Цитата
насчет смены букв строчных на пописные...кажется у них код различается на определенную величину...или как их можно заменить?
Уже все сделано за нас smile.gif tolower/toupper из CTYPE.H
Tribunal
Цитата(volvo @ 7.11.2006 23:19) *

Ищи внимательнее, я и на С++ эту программу уже делал...
Вот тут: Работа с файлом

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

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

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

отлично)
а как ими пользоваться,не подскажете?
volvo
Цитата
но всё равно иначе можно сделать?
Всегда можно сделать иначе, только вот вопрос: если сделать по-другому, тебе сразу все будет понятно? Ты уверена в этом? Посмотрим:
#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
нда...
понятно действительно далеко не всё...хотя разобраться можно)
плюс ко всему я не могу разобраться, как выделить это слово в тексте,ведь оно должно выделяться в уже выведенном тексте .
помогите пожалуйста...
volvo
Ну, так оно же выделяется:
          if(p) {
for(int i = 0; i < strlen(word); i++) *(p+i) = toupper(*(p+i));
}
- переводится в верхний регистр...
Tribunal
не)
оно должно помимо этого еще и в исходном тексте сначала выделить цветом.
вот это как делается?)
volvo
Не знаю. Я этого в задании, например, не увидел... Там вообще нет про ЦВЕТ ни слова. Как задание поставлено, так программа и работает...

А цвет и потоки - вообще понятия несовместимые...
Tribunal
под словом выделить там подразумевается именно цвет(
а как же тогда поступить,если с потоками работать нельзя?(
Tribunal
вот такой штукой можно весь текст выделить),а как конкретное слово я не знаю(

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

SetConsoleTextAttribute(hConsole,BACKGROUND_BLUE|
FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
Алена
Значит, смотри, какая есть идея: работа с консольным приложением в 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
спасибо огромное,только вот я не очень разобралась с самой программой...
поэтому не могу сообразить,как сделать так,чтобы выводилось так же,как и в исходном тексте,
в смысле перенос строки в том же месте.здесь же программа выводит чуть ли не по одной букые в строку...
а если убрать там в одном месте переном строки,то выводится текст сплошником
unsure.gif
Алена
Цитата
не могу сообразить,как сделать так,чтобы выводилось так же,как и в исходном тексте
То есть? В каком "исходном"? Что выводится не так? MinGW + GCC 3.3.4 (Win32 Console Application) работает неотличимо от TC... Проблема в MSVC? Это обращайся в MS к Дяде Биллу, и говори ему спасибо...

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

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

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

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

форма в смысле та же,как в файле
Tribunal
а что такое
Код
p = strstr(pp, word);
?
Tribunal
ну вроде теперь всё нормально.
вот только не могли бы вы дать не большие комментарии к
Цитата
for(int i = 0; i < strlen(word); i++)
*(p+i) = toupper(*(p+i));

Цитата
p = strstr(pp, word);
<----вот это поиск подстроки в строке...ну или что-то подобное?
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.