none
请教C++问题。类型转换的问题 RRS feed

  • 问题

  • #include <iostream>
    #include <string>
    using namespace std;
    class Book
    {
    public:
     int num;
     float price;
     Book *next;
    };
    Book* head=NULL;
    bool check(string str)
    {
     for(int i=0;i<str.length();i++)
      if ((str[i]>'9'||str[i]<'0')&&(str[i]!='.'))
      {
       return false;
      }
       return true;
    }
    Book* creat()
    {
     Book *p1,*p2;
     p1=new Book;
     head=p1;
     p2=p1;
     cout<<"请输入图书的编号,以0结束。";
     string str;
     cin>>str;
     while (!check(str))
     {
      cout<<"你输入的不是数值。按0退出。"<<endl;
      cin>>str;
     }
     p1->num=atoi(str.c_str());
     if (p1->num!=0)
     {
      cout<<"请输入图书的价格:";
      cin>>str;
      while (!check(str))
      {
       cout<<"你输入的不是数值。按0退出。"<<endl;
       cin>>str;
      }
      p1->price=atof(str.c_str());
     }
     else
     {
      delete p1;
      p2=NULL;
      p2->next=NULL;
      head=NULL;
      return head;
     }
     while (p1->num!=0)
     {
      p2=p1;
      p1=new Book;
      cout<<"请输入图书的编号,以0结束。";
      cin>>str;
      while (!check(str))
      {
       cout<<"你输入的不是数值。按0退出。"<<endl;
       cin>>str;
      }
      p1->num=atoi(str.c_str());
      if (p1->num!=0)
      {
       cout<<"请输入图书的价格:";
       cin>>str;
       while (!check(str))
       {
        cout<<"你输入的不是数值。按0退出。"<<endl;
        cin>>str;
       }
       p1->price=atof(str.c_str());
      }
      p2->next=p1;
     }
     delete p1;
     p2->next=NULL;
     return head;
    }
    void ShowBook(Book *head)
    {
     cout<<endl;
     cout<<"图书的信息如下:"<<endl;
     while (head)
     {
      cout<<"图书编号:"<<head->num<<"\t";
      cout<<"图书价格:"<<head->price<<endl;
      head=head->next;
     }
    }
    void DeleteBook(Book *head,int num)
    {
     Book *l;
     if (head->num==num)
     {
      l=head;
      head=head->next;
      ::head=head;
      delete l;
      cout<<"操作成功!"<<endl;
      return;
     }
     while (head)
     {
      if (head->next==NULL)
      {
       cout<<"找不到要删除的编号"<<endl;
       return;
      }
      if (head->next->num==num)
      {
       l=head->next;
       head->next=l->next;
       delete l;
       cout<<"操作完成。"<<endl;
      }
      head=head->next;
     }
     cout<<"搜索完毕,未找到要删除的编号。"<<endl;
    }
    void EndInsert(Book *head,int num,float price)
    {
        Book *listinsert=new Book;
     Book *l;
     while (head)
     {
      l=head;
      head=head->next;
     }
     l->next=listinsert;
     listinsert->num=num;
     listinsert->price=price;
     listinsert->next=NULL;
    }
    void HeadInsert(Book *head,int num,float price)
    {
     Book *listinsert=new Book;
     listinsert->num=num;
     listinsert->price=price;
     listinsert->next=head;
     ::head=listinsert;
    }
    void Insert(Book *head,int num,float price)
    {
     Book *listinsert=new Book;
     listinsert->num=num;
     listinsert->price=price;
     if (num<=head->num)
     {
      listinsert->next=head;
      ::head=listinsert;
      return;
     }
     Book *Temp=NULL;
     while ((num>head->num)&&(head->next!=NULL))
     {
      Temp=head;
      head=head->next;
     }
     if (num>head->num)
     {
      head->next=listinsert;
     }
     else
     {
      Temp->next=listinsert;
      listinsert->next=head;
     }
    }
    void main()
    {
     head=creat();
     ShowBook(head);
     int BookNum;
     float BookPrice;
    /* cout<<"请输入你想删除的图书编号:";
     cin>>BookNum;
     DeleteBook(head,BookNum);
     ShowBook(head);
     cout<<"请输入你想插入的编号:";
     cin>>BookNum;
     cout<<"请输入图书的价格:";
     cin>>BookPrice;
     HeadInsert(head,BookNum,BookPrice);
     ShowBook(head);
     cout<<"请输入你想插入的编号:";
     cin>>BookNum;
     cout<<"请输入图书的价格:";
     cin>>BookPrice;
        EndInsert(head,BookNum,BookPrice);
     ShowBook(head);*/
     cout<<"请输入你想插入的编号:";
     cin>>BookNum;
     cout<<"请输入图书的价格:";
     cin>>BookPrice;
     Insert(head,BookNum,BookPrice);
     ShowBook(head);
    }

    提示三条警告:
    1>d:\c++\1\1\1.cpp(14) : warning C4018: “<”: 有符号/无符号不匹配
    1>d:\c++\1\1\1.cpp(45) : warning C4244: “=”: 从“double”转换到“float”,可能丢失数据
    1>d:\c++\1\1\1.cpp(76) : warning C4244: “=”: 从“double”转换到“float”,可能丢失数据

    第一个不知道错在哪儿了。
    二和三 atof 就是转换为浮点型的啊 为什么提示 这个警告呢? 错在哪儿了?能否说下 并且把正确的代码贴出来啊?

    谢谢各位!
    …|▌'寔堅蔃の/「≯還寔╪.逞蔃﹖
    2009年6月29日 9:58

答案

  • 1我也不清楚
    2 atof返回值是一个double
    double是双精浮点值。64位储存浮点数,IEEE表示法,其中指数位11位
    而float是单晶浮点数。32位存储浮点数,同为IEEE表示法,但其指数为为8位。
    虽然都是储存浮点数但是double和float能够表示的精度是不一样的,float甚至不能表示所有的int型。
    所以从double到float转换会丢失精度。需要使用static_cast<float>()进行转换。
    这里千万不要用reinterpret_cast这个cast并不等同于c的转换方式。他非常粗鲁的重写内存。而double和float的内存结构是不一样的。
    另外还有一点你的main函数不标准。最好写成int main(void)
    麻烦把正确答案设为解答。
    • 已标记为答案 dowflyon 2009年6月30日 6:51
    2009年6月29日 10:24
    版主
  • 第一点:for(int i=0;i<str.length();i++)这个警告是由符号和无符号不匹配。int是有符号长整型,str.length()是size_t型,在32位的系统上就是DWORD。
    改法:for(size_t i=0;i<str.length();i++)

     第二点:p1->price=atof(str.c_str());
    float和double是两种类型,float占4个字节,double占8个.atof返回的是double,你的price定义的是float。
    改法:1.可以把price的类型改成double,
    2.还可以强制转换p1->price=(float)atof(str.c_str());


    0xBAADF00D
    • 已标记为答案 dowflyon 2009年6月30日 6:51
    2009年6月30日 5:24
    版主
  • C 和C++标准至今只定义了两种main函数格式
    int main(void);
    int main(int argc, char* argv[]);
    除此之外的main函数格式不保证可以在所有的编译器下编译通过。void mian()可能只能在VC下编译
    麻烦把正确答案设为解答。
    • 已标记为答案 dowflyon 2009年6月30日 7:13
    2009年6月30日 7:12
    版主

全部回复

  • 1我也不清楚
    2 atof返回值是一个double
    double是双精浮点值。64位储存浮点数,IEEE表示法,其中指数位11位
    而float是单晶浮点数。32位存储浮点数,同为IEEE表示法,但其指数为为8位。
    虽然都是储存浮点数但是double和float能够表示的精度是不一样的,float甚至不能表示所有的int型。
    所以从double到float转换会丢失精度。需要使用static_cast<float>()进行转换。
    这里千万不要用reinterpret_cast这个cast并不等同于c的转换方式。他非常粗鲁的重写内存。而double和float的内存结构是不一样的。
    另外还有一点你的main函数不标准。最好写成int main(void)
    麻烦把正确答案设为解答。
    • 已标记为答案 dowflyon 2009年6月30日 6:51
    2009年6月29日 10:24
    版主
  • 第一点:for(int i=0;i<str.length();i++)这个警告是由符号和无符号不匹配。int是有符号长整型,str.length()是size_t型,在32位的系统上就是DWORD。
    改法:for(size_t i=0;i<str.length();i++)

     第二点:p1->price=atof(str.c_str());
    float和double是两种类型,float占4个字节,double占8个.atof返回的是double,你的price定义的是float。
    改法:1.可以把price的类型改成double,
    2.还可以强制转换p1->price=(float)atof(str.c_str());


    0xBAADF00D
    • 已标记为答案 dowflyon 2009年6月30日 6:51
    2009年6月30日 5:24
    版主
  • 哦  我的 main 函数 和你的 int main(void) 区别在哪儿啊?


    …|▌'寔堅蔃の/「≯還寔╪.逞蔃﹖
    2009年6月30日 6:51
  • C 和C++标准至今只定义了两种main函数格式
    int main(void);
    int main(int argc, char* argv[]);
    除此之外的main函数格式不保证可以在所有的编译器下编译通过。void mian()可能只能在VC下编译
    麻烦把正确答案设为解答。
    • 已标记为答案 dowflyon 2009年6月30日 7:13
    2009年6月30日 7:12
    版主
  • 哦 明白了 谢谢你!


    …|▌'寔堅蔃の/「≯還寔╪.逞蔃﹖
    2009年6月30日 7:13