2014-01-13 2 views
1

Я пытаюсь сделать программу банковского счета, что:функции C++ сделать ссылку

Создать класс учетной записи, которая имеет номер учетный, ПИН-код, и баланс. Номер Acct и PIN-код входят в конструктор. Номер счета никогда не изменяется. PIN-код можно изменить, но только если в качестве аргумента указан правильный номер учетной записи. Баланс может быть изменен только в том случае, если правильный код PIN и номер счета представлены в качестве аргументов (вместе с новым балансом, конечно) к этому методу. Создайте способ печати номера счета и текущего баланса вместе.

до сих пор у меня есть:

#include <iostream> 
#include <string> 
using namespace std; 

//account structure 
struct account{ 
    char accountNumber[10]; 
    char pin[10]; 
    double balance; 
}account1, account2; 

int main() { 

    //set account info 
    account1.accountNumber = 00011; 
    account1.pin = 1234; 
    account1.balance = 0.00; 

    //set account info 
    account2.accountNumber = 00022; 
    account2.pin = 4321; 
    account2.balance = 100.00; 

    //program end 
    return 0; 
} 

//function to change account pin 
void changePin(char accountNumber, char pin, char newPin)//PROBLEM 
{ 
    if(strcmp(accountNumber.pin, pin) == 0) 
    { 
     accountNumber.pin = newPin; 
    } 
    else 
    { 
     cout << "Account number or password incorrect."; 
    } 
} 

//change account balance 
void changeBalance(char number, char pin, double newBalance)//PROBLEM 
{ 
    if((strcmp(account.pin, pin) == 0) && (strcmp(account.accountNumber, number) == 0)) 
     { 
      account.balance = newBalance; 
     } 
    else 
    { 
     cout >> "Account number or pin incorrect."; 
    } 
} 

//function to print account number and balance 
void printInfo(char accountNumber)//PROBLEM 
{ 
    cout << "Account Number: " << account.accountNumber; 
    cout << "Account Balance: " << account.balance; 
} 

Теперь моя проблема, я не знаю, как ссылаться на учетную запись, я хочу в функции для сравнения, соответствует ли информация вводится в данные текущего счета.

EDIT: Я почти сделал с моей программой, я просто сталкиваясь с проблемой здесь:

class Account; 
class Account{ 

public: 
    int accountNumber; 
    char pin[5]; 
    double balance; 

    void printInfo(); 
    void changeBalance(int n, char * p, double b); 
    void changePin(int n, char * p, char * newPin); 
}; 
void Account::changePin(int n, char * p, char * newPin) 
{ 
    if((n == accountNumber) && (strcmp(p, pin) == 0)) 
    { 
     //pin = newPin; 
    } 
} 

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

+0

Поскольку вы отметили этот 'C++', кажется, что логично, что вы хотите использовать * методы * на объекте 'account' для выполнения такого рода вещей. Таким образом, вы вызываете метод со ссылкой на существующую учетную запись. Это звучит разумно? –

+0

Вы, кажется, новичок в C++. Вы новичок в программировании вообще, или вы исходите с другого языка? Это может помочь нам объяснить в терминах, с которыми вы более знакомы. – Tim

+0

Я сделал немного java, но да, я начал C++ – user3188716

ответ

2

Создание класса счета

class очень похож на struct в исполнении, но концептуально они несколько иначе:

В дни c, вы можете иметь некоторые данные, которые принадлежат вместе (например, номер счета, баланс, контакт), и поэтому вы должны использовать struct, чтобы сохранить все в одном комплекте. Вы можете думать об этом как (физическую) папку в шкафу для хранения документов - все это в одном месте, но это всего лишь совокупность данных, не более того. Это struct.

Чтобы использовать эту папку с файлами, вам нужно получить папку, посмотреть, что в ней находится, и решить, что с ней делать. В этой папке нет реальной защиты данных. Это аналогично наличию множества функций, которые вы можете передать экземпляру struct, и функция может изменять содержимое этой структуры. Так происходит в c, но нет защиты данных, это может быть довольно утомительно, и было желание чего-то лучшего.

A class имеет данные и методы. Внезапно, это не безжизненная папка с файлами. Теперь это настоящий миньон - он содержит данные, но вы также можете сказать, что он что-то делает для вас, и он знает, как использовать свои собственные данные для выполнения задачи. Таким образом, миньон может защитить данные от внешних помех и по-прежнему выполнять полезную работу.

Итак, как предлагает @Greg, определение класса было бы лучшим подходом здесь. Вы хотите, чтобы он содержал уникальные для каждой учетной записи данные и методы, которые будут обрабатывать данные (конструктор для его инициализации, другие - для изменения ПИН-кода и баланса и, вероятно, некоторые геттеры для просмотра данных - или, по крайней мере, что-то распечатайте его для отладки).

Делая это таким образом, нет необходимости в ссылках, но я немного поговорю о типах данных за один момент, потому что вы тоже смущены этим.

типы данных

Давайте посмотрим на ваш счет структуры:

struct account{ 
    char accountNumber[10]; 
    char pin[10]; 
    double balance; 
}; 

Что такое balance? Это число с плавающей запятой. Это означает, что он содержит число, которое может иметь десятичную точку. Например, это может быть 5, 3.7, 3.1415926535898, -123, -2.34 и т. Д. Но это не может быть «собака», «кошка» или буква «q».

Что такое accountNumber и pin? Вы создали их как массивы символов (в частности, длиной 10 символов). Что это значит? Ну, они могут содержать блок символов, 9 символов или меньше (не забудьте оставить место для нулевого терминатора). Например, они могут содержать «1», «2.3», «1.2.3.4», «dog», «cat», «^ & * $^@ <> X".

Обратите внимание, что существует мир разницы между 1 и "1". 1 - это номер. Если бы мы заглянули внутрь компьютера на всех и на нули, он будет храниться в памяти как-то вроде 00000000 00000000 00000000 00000001. Обычно мы записываем такое число в шестнадцатеричном виде, потому что оно короче, и это выглядит так: 0x00000001. Это 32-битный (он же 4 байта). Это специфично для платформы, но это наиболее часто встречающееся и должно быть достаточно, чтобы контрастировать с текстовым «1»:

«1» - это два символа: «1» и «\ 0» (символ - - не номер - один, а нулевой ограничитель для завершения строки). Это будет в памяти примерно так: 00110001 00000000 - или int hex: 0x3100. Обратите внимание, что это МНОГО короче (каждый символ - один байт), поэтому «1» - всего 2 байта, а фактическое целое число - 4 байта. и что 1-бит находится в другом месте. и что '1' на самом деле является шестнадцатеричным 0x31!

Важно понимать разницу между символьными строками и числами. В основном, строки символов предназначены для текста (или для печати номеров в формате для чтения человеком), тогда как числовые типы данных предназначены для фактической числовой работы.

Имея это в виду, вы можете пересмотреть свои типы данных здесь.

Заголовок против Источника, Декларация против определения

то, что C++ имеет, что Java не хватает, это файлы заголовков. Они могут быть очень сложными и раздражающими порой, но также весьма полезны другими способами. Оставив это в стороне, я просто сосредоточусь на практических аспектах того, что происходит.

Объявления против Определения

Во-первых, что такое заявление? Это способ сообщить компилятору «У меня есть вещь». Это, вероятно, кажется чрезмерно основным, но контрастирует с определением:

A определение - это способ сообщить компилятору «Вот как выглядит эта вещь».

Итак, если вы хотите создать функцию, есть очень мало, что необходимо для объявления:

int AddTheseNumbers(int a, int b); 

Это говорит компилятор достаточно о AddTheseNumbers, что теперь мы можем написать код, который использует его. Компилятор знает:

  • Название функции.
  • Возвращаемое значение функции - поэтому он знает, сколько места в стеке выделяется для возврата.
  • Параметры (два int s, переданные по значению) - поэтому он знает, сколько нужно нажать на стек перед вызовом функции.

Но обратите внимание, что компилятор не знает: что функция на самом деле делает. Это потому, что компилятор не должен это знать. Да, нам это нужно в конце концов (очевидно, что программа не может работать без нее), но не нужно создавать файл Foo.obj (компоновщик будет использовать его при создании Program.exe).

Теперь давайте посмотрим на определение этой функции:

int AddTheseNumbers(int a, int b) { 
    return a + b; 
} 

Это же подпись как декларация - это как компилятор/компоновщик знает, что мы определяем, и теперь мы имеют корпус функции. Определение .

Заголовки для декларациях, Source являются для Определения

Итак, мы могли бы создать Simple.h с:

int AddTheseNumbers(int a, int b); 

И Simple.cpp с:

int AddTheseNumbers(int a, int b) { 
    return a + b; 
} 

Что мы могли бы составить для создания Simple.obj.

Кроме того, мы можем создать MyProgram.cpp с:

#include "Simple.h" // Hey look, I can now use my other file! 

int main(int argc, char** argv) { 
    std::cout << "Adding 3 + 5: " << AddTheseNumbers(3, 5) << std::endl; 
    return 0; 
} 

И мы можем составить, что в MyProgram.obj. Затем мы используем линкер , чтобы связать эти OBJ-файлы вместе, производя MyProgram.exe, которые мы затем можем запустить.

Классы

Это становится немного более сложным, с классами. Если коротко, то для класса Foo, мы можем сделать:

class Foo; 

Это называется вперед декларация и просто сообщает компилятору «Там структура называется Foo, но я не знаю, что в нем».Это полезно для передачи экземпляров Foo по ссылке или указателю, но вы ничего не можете сделать с Foo, потому что вы не знаете, что в нем.

class Foo { 
    int x; 
public: 
    int getX(); 
}; 

Это полное объявление Foo. Компилятор знает, какие данные в нем (что необходимо для вычисления полного размера Foo) и подписи метода (как и объявления функций выше). Этого достаточно, чтобы написать код, который делает:

Foo f; 
std::cout << f.getX(); 

И это компилируется, поскольку компилятор знает, сколько памяти выделить для Foo и как взаимодействовать с ним. Он не знает, что делает getX, но ему все равно - это работа линкера.

int Foo::getX() { 
    return x; 
} 

Это определение из getX метода Foo «ы. Это одна и та же подпись (возвращает int, без параметров), и она находится в Foo. Обратите внимание, что этот метод может просто использовать x - сам метод имеет экземпляр Foo, поэтому он может получить доступ ко всему в том же экземпляре Foo.

+0

Я вроде как получаю его сейчас. Другой вопрос: я просто помещаю то, что у меня в структуре, в новый файл cpp? что мне делать с файлом .h? – user3188716

+0

хорошо вопрос. Быстрый ответ: файлы .h предназначены для деклараций, файлы .cpp - для определений. Я отвечу более подробно в своем ответе. – Tim

+0

для вашего предыдущего долгого ответа, поэтому я должен изменить свой тип данных на int? Дело в том, что я хочу, чтобы мой номер счета/булавка начинался с нуля. 00123, будет ли программа просто читать/печатать ее как 123, если это int вместо строки? – user3188716

Смежные вопросы