2016-04-20 4 views
-1

Я новичок в программировании c, и я получил задание не так давно и закончил делать достаточно хорошо (очки были сняты, чтобы не использовать цикл for). Вот что из моего задания. «Напишите программу, которая запрашивает у пользователя радиус аналоговых часов, а затем печатает координаты x и y 12-часовых меток для этих часов. Можно предположить, что начало координат для осей 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]); 

Я использую инструкцию printf для всех 12 массивов.

Выход должен выглядеть так: «Координаты x и y метки 12 часов (0,000000, 1.000000) и изменяются в зависимости от радиуса». Спасибо!

+0

Я думаю, что ваш вопрос: «Как я должен был изменить это, чтобы использовать цикл' for'? »? Это ваш вопрос? Если да, пожалуйста, уточните. –

+0

Да. Как изменить код на цикл for? – SoonPro

+0

У вас есть круг на 360 градусов. Вы хотите получить 12 координат по диаметру этого круга с эквидистантным интервалом. Итак, как бы петля, вероятно, выглядела одинаково? Извините, это очень простой материал, вычитание очков было более чем исправлено. Просто подсказка: как вы генерировали значения для кода, который вы показываете? (риторический вопрос) – Olaf

ответ

1

Просто принимать последовательные заявления, как это и абстрагирование их в цикл является задачей, которая требует факторизации частей, которые общие.

Начните с этих двух пар операторов:

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 и угол ввода.

Мы можем видеть из сканирования остальных утверждений, что индекс последовательно увеличивается (значение увеличивается на единицу) с каждой последующей парой. Таким образом, мы могли бы использовать простой индекс цикла в качестве индексов массива:

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 градусов. Как мы можем абстрагироваться от угла, чтобы сделать нашу работу цикла эквивалентной утверждениям, которые вы использовали? Начните с определения того, каким должен быть приращение - в данном случае это не просто 1, как i. Мы хотим, чтобы 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); 
} 

Теперь мы в хорошем состоянии. Мы рассмотрим все 12 значений x и y таким образом. Но мы не на 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); 
} 

интересно Кроме того, если мне нужно массивы

Да, на самом деле вы делаете! Но вы уже использовали их для x и y. Никаких дополнительных массивов не требуется. Никаких массивов не требуется.

+0

Нет, нет необходимости в массивах. Но вы сделали домашнее задание для OP. Извините, но это не очень хорошая идея. Цикл 'for' представляет собой базовое заявление, которое он должен был изучить самостоятельно либо на уроках, либо на любой книге C. – Olaf

+0

Это задание было сделано несколько месяцев назад. Вот почему я сказал, что у меня сняты очки, потому что я не использовал цикл for. Как узнать, удастся ли мне снять очки за то, что вы не делаете цикл for, если я еще не включил его? Потому что я его включил. – SoonPro

+0

Также благодарит Брайана Каина, по крайней мере, вы учите дружелюбие C. Я только начал этот семестр и с тех пор много борется. – SoonPro

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; 
    } 
Смежные вопросы