Нужна помощь в понимании структуры и нескольких ошибок в программе

Я не понимаю, как правильно использовать структуры для достижения моей цели вычисления дробей (это необходимо). Откровенно говоря, я не очень понимаю, что я делаю, это всего лишь мой 3-й курс по C++, и я чувствую себя потерянным... это была поставленная перед нами задача.

Ваша функция enter() принимает дробь от пользователя. Ваша функция simple() упрощает полученную дробь, если это возможно. Ваша функция display() отображает долю, которую она получает.

Ваши глобальные функции используют тип Fraction. Тип Fraction содержит числитель и знаменатель дроби как отдельные элементы данных.

Это моя программа, только основная, ЗА ИСКЛЮЧЕНИЕМ "cin" и "cout" и функции GCF, была предоставлена ​​профессором, все остальные функции и структуры вне основного, которые я пытался сделать сам...

 #include <iostream>
 using namespace std;

void entry (int a, int b);
void simplify (double c);
void display(int x, int y)

int main() 
{

    struct Fraction fraction;
         cout << "Enter a numerator: " << endl;
         cin >> fraction.num;
         cout << "Enter a denominator: " << endl;
         cin >> fraction.den;

     cout << "Fraction Simplifier" << endl;
     cout << "===================" << endl;

     enter(&fraction);
     simplify(&fraction);
     display(fraction);
 }



        struct Fraction {
                 int num;
                 int den;
                }


        struct Fraction fraction{
                 fraction.num;
                 fraction.den;
                }

        void display(int num, int den) {
                 cout << fraction.num << endl;
                 cout << fraction.den << endl;
                }



// Great Common Factor (Euclid's Algorithm), provided by Professor

int gcf( int num1, int num2 )

{

     int remainder = num2 % num1;
     if ( remainder != 0 )
      {
         return gcf( remainder,num1 );
       }
     return num1;
}

это мои ошибки:

w2.cpp: In function 'int main()':   
w2.cpp: 14:  error: aggregate 'Fraction fraction' has incomplete type and cannot be defined 
w2.cpp: 23:  error: 'enter' was not declared in this scope   
w2.cpp: At global scope: w2.cpp:35: error: function definition does not declare parameters  
w2.cpp: In function 'void display(int, int)':   
w2.cpp: 41:  error: 'fraction' was not declared in this scope

Прошу прощения за очень длинный пост, но любая помощь приветствуется. И если бы кто-нибудь мог указать мне на полезную книгу по С++, которую я мог бы читать дома и/или на лекциях (из-за языкового барьера я не могу достаточно хорошо понять свою профессию), я также был бы признателен.


person SorryEh    schedule 30.05.2012    source источник
comment
Полное руководство и список книг по C++   -  person ildjarn    schedule 30.05.2012
comment
Мила, спасибо за список книг!   -  person SorryEh    schedule 30.05.2012
comment
В С++ вы должны поместить другие функции перед функцией, в которой они используются. Введите другие функции перед main. Также вы можете использовать предварительное объявление, но на данный момент, просто писать функции до функции, в которой они вызываются, вероятно, нормально. Также вам не хватает ; в строке 6   -  person Topo    schedule 30.05.2012


Ответы (2)


Давайте пройдемся по ним:

error: aggregate 'Fraction fraction' has incomplete type and cannot be defined

Теперь, в main(), вы сказали struct Fraction fraction;. На этом этапе вы объявляете свою структуру вперед. Он неполный, поэтому вы не можете использовать его так, как если бы он был.

Вы должны определить всю свою структуру Fraction до main(). Также обратите внимание, что struct в struct Fraction fraction; не нужен и остался от C.

 error: 'enter' was not declared in this scope

Простой. Вы объявили entry() наверху, но пытаетесь использовать enter(). Больше нечего сказать.

 At global scope: w2.cpp:35: error: function definition does not declare parameters

Теперь это немного более запутанно. Это оскорбительная строка:

struct Fraction fraction{

Как это видит компилятор, так это то, что это функция, возвращающая Fraction, но в ней отсутствует список параметров. Я не совсем уверен, что вы пытаетесь сделать с этим блоком кода.

error: 'fraction' was not declared in this scope

Похоже, вы пытаетесь использовать объект, объявленный где-то еще. Если вам нужен вариант от main(), вам придется передать его в качестве аргумента. Если вам нужна глобальная переменная fraction, все, что вам нужно в глобальном пространстве, это:

Fraction fraction;

Это должно происходить после структуры Fraction. Также обратите внимание, что поскольку этот объект имеет то же имя, что и объект в main(), объект в main() затеняет этот, и если вы хотите получить доступ к глобальному объекту из main(), вам нужно использовать ::fraction.

Я надеюсь, что это поможет прояснить часть понимания.

Некоторые другие ошибки, которые я вижу:

enter(&fraction);

Вы передаете Fraction * функции, которая принимает два int. Я думаю, вы бы хотели, чтобы этот получил Fraction &. Затем вы можете просто вызвать его как enter (fraction);, чтобы он изменил переданный объект.

simplify(&fraction);

Аналогично, но этот занимает double. Я думаю, вы бы тоже хотели, чтобы он получил Fraction &.

  • Ваши функции entry и simplify никогда не определяются, но вы все равно пытаетесь их использовать.
  • display должен взять Fraction, чтобы напечатать его части.
person chris    schedule 30.05.2012
comment
ничего себе, это и dirkgently сделало вещи намного более ясными. Я приблизился к завершению, теперь большинство ошибок исчезло, и мне просто нужно исправить другие функции. фу, я напрягался из-за этого, ха-ха. Один вопрос, ничего, если я распечатаю это и сделаю несколько копий для некоторых одноклассников, они могли бы использовать эту информацию, потому что я знаю, что некоторые из них находятся в той же лодке, что и я. - person SorryEh; 30.05.2012

Список рекомендуемых книг по C++. Поиск на этом сайте также помогает.

В C++ структуры (или классы) и объединения образуют два основных типа определяемых пользователем структур данных. Определяемая пользователем структура данных — это модель/чертеж чего-то (это может быть реальная величина или абстрактная концепция), с которой вы хотите, чтобы ваша программа работала. Итак, если вам нужна структура для хранения имен ваших друзей, вы, вероятно, сделаете что-то вроде этого:

struct FriendName {
    std::string first, last;
}; // the semi-colon is required here

first и last являются членами вашей структуры. std::string — это тип этих членов, который сообщает компилятору, какие данные вы хотите сохранить — здесь данные представляют собой строки, мы используем соответствующий тип, определенный библиотекой.

После того, как вы определили нечто, называемое FriendName, вы можете использовать его для хранения данных, а также работать с этими данными. Однако если вы попытаетесь снова определить FriendName, компилятор выдаст сообщение об ошибке. Что и происходит с вашим кодом.

Теперь, чтобы использовать эту структуру данных, вам нужно создать объект (область памяти, которая представляет конкретный экземпляр FriendName). Вы можете создать объект следующим образом:

FriendName fred; // note that I don't need to use struct FriendName 

и вы можете продолжить и использовать его как:

fred.first = "Fred"; // write 'fred' object's first name
fred.last = "Flintstone";

Имя объекта работает как маркер, который в сочетании с оператором . и именем элемента позволяет вам читать/записывать этот конкретный элемент.

Предположим, вы хотите прочитать имена из консоли: в этом случае вы должны сделать:

FriendName wilma;
std::cin >> wilma.first >> wilma.last; // read in 'wilma' objects members one by one

Теперь там достаточно, чтобы вы начали!

person dirkgently    schedule 30.05.2012
comment
Хорошее объяснение. Однако, к сожалению, есть большое количество ошибок, не связанных только со структурами данных. - person chris; 30.05.2012
comment
@Крис: Спасибо! Я заметил их. Но я решил заняться этим сразу же, учитывая относительное незнание ОП базового С++. Кроме того, это домашнее задание, я тоже не хочу портить ему вечеринку :) - person dirkgently; 30.05.2012
comment
Верно, но Quite frankly I don't have much of an idea of what I'm doing побудил меня пройти и попытаться объяснить, как избавиться от неопределенности и выйти, зная, почему ничего из этого не работает, и как их правильно использовать. Некоторые из них могут быть довольно запутанными, если вы не знаете, что делаете, и встаете на путь, который позже заканчивается плохо. Я думаю, что раннее объяснение этих ошибок помогает хорошо начать, а не просто исправлять код, не зная, почему он действительно работает (что позже вызовет огромную проблему). - person chris; 30.05.2012
comment
@chris: я надеюсь, что ОП читает оба. Ваш ответ дополняет мой (намного более технический)! Пожалуйста, не думайте, что я критичен. OTOH, я надеялся, что кто-то другой (читай менее ленивый) действительно проработает отдельные ошибки: P - person dirkgently; 30.05.2012
comment
Не беспокойтесь об этом. Я полностью понимаю, что вы имеете в виду. Программисты объединяйтесь! - person chris; 30.05.2012
comment
@drikgently это было превосходно, я хотел бы распечатать это, если вы не против, вместе с сообщением Криса, чтобы добавить к объяснению, с которым я хотел бы помочь своим одноклассникам, так как они борются так сильно, как Я. Спасибо Диркгентли - person SorryEh; 30.05.2012
comment
@Umeed, это не защищено авторским правом или что-то в этом роде. SO предназначен для того, чтобы люди продолжали использовать его даже после того, как проблема была решена. Некоторое время спустя кто-то может найти идентичную ошибку и найти это. - person chris; 30.05.2012
comment
@Umeed: Не стесняйтесь использовать материал (по крайней мере, я публикую) любым способом, который вам поможет! Контент на этом сайте использует лицензию CC 3.0, что означает, что вы можете делиться/ремикшировать это до тех пор, как вы приписываете. - person dirkgently; 30.05.2012