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

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

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

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

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

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 11.05.2009, 02:45   #1
Познающий
Форумчанин
 
Аватар для Познающий
 
Регистрация: 09.05.2009
Сообщений: 162
По умолчанию Народ,зацените!Вопрос по строкам с++

Хочу пройтись по алфавиту...
Для начала
А вообще я хочу написать функцию,которая преобразует введенную строку на русском языке в цифры. при чем цифра - это номер буквы в алфавите.
НАпример,ввели "абг"
вывод:
"124"
Я помучался, хотел попроще, ну получилось вот так

PHP код:
#include<iostream>
#include<windows.h>

using namespace std;
int main()
{
    
char S[34] = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя";
    
char*p=S;
    ::
CharToOem(S,S);
    for (
int i=0;i<33;i++)
        
cout<<i+1<<" "<<p[i]<<"\n";
    
    return 
0;

этооо...правильно?
Или смешно?
Еще хотел приколоться, чтоб букву изменить на следующую ... ну типа p[0]+1 //вывод:" б"
А выдает цифры.
Почему так?
С наилучшими пожеланиями.
Познающий вне форума
Старый 11.05.2009, 12:42   #2
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Ну, я так понял, что вам нужно что-то вроде этого:
Код:
#include <iostream>
#include <conio.h>
#include <windows.h>
#include <string.h>
using namespace std;

int main()
{
char S[34] = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя";
char *p=S;
char str[100];
int i,j;

::CharToOem(S,S);

gets(str);  // вводим строку
for(i=0; i<strlen(str); i++)
 for(j=0; j<strlen(S); j++)
  if(str[i]==S[j]) cout<<j;
cout<<endl;

getch();
return 0;
}
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума
Старый 11.05.2009, 13:05   #3
Познающий
Форумчанин
 
Аватар для Познающий
 
Регистрация: 09.05.2009
Сообщений: 162
По умолчанию

Sazary,спасибо :)
Судя по всему алгоритм еще более или менее...
Просто я хотел прокручивать алфавит как это можно делать с английским:

for (char p='a';p<='z';p++)
cout<<p<<"\n";

вот вот такое. Я хочу сделать что-то типа
char p='a';
CharToOem(p,p)
for (p='a';p<'я';p++)
cout<<p;

только что мелькнула мысль. Если реализовать класс так,как я сделал в предыдущем примере...
сделать,чтоб объект класса CRus при такой структуре
for (p='a';p<'я';p++)
cout<<p;
а все преобразования делать в конструкторе
выдавал алфавит русский.
Это реально?
Поймите. Я сюда пришел не задания по универу кому-то спихнуть.
Я с Уткиным,конечно,делаю консультации по курсовому. Но обычно я сюда пишу чтоб расширить знания по с++ :) (это пока с++)
И это задание тоже
Просто по дискретным структурам пишем лабы по графам. Я некоторые части закодировал. Но с английским шрифтот у меня два выбора:
Либо предложить пользователю (то есть мне) "сиди и сам считай где,которая буква и введи ее номер" либо,как я сделал, я заточил прогу под себя. Но так неинтересно))
Просто юмор в том, что у нас граф генерируется как? вводишь во множество фамилию,имя,отчество (количество букв во множестве =13)
И по номеру буквы в алфавите задается матрица графа :)
Правда,лаба написана давно :) но графы до сих мусолим :)
И вообще:) чисто спортивный интерес :)
А насчет ввода,спасибо :) я немного иначе думал :)
А этот вариант посимпатишнее :) кстати, после вывода j я бы делал брейк, чтоб не загружать процессор :) вывел номер 1 (а) и в чем радость 32 итерации лишних? :)
С наилучшими пожеланиями.
Познающий вне форума
Старый 11.05.2009, 13:09   #4
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
кстати, после вывода j я бы делал брейк, чтоб не загружать процессор вывел номер 1 (а) и в чем радость 32 итерации лишних?
Ну это уже вопрос оптимизации. Главное - суть )
Цитата:
только что мелькнула мысль. Если реализовать класс так,как я сделал в предыдущем примере...
сделать,чтоб объект класса CRus при такой структуре
for (p='a';p<'я';p++)
cout<<p;
а все преобразования делать в конструкторе
выдавал алфавит русский.
Это реально?
Честно говоря, не понял, что вы хотите сделать )
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума
Старый 11.05.2009, 13:23   #5
Познающий
Форумчанин
 
Аватар для Познающий
 
Регистрация: 09.05.2009
Сообщений: 162
По умолчанию

так...ну давайте по порядку)
что будет, если сделать так:
Код HTML:
char c;
for (c='a';c<='z';c++)
cout<<c<<endl;
Выведется английский алфавит в маленьком реестре.
Я немного теряюсь. хочу сделать так:
Код HTML:
char rus;
for (rus='a';rus<='я';rus++)
вывод; //рус алфавит
вот так вот)
Если же вбить это без преобразований...скорее всего пойдут досовские символы...в общем не то)
С наилучшими пожеланиями.
Познающий вне форума
Старый 11.05.2009, 14:31   #6
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Если же вбить это без преобразований...скорее всего пойдут досовские символы...в общем не то)
Ну да.. К тому же, в oem-кодировке русские символы не все в одном месте.
Нужно тогда писать класс и перегружать операторы '=','++','<='.

Навскидку:
Код:
class rusChar
{
 public:
  char c;
  int k;
  char S[34];
  rusChar() { strcpy(S,"абвгдеёжзийклмнопрстуфхцчшщъыьэюя"); }
  rusChar& operator=(const char ch);
  rusChar operator++(void);
  bool operator<=(const char& ch);
};

rusChar& rusChar::operator=(const char ch)
{
 char *buf=new char[1];
 buf[0] = ch;
 ::CharToOem(buf,buf);
 c = buf[0];
 delete[] buf;
 for(int j=0; j<34;j++)
  if(c==S[j]) { k=j; break; }
 return *this;
}
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума
Старый 11.05.2009, 15:55   #7
Познающий
Форумчанин
 
Аватар для Познающий
 
Регистрация: 09.05.2009
Сообщений: 162
Восклицание Такс... теперь разжевываем))

PHP код:
class rusChar
{
 public:
  
char c//буква
  
int k;   //номер в алфавите
  
char S[34];//Алфавит...ясно
  
rusChar() { strcpy(S,"абвгдеёжзийклмнопрстуфхцчшщъыьэюя"); }
// скопировали.Может...А S может преобразовать тоже? сразу.

  
rusCharoperator=(const char ch);
  
rusChar operator++(void);
  
bool operator<=(const charch);
//перегрузки.понятно
};

rusCharrusChar::operator=(const char ch)
{

 
char *buf=new char[1];
//буф массив из одного элемента... странно...разве просто buf=new char; не? 

 
buf[0] = ch;
// в первую и последнюю ячейку записываем ч,которое присваеваем
//Вопрос. Если тут строка...по идее надо делать размер+1. ячейка еще для нуль символа. Или тут не существенно?

 
::CharToOem(buf,buf);
//введенную русскую букву в оем.
 
buf[0];
//с которая является данным объекта класса присваевается переведенная буква

 
delete[] buf;
//стираем буфер. понятно

 
for(int j=0j<34;j++)
  if(
c==S[j]) { k=j; break; }
 return *
this;
//если введенная буква равна элементу русского алфавита, присваиваем данному номер буквы... 

PHP код:
void main(){
rusChar r;//скопировали в S алфавит
r='а';
//если написать функцию вывода объекта класса, то выведется a 1 по идее...а не. 0 выыедется. ну то не проблема :) 
Только вот...я понимаю,что экспромт)) прсто...зачем в каждом объекте создавать массив?если ввести через этот класс строку в 100 символов. то 3200 байта будут потрачены на этот массив....может есть другой выход?
...правда еще один класс это нагрузка...ну ладно... вот моя версия...:
PHP код:
class CAlpha{
public:
friend class CRus;
char*m_alpha[34];
CAlpha(){ strcpy(m_alpha,"абвгдеёжзийклмнопрстуфхцчшщъыьэюя");
              ::
CharToOem(m_alpha,m_alpha);
            }
}

class 
CRus{
public:
   
int m_k;
   
char m_l// letter
   //может ссылочку на альфу.?... посмотрим

CRus&  operator =(char r_ch){
char buf =r_ch;//а что теряем, если под буфер не выделять памяти?
::CharToOem(buf,buf);
m_l=buf;
for (
int i(0);i<34;i++)
if (
CAlpha::m_alpha[i]==m_l) {m_k=i; break;}

bool operator<=(char r_ch){
//мдааааа.....ну посмотрим
char buf;
buf=r_ch;
::
OemToChar(buf,buf);
int ch_num;//для номера введеной буквы
for (int i(0);i<34;i++)
if (
CAlpha::m_alpha[i]==buf) {ch_num=i; break;}     
/*последние три строчки. Заводится переменная. Делается цикл. Если введенная буква соответствует элементу массива, то в переменную запоминаем номер. Потом по этому же номеру и сравнивается, больше ли буква(дальше ли)*/
if (m_k<ch_num||m_k==ch_num) return true;
else return 
false;
}

CRusoperator ++(){
m_k++;
m_l=CAlpha::m_alpha[m_k];//знаю,можно чуть проще...правда я не думаю что ++ может выйти дальше чем +1...вроде ок)

Вот такие вот пирагы)) Интересно...правильно ли)
Только вопрос сразу. Зачем при сравнении делать ссылку?
И зачем указывать параметры константными?
С наилучшими пожеланиями.
Познающий вне форума
Старый 11.05.2009, 17:07   #8
Познающий
Форумчанин
 
Аватар для Познающий
 
Регистрация: 09.05.2009
Сообщений: 162
Лампочка Ахааа...

Теперь понял почему МАССИВ а не символ...
ЧарТуОем просто не преобразовывает чар в чар.
С наилучшими пожеланиями.
Познающий вне форума
Старый 11.05.2009, 17:07   #9
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
/буф массив из одного элемента... странно...разве просто buf=new char; не?
Так ведь CharToOem работает со строкой.
Цитата:
buf[0] = ch;
// в первую и последнюю ячейку записываем ч,которое присваеваем
//Вопрос. Если тут строка...по идее надо делать размер+1. ячейка еще для нуль символа. Или тут не существенно?
Вот это что-то не понял. buf - строка из одного символа. Вот мы в нее и пишем символ ch.
Цитата:
Только вот...я понимаю,что экспромт))
Вот потому и можно сделать лучше ) Писал, как говорится, "от фонаря" )

Что-то у вас тут тьма ошибок.. )

Цитата:
Теперь понял почему МАССИВ а не символ...
Ну вот )
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума
Старый 11.05.2009, 17:10   #10
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Рабочий вариант
Код:
#include <iostream>
#include <conio.h>
#include <windows.h>
#include <string.h>
using namespace std;

class CAlpha
{
public:
//friend class CRus;
char m_alpha[34];
CAlpha()
 {
  strcpy(m_alpha,"абвгдеёжзийклмнопрстуфхцчшщъыьэюя");
  ::CharToOem(m_alpha,m_alpha);
  }
};

class CRus : CAlpha
{
public:
   int m_k;
   char m_l; // letter

CRus&  operator=(const char r_ch)
 {
 char *buf = new char[1];
 buf[0] = r_ch;
 ::CharToOem(buf,buf);
 m_l=buf[0];
 for (int i=0;i<34;i++)
  if (m_alpha[i]==m_l) {m_k=i; break;}
 delete[] buf;
 }

bool operator<=(const char r_ch)
{
char *buf = new char[1];
buf[0] = r_ch;
::CharToOem(buf,buf);
int ch_num;//для номера введеной буквы
for (int i=0;i<34;i++)
 if (m_alpha[i]==buf[0])
  { ch_num=i; break; }

delete[] buf;
if (m_k<=ch_num) return true;
else return false;
}

CRus& operator ++()
{
m_k++;
m_l = m_alpha[m_k];
}

};
//--------------------

int main()
{
CRus p;

for(p='а'; p<='э'; ++p)
 cout<<p.m_l;

getch();
return 0;
}
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума
Закрытая тема


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вопрос по строкам CraZZy RabbIt Общие вопросы Delphi 4 21.04.2009 19:00
Задача на С++ по строкам EwwwA Помощь студентам 2 20.12.2008 15:22
задача по строкам D_K_ Помощь студентам 10 14.12.2008 16:21
Срочно!! Народ помогите!! Вопрос пустяковый) Kemper Помощь студентам 1 09.03.2008 16:01