Индекс бесконечного массива без указателя на C - PullRequest
0 голосов
/ 15 марта 2019

Я хочу получить переменную от пользователя и установить ее для моего размера массива.Но в CI нельзя использовать переменную для размера массива.Также я не могу использовать указатели и * знаки для своего проекта, потому что я изучаю C, и мой учитель сказал, что это запрещено.Может кто-нибудь сказать мне, как получить размер массива от пользователя?

Наконец, я хочу сделать следующие два проекта: 1- Возьмите n от пользователя и получите целые числа от пользователя, затем отмените печать записей.2- Взять n от пользователя и получить числа с плавающей точкой от пользователя и вычислить среднее.Единственным способом является использование массива с переменным размером.

<3 </p>

РЕДАКТИРОВАТЬ (ОТВЕТЬТЕ НА ЭТО):

Позвольте мне рассказать полную историю.

СначалаВопрос моего учителя: получать записи (int) от пользователя до тех пор, пока пользователь не введет «-1», затем введите номера записей от последнего к первому.(Учитель попросил меня решить этот проект с помощью рекурсивных функций и без какого-либо массива). Второй вопрос: получить от пользователя n записей (float) и вычислить их среднее значение.(Для этого я должен использовать массивы и функции или простые коды без указателя)

Ответы [ 3 ]

4 голосов
/ 15 марта 2019

Современный C имеет массивы переменного размера, как показано ниже:

void example(int size)
{
    int myArray[size];
    //...
}

Размер не должен быть слишком большим, потому что массив расположен в стеке.Если он слишком большой, стек переполнится.Кроме того, этот массив существует только в функции (здесь: funtion example), и вы не можете вернуть его вызывающей стороне.

1 голос
/ 15 марта 2019

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

Для задачи 2 это довольно просто.Просто накапливайте входные данные и делите их на количество входов перед печатью.Например:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    float result = 0;
    float f;
    int n = 0;
    printf("How many numbers?\n");
    if (scanf("%d", &n) != 1) exit(1);
    for (int i=0; i < n; ++i)
    {
        if (scanf("%f", &f) != 1) exit(1);
        result += f;
    }
    result /= n;
    printf("average is %f\n", result);
    return 0;
}

Первая задача немного сложнее, но может быть решена с помощью рекурсии.Вот алгоритм в псевдокоде.

void foo(int n)  // where n is the number of inputs remaining
{
    if (n == 0) return;     // no input remaining so just return
    int input = getInput;   // get next user input
    foo(n - 1);             // call recursive
    print input;            // print the input received above
}

и назовите его как

foo(5);  // To get 5 inputs and print them in reverse order

Я оставлю для OP, чтобы превратить этот псевдокод в реальный код.

0 голосов
/ 15 марта 2019

Вы можете использовать массивы переменного размера.Они разрешены при компиляции с -std=c99

В противном случае вы можете перераспределить массив произвольного размера (например, верхнюю границу вашего фактического размера), а затем использовать его с фактическим n, предоставленным пользователем.

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

...