Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Программирование на языке С++. Учебное пособие
.pdf
51
Стандартные функции для работы со строками
strlen
#include <string.h> // требуется только для объявления функции
Cинтаксис: int strlen(имя_Строки).
Семантика.
Функция strlen возвращает в байтах лину троки,
причем нулевой символ окончания ('\0') в длину не засчитывается.
Пример:
char a[10]=«hello»;
b=strlen(a); /* b = 5 */
strcpy
Синтаксис: strcpy(имя_cтроки1, имя_cтроки2).
Семантика.
Копирует строку cтрока 1 в строку cтрока 2.
strncpy
Синтаксис: strncpy( имя_cтроки1, имя_cтроки2,n).
Семантика.
Функция strncpy копирует точно n символов строки cтрока2 к
строке cтрока1 и возвращает Строка1. Если n меньше, чем длина
cтрока2, нулевой символ окончания ('0') автоматически не добавля-
ется к копируемой строке. Если n больше, чем длина cтрока2, ре-
зультат cтрока1 заполняется нулевыми символами, вплоть до дости-
жения длины n.
Пример:
// strncpy
int main()
{
char str1[15];
char str2[]=«Informatica»;
strncpy(str1,str2,4);
cout << «str1=« << str1 << endl; //Info
getch();
return 0;
}
strcmp
Синтаксис: int strcmp (имя_cтрока1, имя_cтрока2).
Семантика.
Сравнивает строки cтрока1 и cтрока2.
Возвращает 0, если строки равны;
Возвращает -1, если cтрока1 < cтрока2;
Возвращает 1, если cтрока1 > cтрока2.

52
cin.getline
Синтаксис: cin.getline(имя_cтроки,количество_символов,символ).
Семантика.
Служит для ввода с клавиатуры символов с максимальной
длиной(количество_символов)-1.
Если количество символов превышает (количество_символов)-1,
после нажатия на клавишу Enter введутся
точно(количество_символов)-1.
Если указали (символ), то будут введены только символы до
первого вхождения символа в строку.
strcat
Синтаксис: strcat(имя_cтрока1,имя_cтрока2)
Семантика: strcat(имя_cтрока1,имя_cтрока2) объединяет строку cтрока1
со строкой cтрока2.
Результат сохраняется в cтрока1.
int main(void)
{
char str1[20], str2[20];
cin.getline(str1,10);
cin.getline(str2,10);
strcat(str1, str2) ;
cout<<str1;
getch();
return 0;
}
7.4. СТРУКТУРЫ
Структура — это объединение одного или нескольких объектов (перемен-
ных, массивов, указателей, других структур и т.д.). Как и массив, она представляет
собой совокупность данных. Отличием является то, что к ее элементам необходимо обращаться по имени и что различные элементы структуры не обязательно
должны принадлежать одному типу.
Синтаксис:
struct имя_структуры
{
тип_поля_1 имя_поля_1;
.........
тип_поля_n имя_поля_n;
};

53
где:
struct — служебное слово в С++;
имя_структуры — любой идентификатор;
тип_поля1...n — переменные произвольного типа.
Рассмотрим примеры:
struct Rational
{
int number;
int denom;
}
struct Student
{
char first_name[20];
char second_name[20];
char last_name[20];
char num[11];
double sr_ball;
}
Описание без последующего списка не выделяет никакой памяти; оно про-
сто задает форму структуры.
Объявление переменной типа структуры
Определенный выше тип struct Student включает пять элементов:
first_name; second_name, last_name, num, sr_ball.
Первые четыре — это символьные массивы.
Элемент sr_ball содержит значения типа double.
Введенное имя типа позже можно использовать для объявления переменной.
Пример: Student person;
Инициализация переменной типа структуры
При необходимости структуры можно инициализировать, помещая вслед за
описанием список начальных значений элементов. Например:
Student person={«Ivan»,»Ivanovich»,»Ivanov»,45678,5.3};
Доступ к элементам структуры
Чтобы обратиться к отдельному элементу структуры, необходимо указать
его имя, поставить точку и сразу же за ней записать имя нужного элемента,
например: person.first_name.

54
Задача 1.
Описать структуру с именем Student, содержащую следующие поля: фамилия, имя, отчество, номер зачетной книжки и средний балл. Объявить переменную
а (структурного типа) и инициализировать поля с подходящими значениями.
Решение:
#include<iostream>
#include<conio.h>
using namespace std;
struct Student
{
char first_name[20];
char second_name[20];
char last_name[20];
char num[11];
double sr_ball;
};
int main()
{
/*декларация и инициализация
переменной а*/
Student a={«Иван»,»Иванович»,»Иванов»,»345678»,5.80};
cout<<a.first_name<<endl;
cout<<a.second_name<<endl;
cout<<a.last_name<<endl;
cout<<a.num<<endl;
cout<<a.sr_ball<<endl;
getch();
return 0;
}
7.5. ФАЙЛЫ
Каждая программа обрабатывает какую-либо информацию и выводит ре-
зультаты, вследствие этой обработки. Обычно информация вводится с клавиатуры
и выводится на экран монитора. Введенная информация располагается в ОП и те-
ряется после выключения компьютера.
Если нужно сохранить данные для дополнительного использования и обра-
ботки, нужно их сохранить в виде файла.
Файл — конечная последовательность байтов, расположенных на внешнем
носителе и заканчивающаяся символом конец файла.
В С++ байты пронумерованы, нумерация байт начинается с нуля.
Для работы с файлами используются специальные типы данных, называемые потоками. Поток ifstream служит для работы с файлами в режиме чтения, а
ofstream в режиме записи. Для работы с файлами в режиме, как записи, так и чтения служит поток fstream.
Файлы позволяют пользователю считывать большие объемы данных непо-
средственно с диска, не вводя их с клавиатуры. Существуют два основных типа
файлов: текстовые и двоичные.

55
Текстовыми называются файлы, состоящие из любых символов. Они орга-
низуются по строкам, каждая из которых заканчивается символом «конца строки».
Конец самого файла обозначается символом «конца файла». При записи информа-
ции в текстовый файл, просмотреть который можно с помощью любого текстового
редактора, все данные преобразуются к символьному типу и хранятся в символь-
ном виде.
В двоичных файлах информация считывается и записывается в виде блоков
определенного размера, в которых могут храниться данные любого вида и структуры.
В программах на C++ при работе с текстовыми файлами необходимо под-
ключать библиотеки iostream и fstream.
Таблица 1
Режимы открытия и их назначение
Режим открытия
Назначение
ios::in
Открыть файл в режиме чтения данных;
ios::out
Открыть файл в режиме записи данных (при этом информация
о существующем файле уничтожается);
ios::ate
Передвинуться в конец уже открытого файла;
ios::app
Открыть файл в режиме записи данных в конец файла;
ios::trunc
Очистить файл, это же происходит в режиме ios::out;
ios::binary
Двоичный режим операций
ios::nocreate
Не выполнять операцию открытия файла, если он не суще-
ствует;
Открытие файла для записи
Для того чтобы открыть файл для записи, необходимо:
• описать переменную типа ofstream;
• открыть файл;
• вывести информацию в файл;
• обязательно закрыть файл.
Объявление переменной (объекта) для связи с файлом
Синтаксис: ofstream _f;
Семантика: объявляется переменная f для записи информации в файл.
Открытие файла для записи через уже объявленную переменную
Синтаксис:
• f.open(name_file,режим_записи);где: name_file — строка, задающая имя
файла и путь до файла;

56
• если указанно только имя файла, то по умолчанию подразумевается теку-
щая директория;
• режим_записи — один из режимов указанных в таблице 1. По умолчанию:
ios::out.
Семантика.
Открывается для записи файл с именем name_file. При режиме ios::out, если
файл существует, информация полностью уничтожается и записывается новая.
Если не существует, создается новый пустой файл.
Закрытие файла, открытого для записи
Синтаксис: f.close();.
Семантика: закрытие файла.
Примеры:
Ofstream myFile; //Объявляется переменная myFile
myFile.open («test.txt»); /* открывается для записи файл «test.txt» в текущей директории*/
Ofstream file; // Объявляется переменная file
file.open («C:/test.txt»); /* открывается для записи файл «test.txt» в главной директории
С:*/
....
file.close();//закрытие файла
Открытие файла для чтения
Для того чтобы открыть файл для записи, необходимо:
• описать переменную типа ifstream;
• открыть файл;
• закрыть файл.
Объявление переменной (объекта) для связи с файлом
Синтаксис: ifstream _f.
Семантика: объявляется переменная f для открытия файла для чтения.
Открытие файла для чтения через уже объявленную переменную
Синтаксис: f.open(name_file,режим_записи), где:
name_file — строка, задающая имя файла и путь до файла;
режим_записи — один из режимов указанных в таблице 1. По умолчанию:
ios::in.
Семантика: открывается для записи файл с именем name_file.
Если файл не существует, создается новый пустой файл.
Закрытие файла, открытого для чтения
Синтаксис: f.close().
Семантика: закрытие файла.

57
Открытие файла для записи и чтения
Для того чтобы открыть файл для чтения и записи, необходимо:
• описать переменную типа fstream;
• открыть файл для записи/чтения;
• выполнить действия записи/чтения;
• закрыть файл.
Объявление переменной (объекта) для связи с файлом
Синтаксис: ifstream _f;
Семантика: объявляется переменная f для открытия файла для чтения
и записи.
Открытие файла для чтения через уже объявленную переменную
Синтаксис: f.open(name_file,режим_чтения|режим_записи), где:
name_file — строка, задающая имя файла;
name_file,режим_чтения|режим_записи — режимы из указанных в табл. 1.
Семантика: открытие файла для записи / чтения.
Закрытие файла, открытого для записи
Синтаксис: f.close();
Семантика: закрытие файла.

58
8. ЗАДАЧИ
8.1. ЛИНЕЙНЫЕ АЛГОРИТМЫ
Задача 1. Напишите программу, запрашивающую у пользователя целое по-
ложительное трехзначное число и выводящую на экран:
#include<iostream>
#include<conio.h>
int main()
{
int x,a,b,c,s,p;
cout<<«x»;
cin>>x;
a=x/100;
b=x/10%10;
c=x%10;
s=a+b+c;
p=a*b*c;
cout<<«sum=«<<endl;
cout<<«pr=«<<endl;
getch();
return 0;
}
Задача 2. Составить программу, которая вводит с клавиатуры целое положи-
тельное пятизначное число и выводит количество нечетных цифр данного числа.
#include<iostream>
#include<conio.h>
int main()
{
unsigned long a;
int c1,c2,c3,c4,c5,k;
cout << «Введите пятизначное число»;
cin >> a;
c1=x/10000;
c2=x/10%10;
c3=x/100%10;
c4=x/1000%10;
c5=x%10;
k=c1%2+c2%2+c3%2+c4%2+c5%2;
cout<<«количество нечетных цифр=«<<k<<endl;
getch();
return 0;
}
Задачи для самостоятельного выполнения
Задача 1. Напишите программу, запрашивающую у пользователя целое по-
ложительное четырехзначное число и выводящую на экран:
• сумму цифр числа;
• произведение цифр числа.

59
Решение:
#include<iostream>
#include<conio.h>
using namespace std;
int main()
{
int x,a,b,c,d,s,p;
cout << «Введите четырехзначное число»;
cin >> x;
a=x/1000;
b=x/100%10;
c=x/10%10;
d=x%10;
s=a+b+c+d;
p=a*b*c*d;
cout << «Сумму цифр числа=« << s << endl;
cout << «Произведение цифр числа=« << p << endl;
getch();
return 0;
}
Замечание:
Число является симметричным, если запись числа слева направо и справа
налево читается одинаково.
8.2. ОПЕРАТОРЫ ВЕТВЛЕНИЯ
Задача 1. Составить программу, которая ввводит с клавиатуры два действи-
тельныx числа x и y.Если x<0, вывести на экран наибольшее из двух чисел, в про-
тивном случае наименьшее из них.
#include<iostream>
#include<conio.h>
int main()
{
float x,y,max,min;
cout<<Введите число x=«<<endl;
cin>>x;
cout<<«Введите число y=«<<endl;
cin>>y;
max=x;
min=y;
if (x<y)
{
max=y;
min=x;
}
if (x<0) cout<<max<<endl;
else cout<<min<<endl;
getch();
return 0;
}

60
Задача 2. Напишите программу, запрашивающую у пользователя целое че-
тырехзначное число. Определить является ли число симметричным.
#include<iostream>
#include<conio.h>
int main()
{
int x;
cout<<«Введите четырехзначное число x=«;
cinx>>x;
if ((x%10==x/1000)&&(x/10%10==x/100%10))
cout<<«Yes»<<endl;
else
cout<<«No»<<endl;
getch();
return 0;
}
Задача 3. Напишите программу, запрашивающую у пользователя целое
трехзначное число n (без цифры 0). Определить кратно ли число каждой своей
цифре. Если сумма кратна, вывести «YES» и сумму цифр данного числа,в противном случае «NO» и произведение цифр этого числа.
#include<iostream>
#include<conio.h>
int main()
{
int x,a,b,c;
cout<<«Введите трехзначное число без цифры 0»;
cin>>x;
a=x/100;
b=x/10%10;
c=x%10;
if (x%a==0&&x%b==0&&x%c==0)
cout<<«YES»<<a+b+c<<endl;
else cout<<«NO»<<a*b*c<<endl;
getch();
return 0;
}
Задача 4. Составить программу, которая вводит с клавиаруты три действи-
тельных числа a, b, c. Определить, существует ли треугольник со сторонами длиной a, b, c и, если существует, то найти его периметр и площадь.
#include<iostream>
#include<conio.h>
#include<math.h>
int main()
{
double a,b,c,p,pp,s;
cout<<«Введите стороны треугольника»;
cout<<«a=«;
cin>>a;
cout<<«b=«;
cin>>b;
cout<<«c=«;
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
