gpt4 book ai didi

时钟坐标

转载 作者:太空宇宙 更新时间:2023-11-04 07:02:08 27 4
gpt4 key购买 nike

我是 c 编程的新手,不久前我收到了一份作业,结果做得很好(因为没有使用 for 循环而被扣分)。这是我的作业。 “编写一个程序,提示用户输入模拟时钟的半径,然后打印该时钟的 12 小时标记的 x 和 y 坐标。您可以假设 x 和 y 轴的原点位于时钟”

我对如何使用 for 循环感到困惑,因为我试图找出一种方法。我知道这很容易,但我为小事而苦苦挣扎。这最终导致复制粘贴代码,从而导致大量代码。我想知道我是否可以获得有关如何使用 for 循环执行此程序的任何提示,而不必编写所有这些代码这是我的代码,但我不会显示所有代码,因为没有意义。 (还想知道我是否确实需要数组?也让我知道,对于奇怪的格式感到抱歉,我还没有想出如何让代码融入其中)。

int main () {
float x [12];
float y [12];
float rad;
int i, theta = 0;

printf("Enter the radius of the clock\n");
scanf("%f", &rad);

x[0] = rad * cos(90*M_PI/180);
y[0] = rad * sin(90*M_PI/180);

x[1] = rad * cos(60*M_PI/180);
y[1] = rad * sin (60*M_PI/180);

x[2] = rad * cos (30*M_PI/180);
y[2] = rad * sin (30*M_PI/180);

x[3] = rad * cos (0 * M_PI/180);
y[3] = rad * sin (0* M_PI/180);

x[4]= rad * cos (330*M_PI/180);
y[4]= rad * sin (330*M_PI/180);

x[5] = rad * cos (300*M_PI/180);
y[5] = rad * sin (300*M_PI/180);

x[6] = rad * cos (270*M_PI/180);
y[6] = rad * sin (270*M_PI/180);

x[7] = rad * cos (240*M_PI/180);
y[7] = rad * sin (240*M_PI/180);

x[8] = rad * cos (210*M_PI/180);
y[8] = rad * sin (210*M_PI/180);

x[9] = rad * cos (180*M_PI/180);
y[9] = rad * sin (180*M_PI/180);

x[10] = rad * cos (150*M_PI/180);
y[10] = rad * sin (150*M_PI/180);

x[11] = rad * cos (120*M_PI/180);
y[11] = rad * sin (120*M_PI/180);

printf("The x and y coordinates of the 12 o'clock mark are (%f , %f)\n", x[0], y[0]);

我对所有 12 个数组都使用 printf 语句。

输出应该看起来像这样“12 点钟标记的 x 和 y 坐标是 (0.000000 , 1.000000) 并且它根据半径而变化。”谢谢!

最佳答案

仅仅采用像这样的顺序语句并将它们抽象成一个循环是一项需要分解出公共(public)部分的任务。

从这两对语句开始:

x[0] = rad * cos(90*M_PI/180);
y[0] = rad * sin(90*M_PI/180);

x[1] = rad * cos(60*M_PI/180);
y[1] = rad * sin (60*M_PI/180);

第一对和第二对之间有什么变化?只有x/y的索引和输入的角度。

通过扫描其余语句,我们可以看到索引随着每一对后续语句顺序递增(值递增 1)。所以我们可以使用一个简单的循环索引作为数组索引:

for (int i = 0 ; i < 12; i++) {
x[i] = rad * cos(90*M_PI/180);
y[i] = rad * sin(90*M_PI/180);
}

好的,好的开始,但现在所有 12 个值都将使用 90 度。我们如何抽象出角度以使我们的循环工作等同于您使用的语句?首先确定增量应该是多少——在本例中,它不像 i 那样只增加 1。我们要 30 度,也就是 360 度的十二分之一。

const size_t divisions = 12;
const size_t degrees_per_iter = 360 / divisions;
for (int i = 0 ; i < divisions; i++) {
x[i] = rad * cos(i*degrees_per_iter*M_PI/180);
y[i] = rad * sin(i*degrees_per_iter*M_PI/180);
}

现在,我们有了一个良好的开端。我们将以这种方式覆盖 xy 的所有 12 个值。但我们并不是 100% 与原始代码相同。顺序很重要吗?让我们假设它很关键,这会稍微提高标准。

为了保持在有效度数范围内并保持输出函数连续,我们需要使用modulus或余数除法。

const size_t divisions = 12;
const size_t degrees_per_iter = 360 / divisions;
const size_t start_angle_deg = 90;
for (int i = 0 ; i < divisions; i++) {
const size_t angle_deg = (start_angle_deg + (i * degrees_per_iter)) % 360;

const float x = rad * cos(angle_deg * M_PI/180);
const float y = rad * sin(angle_deg * M_PI/180);
printf("The x and y coordinates of the 12 o'clock mark are (%f , %f)\n", x, y);
}

Also wondering if I do need arrays

是的,确实如此!但是您已经将它们用于 xy。不需要更多数组。 不需要数组。

关于时钟坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36732497/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com