- •Введение
- •1. Основы алгоритмизации и программирования
- •1.1. Этапы подготовки и решения задач на эвм
- •1.2. Алгоритмы и способы их описания Понятие алгоритма
- •Способы описания алгоритмов
- •Структурные схемы алгоритмов
- •1.3. Компиляция и интерпретация программ
- •1.4. Стили программирования
- •Процедурное программирование
- •Функциональное программирование
- •Логическое программирование
- •Объектно-ориентированное программирование
- •2.1. Пример готовой программы.
- •2.2. Структура основной программы
- •2.3. Алфавит языка
- •2.4. Константы и переменные Константы
- •Переменные
- •Примеры записи имен переменных
- •2.5. Арифметические выражения
- •Примеры вычисления арифметических выражений
- •Стандартные функции
- •Примеры программирования арифметических выражений
- •Контрольные задания
- •1. Составить описания для заданных переменных
- •2.6. Линейные вычислительные процессы
- •Оператор присваивания
- •Странные операторы присваивания
- •Функции ввода-вывода
- •Функции ввода исходных данных с клавиатуры
- •Потоковый ввод данных числового типа
- •Функция форматного ввода
- •Операторы вывода данных на экран Потоковый вывод
- •Форматный вывод
- •Контрольные задания
- •2.7. Разветвляющиеся вычислительные процессы
- •If (логическое выражение) p1; else p2;
- •Логические выражения
- •Порядок выполнения операций в логических выражениях
- •Условные операторы
- •Короткий условный оператор
- •Полный условный оператор
- •If (логическое выражение) { p1;} else {p2;}
- •Вложенные структуры условных операторов
- •Оператор выбора
- •Контрольные задания
- •2.8. Циклические вычислительные процессы
- •Операторы цикла с условием
- •Оператор цикла с параметром
- •2.9. Базовые алгоритмы
- •Задача 1. Алгоритм организации счетчика
- •Задача 2. Алгоритм накопления суммы
- •Задача 3. Алгоритм накопления произведения
- •Задача 4. Алгоритм поиска минимального члена последовательности
- •Задача 5. Табулирование функции (или кратные циклы)
- •Задача 6. Вычисление сумм элементов последовательностей
- •2.10. Указатели и массивы
- •2.10.1. Указатели
- •2.10.2. Понятие массива
- •Одномерные массивы
- •Описание одномерного массива
- •Индексированные переменные
- •Ввод-вывод одномерных массивов
- •Обработка одномерных массивов
- •Задача 1. Организация счетчика
- •Задача 2. Накопление суммы и произведения
- •Задача 3. Поиск минимального и максимального элементов массива
- •Двухмерные массивы
- •Описание двухмерного массива
- •Ввод-вывод двухмерного массива
- •Обработка матриц
- •2.11. Подпрограммы Структура сложной программы
- •Функции
- •Общий вид описания функции
- •Int I,j; //локальные переменные
- •Обращение к функции
- •Пример программы с функцией
- •Механизмы замены параметров
- •Параметры-массивы в функциях
- •Возвращение результатов
- •Примеры программирования задач с использованием подпрограмм Задача 1
- •Рекурсия
- •Технология сборки библиотеки
- •2.12. Текстовые данные
- •Символьный тип данных
- •Ввод-вывод символьных данных
- •Обработка символьных данных
- •Ввод-вывод строковых данных
- •Обработка строковых данных
- •Стандартные функции обработки строк
- •Сравнение строк:
- •Сцепление строк
- •Определение длины строки
- •Копирование строк
- •Поиск символа в стоке
- •Пример программы для задачи с текстовыми данными
- •Контрольные задания
- •2.13. Динамическое выделение памяти
- •Использование оператора new
- •Освобождение памяти
- •Структуры данных Понятие структуры
- •Обработка структур
- •Пример задачи с использованием структурированных данных
- •2.15. Файлы данных
- •2.15.1. Работа с файлами в стиле с
- •Объявление файловой переменной
- •Открытие файла
- •Закрытие файла
- •// Обработка открытого файла
- •Обработка открытого файла
- •Функции ввода/вывода
- •Работа с текстовыми файлами
- •Обработка бинарных файлов
- •Контрольные задания
- •Заключение
- •Оглавление
- •Литература
- •Приложение
Сцепление строк
strcat(str1,str2) - сцепление строк в порядке их перечисления.
strncat(str1,str2,kol) – приписывает kol символов строки str2 к строке str1.
Функция служит для объединения двух строк в одну. Например, в результате выполнения операторов:
char fam[] = "Андреев С.В.";
char pr[17]= " -студент СИБГУТИ ";
strcat(fam ,pr);
printf("|%32s|", fam);
на экран будет выведена строка:
|Андреев С.В. -студент СИБГУТИ |
Заметим, что строка вывода занимает поле в 32 позиции, а переменная fam располагается в левой части этого поля.
Определение длины строки
strlen(str) – определяет длину строки str.
Пример. Определить длину строки
char fam[] = "Андреева С.В.";
printf("%d",strlen(fam));
функция strlen() вернёт значение равное 13 (символов).
Копирование строк
strcpy(str1,str2) – копирует строку str2 в строку str1.
strncpy(str1, str2, kol) – копирует kol символов строки str2 в строку str1.
Пример. Скопировать фамилию сотрудника в переменную fam и вывести на экран.
#include "stdafx.h"
#include<string.h>
int main()
{ char fam[15];
char *str = " Андреева С.В.";
strcpy(fam, str);
printf("|%s|\n", fam);
return 0;
}
В результате выполнения данных операторов на экран будет выведена строка:
|Андреева С.В.|
Поиск символа в стоке
strchr(st, ch) - функция поиска адреса символа ch в строке st. Результатом выполнения поиска является адрес найденного символа в строке st, иначе возвращается нулевой адрес. Чтобы вычислить порядковый номер символа ch в строке, можно из найденного адреса вычесть адрес начала строки.
Пример. В заданной фамилии определить порядковый номер символа ‘n’.
#include "stdafx.h"
#include<string.h>
int main()
{ char fam[] = "Ivanov";//задание фамилии
char faml[20];
char a='n';// искомый символ
char *p;
p=strchr(fam,a);//поиск символа в фамилии
if(p)
printf("|%s|%d\n", fam, p-fam);/*вывод фамилии и порядкового номера символа n в ней */
else
printf("нет такого символа в фамилии!\n");
return 0;
}
Пример программы для задачи с текстовыми данными
Исходным текстом является предложение, заканчивающееся точкой. Слова в предложении отделяются друг от друга одним пробелом. Определить самое длинное слово в предложении.
#include "stdafx.h"
#include<string.h>
int main()
{ char slovo[12],X[120]; // описание массивов для предложений
int i,m=0,n,k=0,dl;
gets(X); // ввод исходного предложения в X
dl= strlen(X);// определяем длину введенного предложения
for(i=0; i<dl; i++) //цикл от начала до конца строки X
if(X[i]!=' ') k++; // считаем символы до пробела
else // если дошли до пробела
{ if (k>m) //поиск мах значения счетчика к
{ m=k; // запоминаем длину текущего длинного слова
n=i; // запоминаем номер пробела, идущего за длинным словом
}
k=0; //обнуляем счетчик для нового слова предложения Х
}
k=0;
for(i=n-m;i<n;i++)//выбор из строки X самого длинного слова в массив slovo
slovo[k++]=X[i];
slovo[k]=0; //ставим в массиве slovo признак конца текста
printf("%s\n",slovo); //вывод найденного длинного слова
printf("%d\n",strlen(slovo));//вывод его длины
return 0;
}
Более полный перечень функций работы со строками и символами смотрите в приложении А. Эти функции позволяют достичь высокой эффективности работы программы, использующей их. Но они весьма неудобны и небезопасны в использовании, поскольку выход за границы строкового массива не проверяется.
Библиотека языка С++: Тип данных string стандартной библиотеки языка С++ лишен этих недостатков. С помощью операций и методов этой библиотеки длина строки может динамически меняться в соответствии с потребностями. Для использования класса string к программе надо подключить заголовочный файл <string>.
Для создания строки типа string определено несколько конструкторов. Приведем примеры создания строк:
string s1; //создание пустой строки
string s2("Привет"); //создание строки со значением Привет
string s3(s2); //создание строки s3 со значением строки s2;
К строке типа string можно применять операции старого стиля, например:
s1=’X’; // присвоение строке s1 значения символа Х
s1="ура"; //запись в строку s1 слово ура.
s2=s1; //присвоение значения строке s2 значения строки s1
Над объектами класса string допустимы операции:
операция |
действие |
операция |
действие |
= |
присваивание |
> |
больше |
+ |
конкатенация |
>= |
больше либо равно |
= = |
сравнение на равенство |
[ ] |
индексация |
!= |
неравенство |
<< |
потоковый вывод |
< |
меньше |
>> |
потоковый ввод |
<= |
меньше либо равно |
+= |
добавление |
Для работы со строками этих операций недостаточно. Для работы со строками целиком и для обработки частей строк в классе string определено множество разнообразных методов (функций). Библиотека С++ содержит функции присваивания части одной строки другой строке (assing), добавления части одной строки к другой строке (append),вставки в одну строку части другой строки (insert), очистки строки (clear), выделения части строки (substr), поиск подстроки в строке (find), сравнение частей строк (compare), получение характеристик строк: определение количества элементов строки (size или length), максимальная длина строки (max_size), определение, является ли строка пустой (empty). Наиболее употребительные из них описаны в библиотеке <string> приложения А.
Рассмотрим пример обработки строк с использованием средств языка С и библиотеки языка С++.
Вариант использования средств языка С:
#include "stdafx.h"
#include<string.h>
#include "iostream"
using namespace std;
int main()
{ setlocale(0,"RUS");
char С1[50],С2[50],С3[50]= "";//строки с завершающим нулем
char *flag;
//Заполняем массивы исходной информацией
strcpy(С1,"Миру ");
strcpy(С2,"Мир! ");
//Объединяем массивы С1 и С2 в массив С3
strcat(С3,С1);
strcat(С3,С2);
cout<< С3<<endl;
// Сравниваем массив С1 с С2
if (strcmp(С1,С2) < 0 ) cout<< С1; else cout <<С2;
//поиск в строке С3 подстроки ”Ми”
flag=strstr(С3, "Ми");
if(flag)
printf("\nтакая подстрока есть\n");
else
printf("\nнет такой подстроки\n");
return 0;
}
Напишем эту же программу средствами библиотеки С++
#include "stdafx.h"
#include<string>
#include "iostream"
using namespace std;
int main()
{ setlocale(0,"RUS");
string С1,С2,С3; //строки
С1="Миру ";
С2="Мир! ";
//объединение строк
С3=С1+С2;
cout << С3<<endl;
// Сравнение строк
if (С1 < С2) cout<< С1; else cout << С2;
// Поиск в строке С1 подстроки "Ми"
int flag = С1.find("Ми");
if(flag>=0)
printf("\nтакая подстрока есть\n");
else
printf("\nнет такой подстроки\n");
return 0;
}
Не надо искать смысл в написанных программах. Они написаны только для того, чтобы сравнить запись одних и тех же действий, средствами языка С и языка С++. Как видно из примера, выполнение любых действий со строками старого стиля менее наглядно. Кроме того, необходимо проверять, достаточно ли места в строке-приемнике при копировании, то есть фактически код работы со строками старого стиля должен быть еще более длинным.