- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在通过 Bjarne Stroustrup 的“Programming Principles and Practices Using C++”第二版学习 C++。我致力于完成所有的练习和练习,因为我在学校一个月后要上一门游戏 AI 课,我需要了解 C++,而且我想了解尽可能多的知识。
无论如何,如果有人做过书中的练习,那么我正在参加第 4 章的练习。我在最后。最终产品应该是一个程序,该程序在 while 循环中获取一个数字后跟一个测量单位(cm、in、ft 或 m),同时跟踪最大值、最小值和总和以米为单位输入的单位。我完全以米为单位工作,除了最大和最小值被转换为米以检查哪个更大但存储为用户最初输入的值。这些数字也被插入到一个 vector 中,直到最后才使用该 vector 对值进行排序并按顺序打印它们。
无论如何,我似乎没有问题跟踪总米,因为它在最后正确打印出来,但当涉及到最小值时,似乎出现了问题,偶尔也会出现最大值。另外,某些值在值 vector 中完全不存在。我会但下面的代码。我认为错误出在我的 toMeters() 中的某个地方,但我已经盯着它看了很长时间,以至于我觉得新的一双眼睛可能会有所帮助。谢谢!
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
constexpr double mToCm = 100.00; //1m == 100cm
constexpr double inToCm = 2.54; //1in == 2.54cm
constexpr double ftToIn = 12.00; //1ft == 12in
//this function just increases total ammount of units in meters
double adder(string unit, double total, double num)
{
if(unit == "cm")
{
total += (num / mToCm);
}
else if(unit == "in")
{
double temp;
temp = num * inToCm;
total += (temp / mToCm);
}
else if(unit == "ft")
{
double temp;
temp = num * ftToIn;
temp *= inToCm;
total += (temp / mToCm);
}
else
{
total += num;
}
return total;
}
double toMeters(string unit, double num)
{
double value = num;
if(unit == "cm")
{
value /= mToCm;
}
else if(unit == "in")
{
value *= inToCm;
value /= mToCm;
}
else if(unit == "ft")
{
value *= ftToIn;
value *= inToCm;
value /= mToCm;
}
return value;
}
int main()
{
double num, biggest, smallest; //current number, biggest and smallest value
double total = 0; //total number in meters
string unit, biggestUnit, smallestUnit; //current unit, unit for biggest and smallest value
int count = 0; //count for the loop it's only real purpose is on the first and second loop runs
vector<double>meters; //a vector of doubles called meters
cout << "Total ammount of units will be converted to meters, largest and biggest values will be kept in original units\n";
cout << "Start of by entering a number followed by cm, m, in, ft and continue until you want to stop; to stop, press |\n";
while(cin >> num >> unit)
{
//check if user want to stop
if(num == '|')
{
break;
}
//check for correct units, if not then break out
if(unit != "cm" && unit != "m" && unit != "in" && unit != "ft")
{
cout << "Unit not recognized; only cm, m, in, ft are valid\n";
return 1;
}
//this checks if there is no second unit but since cin reads no
//whitespace it doesn't work. I just haven't gotten around to removing it
else if(unit == " ")
{
cout << "Please input a unit\n";
return 1;
}
//all values in vectors are supposed to be in meters. If the unit is not
//in meters, we will call a push back on the value returned by converting
//the orignal number to meters
if(unit != "m")
{
meters.push_back(toMeters(unit, num));
}
//else, just call a push_back
else
{
meters.push_back(num);
}
//if the count is 0, i.e. very first run of the program, biggest and
//smallest is equal to original and call adder() to increment the total
if(count == 0)
{
biggest = smallest = num;
biggestUnit = smallestUnit = unit;
total = adder(unit, total, num);
}
//else, if count is > 0, i.e. this is not the first run, do this part
else
{
//if the value returned after running toMeters on the current value
//is greater than the biggest, biggest now equals current num and
//biggest unit is equal to current unit. Then call adder to inceare total
if(toMeters(unit, num) > toMeters(biggestUnit, biggest))
{
biggest = num;
biggestUnit = unit;
total = adder(unit, total, num);
}
//same as top function but for smallers value
else if(toMeters(unit, num) < toMeters(smallestUnit, smallest))
{
smallest = num;
smallestUnit = unit;
total = adder(unit, total, num);
}
//else both numbers are equal so just make a call to adder()
else
{
total = adder(unit, total, num);
}
}
//increase count just because. It was really only needed to be incremented once
++count;
}
//call sort on the vector then print out the total units followed by bigges the smallest values
//then the values in meters, is ascending sorted order.
sort(meters.begin(), meters.end());
cout << "Total units in meters is " << total << "\n";
cout << "Largest unit is " << biggest << biggestUnit << "\n";
cout << "Smallest unit is " << smallest << smallestUnit << "\n";
cout<< "Here are all values you entered, in meters, in ascending order: \n";
for(int i : meters)
{
cout << meters[i] << "m" << " ";
}
cout << "\n";
}
我最近的输入是 1 cm 2 in 3 m 4 ft,输出是 以米为单位的总单位为 4.28 最大单位是3m(正确) 最小单位是2in(应该是1cm) 以下是您输入的所有值,以米为单位,按升序排列: 0.01m 0.01m 0.0508m 3m
最佳答案
当您在第一个输入上设置 biggest
和 smallest
时,您不会设置 biggestUnit
或 smallestUnit
。因此比较无法正常工作。
尝试:
//if the count is 0, i.e. very first run of the program, biggest and
//smallest is equal to original and call adder() to increment the total
if(count == 0)
{
biggest = smallest = num;
biggestUnit = smallestUnit = unit;
total = adder(unit, total, num);
}
此外,将 total = adder(unit, total, num);
放在每个代码路径中也不是一个好主意。只需将它放在 if
之外一次。否则,很难看出它总是针对每个输入精确执行一次。
关于c++ - 需要一些帮助来找出我程序中的逻辑错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45850753/
我是 C 语言新手,我编写了这个 C 程序,让用户输入一年中的某一天,作为返回,程序将输出月份以及该月的哪一天。该程序运行良好,但我现在想简化该程序。我知道我需要一个循环,但我不知道如何去做。这是程序
我一直在努力找出我的代码有什么问题。这个想法是创建一个小的画图程序,并有红色、绿色、蓝色和清除按钮。我有我能想到的一切让它工作,但无法弄清楚代码有什么问题。程序打开,然后立即关闭。 import ja
我想安装screen,但是接下来我应该做什么? $ brew search screen imgur-screenshot screen
我有一个在服务器端工作的 UDP 套接字应用程序。为了测试服务器端,我编写了一个简单的 python 客户端程序,它发送消息“hello world how are you”。服务器随后应接收消息,将
我有一个 shell 脚本,它运行一个 Python 程序来预处理一些数据,然后运行一个 R 程序来执行一些长时间运行的任务。我正在学习使用 Docker 并且我一直在运行 FROM r-base:l
在 Linux 中。我有一个 c 程序,它读取一个 2048 字节的文本文件作为输入。我想从 Python 脚本启动 c 程序。我希望 Python 脚本将文本字符串作为参数传递给 c 程序,而不是将
前言 最近开始整理笔记里的库存草稿,本文是 23 年 5 月创建的了(因为中途转移到 onedrive,可能还不止) 网页调起电脑程序是经常用到的场景,比如百度网盘下载,加入 QQ 群之类的 我
对于一个类,我被要求编写一个 VHDL 程序,该程序接受两个整数输入 A 和 B,并用 A+B 替换 A,用 A-B 替换 B。我编写了以下程序和测试平台。它完成了实现和行为语法检查,但它不会模拟。尽
module Algorithm where import System.Random import Data.Maybe import Data.List type Atom = String ty
我想找到两个以上数字的最小公倍数 求给定N个数的最小公倍数的C++程序 最佳答案 int lcm(int a, int b) { return (a/gcd(a,b))*b; } 对于gcd,请查看
这个程序有错误。谁能解决这个问题? Error is :TempRecord already defines a member called 'this' with the same paramete
当我运行下面的程序时,我在 str1 和 str2 中得到了垃圾值。所以 #include #include #include using namespace std; int main() {
这是我的作业: 一对刚出生的兔子(一公一母)被放在田里。兔子在一个月大时可以交配,因此在第二个月的月底,每对兔子都会生出两对新兔子,然后死去。 注:在第0个月,有0对兔子。第 1 个月,有 1 对兔子
我编写了一个程序,通过对字母使用 switch 命令将十进制字符串转换为十六进制,但是如果我使用 char,该程序无法正常工作!没有 switch 我无法处理 9 以上的数字。我希望你能理解我,因为我
我是 C++ 新手(虽然我有一些 C 语言经验)和 MySQL,我正在尝试制作一个从 MySQL 读取数据库的程序,我一直在关注这个 tutorial但当我尝试“构建”解决方案时出现错误。 (我正在使
仍然是一个初学者,只是尝试使用 swift 中的一些基本函数。 有人能告诉我这段代码有什么问题吗? import UIKit var guessInt: Int var randomNum = arc
我正在用 C++11 编写一个函数,它采用 constant1 + constant2 形式的表达式并将它们折叠起来。 constant1 和 constant2 存储在 std::string 中,
我用 C++ 编写了这段代码,使用运算符重载对 2 个矩阵进行加法和乘法运算。当我执行代码时,它会在第 57 行和第 59 行产生错误,非法结构操作(两行都出现相同的错误)。请解释我的错误。提前致谢:
我是 C++ 的初学者,我想编写一个简单的程序来交换字符串中的两个字符。 例如;我们输入这个字符串:“EXAMPLE”,我们给它交换这两个字符:“E”和“A”,输出应该类似于“AXEMPLA”。 我在
我需要以下代码的帮助: 声明 3 个 double 类型变量,每个代表三角形的三个边中的一个。 提示用户为第一面输入一个值,然后 将用户的输入设置为您创建的代表三角形第一条边的变量。 将最后 2 个步
我是一名优秀的程序员,十分优秀!