Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.11.2011, 17:56   #1
L6go1as
Форумчанин
 
Регистрация: 20.10.2011
Сообщений: 433
По умолчанию Перемудрил?

Уперся в стену задачи, как решить что-то не доходит до меня ...
Суть такая: нужно задать некий текст с цифрами и буквами(бол. и мал.), программа должна этот текст считать до определенного знака "@". После чего текст до "@" знака изменить - убрать все цифры, маленькие буквы сделать большими, большими - маленькими. Результат вывести.

На данный момент есть:
Код:
#include <iostream>
#include <cctype> 

using namespace std;

int main()
{
	cout << "Please enter some random text: "; 
	char ch = 0;
	char sent = 0;
	
	cin.get(ch);
	while (ch != '@')
	{
		if (isalpha(ch))
		{
			toupper(ch);
				if (!toupper(ch))
				{
					tolower(ch);
				}
		}
		
		cout << ch;
		cin.get(ch);
	}

	//cout << "Your NEW sentance: " << sent;

	int x = 0;
	cin >> x;

	return 0;
}
L6go1as вне форума Ответить с цитированием
Старый 21.11.2011, 19:01   #2
_kilik_
Пользователь
 
Аватар для _kilik_
 
Регистрация: 16.08.2011
Сообщений: 69
По умолчанию

это не совсем корректно. Желательно использовать функции для определения числа и тд.
Код:
#include<iostream>
#include<string>
using namespace std;
int main(){
	string text;
	getline(cin,text,'@');//читаем до собаки 
	for(int i=0;i<text.size();i++){
		if(text[i]>47&&text[i]<58){//определения цифры есть ф-я но я не помню ее
			text.erase(text.begin()+i);//удалим символ
			i--;
		}
		else if(text[i]>64 && text[i]<91)//заглавные тоже самое  
			text[i]=text[i]+32;
		else if(text[i]>96 && text[i]<123)//mal
			text[i]=text[i]-32;
	}
	cout<<text<<endl;
	system("pause");
}
_kilik_ вне форума Ответить с цитированием
Старый 21.11.2011, 19:34   #3
L6go1as
Форумчанин
 
Регистрация: 20.10.2011
Сообщений: 433
По умолчанию

Спасибо, работает.
Но конечно же хотелось бы увидеть в работе функции из cctype.

Насколько я понимаю в своей интерпретации вы использовали работу с ASCII, хотя ... чего-то совсем запутался, что цифры в диапазоне и +\-32 значат ...

Последний раз редактировалось L6go1as; 21.11.2011 в 19:39.
L6go1as вне форума Ответить с цитированием
Старый 21.11.2011, 19:48   #4
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

Цитата:
Сообщение от _kilik_ Посмотреть сообщение
это не совсем корректно. Желательно использовать функции для определения числа и тд.
Код:
#include<iostream>
#include<string>
using namespace std;
int main(){
	string text;
	getline(cin,text,'@');//читаем до собаки 
	for(int i=0;i<text.size();i++){
		if(text[i]>47&&text[i]<58){//определения цифры есть ф-я но я не помню ее
			text.erase(text.begin()+i);//удалим символ
			i--;
		}
		else if(text[i]>64 && text[i]<91)//заглавные тоже самое  
			text[i]=text[i]+32;
		else if(text[i]>96 && text[i]<123)//mal
			text[i]=text[i]-32;
	}
	cout<<text<<endl;
	system("pause");
}
Во-первых, ваш код совершенно некорректен, так как символ '0' имеет разное представление для различных кодировок. Более того символы-не цифры могут распологаться не по порядку!
Во-вторых, ваш код плохо читаем, так как проще было вместо этих магических чисел использовать соответствующие символьные представления. Например, вместо 48 лучше было использовать '0'.

То есть ваш код - это пример того, как не надо писать программы!
Со мной можно встретиться на www.clipper.borda.ru
Сыроежка вне форума Ответить с цитированием
Старый 21.11.2011, 19:59   #5
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

Цитата:
Сообщение от L6go1as Посмотреть сообщение
Спасибо, работает.
Но конечно же хотелось бы увидеть в работе функции из cctype.

Насколько я понимаю в своей интерпретации вы использовали работу с ASCII, хотя ... чего-то совсем запутался, что цифры в диапазоне и +\-32 значат ...
Замена происходит просто. Если брать представленный вам код, то можно его изменить следющим образом

Код:
if ( isdigit( text[i] ) ) /*...*/

Код:
if ( isupper( text[i] ) ) text[i] = tolower( text[i] );
else if ( islower( text[i] ) ) text[i] = toupper( text[i] );
Со мной можно встретиться на www.clipper.borda.ru
Сыроежка вне форума Ответить с цитированием
Старый 21.11.2011, 21:26   #6
_kilik_
Пользователь
 
Аватар для _kilik_
 
Регистрация: 16.08.2011
Сообщений: 69
По умолчанию

Цитата:
Сообщение от Сыроежка Посмотреть сообщение
так как символ '0' имеет разное представление для различных кодировок.
Пожалуйста, приведите пример!
Цитата:
Сообщение от Сыроежка Посмотреть сообщение
Более того символы-не цифры могут распологаться не по порядку!
Аналогично, прошу обосновать ваши слова.

Переносимый_набор_символов
Цитата:
Сообщение от Сыроежка Посмотреть сообщение
Во-вторых, ваш код плохо читаем, так как проще было вместо этих магических чисел использовать соответствующие символьные представления. Например, вместо 48 лучше было использовать '0'.
Тут с вами частично, согласен. Я предупредил автора темы. Нужно использовать следующие функции:

Код:
#include<iostream>
#include<string>
using namespace std;
int main(){
	string text;
	getline(cin,text,'@');//читаем до собаки 
	for(unsigned i=0;i<text.size();i++){
		if(isalnum(text[i])){//символ- буква или цифра
			if(isdigit(text[i])){//определения цифры 
				text.erase(text.begin()+i);//удалим символ
				i--;
			}
			else if(islower(text[i]))//определения прописной 
				text[i]=toupper(text[i]);
			else //остались строч  
				text[i]=tolower(text[i]);
		}
	}
	cout<<text<<endl;
	system("pause");
}

Последний раз редактировалось _kilik_; 21.11.2011 в 22:01.
_kilik_ вне форума Ответить с цитированием
Старый 21.11.2011, 22:15   #7
L6go1as
Форумчанин
 
Регистрация: 20.10.2011
Сообщений: 433
По умолчанию

А что скажите вот о таком варианте ?

Код:
#include <iostream>
#include <cctype>

using namespace std;

int main()
{
	char ch = 0;
	while (ch != '@') 
	{
		cin.get(ch);
		
		if (isalpha(ch)) 
		{
			if (islower(ch)) ch = toupper(ch);
			else ch = tolower(ch);
			cout << ch;
		}
	}

	cout << "\n";
	system("pause");
}
L6go1as вне форума Ответить с цитированием
Старый 21.11.2011, 22:50   #8
_kilik_
Пользователь
 
Аватар для _kilik_
 
Регистрация: 16.08.2011
Сообщений: 69
По умолчанию

Если потом строка не нужна почему - бы и нет.
Только:
1)if (isalpha(ch))
cout << ch;

будут игнорироваться не только цифры, но и знаки препинания, пробелы
2)ввод текста ограничен не только символом @ ,но и переходом на новую строку.
_kilik_ вне форума Ответить с цитированием
Старый 21.11.2011, 23:00   #9
L6go1as
Форумчанин
 
Регистрация: 20.10.2011
Сообщений: 433
По умолчанию

В задаче ни слова о знаках препинания - поэтому их возможное присутствие игнорируется.
По поводу второго, не соглашусь, переход на новую строку не делает ровным счетом ничего(кроме как перехода на новую строку и завершение ввода).

А так спасибо за помощь в любом случае
L6go1as вне форума Ответить с цитированием
Старый 21.11.2011, 23:28   #10
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

Цитата:
Сообщение от _kilik_ Посмотреть сообщение
Пожалуйста, приведите пример!

Аналогично, прошу обосновать ваши слова.

Переносимый_набор_символов

Тут с вами частично, согласен. Я предупредил автора темы. Нужно использовать следующие функции:

Код:
#include<iostream>
#include<string>
using namespace std;
int main(){
	string text;
	getline(cin,text,'@');//читаем до собаки 
	for(unsigned i=0;i<text.size();i++){
		if(isalnum(text[i])){//символ- буква или цифра
			if(isdigit(text[i])){//определения цифры 
				text.erase(text.begin()+i);//удалим символ
				i--;
			}
			else if(islower(text[i]))//определения прописной 
				text[i]=toupper(text[i]);
			else //остались строч  
				text[i]=tolower(text[i]);
		}
	}
	cout<<text<<endl;
	system("pause");
}
Во-первых, в расширенной таблице ASCII коды национальных символов могут переводиться из верхнего в нижний регистр и обратно по специальному правилу.
Во-вторых, помимо ASCII есть еще таблица, например, EBCDIC, где код цифры 0 равен в шестнадцатиричном виде F0, а между буквами есть промежутки, занятые другими символами.
Со мной можно встретиться на www.clipper.borda.ru
Сыроежка вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
перемудрил с SQL запросом) Timmy БД в Delphi 2 14.04.2007 11:06