2.1. Настройка среды
При работе с различными версиями Си необходимо обратить внимание на правильную настройку ряда параметров среды. Конечно, мы не будем описывать процесс настройки подробно, обратим внимание лишь на ряд вопросов, которые иногда вызывают проблемы (напомним, что мы "привязываемся" к Турбо Си).
1. Должны быть правильно настроены пути в разделе Options— >Directories к Include Directories, Library Directories и Turbo С Directories, Если неправильно настроены Include Directories, вы будете иметь проблемы при компиляции (компилятор не будет находить h-файлов), если неправильно настроены Library Directories, будут возникать проблемы при линковке, а неправильная настройка Turbo С Directories может проявиться, например, тем, что вы не сможете использовать файл помощи (TCHELP.TCH).
Типичная настройка каталогов (у вас она, конечно, может быть другой):
Include Directories:
С:\TC\INCLUDE
Library Directories: C:\TC\LIB
Turbo С
Directories: C:\TC
2. Как правило, на начальном этапе в разделе Project->Project name не должно быть указано имя файла проекта (о файлах проекта мы далее будем говорить отдельно). Если имя файла проекта указано, то вы некоторое время будете разбираться с вопросами детей "почему вместо моей программы линкуется какая-то другая?".
3. Опять же на начальном этапе в разделе Compile->Primary С Program обычно ничего указано быть не должно.
4. Если "умные детишки" изменили конфигурацию "под себя", то придется "вернуть все на место" и записать параметры (Орt ions-> Save Options). На практике удобно всегда иметь под рукой файлы конфигурации (в ТС 2.0 — TCCONFIG.TC) и переписывать их в каталог, указанный в пункте Turbo С Directories целиком.
2.2. Примеры программ
Автор начинает курс языка Си с демонстрации нескольких примеров простых программ. Все используемые в них конструкции далее, разумеется, рассматриваются более подробно. Еще раз напомним, что мы рассчитываем, что дети знакомы с каким-нибудь языком программирования (в нашем случае — с Паскалем), поэтому смысл большинства используемых в этих примерах конструкций им интуитивно ясен.
Замечание. Если вы совсем не знакомы с языком Си, то вам, безусловно, следует пропустить данный раздел (сразу перейти к разделу 3), но, быть может, возвращаться к нему при рассмотрении тех или иных вопросов.
Первая программа (дань традиции)
#include <stdio.h>
void main(void)
{ printf("\n3дравствуй, Мир!\n");}
Представление правильной несократимой дроби в виде цепной
#include
<stdio.h>
void main(void)
{ int n,m,t;
printf("\nЧислитель?");scanf("%d",&n) ;
printf("\n3наменатель?"};scanf("%d",&m) ;
printf("Цепная дробь: {");
while (n!=l)
{ printf("%d", m/n) ;
t=n;n=m%n;m=t;
printf (",");
}
printf("%d}",m) ;
}
Пример итеративной функции вычисления факториала
#include <stdio.h>
unsigned long fact(unsigned long n)
{ unsigned long ret=l;
while (n>0) {ret*=n;n--;} ;
return ret;
}
void main(void)
{ unsigned long n;
printf
("\nЧисло? (<=12) ") ;scanf("%ld",
&n) ;
printf ("Факториал
%ld = %ld" , n, fact (n) ) ;
}
Пример рекурсивной функции вычисления факториала
#include <stdio.h>
unsigned long fact(unsigned long n)
{ if (!n) return 1; else return n*fact(n-1);}
void main(void)
{ unsigned long n;
printf("\nЧисло?
(<=12)");scanf("%ld",&n) ;
printf("Факториал
%ld = %ld",n,fact(n));
}
Перевод десятичного числа в систему счисления с другим основанием (меньшим 10)
#include <stdio.h>
void translate(int n, int p)
{ if (n>=p) translate(n/p,p) ;
printf("%d",n%p) ;
}
void
main (void)
{ int n,p;
printf( "n\Число?")
;scanf("%d", &n) ;
printf ("Основание
системы счисления?");scant("%d",&p);
translate(n,p)
;
printf("\n") ;
}
Получение двоичной записи числа с использованием битовых операций
#include <stdio.h>
char bit (int n, int pos)
{ return (n»pos)&l;}
void translate2(int
n)
{ int pos=15;
while (!bit(n,pos)) pos--;
while
(pos>=0) {printf("%d",bit(n,pos));pos--;}
}
void main (void)
{ int n;
printf("\nЧисло?");scanf("%d",&n)
;
printf("Двоичное
представление:");
translate2(n) ;
printf ("\n") ;
}
Пример функции вычисления квадратного корня
#include <stdio.h>
#include <math.h>
float
root2 (float x)
{ float e=lE-10, xn, xnplusl=x;
do {
xn=xnplus1;
xnplus1=0.5*(xn+x/xn)
;
}
while (fabs(xn-xnplus1)>e) ;
return xnplus1;
}
void
main(void)
{ float х;
printf ("\nЧисло?");scant("%f",&x)
;
printf("Наша
функция возвращает: %f",root2(x);
printf("\nФункция
sqrt возвращает:
%f",sgrt(x));
}
2.3. Использование функций printf и scanf
При изложении курса мы очень редко уделяем внимание описанию конкретных функций, ибо в противном случае курс Си можно читать годами безо всякой пользы для учащихся. Все необходимые сведения можно легко найти в справочной системе. Но функциям printf и scanf все же приходится уделить некоторое время. Обе они устроены просто и изящно, проблема состоит в том, что операторы ввода/вывода в Паскале устроены по-другому, и ребятам не всегда просто сразу перестроиться.
Общий, вид функции printf следующий:
printf("строка формата", список параметров);
Примеры использования функции printf уже были приведены выше, в п. 2.2.
Символы в строке формата делятся на три категории — обычные символы, символы формата и управляющие символы. Символам формата в списке параметров соответствуют некоторые параметры и при выводе вместо символа формата выводится значение соответствующего параметра. Обычные (не форматные) символы выводятся AS IS. Посредством управляющих символов производится перевод строки, табуляция и пр.
Символы формата начинаются со знака "%" (но, конечно, не все символы, начинающиеся со знака "процент", являются форматными) и указывают на тип очередного элемента из списка параметров. Так, %d указывает на вывод целого числа, %с — символа, %f — вещественного числа и т.д. Полный список форматных символов весьма внушителен (он имеется в справочной системе), кроме того, помимо собственно типа, можно специфицировать и вид выводимого значения. Так, при выводе вещественного числа по формату %5.2f оно выводится в 5 позициях с двумя знаками после запятой (в Паскале это выглядит как, например, х: 5:2 ).
Управляющие символы начинаются со знака " \" (чтобы вывести символ ' \', его надо удвоить: ' \ \ ' ). Наиболее часто используется символ '\n' — перевод строки; далее в примерах (см., например, описание операции sizeof) используются и другие управляющие символы.
Функция ввода scant имеет вид (примеры использования scanf были приведены выше):
scanf(строка формата, список параметров);
В простейшем случае в строке формата встречаются только форматные символы (а значения при вводе разделяются произвольным количеством пробелов и/или символов перевода строки). На начальном этапе изучения Си (до знакомства с указателями) нет возможности грамотно объяснить ребятам, почему перед именем переменной в списке параметров надо ставить знак "&". Надо просто преподнести это как данность. Опыт показывает, что с этим даже самые любознательные учащиеся могут на некоторое время примириться.