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

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



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Помогите разобраться с лабораторными на C++ !!!
 
Л.Р.1
 Вариант №5
 ------------
 Разработать две программы. Первая принимает от пользователя две строки. Далее, если обе строки хранят целые числа со знаком, то на экран выводится сумма чисел, в противном случае – конкатенация двух введенных строк. Вторая программа запускает первую в качестве вновь созданного  
 процесса.
 
 Л.Р.2
 Вариант №5
 ------------
 Разработать программу, осуществляющую ввод двух строк, введенных пользователем. Далее, если обе строки хранят целые числа со знаком, то на экран выводится сумма чисел, в противном случае – конкатенация двух вве-денных строк. Проверку на соответствие строки целому числу, вычисление суммы чисел и конкатенации строк оформить как три разных функции потока. Ввод строк осуществляется до запуска всех потоков, а вывод результатов – после их завершения.
 
 Л.Р.3
 Вариант №5
 ------------
 Разработать программу, осуществляющую ввод двух строк, введенных пользователем. Далее, если обе строки хранят целые числа со знаком, то на экран выводится сумма чисел, в противном случае – конкатенация двух вве-денных строк. Проверку на соответствие строки целому числу, вычисление суммы чисел и конкатенации строк оформить как три разных функции  
 потока (с приоритетами, соответственно, THREAD_PRIORITY_ABOVE_NORMAL, HREAD_PRIORITY_LOWEST и THREAD_PRIORITY_IDLE). Ввод строк осуществляется до запуска всех по-токов, а вывод результатов – после их завершения. Также выводятся значе-ния времени работы каждого потока.

Всего записей: 82 | Зарегистр. 09-07-2007 | Отправлено: 07:22 29-12-2011
Arumi



Newbie
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
У меня вот задачка есть, никак решить её не могу:
Один из простейших способов шифровки текста состоит в том, что каждой букве алфавита ставится в соответствии другая буква (её шифр), выбор которой произволен. Составте свою шифровальную таблицу, разработайте способ её представления, затем напишите программу, зашифровывающую и расшифровывающую текст, записанный на русском языке.
 
Единственное до чего догадалась ввести 33 цикла на нахождение каждой буквы и её замену))
Что нужно использовать, чтобы решить задачу рациональнее и чтобы код покороче был? Х)

Всего записей: 21 | Зарегистр. 27-11-2011 | Отправлено: 10:45 29-12-2011
akaGM

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

Цитата:
Составте свою шифровальную таблицу, разработайте способ её представления

 
один раз надо будет составить эту таблицу
например, для ДОС-текста (кодировка СР866) русские символы начинаются с номера 128 (заглавная А)
 
unsigned char xtable[128] = {...} // здесь пишешь "кодированные символы"
если, например,
А --> О
Б --> К
то
unsigned char xtable[128] = {142, 138, итд}
или прям:
unsigned char xtable[128] = {'О', 'К', итд}
 
тогда алгоритм кодирования становится очень простым и равным выборке из этой таблицы, индексом которой является сам кодируемый символ:
 
unsigned char symbol; //входной символ
unsigned char codedSymbol; //закодированный символ
 
if (symbol > 127) {
  codedSymbol = xtable[symbol-128]
}

Всего записей: 24037 | Зарегистр. 06-12-2002 | Отправлено: 11:42 29-12-2011 | Исправлено: akaGM, 11:52 29-12-2011
blaro



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Привет всем. Посмотрите пожалуйста функцию, которую я написал.  

Код:
 
int *sub(int a[],int b[],int size, int *plen)
{
    int i,j,k=0,flag,count=1;
    plen=(int*)malloc(1*sizeof(int));
    for(i=0;i<size;i++)
    {
        flag=0;
        for(j=0;j<size;j++)
            if(a[i]==b[j])
            {
                flag=1;
                break;
            }
        if(flag==0)
        {
            count++;
            plen[k]=a[i];
            k++;
            plen=(int*)realloc(plen,count+1*sizeof(int));
        }
    }
    if(count==0)
        return plen=NULL;
    return plen;
}

Проблема в строке

Код:
plen=(int*)realloc(plen,count+1*sizeof(int));

Первую ячейку в массиве он создает как надо и заносит в нее значение. Следующую ячейку он почему то не создает. Не могу понять почему.

----------
Оптимистично смотрю на мир глазами убийцы.

Всего записей: 311 | Зарегистр. 29-01-2006 | Отправлено: 13:55 29-12-2011
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
blaro
может так?
 
plen=(int*)realloc(plen,count*sizeof(int));
 
а вообще сначала лучше бы определить сколько тебе надо, а потом уже выделить необходимую память один раз без всяких перераспределений...

Всего записей: 24037 | Зарегистр. 06-12-2002 | Отправлено: 14:16 29-12-2011
Abs62



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

Цитата:
plen=(int*)realloc(plen,count+1*sizeof(int));  

plen=(int*)realloc(plen,(count+1)*sizeof(int))

Всего записей: 6077 | Зарегистр. 22-10-2005 | Отправлено: 18:18 29-12-2011
Arumi



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

Цитата:
unsigned char xtable[128] = {142, 138, итд}  
 или прям:  
 unsigned char xtable[128] = {'О', 'К', итд}

 
немного не поняла(

Всего записей: 21 | Зарегистр. 27-11-2011 | Отправлено: 20:57 29-12-2011
A1exSun



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Arumi
Читай: http://ru.wikipedia.org/wiki/ASCII
Делаешь свою таблицу (массив), далее в цикле подменяешь символами из него свой текст. И наоборот.
http://en.wikipedia.org/wiki/Code_page_866

Всего записей: 1871 | Зарегистр. 25-11-2009 | Отправлено: 14:16 30-12-2011 | Исправлено: A1exSun, 14:17 30-12-2011
cp58

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Pikachupp
Под какую ось?
p.s. И если win, то о наличии pthread знать бы.

Всего записей: 295 | Зарегистр. 06-12-2011 | Отправлено: 13:25 03-01-2012 | Исправлено: cp58, 13:25 03-01-2012
Molniev

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Pikachupp
 
Судя по константам аля-THREAD_PRIORITY_ABOVE_NORMAL программы вам с WinAPI:
Л.Р.1  
  Вариант №5  
  ------------  
  Разработать две программы. Первая принимает от пользователя две строки. Далее, если обе строки хранят целые числа со знаком, то на экран выводится сумма чисел, в противном случае – конкатенация двух введенных строк. Вторая программа запускает первую в качестве вновь созданного  
  процесса.
Программа 2 (Запускающая)

Код:
#include <windows.h>
 
int main(int argc, char* argv[])
{
    ShellExecuteW(0, NULL, L"prog.exe", NULL, NULL, SW_NORMAL);    //ShellExecute - функция оболочки
    return 0;
}

//где prog.exe - имя первой программы, находящейся в том же каталоге (папке)
Программа 1 (Делающая много полезнова)

Код:
//У меня есть подозрения, что под строками вы понимате нечто вроде char*, а не std::wstring, так что C Style вариант вашего задания
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
 
#include <windows.h>
 
int main(int argc, char* argv[])
{
    char str1[256], str2[256];
    int numb1, numb2;
 
    printf("Enter strings: \n");
    scanf("%s %s", str1, str2);
 
    numb1 = atoi(str1);    //функция atoi переводит строку str1 в число numb1, если str1 представляет собой не число (т.е. не "-15" а "абв"), то numb1 присваиваеться ноль
    numb2 = atoi(str2);
 
    if ( (0 == numb1 && '0' != str1[0]) || (0 == numb2 && '0' != str2[0]) )    //Если numb(1,2) ноль, а в самой строке не ноль - то в строке содержиться нечисловое значение. Ну кроме "-0". Добавте в проверку, если считаете это нужным.
        printf("%s%s\n", str1, str2);        //В задании написано вывести контекацию строк, а не зделать её. Полное соответствие заданию.
    else printf("%i\n", numb1 + numb2);
 
    getchar(); getchar();    //может статься вам хватит и одного
 
    return 0;
}

 Л.Р.2  
  Вариант №5  
  ------------  
  Разработать программу, осуществляющую ввод двух строк, введенных пользователем. Далее, если обе строки хранят целые числа со знаком, то на экран выводится сумма чисел, в противном случае – конкатенация двух вве-денных строк. Проверку на соответствие строки целому числу, вычисление суммы чисел и конкатенации строк оформить как три разных функции потока. Ввод строк осуществляется до запуска всех потоков, а вывод результатов – после их завершения.  

Код:
//По аналогии:
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
 
#include <windows.h>
 
typedef struct _workerset {
    char str1[256], str2[256];
    int numb1, numb2;
    HANDLE verify_complit;
    BOOL isNumber;
    char result[256];
} workerset, *pworkerset;
 
DWORD WINAPI verify_number(LPVOID lpThreadParameter)    //функция проверки введенных строк на предмет их "численности"
{
    pworkerset ws = (pworkerset)lpThreadParameter;        //Получаем переданные в поток данные
 
    ws->numb1 = atoi(ws->str1);
    ws->numb2 = atoi(ws->str2);
    if ( (0 == ws->numb1 && '0' != ws->str1[0]) || (0 == ws->numb2 && '0' != ws->str2[0]) ) ws->isNumber = FALSE;
    else ws->isNumber = TRUE;    //Аналогично первой программе, только флаг ставим в общей для всех потоков структуре
 
    SetEvent(ws->verify_complit);    //Выставляем событие в сигнальное состояние (TRUE), потоки sum_number и sum_string в строке WaitForSingleObject размараживаються и продолжают тяжкую работу
    
    return 0;
}
 
DWORD WINAPI sum_number(LPVOID lpThreadParameter)
{
    pworkerset ws = (pworkerset)lpThreadParameter;
 
    WaitForSingleObject(ws->verify_complit, INFINITE);    //Ждем пока поток verify_number не заполнит переменные ws->isNumber, ws->numb1, ws->numb2
    if (ws->isNumber) sprintf(ws->result, "%i\n", ws->numb1 + ws->numb2);    //Результат выводиться "а вывод результатов – после их завершения" такчто пишем его во временую переменную
 
    return 0;
}
 
DWORD WINAPI sum_string(LPVOID lpThreadParameter)
{
    pworkerset ws = (pworkerset)lpThreadParameter;
 
    WaitForSingleObject(ws->verify_complit, INFINITE);    //Ждем пока поток verify_number не заполнит переменныю ws->isNumber
    if (! ws->isNumber) sprintf(ws->result, "%s%s\n", ws->str1, ws->str2);    //К слову говоря такое использование sprintf и есть контекация строк в чистом виде (ну только не штатной strcat, а более мощным вариантом)
 
    return 0;
}
 
int main(int argc, char* argv[])
{
    workerset ws;
    DWORD n = 0;
    HANDLE threads[3];
 
    printf("Enter strings: \n");
    scanf("%s %s", ws.str1, ws.str2);
 
    ws.verify_complit = CreateEventW(NULL, TRUE, FALSE, NULL);    //Создаем событие, сию есть объект синхронизации
    threads[0] = CreateThread(NULL, 0, verify_number, &ws, 0, &n);
    threads[1] = CreateThread(NULL, 0, sum_number, &ws, 0, &n);
    threads[2] = CreateThread(NULL, 0, sum_string, &ws, 0, &n);
 
    WaitForMultipleObjects(3, threads, TRUE, INFINITE);    //Ждем пока все потоки завершаться (читай отработают)
    printf("%s", ws.result);    //Выводим результат
    //Ах да. Мы не закрываем хендлы - что в нормальных программах делать не в коем случае нельзя! Но у нас то учебная.
    getchar(); getchar();
 
    return 0;
}

 
 Вариант №5  
  ------------  
  Разработать программу, осуществляющую ввод двух строк, введенных пользователем. Далее, если обе строки хранят целые числа со знаком, то на экран выводится сумма чисел, в противном случае – конкатенация двух вве-денных строк. Проверку на соответствие строки целому числу, вычисление суммы чисел и конкатенации строк оформить как три разных функции  
  потока (с приоритетами, соответственно, THREAD_PRIORITY_ABOVE_NORMAL, HREAD_PRIORITY_LOWEST и THREAD_PRIORITY_IDLE). Ввод строк осуществляется до запуска всех по-токов, а вывод результатов – после их завершения. Также выводятся значе-ния времени работы каждого потока.
//Тоже самое, что и предыдушая программа, только вместо старого main, такой и ещё функция вывода времени перед ним
//Так-как потоки у нас ничего особо не делают то время может выйти по нулям. Дабы показать, что все это хозяйство работает и время таки считает, то в одну из функций советую впихнуть нечто вроде Sleep(1000); и ротацией односекундного (1000 - это тысяча милисекунд) интервала на другие значения и соответствующим изменениев времени выполнения потока куда это дело было впихнуто (или всех трех, если в verify_number выше SetEvent) демонстрировать так сказать преподовательскому составу этот подсчет.

Код:
void print_worktime(HANDLE thread_handle, char *thread_name)
{
    FILETIME ft[3];
    float d;
 
    GetThreadTimes(thread_handle, &ft[0], &ft[1], &ft[2], &ft[2]);
    ft[1].dwLowDateTime -= ft[0].dwLowDateTime;
    ft[1].dwHighDateTime -= ft[0].dwHighDateTime;    //по хорошему мы тут должны учесть переполнение младшего dword-а, но бог с ним
    d = (float)ft[1].dwLowDateTime / 10000000;    //тутачки время из 100 наносекундных интервалов в секунды скидываем
    printf("%s work time: %f\n", thread_name, d);
}
 
int main(int argc, char* argv[])
{
    workerset ws;
    DWORD n = 0;
    HANDLE threads[3];
 
    printf("Enter strings: \n");
    scanf("%s %s", ws.str1, ws.str2);
 
    ws.verify_complit = CreateEventW(NULL, TRUE, FALSE, NULL);
    threads[0] = CreateThread(NULL, 0, verify_number, &ws, 0, &n);
    threads[1] = CreateThread(NULL, 0, sum_number, &ws, 0, &n);
    threads[2] = CreateThread(NULL, 0, sum_string, &ws, 0, &n);
    SetThreadPriority(threads[1], THREAD_PRIORITY_LOWEST);
    SetThreadPriority(threads[2], THREAD_PRIORITY_IDLE);
 
    WaitForMultipleObjects(3, threads, TRUE, INFINITE);
    printf("%s", ws.result);
    print_worktime(threads[0], "verify_number");
    print_worktime(threads[1], "sum_number");
    print_worktime(threads[2], "sum_string");
 
    getchar(); getchar();
 
    return 0;
}

cp58
Информирую, pthread нету (ну окромя эмуляции/трансляции через либы cydwin/mingw). Есть либо через штатное api - CreateThread, либо через сишные потоки (beginthread или что то в этом роде). Ну сами то потоки не беда, вызовы что в winAPI что в pthread различаються непринципиально. А вот с примитивами синхронизации сложней - тут есть некоторые идеологические различия.
 
Добавлено:
Pikachupp
Ах да, забыл дописать. В третей программе мы не маемся дурью и приоритет THREAD_PRIORITY_ABOVE_NORMAL никому не задаём - ибо он задается самой системой при создании потока. Ну это для справки - если вдруг такой каверзный вопрос возникнет.

Всего записей: 176 | Зарегистр. 13-03-2008 | Отправлено: 23:41 03-01-2012
cp58

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

Цитата:
Информирую, pthread нету (ну окромя эмуляции/трансляции через либы cydwin/mingw).

Собирать не обязательно(но от сборки с mingw ничего криминального не вижу), порт под win предоставляет готовые библиотеки.

Цитата:
 Есть либо через штатное api - CreateThread, либо через сишные потоки (beginthread или что то в этом роде).

Большая разница в этих функциях(CreateThread, _beginthreadex, _beginthread); дело в том, что при использовании функции _beginthreadex для каждого потока создается свой контекст(_tiddata), с такими переменными как errno,strerror,_tmpfile, etc, а все потому, что стандартная библиотека C/C++ проектировалась без расчета на многопоточность.

Цитата:
Ну сами то потоки не беда, вызовы что в winAPI что в pthread различаються непринципиально. А вот с примитивами синхронизации сложней - тут есть некоторые идеологические различия.  


Код:
 
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_lock(&mutex);
//Делаем что-то
pthread_mutex_unlock(&mutex);
 


Код:
 
HANDLE mutex;
mutex=CreateMutex(NULL, FALSE, NULL);
WaitForSingleObject(mutex);
//Делаем что-то
ReleaseMutex(mutex);
 

Не поддерживается только часть функционала для портирования(с win на unix).
 
Добавлено:
Molniev
По коду.

Цитата:
Программа 1 (Делающая много полезнова)  

Если все таки требовался C++, а не C, то вариант решения иной, так же не идеальный(поскольку не обрабатывается вариант, что числа не целые)

Код:
 
#include <string>
#include <sstream>
#include <iostream>
template <class T>
bool string_convert_to(T& t, const std::string& str, std::ios_base& (*f)(std::ios_base&)) {
  std::istringstream isstream(str);
  return !(isstream >> f >> t).fail();
}
int main() {
    std::string s1,s2;
    std::cin >> s1 >> s2;
    int a,b;
    if (string_convert_to<int>(a,std::string(s1),std::dec) && string_convert_to<int>(b,std::string(s2),std::dec))  
        std::cout << a+b;
    else  
        std::cout << s1 << s2;            
}
 

Всего записей: 295 | Зарегистр. 06-12-2011 | Отправлено: 13:07 04-01-2012
Molniev

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

Цитата:
Собирать не обязательно(но от сборки с mingw ничего криминального не вижу), порт под win предоставляет готовые библиотеки.

Просто, если в задании фигурирую константы соотносящиеся с CreateThread и изучалось соответственно winAPI автор задания может быть удивлен столь широким кругозором. Но согласен - ничего криминального нет.
 

Цитата:
Большая разница в этих функциях(CreateThread, _beginthreadex, _beginthread); дело в том, что при использовании функции _beginthreadex для каждого потока создается свой контекст(_tiddata), с такими переменными как errno,strerror,_tmpfile, etc, а все потому, что стандартная библиотека C/C++ проектировалась без расчета на многопоточность.

Полностью согласен, за исключением того, что подавляющее большинство вызовов сишной библиотеки потокобезопасны. Ну и при использование CreateThread и подразумевает использование и GetLastError и нативных функций, а не errno & co.
 

Цитата:
Не поддерживается только часть функционала для портирования(с win на unix).

Код конечно корректный. Но прямой аналог pthread_mutex - это все же скорей критические секции. Я имею в виду мелкие различия - типа повторного захвата тем же потоком. И крупные различия - winAPI пожалуй чуток побогаче на низкоуровневых примитивах (теже Interlocked перетащенные в gcc), а pthread на высокоурожайных (к примеру mrow-блокировки). Основные примитивы конечно имею аналоги, но в том то и дело, что аналоги, а не точные копии. Чего о pthread_create & CreateThread сказать нельзя.
Именно это я имею в виду под "есть некоторые идеологические различия".
 
 

Всего записей: 176 | Зарегистр. 13-03-2008 | Отправлено: 15:39 04-01-2012
cp58

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

Цитата:
Просто, если в задании фигурирую константы соотносящиеся с CreateThread

Да, ошибка вышла.

Цитата:
Код конечно корректный. Но прямой аналог pthread_mutex - это все же скорей критические секции.  

Разница существенна, критические секции не станут работать, если код разбросать по нескольким процессам + приведенный код показывает лишь похожий доступ к одним объектам синхронизации.

Цитата:
Основные примитивы конечно имею аналоги, но в том то и дело, что аналоги, а не точные копии.

Основные примитивы были разработаны задолго до появления Microsoft, такими людьми как например Дейкстра, поэтому разница в разных осях в API да и только.

Цитата:
 И крупные различия - winAPI пожалуй чуток побогаче на низкоуровневых примитивах (теже Interlocked перетащенные в gcc), а pthread на высокоурожайных (к примеру mrow-блокировки).

Такие функции атомарного доступа, как Intelocked* функции могут быть спокойно реализованы и на linux(на сколько я помню в APR есть такие функции), потому что они зависят от архитектуры процессора, а не от оси.

Всего записей: 295 | Зарегистр. 06-12-2011 | Отправлено: 14:50 05-01-2012
Molniev

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

Цитата:
Разница существенна, критические секции не станут работать, если код разбросать по нескольким процессам + приведенный код показывает лишь похожий доступ к одним объектам синхронизации.

В том то и дело, что пока дело не заходит до межпроцессорной синхронизации прямой аналог - критические секции. И использовать вместо них что-то другое не совсем корректно (в плане быстродействия). "Похожий доступ" это да. Попытка повторного захвата блокировки под posix - deadlock, под win - норма. "Именно это я имею в виду под "есть некоторые идеологические различия"."
 

Цитата:
Основные примитивы были разработаны задолго до появления Microsoft, такими людьми как например Дейкстра, поэтому разница в разных осях в API да и только.

Я в курсе, что компы были до МС)) А семафор предложенный Дейкста интеловцы таки упростили))
 

Цитата:
Такие функции атомарного доступа, как Intelocked* функции могут быть спокойно реализованы и на linux(на сколько я помню в APR есть такие функции), потому что они зависят от архитектуры процессора, а не от оси.

1. Могут быть реализованы. Собственно все остальное работает поверх них, но к сожалению posix не дает api с этой функциональностью.
2. От процессора то конечно зависит. Но крайне удобно, что можно спихнуть все зависимости на ось, а не фигачить ассемблерные вставки под все целевые платформы (под arm я асма к примеру не знаю, но winCE Intelocked функции держит).
3. Это такой же плюс win как и отсутствие mrow минус. Два немного разных api с несколько различными возможностями. Я не в коей степени не претендую на преимущество какого либо из них над вторым.

Всего записей: 176 | Зарегистр. 13-03-2008 | Отправлено: 21:10 05-01-2012 | Исправлено: Molniev, 21:13 05-01-2012
theone555



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ткните пожалуйста носом, куда рыть. сижу двое суток (минута в минуту) над следующим заданием. модификаций было много, только недавно попробовал ввести 3 переменную.

Код:
/*Создать программу, которая выводит на экран
простые числа в диапазоне от 2 до 1000.
(Число называется простым, если оно делится
только на 1 и на само себя без остатка; причем
числа 1 и 2 простыми не считаются)
*/
#include <iostream>
#include <Windows.h>
using namespace std;
void main(){setlocale( LC_ALL,"Russian" );
    int y=2;
for (int x=2; x<10; x++)
{int z=0;
    for (; y<x||x%y==0;y++)
    {  
        
        z++;
    }
 
if (z>0&&x==y) {
    cout<<x<<"\t";
    }
cout<<x<<"\t";
}
 
}

мы дошли только до циклов, и поэтому, хочу оперируя только последними написать. видел на одном ресурсе решение, но разбираться не стал, по тому как самому хочется допереть, а мозгов не хватает (голова меньше чем у Эрастофена).
p.s. и какому красавцу пришло в голову назвать эти числа простыми...
пардон за нубовопрос
добавлено:
забил 10-ку для скорейшей проверки

Всего записей: 297 | Зарегистр. 08-09-2009 | Отправлено: 02:15 07-01-2012 | Исправлено: theone555, 02:22 07-01-2012
cp58

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

Цитата:
3. Это такой же плюс win как и отсутствие mrow минус. Два немного разных api с несколько различными возможностями. Я не в коей степени не претендую на преимущество какого либо из них над вторым.

А минус большой и очень жирный, заключается в том, что код на winapi, для портирования, придется переписывать заного.

Цитата:
2. От процессора то конечно зависит. Но крайне удобно, что можно спихнуть все зависимости на ось, а не фигачить ассемблерные вставки под все целевые платформы (под arm я асма к примеру не знаю, но winCE Intelocked функции держит).  

Все уже украдено до нас (с), а  про APR(Apache Portable Runtime) я писал выше.
theone555
Решето Эратосфена далеко не самый оптимальный алгоритм, если хотите производительности смотрите в сторону решета Аткина.

Код:
#include <iostream>
void prime1(int limit) {
    int i,j;
    bool isprime=false;
    std::cout << 2 << " ";
    for (i=3; i<limit; i++) {
        isprime=true;
        for (j=2; j<i; j++)
            if (i%j==0) {
                isprime=false;
                break;
            }
        if (isprime)
            std::cout << i << " ";
    }
}
 
void prime2(int limit) {
    bool isprime[limit];
    int i,j,k;
    for (i=0; i<limit; i++)
        isprime[i]=true;
    for (i=2; i*i<limit; i++)
        if (isprime[i])
            for (j=3,k=i*2; k<limit; k=j*i,j++)
                if (isprime[k])
                    isprime[k]=false;
    for (i=2; i<limit; i++)
        if (isprime[i])
            std::cout << i << " ";
}

 
Первый вариант в лоб, подходит разве что для того, чтобы греться около процессора.
Второй вариант решето Эратосфена, побыстрее.

Всего записей: 295 | Зарегистр. 06-12-2011 | Отправлено: 05:51 07-01-2012
V0lt



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

Цитата:
(Число называется простым, если оно делится
только на 1 и на само себя без остатка; причем
числа 1 и 2 простыми не считаются)  

Э-э-э. Я не понял. Когда это случилось, что двойка больше не простое число?

Всего записей: 10450 | Зарегистр. 05-02-2003 | Отправлено: 09:45 07-01-2012 | Исправлено: V0lt, 11:33 07-01-2012
theone555



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
cp58, спасибо. допер сам, хотя и помогали мастодонты.
есть способ решить ее только циклами. алгоритм решения - правда только тогда, когда x%y==0 и x==y  
V0lt, ну просто условие такое, дурацкое. я с 3 проверку поставил начал да и делов то

Всего записей: 297 | Зарегистр. 08-09-2009 | Отправлено: 18:07 07-01-2012
suslovp

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
cp58, чё это греться? там в задании всего до 1000, моргнуть не успееш
theone555, так ты будеш проверять два условия. То что предложил cp58, функция prime1, там проверяется одно условие. работать будет быстрее. И ещё я бы предложил немного оптимизировать этот метод, написать так:

Код:
 
void prime1(int limit) {
     int i,j;
     bool isprime=false;
     std::cout << 2 << " ";
     for (i=3; i<limit; i+=2) {
         isprime=true;
         for (j=3; j<i; j++)
             if (i%j==0) {
                 isprime=false;
                 break;
             }
         if (isprime)
             std::cout << i << " ";
     }
 }
 

Проверяем только нечётные числа, ну и соответственно проверяем деление начиная с трёх. Время перебора сократится в 2 раза

Всего записей: 121 | Зарегистр. 21-02-2007 | Отправлено: 20:09 07-01-2012
cp58

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

Цитата:
Проверяем только нечётные числа, ну и соответственно проверяем деление начиная с трёх. Время перебора сократится в 2 раза  

Этакий вы хитрый, далеко не в 2 раза(очень далеко).
Во-первых все четные числа отсеивались при первом же входе во внутренний цикл(деление на 2 - вышел).
Во-вторых еще примерно 50% нечетных чисел отсеиваются во внутреннем цикле до первых 10 итераций.
Самая большая нагрузка на переборе дальше, поэтому алгоритм бессмысленно оптмимизировать, лучше использовать что-то более производительное.

Цитата:
ё это греться? там в задании всего до 1000, моргнуть не успееш

Для задания да.

Всего записей: 295 | Зарегистр. 06-12-2011 | Отправлено: 15:11 08-01-2012 | Исправлено: cp58, 15:13 08-01-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 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