1 / 0 / 1
Регистрация: 02.10.2012
Сообщений: 71
1

Нелогичная работа кода

15.03.2014, 18:39. Показов 1866. Ответов 35
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть код. Но делает он совсем не то, что по идее должен.
Вот код:
1) файл main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//---------------------------------------------------------------------------
#include "LongNumber.hpp"
#include <iostream>
//---------------------------------------------------------------------------
using namespace std;
//---------------------------------------------------------------------------
int main()
{
        LongNumber a;
        a.setdata();
        a.view();
 
        system("pause");
        return 0;
}
//---------------------------------------------------------------------------
2) Файл LongNumber.hpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#ifndef LONGNUMBER_H
#define LONGNUMBER_H
class LongNumber
{
   private:
        char num[];
        int count;
        int base;
   public:
        LongNumber();
        void setdata();
        void view();
};
#endif
3) Файл LongNumber.hpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include "LongNumber.hpp"
#include <iostream>
//---------------------------------------------------------------------------
using namespace std;
//---------------------------------------------------------------------------
LongNumber::LongNumber()
{ }
//---------------------------------------------------------------------------
void LongNumber::setdata()
{
        printf("Enter the count: ");
        scanf("%d", &count);
        printf("Enter the number: ");
        scanf("%s",num);
        printf("Enter the base: ");
        scanf("%d",&base);
}
//---------------------------------------------------------------------------
void LongNumber::view()
{
        printf ("Number = %s \n", num);
        printf ("Count = %d \n", count);
        printf ("Base = %i \n", base);
}
//---------------------------------------------------------------------------
Есть задача: ввести с клавиатуры "число"(по сути строку, т.к. число не обязательно в 10чной системе счисления), и ввести основание системы счисления введенного числа. Это метод getdata(). Метод view() должен вывести данные в консоль.
Написал код, вроде должен работать. Но, в итоге получаются какие-то дивные вещи:
1) Вводишь count - все ок. Когда вводишь num то в count уже другие значения.
2) View выводит бред взятый непонятно откуда.

Почему код работает таким странным способом? Как исправить ошибку?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.03.2014, 18:39
Ответы с готовыми решениями:

Нелогичная работа mouse_event MOUSEEVENTF_MOVE
void Draw() { HDC hdc = GetDC(HWND_DESKTOP); int cx = GetSystemMetrics(SM_CXSCREEN); int cy...

Неправильная работа кода
я уже обращалась с этим вопросом. у меня код написан без ошибок. работать он должен: я задаю ему...

Сортировка Шелла работа кода
Ребята, вопрос возможно простой, но лично я не совсем понимаю что происходит #include &lt;cstdlib&gt;...

Работа со стеками, объяснение кода программы
Есть код программы (вырванный из целой проги кусок). В нем используются стеки. Помогите,...

35
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
15.03.2014, 18:45 2
Размер массива укажите.

Добавлено через 1 минуту

Не по теме:

Вот нафига люди подключают iostream и пишут using namespace когда не используют ни то, ни другое?



Добавлено через 1 минуту
Ссылка по теме (видимо) http://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html
0
Croessmah
15.03.2014, 18:45
  #3

Не по теме:

Цитата Сообщение от 0x10 Посмотреть сообщение
Вот нафига люди подключают iostream и пишут using namespace когда не используют ни то, ни другое?
потому что в студии там подрубается cstdio и cstdlib :D

0
1 / 0 / 1
Регистрация: 02.10.2012
Сообщений: 71
15.03.2014, 18:57  [ТС] 4
Цитата Сообщение от 0x10 Посмотреть сообщение
Размер массива укажите.
Размер массива заранее неизвестен. Пользователь может ввести один символ, а может и не один.
0
61 / 37 / 16
Регистрация: 15.03.2014
Сообщений: 315
15.03.2014, 19:09 5
MrDreher, так выделяйте память динамически, используя указатели.
0
1 / 0 / 1
Регистрация: 02.10.2012
Сообщений: 71
15.03.2014, 19:46  [ТС] 6
Вот так работает:
1) Файл LongNumber.hpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#ifndef LONGNUMBER_H
#define LONGNUMBER_H
class LongNumber // класс длинное число
{
   private:
        int feet;
        float inches;
        
        char *num; // указатель на число
        int count; // кол-во знаков
        int base; // основание системы счисления
   public:
        LongNumber();
        LongNumber(int, float);
        void setdata();
        void view();
        LongNumber operator+ ( LongNumber ) const;
        LongNumber operator* ( LongNumber ) const;
};
#endif
Файл LongNumber.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include "LongNumber.hpp"
//---------------------------------------------------------------------------
LongNumber::LongNumber()
{ }
//---------------------------------------------------------------------------
// получение информации от пользователя
void LongNumber::setdata()
{
        printf("Enter the count: ");
        scanf("%d", &count);
 
        printf("Enter the number: ");
        string num_str;
        scanf("%s",num_str);
        num = &num_str[0];
        
        printf("Enter the base: ");
        scanf("%d",&base);
        printf("Enter the base: ");
}
//---------------------------------------------------------------------------
// вывод информации
void LongNumber::view()
{
        printf ("Number = %s \n", &num);
        printf ("Count = %d \n", count);
        printf ("Base = %d \n", base);
}
//---------------------------------------------------------------------------
Всем спасибо за советы/ответы.
0
С++ Beginner
120 / 120 / 77
Регистрация: 28.02.2013
Сообщений: 246
15.03.2014, 19:58 7
Цитата Сообщение от 0x10 Посмотреть сообщение
Вот нафига люди подключают iostream и пишут using namespace когда не используют ни то, ни другое?

Не по теме:

Шаблон наверное

1
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
15.03.2014, 20:05 8
MrDreher, делает вид, что работает. Локальный объект num_str уничтожается после выхода из области видимости и указатель становится невалиден.
2
just_freelance
15.03.2014, 20:08
  #9

Не по теме:

Цитата Сообщение от MrDreher Посмотреть сообщение
num = &num_str[0];
А за такое вообще руки отрубать нужно.

0
rikimaru2013
15.03.2014, 20:13
  #10

Не по теме:

Цитата Сообщение от just_freelance Посмотреть сообщение
А за такое вообще руки отрубать нужно.
Потому, что вместо num = num_str он явно для себя ЯКОБЫ НАПОМИНАЕТ, что в Num адрес массива? Если рубать руки, то за то что переменная типа указатель имеет имя num, что не подскажет ему, что там char * через месяц

0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
15.03.2014, 20:16 11
Цитата Сообщение от MrDreher Посмотреть сообщение
Размер массива заранее неизвестен.
Размер статического массива не может быть не известен.
0
1 / 0 / 1
Регистрация: 02.10.2012
Сообщений: 71
15.03.2014, 20:16  [ТС] 12

Не по теме:

Цитата Сообщение от just_freelance Посмотреть сообщение
А за такое вообще руки отрубать нужно.
Можно хоть правую оставить? :)



Если я в LongNumber.hpp заменяю "char *num" на "string num" при компиляции выдает ошибки:
1) Type name expected
2) Declaration missing
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
15.03.2014, 20:21 13
Цитата Сообщение от MrDreher Посмотреть сообщение
Пользователь может ввести один символ, а может и не один.
В этот "массив" он вообще ничего ввести не может, вводить просто некуда, так как размер равен нолю.

Добавлено через 2 минуты
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Если рубать руки, то за то что переменная типа указатель имеет имя num, что не подскажет ему, что там char * через месяц
А ничего, что базовый тип указан безо всяких переименований? В моих прогах вообще все такие указатели не зависимо от фактического типа зовут Data и ничего, не путаюсь. А вот за присваивание локального адреса надо не руки рубить, а хвост.
0
MrDreher
15.03.2014, 20:35  [ТС]
  #14

Не по теме:


Цитата Сообщение от taras atavin Посмотреть сообщение
В моих прогах вообще все такие указатели не зависимо от фактического типа зовут Data и ничего, не путаюсь.
Гений. Можешь называть все свои переменный data, ведь это твои проблемы. Пример ты привел не очень удачный - ты не являешься примером для подражания и то что твой код может быть похож на бред сумасшедшего меня не удивит.

0
18829 / 9832 / 2403
Регистрация: 30.01.2014
Сообщений: 17,270
15.03.2014, 23:16 15
MrDreher, у тебя там еще одна проблема, про которую никто не сказал. Нельзя писать в объект std::string через scanf таким образом как у тебя написано.
Цитата Сообщение от MrDreher Посмотреть сообщение
C++
1
scanf("%s",num_str);
Компилятор это пропустил только потому, что в scanf эллипсис (три точки), который априори не проверяет типы.
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
16.03.2014, 05:26 16
Цитата Сообщение от MrDreher Посмотреть сообщение
и то что твой код может быть похож на бред сумасшедшего меня не удивит.
Не может, в отличие от кода ТС и твоего. Имя переменной должно говорить только о её назначении, а о типе должен говорить тип. У меня так и есть.
0
Заблокирован
16.03.2014, 06:07 17
Цитата Сообщение от taras atavin Посмотреть сообщение
В этот "массив" он вообще ничего ввести не может, вводить просто некуда, так как размер равен нолю.
боян. в данном случае массива просто не как такового. Это Си наследованный синтаксис константного указателя. Это гавно вообще и крестов в частности. Убей себя крестами, пиши на си++.
__
Негодующий функциональщик.

Добавлено через 1 минуту
Цитата Сообщение от MrDreher Посмотреть сообщение
Если я в LongNumber.hpp заменяю "char *num" на "string num" при компиляции выдает ошибки:
1) Type name expected
2) Declaration missing
ты должен понимать разницу. Но ты ее не понимаешь и не знаешь. А если будешь пытаться писать программы на с++ то никогда и не узнаешь.
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
16.03.2014, 06:14 18
Цитата Сообщение от alkagolik Посмотреть сообщение
в данном случае массива просто не как такового.
А почему по-твоему в кавычках?
0
Заблокирован
16.03.2014, 06:15 19
Цитата Сообщение от taras atavin Посмотреть сообщение
А почему по-твоему в кавычках?
а кто туда сегодня где-то?
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
16.03.2014, 06:15 20
Цитата Сообщение от alkagolik Посмотреть сообщение
А если будешь пытаться писать программы на с++ то никогда и не узнаешь.
Да ну! А на чём же её ещё узнавать? Неужели на бейсике, где char* просто не предусмотрен? Или ваще не прологе, где нет и string?
0
16.03.2014, 06:15
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.03.2014, 06:15
Помогаю со студенческими работами здесь

Работа с файлом в виде двоичного кода
Здравствуйте. Продолжаю работу над внедрением в картинку TIFF текстового файла. Собственно говоря,...

Работа с двумерным массивом - разобрать строку кода
Изучаю С++ по книге Шилдт Г.(базовый курс 3-е издание). В теме двумерных массивов столкнулся со...

Не правильная работа кода с std::string::empty()
Здравствуйте подскажите в чем проблема? #include &lt;iostream&gt; #include &lt;string&gt; using namespace...

Непонятна часть кода программы - работа с файлами
Программа, выводящая символы из файла в обратном порядке. Часть кода: ..... ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Закрытая тема Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru