14) не совсем понял но всё же можно так Code: srand(time(NULL)); for(i=0;i<n;i++) a[i]=random(20)+1; /*random(20) будет делать рендом от 0 до 19 а так если прибавить единицу то от 1 до 20*/
12) в цикле каждый раз идет обьявление и каждый раз считаеться размер str моя версия Code: int k=0,A=0,n=strlen(str); for(k=0;k<n;k++) A+=str[k]; З.Ы. Заметь у тя счётчик масива k а ты в условии сколько выполнять цикл поставил i=)
Совершенно верно ) Баг со счетчиком был already героически пофикшен Хочу добавить, что добавил(оО) слишком много репутации в за последние пару часов, поэтому дополнительное вознаграждение за участие будет позже = )
тогда мой окончательный ответ что использовать Code: strcpy(str, "bytes "); strcat(str, very_long_string); чем Code: strcpy(str, "bytes: "); strcat(str, very_long_string);
15) 2 3 2 Обьяснение: перечисления... если б Х ничего не присваивалось тогда бы вывод значения был бы в зависимости от расположения переменной и каждое следуещее значение инкрементировалось на 1, тобишь если б Code: enum {x,y,z} cout<<x<<" "<<y<<" "<<z; то результат быд 0 1 2 а так Х=1+1, тогда Y=x+1=3; z=x=2
Fata1ex в моё случае экономия времяни идет раза в 2 потому как strlen - проходит и сравнивате каждый символ с нулем. Так что если юзать strlen то это двойной проход строки. Для доказательства всег овышеслудующего приведу ассемблерный код который созддает компилятор MS случай Code: int a = 0; char * k = str; while (k[0]) { a += k[0]; k++; } Code: ; int a = 0; xor edx, edx mov BYTE PTR _str$[esp+10], cl mov WORD PTR _str$[esp+8], ax ; char * k = str; lea ecx, DWORD PTR _str$[esp+8] ; while (k[0]) test al, al je SHORT $LN1@main $LL2@main: ; a += k[0]; movsx eax, al ; 24 : k++; inc ecx add edx, eax mov al, BYTE PTR [ecx] test al, al jne SHORT $LL2@main $LN1@main: Итого 31 байт. А теперь рассмотрим код в случае Code: int k=0,A=0,n=strlen(str); for(k=0;k<n;k++) A+=str[k]; выходит Code: 00024 8d 44 24 10 lea eax, DWORD PTR _str$[esp+20] 00028 83 c4 04 add esp, 4 0002b 88 4c 24 0e mov BYTE PTR _str$[esp+18], cl 0002f 33 db xor ebx, ebx 00031 8d 50 01 lea edx, DWORD PTR [eax+1] $LL11@main: /// <== вот это типа код strlen========== 00034 8a 08 mov cl, BYTE PTR [eax] 00036 40 inc eax 00037 84 c9 test cl, cl 00039 75 f9 jne SHORT $LL11@main /// <========================================= 0003b 2b c2 sub eax, edx 0003d 8b d0 mov edx, eax ; 23 : ; 24 : for(k=0;k<n;k++) 0003f 33 c0 xor eax, eax 00041 83 fa 02 cmp edx, 2 00044 7c 20 jl SHORT $LC9@main 00046 8d 4a ff lea ecx, DWORD PTR [edx-1] 00049 55 push ebp 0004a 8d 9b 00 00 00 00 npad 6 $LL10@main: ; 25 : A+=str[k]; 00050 0f be 6c 04 10 movsx ebp, BYTE PTR _str$[esp+eax+20] 00055 03 f5 add esi, ebp 00057 0f be 6c 04 11 movsx ebp, BYTE PTR _str$[esp+eax+21] 0005c 83 c0 02 add eax, 2 0005f 03 fd add edi, ebp 00061 3b c1 cmp eax, ecx 00063 7c eb jl SHORT $LL10@main 00065 5d pop ebp $LC9@main: ; 23 : ; 24 : for(k=0;k<n;k++) 00066 3b c2 cmp eax, edx 00068 7d 05 jge SHORT $LN8@main ; 25 : A+=str[k]; 0006a 0f be 5c 04 0c movsx ebx, BYTE PTR _str$[esp+eax+16] $LN8@main: 0006f 03 fe add edi, esi выходит 77 байт. что выходит почти в 2,5 раза больше по коду и следовательно по скорости. Из этого можно сказать что при работе со строковыми функциями лучше использоват собственные методы
Code: struct A { int x; char y; }; int main() { A a, b; memset(&a, NULL, sizeof(a)); memset(&b, NULL, sizeof(b)); a.x = 10; a.y = 'q'; a.x = 10; a.y = 'q'; if(memcmp(&a, &b, sizeof(a))) cout << "!="; else cout << "="; return 0; } sizeof(a) и sizeof(b) - 12 байт, хотя int+char = 5 => остальные 7 занимает мусор, его и заNULLяем и сравниваем.
Мне вот еще нравилась старая задачка одна, которая даже не зависела от языка программирования. А Задачка такая: Есть 2 числа int a = 12; int b = 7; необходимо обменять значения между этими переменными при этом нельзя использовать третью переменную. P.S. числа роли не играют.
ASM xchg... Ну и собсна алгоритм: Code: a = a - b; b = b + a; a = b - a; Реализация : Code: procedure _XCHG(var a,b:integer); Begin a:= a - b; b:=b + a; a:=b - a; End; Code: void _XCHG(int a, int b){ a = a - b; b = b + a; a = b - a; };