четверг, 30 декабря 2010 г.

Структуры в C (С, Си)

Привет, с вами опять я - кодер -бывший студент
Иногда есть необходимость сгруппировать некоторые данные, допустим вы делайте программу, которая подбирает лучшую девушку 2011.

Конечно можно использовать ряд массивов, например char NameGirl[10]={"Sveta","Anja",....};int AgeGirl[10]={21,23,...} и т.д.

Но лучше использовать структуры.
Структура struct это объеденение нескольких переменных разных или однотипных в одну пачку.

Синтаксис
struct уникальное_название_вашей_структуры
{
переменные, например int age;
};

Но я не рекомендую использовать такой синтаксис, более простой способ это использовать typedef, описание структуры будет в этом случае, таким:
typedef struct
{
переменные, например int age;
} уникальное_название_tp

В чем разница? В объявлении (в функциях и как переменные),
в первом случае вы должны будете писать struct уникальное_название_вашей_структуры имя_переменной,
во-втором случае всего уникальное_название_tp имя_переменной;

Допустим:
typedef struct
{
char name[30];
short age;
char virgin;
char like_drink;
char emo;
} TS_Girl;

В Си, нет булевых типов переменных (они есть только в C++ - bool), потому используем char, но для кода на самом деле все равно, булевая переменная из C++, занимает в памяти также 1 байт, а не 1 бит - как кажется.

Теперь TS_Girl - это, что-то типа переменной и можно сделать так:
TS_Girl girl_from_work[10];
Тут мы объявили массив структур, обращение к структуре будет выглядеть так:
if (girl_from_work[0].age > 30) continue;

Обращение к членам структуры - через точку TS_Girl wounder_girl;
if (wounder_girl.emo != 0) printf("Не повезло!\n");


В чем прелесть структур - что (кроме группировки) - что данные хранятся в одном месте и последовательно друг-за другом.
Системная функция sizeof вернет размер струтуры, в моем случае sizeof(TS_Girl) вернет 35.
Можно эти данные копировать/записовать как область памяти, например write(file,(char*)&girl_from_work[i],sizeof(TS_Gril));

В некоторых (поздних)версиях С, в структурах появились функции - но это язычество, сын мой, избегай этого!
Есть классы (в C++), а есть структуры и не стоит мешать мух с котлетами.

понедельник, 20 декабря 2010 г.

Циклы и условия

Объединил их в один урок, т.к. на самом деле - это одно и тоже - проверка условия и выполнения оператора или блока операторов.
Разница только в том, один раз выполняется блок/операнд или несколько - по условию.

Условия



Как и в множества других языках - блок проверки условия называется if - в переводе если.

После if пишется условие в круглых скобках, а затем один операнд (с замыкающей ;), либо блок (в фигурных скобках).

Например:
if (age > 21) printf("You may'be buy VODKA\n");

Комбинирование условий



В блоке проверки условий можно проверять не одно, а несколько условий - написано в некоторых учебниках и самоучителей.
Это все вранье и чушь! - В блоке if проверяется только одно условие, а операции && - и, и || - или - это операции над значениями.

Допустим if (age > 21 && sex == SX_MAN) на самом деле сначала выполняется решение условия в скобках, все операции имеют разный приоритет (из школы вам известно что умножить приоритетнее, чем сложение), а у операций && и || - самый низкий приоритет.

Выполняется первая часть (проверка идет справа налево) проверка на пол и ее значение запоминается, затем идет проверка на возраст и ее значение запомниается (обе части получают значение true или false), а далее выполняется третья операция && (и) - и если обе части true - то и общее значение будет true.

Если нужно выполнить разные блоки при срабатывание и не срабатывания условия, то используют конструкцию if () {...} else {}
else в переводе иначе.
Логично - сделай так если условие и иначе если не так.

Циклы


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

for - для


Цикл for чаще всего используется там, где нужно выполнить заранее известное количество иттераций (циклов).

Синтаксис
for(условия иницилизации ; блок проверки ; блок выполняемый при каждом цикле - блок шага) {...}
Вместо блока операндов, можно также писать один операнд - если это необходимо.

Пример:
for(i=0;i<10;i++) printf("i=%d\n",i);
В примере в блоке условия инициализации - переменной i назначается значение = 0.
В блоке проверки переменная i проверяется, что она (переменная) меньше 10, в блоке шага - переменная i увеличивается на один.

Блок инициализации выполняется всегда - а блок шага только в том случае, если выполняется условия.
Т.е. выполняется i=0; затем проверяется i<10, далее выполняется блок за for - печатается строка printf("%d\n",i), затем выполняется блок шага - i++,
затем опять проверяется условие и если оно = true (меньше 10 в нашем случае) - опять выполняется блок за for и блок шага. И до тех пор пока блок условия - будет = true.

В любом блоке for можно указать несколько действий через запятую, например:
for(i=0,j=0; i<20,j<5; i+=2,j++) printf("i=%d,j=%d\n",i,j);
Т.е. в блоке инициализации выполняем присвоение перменной i и переменной j.

В блоке проверки условий выполняется два условия что i меньше 20 и j меньше 5 - на самом деле цикл будет только при выполнении всех условий - аналогично сработает (и кстати более лучше для понимания) i<20&&j<5
В блоке шага, выполняется также два операнда, увеличение переменной i на два и i на один.
Результат:
i=0,j=0
i=2,j=1
i=4,j=2
i=6,j=3
i=8,j=4


Скажу больше в блоках можно использовать даже функции, например for(i=0,printf("start");i<10;i++,printf("step\n")) printf("i=%d\n",i);

Но кроме использования их в блоках инициализации и проверки - не вижу смысла использовать функции в блоке шага, уж лучше перенести в блок за for, либо использовать....

while - пока


Цикл while - чаще используют если количество иттераций заранее не известно.

Синтаксис:
while (условие) {...}
Блок за while будет выполнятся пока условие = true.

Если условие изначально false то блок не будет выполнятся вообще, если это необходимо используют более редкую конструкцию while с do
Синтаксис:
do {...} while(условие);
Блок do-while выполнится один раз как минимум и будет выполнятся пока условие = true.


Для изменения работы циклов (for и while) - есть ключевые слова break и continue

break - сломать


Цикл прерывается и выполняется слелующий операнд за циклом

continue - продолжить


Цикл принудительно переходит на блок проверки условия, однако у for - выполняется блок шага


Еще про проверки условий



Еще для более удобного представления множественной проверки условий используют конструкцию switch - переключатель
Синтаксис:
switch(выражение)
{
case значение1:
...
break;
case значение2:
...
break;
default:
...
}


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

Блок default выполняется как глобальный else - если не один case не подошел.

Иногда специально не ставят break для выполнение какого-то кода.
Вообще switch как и циклы - это все проверки условия (if) и переходы на строку (goto)

Однако использовать goto - некомильфо и презирается гуру.
Однако если у вас вложенный тройной цикл - то плюйте на гуру и пишите goto, между прочим в коде под Linux для обработки изображений jpeg используется goto, так что - вообще нежелательно - но если очень хочется - то можно.

четверг, 9 декабря 2010 г.

Какие страницы не в индексе ПС?

Задался тут вопросом и написал небольшую утилиту для определения страниц не в индексе ПС.

Работаю программистом, а потому отдавать за просто так жаль.
Отдам на тесты первым трем комментаторам к этой записи (укажите на какую почту скинуть ключ) [УЖЕ ЗАВЕРШЕНО] и тому кто скажет красную цену и сможет ее аргументировать.

Думаю некоторым саперам будет интересна.