前篇:
在前一节,使用大模型工具文心一言等可以帮助分析代码,加快理解。
信息时代→智能时代,系统学习转为碎片学习。
发散思维的能力在智能时代尤为重要。
同样我们也可以借助智能化工具修改代码,提出自己的需求。
所有的云课五分钟,不仅演示可行案例,也同样重视在尝试过程中的失败,并且也会全部展示出来。
一次又一次在失败中站起来,这也许就是人区别于机器人所具有的独特成长历程,弥足珍贵。
视频与文字并非对应关系,类似互补关系,同时又相互独立。
视频:
云课五分钟-05一段代码修改-AI修改C
文字:
usleep(30000); 实现什么功能
usleep(30000);
实现的功能是使程序暂停30000微秒(也就是0.03秒或30毫秒)。
在这段代码中,usleep
函数用于在每次循环迭代之间添加一个小的延迟。这样做有几个目的:
- 可视化效果:使得用户能够观察到图形的动态变化。如果没有这个延迟,图形变化会过快,可能难以观察。
- 减轻CPU负担:减少程序的运行频率,从而降低CPU的使用率。这对于轻量级和不需要高频率更新的应用是有益的。
- 节奏控制:对于动态系统或者动画来说,
usleep
可以用于控制系统的更新速度或者动画的帧率。
简单来说,usleep(30000);
就是用来在每次循环迭代中创建一个小的延迟,以提供更好的用户体验并降低CPU的使用率。
#include <stdio.h>
#include <math.h>
#include <cstring>
#include <unistd.h>
int main() {
float A = 0, B = 0;
float i, j;
int k;
float z[1760];
char b[1760];
printf("x1b[2J");
for (;;) {
memset(b, 32, 1760);
memset(z, 0, 7040);
for (j = 0; j < 6.28; j = 0.07) {
for (i = 0; i < 6.28; i = 0.02) {
float c = sin(i);
float d = cos(j);
float e = sin(A);
float f = sin(j);
float g = cos(A);
float h = d 2;
float D = 1 / (c * h * e f * g 5);
float l = cos(i);
float m = cos(B);
float n = sin(B);
float t = c * h * g - f * e;
int x = 40 30 * D * (l * h * m - t * n);
int y = 12 15 * D * (l * h * n t * m);
int o = x 80 * y;
int N = 8 * ((f * e - c * d * g) * m - c * d * e - f * g - l * d * n);
if (22 > y && y > 0 && x > 0 && 80 > x && D > z[o]) {
z[o] = D;
b[o] = ".,-~:;=!*#$@"[N > 0 ? N : 0];
}
}
}
printf("x1b[H");
for (k = 0; k < 1761; k ) {
putchar(k % 80 ? b[k] : 10);
A = 0.00004;
B = 0.00002;
}
usleep(30000);
}
return 0;
}
修改如上代码,使得动态效果变慢一倍。
如果你想让动态效果变慢一倍,你可以简单地将 usleep(30000);
这行代码修改为 usleep(60000);
。这将使得程序在每次循环迭代后暂停60000微秒(也就是0.06秒或60毫秒),是原来的两倍时间。
所以修改后的代码如下:
代码语言:javascript复制#include <stdio.h>
#include <math.h>
#include <cstring>
#include <unistd.h>
int main() {
float A = 0, B = 0;
float i, j;
int k;
float z[1760];
char b[1760];
printf("x1b[2J");
for (;;) {
memset(b, 32, 1760);
memset(z, 0, 7040);
for (j = 0; j < 6.28; j = 0.07) {
for (i = 0; i < 6.28; i = 0.02) {
// ... (unchanged code)
}
}
printf("x1b[H");
for (k = 0; k < 1761; k ) {
putchar(k % 80 ? b[k] : 10);
A = 0.00004;
B = 0.00002;
}
usleep(60000); // Changed from usleep(30000)
}
return 0;
}
这样做将使得动态图形的更新速度变慢,使得其变化更加易于观察。
对于简单的修改要求,AI基本都能完成。
但是,要求多了,需要细节描述好,同时,也有概率出现无法解决的情况。
能否修改如上代码,显示彩色的动态效果。
在终端中显示彩色文本通常需要用到ANSI转义码。你可以通过修改b[o]
的赋值部分来实现彩色效果。
首先,你需要定义一个颜色数组,这个数组包含你想要用的ANSI颜色码。然后,你可以像之前一样使用".,-~:;=!*#$@"
数组来选择颜色。
以下是一个简单的修改版本,这里我仅展示了如何将b[o]
修改为彩色,我使用了10种不同的颜色来循环:
#include <stdio.h>
#include <math.h>
#include <cstring>
#include <unistd.h>
// ANSI color codes for the colors
const char* colors[] = {
"x1b[31m", // Red
"x1b[32m", // Green
"x1b[33m", // Yellow
"x1b[34m", // Blue
"x1b[35m", // Magenta
"x1b[36m", // Cyan
"x1b[31;1m", // Bold Red
"x1b[32;1m", // Bold Green
"x1b[33;1m", // Bold Yellow
"x1b[37m" // White
};
int main() {
float A = 0, B = 0;
float i, j;
int k;
float z[1760];
char b[1760];
printf("x1b[2J");
for (;;) {
memset(b, 32, 1760);
memset(z, 0, 7040);
for (j = 0; j < 6.28; j = 0.07) {
for (i = 0; i < 6.28; i = 0.02) {
// ... (unchanged code)
int color_index = N > 0 ? N % 10 : 0; // Cycle colors if there are more points than colors
b[o] = colors[color_index]; // Set the color for this point
// You might want to append the actual character here like: b[o] = colors[color_index] ".";
// It depends on what visual effect you're aiming for.
}
}
printf("x1b[H");
for (k = 0; k < 1761; k ) {
putchar(k % 80 ? b[k] : 10);
A = 0.00004;
B = 0.00002;
}
usleep(60000);
}
return 0;
}
注意: 上述代码片段假定N
的值是变化的,并且可以提供足够的颜色变化。如果N
的变化不足以提供所有颜色的变化,你可能需要找到另一种方式来映射点到颜色。同时,要记住在最后的putchar
之后重置颜色,可以使用x1b[0m
来重置到默认颜色。如果字符和颜色是分开的(即使用了注释中的append方法),你可能需要在字符后面添加这个重置码。
在编译如上代码时,出现报错,错误如下:code03.cpp: In function ‘int main()’: code03.cpp:52:42: error: invalid conversion from ‘const char*’ to ‘char’ [-fpermissive] b[o] = colors[color_index]; // Set the color for this point ^ code03.cpp:66:1: error: expected ‘}’ at end of input }
这里有两个问题:
- 类型不匹配:
b[o]
被定义为char
,但你试图将const char*
(字符串)赋给它,这就是第一个错误的原因 - 缺少结束大括号:你的代码结构可能没有正确地关闭,这会导致第二个错误
解决方案
- 对于类型不匹配问题:
如果你想存储ANSI颜色代码,你应该将b
数组的类型从char
改为const char*
,这样可以存储字符串而不是单个字符但是,这样做的话你需要确保其他部分的代码与这个类型兼容
代码修改如下:
cpp
const char* b[1760]; | |
---|---|
// ... | |
b[o] = colors[color_index]; |
- 对于缺少结束大括号问题:
确保所有的代码块都有正确的结束大括号}
你需要在报错的位置检查前面的代码块,确保每个开始的{
都有对应的结束}
根据提供的代码片段,这两个修改应该能够解决你的问题但是,如果这些修改后仍然存在问题,请提供更多的代码上下文,以便我能更全面地理解和解决问题
这段代码看起来像是一个基于终端的动画,使用 ASCII 字符来显示一种动态模式。它已经在做一些相当复杂的数学计算来生成这个动画。这段代码使用了正弦和余弦函数来生成形状,并使用了循环来持续更新画面。
你可以尝试以下几种方式来让这段代码变得更有趣:
- 交互性:目前,这个动画是预设的,且无法与用户交互。你可以考虑通过读取键盘输入来改变动画的某些参数,使之能够与用户交互。例如,可以让用户通过按键来改变颜色、形状、动画速度等。
- 颜色:目前这个动画只使用了 ASCII 字符,你可以考虑引入颜色来增加视觉效果。需要注意的是,终端中输出颜色需要特殊的控制序列,你可以查找 ANSI escape code 来了解如何在终端中输出颜色。
- 音效:虽然这是一个视觉动画,但如果你增加一些音效可能会更有趣。例如,当特定的形状或模式出现时,可以播放特定的声音。需要注意的是,这可能需要引入一些音频库来实现。
- 更复杂的模式:你可以尝试引入更复杂的数学函数来生成更复杂的模式。例如,你可以尝试使用分形或者其他复杂的数学函数。
- 保存/分享动画:允许用户保存或分享他们创建的动画。这可能需要将动画转换为视频或者 GIF 格式。
在修改和增加功能的过程中,需要注意的是保持代码的清晰和可读性。同时,因为这段代码涉及到大量的数学运算,所以在增加功能的同时也要考虑性能的影响。
当然!以下是一个修改后的示例,增加了颜色和交互性。请注意,这个示例需要终端支持ANSI escape codes来显示颜色。
代码语言:javascript复制#include <stdio.h>
#include <math.h>
#include <cstring>
#include <unistd.h>
// 定义ANSI escape codes
#define COLOR_RESET "