时钟坐标

时间:2016-04-20 01:56:33

标签: c

我是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.0000),它根据半径而变化。”谢谢!

2 个答案:

答案 0 :(得分:3)

只是采用这样的顺序语句并将它们抽象为循环是一项需要将​​常用部分分解出来的任务。

从这两对陈述开始:

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个值。但我们与原始代码并非完全相同。订单是否关键?我们假设它 是关键的,这会稍微提高一点。

为了保持在有效度范围内并保持输出函数连续,我们需要使用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);
}
  

还想知道我是否需要数组

是的,的确你做到了!但您已经在xy使用了它们。不需要进一步的数组。不需要数组。

答案 1 :(得分:0)

我不会使用数组,我会做更像这样的事情:

    int dir = 0;
    char hour = 3;
    for(int i=0; i<12; i++){
        float xcoord = rad * cos(dir*M_PI/180);
        float ycoord = rad * sin(dir*M_PI/180);
        printf(...);
        dir += 30;
        hour++;
        hour = (hour > 12) ? 1 : hour+1;
    }