带有随机数的 C++ 字符串练习
C++ String excercise with random numbers
我必须做这个练习:
A common punishment for school children is to write out the same sentence multiple times. Write a C++ stand-alone program that will write out the following sentence one hundred times: “I will always use objectoriented design.” Your program should number each of the sentences and it should “accidentally” make eight different random-looking typos at various points in the listing, so that it looks like a human typed it all by hand.
我的知识仅限于 C 个随机数。我试过这个但没有成功。我不能得到 8 个错误。如我们所见,"typo".
出现随机错误
这是我的错误代码:
#include <iostream>
#include <ctime>
using namespace std;
int main()
{
string strPunish = "I will always use objectoriented design.";
int randFrom = 1;
int randTo = 100;
int typoCounter = 0;
srand(time(NULL));
int randNumber = randFrom + ( std::rand() % ( randTo - randFrom + 1 ) );
for (int i = 1; i <= 100; i++)
{
if ((i == randNumber) && (typoCounter != 8))
{
randFrom = i;
randNumber = randFrom + ( std::rand() % ( randTo - randFrom + 1 ) );
string strTypo = strPunish;
int randTypo = 0 + ( std::rand() % ( strTypo.length() - 0 + 1 ) );
strTypo.insert(randTypo, "TYPO");
cout << i << ": " << strTypo << endl;
typoCounter++;
}
else
cout << i << ": " << strPunish << endl;
}
return EXIT_SUCCESS;
}
我已经为你制作了整个程序:
#include <iostream>
#include <ctime>
void selectionSort(int[], int);
int main(void)
{
std::string punishStr = "I will always use objectoriented design."; // declaration
std::string tempStr = punishStr;
std::string typoStr = "TYPO";
int length = punishStr.length();
int location = 0;
short int count = 0;
int randoms[8] = {0};
srand(time(0)); // generates random different times
for (int i = 0; i < 8; i++)
{
randoms[i] = (rand() % 100) + 1; // creates 8 random numbers
}
selectionSort(randoms, 8); // sorts random numbers, for sake of being unbiased
for (int i = 0; i < 100; i++)
{
if (randoms[count] == i && count <= 8) // random number equals i
{
punishStr = tempStr;
location = (rand() % length) + 1;
std::cout << (i + 1) << ": " << punishStr.insert(location, typoStr) << std::endl;
count++;
}
else
std::cout << (i + 1) << ": " << tempStr << std::endl;
}
return 0;
}
void selectionSort(int a[], int n) // sorting algorithm
{
int i, j, min, temp;
for (i = 0; i < n - 1; i++)
{
min = i;
for (j = i + 1; j < n; j++)
if (a[j] < a[min])
min = j;
temp = a[i];
a[i] = a[min];
a[min] = temp;
}
}
程序首先声明了一些必要的变量,包括所需的八个零随机数。然后,通过For循环,它重新定义了范围在1-100之间的随机数的所有8个数组元素。
在那之后,它简单地对数组进行排序(否则它会产生偏差,例如 54、32...),为了防止它,我们简单地将它排序为 32、54...。此后,它检查计数器变量是否 <= 8,如果是,则递增并显示拼写错误的句子。否则,显示正确的句子。
它会一遍又一遍地重复,直到 i
小于 100。
希望对你有用。
注意:输出这么大,最好自己检查一下。 :-)
如上所说,既然是自己的作业,就自己解决吧。但我会为您提供一些可能改进代码的线索:
- 首先,您应该将您的代码分成小函数 - 这将使它更具可读性,也更容易理解!
- 创建一个所有数字都在
[0, 99]
范围内的数组更容易,将其打乱,然后只选择前 X
行进行处理(其中 X
可以是任何内容!)。查看 std::array
和 std::shuffle
了解更多信息。
- 不要在代码中使用硬编码数字!您应该改为定义
constexpr
变量 - 这将使您的代码更具可读性(还记得 (1)
吗?)
- Extra:不再常用
rand
和srand
,取而代之的是最好使用 <random>
中的 std::mt19937
。此外,更常见的用法是 <chrono>
而不是 <ctime>
.
备注:注意你需要确保你选择的行号是唯一的;确保它(可能不会永远卡住)的最快方法是按照我在 (2)
.
中的建议进行操作
我必须做这个练习:
A common punishment for school children is to write out the same sentence multiple times. Write a C++ stand-alone program that will write out the following sentence one hundred times: “I will always use objectoriented design.” Your program should number each of the sentences and it should “accidentally” make eight different random-looking typos at various points in the listing, so that it looks like a human typed it all by hand.
我的知识仅限于 C 个随机数。我试过这个但没有成功。我不能得到 8 个错误。如我们所见,"typo".
出现随机错误这是我的错误代码:
#include <iostream>
#include <ctime>
using namespace std;
int main()
{
string strPunish = "I will always use objectoriented design.";
int randFrom = 1;
int randTo = 100;
int typoCounter = 0;
srand(time(NULL));
int randNumber = randFrom + ( std::rand() % ( randTo - randFrom + 1 ) );
for (int i = 1; i <= 100; i++)
{
if ((i == randNumber) && (typoCounter != 8))
{
randFrom = i;
randNumber = randFrom + ( std::rand() % ( randTo - randFrom + 1 ) );
string strTypo = strPunish;
int randTypo = 0 + ( std::rand() % ( strTypo.length() - 0 + 1 ) );
strTypo.insert(randTypo, "TYPO");
cout << i << ": " << strTypo << endl;
typoCounter++;
}
else
cout << i << ": " << strPunish << endl;
}
return EXIT_SUCCESS;
}
我已经为你制作了整个程序:
#include <iostream>
#include <ctime>
void selectionSort(int[], int);
int main(void)
{
std::string punishStr = "I will always use objectoriented design."; // declaration
std::string tempStr = punishStr;
std::string typoStr = "TYPO";
int length = punishStr.length();
int location = 0;
short int count = 0;
int randoms[8] = {0};
srand(time(0)); // generates random different times
for (int i = 0; i < 8; i++)
{
randoms[i] = (rand() % 100) + 1; // creates 8 random numbers
}
selectionSort(randoms, 8); // sorts random numbers, for sake of being unbiased
for (int i = 0; i < 100; i++)
{
if (randoms[count] == i && count <= 8) // random number equals i
{
punishStr = tempStr;
location = (rand() % length) + 1;
std::cout << (i + 1) << ": " << punishStr.insert(location, typoStr) << std::endl;
count++;
}
else
std::cout << (i + 1) << ": " << tempStr << std::endl;
}
return 0;
}
void selectionSort(int a[], int n) // sorting algorithm
{
int i, j, min, temp;
for (i = 0; i < n - 1; i++)
{
min = i;
for (j = i + 1; j < n; j++)
if (a[j] < a[min])
min = j;
temp = a[i];
a[i] = a[min];
a[min] = temp;
}
}
程序首先声明了一些必要的变量,包括所需的八个零随机数。然后,通过For循环,它重新定义了范围在1-100之间的随机数的所有8个数组元素。
在那之后,它简单地对数组进行排序(否则它会产生偏差,例如 54、32...),为了防止它,我们简单地将它排序为 32、54...。此后,它检查计数器变量是否 <= 8,如果是,则递增并显示拼写错误的句子。否则,显示正确的句子。
它会一遍又一遍地重复,直到 i
小于 100。
希望对你有用。
注意:输出这么大,最好自己检查一下。 :-)
如上所说,既然是自己的作业,就自己解决吧。但我会为您提供一些可能改进代码的线索:
- 首先,您应该将您的代码分成小函数 - 这将使它更具可读性,也更容易理解!
- 创建一个所有数字都在
[0, 99]
范围内的数组更容易,将其打乱,然后只选择前X
行进行处理(其中X
可以是任何内容!)。查看std::array
和std::shuffle
了解更多信息。 - 不要在代码中使用硬编码数字!您应该改为定义
constexpr
变量 - 这将使您的代码更具可读性(还记得(1)
吗?) - Extra:不再常用
rand
和srand
,取而代之的是最好使用<random>
中的std::mt19937
。此外,更常见的用法是<chrono>
而不是<ctime>
.
备注:注意你需要确保你选择的行号是唯一的;确保它(可能不会永远卡住)的最快方法是按照我在 (2)
.