Главная страница

Структура простой программы на Си


Скачать 330 Kb.
НазваниеСтруктура простой программы на Си
Дата30.09.2022
Размер330 Kb.
Формат файлаppt
Имя файлаLecture_1_4_2022.ppt
ТипДокументы
#707686

Структура простой программы на Си


В каждой программе обязательно присутствует главная функция (с именем main ()), которая выполняется первой.
Каждый оператор заканчивается «;», которая является частью оператора, а не разделителем, как в Паскале.
После #include, #define, main() “;” не ставится.


<Подключение библиотек>
int main() //заголовок
{<операторы объявления переменных>
<операторы присваивания, ввода/вывода, управляющие структуры >
return 0;
}

Типы данных


Различают простые и составные типы.
Простые:
символьный (1 байт) ;
целый (2 байта или 4 байта);
вещественный (4 байта или 8 байтов);
указатели.
Составные:
структуры (записи):
объединения.


Каждая простая переменная должна быть отнесена к одному из основных типов. Это делается с помощью объявления переменных. Цель объявления - определить:
форму представления (c фиксированной или плавающей точкой);
точность (число знаков);
способ выделения памяти (статический, автоматический (до исполнения, в процессе исполнения));
размер памяти и наличие или отсутствие знакового разряда (для типов с плавающей точкой – число разрядов для мантиссы и порядка).

Пример описания простых переменных


int i, j, k;
long i1, abc;
short x, var; целые
unsigned Z, Z1;
float r1,r2;
char bukva;


Замечания:
Всегда выдерживается соотношение размеров short<=int<=long.
Данные типа char рассматриваются как целые.
Использование целых без знака (для счетчиков) увеличивает максимальное целое, например, при 16 битах - до 65535 (вместо 32767).
В Си отсутствует булевский тип (в C++ есть bool).

Определение размеров памяти для хранения данных


#include
int main()
{
printf(“char ≡ %d bits\n",8 * sizeof(char));
printf(“unsigned char ≡ %d bits\n",8 * sizeof(unsigned char));
//далее -аналогично
return 0;
}


char ≡ 8 bits
unsigned char ≡ 8 bits
int ≡ 32 bits
unsigned int ≡ 32 bits
long int ≡ 32 bits
short int ≡ 16 bits
double ≡ 64 bits
float ≡ 32 bits
long double ≡ 128 bits


Операция sizeof возвращает число байтов, занимаемых операндом (константой, типом или переменной).

Константы


Целые: 243 -5 , первой цифрой не должен быть 0.
    Длинное целое: 243123L 12l = 12 (десятичное) (максимальное значение для 4 байт ≈ 2 млрд)
    Восьмеричное: 0243 012341 (если целое начинается с нуля, оно интерпретируется как восьмеричное число) 020=16; 012=10 .
    Шестнадцатеричное: 0X243 0x243L (начинающееся с символов 0х или 0Х) 0X20=32.

    Вещественные: 2.73 2Е-5 .31Е5 300. . В Паскале, если есть точка, то должны быть цифры слева и справа от нее. В Си нет такого ограничения.
    В Си все вещественные константы представляются числом с плавающей точкой двойной точности, 8 байт, т.е.
    имеющим тип double.
    В используемой версии компилятора для отделения дробной части числа от целой при вводе данных используется запятая, а в остальных случаях точка.

3. Символьные: 'А' '.‘ - один символ в апострофах (представляются как данные типа int, т.е. хранится код символа).
Специальные управляющие символьные константы
'\n' - новая строка
'\t' - табуляция
'\b' - возврат на шаг назад
'\r' - возврат каретки
'\\' - обратный слеш
'\'' - апостроф '
'\"' - кавычки "
'\0' - нуль-символ

4. Строковые


4. Строковые
Строковая константа - последовательность символов, заключенная в кавычки. Например, “Это строка”.
В языке Си нет специального типа для описания строк.
Строки представляются в виде массива элементов типа char. Последним элементом массива является нуль-символ '\0‘, который компилятор автоматически помещает в конец строки. Нуль-символ не выводится на печать и в таблице кодов ASCII имеет номер 0.
0 1 2 3 4 5 6 7 8 9 10


Э


т


о


с


т


р


о


к


а


\0


Описания с начальным присваиванием
Язык Си позволяет определить начальное значение переменной при ее описании.
    int i=25;
    float a=2.5, c=1Е-7;
    char C='с', lett='z';

Операции в Си


Операции в Си по количеству операндов разделяются на унарные (1);
бинарные (2);
тернарные (3).
Число операндов указано в скобках.
Унарные операции имеют высший приоритет и выполняются справа налево, бинарные – слева направо.

Унарные


Унарные
- арифметическое отрицание -2.4
! логическое отрицание (not) !(x>0)
* разадресация *a
& взятие адреса &x
+ унарный плюс +2
sizeof размер памяти sizeof(int)
Бинарные (в порядке убывания приоритета)
Арифметические
* умножение a *b
/ деление x /10
% (остаток от деления целых чисел) z % 2
+ сложение x + 2
- вычитание 3 – 5


Операции отношения
> больше z>0
< меньше x >= больше или равно 4>=8
<= меньше или равно 0<=x
= = равно (сравнение) x==5
! = не равно s!=0
Логические (имеют более низкий приоритет, чем операции отношения )
&& - логическое "и" (and) a!=0 && d>0
|| - логическое "или" (or) x==1 || x>y
Примечание. В отличие от Паскаля, в выражении
x-a>b && b>c || b> 10
скобки не нужны.

Операции присваивания


= это присваивание. (Соответствует := в Паскале).
Операции увеличения (инкремент) и уменьшения (декремент) на единицу
v++; – увеличение v на 1 после использования v (постфиксная форма),
++v; – увеличение v на 1 перед использованием v (префиксная форма),
v--; --v; – уменьшение на 1, где v – переменная (обычно целого типа).

Пример. Префиксная и постфиксная форма инкремента и декремента.


#include
int main()
{int a=1, b=1, aplus, plusb;
aplus=a++; //aplus=a; a++;
//увеличивается после присваивания
plusb=++b; //++b; plusb=b;
//увеличивается до присваивания
printf("a=%d, aplus=%d\n", a, aplus);
printf("b=%d, plusb=%d\n", b, plusb);
return 0;
}


a=2, aplus=1
b=2, plusb=2


2


1


2


2


2


2


a


b


aplus


plusb


1


1


Операции с присваиванием [ *=, /=, +=, -=, %= ]
a+=1; соответствует a=a+1;
Множественные присваивания выполняются справа налево.
x=y=++z; соответствует {z=z+1;y=z;x=y;}
Операция «запятая» позволяет вместо составного оператора, содержащего только присваивания, использовать простой. Вычисления выполняются слева направо.
x=y, x++, z-=x; соответствует {x=y; x++; z=z-x; }
Наглядность программы снижается (но код укорачивается).
Не рекомендуется применять операции увеличения или уменьшения к переменной, которая входит в выражение более одного раза.

Операция приведения


Для приведения выражения к определённому типу используется операция приведения:
(тип) выражение
Она имеет наивысший приоритет, как все унарные операции.
int mice; mice=1.6+1.7; //результат mice=3
mice=(int) 1.6+(int) 1.7; //результат mice=2
Во втором операторе 1.6 и 1.7 преобразуются в целые числа 1, mice=1+1=2.

Математические функции Для использования этих функций подключается математическая библиотека: #include double x, у; int n; //объявленные переменные


√x = sqrt(x)
ху = pow(x,y)
|х| = fabs(x)
|n| = abs(n)
ex = exp(x)
ln x = log(x)
lg x = log10(x)


sin x = sin(x)
cos x = cos(x)
tg x = tan(x)
arcsin x = asin(x)
arccos x = acos(x)
arctgx= atan(x)
(значение в интервале –π/2; π/2)

Например, рассмотрим кодирование формулы


На языке Си:
z=pow(log(fabs(x-pow(y,2.))),(1./3.))+
1./(log10(7.)+tan(3.));

Простые и составные операторы


Если ветвь условной конструкции или тело цикла содержит несколько операторов, то они объединяются в составной оператор при помощи “{“ и “}”.
Begin в Паскале соответствует “{“ в Си, End - “}”.

Пример. Нахождение суммы первых 20 натуральных чисел и вывод сумм на экран.


#include
int main()
{int sum=0; //сумма
int c=0;//счетчик
while (c++<20) //увеличение после сравнения
{
sum=sum+c; // или sum+=c
printf ("sum=%d\n", sum);
}
return 0;
}

Условная конструкция.


Различают три формы условной конструкции (пример конструкции в Паскале):
простейшая ( if … then… );
расширенная ( if … then … else … );
выбор ( case … of… ).

Простейшая условная конструкция.


Псевдокод :
если <условие> то
<оператор>
всё
Си
if (<выражение>)
<оператор>
В отличие от Паскаля выражение может иметь любой тип.
Важно: 0, ‘\0’ и NULL считаются ложью, остальные значения - истиной.

Расширенная условная конструкция


Псевдокод :
если <условие> то
<оператор1>
иначе
<оператор2>
всё
Си
if(<выражение>)
<оператор1>
else <оператор2>

Примеры.


if(a>b&&b>c)
f=x*x-1;
else
f=x+1;
‘;’ перед else является частью оператора присваивания в ветви if.


if(x>5||x<0)
{
k++;
y[k]=x;
}
else
{
n++;
z[n]=x;
}

Отличия от Паскаля:


1.  Выражение обязательно заключается в скобки.
2.  ”;” может стоять перед else, если только нет составного оператора. (“;”- часть <оператора1>).
3.  Другой приоритет вычисления логического выражения:
-  сначала операции отношения;
-  затем логические операции !, &&, || (не, и, или).
Приоритет операций отношения меньше, чем у операций “+” и “-” и больше, чем у операции присваивания:
х>у+2 то же, что и х>(у+2).

Допускается вложенность операторов if. Если нет составного оператора, else относится к ближайшему if. Рассмотрим пример.


if (number>6)
if (number<12)
printf ("Конец игры!\n");
else
printf ("Потеря хода!\n");


Число


Результат


5


10


15


«Нет результата»


Конец игры


Потеря хода

Если необходимо, чтобы else соответствовал первому if, добавим { }. Рассмотрим пример.


if (number>6)
{
if (number<12)
printf ("Конец игры!\n");
}
else
printf ("Потеря хода!\n");


Число


Результат


5


10


15


Потеря хода


Конец игры


«Нет результата»

Рассмотрим программу решения квадратного уравнения ax2+bx+c=0.


#include
#include
int main()
{
float a,b,c,d,x1,x2;
printf("solve ax^2+bx+c=0\n");
printf("input a,b,c\n");
scanf("%f%f%f",&a,&b,&c);
if (a==0.0) printf("linear !\n");
else
{
d=b*b-4.0*a*c;
printf("\nd=%8.3f\n",d);
if (d<0) printf("no real solutions !\n");
else
{


if (d==0.0)
{ x1=-b/(2.0*a);
printf("one !\n x=%8.3f\n",x1);
}
else
{
x1=(-b+sqrt(d))/(2.0*a);
x2=(-b-sqrt(d))/(2.0*a);
printf("two !\n x1=%8.3f",x1);
printf("\n x2=%8.3f\n",x2);
}
}
}
return 0;
}

Операция условия - сокращённый способ записи if- else (тернарная).


В общем виде условное выражение записывается следующим образом:
Например:
x= ( y<0 ) ? –y : y;
эквивалентно:
if (у<0)
х = -у;
else
х = y;
Условное выражение удобно использовать в тех случаях, когда некоторой переменной надо присвоить одно из двух возможных значений, например:
max = (а > b)?a:b;


(<условие>) ? <значение если истинно> : <значение если ложно> ;



написать администратору сайта