Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по программированию на C/С++

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322

Открыть новую тему     Написать ответ в эту тему

Crazy_Shrike



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Вопросы по программированию на C/С++

 
  • Справочники, книги
  • Выбор IDE (среды программирования)
     
    Постарайтесь дать как можно больше информации о возникшей проблеме - это в конце концов в ваших же интересах чтобы вам помогли.

    Решения конкретных задач собираются и обсуждаются в теме Задачи по C/С++ .

    Прежде чем просить помощи в задании...
    Если позарез надо и вы даже готовы заплатить

    Как правильно задавать вопросы, если вы хотите получить ответ.

    Полезные ссылки:
    C++(eng)

  • Всего записей: 241 | Зарегистр. 25-03-2004 | Отправлено: 13:37 06-05-2004 | Исправлено: AZJIO, 19:45 12-05-2014
    Abs62



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    jetcar
    Вообще-то это не по C++ вопрос.

    Цитата:
    Use the following code to obtain the horizontal and vertical position:
     
    xPos = GET_X_LPARAM(lParam);  
    yPos = GET_Y_LPARAM(lParam);  
     
    You can also use the MAKEPOINTS macro to convert the lParam parameter to a POINTS structure.
     
    (C) MSDN.

    ----------
    0 программистов ругал сердитый шеф
    Потом уволил одного, и стало их FF

    Всего записей: 6077 | Зарегистр. 22-10-2005 | Отправлено: 23:53 08-01-2008
    d2alex

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Привет! Помогите пожалуйста разобраться с задачей:
    Написать программу, которая считывает текст из файла, находит самое длинное слово и определяет, сколько раз оно встретилось в тексте.
    Так вот на поиске самого длинного слова и его сохранения я и застрял.
    Вот текст программы:

    Код:
    #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;
    }
    ///////////////////////////////////////

    Функция Find ведет себя не совсем правильно. Если текст в файле английский, то в принципе, она верно находит слово, но почему то здесь  
    Код:
    iMax= *(p- Len_Max);
    указатель оказываеться на 3 позиции левее, чем нужно. Хотя предварительно проверяю указатели(p, c) они находяться где нужно: c- на 1 букве, p- на последней.
    А вот если текст в файле русский, то все идет кувырком(неправильный размер слов, пропуск пробелов и знаков пунктуации). Я конечно догадываюсь, что это связанно с непониманием русской кодировки VC++ 6.0, но как это реализовать? Использовать функцию Rus при поиске и сохранении в символьных массивах?
    Кто может помогите пожалуйста!

    Всего записей: 17 | Зарегистр. 05-05-2006 | Отправлено: 16:47 09-01-2008
    Abs62



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    d2alex

    Код:
    iMax= *(p- Len_Max);

    А в чём сакральный смысл этого выражения? Вместо индекса первого символа слова в строке записать в переменную значение этого самого символа? Почему бы не хранить просто указатель на первый символ?

    Код:
    char* c,*c1;  
      while(*p != 0){  
           while(ispunct(*p) || isspace(*p)) p++;  
           c= p; //Не надо указатель объявлять снова - он уже объявлен
           for(Len_Count= 0; !ispunct(*p) && !isspace(*p) && *p != 0;  
            p++, Len_Count++);  
            if(Len_Count > Len_Max){  
                Len_Max= Len_Count;  
                c1=c;
            }  
        }  
        if(Len_Max>0) {  
            for(i= 0; i<Len_Max; i++) to[i]= c1[i];  
            to[Len_Max] = 0;  
        }
     

    Цитата:
    Я конечно догадываюсь, что это связанно с непониманием русской кодировки VC++ 6.0, но как это реализовать?

    Посмотри в сторону setlocale().

    ----------
    0 программистов ругал сердитый шеф
    Потом уволил одного, и стало их FF

    Всего записей: 6077 | Зарегистр. 22-10-2005 | Отправлено: 20:23 09-01-2008 | Исправлено: Abs62, 22:53 09-01-2008
    CrackMe

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Привет, друзья. Прошу совета. У меня есть IDE code::blocks, я прикрутил к нему gdb, но к сожелению оказалось что вывод у gdb в данной программе не инфорамтивный как в ms visual studio 6 и нет возможности смотреть пошагово какое значение присваивается переменным. Может кто знает выход из данной ситуации?

    Всего записей: 711 | Зарегистр. 18-07-2006 | Отправлено: 22:21 09-01-2008
    d2alex

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    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 повторов.

    Всего записей: 17 | Зарегистр. 05-05-2006 | Отправлено: 00:00 10-01-2008
    Abs62



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    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;
     

    Или to[0]=0 в начало функции. И должно заработать.

    ----------
    0 программистов ругал сердитый шеф
    Потом уволил одного, и стало их FF

    Всего записей: 6077 | Зарегистр. 22-10-2005 | Отправлено: 00:31 10-01-2008
    d2alex

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Abs62

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

    Всего записей: 17 | Зарегистр. 05-05-2006 | Отправлено: 01:31 10-01-2008
    Abs62



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    d2alex

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

    Попробуй в начало программы добавить setlocale(LC_ALL,"rus_rus.1251") (или setlocale(LC_ALL,"rus_rus.866"), в зависимости от кодировки обрабатываемого файла).
     
    PS. И не забудь при этом про #include <locale.h>

    ----------
    0 программистов ругал сердитый шеф
    Потом уволил одного, и стало их FF

    Всего записей: 6077 | Зарегистр. 22-10-2005 | Отправлено: 02:13 10-01-2008
    d2alex

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Abs62

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

    Всего записей: 17 | Зарегистр. 05-05-2006 | Отправлено: 02:28 10-01-2008
    Abs62



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    d2alex

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

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

    Цитата:
    #include <fstream.h>  
    #include <ctype.h>  
    #include <string.h>  
    #include <locale.h>
     
    и вместо этого пишешь

    Код:
    #include <iostream>
    #include <fstream>
    #include <locale>
     
    using namespace std;

    Убираешь ещё ios::nocreate при открытии файла. setlocale оставляешь. Вроде всё.

    ----------
    0 программистов ругал сердитый шеф
    Потом уволил одного, и стало их FF

    Всего записей: 6077 | Зарегистр. 22-10-2005 | Отправлено: 09:20 10-01-2008
    4Life



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    вопрос снят

    ----------
    ▓▓▓Made in Ukraine▓▓▓

    Всего записей: 766 | Зарегистр. 05-06-2003 | Отправлено: 10:43 10-01-2008 | Исправлено: 4Life, 00:52 11-01-2008
    d2alex

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Abs62
    Цитата:
    Тогда есть предложение перейти с CRT на STL.
    Все тоже самое с английскими работает, с русскими не хочет.

    Всего записей: 17 | Зарегистр. 05-05-2006 | Отправлено: 23:10 10-01-2008
    Abs62



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    d2alex
    Тогда попробуй в функции Find  

    Код:
    char *p= from;  
    char *c, *c1;

    заменить на

    Код:
    unsigned char *p=(unsigned char *)from;  
    unsigned char *c,*c1;


    ----------
    0 программистов ругал сердитый шеф
    Потом уволил одного, и стало их FF

    Всего записей: 6077 | Зарегистр. 22-10-2005 | Отправлено: 23:35 10-01-2008
    d2alex

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Abs62
    Цитата:
    unsigned char *p=(unsigned char *)from;  
    unsigned char *c,*c1;  
    Работает!!! Спасибо тебе огромное!!! Если не трудно, объясни...

    Всего записей: 17 | Зарегистр. 05-05-2006 | Отправлено: 23:54 10-01-2008
    Abs62



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    d2alex

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

    Функции is...() принимают в качестве аргумента int, поэтому при их вызове осуществляется неявное приведение типа аргумента. А это даёт разный результат для char и unsigned char, если беззнаковое значение более 127, то есть в знаковом варианте рассматривается как отрицательное. Русские буквы как раз в этот диапазон и попадают.

    ----------
    0 программистов ругал сердитый шеф
    Потом уволил одного, и стало их FF

    Всего записей: 6077 | Зарегистр. 22-10-2005 | Отправлено: 00:04 11-01-2008
    d2alex

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Abs62
    Понял. Еще раз спасибо!

    Всего записей: 17 | Зарегистр. 05-05-2006 | Отправлено: 00:10 11-01-2008
    lhOsvald

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Всем Привет!
     
    Подскажите пожалуйста, как записать функцию типа:
    (квадратный синус икса плюс квадратный косинус икса).
    А то у меня чета не получается.
    и какого типа должна быть перменная икс?
     
     
    Заранее спасибо!

    Всего записей: 5 | Зарегистр. 02-01-2008 | Отправлено: 21:20 14-01-2008
    TheChampion

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    lhOsvald
    "Квадратный синус" --- это как? Квадрат синуса?
     
    Можно так:
    Код:
    sin(x) * sin(x) + cos(x) * cos(x)

     
    А можно и так:
    Код:
    (pow(sin(x), 2.0) + pow(cos(x), 2.0)

     
    Аргумент sin() --- float, double или long double, другие типы будут приведены к этим.

    Всего записей: 656 | Зарегистр. 25-06-2004 | Отправлено: 21:44 14-01-2008
    TeXpert



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    lhOsvald, TheChampion  
    А не проще вбить единицу вместо этого?). Данная формула от x ну никак не зависит).

    ----------
    Майкудук, Пришахтинск не предлагать!:)
    А на Пирогова приходит снова весенний гомон...

    Всего записей: 3604 | Зарегистр. 08-02-2003 | Отправлено: 00:15 15-01-2008
    TheChampion

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    TeXpert
    Да я знаю, но это только пример.

    Всего записей: 656 | Зарегистр. 25-06-2004 | Отправлено: 01:07 15-01-2008
    Открыть новую тему     Написать ответ в эту тему

    Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322

    Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по программированию на C/С++


    Реклама на форуме Ru.Board.

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.B0ard
    © Ru.B0ard 2000-2024

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru