Консультация № 144388
19.09.2008, 14:06
0.00 руб.
0 2 2
Здравствуйте! Напишите пожалуйста программу на языке С++, которая изменяет в строке регистры букв наоборот.
Если можно напишите пожалуйста с использованием указателей, с использованием инд. указателей, без указателей, также с использованием передачи строки у функцию. Спасибо.

Обсуждение

Неизвестный
19.09.2008, 16:29
общий
это ответ
Здравствуйте, !

В приложении 4 способа решения задачи:

- Без использования указателей;
- C использованием указателей;
- C использованием метода индексирования указателей;
- C использованием метода передачи строки как аргумента

Также используются функции isupper(), islower(), toupper() и tolower().

функция isupper() возвращает истину, если буква прописная;
Функция islower() возвращает истину, если буква строчная;

функция toupper() изменяет регистр строчной буквы на регистр прописной;
Функция tolower() изменяет регистр прописной буквы на регистр строчной;

Для обеспечения работы с этим функциями - подключаем заголовок <cctype>.

Будут вопросы по коду - задавайте в мини-форум вопроса.

Удачи!!!


Приложение:
//Без использования указателей
//Заголовок потокового ввода-вывода
#include <iostream>
//Заголовок для поддержки функции gets()
#include <cstdio>
//Заголовок для поддержки функций toupper(), tolower(), isupper(), islower()
#include <cctype>

using namespace std;

int main()
{
//Объявляем строку с именем str на 100 символов
char str[100];

cout << " Vvedyte stroku: (latynskymy bukvamy): ";

//Ввод строки с клавиатуры
gets(str);

cout << endl << " Ishodnaya stroka: " << str << endl << endl;

//Цикл, в котором, перебирается вся строка и меняется регистр каждого символа на противоположный
for(int i = 0; str[i]; i++)
{
if(islower(str[i])) str[i] = toupper(str[i]);

else if(isupper(str[i])) str[i] = tolower(str[i]);
}

cout << " Stroka s invertyrovannym regystrom bukv: " << str << endl << endl;

return 0;
}


//C использованем указателей
//Заголовок потокового ввода-вывода
#include <iostream>
//Заголовок для поддержки функции gets()
#include <cstdio>
//Заголовок для поддержки функций toupper(), tolower(), isupper(), islower()
#include <cctype>

using namespace std;

int main()
{
//Объявляем строку с именем str на 100 символов
char str[100];
//Объявляем указатель
char *s;

cout << " Vvedyte stroku: (latynskymy bukvamy): ";


//Ввод строки с клавиатуры
gets(str);

cout << endl << " Ishodnaya stroka: " << str << endl << endl;

//Присваиваем указателю s адрес начала массива
s = str;

//Пока не достигли конца строки, т.е. 0 - символа, меняем регистр каждого символа на противоположный
while(*s)
{
if(isupper(*s))

*s = tolower(*s);

else if(islower(*s))

*s = toupper(*s);

s++;
}

cout << " Stroka s invertyrovannym regystrom bukv: " << str << endl << endl;

return 0;
}



//C использованием метода индексирования указателей
//Заголовок потокового ввода-вывода
#include <iostream>
//Заголовок для поддержки функции gets()
#include <cstdio>
//Заголовок для поддержки функций toupper(), tolower(), isupper(), islower()
#include <cctype>

using namespace std;

int main()
{
//Объявляем строку с именем str на 100 символов
char str[100];
//Объявляем указатель
char *s;

cout << " Vvedyte stroku: (latynskymy bukvamy): ";


//Ввод строки с клавиатуры
gets(str);

//Присваиваем указателю s адрес начала массива
s = str;

cout << " Ishodnaya stroka: " << str << endl;

//Цикл, в котором, перебирается вся строка и меняется регистр каждого символа на противоположный
for(int i = 0; s[i]; i++)
{
if(islower(s[i])) s[i] = toupper(s[i]);

else if(isupper(s[i])) s[i] = tolower(s[i]);
}

cout << " Stroka s invertyrovannym regystrom bukv: " << str << endl << endl;

return 0;
}



//C использованием метода передачи строки (адреса начала строки) как аргумента
//Заголовок потокового ввода-вывода
#include <iostream>
//Заголовок для поддержки функции gets()
#include <cstdio>
//Заголовок для поддержки функций toupper(), tolower(), isupper(), islower()
#include <cctype>

using namespace std;

//Объявляем прототип функции invert_reg
void invert_reg(char *str);

int main()
{
//Объявляем строку с именем str на 100 символов
char str[100];

cout << " Vvedyte stroku: (latynskymy bukvamy): ";

//Ввод строки с клавиатуры
gets(str);

cout << endl << " Ishodnaya stroka: " << str << endl << endl;

//Вызов функции
invert_reg(str);

cout << " Stroka s invertyrovannym regystrom bukv: " << str << endl << endl;

return 0;
}

//Описание работы функции
void invert_reg(char *str)
{
//Цикл, в котором, перебирается вся строка и меняется регистр каждого символа на противоположный
for(int i = 0; str[i]; i++)
{
if(islower(str[i])) str[i] = toupper(str[i]);

else if(isupper(str[i])) str[i] = tolower(str[i]);
}
}

Неизвестный
20.09.2008, 21:50
общий
это ответ
Здравствуйте, k800ise!
В приложении код программы, который передает указатель в функцию, меняющюю символ, на который он указывает. Каждому символу соответствует определенный код ASCII, например для латинских букв: A-65...Z-90; a-97...z-122. Функция проверяет значение этого кода: если оно <97, значит символ заглавный, если => то строчный.
Если встречаются определенные в программе знаки препинания, то они не меняются. Разница между А и а равна 97-65=32. Т.е. если буква заглавная, то чтобы изменить регистр, прибавляем 32, если строчная, то вычитаем.
Так же существуют функции: strupr и strlwr , которые преобразуют всю строку в верхний и нижний регистр соответственно. Пример их использования млжно прочитать здесь:
http://www.codenet.ru/progr/cpp/sprd/strupr.php


Приложение:
/*Изменяет регистры букв*/

#include <iostream>

using namespace std;

//Прототип функции, которая меняет регистр
char funk(char*);

int main()
{
//Строка, которую требуется изменить
char str[]="I Love C++, pascal very much!!!";
cout<<str<<"\n";

//Указатель на первый элемент в нашей строке
char *p=&str[0];

//Вычисляем длину строки
int len=strlen(str);

//Цикл в котором меняется регистр букв строки посимвольно
for (int i=0;i<len;i++){
str[i]=funk(p);
p++;
}

cout<<endl;

//Вывод строки
cout<<str;

//Освобождение памяти
delete p;

return 0;
}

//Определение функции
char funk(char* p)
{
//Если символами являются нижеперечисленные знаки препинания,
//функция не меняет их значения
switch(*p){
case' ':
case',':
case'.':
case';':
case'-':
case'!':
case'+':
return *p;

//Определение регистра символа. Если символ типа char преобразовать к типу int:
//(int)*p то получим кодсимвола с кодировке ASCII. Затем регистр меняется(+-32)
//и вновь происходит преобразование типов int->char чтобы вернуть из функции
//значение
default:
if (((int)*p)<97){
return ((char)(((int)*p)+32));}
else {return ((char)(((int)*p)-32));}

}
}
Форма ответа