以下是问题的描述。大家可以喂给手头的各个AI试试。
我试过:
通义千问 完美解答
deepseek/第三方deepseek/豆包 readcounter没有生成随机数,但核心代码正确
gemini/chatgpt 似乎听懂了一部分,但答非所问
文心一言 就像霓虹人写的“伪中国语”,每个字都对眼,但完全不知道它在说什么
然而尴尬的是:跑去vscode的通义灵码插件问同一个问题,通义灵码的输出和gemini/chatgpt一个水平。
*有一个计数器,被外部原因改变其读数。每次读数,比上一次增加n(-256< n < 256)。计数器本身的读数范围是0~4095,向上和向下都溢出。如果上一次读数为4090,本次读数为5,则认为计数器发生了向上溢出,实际计数增加值为5+4095 - 4090 = 10;如果上一次读数为4,本次读数为4094,则认为计数器发生了向下溢出,实际计数增加值为-(4 + 4095-4094) = -5.
请写一段C语言程序,假设每次读取计数器的函数为unsigned int readcounter();根据它的返回值与上一次的对比,计算出计数器增加或者减少了多少*
下面是通义千问的输出
#include <stdio.h>
#include <stdlib.h>
// 模拟读取计数器的函数
unsigned int readcounter() {
// 这里可以替换为实际硬件读取逻辑
static unsigned int counter = 0; // 静态变量模拟计数器
counter = (counter + rand() % 513 - 256) % 4096; // 模拟计数器变化
return counter;
}
// 计算计数器增减了多少
int calculate_counter_change(unsigned int last_value, unsigned int current_value) {
int delta;
// 计算直接差值
if (current_value >= last_value) {
delta = current_value - last_value;
} else {
delta = current_value - last_value;
}
// 考虑循环计数器的溢出情况
if (delta > 256) {
// 向下溢出
delta -= 4096;
} else if (delta < -256) {
// 向上溢出
delta += 4096;
}
return delta;
}
int main() {
unsigned int counter_last = 0; // 上一次读取的值,初始值为 0
unsigned int counter_read; // 当前读取的值
while (1) {
// 读取当前计数器值
counter_read = readcounter();
// 计算计数器增减了多少
int change = calculate_counter_change(counter_last, counter_read);
// 输出结果
printf("上次读数: %u, 当前读数: %u, 计数器增减了: %d\n", counter_last, counter_read, change);
// 更新上次读取值
counter_last = counter_read;
// 延迟一段时间(模拟连续读取)
getchar();
}
return 0;
}