Си. Массивы.

Теория

Массивы представляют собой фундаментальную структуру данных, и они чрезвычайно полезны. Мы используем массивы для хранения значений одного и того же типа в смежных ячейках памяти. В частности, использование массивов позволяет нам создавать «группы» или «кластеры» переменных без необходимости указывать уникальное имя переменной для каждого, но все же позволяя нам индивидуально индексировать элементы массива. Если вы еще не начали отсчет с нуля, теперь самое время, потому что в C массивы индексируются с нуля, что означает, что первый элемент массива k-элементов находится в индексе под номером 0, а последний элемент находится в индекс под номером k-1.

CS50. Си. Массивы.

Обратный отсчет

Задача

Нижеприведенный код пытается запустить обратный отсчет с 9 до 0, но, к сожалению, выводится ошибка. Исправьте ошибку!

Distribution Code

#include <cs50.h>
#include <stdio.h>

#define COUNT 10

int main(void)
{
    int countdown[COUNT] = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
    for (int i = 0; i <= COUNT; i++)
    {
        if (i == 9)
        	printf("%d!\n", countdown[i]);
    	else
    		printf("%d..", countdown[i]);
    }
}

Фибоначчи

Задача

Вычисление серии чисел Фибоначчи, в которой любое заданное число в ряду является суммой двух предыдущих (например, 0, 1, 1, 2, 3, 5, 8, …), часто делается рекурсивно. Однако это также можно сделать довольно эффективно, используя массив. Напишите код для вычисления и сохранения первых 25 чисел Фибоначчи в массиве. Вам нужно только явно объявить первые два числа, а затем использовать цикл для вычисления и печати остальных.

Distribution Code

#include <cs50.h>
#include <stdio.h>

#define N 25

int main(void)
{
    // объявляем массив и сохраняем первые два значения
    int fibo[N];
    fibo[0] = 0;
    fibo[1] = 1;

    // TODO: вычислить и сохранить следующие 23 значения

    // TODO: распечатать всю серию
}

Мусорные значения

Задача

В приведенном ниже коде объявлен массив из 20 int’ов, некоторые значения установлены, а затем печатается сумма массива. Однако напечатанное значение имеет мало общего с фактическим значением суммы. Почему это может быть? Исправьте ошибку, чтобы распечатать реальную сумму!

Distribution Code

#include <cs50.h>
#include <stdio.h>

#define N 20

int main(void)
{
    // объявляем массив и сохраняем некоторые значения
    int values[N];
    values[0] = 1;
    values[1] = 10;
    values[2] = 5;
    values[3] = 12;
    values[4] = 3;

    // вычислить сумму
    int sum = 0;
    for (int i = 0; i < N; i++) // Вы не можете изменить эту строку кода!
    {
        sum += values[i];
    }

    printf("The sum of 1 + 10 + 5 + 12 + 3 is: %i\n", sum);
}

Инициализация

Задача

Перепишите приведенный ниже код, инициализируя два массива - 1-мерный массив размером 10 и 2-мерный массив размером 30x30. Для 1-D массива, пожалуйста, перепишите текущую инициализацию, используя только одну строку (вместо 4х). Для 2-D массива, пожалуйста, инициализируйте его таким образом, чтобы элемент с индексами i, j имел значение i * j. Распечатайте оба массива, чтобы проверить свой код!

Distribution Code

#include <cs50.h>
#include <stdio.h>

#define DIM_1 10
#define DIM_2 30

int main(void)
{
    // TODO: Перепишите нижние 4 строки, используя только одну строку
    int array[DIM_1];
    for (int i = 0; i < DIM_1; i++)
    {
        array[i] = 0;
    }

    // TODO: Установите каждый из индексов нижнего 2D-массива в значение i * j
    int array_2[DIM_2][DIM_2];

    // TODO: Распечатайте оба массива, чтобы убедиться, что вы все сделали правильно!
}

Среднее значение

Задача

Напишите программу, которая предложит пользователю ввести 5 целых чисел. Храните целые числа в массиве и распечатайте их среднее значение (результат можно округлить до двух знаков после запятой).

Пример:

./mean
Give me an integer: 4
Give me an integer: 1
Give me an integer: 5
Give me an integer: 10
Give me an integer: 5
Average: 5.00

Distribution Code

#include <cs50.h>
#include <stdio.h>

#define N 5

int main(void)
{
    // TODO
}

Тральщик

Задача

В приведенном ниже коде 2-мерный целочисленный массив размером 10x8 был захвачен и случайно заполнен 5 минами! Вы хотите «развернуть» массив и распечатать местоположение (координаты в массиве) всех 5 мин. Значение 1 указывает, что мина установлена; в противном случае значение будет равно 0! Вы можете использовать значения координат, которые либо индексируются с 1 (1-10, 1-8), либо с 0 (0-9, 0-7).

Distribution Code

#include <cs50.h>
#include <stdio.h>
#include <time.h>

#define HEIGHT 10
#define WIDTH 8
#define MINE_NUM 5

int main(void)
{
    // инициализировать поле, которое должно быть пустым, и заполнить 5 минами, случайно расположенными
    int field[HEIGHT][WIDTH] = 0;
    time_t t;
    srand((unsigned) time(&t));
    for (int k = 0; k < MINE_NUM; k++)
    {
        int i = rand() % HEIGHT;
        int j = rand() % WIDTH;
        // если мина уже была расположена в этом месте, попробовать снова
        if (field[i][j] == 1)
            k--;
        else
            field[i][j] = 1;
    }

    // TODO: распечатайте местоположение мин!
}

Покемон

Задача

Напишите программу, которая предложит пользователю ввести имена пяти Покемонов. Храните эти имена в массиве и произвольно выбирайте их для печати. СОВЕТ: Не изобретайте велосипед - функция уже существует, которая вернет случайное число!

Пример:

./pokemon
Give me a Pokemon: Butterfree
Give me a Pokemon: Clefairy
Give me a Pokemon: Diglett
Give me a Pokemon: Growlithe
Give me a Pokemon: Rapidash
Clefairy, I choose you!

Distribution Code

#include <cs50.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <string.h>

#define MAX 5

int main(void)
{
    // TODO
}