2010-03-20 3 views
0

У меня проблемы с моей программой. Когда я запускаю его, он запрашивает у пользователя альбом, название, но затем он просто выходит из цикла, не спрашивая цену и налог на продажу. Любые идеи, что происходит?C++ cin keep skipping

Это пример запуска

 
Discounts effective for September 15, 2010 
Classical 8% 
Country 4% 
International 17% 
Jazz 0% 
Rock 16% 
Show 12% 
Are there more transactions? Y/N 
y 
Enter Artist of CD: 
Sevendust 
Enter Title of CD: 
Self titled 
Enter Genre of CD: 
Rock 
enter price 
Are there more transactions? Y/N 
Thank you for shopping with us! 

код программы:

#include <iostream> 

#include <string> 



using namespace std; 



int counter = 0; 

string discount_tiles[] = {"Classical", "Country", "International", "Jazz", "Rock", "Show"}; 

int discount_amounts[] = {8, 4, 17, 0, 16, 12, 14}; 

string date = "September 15, 2010"; 



// Array Declerations 

    //Artist array 

    char** artist = new char *[100];   

    //Title array 

    char** title = new char *[100]; 

    //Genres array 

    char** genres = new char *[100]; 

    //Price array 

    double* price[100]; 

    //Discount array 

    double* tax[100]; 

    // sale price array 

    double* sale_price[100];  

    //sale tax array 

    double* sale_tax[100]; 

    //cash price array 

    double* cash_price[100];  



//Begin Prototypes 

char* getArtist(); 

char* getTitle(); 

char* getGenre(); 

double* getPrice(); 

double* getTax(); 

unsigned int* AssignDiscounts(); 

void ReadTransaction (char ** artist, char ** title, char ** genre, float ** cash, float & taxrate, int albumcount); 

void computesaleprice(); 





bool AreThereMore(); 



//End Prototypes 



bool areThereMore() 

{ 

    char answer; 

    cout << "Are there more transactions? Y/N" << endl; 

    cin >> answer; 

    if (answer =='y' || answer =='Y') 

     return true; 

    else 

     return false; 

} 



char* getArtist() 

{ 

    char * artist= new char [100]; 

    cout << "Enter Artist of CD: " << endl; 

    cin.getline(artist,100); 

    cin.ignore(); 

    return artist; 

} 



char* getTitle() 

{ 

    char * title= new char [100]; 

    cout << "Enter Title of CD: " << endl; 

    cin.getline(title,100); 

    cin.ignore(); 

    return title; 

} 



char* getGenre() 

{ 

    char * genre= new char [100]; 

    cout << "Enter Genre of CD: " << endl; 

    cin.getline(genre,100); 

    cin.ignore(); 

    return genre; 

} 



double* getPrice() 

{ 

    //double* price = new double(); 

    //cout << "Enter Price of CD: " << endl; 

    //cin >> *price; 



    //return price; 



    double p = 0.0; 

    cout<< "enter price" << endl; 

    cin >> p; 

    cin.ignore(); 

    double* pp = &p; 

    return pp; 

} 



double* getTax() 

{ 

    double* tax= new double(); 

    cout << "Enter local sales tax: " << endl; 

    cin >> *tax; 



    return tax; 

} 



int findDiscount(string str){ 



    if(str.compare(discount_tiles[0]) == 0) 

     return discount_amounts[0]; 

    else if(str.compare(discount_tiles[0]) == 0) 

     return discount_amounts[1]; 

    else if(str.compare(discount_tiles[0]) == 0) 

     return discount_amounts[2]; 

    else if(str.compare(discount_tiles[0]) == 0) 

     return discount_amounts[3]; 

    else if(str.compare(discount_tiles[0]) == 0) 

     return discount_amounts[4]; 

    else if(str.compare(discount_tiles[0]) == 0) 

     return discount_amounts[5]; 

    else{ 

     cout << "Error in findDiscount function" << endl; 

     return 0; 

    } 

} 



void computesaleprice() 

{ 

    /** fill in array for all purchases **/ 

    for(int i=0; i<=counter; i++){ 

     double temp = *price[i]; 

     temp -= findDiscount(genres[i]); 

     double* tmpPntr = new double(); 

     tmpPntr = &temp; 

     sale_price[i] = tmpPntr; 

     delete(&temp); 

     delete(tmpPntr); 

    } 

} 











void printDailyDiscounts(){ 

    cout << "Discounts effective for " << date << endl; 

    for(int i=0; i < 6; i++){ 

     cout << discount_tiles[i] << "\t" << discount_amounts[i] << "%" << endl; 

    } 

} 



//Begin Main 

int main() 

{ 







    for(int i=0; i<100; i++){ 

     artist[i]=new char [100]; 

     title[i]=new char [100]; 

     genres[i]=new char [100];  

     price[i] = new double(0.0); 

     tax[i] = new double(0.0); 

    } 



    // End Array Decleration 



    printDailyDiscounts(); 



    bool flag = true; 

    while(flag == true){ 

     if(areThereMore() == true){ 

      artist[counter] = getArtist(); 

      title[counter] = getTitle(); 

      genres[counter] = getGenre(); 

      price[counter] = getPrice(); 

      //tax[counter] = getTax();   

      //counter++; 

      flag = true; 

     } 

     else { 

      flag = false; 

     } 

    } 





    //compute sale prices 

    //computesaleprice(); 













    cout << "Thank you for shopping with us!" << endl; 



    return 0; 

} 

//End Main 













/** 

void ReadTransaction (char ** artist, char ** title, char ** genre, float ** cash, float & taxrate, int albumcount) 

{ 

    strcpy(artist[albumcount],getArtist()); 

    strcpy(title[albumcount],getTitle()); 

    strcpy(genre[albumcount],getGenre()); 

    //cash[albumcount][0]=computesaleprice();??????? 

    //taxrate=getTax;?????????????? 





} 

* 

* */ 







unsigned int * AssignDiscounts() 

{ 

    unsigned int * discount = new unsigned int [7]; 

    cout << "Enter Classical Discount: " << endl; 

    cin >> discount[0]; 

    cout << "Enter Country Discount: " << endl; 

    cin >> discount[1]; 

    cout << "Enter International Discount: " << endl; 

    cin >> discount[2]; 

    cout << "Enter Jazz Discount: " << endl; 

    cin >> discount[3]; 

    cout << "Enter Pop Discount: " << endl; 

    cin >> discount[4]; 

    cout << "Enter Rock Discount: " << endl; 

    cin >> discount[5]; 

    cout << "Enter Show Discount: " << endl; 

    cin >> discount[6]; 

    return discount; 

} 



/** 

char ** AssignGenres() 

{ 

    char ** genres = new char * [7]; 

    for (int x=0;x<7;x++) 

     genres[x] = new char [20]; 

    strcpy(genres [0], "Classical"); 

    strcpy(genres [1], "Country"); 

    strcpy(genres [2], "International"); 

    strcpy(genres [3], "Jazz"); 

    strcpy(genres [4], "Pop"); 

    strcpy(genres [5], "Rock"); 

    strcpy(genres [6], "Show"); 

    return genres; 

} 

**/ 







float getTax(float taxrate) 

{ 

    cout << "Please enter store tax rate: " << endl; 

    cin >> taxrate; 

    return taxrate; 

} 
+0

Какая отладка вы пытались? например каковы значения всех переменных на каждом этапе программы? –

+0

Пожалуйста, переформатируйте свой код, чтобы удалить лишние вертикальные пробелы. – 2010-03-20 21:55:53

+0

В чем смысл 'if (str.compare (discount_tiles [0]) == 0) ... else if (str.compare (discount_tiles [0]) == 0) ... else if (str .compare (discount_tiles [0]) == 0) '? те, которые после первого никогда не будут соответствовать – user102008

ответ

1

Вы возвращаете указатель на локальную переменную из getPrice:

double* getPrice() 
{ 
    double p = 0.0; 
    cout<< "enter price" << endl; 
    cin >> p; 
    cin.ignore(); 
    double* pp = &p; 
    return pp; 
} 

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

налог с продаж не запрашивается, потому что закомментирован звонок getTax().

+0

, вы правы. благодаря – user69514