c++学习笔记(2)

循环:

while循环  计数控制循环   counter-controlled loop

标记控制的循环: sentinel-conrolled loop

在写循环的过程中容易出现多一次或者少一次的错误 , 即差一错误 (off-by-one error)

计算减法--简单代码:

#include <iostream>
#include <cstdlib> // rand and srand function
#include <ctime> // for time function
using namespace std;
int main(int argc, char *argv[])
{
srand(time(0));
int number1 = rand() % 10;
int number2 = rand() % 10;
if(number1 < number2)
{
int temp = number1;
number1 = number2;
number2 = temp;
} // swap
cout << "What is " << number1 << " - " << number2 << " ? " << endl;
int answer;
cin >> answer;
while(answer != (number1 - number2))
{
cout << "You Entered a wrong answer !" << endl;
cout << "Enter again: ";
cin >> answer;
}
cout << "You git it!" << endl;
return 0;
}

猜数字:

先随机生成一个[0, 100]之间的整数,由用户数输入猜测数字,每次给出猜测的结果(偏大还是偏小,直到猜中为止)

#include <iostream>
#include <cstdlib> // rand and srand function
#include <ctime> // for time function
using namespace std;
int main(int argc, char *argv[])
{
srand(time(0));
int number = 0 + rand() % (100 - 0 + 1); // generate random number in [0, 100]
cout << "Enter your guess([0, 100]): ";
int guess;
cin >> guess;
while(guess != number)
{
if(guess - number > 0)
{
cout << "Your guess is too high." << endl;
}
else
{
cout << "Your guess is too low." << endl;
}
cout << "Enter your guess again: ";
cin >> guess;
}
cout << "Yes, the number is " << guess << "!" << endl;
return 0;
}

不要要浮点数作为循环的判断条件,因为浮点运算是一种近似的表示,程序可能会陷入死循环。

2.输入输出重定向

如果有许多数据需要输入,可以将文件存储在文件中,使用空格分开, 如input.txt,运行:

SentineValue.exe < input.txt         输入重定向命令, 从文件获取输入

输出重定向命令  SentineVAlue > output.txt   , 可以将输出发送到文件中

输入输出重定向可以在同一个命令中:

SentineValue.exe < input.txt >output.txt 

将input中的数据读取并发送到output中

(1)利用循环读取文件中的数据

   

#include <iostream>
#include <cstdlib> // rand and srand function
#include <ctime> // for time function
#include <fstream> // for file operation
using namespace std;
int main(int argc, char *argv[])
{
//srand(time(0));
ofstream output; // 先下入数据到txt文件中
output.open("number.txt");
for(int count=0; count<10; count++)
{
output << count << " ";
}
output << endl;
output << 3 << " " << 5 << endl;
output.close();
int number_1;
int sum=0;
// ifstream input("number.txt");
ifstream input;
input.open("number.txt");
while(!input.eof()) // eof()[end of file]测试是否读到了文件末尾
{
input >> number_1;
sum += number_1;
cout << number_1 << endl;
}
cout << "The sum is " << sum << endl;
return 0;
}

do-while 循环:while循环的变体

for 循环: 简洁

先验循环: while, for 循环, 循环的条件检验在循环体之前进行

后验循环: do while循环

#include <iostream>
#include <cstdlib> // rand and srand function
#include <ctime> // for time function
#include <fstream> // for file operation
#include <iomanip> // format outpit
using namespace std;
int main(int argc, char *argv[])
{
//srand(time(0));
cout << " Multiplication Table " << endl;
cout << " 1 2 3 4 5 6 7 8 9" << endl;
cout << "---------------------------------" << endl;
for(int i=1; i<= 10; i++)
{
cout << i << " | ";
for(int j=1; j<=10; j++)
{
cout << setw(3) << j*i << " ";
}
cout << endl;
}
return 0;
}

运行结果:

求最大公约数

#include <iostream>
#include <cstdlib> // rand and srand function
#include <ctime> // for time function
#include <fstream> // for file operation
#include <iomanip> // for foemat output
using namespace std;
int main(int argc, char *argv[])
{
//srand(time(0));
cout << "Enter a int number: ";
int number1;
cin >> number1;
cout << "Enter another number: ";
int number2;
cin >> number2;
int gcd = 1;
int k = 2; // 2-n1 2-n2
while(k<number1 && k<number2)
{
if(number1%k==0 && number2%k==0)
{
gcd = k;
}
k++;
}
cout << "The gcd is "<< gcd << endl;
return 0;
}

求最大公约数的其他方法:欧几里德算法,辗转相除法

欧几里德算法:

假设:

x>y

定义:

x // y = a

x % y =b, 则有b<y成立。

 x = a*y +b ---> b = x - a*y,则x,y的最大公约数也是b的约数,此时令x=y, y=b, 重复上述步骤,

知道x%y=0时, 此时的y就是x, y的最大公约数(相当于不断缩小公约数的范围)

code:

#include <iostream>
#include <cstdlib> // rand and srand function
#include <ctime> // for time function
#include <fstream> // for file operation
#include <iomanip> // for foemat output
using namespace std;
int main(int argc, char *argv[])
{
// 欧几里得法求最大公约数
cout << "Enter a number1: ";
int x;
cin >> x;
cout << "Enter another number: ";
int y;
cin >> y;
if(x<y)
{
int temp;
temp = x;
x = y;
y = temp;
}
cout << "x = " << x << endl;
cout << "y = " << y << endl;
while(x%y != 0)
{
int b = x % y;
x = y;
y = b;
}
cout << "The gcd is " << y << endl;
return 0;
}

预测未来的学费:

假设初始的学费为¥10000, 每年以7%递增,多少年后学费会翻倍。

#include <iostream>
#include <cstdlib> // rand and srand function
#include <ctime> // for time function
#include <fstream> // for file operation
#include <iomanip> // for foemat output
#include <cmath> // for general math function
using namespace std;
int main(int argc, char *argv[])
{
float init_tuition = 10000; // 初始学费
float increase_rate = 0.07;
int year=1;
float tuition = init_tuition * pow((1+increase_rate), year);
while(tuition < 2*init_tuition)
{
year++;
tuition = init_tuition * pow((1+increase_rate), year);
}
cout << "After " << year << " year(s) " << " the tuition double" << endl;
return 0;
}

蒙特卡洛模拟:

估计pi的值,作边长为1的正方形和它的内切圆。

#include <iostream>
#include <cstdlib> // rand and srand function
#include <ctime> // for time function
#include <fstream> // for file operation
#include <iomanip> // for foemat output
#include <cmath> // for general math function
using namespace std;
const float RAND_MAX_float = static_cast<float>(RAND_MAX);
int main(int argc, char *argv[])
{
const int trial_nums = 100000;
int number_of_hits = 0;
srand(time(0));
for(int i=0; i<trial_nums; i++)
{
double x = rand() / RAND_MAX_float;
double y = rand() / RAND_MAX_float;
if(sqrt(x*x + y*y)<1)
{
number_of_hits++;
}
}
cout << "PI is " << 4.0 * number_of_hits / trial_nums << endl;
return 0;
}

十进制数转换转换为十六进制:

十进制数连续除以16,直到商为零。

总结: 将得到的字符串连接按照反序输出的方法:

code:

#include <iostream>
#include <cstdlib> // rand and srand function
#include <ctime> // for time function
#include <fstream> // for file operation
#include <iomanip> // for foemat output
#include <cmath> // for general math function
#include <string>
using namespace std;
const float RAND_MAX_float = static_cast<float>(RAND_MAX);
int main(int argc, char *argv[])
{
// decimal convert to
cout << "Enter a int: " << endl;
int decimal;
cin >> decimal;
int tmp = decimal;
string hex="";
char hex_char;
while(decimal!=0)
{
int hexValue = decimal % 16;
hex_char = (hexValue>=0 && hexValue<=9)?static_cast<char>(hexValue+'0'): static_cast<char>(hexValue-10+'A');
//hex = hex + hex_char; // 这种写法输出的顺序是反的
hex = hex_char +hex; // 这种写法的输出是正确的
decimal = decimal / 16;
}
cout << tmp << " to hex is " << hex << endl;
return 0;
}

输出素数

#include <iostream>
#include <string>
#include <iomanip>
using namespace std;
const int number_of_prime = 50;
const int number_of_prime_per_line = 10;
int main(int argc, char *argv[])
{
// 输出素数
int counter = 0;
int number = 2; // 素数起始
cout << "The first 50 primes are: " << endl;
while(counter < number_of_prime)
{
bool isPrime = true;
for(int devisor=2; devisor<=number/2; devisor++)
{
if(number % devisor == 0)
{
isPrime = false;
break;
}
}
if(isPrime)
{
counter++;
if(counter%number_of_prime_per_line==0)
{
cout << setw(4) << number << endl;
}
else
{
cout << setw(4) << number; // 固定宽度输出,不用考虑添加空格
}
}
number++;
}
return 0;
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @   Alpha205  阅读(79)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示