我是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),它根据半径而变化。”谢谢!
答案 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);
}
现在,我们有一个良好的开端。我们将以这种方式涵盖x
和y
的所有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);
}
还想知道我是否需要数组
是的,的确你做到了!但您已经在不需要数组。x
和y
使用了它们。不需要进一步的数组。
答案 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;
}