Структура программы. примеры простейшей программы, использующей ввод/вывод на экран(сложить 2 числа)

Основные типы данных. Целый, символьный, вещественный, voit

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

Тип данных характеризует:

· объем памяти, выделяемый под данные;

· их внутреннее представление в памяти компьютера;

· набор допустимых операций (действий);

· множество допустимых значений.

Все типы данных можно подразделить на простые — они предопределены стандартом языка, и сложные (или составные) — задаются пользователем. Данные простого типа нельзя разложить на более простые составляющие без потери сущности данного. Простые типы данных создают основу для построения более сложных типов: массивов, структур, классов. Простые типы в языке C++ — это целые, вещественные типы, символьный и логический тип и тип void.

Рассмотрим более подробно простые типы данных.

Целые типы

Целый тип данных предназначен для представления в памяти компьютера обычных целых чисел. Основным и наиболее употребительным целым типом является тип int. Гораздо реже используют его разновидности: short (короткое целое) и long (длинное целое). Также к целым типам относится тип char (символьный). Кроме того, при необходимости можно использовать и тип long long (длинное-предлинное!), который хотя и не определён стандартом, но поддерживается многими компиляторами C++. По-умолчанию все целые типы являются знаковыми, т.е. старший бит в таких числах определяет знак числа: 0 — число положительное, 1 — число отрицательное. Кроме знаковых чисел на C++ можно использовать беззнаковые. В этом случае все разряды участвуют в формировании целого числа. При описании беззнаковыхцелыхпеременных добавляется слово unsigned (без знака).

Сводная таблица знаковых целых типов данных:

Тип данных Размер, байт Диапазон значений
char -128 ... 127
short -32768 ... 32767
int -2147483648 ... 2147483647
long -2147483648 ... 2147483647
long long -9223372036854775808 ... 9223372036854775807

Сводная таблица беззнаковых целых типов данных:



Тип данных Размер, байт Диапазон значений
unsigned char 0 ... 255
unsigned short 0 ... 65535
unsigned int (можно просто unsigned) 0 ... 4294967295
unsigned long 0 ... 4294967295
unsigned long long 0 ... 18446744073709551615

Запоминать предельные значения, особенно для 4-х или 8-ми байтовых целых, вряд ли стоит, достаточно знать хотя бы какого порядка могут быть эти значения, например, тип int — приблизительно 2·109.

На практике рекомендуется везде использовать основной целый тип, т.е. int. Дело в том, что данные основного целого типа практически всегда обрабатываются быстрее, чем данные других целых типов. Короткие типы (char, short) подойдут для хранения больших массивов чисел с целью экономии памяти при условии, что значения элементов не выходят за предельные для этих типов. Длинные типы необходимы в ситуации, когда не достаточно типа int.

Символьные типы

В стандарте C++ нет типа данных, который можно было бы считать действительно символьным. Для представления символьной информации есть два типа данных, пригодных для этой цели, — это типы char и wchar_t, хотя оба эти типа по сути своей вообще-то являются целыми типами. Например, можно взять символ 'A' и поделить его на число 2. Кстати, а что получится? Подсказка: символ пробела. Для «нормальных» символьных типов, например, в Паскале или C#, арифметические операции для символов запрещены.

Тип char используется для представления символов в соответствии с системой кодировки ASCII (American Standard Code for Information Interchange — Американский стандартный код обмена информации). Это семибитный код, его достаточно для кодировки 128 различных символов с кодами от 0 до 127. Символы с кодами от 128 до 255 используются для кодирования национальных шрифтов, символов псевдографики и др.

Тип wchar_t предназначен для работы с набором символов, для кодировки которых недостаточно 1 байта, например, Unicode. Размер типа wchar_t обычно равен 2 байтам. Если в программе необходимо использовать строковые константы типа wchar_t, то их записывают с префиксом L, например, L"Слово".

Логический тип

Логический (булевый) тип обозначается словом bool. Данные булевого типа могут принимать только два значения: true и false. Значение false обычно равно числу 0, значение true — числу 1. Под данные булевого типа отводится 1 байт.

Вещественные типы

Особенностью вещественных (действительных) чисел является то, что в памяти компьютера они практически всегда хранятся приближенно, а при выполнении арифметических операций над такими данными накапливается вычислительная погрешность.

Имеется три вещественных типа данных: float, double и long double. Основным считается тип double. Так, все математические функции по-умолчанию работают именно с типом double. В таблице ниже приведены основные характеристики вещественных типов:

Тип данных Размер, байт Диапазон абсолютных величин Точность, количество десятичных цифр
float от 3.4Е—38 до 3.4Е+38
double от 1.7Е—308 до 1 .7Е+308

Тип long doubleв настоящее время, как правило, совпадает с типом double и на практике обычно не применяется. При использовании старых 16-ти разрядных компиляторов данные типа long double имеют размер 10 байт и обеспечивают точность до 19 десятичных цифр.

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

Тип void

Тип void — самый необычный тип данных языка C++. Множество значений этого типа пусто, т.е. нельзя переменной такого типа присвоить какое-нибудь значение. Более того, нельзя даже описать переменную этого типа. Зачем же нужно то, чем вроде бы невозможно воспользоваться?

Оказывается, это очень полезный тип данных! Он используется:

· для определения функций, которые не возвращают результата своей работы;

· для указания того, что список параметров функции пуст;

· а так же этот тип является базовым для работы с указателями. Достаточно сказать, что всё программирование с использованием Win32 API построено на применении указателей на тип void.

Структура программы. примеры простейшей программы, использующей ввод/вывод на экран(сложить 2 числа)

Рассомтрим следующую программу:


#include<stdio.h> /* Пример 1 */ main() { int year; year=2000; printf("Сейчас %d год\n",year); }  

Первая строка #include<stdio.h> сообщает о необходимости подключения файла stdio.h. Этот файл содержит информацию, необходимую для првильного выполнения функций библиотеки ввода/вывода. Язык Си предусматривает использование таких файлов, которые называются заголовочными. В данном случае использование файла stdio.h необходимо, так как в этом файле находится информация о функции printf(), которая используется в нашей программе.
Вторая строка /* Пример 1 */ является комментарием.
Строка main() определяет имя функции. Любая программа на языке Си включает минимум одну или более функций. Выполнение программы всегда начинается с функции main(). Поэтому каждая программа на языке Си должна содержать её.
Следующая строка содержит открывающеюся фигурную скобку, обозначающую начало тела функции main(). Фигурные скобки в языке Си Всегда используются парами (открывающая и закрывающая). Закрывающая скобка встретится в данной программе далее.

 


Строка int year; объявляет переменную, названную year, и сообщает компилятору, что это переменная целого типа. В языке Си все переменные должны быть объявлены прежде, чем они будут использованы. Процесс объявления переменных включает в себя определение имени и указания типа переменных.
Строка year=2000; является оператором присваивания. Здесь переменной с именем year присваивается значение 2000. Заметим, что в языке Си в операторе присваивания используется просто знак равенства. Все операторы в языке Си заканчиваются символом точки с запятой (;).
Строка printf("Сейчас %d год\n",year); является вызовом стандартной функции printf(), которая выводит на экран некоторую информацию. Эта строка состоит из двух частей: имени фукции printf() и двух её аргументов "Сейчас %d год\n" и year, разделённых запятой. Функция printf() является универсальной функцией форматного вывода. Для вызова функции нужно правильно написать имя функции и в скобках указать необходимые фактические аргументы. Первый аргумент функции ptintf() - это строка в кавычках "Сейчас %d год\n", которую называют управляющей строкой. Эта строка может содержать любые символы или спецификации формата, начинающиеся с символа %. Обычные символы просто отображаются на экран в том порядке, в котором они следуют. Спецификация формата, начинающаяся с символа %d указывает формат, в котором будет выводится значение переменной year, являющейся вторым аргументом функции printf(). Спецификация %d указывает, что будет выводится целое число в десятичной записи. Комбинация символов '\n' сообщает функции printf() о необходимости перехода на новую строку. Этот символ называется символом новой строки.
Последняя строка программы содержит закрывающую фигурную скобку. Она обозначает, в данном случае, конец функции main().

-------------- Рассмотрим второй пример, в котором будет использоваться ввод данных с клавиатуры. Для этого будет использоваться библиотечная функция scanf(), которая позволяет вводить информацию с клавиатуры во время выполнения программы:


#include<stdio.h> /* Пример 2: вычисление длины окружности */ main() { int radius; float length; printf("Введите значение радиуса: \n"); scanf("%d",&radius); length=3.1415*2*radius; printf("Радиус - %d\n, длина - %f\n",radius,length); }  

В этой программе по сравнению с предыдущей появились новые моменты.
Во-первых, объявлены переменные двух разных типов: radius - типа целое(int); length - типа с плавающей запятой (float), содержащую дробную часть.
Во-вторых, используется функция scanf() для ввода с клавиатуры значения радиуса окружности. Первый аргумент функции scanf() "%d" указывает, что будет вводится целое десятичное число. Второй аргумент - имя переменной, которой будет присвоено введенное значение. Символ & (амперсанд) перед именем переменной radius необходим для правильной работы функции scanf(). Более подробно использование этого символа будет обсуждаться позднее.
в следующей строке программы целые числа - 2 и radius умножаются на число с плавающей точкой 3.1415 и результат присваивается переменной типа float. Язык Си допускает использование в выражениях переменных разных типов. Для вывода результатов используется функция printf(), которая содержит 4 аргумента. Спецификатор формата %f используется для печати значения переменной length типа float.
В рассмотренном примере длина окружности вычисляется только для целых радиусов. Для того чтобы программа могла вычислять длину окружности для любых радиусов, необходимо объявить переменную radius как float, а в функции scanf() использовать спецификатор"%f".

3. использование переменных. Способы задания , идентификатор, основные операции языка С++ с примерами

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

int a,b,c;
float radius,length;
unsigned char ch1,ch2;
long double integral;


Очень важное значение имеет вопрос о месте объявления переменной в программе. Правило, оределяющее место объявления переменной в программе, называется правилом видимости.
В языке Си могут быть три места, где переменная может быть объявлена. Во-первых, вне каких либо функций, в том числе и main(). Такая переменная называется глобальной и может использоваться в любом месте программы (за исключением глобальных статических переменных, речь о которых далее). Во-вторых, переменная может быть объявлена внутри блока, в том числе внутри тела функции. Такая переменная называется локальной и может использоваться только внутри этого блока. Такая переменная неизвестна вне этого блока. Кроме того, переменная может быть объявлена как формальный параметр функции. Переменная, объявленная как формальный параметр функции, используется для передачи информации этой функции, а также может расматриваться как локальная переменная функции. Рассмотрим пример объявления переменных в разных местах программы:

#include<stdio.h> #include<conio.h> /* Пример 3 */ /*Объявляем переменные в разных местах программы*/ char ch; /*Объявляем глобальную переменную*/ main() { int n; /*объявление локальной переменной внутри функции*/ printf("Введите символ:"); ch=getch(); /*использование глобальной переменной*/ printf("Введите количество символов в строке:"); scanf(%d,&n); /*использование локальной переменной*/ print_str(n); /*вызываем собственную функцию по печати строки из одного символа (количество символов в строке задает пользователь)*/ } /*А это уже наша функция, не из библиотеки*/ int print_str(int m) /*заголовок функции print_str() с объявлением формального параметра m*/ { int j; /*объявление локальной переменной для функции print_str()*/ for(j=0;j<m;j++) printf("%c\n",ch); /*используем локальную переменную j и глобальную ch*/ }  


При написании программ необоходимо помнить следующие правила:

  • две глобальные переменные не могут иметь одинаковые имена;
  • локальная переменная одной функции может иметь такое же имя как локальная переменная другой функции (или формальный параметр другой функции);
  • две локальные переменные в одном блоке не могут иметь одинаковые имена, в том числе формальный переметр функции не должен совпадать с локальным параметром, объявленным в функции.

Константы

В языке Си константы представляют фиксированные величины, которые не могут быть изменены в программе. Константы могут быть любого базового типа данных. Пример констант:

char - 'a','\n','8'
int - 1, 134, -500
unsigned int - 53500
long int - 87000, -37, 7L
short int - 11, 13, -128
float - 133.34, 3.36E-6, 5E+5
double - 133.45, 133340, -2.789


Правила определения типа констант следующие. Целая константа относится к типу int, если эта константа входит в интервал значений типа int.
Если эта константа не входит в интервал значений типа int, например - 37750 (а как известно тип int, как правило принимает значения в диапазоне от -32768 до 32767), то она считается константой типа unsigned (применительно к int это уже от 0 до 65535). Если же и этого мало, то она считается константой типа long (т.е. long int).
Константа с десятичной точкой считается константой типа double, если она помещается в соответствующий интервал измерения.
Для явного задания типа констант используется механизм суффиксов. В качестве суффиксов целочисленных (int) констант используются u,l,h,U,L,H. Для чисел с плавающей точкой - l,L,f,F.

Например:

13h, 35H - short int
25L, -223l - long int
87lu, 88Lu, 89ul - unsigned long int
55uh - unsigned short int
27.43f, 7.7E-6F - float
1.41l, 3.2E+12L - double

Символьная переменная - это величина размером в 1 байт, которая используется для представления литер и целых чисел в диапазоне от 0 до 255 или от -128 до 127, в зависимости от того, знаковая переменная или беззнаковая. Символьные константы заключаются в одинарные кавычки. Примеры символьных констант: 'd', '+', '8'. Приведем пример программы с использованием символьных переменных и констант:

#include /* Пример 4 */ main() { char ch; ch='c'; printf("%c",ch); ch='+'; printf("%c%c", ch,ch); }  

В функции printf() появилась новая спецификация - %c. В таком формате печатается символ. Этот же формат можно использовать в функции scanf() для ввода символа с клавиатуры. В языке Си в стандартной библиотеке ввода/вывода есть специальная функция getche(). Эта функция ожидает, пока не будет нажата какая-либо клавиша клавиатуры, и затем вводит код этой клавиши. Рассмотрим пример программы, использующей указанную функцию:

4. Условный оператор, оператор переключатель-свитч

Условный оператор

Основная форма условного оператора выглядит следующим образом:

if(условие) оператор;
else оператор;


Если значение условия истинно, о выполняется оператор (это может быть и составной оператор), следующий за условием. Если же условие принимае значение ложно, о выполняется оператор, следующий за словом else. В записи оператора if вторая часть (т.е. оператор else) может отсутствовать. Тогда, если условие принимает значение ложно, выполняется следующий оператор программы. В качестве условия может стоять произвольное выражение. В операторе if лишь проверяеся, является ли значение эого выражения ненулевым (истинным) или нулевым (ложным). Рассморим пример программы определения знака воодимого с клавиатуры вещественного числа с использованием нашего оператора if.

#include<stdio.h> /* Пример 9 */ main() { int sgn; float x; printf("Введите число: \n"); scanf("%f",&x); if(x>0) { sgn=1; printf("Число %f\n, положительное sgn = %d\n", x, sgn);} if(x==0) { pritf("Число %f\n равно нулю sgn = %d\n", x, sgn);} if(x<0) {sgn=-1; printf("Число %f отрицательное sgn=%d\n", x, sgn);} }  


Нередко возникает необходимость в использовании конструкции вложенных if-else-if:

if(условие1) оператор1;
else if(условие2) оператор2;
else if(условие3) оператор3;
...
else оператор;


В такой форме условия оператора if проверяютсяч сверху вниз. Как только некоторое условие принимает значение истинно, выполняется оператор, следующий за этим условием, а вся остальная часть конструкции будет проигнорирована. Поэтому, предыдущую программу можно было бы написать следующим образом:

#include<stdio.h> /* Пример 9 */ main() { int sgn; float x; printf("Введите число: \n"); scanf("%f",&x); if(x>0) { sgn=1; printf("Число %f\n, положительное sgn = %d\n", x, sgn);} if(x<0) {sgn=-1; printf("Число %f отрицательное sgn=%d\n", x, sgn);} else { pritf("Число %f\n равно нулю sgn = %d\n", x, sgn);} }  


Для того чтобы проверить, равно число x нулю или нет, можно написать

if(x==0) printf("Число равно нулю ...");
else printf("Число не равно нулю ...");


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

if(!x) printf("Число равно нулю ...");
else printf("Число не равно нулю ...");


Вложенным оператором if называется конструкция вида

if(x)
if(y) printf(" ...");
else операторX ....;


В такой форме непонятно, к какому из операторов if относится else. В языке Си оператор else ассоциируется с ближайшим if в соответствующем блоке. Поэтому в указанной конструкции else относится к if(y). Для того чтобы отнести else к if(x), необходимо соответствующим образом расставить операторные скобки:

if(x){
if(y) printf(" ...");
if(x)}
else операторX ....;


Теперь if(y) относится к другому блоку.

Наши рекомендации