C ++为什么即使我调用了void函数也无法正常工作?

时间:2018-11-03 14:04:24

标签: c++ linked-list singly-linked-list

我不知道如何使用调试器,我认为我没有调试器 所以我试图在c ++调用产品中创建简单的链接列表 此列表将用于存储产品... 并且我已经做了一个将新节点添加到列表开头的函数 并制作了一个称为“ Afficher1”的无效函数,该函数应向我显示列表中的产品总数及其总价格(不包括增值税) 以及增值税的总金额以及包括增值税在内的总计TOTAL 但是当我在main函数中调用void时,它不会运行,只是用返回值!= 0

结束了主执行。

,当我删除函数内部的某些操作时,例如:

double total_TVA =((total)*(temp-> TVA))/(100.0);         double TTC = total + total_TVA;

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

struct Product{
    string code_prod;
    string designation;
    string UM;
    double PUA_HT;
    double QTE;
    double TVA;
    Product *next;
};

    Product *head=NULL;


    Product *Add_Product(Product* &head, string code, string des, string um, double pua, double qte, double tva){
        Product *prod=new Product;
        prod->code_prod=code;
        prod->designation=des;
        prod->UM=um;
        prod->PUA_HT=pua;
        prod->QTE=qte;
        prod->TVA=tva;
        prod->next=head;
        head=prod;

        return head;
    }

    void Afficher1(){

        if(head != NULL){
            Product *temp=head;
            double total=0;
            int i=0;
            while(temp != NULL){
                total=total + ((temp->PUA_HT)*(temp->QTE));
                i++;
                temp=temp->next;
            }
            double total_TVA=((total)*(temp->TVA))/(100.0);
            double TTC=total+total_TVA;
            cout<<"Nombre total des produits Achetes: "<<i<<endl;
            cout<<"Le Montant Total HT: "<<total<<endl;
            cout<<"Total TVA de "<<temp->TVA<<" : "<<total_TVA<<endl;
            cout<<"Total TTC: "<<TTC<<endl;
        }   


    }
int main(){
    Product *head=NULL;
    string codes; string dess; string ums; double puas; double qtes; double tvas;
    for(int i=0;i<1;i++){
        cout<<"Donner les infos pour le proudit "<<i+1<<endl;
        cin>>codes;
        cin>>dess;
        cin>>ums;
        cin>>puas;
        cin>>qtes;
        cin>>tvas;
        head=Add_Product(head, codes, dess, ums, puas, qtes, tvas);

    }
    Afficher1();
    return 0;
}

2 个答案:

答案 0 :(得分:2)

main()函数中,声明一个名为head的局部变量:

int main(){
   Product *head=NULL;

...,然后将其设置为非NULL:

    head=Add_Product(head, codes, dess, ums, puas, qtes, tvas);

...但是,您的Afficher1()函数不知道该局部变量,而是查看了在程序顶部声明的全局变量head

Product *head=NULL;

...并且该全局变量仍为NULL,因此位于if (head != NULL)顶部的Afficher1()测试失败,并且该功能不执行任何操作。

答案 1 :(得分:0)

您的程序在全局声明的变量和同名的本地声明的变量的范围相互覆盖方面存在一些基本问题。

此外,您在分配'head-> next = head'时会遇到逻辑错误,这将创建循环链接列表。

在全局范围内,head变量为NULL时,如果条件条件(head!= NULL)没有执行,则函数主体将被封闭。

我在上面的代码中添加了指向相同内容的注释,现在它可以正常工作了。见下文:-

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

struct Product{
    string code_prod;
    string designation;
    string UM;
    double PUA_HT;
    double QTE;
    double TVA;
    Product *next;
};

    /* This globally visible head pointer */
    Product *head=NULL;


    Product *Add_Product(Product* &head, string code, string des, string um, double pua, double qte, double tva){

        Product *prod=new Product;
        prod->code_prod=code;
        prod->designation=des;
        prod->UM=um;
        prod->PUA_HT=pua;
        prod->QTE=qte;
        prod->TVA=tva;
        prod->next=NULL; // You set it to head, will create circular linked list and your Afficher1 loop will run infinitely.

        /* This is head pointer is pointing to GLOBAL head which is NULL */
        head=prod;

        return head;
    }

    void Afficher1(){
        if(head != NULL){
            Product *temp=head;
            double total=0;
            int i=0;
            while(temp != NULL){
                total=total + ((temp->PUA_HT)*(temp->QTE));
                i++;
                temp=temp->next;
            }
            double total_TVA=((total)*(temp->TVA))/(100.0);
            double TTC=total+total_TVA;
            cout<<"Nombre total des produits Achetes: "<<i<<endl;
            cout<<"Le Montant Total HT: "<<total<<endl;
            cout<<"Total TVA de "<<temp->TVA<<" : "<<total_TVA<<endl;
            cout<<"Total TTC: "<<TTC<<endl;
        }   


    }
int main(){
    /* This is locally declared and initialized head pointer which overrides global scope */
    // Product *head=NULL;
    string codes; string dess; string ums; double puas; double qtes; double tvas;
    for(int i=0;i<1;i++){
        cout<<"Donner les infos pour le proudit "<<i+1<<endl;
        cin>>codes;
        cin>>dess;
        cin>>ums;
        cin>>puas;
        cin>>qtes;
        cin>>tvas;
        head=Add_Product(head, codes, dess, ums, puas, qtes, tvas);

    }
    Afficher1();
    return 0;
}