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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389

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

de_lirium

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Тема создана для накопления реализаций типовых задач на С/С++.
Прежде чем публиковать своё условие задачи, убедитесь, что её решение (или решение очень похожей задачи) в теме и полезных ссылках отсутствует (например воспользуйтесь ссылкой Версия для печати вверху справа страницы и поищите в ней).
Постарайтесь как можно полнее сформулировать постановку задачи (чтобы тому, кто решит вам помочь, не приходилось тратить своё время ещё и на выпытывание у вас деталей условия; если вам не понятно, как это сделать - постарайтесь представить, что эта программа у вас уже есть, и "поработать" с ней - вот все детали, которые при этом придут в голову, с большой вероятностью должны быть в условии задачи).
Если вы уже пытались сделать эту задачу, но у вас не получилось и вы хотите довести дело до конца - обязательно выложите результат своей попытки, предварительно убедившись, что ваш код компилируется.

Вопросы по технологиям лучше задавать тут.

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

Если вам вдруг не отвечают или ответ вас не устраивает, и вообще полезно прочитать всем спрашивающим.

Полезные ссылки:
 
C++: в том числе и решения задач (eng)
задачи на C
 
Проверить свою задачку можно:
Онлайн-компилятором Visual C++
godbolt
Wandbox
Одним из онлайн-компиляторов на ideone.com

Всего записей: 28 | Зарегистр. 23-07-2004 | Отправлено: 02:14 20-12-2004 | Исправлено: Daniyar91, 19:25 27-09-2017
akaGM

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

Всего записей: 24037 | Зарегистр. 06-12-2002 | Отправлено: 13:36 26-04-2011 | Исправлено: akaGM, 13:39 26-04-2011
pechory

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

Код:
 
#include <iostream> // cin, cout
#include <clocale>  // поддержка русского языка
#include <conio.h>  // _getch()
#include<iomanip>  
#include<cmath>      
 
using namespace std;
 
int main()
   {
   setlocale( LC_CTYPE,"Russian" ); // установка русского языка
 
   int minimum_index=0; // индекс минимального эл-та массива
   int first_index=-1;  // индекс первого отриц. эл-та
   int second_index=-1;  // индекс второго отриц. эл-та
   float summa=0;     // сумма эл-тов между первым и вторым отриц. эл-тами
   int size;       // размер массива
 
   cout<<" Введите кол-во эл-тов массива: "; // задаем размер массива
   cin>>size;
   float *Array=new float[size];
 
   for(int i=0; i<size; i++) // вводим эл-ты массива
      {
      cout<<" Введите "<<i+1<<" эл-т массива: ";
      cin>>Array[i];
      }
 
   for(int i=1; i<size; i++) // находим индекс минимума
       if(Array[i]<Array[minimum_index])
            minimum_index=i;
 
    for(int i=0; i<size; i++) // находим первый отриц. эл-т
       if(Array[i]<0)
          {  
           first_index=i;
           break;
           }
 
    for(int i=0; i<size; i++) // находим второй отриц. эл-т
       if(Array[i]<0 && i!=first_index)
          {
           second_index=i;
           break;
           }
 
 //находим сумму если два отриц. эл-та существуют в массиве  и между ними есть  еще   эл-ты массива
 
   if(first_index>=0 && second_index>0 &&  first_index!=(second_index-1))
       {
        for(int i=first_index+1; i<second_index; i++)
             summa+=Array[i];
        cout<<"\n Сумма эл-тов массива между первым и вторым отриц.  эл-тами = "<<summa<<"\n";
        }
 
    else
        cout<<"\n Нахождение суммы эл-тов массива между первым и вторым отриц. эл-тами невозможно\n";
 
    cout<<"\n Индекс минимального эл-та массива = "<<minimum_index<<"\n";
 
   float temp;// временная переменная для сортировки массива
   int j=0; // индекс для элементов чей модуль не превышает 1
        
   for(int i=j; i<size; i++)    
       if(fabs(Array[i])<=1)
           {
           temp=Array[j];
           Array[j]=Array[i];
           Array[i]=temp;
           j++;
           }
 
    cout<<"\n Массив после сортировки:\n\n";
    for(int i=0; i<size; i++)  
       {
        cout<<setw(10)<<Array[i];
        if((i+1)%5==0)
             cout<<endl;
        }
        
    delete []Array;
 
     _getch();
    return 0;
    }
 
 

Я сам новичОк, поэтому программа может и коряво написана, но если хоть как-то поможет, то значит не зря старался. Я вот только не совсем понял про модуль, поэтому мог ошибиться.
 
Злые Вы какие-то - программисты.

Всего записей: 116 | Зарегистр. 15-04-2011 | Отправлено: 14:04 26-04-2011 | Исправлено: pechory, 18:16 26-04-2011
akaGM

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

Цитата:
Злые Вы какие-то - программисты.

не говори, жисть заставляет...
// кстати, обращение с большой буквы означает личное обращение

Всего записей: 24037 | Зарегистр. 06-12-2002 | Отправлено: 14:18 26-04-2011
pechory

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

Цитата:
кстати, обращение с большой буквы означает личное обращение

 
Я это в знак уважения- всегда уважал умных людей, а уж этого у Вас не отнять.  
Вот только "квартирный вопрос" нас всех действительно испортил.

Всего записей: 116 | Зарегистр. 15-04-2011 | Отправлено: 14:35 26-04-2011
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
щас мы с тобой из плюсомёта получим...
надо что-то умное написать...
 
void main(void) {}
типа я в домике,  меня не трогать...

Всего записей: 24037 | Зарегистр. 06-12-2002 | Отправлено: 16:00 26-04-2011
KChernov



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
pechory
Вот это я понимаю код: глаза ломать не надо и даже с комментариями!
Вот все бы так
 

Цитата:
for(int i=0; i<size; i++) // находим второй отриц. эл-т  

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

Цитата:
if(first_index>=0 && second_index>0 &&  first_index!=(second_index-1))  

Перестраховка - они не могут быть равны.
 

Цитата:
for(int i=first_index+1; i<second_index; i++)  

Да и вообще можно было обойтись здесь без условия
Ну разве что оно для сообщения нужно.
 
А вот третья задача у вас сомнительно сделана: так сразу сложно сказать, что будет, если сортируемых элементов окажется больше половины (но может оно и правильно будет работать - так сразу не понятно).
А ещё и интересный (хоть и не фатальный) вариант будет в случае, если все элементы окажутся по модулю меньше 1.
И надо понимать, что порядок остальных элементов в этом варианте меняется (что впрочем не страшно, поскольку в условии про это ничего нет).
Но тогда уж зачем усложнять себе жизнь: в условии нет про то, что нельзя использовать 2-й массив, а тогда вариант без сохранения порядка можно сделать 1-м циклом, ну или 2-мя - вариант с сохранением.
 

Цитата:
Я вот только не совсем понял про модуль

Да вроде правильно всё с модулем (пусть yAanAa поправит если что).
 

Цитата:
Злые Вы какие-то - программисты.

Слишком много лжи попадалось в жизни.
Особенно клиника, когда тебе врут, понимают это и, более того, понимают, что ты понимаешь, но всё равно врут
После такого сложно остаться равнодушным.
 
 
akaGM

Цитата:
void main(void) {}  

Не поможет.
 
 
yAanAa

Цитата:
Может тогда подскажите какие-нибудь уроки понятные

Понятные - это чтобы было понятно.
Правильно форматировать код ведь не просто так - правильно==понятно.
Ну и опять же внешний вид кода с одной стороны отражает внутреннее состояние пишущего (это как определение по почерку). Но и с другой стороны - приводим в порядок код - это отражается и внутри
А вообще Керниган и Риччи - классика.
А если не понятно - проще всего разбирать уже сделанные задачи (то есть задачник с решениями - мне попадался олимпиадный).
 
Ну и видимо мой вопрос не заметили - повторюсь:
Цитата:
А вы из каких соображений в massiv заново выделяете память под mas?


Всего записей: 2471 | Зарегистр. 20-04-2004 | Отправлено: 19:08 26-04-2011 | Исправлено: KChernov, 19:23 26-04-2011
pechory

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

Цитата:
 first_index!=(second_index-1))  

В том смысле, что если они идут подряд, то какая может быть между ними сумма?

Цитата:
Да и вообще можно было обойтись здесь без условия  

 Ну да, для сообщения. Просто хотел поподробнее.
 
Спасибо, за "разбор полетов".
 
 
Добавлено:
KChernov

Цитата:
А ещё и интересный (хоть и не фатальный) вариант будет в случае, если все элементы окажутся по модулю меньше 1.  

Я попробовал, ради интереса. На выходе получился тот же самый массив. Вроде работает.
 
 
 
 
Добавлено:

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

Тут согласен на все 100%

Всего записей: 116 | Зарегистр. 15-04-2011 | Отправлено: 19:30 26-04-2011 | Исправлено: pechory, 19:32 26-04-2011
KChernov



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

Цитата:
В том смысле, что если они идут подряд, то какая может быть между ними сумма?  

Действительно, не заметил -1.
А вообще в логике ваших же сообщений - как раз в этом случае сумма существует, но она равна нулю.
Но с граничными вариантами всегда так - нужна ещё какая-то дополнительная логика, чтобы правильно их интерпретировать.
 
Добавлено:
pechory

Цитата:
Я попробовал, ради интереса. На выходе получился тот же самый массив. Вроде работает.  

Я потому и написал "не фатальный".
Но в этом случае на каждый элемент массива будет выполняться обмен, хотя он и не будет ни на что влиять, так как обмен будет между одной и той же ячейкой.
Но если наша задача подрастёт до многомега/гигабайтных файлов, ну или если это просто будет часто выполняемая в рантайме функция - подобная пустая работа уже может влиять на производительность.

Всего записей: 2471 | Зарегистр. 20-04-2004 | Отправлено: 19:46 26-04-2011
pechory

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
KChernov
 
Согласен, что это далеко не идеальное решение задачи, мой стаж в изучении С++ всего три месяца, поэтому пользовался тем, что знаю, а знаю я еще очень мало. Но по-моему все-таки получилось понятней чем у yAanAa.

Всего записей: 116 | Зарегистр. 15-04-2011 | Отправлено: 20:04 26-04-2011
A1exSun



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Написал ф-ю перекодировки cp866 > cp1251.

Код:
unsigned char * oem2win(unsigned char *str)
{
    int i; // цикл
    unsigned char *newstr = calloc(strlen(str), sizeof(char) + 1); // память
    for (i = 0; i < (int)strlen(str); i++) {
        newstr[i] = str[i]; // для всех
        if(128 <= str[i] && str[i] <= 175) newstr[i] = str[i] + 64; // А-Я, а-п
        if(224 <= str[i]) newstr[i] = str[i] + 16; // р-я
        if(str[i] == 240) newstr[i] = 168; // Ё
        if(str[i] == 241) newstr[i] = 184; // ё
        if(str[i] == 242) newstr[i] = 170; // Є
        if(str[i] == 243) newstr[i] = 186; // є
        if(str[i] == 244) newstr[i] = 175; // Ї
        if(str[i] == 245) newstr[i] = 191; // ї
        if(str[i] == 252) newstr[i] = 185; // №
    }
    return newstr;
}

Хрень какая-то. Пишу с помощью нее файл, иногда непонятно почему появляется ошибка памяти на строке newstr[i] = str[i];
Здесь же вроде все правильно?
Пишу так:

Код:
for (i = 0; i < Group.Number; i++) {
        fprintf(f,"%s|%d|%d|%d\n",oem2win(Group.Student[i].Name),Group.Student[i].Score,Group.Student[i].Ratio,Group.Student[i].Time);
    }

Еще иногда тоже непонятно от чего вместо некоторых чисел пишет совсем левые, а должны быть 0, т.к. я туда ничего еще не заносил. Память структуре выделял calloc, она же должна все нулем инициализировать...

Всего записей: 1871 | Зарегистр. 25-11-2009 | Отправлено: 20:26 26-04-2011
Abs62



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

Цитата:
    unsigned char *newstr = calloc(strlen(str), sizeof(char) + 1); // память  

Может, всё-таки calloc(strlen(str)+1, sizeof(char))?
Кстати, можно ещё посмотреть на strdup.

Цитата:
Пишу с помощью нее файл, иногда непонятно почему появляется ошибка памяти

Память в таких случаях нормально выделяется, или calloc возвращает NULL? Проверять возвращаемое значение надо.

Цитата:
Пишу так:

А кто выделенную в oem2win память освобождать будет?

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

Всего записей: 6077 | Зарегистр. 22-10-2005 | Отправлено: 20:44 26-04-2011
A1exSun



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

Цитата:
А кто выделенную в oem2win память освобождать будет?

А где ее освобождать? После return вроде как поздно, она сама освободиться или нет?
 
Добавлено:

Цитата:
Может, всё-таки calloc(strlen(str)+1, sizeof(char))?

А вообще нужно это +1? Вроде и без него хорошо.
А так вышло потому что malloc там раньше был...

Всего записей: 1871 | Зарегистр. 25-11-2009 | Отправлено: 20:48 26-04-2011 | Исправлено: A1exSun, 20:52 26-04-2011
Abs62



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

Цитата:
А где ее освобождать?

Где-нибудь после использования. Автору виднее.

Цитата:
После return вроде как поздно, она сама освободиться или нет?

Нет. Память, выделенная динамически, через malloc/calloc/realloc, сама не освободится.

Цитата:
А вообще нужно это +1? Вроде и без него хорошо.

А завершающий ноль куда пихать без этого +1?

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

Всего записей: 6077 | Зарегистр. 22-10-2005 | Отправлено: 20:59 26-04-2011
A1exSun



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

Цитата:
Где-нибудь после использования.

Так она используется при выводе на экран / в файл (fprintf(f,"%s",oem2win(Group.Student[i].Name)),
то есть ни в какую переменную больше не пишется, а newstr удаляется после завершения функции. Как тогда?

Цитата:
А завершающий ноль куда пихать без этого +1?

В моем случае этот ноль копируется из str, верно?

Всего записей: 1871 | Зарегистр. 25-11-2009 | Отправлено: 21:03 26-04-2011 | Исправлено: A1exSun, 21:04 26-04-2011
Abs62



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

Цитата:
то есть ни в какую переменную больше не пишется, а newstr удаляется после завершения функции.

Вот-вот. Указатель исчезает, а выделенная память остаётся, и до неё уже никак не добраться. Это называется "утечка ресурсов".

Цитата:
Как тогда?

Думать.
Можно, к примеру, сделать как-то так:

Код:
ptr=oem2win(...);
fprintf(...,ptr,...);
free(ptr);

Но сознательно бросать выделенную память на произвол судьбы - так не годится.

Цитата:
В моем случае этот ноль копируется из str, верно?

Нет. Он остаётся от работы calloc. Чтобы копировался, в условии цикла должно быть не i < (int)strlen(str), а i <= (int)strlen(str).

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

Всего записей: 6077 | Зарегистр. 22-10-2005 | Отправлено: 21:16 26-04-2011
A1exSun



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

Код:
    for (i = 0; i < Number; i++) {
        cprintf("   #%d. ",i + 1);
        gets(Name[i]);
    }

Почему так вот первый елемент проскакивает? Т.е. ввод начинается со второго.
С помощью scanf() пробел никак не получить?  
 
Добавлено:

Цитата:
Но сознательно бросать выделенную память на произвол судьбы - так не годится.

А при следующем вызове той функции и выделении в ней памяти newstr старая освободиться?
Если да, то можно в конце программы отправить туда 0 байт и все Или освободить только раз.

Всего записей: 1871 | Зарегистр. 25-11-2009 | Отправлено: 21:26 26-04-2011 | Исправлено: A1exSun, 21:39 26-04-2011
KChernov



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

Цитата:
Согласен, что это далеко не идеальное решение задачи

Если что, это не критика, а разбор

Всего записей: 2471 | Зарегистр. 20-04-2004 | Отправлено: 21:38 26-04-2011
Abs62



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

Цитата:
С помощью scanf() пробел никак не получить?

Что-то не понял суть проблемы.

Цитата:
А при следующем вызове той функции и выделении в ней памяти newstr старая освободиться?

Нет. Без free() она никак не освободится.

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

Всего записей: 6077 | Зарегистр. 22-10-2005 | Отправлено: 21:42 26-04-2011
A1exSun



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Abs62
мне нужно считать "Фамилия Имя".
scanf() читает только до пробела, а gets почему-то пропускает Name[0] и сразу предлагает ввести Name[1].

Всего записей: 1871 | Зарегистр. 25-11-2009 | Отправлено: 21:46 26-04-2011
pechory

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

Цитата:
Если что, это не критика, а разбор

Да все в порядке, я только ЗА. Просто у Вас уже образ мыслей настолько профессиональный, что Вы видите то, о чем начинающие учиться программированию даже не имеют представления. Сложно не имея опыта все эти "ЕСЛИ" предусмотреть.
Но Вы  все правильно делаете, иначе как научишься?  
Просто это не всегда сразу понимаешь.

Всего записей: 116 | Зарегистр. 15-04-2011 | Отправлено: 21:59 26-04-2011
Открыть новую тему     Написать ответ в эту тему

Страницы: 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 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389

Компьютерный форум 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