- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
老实说,这是我完成家庭作业所需的一小段代码。我知道社区对帮助学生非常怀疑,但在过去的 5 个小时里,我一直把头靠在墙上,实际上没有完成这项任务。我从来没有在任何任务上寻求帮助,但没有人给我带来这么多麻烦。
我唯一遇到的问题是让程序去除前导空格。我想我可以处理剩下的。我不是在为我的整体任务寻求解决方案,只是对这一特定部分进行微调。
我会在这里发布完整的作业文本,但我是 不是 发布它以尝试获得完整的解决方案,我只是发布它以便其他人可以看到我必须使用的条件。
“这个作业将让你更多地练习编写函数以及如何将数字读入变量。你需要编写一个函数,将一个无符号整数读入一个 unsigned short int 类型的变量中。这将有最大值 65535 , 并且函数需要处理非法数字,函数内部不能使用“cin >>”。
数字输入的规则基本如下:
1) 跳过所有前导空格
2) 找到的第一个字符必须是数字,否则会发生错误
3)然后一次处理一个数字字符并与数字组合
4) 发现非数字时停止处理
我们将遵循这些规则,并添加错误处理和溢出。如果在数字之前进行了非法输入,则将返回错误代码“1”,如果发生溢出,即大于 65535 的数字,则将返回错误代码“2”。如果没有错误,则返回“0”。
确保 main 函数将继续循环,直到用户输入“n”或“N”表示 NO,main 应测试从名为“ReadInt”的函数返回的错误代码并显示适当的错误消息或显示编号(如果有)没有错误。在设计“ReadInt”函数时要小心,它应该是返回值并有一个引用参数。该函数需要从输入缓冲区一次处理一个字符并以正确的方式处理它。读入数字后,请确保输入缓冲区为空,否则 main 中的循环可能无法正常工作。我知道这不是提取的工作方式,但让我们这样做。
你不需要在这个作业中上交算法,但我建议你写一个。调试器也可能会有所帮助。您基本上是在重写提取运算符,因为它适用于整数。”
我的大部分代码都没有意义,因为我一直在删除东西并添加诸如疯狂之类的东西来尝试我能想到的一切。
#include <iostream>
#include <CTYPE.h>
using namespace std;
int ReadInt (unsigned short int &UserIn);
int main()
{
int Error;
unsigned short int UserInput;
char RepeatProgram;
do
{
Error=ReadInt(UserInput);
if (Error==0)
cout << "Number is " << UserInput << endl;
else if (Error==1)
cout << "Illegal Data Entry\n";
else if (Error==2)
cout << "Numerical overflow, number too big\n";
cout << "Continue? n/N to quit: ";
cin >> RepeatProgram;
cout << endl;
} while (RepeatProgram!='N' && RepeatProgram!='n');
}
int ReadInt (unsigned short int &UserIn)
{
int Err=0;
char TemporaryStorage;
long int FinalNumber=0;
cout << "Enter a number: ";
//cin.ignore(1000, !' '); this didn't work
cin.get(TemporaryStorage);
cout << TemporaryStorage;//I'm only displaying this while I test my ideas to see if they are working or not, before I move onto the the next step
cout << endl;
return Err;
}
最佳答案
作为序言,我想说明这是一个学生提出的问题,但与大多数类型的问题不同,这是一个值得高质量答案的高质量问题,所以我会尽力去做;)。我不会尝试只回答您的具体问题,还会向您展示代码中的其他小问题。
首先,让我们一步一步地分析您的代码。或多或少就像调试器会做的那样。花点时间仔细阅读本文;)...
#include <iostream>
#include <CTYPE.h>
<iostream>
和
<ctype.h>
(由于 Windows 中 NTFS 的一些缺陷/设计决定,大写字母有效)。我建议您将第二行更改为
#include <cctype>
反而。
using namespace std;
std::
沿着这个答案,好像这条线不存在。
int ReadInt (unsigned short int &UserIn);
ReadInt
需要引用
UserIn
输入
unsigned short int
并返回一个
int
类型的对象.
int main()
{
main
;无参数,返回
int
.开始功能。
int Error;
unsigned short int UserInput;
char RepeatProgram;
Error
,
UserInput
, 和
RepeatProgram
各类型
int
,
unsigned short int
, 和
char
.
do
{
Error=ReadInt(UserInput);
ReadInt
的返回值类型
int
用参数调用
UserInput
类型
int&
到变量
Error
类型
unsigned short int
.
if (Error==0)
std::cout << "Number is " << UserInput << endl;
Error
为零,则打印出
UserInput
到标准输出。
else if (Error==1)
std::cout << "Illegal Data Entry\n";
else if (Error==2)
std::cout << "Numerical overflow, number too big\n";
std::cout
向用户报告。 .
std::cout << "Continue? n/N to quit: ";
std::cin >> RepeatProgram;
RepeatProgram
中类型
char
.
std::cout << std::endl;
std::cout << '\n'
,但这并不重要。
} while (RepeatProgram!='N' && RepeatProgram!='n');
RepeatProgram
,则重复执行给定块既不是小写字母也不是大写字母
N
.
}
main
.隐式返回值为零。
int ReadInt (unsigned short int &UserIn)
{
ReadInt
引用
UserIn
至
unsigned short int
并返回一个
int
类型的对象.开始功能。
int Err=0;
char TemporaryStorage;
long int FinalNumber=0;
Err
,
TemporaryStorage
, 和
FinalNumber
各类型
int
,
char
, 和
long int
.变量
Err
和
FinalNumber
初始化为
0
和
0
, 分别。但是,只是一件事。作业不是说输出编号存储在
unsigned short int
中吗? ?所以,最好是这样...
unsigned short int FinalNumber = 0;
std::cout << "Enter a number: ";
//std::cin.ignore(1000, !' '); this didn't work
//
在评论之前,对吧?现在,你期待什么
!' '
评估为
'\0'
以外的其他人?
istream::ignore(n, ch)
将丢弃输入流中的字符,直到
n
字符已被丢弃,
ch
找到,或到达文件尾。
do
std::cin.get(TemporaryStorage);
while(std::isspace(TemporyStorage));
std::cin.get(TemporaryStorage);
TemporaryStorage
将在 do-while 循环后保存第一个不是空格的字符。所以,我们还剩下三件事。首先,检查输入中是否至少有一位数字,否则返回错误。现在,虽然输入由数字组成,但将字符转换为整数,然后乘以加以得到实际整数。最后,这是最......咳咳......奇怪的部分,我们需要避免任何溢出。
if (!std::isdigit(TemporaryStorage)) {
Err = 1;
return Err;
}
while (std::isdigit(TemporaryStorage)) {
unsigned short int OverflowChecker = FinalNumber;
FinalNumber *= 10; // Make slot for another digit
FinalNumber += TemporaryStorage - '0'; '0' - '0' = 0, '1' - '0' = 1...
// If an unsigned overflows, it'll "wrap-around" to zero. We exploit that to detect any possible overflow
if (FinalNumber > 65535 || OverflowChecker > FinalNumber) {
Err = 2;
return Err;
}
std::cin.get(TemporaryStorage);
}
// We've got the number, yay!
UserIn = FinalNumber;
std::cout << TemporaryStorage;//I'm only displaying this while I test my ideas to see if they are working or not, before I move onto the the next step
cout << endl;
return Err;
std::cout
在展示你的作品之前就出去了;)。
}
ReadInt
.
关于c++ - 试图忽略直到第一个字符的所有空格(迫切需要一个简单的轻推),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33562552/
我是 C++ 的新手,我在使用这段代码时遇到了问题: string output_date(int day, int month, int year){ string date; if
所以我这样做了 tar cvzf test.zip FP 为了创建目录 FP 的 zip 但是,它会列出 zip 中的目录 FP/ FP/php/ FP/php/pdf/ FP/php/docs/ F
我正在尝试在 Swift、Xcode 7.3(所以是 Swift 2.2)中创建一个通用类,但我似乎无法让它通过编译器: protocol Struct1Protocol { } struct Str
我的测试用例是这样的: class FooTest extends PHPUnit_Framework_TestCase { /** @covers MyClass::bar */ f
我正在尝试将brew install wine作为使electron-builder工作的一步。但是我所能得到的只是以下响应: ==> Installing dependencies for wine
我这样做: string[,] string1 = {{"one", "0"},{"Two", "5"},{"Three","1"}}; int b = 0; for(int i = 0; i <=
我正在尝试使用 SetWindowsHookEx 键盘 Hook Notepad.exe。 如您所见,工作线程正在将其 ASCII 代码(即 wParam)发送到指定的服务器。 UINT WINAPI
我正在尝试将 ListView 实现到我的 Fragment 中,但无论我尝试什么,我都会得到一个 NullPointerException。我检查对象是否为 null 并记录是否为 null,看起来
我尝试在一行中对齐两个 div。使用 float left 属性,一切顺利。但是当我在 div 中使用图像时,它开始产生问题。 所以这是我的示例代码:- Some headi
我目前正在使用此代码来获取图像的灰度图像表示并以 (512, 370, 1) 的格式表示它大批。 img_instance = cv2.imread(df.iloc[i][x_col]) / 255.
总结 我正在创建一个简单的应用程序,它允许用户选择一个包含顶级窗口的进程。用户首先键入 native DLL(而非托管 DLL)的路径。然后用户键入将在 Hook 过程中调用的方法的名称。该方法不得返
我是一名优秀的程序员,十分优秀!