Skip to content

Instantly share code, notes, and snippets.

@mikhailnov
Created May 22, 2019 19:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mikhailnov/0b91777c59cb89983553ee6707503b31 to your computer and use it in GitHub Desktop.
Save mikhailnov/0b91777c59cb89983553ee6707503b31 to your computer and use it in GitHub Desktop.
dz2_v4.cpp
#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