forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   C++ (http://forum.boolean.name/forumdisplay.php?f=22)
-   -   Пробелы (http://forum.boolean.name/showthread.php?t=12989)

den 22.07.2010 01:17

Пробелы
 
Немного ламерский вопрос:) :
Вот если написать код
Цитата:

string s;
cin>>s;
cout<<s;
и ввести "qwerty", то после нажатия на интер, получим "qwerty".
А если ввести "qwe rty" то получим "qwe", так как пробел в консоле работает как и интер (ввод).
А как сделать так, чтоб на ввыходе получилось "qwe rty", чтоб пробел не был командой ввод, а был просто символом?

impersonalis 22.07.2010 01:31

Ответ: Пробелы
 
Код:

#include<iomanip.h>
...
cin>>resetiosflags(ios::skipws);

писал попамяти

апд: вроде, при такой релаизаии Enter тоже игнорируется. Проверь.
Можно ещё побайтово через цикл читать (после сброса флага) и перкащать ввод при получени соответствующего кода.

.Squid 22.07.2010 01:36

Ответ: Пробелы
 
std::getline(std::cin, blablabla);

den 22.07.2010 01:42

Ответ: Пробелы
 
Ооо, заработало!
Способ .Squid мне больше подошёл!
Спасибо!

den 22.07.2010 12:51

Ответ: Пробелы
 
И ещё 2 вопроса. Задам сдесь, чтоб темы не плодить.
1) Дано чило n.
Как построить из него таблицу истиности.
Например n=3
Код:

000
001
010
011
100
101
110
111

Делал по всекому, но уж больно медлино получается...
Как по вашему это сделать?

2) Дана строка.
Вводим например "abc"
Как получить
Код:

abc
acb
bac
bca
cab
cba

???

impersonalis 22.07.2010 16:17

Ответ: Пробелы
 
Цитата:

Как построить из него таблицу истиности.
это не таблица истинности, а все варианты слова из N-бит.

http://forum.boolean.name/showpost.p...9&postcount=67
Тема не раз поднималась. Прогони цикл от 0 до 2^N, на каждой итерации переводи итератор в бинарку - вот те и коды.

den 22.07.2010 16:48

Ответ: Пробелы
 
Цитата:

Прогони цикл от 0 до 2^N, на каждой итерации переводи итератор в бинарку - вот те и коды.
Да я так и делал. А как перевети чило из 10 в 2 систему счисления (5->101). Я писал функцию, а может встроеное решение есть?
А второй вопрос?
Уже мозг кипит понять не мугу как сделать.
Пытался нерекурсивным перебором, ответ подходил для слов длиной 1-3 символа, для остальных нет. Сделал рекурсией-вобще нехера неработает.

impersonalis 22.07.2010 21:45

Ответ: Пробелы
 
#include<stdlib.h>

itoa
http://ru.wikipedia.org/wiki/Itoa_(Си)

den 22.07.2010 22:35

Ответ: Пробелы
 
Спасибо, полезная функция!
(хотя я писал почти точно такуюже, тако она работала почемуто раз в 20 медленней)))))
А как со вторым вопросом?:SOS:

impersonalis 22.07.2010 22:43

Ответ: Пробелы
 
смени алфавит с {'0','1'} на {'a','b'}.
Учитывая просттоту алфавитов, можно сделать тупы суммированием.
x`=x+d
где d=char('a')-char('0');
примерно так - раскрути идею)

den 22.07.2010 23:11

Ответ: Пробелы
 
Цитата:

Сообщение от impersonalis (Сообщение 155970)
смени алфавит с {'0','1'} на {'a','b'}.
Учитывая просттоту алфавитов, можно сделать тупы суммированием.
x`=x+d
где d=char('a')-char('0');
примерно так - раскрути идею)

и чё это?
причем перебор и ЕТО?
:pure_magic:
Цитата:

А как со вторым вопросом?:SOS:

impersonalis 22.07.2010 23:13

Ответ: Пробелы
 
ЭТО МЛИН ОН И БЫЛ!!!!11111

den 22.07.2010 23:38

Ответ: Пробелы
 
:-D :-D :-D
Может я быдло, ну причём сдвиг симола с цифры на букву, и перебор всех перестановок символов в слове?

impersonalis 22.07.2010 23:56

Ответ: Пробелы
 
млин - генерь слова в три бита дилной как было сказанов ыше
получай их текстовую запись в бин-коде
перводи его на новый алфавит

0->000->aaa
1->001->aab
2->010->aba
3->011->abb
4->100->baa
5->101->bab
...
7->111->bbb

Для ABC - юзай троичную с\с, генерь 3^strlen(ABC) степени состояний слова.
Есди задача о перстанвоках - то решение тоже, если о сочтеаниях без повторений - необходимо сперва сжать строку, выкинув повтроения.

den 23.07.2010 00:07

Ответ: Пробелы
 
Да только надо чтоб повторений небыло.
И там без систем счислений.
Нам тренер обеснял, а я забыл...(((
Там просто через for() и есчё были масивы с флагами. Кажется даже без рекурсии. И кода было так мало.
А потом показал второй вариант- с помощь какой то волшебной фунции с очень длинным названием, которая находится в какой то волшебной боблиотеке. Одна эта вункция решает всю эту проблему)))

impersonalis 23.07.2010 00:26

Ответ: Пробелы
 
тебе дать адеквтаный код или я ещё должен думать за ВашихАвторитетов? *импер_заводится*

.Squid 23.07.2010 00:42

Ответ: Пробелы
 
Тренер по С++.
- А нам тренер сказал делать 5 подходов по 10 Александреску в день.

ЗЫ. Прислушайся к Имперу. Перечитывай его сообщения пока не поймешь.

impersonalis 23.07.2010 02:04

Ответ: Пробелы
 
Вообще, задача о перестановках несолкько усложняет реализацию. Нам необходимо забраковывать сочетания с одинаковыми цифрами в числе (типа 001 010 100). Можно конечно сгенерить все состояния слова и отсеять лишние - но это ппц костыль.
Есть один вариант на примете - но хотелсоь бы его подшлифовать. Кстати, вот весь код (помимо генрации), сделанный по моим советам.
Код:

#include<iostream.h>
#include<string.h>
#include<iomanip.h>
#include<malloc.h>
#include<conio.h>


int fact(int a){
        if(a<=1)return 1;
        int s=1;
        for(int i=2;i<=a;i++){
                s*=i;
        }
        return s;
}

void main(){
        cin>>resetiosflags(ios::skipws);
        int act_indx=0;
        int i,j,k;
        int sz;
        char *s=new char[1];
        char b;
        int N,P;
        while(true){
                cin>>b;
                if(b==10){break;}
                s[act_indx]=b;
                act_indx++;
                s=(char*)realloc(s,act_indx+1);
        }
        cout<<"input - ok\n";
        for(i=0;i<act_indx;i++){
                cout<<s[i];
        }
        cout<<endl;
        sz=act_indx;
        for(i=0;i<sz-1;i++){
                b=s[i];
                for(j=i+1;j<sz;j++){
                        if(b==s[j]){
                                for(k=j;k<sz-1;k++){
                                        s[k]=s[k+1];
                                }
                                sz--;
                                j--;
                        }
                }
        }
        cout<<"compress ok\n";
        for(i=0;i<sz;i++){
                cout<<s[i];
        }
        cout<<endl;
        N=sz;
        P=fact(N);
        cout<<"total="<<P<<endl;
        char *W=new char[N];
        //
//---------------- =((
        //
        delete[]s;
        delete[]W;
       

        getch();
}

комменатриев нет - это плохо
имена переменных - неинутивны
код слабо фоматирован - жуть
нет всяческих обёрточек-контейнеров типа CString - олд_скуловое перевыделение рулит
привычные манипуляторы потока - чсв овер9к

den 23.07.2010 16:37

Ответ: Пробелы
 
Проболжаем тему ламерских вопросов:
Код:

#include <iostream>
using namespace std;
int dx[]={0,1,0,-1};
int dy[]={-1,0,1,0};
char m[100][100];
int w,h;
int f()
{
        int n=0;
        for(int i=0;i<w;i++)
        {
                for(int j=0;j<h;j++)
                {
                        if(m[i][j]=='*')
                        {
                                        for(int k=0;k<4;k++)
                                        {
                                                if(i+dx[k]>=0 && i+dx[k]<w && j+dy[k]>=0 && j+dy[k]<h)
                                                        m[i+dx[k]][j+dy[k]]='*';
                                        }
                        }
                }
        }
        for(int i=0;i<w;i++)
        {
                for(int j=0;j<h;j++)
                {
                        if(m[i][j]=='.') n++;
                }
        }
        return n;
        f();
}
void main()
{
        int mm=0,xod=0;
        cin>>w>>h;
        for(int i=0;i<w;i++)
        {
                for(int j=0;j<h;j++)
                {
                        cin>>m[i][j];
                }
        }
        for(int i=0;i<w;i++)
        {
                for(int j=0;j<h;j++)
                {
                        if(m[i][j]=='.') mm++;
                }
        }
        while(mm!=0)
        {
                mm=f();
                xod++;
        }
                cout<<xod;
}

Почему когда "*" в верхнем и/или левом ряду/столбце прога выдает ''1" ??


Часовой пояс GMT +4, время: 11:22.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot