- •Экзаменационные вопросы по дисциплине
- •«Программирование на языках высокого уровня»
- •Среда программирования языка Си.
- •Алфавит языка.
- •Данные и типы данных в Си.
- •Int (целый);
- •Константы и переменные.
- •Перечень операций в Си. Приоритет операций.
- •Структура программы.
- •Int scanf(char *управляющая строка);
- •Массивы в Си.
- •Массивы указателей. Массивы динамической памяти.
- •Представление символа и строки в памяти эвм. Ввод-вывод символов и строк.
- •Понятие функции в Си. Определение и описание. Вызов функции.
- •Передача параметров функции по значению.
- •Передача параметров функции по ссылке.
- •Рекурсивные функции.
- •Определение структур. Инициализация и присваивание структур.
- •Доступ к элементам структур
- •Двоичный режим обмена с файлами. Строковый обмен с файлами.
- •Использование макросов в Си.
Int scanf(char *управляющая строка);
Функция возвращает число переменных которым было присвоено значение.
Управляющая строка содержит три вида символов: спецификаторы формата, пробелы и другие символы. Спецификаторы формата начинаются с символа %.
Спецификаторы формата:
%c чтение символа
%d чтение десятичного целого
%i чтение десятичного целого
%e чтение числа типа float (плавающая запятая)
%h чтение short int
%o чтение восьмеричного числа
%s чтение строки
%x чтение шестнадцатеричного числа
%p чтение указателя
%n чтение указателя в увеличенном формате
При вводе строки с помощью функции scanf() (спецификатор формата %s), строка вводиться до первого пробела!! т.е. если вы вводите строку "Привет мир!" с использованием функции scanf()
char str[80]; // массив на 80 символов
scanf("%s",str);
то после ввода результирующая строка, которая будет храниться в массиве str будет состоять из одного слова "Привет". ФУНКЦИЯ ВВОДИТ СТРОКУ ДО ПЕРВОГО ПРОБЕЛА! Если вы хотите вводить строки с пробелами, то используйте функцию
char *gets( char *buf );
С помощью функции gets() вы сможете вводить полноценные строки. Функция gets() читает символы с клавиатуры до появления символа новой строки (\n). Сам символ новой строки появляется, когда вы нажимаете клавишу enter. Функция возвращает указатель на buf. buf - буфер (память) для вводимой строки.
Хотя gets() не входит в тему этой статьи, но всё же давайте напишем пример программы, которая позволяет ввести целую строку с клавиатуры и вывести её на экран.
#include <stdio.h>
void main(void)
{
char buffer[100]; // массив (буфер) для вводимой строки
gets(buffer); // вводим строку и нажимаем enter
printf("%s",buffer); // вывод введённой строки на экран
}
Ещё одно важное замечание! Для ввода данных с помощью функции scanf(), ей в качестве параметров нужно передавать адреса переменных, а не сами переменные. Чтобы получить адрес переменной, нужно поставить перед именем переменной знак &(амперсанд). Знак & означает взятие адреса.
Что значит адрес? Попробую объяснить. В программе у нас есть переменная. Переменная хранит своё значение в памяти компьютера. Так вот адрес, который мы получаем с помощью & это адрес в памяти компьютера где храниться значение переменной.
Классификация операторов. Условный оператор. Оператор безусловного перехода.
Условный оператор
if (условие)
{блок из одного или более операторов}
Если условие верно, то выполняется блок из одного или более операторов
Второй вариант:
if (условие)
{блок 1 из одного или более операторов}
else
{блок 2 из одного или более операторов}
Если условие верно, то выполняется блок 1 из одного или более операторов, а если не верно, то блок 2.
Пример 1.
if (a>b)
ans=10;
else
ans=25;
Если а>b, то переменная ans получается значение 10, иначе - значение 0.
Пример 2.
if ( age <18)
{
cout <<"Вы несовершеннолетний. \n";
cout <<"Введите ваш возраст";
cin>> grade;
}
Если переменная age<18 , то запрашивается возраст и заносится в переменную grade.
Оператор while
Цикл while - цикл с неизвестным числом повторений
while (условие)
{блок из одного или нескольких операторов}
Если условие истинно (принимает не нулевое значение), то выполняется блок из одного или нескольких операторов и происходит возврат на проверку условия. Если условие ложно, происходит выход из цикла. Условие может быть составлено из нескольких выражений, с использованием || (логическое сложение "или") и &&(логическое умножение "и")
Пример 1.
char ans ='Y';
longint a==l;
while ( (ans ='Y') || (ans='y') )
{a*=a+l;
cout <<"\n"<< a;
cout <<"\n\t" <<" Для продолжения введите Y, для окончания N ";
cin >> ans;
}
ans описывается как символ, а - как целое длинное. Если пользователь вводит 'Y' или'у', то выполняются блок операторов в фигурных скобках.
Прокомментируйте операторы в фигурных скобках.
Оператор while удобно использовать для проверки ввода пользователя.
Оператор do...while
do...while - это цикл с постусловием.
Цикл do ... while - цикл с неизвестным числом повторений. В отличие от цикла while условие проверяется в конце цикла. Поэтому тело цикла выполняется хотя бы один раз
do
{блок из одного или нескольких операторов}
while (условие)
Пример 1.
char ans 'Y';
longint a=l;
do
{a*=a+l;
cout <<"\n" << a;
cout << "\n\t" <<" Для продолжения введите Y, для окончания N " ;
cin>> ans;
}
while ((ans ='Y') || (ans='y') ) ;
Операторы exit(). break continue
В C++ предусмотрена возможность досрочного выхода из программы до ее нормального завершения с помощью функции exit().
Формат:
exit(статус);
где статус - переменная или константа типа int - код завершения. В соответствии с кодом завершения устанавливается переменная окружения, уровень ошибки (ERRORLEVEL) операционной системы. Этот код завершения может проверяться в командных файлах.
Обычно оператор exit ставиться в теле оператора if, чтобы закончить программу, в зависимости от результата проверки условия. При использовании exit необходимо указывать заголовочный файл stdlib.h
Команда break используется для выхода из текущего цикла.
Команда break может находиться в любом месте программы, однако обычно break ставиться в теле операторов while или do... while.
Пример 1.
#include < iostream.h >
#include < stdlib.h >
main()
{exit(0); //заставляет программу завершиться в этом месте
cout <<" С помощью C++ можно составлять высоко эффективные программы. \n";
cout <<" Удачи Вам. \n";
return 0;
}
На первый взгляд кажется, что эта программа выдаст на экран несколько сообщений.
Но это заблуждение, т.к. функция exit в начале программы приведет к ее прерыванию.
Пример 2.
#include <iostream.h>
#include <stdlib.h>
// Проверка пароля, пользователю предоставляется 3 попытки.
main()
{
int nash_p=4321; // пароль int k=0; // количество попыток
int ego_p; // пароль введенный пользователем
do
{
cout <<"Введите пароль \n";
cin>> ego_p;
k++;
if (ego_p=nash_p)
{
cout <<"\n\nДобро пожаловать в программу !! ";
exit(0);
}
else
{
(k<3) ? (cout <<"\n Пароль не верен !!\n Попробуйте еще раз !! ");
(cout <<"\n Пароль не верен !!");
}
}
while (k<3);
return 0;
}
Если пользователь ввел верный пароль, программа заканчивает свою работу с кодом завершения 0. В противном случае выдается сообщение о неверном пароле.
Оператор continue прерывает выполнение очередного шага цикла и заставляет компьютер начать выполнять новый шаг цикла. Если Вы поместите оператор continue в цикл for или while, компьютер будет игнорировать все операторы, следующие в теле цикла после continue.
Формат оператора:
continue;
Обычно оператор continue используется, если данные, обрабатываемые в теле цикла неверны, выходят за допустимые пределы или имеют непредвиденные значения. Вместо обработки некорректных данных, вы можете захотеть вернуться к началу цикла, чтобы получить другое значение
Пример.
// Вычисление средней зарплаты, зарплаты меньше 500 не учитываются
#include < iostream.h >
main()
{
float sr_zarp=0,zarp; // средняя заработная плата, текущая заработная плата
int kol=0; // количество
do
{
cout<<"Введите зарплату \n";
cout<<"(для окончания введите значение -1) :\n";
cin>> zarp;
if ( zarp<0 )
break;
if ( zarp<500 )
continue;
else
{
sr_zarp+=zarp;
kol++;
}
while (1= =1); // Бесконечный цикл
s_zarp/=floa_kol;
cout <<"Средняя зарплата=" << sr_zarp;
}
Прокомментируйте программу. Что произойдет если ввести зарплату -550, 230?
Оператор for
for - оператор цикла с известным числом повторений.
Формат:
for (начальное выражение; контрольное выражение ; счетчик)
{блок из одного или нескольких операторов}
Оператор for работает следующим образом:
Перед выполнением цикла вычисляется начальное выражение.
Проверяется контрольное выражение.
Если контрольное выражение истинное, то выполняется блок из одного или нескольких операторов, рассчитывается выражение счетчик, возврат к пункту 2.
А если ложно, то оператор for заканчивает свою работу.
Пример 1.
// Программа выдает на экран числа от 1 до 10
#include <iostream.h>
main()
{
int i;
for (i=l; i<=10, i++)
{ cout << i <<"\n"; }
}
Пример 2.
// Сложение чисел от а до b
#include <iostream.h>
main()
{ int a,b,i;
long int s=0;
cout <<Введите a \n";
cin>> a;
cout <<"Введите b \n";
cin>> b;
if(a>b)
{ cout <<"a>b"; }
else
{
for (i=a; i<=b; i++)
s+=i;
cout <<"\nСумма=" << s;
}
return 0;
}
Прокомментируйте программу. Что произойдет, если b окажется больше чем а? Какое выражение вычисляется в качестве счетчика, начального выражения, контрольного выражения?
В качестве начального выражения можно использовать несколько операторов, их нужно разделять запятыми. В примере занесем s=0 в начальное выражение:
for (i=a, s=0; i>=b; i++)
s+=i;
Оператор switch
Оператор switch - оператор выбора.
Формат:
switch (выражение)
case (выражение 1):
блок из одного или нескольких операторов 1;
break;
case (выражение2):
блок из одного или нескольких операторов 2;
break;
case (выражениеЗ):
блок из одного или нескольких операторов 3;
break;
default:
блок из одного или нескольких операторов n;
break;
}
Выражением могут быть любое выражение, константа или переменная типа int или char.
Оператор switch используется вместо нескольких операторов if else.
Если выражение принимает значение выражение1, то выполняется блок из одного или нескольких операторов 1, если выражение принимает значение выражение2, то выполняется блок из одного или нескольких операторов 2, и т.д. Если выражение не совпадет ни с выражением под номером, то выполняется блок из одного или нескольких операторов n.
Операторы безусловного перехода
Безусловный переход в языке C# организован в двух видах: вызов процедуры и переход по метке. В первом случае компилятор переходит к выполнению кода из процедуры при встрече её имени, а возвращается только после окончания выполнения процедуры. Во-втором же случае переход осуществляется при встрече специальных команд: goto, break, continue, return, throw. Эти команды рассмотрим подробно чуть ниже.
Строка default - необязательная и может отсутствовать.
Составной оператор. Операторы цикла в Си.
В языке Си составной оператор ограничивается фигурными скобками, что сокращает текст программы, но принципиально не отличается от Паскаля и Алгола:
if (условие)
{ // начало составного оператора
... // несколько операторов
} // конец составного оператора
else
{ // начало составного оператора
... // несколько операторов
} // конец составного оператора
Операторы break и continue. Оператор выбора (оператор - переключатель).
Часто при вознекновении некоторого события удобно иметь возможность досрочно завершить цикл. Используемый для этой цели оператор break (разрыв) вызывает немедленный выход из циклов, организуемых с помощью операторов for, while, do-while, а также прекращение оператора switch. Приведенная ниже программа обеспечивает поиск в заданном иассиве элемента, равного g (пример 4.9). В случае обнаружения такого элемента оператор break прекращает дальнейшее выполнение цикла. Так как параметр i сохраняет значение после выхода из цикла, то дальнейший анализ его значения (if(i==n)) позволяет судить об удачном (i<=n) илинеудачном (i==n) поиске. В случае вложенных циклов оператор break немедленно прекращает выполнение самого внутреннего из объемлющих его циклов.
switch
Это еще один вид оператора условия ( выбора ). Его лучше использовать если, допустим, нам надо вывести дни недели, т.е. когда у нас не одно, а множество условий выбора. Поэтому буду называть эту структуру - оператор выбора while. Вот его синтаксис:
switch( определенное значение) {
case значение1: //тело
break;
...
...
case значениеN: //тело
break;
default: // тело
}
определенное значение
Значение, которое является можно сказать меткой, т.е. именно его будет находить наша программа в теле оператора выбора switch
case
Таких операторов выбора case может быть очень много, так как это просто различные варианты значений. Но работать будет именно тот оператор case, который будет равен нашему "определенному значению"
default
Оператор выбора default будет выполняться, если ни один из операторов выбора case не содержит нужного числа. Т.е. если ничего не совпало с "определенным значением", то будет выполняться оператор по умолчанию - default. Да, и двоеточие в конце операторов case значение: и default: являются обязательными
break
Оператор break является своего рода остановкой выполнения условия, т.е. с помощью него мы сразу же завершаем выполнение нашего оператора выбора и дальше продолжаем выполнение программы.
Но вы можете не доумевать; зачем пользоваться оператор break, когда оператор выбора и без него сам завершит свою работу. Это ж даже не цикл, здесь необязательно, как бы принудительно, завершать процесс, но есть одно но. И это Но давайте рассмотрим на примере:
int znachenie = 1;
switch( znachenie ) {
case 1:
printf("Значение 1");
case 2:
printf("Значение 2");
default:
printf("Другое значение!");
}
По логике, да и по выше описанному материалу, на экране должно появиться сообщение: Значение 1. Но так как мы взяли и опустили оператор break, то на экране появится: Значение 1 Значение 2 Другое значение.
Т.е. из-за того, что нет оператора прерывания, оператор ( функция ) выбора switch, найдя нужное значение в операторах case, далее будет выполняться все подряд. Поэтому не забывайте вставлять в противовес каждому оператору case оператор break
Так же надо отметить, что в качестве определенно значения могут использоваться и символы, это не запрещено, только надо их брать в одинарные кавычки. Например: 'd'
