Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по программированию на C/С++

Автор: d2alex
Дата сообщения: 09.01.2008 15:47
Привет! Помогите пожалуйста разобраться с задачей:
Написать программу, которая считывает текст из файла, находит самое длинное слово и определяет, сколько раз оно встретилось в тексте.
Так вот на поиске самого длинного слова и его сохранения я и застрял.
Вот текст программы:

Код: #include <fstream.h>
#include <windows.h>
#include <conio.h>
#include <ctype.h>
#include <string.h>

char* Rus(const char* text);
void Find(char to[], char from[]);

int main(){
    
    ifstream fin("c:\\cpp\\text.txt", ios::in, ios::nocreate);
    if(!fin){cout<<Rus("Ошибка открытия файла")<<endl; getch(); return 1;}
    
    const int len=81;
    char line[len], word[len], MaxWord[len];
    int Len_MaxWord= 0;
    while(fin.getline(line, len)){
        cout<<Rus(line)<<endl;
        Find(word, line);
        if(strlen(word) > Len_MaxWord){
            Len_MaxWord= strlen(word);
            strcpy(MaxWord,word);
        }
    }
    if(!Len_MaxWord){cout<<Rus("Пустой файл")<<endl; getch(); return 1;}
    cout<<endl<<Rus("Самое длинное слово >> ");
    cout<<Rus(MaxWord)<<endl;
    cout<<Rus("Его длина >> ")<<Len_MaxWord<<endl;
    getch();
    return 0;
}    
///////////////////////////////////////
char bufRus[256];
char* Rus(const char* text)
{
    CharToOem(text, bufRus);
    return bufRus;
}
///////////////////////////////////////
void Find(char to[], char from[]){
int i= 0, Len_Count, Len_Max, iMax;
iMax= -1; Len_Max= 0;
    char *p= from;
    char* c;
while(*p != 0){
while(ispunct(*p) || isspace(*p)) p++;
        char* c= p;
for(Len_Count= 0; !ispunct(*p) && !isspace(*p) && *p != 0;
p++, Len_Count++);
if(Len_Count > Len_Max){
Len_Max= Len_Count;
iMax= *(p- Len_Max);
}
}
int j= 0;
    if(iMax== -1) return;
else{
for(i= iMax; i< iMax+ Len_Max; j++, i++) to[j]= from[i];
to[j] = 0;
    }
return;
}
///////////////////////////////////////
Автор: Abs62
Дата сообщения: 09.01.2008 19:23
d2alex

Код: iMax= *(p- Len_Max);
Автор: CrackMe
Дата сообщения: 09.01.2008 21:21
Привет, друзья. Прошу совета. У меня есть IDE code::blocks, я прикрутил к нему gdb, но к сожелению оказалось что вывод у gdb в данной программе не инфорамтивный как в ms visual studio 6 и нет возможности смотреть пошагово какое значение присваивается переменным. Может кто знает выход из данной ситуации?
Автор: d2alex
Дата сообщения: 09.01.2008 23:00
Abs62

Цитата:
А в чём сакральный смысл этого выражения?
В том то и дело, что я сегодня перепробовал кучу разных вариантов и этот ближе всех к нужному результату, как я уже писал...
Цитата:
в принципе, она верно находит слово, но почему то здесь указатель оказываеться на 3 позиции левее, чем нужно.
предложенный тобой вариант я сегодня уже пробовал, выдает ошибку
Цитата:
error C2440: '=' : cannot convert from 'char *' to 'char'
This conversion requires a reinterpret_cast, a C-style cast or function-style cast
Error executing cl.exe.
Вот в таком виде
Цитата:
for(i= 0; i< Len_Max; i++, c1++) to[i]= *c1;
to[Len_Max] = 0;
ошибки нет, но и результат не очень: почему то в to[] и соответственно в word[] записывается строка из примерно 100 символов MMMM, а затем сразу же идет первое предложение целиком. В итоге эта строка становиться самой длинной( около 160 символов) и она выводиться как результат. Хотя во всех предложениях( английских) самые длинные слова найденны правильно и перед записью в to[] проверка показывает, что c1 стоит на первом символе самого большого слова, а в Len_Max записана его точная длина, т.е. по идее этот цикл
Цитата:
for(i= 0; i< Len_Max; i++, c1++) to[i]= *c1;
не может повтриться больше чем длина слова( Len_Max), так откуда же беруться еще 150 повторов.
Автор: Abs62
Дата сообщения: 09.01.2008 23:31
d2alex

Цитата:
предложенный тобой вариант я сегодня уже пробовал, выдает ошибку

Ну да, там надо объявлять char *c1, эт я очепятался.

Цитата:
ошибки нет, но и результат не очень: почему то в to[] и соответственно в word[] записывается строка из примерно 100 символов MMMM, а затем сразу же идет первое предложение целиком.

На самом деле туда ничего не записывается - там изначальный мусор, который был на входе в функцию.
Надо добавить обработку варианта, что в строке нет слов вообще.

Код: if(Len_Max>0) {
for(i= 0; i<Len_Max; i++) to[i]= c1[i];
to[Len_Max] = 0;
} else to[0]=0;
Автор: d2alex
Дата сообщения: 10.01.2008 00:31
Abs62

Цитата:
Надо добавить обработку варианта, что в строке нет слов вообще.
Такая обработка уже есть, по iMax которая инициализируеться значением -1 и задумывалась как переменная для хранения начального индекса макс. слова, если слов нет то
Цитата:
if(iMax== -1) return;
Здесь то и была моя ошибка: когда я пробовал другой вариант, то забивал /* */ ненужный код, и эту строку тоже, забывая при этом о проверке. iMax не измененная в цикле при проверке давала true и соответственно выход из функции. Присвоил ей 1 и все заработало. Спасибо большое за помощь!!!
И все таки может подскажешь поподробнее, как мне быть с русскими текстами. Заранее благодарен.
Автор: Abs62
Дата сообщения: 10.01.2008 01:13
d2alex

Цитата:
И все таки может подскажешь поподробнее, как мне быть с русскими текстами.

Попробуй в начало программы добавить setlocale(LC_ALL,"rus_rus.1251") (или setlocale(LC_ALL,"rus_rus.866"), в зависимости от кодировки обрабатываемого файла).

PS. И не забудь при этом про #include <locale.h>
Автор: d2alex
Дата сообщения: 10.01.2008 01:28
Abs62

Цитата:
Попробуй в начало программы добавить setlocale(LC_ALL,"rus_rus.1251") (или setlocale(LC_ALL,"rus_rus.866"), в зависимости от кодировки обрабатываемого файла).

PS. И не забудь при этом про #include <locale.h>
Попробовал, совсем ничего не изменилось.
Автор: Abs62
Дата сообщения: 10.01.2008 08:20
d2alex

Цитата:
Попробовал, совсем ничего не изменилось.

Тогда есть предложение перейти с CRT на STL.
Убираешь хидеры

Цитата:
#include <fstream.h>
#include <ctype.h>
#include <string.h>
#include <locale.h>

и вместо этого пишешь

Код: #include <iostream>
#include <fstream>
#include <locale>

using namespace std;
Автор: 4Life
Дата сообщения: 10.01.2008 09:43
вопрос снят
Автор: d2alex
Дата сообщения: 10.01.2008 22:10
Abs62
Цитата:
Тогда есть предложение перейти с CRT на STL.
Все тоже самое с английскими работает, с русскими не хочет.
Автор: Abs62
Дата сообщения: 10.01.2008 22:35
d2alex
Тогда попробуй в функции Find

Код: char *p= from;
char *c, *c1;
Автор: d2alex
Дата сообщения: 10.01.2008 22:54
Abs62
Цитата:
unsigned char *p=(unsigned char *)from;
unsigned char *c,*c1;
Работает!!! Спасибо тебе огромное!!! Если не трудно, объясни...
Автор: Abs62
Дата сообщения: 10.01.2008 23:04
d2alex

Цитата:
Если не трудно, объясни...

Функции is...() принимают в качестве аргумента int, поэтому при их вызове осуществляется неявное приведение типа аргумента. А это даёт разный результат для char и unsigned char, если беззнаковое значение более 127, то есть в знаковом варианте рассматривается как отрицательное. Русские буквы как раз в этот диапазон и попадают.
Автор: d2alex
Дата сообщения: 10.01.2008 23:10
Abs62
Понял. Еще раз спасибо!
Автор: lhOsvald
Дата сообщения: 14.01.2008 20:20
Всем Привет!

Подскажите пожалуйста, как записать функцию типа:
(квадратный синус икса плюс квадратный косинус икса).
А то у меня чета не получается.
и какого типа должна быть перменная икс?


Заранее спасибо!
Автор: TheChampion
Дата сообщения: 14.01.2008 20:44
lhOsvald
"Квадратный синус" --- это как? Квадрат синуса?

Можно так:
Код: sin(x) * sin(x) + cos(x) * cos(x)
Автор: TeXpert
Дата сообщения: 14.01.2008 23:15
lhOsvald, TheChampion
А не проще вбить единицу вместо этого?). Данная формула от x ну никак не зависит).
Автор: TheChampion
Дата сообщения: 15.01.2008 00:07
TeXpert
Да я знаю, но это только пример.
Автор: An4eus
Дата сообщения: 15.01.2008 14:20
Всем привет.
Вот приходится вспоминать старый добрый с++ for dos!!!
Прога: Borland C++ v3.1
нужно было сделать прогу в графике досовской. Но вот незадача - не хочет запускаться.
Сначала писала:
- linker error undefined symbol ... (исправил, проставив галку для графической библиотеки)
- потом Graphics hardware not detected (скопировал все *.bgi файлы, где расположены *.срр и *.ехе проекта)
- а теперь - Divide error ... Что делать не знаю! (сразу говорю, что на нуль ничего не делю!)

Заранее благодарен!

З.ы. по поиску ничего не нашел!
З.ы.ы. оси XP, 98 (в ней тоже пробовал и всё тоже самое пишет!), карта NVIDIA RIVA TNT2 Model 64 Pro
Автор: Qraizer
Дата сообщения: 15.01.2008 16:12
Всё нормально. У тебя черезчур быстрый процессор. Наверно ты юзаешь что-то типа dos.h, в котором есть шутка под названием delay(). Так вот, RTL при старте программы определяет скорость процессора путём гоняния пустого цикла и определения количества тиков таймера, за которое этот цикл прошёл. Потом это значение используется как счётчик пустого цикла для 1 ms внутри delay(). Если процессор быстрый, то количество будет 0, отсюда и деление на нуль. Я когда-то специально для обхода этого патчил сырцы библиотек Борланд-Паскаля и -Сиплюсплюс. Если у тебя 3.1, то должны быть и исходники библиотек. Поправь и пересобери RTL - поможет.
Автор: An4eus
Дата сообщения: 15.01.2008 16:35
[q][/q]

что-то я ничего этого не помню, может конечно потому что на 486 прогал си? хотя как-то и на P-III вроде устанавливал или это был P-II (сейчас P-III)

dos.h я не использую, а использую
- graphics.h
- conio.h
- stdlib.h
- stfdio.h

правда ещё использую метод getch().... может из-за него?
так в прочем... я так и не понял, что и где нужно конкретно менять! можно, пожалуйста, подсказать!

там я ещё использовал сметод clrscr(), его закоментировал... так теперь зараза пишет, что драйвер не найден! блин, такая шняга получается!
Автор: Qraizer
Дата сообщения: 15.01.2008 21:41
conio.h из той же серии. Сами функции ни при чём. Ты можешь нигде эту самую delay() и не вызывать, и она даже не подлинкуется к приложению. Но затронув какую-нибудь другую функцию, которой требуется какая-нибудь внутренняя переменная, инициализацию которой нужно сделать при старте программы, ты тем самым подлинкуешь всю связанную секцию данных и соответствующий RTL-ный инициализационный код и т.о. получишь, что уже получил.
Автор: An4eus
Дата сообщения: 16.01.2008 10:36
так что ж тогда менять?
Автор: Qraizer
Дата сообщения: 16.01.2008 15:19
Я ж сказал - библиотеку. Или каждый раз после компиляции патчить экзешник.
Люди, у кого есть BC3.1, помогите человеку найти нужный исходник нужной функции, проапдейтить его, компильнуть в обж и запихать в какой-нибудь CL.LIB вместо имеющегося там. Ну и объяснить, что пользоваться нужно Large моделью или аналогично проапдейтить библиотеки всех моделей памяти.

Добавлено:
An4eus, а у тебя исходники RTL вообще хоть есть-то? В принципе, в поставку они включались, так что присутствовать должны, но ты мог найти порезаный инсталл, или не проинсталить их, или просто грохнуть за "ненадобностью".
Автор: akaGM
Дата сообщения: 16.01.2008 16:26
An4eus

1. попробуй запустить свой экзюк в песочнице DOSBOX, там весь bgi корректно идёт

2. а ты уверен в своём коде? может у тебя графика не инициализирована?
давай показывай начальный участок кода

Qraizer

Цитата:
Люди [...] Ну и объяснить, что пользоваться нужно Large моделью или аналогично проапдейтить библиотеки всех моделей памяти.

гы
что мы, звери что ли?
хотя, судя по тому как человек воспринимает твои разъяснения, зверь -- это ты, нам такое предлагая...
Хьюдж! и ни сегментом меньше...
ещё раз гы

кстати, на bc3.1 пусть под 3.1 и генерит, под винду в смысле...
как вариант...
An4eus, на фига тебе дос?
Автор: FMeat
Дата сообщения: 16.01.2008 19:02
Надо чтобы после успешного вызова фунции DeleteFile выводился соотвествующий MessageBox. Проблема с ним в том что он живёт своей жизнью. Вообщем как это сделать правильно?


Код:
DeleteFile("C:\\Documents and Settings\\Asain-Asa.GLUK-XP.000\\Рабочий стол\\1");
if (DeleteFile==(NULL))
    MessageBox(NULL, "File Deleted", "Messege", MB_OK);
Автор: akaGM
Дата сообщения: 16.01.2008 20:16

Код:
if (DeleteFile("C:\\Documents and Settings\\Asain-Asa.GLUK-XP.000\\Рабочий стол\\1") == (NULL))
MessageBox(NULL, "File Deleted", "Messege", MB_OK);
Автор: FMeat
Дата сообщения: 16.01.2008 20:21
Спс, только вы немного условие спутали (не ==, а !=). ;p
Автор: akaGM
Дата сообщения: 16.01.2008 20:33
нет слов...

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193

Предыдущая тема: не знаю как назвать тему :-)


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.