Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Олимпиады

Страница: 1 | 2 | 3 | 4 | 5 |

 

  Вопрос: VC++ Help Please ! (задачка) Добавлено: 08.11.05 23:06  

Автор вопроса:  HACKER

Ответить

  Ответы Всего ответов: 67  

Номер ответа: 31
Автор ответа:
 vito



Разработчик Offline Client

Вопросов: 23
Ответов: 879
 Web-сайт: softvito.narod2.ru
 Профиль | | #31
Добавлено: 11.11.05 10:34
 HOOLIGAN Я попробую объснить о static.
Если не прав поправь.

Для простоты:

int AFunc(void){
/* Так можно организовать счетчик вызовов функции. */
static int callCount = 0;
// Здесь что-то делается...
return ++callCount;
}


Если бы мы не объявили callCount ее как static то при каждом возврате мы бы теряли ее значение, оно бы просто затиралось.

В отношении фуекций это тоже верно, к тому же позволяет экономить память, так как создается только один экземляр и создается в момент запуска программы(сложнехонько).

К примеру в классах к функции объявленной как ststic можно обрашаться еще до создания класса.

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

Поэкспериментирую с примером , вызывай функцию много раз. отмени ststic. Обнаружишь, что значение будет затерто.

Ответить

Номер ответа: 32
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #32 Добавлено: 11.11.05 18:56
а... т.е. эти функции доступны в пределах этого модуля? Тогда всё понятно...

Ответить

Номер ответа: 33
Автор ответа:
 vito



Разработчик Offline Client

Вопросов: 23
Ответов: 879
 Web-сайт: softvito.narod2.ru
 Профиль | | #33
Добавлено: 11.11.05 19:14
HACKER

Да(это общее определение и оно верно), и говоря проще, данные функции, переменные будут хранить свои значения, а не терять их. Поэтому и названы статическими.

Ответить

Номер ответа: 34
Автор ответа:
 Павел



Администратор

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #34
Добавлено: 11.11.05 20:29
Кстати, насчет Static: такое и в VB имеется.

Static a As String

Ответить

Номер ответа: 35
Автор ответа:
 vito



Разработчик Offline Client

Вопросов: 23
Ответов: 879
 Web-сайт: softvito.narod2.ru
 Профиль | | #35
Добавлено: 11.11.05 21:30
 Отличный аналог!

Private Sub Command1_Click()
Dim count As Integer
count = asd

End Sub
'----------------------------------------------------
Function asd() As Integer
Static c As Integer
c = c + 1
asd = c
End Function


Если мы не объявим g как static то счетчика вызовов не получиться.
Переменная будет каждый раз создаваться снова.

Правда здесь есть выход объявить ее как глобальную. В С это не пройдет, даже объявляя ее как глобальную мы должны использовать static, чтобы быть уверенными в том, что значение сохраниться.

Ответить

Номер ответа: 36
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #36 Добавлено: 12.11.05 18:33
всё я понял, про в VB Static давно знаю... Всем спасибо!

Ответить

Номер ответа: 37
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #37 Добавлено: 13.11.05 14:43
ещё просьба

Необходма ф-цыя которая шифрует текст перестановкой соседних бит.

и ещё...
#include <iostream.h>

char Crypt (char* text){
char txt;
for (int i=0;i<strlen(text);i++){
strcat(txt, chr(ord(text[i];) + 1));
}

return txt;
}


Что я делаю не правельно? Ругается на chr and ord, я так понимаю я какой-то инклуд забыл?

Ответить

Номер ответа: 38
Автор ответа:
 GSerg



Вопросов: 0
Ответов: 1876


 Профиль | | #38 Добавлено: 13.11.05 15:04
Данный код (если бы он работал) заменял бы каждую букву на следующую по алфавиту.

Кстати, что char txt - это один байт, не смущает?

Ответить

Номер ответа: 39
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #39 Добавлено: 13.11.05 15:19
Данный код (если бы он работал) заменял бы каждую букву на следующую по алфавиту.

Ну это понятно, собственно это и было задание...
Кстати, что char txt - это один байт, не смущает?

смущает, наверно надо сделать указателем, но я незнаю как динамически память выделить чтобы в массив вмещалась любой кол-во символов, ну короче в переменную строку любой длинны...

Ответить

Номер ответа: 40
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #40 Добавлено: 13.11.05 15:41
что за ord? В MSDN я такого не нашёл.
И касательно strcat(txt....) : txt у тебя char (просто один байт), а strcat требует char* - указатель на байт (или на начало строки).
Если хочешь дополнять строку txt, по объяви её как char* txt. Под эту строку надо выделить либо заведомо достаточное количество памяти, либо постоянно проверять длину txt, и при достижении выделенного предела делать realloc.

Ответить

Номер ответа: 41
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #41 Добавлено: 13.11.05 16:22
Можно вообще не выделять ничего, а саму строку шифровать по месту, т.к. от перестановки бит размер не меняется. Примерно так (по простому):

void Crypt( char* string ){
    char    temp;
    int        i=0;

    while (string[i];){
        temp = string[i];
        *((char*) (string+i)) = 0;
        string[i] = string[i] | ((temp & 128)>>1);
        string[i] = string[i] | ((temp &  64)<<1);
        string[i] = string[i] | ((temp &  32)>>1);
        string[i] = string[i] | ((temp &  16)<<1);
        string[i] = string[i] | ((temp &   8)>>1);
        string[i] = string[i] | ((temp &   4)<<1);
        string[i] = string[i] | ((temp &   2)>>1);
        string[i] = string[i] | ((temp &   1)<<1);
        i++;
    }
}


И вызывать :

    char     sss[]="my string";
    MessageBox ( NULL, sss, NULL, NULL );
    Crypt(sss);
    MessageBox ( NULL, sss, NULL, NULL );
    Crypt(sss);
    MessageBox ( NULL, sss, NULL, NULL );


Одна и та же ф-ция будет и шифровать, и расшифровывать.

Ответить

Номер ответа: 42
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #42 Добавлено: 13.11.05 16:45
Ну... я конечно может не прав, но вроде
chr - из символа ASCII код
ord - наоборот, ищ ASCII кода символ

про Crypt...

а что значит ((temp & 128)>>1

>> и << как нам объясняли это сдвиг на n число бит в право или влево соответсовенно.

а что значт, что даёт temp & 128

P.S> Я извиняюсь за глупые вопросы, с Си имею дело относительно недавно, а разобраться быстро неполучается, т.к. как я понял язык не прост в понимании... (для меня)

Ответить

Номер ответа: 43
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #43 Добавлено: 13.11.05 16:51
Вообщ прокоментируй плиз пару строчек...
        string[i] = string[i] | ((temp & 128)>>1);
        string[i] = string[i] | ((temp &  64)<<1);
        string[i] = string[i] | ((temp &  32)>>1);
        string[i] = string[i] | ((temp &  16)<<1);
        string[i] = string[i] | ((temp &   8)>>1);
        string[i] = string[i] | ((temp &   4)<<1);
        string[i] = string[i] | ((temp &   2)>>1);
        string[i] = string[i] | ((temp &   1)<<1);

Ответить

Номер ответа: 44
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #44 Добавлено: 13.11.05 18:34
Берется байт из строки и сохраняется в temp (temp = string;) Затем это место в строке обнуляется, чтобы был чистый символ *((char*) (string+i)) = 0;

string = string | ((temp & 128)>>1); - это по VB-шному
string(i) = string(i) Or ((temp And 128)\2);
В чистую ячейку строки начинаем прописывать биты.
У сохраненного байта (temp) выделяется старший (седьмой) бит при помощи (temp & 128) и затем этот бит сдвигается вправо на 1 разряд >>1 и становится шестым. Затем при помощи "|" этот бит заносится в шестой бит ячейки string. Аналогично берется шестой бит сохраненного (temp & 64) и сдвигается влево на один разряд и заносится как седьмой в string. Так меняются местами шестой и седьмой биты.
Аналогично обмениваются остальные три пары битов, нечетные сдвигаются вправо, четные влево, и получившиеся биты накладываются на ячейку string.
Цикл повторяется до тех пор, пока в исходной строке не окажется нулевой байт - признак конца строки - while (string).

Ответить

Номер ответа: 45
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #45 Добавлено: 13.11.05 23:38
Ещё одно, я наверно достал тебя уже :) но всё же...

как реализовать replace ? (подобно VB-шному) ...

Ответить

Страница: 1 | 2 | 3 | 4 | 5 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам