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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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
    newbie20

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    akaGM
    спасибо. то что нужно.
     

    Цитата:
    на самом деле не понятна логика твоей программы...  
    что ты, например, отслеживаешь индексом r, который нигде вообще не меняется?  

     
    логически он должен проверять на наличие только букв в строке(больших и маленьких), что он и делает по моему(?).
    а насчет индекса я пробовал сделать это без него т.е. (string >= 'a' && string <= 'z'), но он мне выдавал и выдаёт лист состоящих из ряда ошибок.

    Всего записей: 7 | Зарегистр. 08-03-2012 | Отправлено: 00:06 09-03-2012
    akaGM

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

    Цитата:
    логически он должен проверять на наличие только букв в строке(больших и маленьких), что он и делает по моему(?)
    ну делает... только один раз при старте когда он равен 0, т.е. проверяешь только один первый символ в строке
    я бы считал, что его где-то надо r++, чтобы "продвигаться" по строке...

    Всего записей: 24053 | Зарегистр. 06-12-2002 | Отправлено: 00:23 09-03-2012
    newbie20

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    akaGM
    спасибо за совет. попробую.
     
     
    p.s. если использовать while то программа ломается после 1ого повтора, т.е. выдаёт ошибку. также дальше по строке он не идёт.
     
    while(string[r] !='\0')
            {
                if(isalpha(string[r]))
                    r++;
            }
     
    следом попробовал с do while но тоже желаемого не получил.

    Всего записей: 7 | Зарегистр. 08-03-2012 | Отправлено: 03:34 09-03-2012 | Исправлено: newbie20, 05:36 09-03-2012
    akaGM

    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    newbie20
    так как звучит твоё задание в целом?
    попробуй так, иначе всю строку не просканировать...

    Код:
    while(string[r++] != '\0') {
        if(isalpha(string[r]))
                    //а тут что ты хотел делать?
    }

    Всего записей: 24053 | Зарегистр. 06-12-2002 | Отправлено: 13:16 09-03-2012
    cp58

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    akaGM
    Тогда уж так:

    Код:
    do
        if (isalpha(*string))
            /* do something */
    while (*string++);

    Всего записей: 295 | Зарегистр. 06-12-2011 | Отправлено: 13:28 09-03-2012
    akaGM

    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    у него определение string не подходит для таких манипуляций...

    Всего записей: 24053 | Зарегистр. 06-12-2002 | Отправлено: 14:58 09-03-2012
    newbie20

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    akaGM
    вывести на экран длину строки, повоторения букв и их процентов, проверить на наличие только букв в встроке.
     

    Всего записей: 7 | Зарегистр. 08-03-2012 | Отправлено: 15:15 09-03-2012
    akaGM

    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    newbie20
    ну вот... видно, что основной логический блок -- это сканирование всей строки, которую надо пробежать хотя бы один раз, а у тебя это неочевидно...
     
    всегда лучше начитать кодировать с составления логической блок-схемы программы...

    Всего записей: 24053 | Зарегистр. 06-12-2002 | Отправлено: 16:10 09-03-2012
    cp58

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

    Цитата:
    у него определение string не подходит для таких манипуляций...

    Виноват, не посмотрел код.
    newbie20

    Цитата:
    вывести на экран длину строки, повоторения букв и их процентов, проверить на наличие только букв в встроке.  


    Код:
    void func(char *str) {
        size_t len=0,i=0;
        char freq[26]={0};
        int notonlyletters=0;
        for (;*str;len++,str++)
            if (isalpha(*str))
                if (*str>='a')
                    freq[*str-'a']++;
                else
                    freq[*str-'A']++;
            else
                notonlyletters=1;
        printf("length = %d \n", len);
        for (;i<26;i++)
            if (freq[i])
                printf("frequency of %c = %d%%, %d count\n", i+'a', (freq[i]*100)/len, freq[i]);
        notonlyletters ? printf("not only letters \n") : printf("only letters \n");
    }

    isalpha идет в ущерб производительности здесь, однако, повышает читаемость.

    Всего записей: 295 | Зарегистр. 06-12-2011 | Отправлено: 16:14 09-03-2012
    akaGM

    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    cp58
    ну и что? кто бы сомневался, что ты напишешь...
    а как же обучение?
    никакой ты не... педагог :)

    Всего записей: 24053 | Зарегистр. 06-12-2002 | Отправлено: 17:21 09-03-2012
    newbie20

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    akaGM
    учту на будущее.
     
    cp58
     
    мне бы хотелось исправить то, что уже имею, а не лезть в чужое решение.  
    всё равно спасибо.

    Всего записей: 7 | Зарегистр. 08-03-2012 | Отправлено: 18:32 09-03-2012
    cp58

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

    Цитата:
    а как же обучение?  

    Здесь на лицо пробел в знании C, поэтому нельзя было адекватно оценить понимание написанного newbie20 и непонятно чему обучать, не зная усвоеной им базы.
    newbie20

    Цитата:
    а насчет индекса я пробовал сделать это без него т.е. (string >= 'a' && string <= 'z'), но он мне выдавал и выдаёт лист состоящих из ряда ошибок.  

    Вам следует почитать про C строки, так как string лишь указатель и сравнивать его с кодом символа 'a' неправильно.

    Всего записей: 295 | Зарегистр. 06-12-2011 | Отправлено: 04:02 11-03-2012
    akaGM

    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    cp58
    да понятно всё...
    просто я считаю, что сделать "от и до" за человека здесь можно только в случае если он просит:
    "
    сложить два числа, результат вывести на экран
     
    памагите, плиз!!!
    три недели голаву ламаю!!!
    "
     
    а в остальном всё-таки объяснять и подталкивать...
     
    ХО

    Всего записей: 24053 | Зарегистр. 06-12-2002 | Отправлено: 13:18 11-03-2012
    gygant

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Здравствуйте! Передо мной стоит следующая задача: написать программку, которая будет скомпоновывать несколько текстовых файлов в один. Список файлов в листбоксе и массиве files_arr.  
     
    Код следующий:
     

    Код:
     
    char line_ch[3000];
     
    for (z=0;z<ListBox1->Items->Count;z++)
    {
       ifstream f(files_arr[z].c_str());
     
    //   char line_ch[3000];
     
       for (line;getline(f,line);)
       {
          strcpy(line_ch,line.c_str());
          result_file.write(line_ch,strlen(line_ch));
          result_file.write("\n",1);
       };
     
    //   delete line_ch;
    };
     
     

     
    Этот код работает нормально. Но я озаботился вопросом освобождения памяти - объемы-то будут большие, по гигу - по два. И вот когда я убираю в комментарий первое объявление line_ch и делаю активной строку объявления переменной в цикле и "delete line_ch", то программа отрабатывает какие-то мегабайт 15-25, после чего вылетает. А если этой строки нет, то 64 метра у меня отработалось нормально. Объясните, пожалуйста, как правильно освободить память в этом случае?

    Всего записей: 56 | Зарегистр. 03-06-2010 | Отправлено: 16:25 11-03-2012
    cp58

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    gygant
    Между первым и вторым объявлением line_ch лишь одна разница - область видимости и все.
    Освобождать эту память вручную не надо, так как она выделена в стеке, ничего лишнего не выделяется, когда подпрограмма отработает задачу память вернется.
     
    У меня вопрос к вам, зачем вобще нужен этот буфер?

    Всего записей: 295 | Зарегистр. 06-12-2011 | Отправлено: 18:14 11-03-2012
    gygant

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    cp58
     
    вот как раз всплыло. Прихожу сейчас с работы домой. Решил скомпоновать два файла по 55 метров каждый. 110 итого. И фигу - программа вылетает. Путем махинаций, мата и прочего развлекалова заработал следующий вариант:
     

    Код:
     
    for (line;getline(f,line);)
    {
    char line_ch[3000];
    strcpy(line_ch,line.c_str());
    result_file.write(line_ch,strlen(line_ch));
    result_file.write("\n",1);
    delete line_ch;
    };
     

     
    Вот почему так получается? *чешет репу*
     
    З.Ы. скомпоновал трехгиговый файл на выхлопе. Сейчас попробую до 10 догнать.
     
    З.З.Ы. есть десятка. Теперь программа сожрет любой объем, уверен.

    Всего записей: 56 | Зарегистр. 03-06-2010 | Отправлено: 18:56 11-03-2012 | Исправлено: gygant, 19:31 11-03-2012
    karakurt2



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    gygant
    а что будет если длина строки больше 3000 символов?

    Всего записей: 733 | Зарегистр. 06-12-2003 | Отправлено: 19:47 11-03-2012
    gygant

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    karakurt2
    Тогда начнутся глюки. Но в моем случае я знаю, что трех тысяч хватит. Двух мало, а трех хватит.
    А так можно было бы как-нибудь повыпендриваться через динамическое переопределение величины массива..

    Всего записей: 56 | Зарегистр. 03-06-2010 | Отправлено: 19:57 11-03-2012
    akaGM

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

    Код:
    char line_ch[3000];
    ...
    delete line_ch;


    Цитата:
    deletion of an array expression

     
    как скомпилировать-то такое удалось...

    Всего записей: 24053 | Зарегистр. 06-12-2002 | Отправлено: 20:11 11-03-2012 | Исправлено: akaGM, 20:12 11-03-2012
    kotlomoy



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    gygant
    1. Советую почитать, что такое delete и для чего он нужен, прежде чем втыкать его куда ни попадя) Может плохо кончиться
    2. Причем тут гигабайты и терабайты, когда у вас уже стоит циферка - 3000 байт. Можете сколько угодно размеры файлов менять - циферка эта так и останется, никто ваш исходный код править не будет) Это размер строки файла, никак не зависящий от размера файла. Также советую при копировании все-таки проверять - хватит ли места на приемной стороне, для этого есть strcpy_s или можно свой макрос сделать.
    3. К тому же я как то не впитал, зачем вообще нужен этот буфер. В line.c_str() вроде бы все есть, нужно ли еще куда-то копировать?

    Всего записей: 172 | Зарегистр. 06-03-2008 | Отправлено: 20:11 11-03-2012 | Исправлено: kotlomoy, 20:13 11-03-2012
    Открыть новую тему     Написать ответ в эту тему

    Страницы: 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