- •Основы программирования на языке С
- •Введение
- •1. Базовые понятия программирования
- •1.1. Алгоритмизация задачи
- •1.2. Схема алгоритма программы
- •1.3. Пример алгоритмизации
- •1.4. Этапы трансляции программы
- •2. Особенности языка С
- •2.1. Характеристики языка
- •2.2. Элементы языка
- •2.3. Стандартные типы данных
- •2.4. Компоненты простой программы
- •Вопросы для самопроверки
- •3. Выражения и операции
- •3.1. Операция и выражение присваивания
- •3.2. Бинарные арифметические операции
- •3.3. Операции увеличения (++) и уменьшения (--)
- •3.4. Преобразования типов при вычислении арифметических выражений
- •3.5. Тернарная или условная операция
- •3.6. Логические операции и операции отношения
- •3.7. Поразрядные (побитовые) операции
- •3.8. Операции сдвига
- •3.9. Операция sizeof
- •3.10. Операция следования
- •3.11. Сводная таблица операций языка С
- •Вопросы для самопроверки
- •4. Операторы
- •4.1. Оператор выражение
- •4.2. Пустой оператор
- •4.3. Объявления и составной оператор
- •4.4. Условный оператор
- •4.5. Оператор выбора switch
- •4.6. Циклы
- •4.7. Оператор break
- •4.8. Оператор безусловного перехода goto
- •4.9. Оператор continue
- •4.10. Оператор return
- •Вопросы для самопроверки
- •5. Массивы
- •5.1. Одномерные статические массивы
- •5.2. Объявление массива. Обращение к элементу массива
- •5.3. Инициализация массива
- •5.4. Многомерные массивы
- •5.5. Выход индекса за границы массива
- •5.6. Приемы работы с массивами в вычислительных задачах
- •5.7. Строка как массив символов
- •Вопросы для самопроверки
- •6. Указатели и ссылки
- •6.1. Понятие указателя
- •6.2. Операция получения адреса &
- •6.3. Операция разыменования (*)
- •6.4. Арифметика указателей
- •6.5. Применение указателей в выражениях
- •6.6. Указатели и массивы
- •6.7. Ссылочный тип данных
- •Вопросы для самопроверки
- •7. Время жизни и область видимости переменной
- •7.1. Общие понятия
- •7.2. Классы памяти
- •7.3. Вложенные блоки в программе
- •8. Функции
- •8.1. Общие понятия
- •8.2. Определение функции
- •8.3. Прототип функции
- •8.4. Переменные в функции
- •8.5. Передача параметров в функцию
- •Вопросы для самопроверки
- •9. Пользовательские типы данных
- •9.1. Структурный тип данных
- •9.2. Битовые поля
- •9.3. Объединения или смеси
- •9.4. Перечисления
- •Вопросы для самопроверки
- •10. Динамическая работа с памятью
- •10.1. Универсальный указатель void
- •10.2. Принципы работы с динамическими массивами
- •Вопросы для самопроверки
- •11. Ввод-вывод данных
- •11.2. Функции ввода-вывода библиотеки iostream
программного кода имела наивысший приоритет при создании языка С++. Любая проверка корректности доступа на уровне языка, тем более динамическая проверка во время выполнения программы, значительно замедляет выполнение программы. Можно сказать, что в С++ надежность была принесена в жертву эффективности. Целесообразность подобного решения до сих пор вызывает споры среди теоретиков программирования.
Подводя итог всего сказанного, отметим, что вопрос о проверке допустимости индексов массива оставлен на рассмотрение программиста, при необходимости можно определить пользовательский тип "массив" и заложить в программу проверку пересечения его границ.
5.6. Приемы работы с массивами в вычислительных задачах
Пример: Задать сначала количество элементов массива, а затем и сам массив (данные ввести с клавиатуры). Вычислить его сумму.
#include <stdio.h> void main
{
int i , j , n=1;
float s , b , x[100] ; while (n>100)
{printf ("\n Введите количество элементов (меньше\ 100): "); scanf ("%d ",&n);
}
printf ("Введите значение элементов: \n"); for (b=0.0 , i=0 ; i<n ; i++)
{printf ("x[%d]= ",i) ; scanf ("%f ",&x[i]) ;
s=s+x[i] ; // вычисление суммы массива
}
printf ("\n сумма массива=%f ",s) ;
}
Результат работы программы:
Введите количество элементов (меньше 100): Введите значение элементов:
x[0] = 8 x[1] = 7 x[2] = 6 x[3] = 5 x[4] = 4
Сумма массива=30.
Пример: Ввести ежедневные данные о температуре в массив (ввод с клавиатуры). Вычислить среднее арифметическое значение элементов введенного массива.
void main()
{
// количество дней в месяце (размер массива) int month[31];
int i, sum; float mid; sum = 0.0;
for (i = 0; i < 31; i++) // ввод значений температуры
{
printf("Введите значение температуры t%d= ", i); scanf("%d", &temp[i]);
}
/*подсчет среднего арифметического*/ for (i = 0; i < 31; i++)
sum += month [i]; mid = sum / 31.0;
printf("Среднее значение температуры составляет: %f\n", mid);
}
В первом цикле for(…) вводятся данные в массив month[]. Обратите внимание на то, что цикл содержит две строки, первая из которых, функция printf(…) является, так называемым "приглашением"-
PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com
запросом на ввод данных, который выводится на экран дисплея. Такая форма ввода данных с клавиатуры, с приглашением, является общепринятой и позволяет избежать ошибок при вводе информации. Приглашение обычно содержит информацию для человека, работающего с программой, это может быть имя переменной, в которую будет происходить ввод, комментарии о характере вводимой информации и тому подобное. В нашем примере на экран выводится комментарий о характере вводимой информации и индекс элемента, в который она будет записана.
Представленный алгоритм решения имеет один недостаток. Как известно, количество дней в различных месяцах варьируется от 28 до 31. Программа же не делает различий и всегда требует ввести 31 значение, что не позволяет провести правильный ввод данных, а следовательно, и расчет будет неверен. Этот недостаток легко исправляется введением граничного значения при вводе данных. В следующем примере процедура ввода прекратится, когда окажутся, введены значения всех элементов массива, или раньше, если вы введете граничное значение 777. Такой алгоритм позволяет использовать любое количество элементов массива от 0 до 31.
Вместо цикла for предыдущей программы теперь используется цикл do...while, и инструкция i = 0; , которая выполняется в начале каждого цикла, чтобы индекс массива, всегда указывал на первый элемент.
void main()
{
int month[31]; int i, sum=0; float mid;
/*загрузка значений в массив*/ i = 0;
do
{
printf("Введите значение температуры t%d,\ для прекращения введите 777: ", i); scanf("%d", &month[i]);
}
while (i < 31 && month[i-1] != 777); /*подсчет среднего арифметического*/ index = 0;
do
{
sum += month[i]; i++;
}
while (i < 31 && month[i-1] != 777); mid = sum / i;
printf("Среднее значение температуры\ составляет: %f\n\n", mid);
}
Новым условием продолжения всех циклов do…while является логическое выражение
(i < 31 && month[i-1] != 777), которое истинно, то есть принимает ненулевое значение, если выполняется одно из условий:
i < 31 или month[i-1] != 777.
Пример: В двумерный массив последовательно записываются числа от 1 до 12. #include <iostream.h>
void main()
{int i,j,mas[3][4],num=1; for (i=0;i<3;i++)
{
for (j=0;j<4;j++,num++)
{mas[i][j]=num;
cout <<mas[i][j]<<'\t';
}
cout<<'\n';
}
}
В двумерном массиве позиция любого элемента определяется двумя индексами. Если представить его в виде матрицы, то один индекс означает строку, другой – столбец. Если доступ к элементам массива предоставлять в порядке, в котором они реально хранятся в памяти, то правый индекс (j) будет изменяться быстрее, чем левый (i).
PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com
5.7. Строка как массив символов
Любая строка текста, например "чижик-пыжик, где ты был?", представляет собой массив символов. Во
внутреннем представлении компилятор завершает такой массив специальным граничным символом "\0", благодаря чему любая программа может легко обнаружить конец строки. Поэтому строка занимает в памяти на один символ больше, чем записано между двойными кавычками. Следует учитывать это обстоятельство при определении длины строки, а именно указывать количество элементов на единицу больше действительной длины строки.
Все правила работы с массивами, рассмотренные ранее, распространяются и на строки, в частности:
∙при определении строки вы присваиваете ей имя и указываете максимальное количество символов, которое может в ней содержаться;
∙нумерация элементов строки, то есть ее символов, начинается с нуля.
Пример: Объявление массива для хранения строки из 10-ти символов. char str[11];
Объявленный размер 11 позволяет сохранить нулевой символ.
Мы с вами уже пользовались строками, при выводе текстов на экран дисплея, например: printf("Hellow, World!"). "Hellow, World!" – это строчная константа или литерал, который всегда записывается в "двойных кавычках". Кавычки не являются частью строки, а служат только для ее ограничения. Компилятор автоматически помещает в конец литерала нулевой символ.
Пример: Внутреннее представление литерала "константа" – это массив символов с нулевым символом в конце.
'к' 'о' 'н' 'с' 'т' 'а' 'н' 'т' 'а' '\0'
Не путайте символьную константу, например 'x', со строкой, содержащей один символ – "x": 'x' – код символа х;
"x" – строка из 2-х символов ('х' '\0').
Литералы можно использовать для инициализации массива типа char, то есть строки текста, например: char str[] = "строка";
После чего элементы строки получают свои начальные значения: str[0] = 'с'
str[1] = 'т' str[2] = 'р' str[3] = 'о' str[4] = 'к' str[5] = 'а' str[6]= '\0'
Средства языка С++ позволяют осуществлять ввод и вывод массива символов как единого целого, в виде строки. В то же время, каждый символ является отдельным независимым элементом массива. В следующем примере мы введем строку, а затем отобразим составляющие ее отдельные символы.
Пример: Ввод и отображение строки. void main()
{
char str[60]; int i;
printf("Введите строку: "); scanf("%s", str);
for (i = 0; i < 60; i++) printf("%c\n", str[i]);
}
Формат %s функии scanf() позволяет вводить строку символов, ввод заканчивается после нажатия клавиши <ENTER>.
%s рассматривает строку как единое целое, поэтому не требует индексации массива str[], напротив формат %c в функции printf() работает с отдельными символами, поэтому требует перебора элементов строки в цикле с индексацией каждого элемента.
Если в действительности было введено меньше 60-ти символов, элементы массива, следующие за нулевым символом, содержат случайные величины.
Пример: Программа вычисляет среднюю (за неделю) температуру воздуха. Исходные данные должны вводиться во время работы программы.
// Вычисление средней (за неделю) температуры воздуха
#include <stdio.h> #include <conio.h>
void main ()
{
PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com
// названия дней недели – мАссив строковых констант char *day[] = {"Понедельник","Вторник","Среда", "Четверг","Пятница","Суббота","Воскресенье"};
float t[7]; // температура
float sum; // сумма температур за неделю float sred; // средняя температура за неделю int i;
printf("\nВведите температуру воздуха:\n"); for (i = 0; i <= 6; i++)
{printf("%s->", day[i]); scanf("%f", &t[i]); sum += t [i]; i
}
sred = sum / 7;
printf("\nСредняя температура за неделю: %2.1f", sred); printf("\nДля завершения работы нажмите <Enter>");
getch();
}
PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com