
- •1. Основные этапы решения задач на эвм
- •Формулировка задачи
- •Математическая постановка задачи
- •Разработка алгоритма решения задачи
- •Написание текста программы на языке программирования
- •Ввод текста программы в эвм
- •Поиск и устранение синтаксических ошибок
- •Тестирование программы. Поиск и устранение логических ошибок в программе
- •Этапы создания исполняемой программы
- •Базовые компоненты программ
- •Буквы и цифры
- •Пробельные символы
- •Знаки пунктуации и специальные символы
- •Идентификаторы
- •Ключевые слова
- •Комментарии
- •Лексемы
- •Типы данных
- •Целые константы
- •Константы с плавающей точкой
- •Константа-символ
- •Строковые литералы
- •Универсальные функции ввода и вывода любых типов данных
- •Структуры и форма написания программы
- •Программирование разветвляющихся вычислительных процессов
- •Цикл while – цикл с предусловием.
- •Цикл do while – цикл с постусловием
- •Цикл for
- •Безусловная передача управления внутри цикла
- •Описание некоторых стандартов алгоритмов
- •Работа с файлами (функции ввода вывода верхнего уровня)
- •Указатели
- •Одномерные массивы Объявление массива.
- •Стандартные функции обработки строк
- •Многомерные массивы на примере двумерных
- •Классы памяти
- •Способы передачи данных в функцию
- •Функции и строки
- •Функции и одномерные числовые массивы
- •Функции и двумерные массивы
- •Функции с параметрами по умолчанию
- •Перегрузка функции
- •Шаблоны функции
- •Типы данных, определяемые пользователем
- •4.1. Структуры
- •Шаблон структуры
- •Структурные переменные
- •Инициализация структуры
- •Доступ к полям структуры
- •Массив структур
- •Вложенные структуры
- •Битовые поля структур
- •Передача структуры в функцию
- •Двоичный ввод-вывод структур
- •Функции двоичного ввода-вывода
- •Динамические структуры данных
- •4.2. Объединения
- •4.3. Перечисления
- •Файловые операции ввода/вывода
- •Файловый ввод/вывод с прямым доступом
Функции и строки
Любая строка определяется одним данным – адресом начала строки. Чтобы передать строку, надо знать адрес этой строки. Следовательно, для передачи строки в функцию требуется передать адрес начала строки. Следовательно, в качестве параметра у функции следует объявить параметр указатель на символьный тип.
Внутри функции нам известен адрес начала строки, следовательно, можно определить адрес любого символа строки, значит, мы можем извлечь значение любого символа, это означает, что строку через параметр можно передать и в качестве исходного данного и как результат, формируемый внутри функции, если память под строку результат выделяем в функции main.
Для написания оператора вызова такой функции необходимо уметь определить адрес начала строки.
а) Пусть память под строку выделена статически.
char str [80]; str – адрес- константа начала строки.
б) Если память выделена динамически.
p=new char[80];
то p – адрес начала строки.
Память под массив-результат внутри функции нельзя выделить статически, т. к. память по завершению блока освобождается, и массив-результат по завершению функции будет уничтожена.
Написать программу с функцией вычисляющую размер строки
// siz.cpp
int siz(char*p) {
int i, kol=0;
for (i=0; p[i]!=0; i++) { kol++; }
return kol;
}
// siz.h
#ifndef SIZ_H
#define SIZ_H
int siz(char*p);
#endif
// main.cpp
#include<iostream> //подключение системных средств для
using namespace std; //возможности использовать потоки ввода-вывода
#include "siz.h"
int main (void) {
char str[80];
int res;
cout << "\nВведите строку" << endl;
cin.getline(str,80);
res = siz(str);
cout << "\nРазмер строки = " << res << endl;
return 0;
}
Написать программу с функцией, в которой на базе исходной строки будет сформирована строка-результат, путем переноса из исходной строки всех символов кроме пробела. _Память под обе строки выделить в main._
(Первая строка является исходным данным, вторая строка - результат)
// boyan.cpp
void boyan(char * p1, char * p2) {
int i, j=0;
for (i=0; p1[i]!=0; i++) {
if (p1[i] != ‘ ‘) {
p2[j] = p1[i];
j++;
}
p2[j] = 0;
return;
}
// boyan.h
#ifndef BOYAN_H
#define BOYAN_H
void boyan(char * p1, char * p2);
#endif
// main.cpp
#include<iostream> //подключение системных средств для
using namespace std; //возможности использовать потоки ввода-вывода
#include "boyan.h"
int main (void) {
char str1[80], str2[80];
cout << "\nВведите строку" << endl;
cin.getline(str1,80);
boyan(str1, str2);
cout << "\nПолучилась строка" << endl << str2 << endl;
return 0;
}
Переписать программу следующим образом:
Память под строку-результат функции пользователя выделяем только динамически, заполняем ее данными и передаем строку-результат вызывающей функции (через return передаем адрес строки-результата, при этом тип функции будет char *)
Выделение памяти под строку-результат внутри функции пользователя
// boyan.cpp
char * boyan(char * p1) {
char *p2=new char[256];
int i,j=0;
for (i=0; p1[i]!=0; i++) {
if (p1[i] != ‘ ‘) {
p2[j] = p1[i];
j++;
}
p2[j] = 0;
return p2;
}
// boyan.h
#ifndef BOYAN_H
#define BOYAN_H
char * boyan(char * p1);
#endif
// main.cpp
#include<iostream> //подключение системных средств для
using namespace std; //возможности использовать потоки ввода-вывода
#include "boyan.h"
int main (void) {
char str1[80], * str2;
cout << "\nВведите строку" << endl;
cin.getline(str1,80);
str2 = boyan(str1);
cout << "\nПолучилась строка" << endl << str2 << endl;
delete []str2;
return 0;
}