Выпуск 10: Расширяем знания...

 

Архив рассылки

Доброго времени суток!

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

C - один из самых популярных языков в мире. От него пошла огромная ветвь - С++. Да, С++ является потомком Си. Но это ещё не конец! От этих двух языков появились ещё два! Один из них - всем известный язык Java. Второй - язык, который по чуть-чуть покаряет программистов своей мощьностью :) Это C#, который преднозначен для разработки .NET приложений. Но мы будем изучать только Си, потому что программы OpenGL в основном пишутся на нём. От него не сложно перейти и на другие ветви.

Изучаем первую программу

Откройте Dev-C++ и создайте пустой файл (как в выпуске 08).

main() // Главная функция программы
{ // Открытие командных скобок

} // Закрытие командных скобок

Со скобками, думаю, всё понятно. Не так, как в Дельфи, каждая Си программа должна иметь по крайней мере одну функцию. Эта функция является главной, и без неё программа работать не будет! Эта функция называется main(). Не забудьте, что для каждой подпрограммы в Си надо писать скобки! А также, что язык чувствителен к регистрам букв! Продолжим. Главная функция программы должна находится под всеми другими, как и в Дельфи (только там главный блок, а не функция). В Си языке функции тоже определяются, как и переменные, но объявление переменных отличается от стиля Дельфи. Сначала указывается её тип, а потом название. Двоеточие не нужно! А также переменные создаются внутри командных скобок, не так, как в Дельфи. Это в каком то случае удобно, но иногда эти переменные могут просто путаться под ногами. Вот примерчик:

main() // Главная функция программы
{
     int variable; // Переменная "variable" является целочисленной
}

Здесь я создал переменную. Целое число имеет тип int (сокращение от Integer). Дробный тип - это float. Символ - char. Строки записываются между двойными кавычками. Вот ещё один примерчик:

main()
{
     int a, b;
     float r;
     char c[] = "Result: ";

     a = 3;
     b = 4;
     r = a / b;
}

С первыми тремя переменными, думаю, всё понятно. Но что там происходит с символом? Почему там строка, а не символ? Потому что символы в Си могут хранить строки, которых во время исполнения программы менять нельзя! Такие переменные рядом с названием имеют ещё и [ ] (без пробела). Но это только при создании переменной! Ещё два различия между переменными в Дельфи и в Си:

1. В Си переменным сразу можно присвоить значение
2. Переменные можно создавать в любом месте программы

Так что такая запись будет правильной:

main()
{
     int a, b;
     char c[] = "Result: ";

     a = 3;
     b = 4;
     float r = a / b;
}

Она может и правильная, но лучше все переменные держать в одном месте, а то, как я уже говорил, можно запутаться в коде. Пора результат показать на экране. Для вывода информации существует множество функций. Одни выводят только числа, другие только текст. Я считаю, что они не удобные, поэтому мы воспользуемся функцией, которая может и то, и другое. Называется printf() и находится в модуле stdio.h (standart input/output). Присоедините этот модуль к проекту, чтобы можно было воспользоваться функцией.

#include < stdio.h >

main()
{
     float a, b, r;
     char c[] = "Result: ";

     a = 3.0;
     b = 4.0;
     r = a / b;

     printf("%s %f", c, r);
}

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

#include < stdio.h >
#include < conio.h >

main()
{
     float a, b, r;
     char c[] = "Result: ";

     a = 3.0;
     b = 4.0;
     r = a / b;

     printf("%s %f", c, r);
     getch();
}

Теперь её можно запускать. Работает? Должна. Но так не было бы, если переменные небыли бы дробными. Теперь разберёмся с нашой строкой. Во первых хочу сказать, что переменные к строке присоединяются не плюсом (как в Дельфи), а запятой. Но их просто так не отобразить! Сначала для них надо зарезервировать место в строке! Для каждого типа переменной место резервируется по другому. Точнее, разница только в определении типа этого места. Началом определения типа является символом %. После него следует сам тип. Дробные числа имеют букву f. Для целых чисел это буква d, для строк это s, а для символов - c. В этом примере у нас не символ, а строка. Этого не забывайте! Может на первый взгляд это сложно, но такое мнение не верное. Это очень даже удобно. Например, в языке C# (произносится C Sharp, Си Шярп) даже указывается очередь переменных :) Так не надо превращать числа в строки.

Сегодня материала будет довольно много, так что читайте внимательно! Теорию вы уже знаете, осталось выучить синтаксис нового языка.

Перед тем, как продолжить зделаем одну программку. Может и две, посмотрим... :)

Чтобы тут нам зделать.... Ну, например найдём тот же самый синус :) Раз везде его используем, пусть он будет и тут :) Для этого к проекту подключите модуль Math. Функция называется также, как и в Дельфи. Приступим:

#include < stdio.h >
#include < conio.h >
#include < math.h >

main()
{
     printf("%f", sin(90));
     getch();
}

Не забудьте, что здесь царствуют радианы! :) Проклятые радианы... Зачем их придумали? :) Лично я буду использовать градусы. И вам советую. Не потому, что вы должны полюбить их, если привыкли к радианам, а потому что вам нужна практика! Создайте функцию, которая будет переводить эти значения. Осталось сказать, что в Си функции не имеют переменных, типа Result, как в Дельфи. Там, для возвращения значения служит ключевое слово return. Теперь ваших знаний хватает, чтобы создать функцию самим. Но я вам помогу. Программа должна выглядить так:

#include < stdio.h >
#include < conio.h >
#include < math.h >

double DegToRad(double alpha)
{
     return alpha * (3.1415 / 180);
}

main()
{
     printf("%f", sin(DegToRad(90)));
     getch();
}

double - это тоже дробное число, токо его значение может быть больше, чем у float. Для этой функции я создал параметр, который будет содержать значение в градусах. Обратите внимание! В языке Си после создания функции не надо ставить точки с запятой. Дальше должно быть всё понятно и знакомо.

Раз уж мы коснулись подпрограмм, то осталось сказать, что в языке Си нету процедур! Там есть пустые функции, которые не возвращают значения, но тоже могут иметь параметры. Для определения такой функции используется ключевое слово void. Добавляется, конечно, перед именем функции. Это тоже тип. Пустой тип :) Но переменные такими не бывают! И на самом деле главная функция программы (main()) имеет тип целого числа и возвращает ноль. По этому программы должны выглядить так:

int main()
{
     return 0;
}

Также она имеет свои параметры, но они нам сейчас не нужны. Вот и всё по поводу подпрограмм. Вернёмся на минуточку к строкам. В языке Си не существует функция, которая после отображения текста начинает новую строку. Но это не проблема :) Тут даже лучше! Вот пример:

#include < stdio.h >
#include < conio.h >

int main()
{
     printf("Hello,\nWorld!:)");
     getch();
     return 0;
}

Посмотрите на указанную строку и результат исполнения программы. Отличаются? :) Обратите внимание на строку (в коде). Видите разницу? Я туда вставил \n. В языке Си это значит, что с того места, где он поставлен, начинается новая строка. Приведу ещё пример:

printf("H\ne\nl\nl\no\n\nW\no\nr\nl\nd");

После каждого символа начинается новая строка. Думаю, что это очень даже удобно, потому что не надо кучу раз использовать те же самые функции. Больше о этик записях вам знать не обязательно, потому что остальное очень редко используется. Но как поставить слеш? Очень просто. Надо напечатать их два //. Это всё должно быть между двойными кавычками!

Мы уже научились работать с функциями и выводить значения на экран. Осталось считывание значений и условия. Начнём с условий.

Условия в Си

В Дельфи, когда всего одно условие, использовать скобки не обязательно (я приводил пример со скобками, чтобы вы лучше поняли как правильно использовать логические выражения), но в Си без них не обойтись! А записывается всё схожим способом:

int main()
{
     if(a > b)
      ...;
     else
      if(a == b)
       ...;
      else
       ...;
     return 0;
}

Как можно заметить из примера, в Си перед else надо обязательно ставить пустой оператор! И по желанию можно его вообще не использовать (else имею в виду :) Эта программа работать не будет, потому что не созданны переменные, которые используются в сравнении. Не так давно я вам говорил, что знак "равно" (=) в Си записывается так: ==. Не путайте с оператором присваивания!

Теперь поговорим о логических выражениях (and, or....). Здесь останавливаться не буду, только скажу как они записываются.

&& - И
|| - ИЛИ
:: - исключающий ИЛИ
!= - логический НЕ (отрицание)

Больше об этом мне нечего сказать, потому что всё я уже объяснял. Не забывайте скобки!!!! Ладно, осталось получить данные с клавиатуры. Для этого надо воспользоваться процедурой scanf(), и выглядит она так: scanf("%шаблон_типа", &переменная);. Шаблон типа тот же, что и использованный в printf(). Если переменных несколько, то и шаблонов несколько. Отделять их надо пробелом. Перед указанием переменной надо использовать амперсант. Только не путайте его с логическим выражением! Вот примерчик:

int main()
{
     int x, y;
     printf("Enter some numbers -> ");
     scanf("%d %d", &x, &y);

     if((x == y)||(x < y))
      printf("'y' is not less than 'x'\n");
     else
      printf("'x' is biger than 'y'\n");

     getch();
     return 0;
}

Посмотрите сколько скобок! :) Их не должно быть меньше!!!! Можно больше, но не меньше. Ну, вроде всё. Ещё расскажу о некоторых удобствах языка Си. Например, вам надо увеличить переменную на единицу. Как вы будете это делать? Конечно надо к существующему значению добавить единицу, т.е. x = x+1;. Правильно? И в Дельфи также. Но это не очень удобно, особенно если имя переменной длинное. Выход есть! :) Только, к сожалению, в Дельфи так дело не пройдёт :) Можно написать так: x++;. Вот и всё :) Удобно? Можно и отнать единицу: x--;. А если надо изменить на другое значение? Для этого есть тоже один очень удобный способ: x+=2; :) Или умножить: x*=5. Здесь значение переменной умножается на 5.

Мало кто знает про условное выражение! :) Мало кто знает и по этому это выражение используется очень редко. Условное выражение ичпользуется для того же, для чего и условный оператор. Отличие то, что это выражение в некоторых случаях на много удобнее и записывается короче. Тем не менее вам это, думаю, пригодится. Выглядит так: (условие) ? оператор1 : оператор2 . Условие - это просто условие. Оператор1 - действие, которое должно выполнится, если результат условия - истина. Оператор2 - наоборот. Пример:

(10 > 5) ?
    printf("Rabotaet! :)\n") :
    printf("Cio-to ne paset...");

Если 10 больше пяти (а это действительно правда!), то на экране появится первая строка. В этом примере вторая строка никогда не будет выведена на экран, потому что 10 всегда больше пяти. Это всё не сложно, надо только запомнить стиль записи. А запомнить тоже легко. Представьте себе, что это обычный вопрос: "Больше ли 10 чем 5?". После вопроса ставится ?. В условном выражении тоже, так что это как будто вопрос написан не на русском языке, а на Си. Двоеточие отделяет ответы. Как будто отношение двух выриантов ответа. Есть и ещё одно удобство у этого выражения. Из примера поймёте :)

int Choise()
{
     int a, b;
     scanf("%d %d", &a, &b);

     return (a > b)? a : b;
}

Не забудьте вызвать эту функцию :) Что здесь творится? Сначала исполняется условие, т.е. сравниваются числа, а потом результат возвращается в главную функцию. Эквивалентна запись:

int Choise()
{
     int a, b;
     scanf("%d %d", &a, &b);

     if (a > b)
      return a;
     else
      return b;
}

Так что удобнее использовать? Решать, конечно вам :) Я не буду заставлять использовать то, или другое. Выберайте сами. Как я говорил, не всегда условным оператором удобно пользоваться.

Ну, вроде всё бъяснил. Выучив это вы догоните Дельфи программистов. Но не забудьте, что читать надо всё! Я не буду отдельно повторять и для одного языка, и для другого. Теперь задания. И для Дельфи, и для Си!

Задание #8: напишите программу-тест, используя подпрограммы. У каждого вопроса должно быть несколько вариантов ответа. Вопросов как минимум три. Программа должна быть консольной! Пользователь должен вводить цифры, или символы (не строки!).

На сегодня хватит. Если что-то не поняли - спрашивайте.

 

2005-10-20

Spider3D http://spider3d.narod.ru

Евгений Нарышкин Spider3D@yandex.ru

Архив Рассылки

Хостинг от uCoz