Created
May 22, 2019 19:11
-
-
Save mikhailnov/0b91777c59cb89983553ee6707503b31 to your computer and use it in GitHub Desktop.
dz2_v4.cpp
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <iostream> | |
#include <string.h> | |
#include <cmath> | |
using namespace std; | |
/* эти переменные будем использовать в разных функциях, поэтому | |
* сделаем их глобальными, вынеся за пределы функции */ | |
string input_string; | |
string converted_string; | |
string converted_string_copy_demo; | |
char *input_string_begin_address; | |
char *converted_string_begin_address; | |
char *converted_string_copy_demo_begin_address; | |
int len = 0; | |
// длина строки | |
/* Эта функция возвращает корректное кол-во символов в строке | |
* только для строк из ASCII-символов, например, для строки "одод" | |
* будет возвращена длина 8 | |
*/ | |
int length(char *s) { | |
char *temp=s; | |
while(*temp++); | |
return temp-s-1; | |
} | |
// копирование строки в строку | |
void Copy(char *s1, char *s2) { | |
do | |
*s2++=*s1; | |
while (*s1++); | |
} | |
// Функция удаления ненужных символов в строке, т.е. символов j-z (J-Z) | |
/*char* Del_useless(char *s) { | |
for (int k=0; *(s+k); k++) { | |
if (((*(s+k) < 65) || (*(s+k) > 73)) && | |
((*(s+k) < 97) || (*(s+k) > 105))) { | |
s = Delete(s,k); | |
k--; | |
} | |
} | |
return s; | |
}*/ | |
/* Эта функция из методички будет работать только с однобайтовыми (ASCII) символами, | |
* т.е. только с латинскими буквами; не работает с длинными строками. | |
* Можно использовать toupper() вместо UpChar (?)*/ | |
char* UpChar(char *s) { | |
/* преобразовываем в верхний регистр символы от A до I */ | |
for(int i=0; *(s+i); i++) | |
if ((*(s+i) <= 105) && (*(s+i) >= 97)) { | |
*(s+i)-=32; | |
} | |
return s; | |
} | |
void convert_input_to_numbers(string input_string) { | |
len = length(input_string_begin_address); | |
int j = 0; /* счетчик элементов преобразованной строки */ | |
// По сути дела новая переменная/строка не нужна, но по заданию нужно воспользоваться Copy() | |
// инициализируем новую пока пустую строку | |
//string converted_string; | |
// делаем новую переменную-указатель (сделано глобально выше) | |
// присваиваем ей адрес первого элемента массива input_string | |
converted_string_copy_demo_begin_address = &converted_string_copy_demo[0]; | |
// копируем строку в строку | |
// Сейчас Copy() бесполезна, т.к. функция Del_useless нерабочая | |
Copy(input_string_begin_address, converted_string_copy_demo_begin_address); | |
#ifdef DEBUG | |
// демонстрация работы Copy() | |
cerr << "DEBUG: Строка после Copy() (демо): " << converted_string_copy_demo.c_str() << "\n"; | |
// сейчас получается пусто, допустим, что память была выделена (нужно проверить) | |
#endif | |
for (int i=0; i<len; i++) { | |
/* в функции UpChar только необходимые для конвертирования символы | |
* преобразовываются в верхний регистр, но еще нужно учесть, что | |
* не нужные для конвертирования символы могли быть заданы изначально | |
* в верхнем регистре */ | |
if (isupper(input_string[i]) /* isupper() м.б. лишним */ | |
&& (input_string[i] >= 'A' && input_string[i] <= 'I')) { | |
// + '0' для преобразования int в символ | |
converted_string[j] = input_string[i] - 'A' + 1 + '0'; | |
#ifdef DEBUG | |
cerr << "DEBUG: j = " << j << "\n"; | |
cerr << "DEBUG: i = " << i << "\n"; | |
cerr << "DEBUG: converted_string[j] = " << converted_string[j] << "\n"; | |
cerr << "DEBUG: input_string[i] = " << input_string[i] << "\n"; | |
#endif | |
j++; | |
} | |
#ifdef DEBUG | |
else { | |
cerr << "DEBUG: Символ " << input_string[i] << " с порядковым номером " << i << " не попадает под конвертирование\n"; | |
} | |
#endif | |
} | |
#ifdef DEBUG | |
cerr << "DEBUG: Строка после конвертирования до сортировки: " << converted_string.c_str() << "\n"; | |
// сейчас получается пусто, допустим, что память была выделена (нужно проверить) | |
#endif | |
} | |
// Пузырьковая сортировка | |
char* Sorting(char *s) { | |
int flag; | |
char r; | |
do | |
{ flag=0; | |
for(int k=0;*(s+k);k++) | |
{ | |
if (*(s+k+1)) | |
{ | |
if (*(s+k)>*(s+k+1)) | |
{ | |
r=*(s+k); | |
*(s+k)=*(s+k+1); | |
*(s+k+1)=r; | |
flag++; | |
} | |
} | |
} | |
} | |
while(flag!=0); | |
return s; | |
} | |
// функция проверки ввода с клавиатуры | |
int validateInput(string input_string) | |
{ | |
int result = 0; | |
/* Можно было бы сделать | |
* int len = input_string.size(); | |
* и всё, но нужно использовать готовую функцию length(), поэтому: */ | |
// делаем новую переменную-указатель (сделано глобально выше) | |
// char *input_string_begin_address; | |
// присваиваем ей адрес первого элемента массива input_string | |
input_string_begin_address = &input_string[0]; | |
// подсчитываем длину строки через length() | |
len = length(input_string_begin_address); | |
#ifdef DEBUG | |
// выводим длину строки (для отладки работы программы) | |
// cerr - stderr, cout - stdout | |
cerr << "DEBUG: Длина строки: " << len << "\n"; | |
#endif | |
// проверяем, что введенная строка не пустая | |
if (len < 1) { | |
cout << "Пустой ввод?\n"; | |
result = 0; | |
} else { | |
result = 1; | |
} | |
return result; | |
} | |
/* Имеется строка содержащая некоторые символы. | |
* Преобразовать эту строку таким образом, чтобы все буквы от A…I (a…i) | |
* заменить на цифры от 1…9. | |
* Отсортировать полученную строку по возрастанию и заменить прописные буквы заглавными. | |
*/ | |
int main() { | |
cout << "Введите входную строку:\n"; | |
getline(cin, input_string); | |
if (!validateInput(input_string)) { | |
return 1; | |
} | |
#ifdef DEBUG | |
// проверяем видимость переменной len при -DDEBUG | |
cerr << "DEBUG: Длина строки: " << len << "\n"; | |
#endif | |
input_string = UpChar(input_string_begin_address); | |
#ifdef DEBUG | |
cerr << "DEBUG: Преобразованная в верхний регистр строка: " << input_string << "\n"; | |
#endif | |
/* Т.к. функция UpChar нормально не работает с длинными строками, | |
* проверим, что input_string теперь не пустая, иначе завершимся с ошибкой */ | |
if (input_string[0] == '\0' | |
|| input_string[0] == NULL) { | |
/* корректно ли использовать NULL? gcc ругается, -Wpointer-arith */ | |
cerr << "Ошибка преобразования строки в верхний регистр\n"; | |
return 2; | |
} | |
convert_input_to_numbers(input_string); | |
converted_string_begin_address = &converted_string[0]; | |
#ifdef DEBUG | |
cerr << "DEBUG: input_string_begin_address: " << input_string_begin_address << endl; | |
cerr << "DEBUG: converted_string_begin_address: " << converted_string_begin_address << endl; | |
#endif | |
string sorted_string = Sorting(converted_string_begin_address); | |
cout << "Результат: " << sorted_string.c_str() << endl; | |
//cout << "Результат: " << Sorting(converted_string_begin_address) << endl; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment