前篇:
云课五分钟-05一段代码修改-AI修改C++
简单问题,与文心一言等工具交互一次,就能得到很满意的结果。
但是,复杂问题呢,可能需要多次交互,也可能由于问题的复杂性,提问者本身描述就存在不合理的地方。
视频:
云课五分钟-06一段代码调试debug-AI与人工
文本:
能否修改如上代码,显示彩色的动态效果。
例如这个问题,如果突破思维的局限,甚至不用修改代码就能实现呢。
思维定势的破除,对于智能时代非常重要的,毕竟应用工具的是每个人。
于是这个问题有了另一种解法。
#!/bin/bash
# 定义颜色数组
colors=("\033[0;31m" "\033[0;32m" "\033[0;33m" "\033[0;34m" "\033[0;35m" "\033[0;36m" "\033[0;37m")
# 获取颜色数组的长度
colors_length=${#colors[@]}
# 设置超时时间(以秒为单位)
timeout=6
# 无限循环
while true; do
# 循环遍历颜色数组
for (( i=0; i<${colors_length}; i++ )); do
# 输出带有颜色的文本
echo -e "${colors[$i]}This is a colored text!\033[0m"
sleep $timeout
# 启动程序
./a.out &
program_pid=$!
# 等待程序运行并计时
sleep $timeout
# 检查程序是否仍在运行
if ps -p $program_pid > /dev/null; then
echo "程序运行时间超过$timeout秒,正在强制变色..."
kill -9 $program_pid
else
echo "程序在正常时间内退出。"
fi
sleep $timeout
done
done
在这个脚本中,colors
数组包含了所有基本颜色(红色,绿色,黄色,蓝色,洋红色,青色,白色)的 ANSI escape codes。脚本会在这些颜色之间循环,使得文本颜色不断变化。
注意:这个脚本会无限循环,直到你停止它(通常可以通过按 Ctrl+C
来停止)。另外,这个脚本只适用于支持 ANSI escape codes 的终端。
注意,你需要确保my_program
具有可执行权限,如果不是,你可以使用chmod +x my_program
命令赋予其可执行权限。同时,你需要根据实际需要,将此代码嵌入到脚本的正确位置。这里只是一个示例,你可能需要根据自己的需求进行调整。
你可以使用脚本来关闭程序1并打开程序2。下面是一个示例脚本,它首先尝试关闭程序1,然后打开程序2:
#!/bin/bash
# 关闭程序1
pkill -f "程序1的进程名"
# 等待一段时间确保程序1关闭
sleep 5
# 打开程序2
./程序2的路径 &
请注意,你需要将 "程序1的进程名" 替换为实际程序1的进程名,并将 "程序2的路径" 替换为实际程序2的可执行文件的路径。
这个脚本首先使用 pkill
命令发送信号关闭程序1。-f
选项允许你指定要匹配的进程名称。然后,脚本使用 sleep
命令等待一段时间,确保程序1有足够的时间关闭。最后,使用 ./程序2的路径 &
的方式打开程序2。&
符号表示在后台运行程序2。
你可以将上述脚本保存为一个文本文件(例如 script.sh
),然后在终端中运行该脚本:bash script.sh
。
如果程序不会自动退出,如果在脚本中计时,退出特定程序呢
如果程序不会自动退出,你可以使用脚本中的计时器来监控程序的运行时间,并在超时时退出特定程序。下面是一个示例脚本,可以实现这个功能:
#!/bin/bash
# 设置超时时间(以秒为单位)
timeout=60
# 启动程序
./程序路径 &
program_pid=$!
# 等待程序运行并计时
sleep $timeout
# 检查程序是否仍在运行
if ps -p $program_pid > /dev/null; then
echo "程序运行时间超过$timeout秒,正在强制退出..."
kill -9 $program_pid
else
echo "程序在正常时间内退出。"
fi
在这个示例脚本中,你需要将 程序路径
替换为你要运行的程序的实际路径。脚本首先启动程序,并将其进程ID保存到 program_pid
变量中。然后,使用 sleep
命令等待指定的超时时间。在超时时间到达后,脚本检查程序是否仍在运行,如果是,则使用 kill -9
命令强制退出程序。
你可以根据需要修改超时时间 timeout
的值。请注意,强制退出程序可能会导致数据丢失或不完整,因此请确保在适当的情况下使用此脚本。
这段代码是一个C语言程序,用于生成一个动态变化的彩色文本输出在终端上。它使用了ANSI转义码来控制文本的颜色。让我们一步步解释代码的每个部分:
- 引入头文件:
c
#include <stdio.h>
#include <math.h>
#include <cstring>
#include <unistd.h>
这些头文件包含了程序需要的各种函数和声明。例如,stdio.h
包含了输入输出函数,math.h
包含了数学函数等。
2. 定义颜色数组:
c
char colors[7][8] = {"\033[31m", "\033[33m", "\033[32m", "\033[36m", "\033[34m", "\033[35m", "\033[37m"};
这是一个包含7种颜色的ANSI转义码的数组。这些转义码用于在终端上设置文本颜色。
3. 主函数:
c
int main() { ... }
这是程序的入口点。
4. 变量初始化:
一些变量(如A、B、i、j等)被初始化,用于在后面的循环中计算。
- 无限循环:
c
for (;;) { ... }
这个无限循环使得程序持续运行,生成动态变化的输出。
6. 清理屏幕和初始化数组:
c
printf("\x1b[2J");
memset(b, 32, 1760);
memset(z, 0, 7040);
printf和
memset函数用于清理屏幕和初始化数组。 7. **计算和绘图**: 在嵌套的
for循环中,程序使用三角函数和其他数学计算来生成一个形状,并将结果存储在
b和
z数组中。颜色选择基于数组
N`的值。
- 打印输出:
c
printf("\x1b[H");
for (k = 0; k < 1761; k++) {
printf("%s", colors[k%7]);
putchar(k % 80 ? b[k] : 10);
A += 0.00004;
B += 0.00002;
}
在这部分,程序将计算得到的字符打印到屏幕上,并设置相应的颜色。同时,A和B的值也稍微增加,使得输出动态变化。
9. 暂停:
c
usleep(100000);
程序暂停100000微秒(0.1秒),然后重新开始循环,继续生成新的输出。
整体而言,这个程序是一个动态的文本生成器,它使用数学函数生成形状,并使用ANSI颜色代码以不同颜色显示这些形状。这个程序可能用于终端的艺术显示或者简单地展示动态文本的效果。
这段代码看起来像是一个在终端中生成动态图形的程序。它使用了 ANSI escape codes 来控制文本的颜色和位置,并包含了大量的数学运算来生成图形的每一个点。
如果要找出最难理解的一部分,可能因人而异。但其中比较复杂的部分可能是以下这段代码:
c
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);
这一段代码包含了大量的浮点数运算,包括三角函数、乘法和除法。这些运算在图形生成中用于计算每个点的位置和颜色。由于涉及到多个变量的三角函数和复合运算,这一部分可能比较难以理解。
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);
整体而言,代码的目的是通过一系列数学运算生成图形,并使用 ANSI escape codes 在终端上输出相应字符来表示图形的每一个点。这个程序是一种创造性的方法,利用终端的字符输出生成动态图形。对于不熟悉这种方法的人来说,整个程序可能都比较难以理解。
以下是一个使用C++编写的在终端中动态旋转的立方体的代码示例:
#include <iostream>
#include <cmath>
#include <chrono>
#include <thread>
#define WIDTH 80
#define HEIGHT 20
const char* colors[7] = {"\033[31m", "\033[33m", "\033[32m", "\033[36m", "\033[34m", "\033[35m", "\033[37m"};
void drawCube(float angleX, float angleY) {
// 清屏
std::cout << "\033[2J";
for (int x = -1; x <= 1; x++) {
for (int y = -1; y <= 1; y++) {
for (int z = -1; z <= 1; z++) {
if (x * x + y * y + z * z == 1) {
int posX = WIDTH / 2 + (int)(x * 8 * std::cos(angleY) - z * 4 * std::sin(angleX));
int posY = HEIGHT / 2 + (int)(y * 4 - z * 4 * std::cos(angleX) - x * 8 * std::sin(angleY));
if (posX >= 0 && posX < WIDTH && posY >= 0 && posY < HEIGHT) {
std::cout << "\033[" << posY << ";" << posX << "H" << colors[(int)(angleY * 7) % 7] << (x + 'X') << "\033[0m";
}
}
}
}
}
std::cout << std::flush;
}
int main() {
float angleX = 0.0, angleY = 0.0;
while (true) {
drawCube(angleX, angleY);
// 更新角度以旋转立方体
angleX += 0.02;
angleY += 0.015;
// 等待一段时间
std::this_thread::sleep_for(std::chrono::milliseconds(20));
}
return 0;
}
这个代码示例使用C++的标准库和终端控制序列来实现在终端中动态旋转的立方体。它定义了一个drawCube
函数来绘制立方体,并在main
函数中使用一个无限循环来不断更新和绘制旋转的立方体。在每次循环中,都会更新角度、绘制立方体,并等待一段时间以实现动态效果。你可以根据需要调整角度的增量和等待时间来控制立方体的旋转速度和流畅度。记得在支持ANSI escape codes的终端中运行该代码,以正确显示颜色和立方体的动态旋转效果。
推荐:
ascii-graphics
cmake_minimum_required(VERSION 3.23.1)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
project(Ascii-Graphics)
add_executable(${PROJECT_NAME} ascii-graphics.cpp)
add_subdirectory(src)
target_link_libraries(${PROJECT_NAME} agm)
target_link_libraries(${PROJECT_NAME} Camera)
target_link_libraries(${PROJECT_NAME} Lights)
target_link_libraries(${PROJECT_NAME} Mesh)
target_link_libraries(${PROJECT_NAME} Screen)
标签:脚本,颜色,06,AI,代码,float,程序,云课,033 From: https://blog.51cto.com/u_12369060/8718234