C - Переписать цикл 2 for в цикл 1 for для копирования массивов. - PullRequest
0 голосов
/ 02 ноября 2018

Мне поставили следующую задачу:

"В функции main объявите целое число array с именем num1 с 30 элементами и объявите второе целое число array с именем num2 с 21 элементом. Каждому элементу num1 назначают случайное число от 1 до 50; напечатайте числа.

В for loop скопируйте первые 21 цифру от num1 до num2.

В другом for loop выведите значения элементов из num2, семь значений в строке. Найдите алгоритм, который будет печатать их из одного цикла, а не из 3 циклов . «

Мне удалось сузить до 2 для циклов, но мне трудно пытаться собрать все в один для цикла. Я просто не уверен, как я могу скопировать массивы из num1 в num2, если я не использую второй цикл for.

Вот работа, которую я проделал до сих пор. Он печатает все правильно, но в цикле 2, а не 1.

for (j = 0; j < 30; j++) // getting random numbers for num1
{
    num1[j] = 1 + rand() % (50 + 1 - 1);
    printf("%d ", num1[j]);

}
printf("\nThis is num2:\n"); 
for (j = 0; j < 21; j++) // copying num1 array into num2 array, and only taking the first 21 numbers
{
    num2[j] = num1[j];
    printf("%d ", num2[j]);
    if (x % 7 == 0) // this will print num2 with 3 rows each with 7 values 
    {
        printf("\n");

    }
    x++;
}

Ответы [ 3 ]

0 голосов
/ 02 ноября 2018

Форматирование не будет самым красивым, но это должно быть то, что вам нужно. Хитрость в том, что вы ждете, пока вы ее не заполните, и вычитаете из текущего индекса, чтобы получить старые значения.

int main(void) {
int num1[30];
int num2[21];

    for (int i = 0; i < 30; i++) {
        num1[i] = 1 + rand() % (50);
        printf("%d \n", num1[i]);

        if (i<21)
            num2[i] = num1[i];

        if (!(i%7))
            printf("%d %d %d %d %d %d %d\n", num2[i-6], num2[i-5], num2[i-4], num2[i-3], num2[i-2], num2[i-1], num2[i-0]);
        }

return 0;
}
0 голосов
/ 02 ноября 2018

Я думаю, что вы уже сделали больше, чем заданный вопрос.

В функции main объявляется целочисленный массив с именем num1 с 30 элементами. и объявить второй целочисленный массив с именем num2 с 21 элементом. к каждому элементу num1 назначают случайное число от 1 до 50; Распечатать цифры.

Вы сделали это. Обратите внимание, что нет никаких ограничений на то, как вы можете инициализировать и печатать числа. Вы можете использовать цикл for или while или просто сделать то же самое 30 раз.

В цикле for скопируйте первые 21 число из num1 в num2.

Готово. Смотри мою заметку ниже.

В другом цикле for выведите значения элементов из num2, семь значений за строку Найдите алгоритм, который будет печатать их из одного цикла, а не 3 петли. (акцент мой)

Готово. Вы напечатали значения в одном цикле. Заметьте , что вы пошли дальше, чем (мое прочтение), требуемого исходного вопроса; Вы включили операции копирования и печати в один и тот же цикл. Единственное, что меня беспокоит, так это то, почему вопрос касается 3 петель. Я ожидаю, что простая реализация ответа будет использовать два вложенных цикла для вывода значений. Так что, возможно, вопрос был сформулирован неоднозначно, и вы были правы, сочетая операции копирования и печати. Я, конечно, не думаю, что тебе нужно что-то еще делать.

0 голосов
/ 02 ноября 2018

Если вы ДЕЙСТВИТЕЛЬНО хотите сделать все в одном цикле, вы можете повторить 30 раз плюс 21 для обработки 2-го раздела и использовать оператор if для условной обработки:

for (j = 0; j < 30+21; j++) // getting random numbers for num1
{
  if(j < 30)
  {
   num1[j] = 1 + (rand() % 50);
   if(j < 21) 
   {
     num2[j] = num1[j];
   }
   printf("%d ", num1[j]);
  }
  else
  {
    if(j == 30)
      printf("\nThis is num2:");

    if (((j-30) % 7) == 0) 
    {
      printf("\n");
    }
    printf("%d ", num2[j-30]);
  }
}
printf("\n");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...