Тема: Некоректно виводиться результат

Суть задачі: вводимо натуральне число (може бути як завгодно велике), а програма має виводити кожну його цифру з нового рядка

ось мої незавершені домисли по ній:

int _tmain(int argc, _TCHAR* argv[])
{
    char a;
    cin >> a;
    char *b = &a;
    int k = strlen(&a);
    char *c = new char [k];
    *b=*c;
    for(int i = 0; i<k; i++)
    {
        cout<< c[i]<< "\n";
    }
    system("pause");
    return 0;
}

при роботі, виводить не цифри, як мені цього хотілось, а одну і ту саму букву

2 Востаннє редагувалося koala (09.10.2014 19:56:14)

Re: Некоректно виводиться результат

char a;//a - це символ. ОДИН символ.
cin >> a;//вводимо один символ.
char *b = &a;//b тепер вказує на a
int k = strlen(&a);//!!! strlen шукає в послідовності символів нульовий ('\0'), а у нас нема послідовності, 
//у нас рівно один символ; strlen же почне читати наступні за ним, а що там за ним - хто зна...

Далі не краще.
Якщо треба ввести як завгодно велике натуральне число, то треба спершу ввести рядок, а потім перевірити його, чи є там щось, крім цифр. Ну а потім виводити по одній цифрі, десь так, як і у вас в кінці. Ну і взагалі - ви C чи C++ вчите?

Подякували: FakiNyan, Skyzerks Synx2

3

Re: Некоректно виводиться результат

Як от нічого файного не підскажу, але коли я намагався перевести стрічку в ціле, то я робив щось типу

int i;
std::cin>>i;

Очевидно, якщо я введу буковки, то вийде якесь лайно, хоча ця штука нормально скомпілюватись має.
Аби переверіти, чи я не вводив якогось лайна, мона викликати

std::cin.fail();

Ну ви там пограйтеся з цим. В будь-якому разі вам якось треба перевірити чи введена інформація цілком складається з цифр. Можна ще якийсь atoi поюзати, і якщо він невдалий, то значить ваша строка містить буковки або ще щось таке, що не являється цифрою.

4

Re: Некоректно виводиться результат

koala написав:
char a;//a - це символ. ОДИН символ.
cin >> a;//вводимо один символ.
char *b = &a;//b тепер вказує на a
int k = strlen(&a);//!!! strlen шукає в послідовності символів нульовий ('\0'), а у нас нема послідовності, 
//у нас рівно один символ; strlen же почне читати наступні за ним, а що там за ним - хто зна...

Далі не краще.
Якщо треба ввести як завгодно велике натуральне число, то треба спершу ввести рядок, а потім перевірити його, чи є там щось, крім цифр. Ну а потім виводити по одній цифрі, десь так, як і у вас в кінці. Ну і взагалі - ви C чи C++ вчите?

це на с++ пробую реалізувати(як видно по моїм спробам, поки що безутішно)
вот моя спроба це зробити через масив, але тут вилітає ще одна проблема: як ініціалізувати довжину мого масиву (k) якщо він буде об'явлений вже після компіляції

int _tmain(int argc, _TCHAR* argv[])
{
    int k;
    char *a= new char[k];
    cin >> a;
    k = strlen(&*a);
    for(int i = 0; i<k; i++)
    {
        cout<< a[i]<< "\n";
    }
    system("pause");
    return 0;
}

5 Востаннє редагувалося Skyzerks Synx (09.10.2014 20:22:40)

Re: Некоректно виводиться результат

int _tmain(int argc, _TCHAR* argv[])
{
    char *a = new char[];
    cin >> a;
    char *b = &*a;
    int k = strlen(&*a);
    char *c = new char [k];
    *b=*c;
    for(int i = 0; i<k; i++)
    {
        cout<< c[i]<< "\n";
    }
    system("pause");
    return 0;
}

тепер виводить потрібну кількість символів....но це не цифри, а знов ці букви  *SCRATCH*

6

Re: Некоректно виводиться результат

Skyzerks Synx написав:
koala написав:
char a;//a - це символ. ОДИН символ.
cin >> a;//вводимо один символ.
char *b = &a;//b тепер вказує на a
int k = strlen(&a);//!!! strlen шукає в послідовності символів нульовий ('\0'), а у нас нема послідовності, 
//у нас рівно один символ; strlen же почне читати наступні за ним, а що там за ним - хто зна...

Далі не краще.
Якщо треба ввести як завгодно велике натуральне число, то треба спершу ввести рядок, а потім перевірити його, чи є там щось, крім цифр. Ну а потім виводити по одній цифрі, десь так, як і у вас в кінці. Ну і взагалі - ви C чи C++ вчите?

це на с++ пробую реалізувати(як видно по моїм спробам, поки що безутішно)
вот моя спроба це зробити через масив, але тут вилітає ще одна проблема: як ініціалізувати довжину мого масиву (k) якщо він буде об'явлений вже після компіляції

int _tmain(int argc, _TCHAR* argv[])
{
    int k;
    char *a= new char[k];
    cin >> a;
    k = strlen(&*a);
    for(int i = 0; i<k; i++)
    {
        cout<< a[i]<< "\n";
    }
    system("pause");
    return 0;
}

створюйте масив достатньої довжини, аби туди влізло число, наприклад. Або використовуйте контейнер vector

7

Re: Некоректно виводиться результат

Skyzerks Synx написав:
int _tmain(int argc, _TCHAR* argv[])
{
    char *a = new char[];
    cin >> a;
    char *b = &*a;
    int k = strlen(&*a);
    char *c = new char [k];
    *b=*c;
    for(int i = 0; i<k; i++)
    {
        cout<< c[i]<< "\n";
    }
    system("pause");
    return 0;
}

тепер виводить потрібну кількість символів....но це не цифри, а знов ці букви  *SCRATCH*

нафіга ви тут робите

 char *a = new char[];
    cin >> a;
    char *b = &*a;

А потім ще й

 char *c = new char [k];
    *b=*c;

І тут ви ж

 int k = strlen(&*a);

отримуєте адресу на початок масиву

a

що рівноцінно простому запису

a

чи нє?
До того ж тут

 char *a = new char[];
    cin >> a;

ви створюєте масив нульової довжини, а потім записуєте дані поза його межами

8

Re: Некоректно виводиться результат

і так, спроба не використовуви ініцалізовану довжину провалилась, попробував ініціалізувати, тепер фуричить  :D

int _tmain(int argc, _TCHAR* argv[])
{
    int s= 20;
    char *a= new char[s];
    cin>>a;
    int k = strlen(&*a);
    for(int i = 0; i<k; i++)
    {
        cout<< a[i]<< "\n";
    }
    system("pause");
    return 0;
}

поділюсь кодом, може кому тре буде  :)

9

Re: Некоректно виводиться результат

Skyzerks Synx написав:

і так, спроба не використовуви ініцалізовану довжину провалилась, попробував ініціалізувати, тепер фуричить  :D

int _tmain(int argc, _TCHAR* argv[])
{
    int s= 20;
    char *a= new char[s];
    cin>>a;
    int k = strlen(&*a);
    for(int i = 0; i<k; i++)
    {
        cout<< a[i]<< "\n";
    }
    system("pause");
    return 0;
}

поділюсь кодом, може кому тре буде  :)

а де захист від дурнів?

10

Re: Некоректно виводиться результат

FakiNyan написав:
Skyzerks Synx написав:

і так, спроба не використовуви ініцалізовану довжину провалилась, попробував ініціалізувати, тепер фуричить  :D

int _tmain(int argc, _TCHAR* argv[])
{
    int s= 20;
    char *a= new char[s];
    cin>>a;
    int k = strlen(&*a);
    for(int i = 0; i<k; i++)
    {
        cout<< a[i]<< "\n";
    }
    system("pause");
    return 0;
}

поділюсь кодом, може кому тре буде  :)

а де захист від дурнів?

ем....захист від дурнів не прорахований на креативність цих самих "дурнів"  :D  :D

11 Востаннє редагувалося FakiNyan (09.10.2014 20:46:43)

Re: Некоректно виводиться результат

Skyzerks Synx написав:
FakiNyan написав:
Skyzerks Synx написав:

і так, спроба не використовуви ініцалізовану довжину провалилась, попробував ініціалізувати, тепер фуричить  :D

int _tmain(int argc, _TCHAR* argv[])
{
    int s= 20;
    char *a= new char[s];
    cin>>a;
    int k = strlen(&*a);
    for(int i = 0; i<k; i++)
    {
        cout<< a[i]<< "\n";
    }
    system("pause");
    return 0;
}

поділюсь кодом, може кому тре буде  :)

а де захист від дурнів?

ем....захист від дурнів не прорахований на креативність цих самих "дурнів"  :D  :D

Ви б мали зробити перевірку введених даних, а не знущатися наді мною. Якщо хочете стати норм пограмістом, то тре допрацьовувати деталі, і під час думки про те, якою має бути прога, мислити не як програміст, а як звичайний юзер. Просто уявіть, якою ви б хотіли бачити свою прогу, і неважливо, наскільки її написання може здатися вам важким, важливо лише те, що це буде ідеальна прога, ліл. Ну це філософія кароч. Звісно, якщо вам це все до дупи не здалось, а тре лише лабу здати, то можна писати як небудь.

12

Re: Некоректно виводиться результат

FakiNyan написав:
Skyzerks Synx написав:
FakiNyan написав:

а де захист від дурнів?

ем....захист від дурнів не прорахований на креативність цих самих "дурнів"  :D  :D

Ви б мали зробити перевірку введених даних, а не знущатися наді мною. Якщо хочете стати норм пограмістом, то тре допрацьовувати деталі, і під час думки про те, якою має бути прога, мислити не як програміст, а як звичайний юзер. Просто уявіть, якою ви б хотіли бачити свою прогу, і неважливо, наскільки її написання може здатися вам важким, важливо лише те, що це буде ідеальна прога, ліл. Ну це філософія кароч. Звісно, якщо вам це все до дупи не здалось, а тре лише лабу здати, то можна писати як небудь.

які предвзяті судження, однак.
Якби мені треба було здати це як лабу, я б прописував ще коментарі (хотя прийдеться, а то забуду що я тут настрочив),
а код програми так написав щоб не було нічого зайвого. Я міг би впаяти перевірку на ці всі виключення і добавити тексту, але стояла реальна задача, я її  просто хотів вирішити, не відводячи увагу на перевірку і дописування тексту (я в курсі що коментарі дуже важливі, але в процесі написання збивають з думки).

13

Re: Некоректно виводиться результат

(&*a) - це адреса того, на що вказує a, тобто це - просто a:
int k = strlen(a);
Ну і для початківця нормально не передбачити захист від більш ніж 100 символів. Могли б і просто зробити

char a[100];

це теж на початку нормально. А от в виробничому коді таке вже не катить - хіба що вводити не більш ніж по 99 символів.

14

Re: Некоректно виводиться результат

koala написав:

(&*a) - це адреса того, на що вказує a, тобто це - просто a:
int k = strlen(a);
Ну і для початківця нормально не передбачити захист від більш ніж 100 символів. Могли б і просто зробити

char a[100];

це теж на початку нормально. А от в виробничому коді таке вже не катить - хіба що вводити не більш ніж по 99 символів.

вот я і кажу, я хотів зробити так що ініціалізація цієї довжини була вже в процесі роботи програми, але компілятор просто відказується таке робити.
Якщо у вас є ідея як записати в коді таку дію, мені буде цікаво розглянути варіанти.
Дуже часто стикаюсь з такою проблемою.

15 Востаннє редагувалося koala (09.10.2014 21:16:25)

Re: Некоректно виводиться результат

У вас проблема не просто в тому, щоб ініціалізація була в процесі роботи програми, а в тому, щоб вона була в процесі вводу. Можете зробити це вручну - вводити по символу, доки лишається місце у виділеному вами масиві, а коли закінчиться - збільшувати (==виділяти удвічі більшу пам'ять і копіювати туди вже введене, а стару звільняти); а можете використовувати стандартний std::string (але там є проблема з пробілами, тому доведеться читати getline-ами).

Подякували: Skyzerks Synx1

16

Re: Некоректно виводиться результат

Нова задачка: вивести строку в зворотньому порядку.
Вот мій код:

#include "stdafx.h"
#include <iostream> 
using namespace std; 
#pragma warning(disable: 4996) //отключаем _CRT_SECURE_NO_WARNINGS
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_CTYPE, "rus");
    char st[80];
    char temp;
    int i, len =0;
    printf("\nВведите строку > ");
    scanf("%s", st);
    while(st[len++]); //вычисление длины строки
    len-=2; //Поправка на символ конца строки и нумерацыю с нуля
    for(i=0;i<len; i++, len--)
    {
        temp=st[i]; //обмен символов
        st[i] = st[len];
        st[len]=temp;
    }
    printf("\nПолученная строка > %s\n\n", st);
    system("pause");
    return 0;
}

Вот тільки код не сприймає пробіла, і якщо ввести якесь речення з пробілами, тільки перше слово буде відображатись в зворотньому порядку, всі інші слова просто пропускає.  *SCRATCH*

17

Re: Некоректно виводиться результат

#include <iostream>
scanf("%s", st);

Ви або хрестика зніміть, або труси одягніть. С і C++ - різні мови, оберіть вже щось одне.
Для того, щоб прочитати весь рядок, треба gets або getline використовувати. Або фільтрувати пробіли, але це вже складніше.

Подякували: Skyzerks Synx1

18 Востаннє редагувалося Skyzerks Synx (11.11.2014 19:26:53)

Re: Некоректно виводиться результат

koala написав:
#include <iostream>
scanf("%s", st);

Ви або хрестика зніміть, або труси одягніть. С і C++ - різні мови, оберіть вже щось одне.
Для того, щоб прочитати весь рядок, треба gets або getline використовувати. Або фільтрувати пробіли, але це вже складніше.

Фільтрувати пробіли пробував, але більше ніж

if(st[i]==" ")...

не спроможний.

19

Re: Некоректно виводиться результат

Skyzerks Synx написав:

Фільтрувати пробіли пробував, але більше ніж

if(st[i]==" ")...

не спроможний.

Для визначення "символів пробілу" пропоную застосовувати функцію isspace з модуля cctype. Вона визначає не тільки пробіли але й табуляції, символи повернення строки і т.д.
До речі, подивіться на приклад в описанні функції, можливо він зацікавить вас в вирішенні вашої проблеми http://www.cplusplus.com/reference/ccty … kw=isspace

20

Re: Некоректно виводиться результат

scanf("%[^\n]s",st);

вводити все, крім \n, включно із пробілами.
Але ще раз, вам gets потрібен.

Подякували: Skyzerks Synx1