2013-04-29 2 views
1

У нас был проект, который попросил нас написать программу, которая позволяет пользователю вводить ряд чисел «читать числа в массив для дальнейшей обработки, пользовательские сигналы, которые они завершают, вводя отрицательное число (отрицательное значение не используется в вычислениях), после того, как все числа были прочитаны, выполните следующие действия: суммируйте введенные #, подсчитайте введенные #, найдите min/max #, вычислите среднее значение, затем выведите их на экран . таким образом, рабочая версия этого, что я сделал как выглядит такC++ Array копирование/смена

/* Reads data into array. 
paramater a = the array to fill 
paramater a_capacity = maximum size 
paramater a_size = filled with size of a after reading input. */ 

void read_data(double a[], int a_capacity, int& a_size) 
{ 
    a_size = 0; 

bool computation = true; 

while (computation) 
{ 
    double x; 
    cin >> x; 

    if (x < 0) 
     computation = false; 

    else if (a_size == a_capacity) 
    { 
     cout << "Extra data ignored\n"; 
     computation = false; 
    } 
    else 
    { 
     a[a_size] = x; 
     a_size++; 
    } 
} 
} 


/* computes the maximum value in array 
paramater a = the array 
Paramater a_size = the number of values in a */ 

double largest_value(const double a[], int a_size) 
{ 
if(a_size < 0) 
    return 0; 

double maximum = a[0]; 

for(int i = 1; i < a_size; i++) 
    if (a[i] > maximum) 
     maximum = a[i]; 
return maximum; 

} 


/* computes the minimum value in array */ 
double smallest_value(const double a[], int a_size) 
{ 
if(a_size < 0) 
    return 0; 

double minimum = a[0]; 

for(int i = 1; i < a_size; i++) 
    if (a[i] < minimum) 
     minimum = a[i]; 
return minimum; 
} 

//computes the sum of the numbers entered 
double sum_value(const double a [], int a_size) 
{ 
if (a_size < 0) 
    return 0; 

double sum = 0; 

for(int i = 0; i < a_size; i++) 
    sum = sum + a[i]; 
return sum; 
} 

//keeps running count of numbers entered 
double count_value(const double a[], int a_size) 
{ 
if (a_size < 0) 
    return 0; 

int count = 0; 
for(int i = 1; i <= a_size; i++) 
    count = i; 
return count; 

} 



int _tmain(int argc, _TCHAR* argv[]) 
{ 

const int INPUT_CAPACITY = 100; 
double user_input[INPUT_CAPACITY]; 
int input_size = 0; 
double average = 0; 

cout << "Enter numbers. Input negative to quit.:\n"; 

read_data(user_input, INPUT_CAPACITY, input_size); 

double max_output = largest_value(user_input, input_size); 
cout << "The maximum value entered was " << max_output << "\n"; 

double min_output = smallest_value(user_input, input_size); 
cout << "The lowest value entered was " << min_output << "\n"; 

double sum_output = sum_value(user_input, input_size); 
cout << "The sum of the value's entered is " << sum_output << "\n"; 

double count_output = count_value(user_input, input_size); 
cout << "You entered " << count_output << " numbers." << "\n"; 

cout << "The average of your numbers is " << sum_output/count_output << "\n"; 




string str; 

getline(cin,str); 
getline(cin,str); 


return 0; 
} 

Все прошло нормально, проблема, которую я имею теперь часть 2. Где мы хотим «скопировать массив в другой и сдвинуть массив на N элементов ". Я не уверен, с чего начать на любом из них. Я посмотрел вверх несколько ресурсов на копирование массива, но я не был уверен, как реализовать их в текущем коде, который я закончил, особенно когда речь заходит о переносе. Если у кого-то есть мысли, идеи или ресурсы, которые могут помочь мне на правильном пути, мы будем очень благодарны. Я должен также указать, что я новичок (и это класс новичков), поэтому это задание может быть не «оптимальным», как это может быть сделано, а вместо этого включает в себя то, что мы узнали, если это имеет смысл.

+2

C++ есть [хороший набор algorightms] (http://en.cppreference.com/w/cpp/algorithm/rotate_copy), что вы можете использовать, например, ['std :: rotate_copy'] (http://en.cppreference.com/w/cpp/algorithm/rotate_copy), который, кажется, делает то, что вы хотите. –

ответ

1
for(int i = 0; i < n; ++i){ 
    int j = (i - k)%n; 
    b[i] = a[j]; 
} 

Проверьте его. Я не уверен, Если это работает, Вы могли бы улучшить его

for(int i = 0; i < n; ++i) 
    b[i] = a[(i - k)%n];//here can be (i +/- k) it depends which direction u would shift 
+0

Спасибо, это имеет смысл для меня и работает. Это был сдвиг, который меня отбрасывал, но оказалось, что это было намного проще, чем я себе представлял. – user2331891

0

Если вы хотите, чтобы скопировать массив в другой массив и перенести их

например: вход = 1, 2, 3, 4 , 5; выход = 3, 4, 5, 1, 2

громоздкое решение

//no template or unsafe void* since you are a beginner 

int* copy_to(int *begin, int *end, int *result) 
{ 
    while(begin != end){ 
    *result = *begin; 
    ++result; ++begin; 
    } 

    return result; 
} 

int main() 
{ 
    int input[] = {1, 2, 3, 4, 5}; 
    size_t const size = sizeof(input)/sizeof(int); 
    size_t const begin = 2; 
    int output[size] = {0}; //0, 0, 0, 0, 0 

    int *result = copy_to(input + begin, input + size - begin, output); //3, 4, 5, 0, 0 
    copy_to(input, input + begin, result); //3, 4, 5, 1, 2 

    return 0; 
} 

Как мог Сейнт алгоритмы задать нам помочь?

read_data остаются той же самой вы предоставили

#include <algorithm> //std::minmax_element, std::rotate_copy 
#include <iostream> 
#include <iterator> //for std::begin() 
#include <numeric> //for std::accumulate() 
#include <string> 
#include <vector> 

int main(int argc, char *argv[]) //don't use _tmain, they are unportable 
{ 

const int INPUT_CAPACITY = 100; 
double user_input[INPUT_CAPACITY]; 
int input_size = 0; 
double average = 0; 

cout << "Enter numbers. Input negative to quit.:\n"; 

read_data(user_input, INPUT_CAPACITY, input_size); 

auto const min_max = std::minmax_element (user_input, user_input + input_size); //only valid for c++11 

std::cout << "The maximum value entered was " << min_max.second << "\n"; 
std::cout << "The lowest value entered was " << min_max.first << "\n"; 

double sum_output = std::accumulate(user_input, user_input + input_size, 0); 
cout << "The sum of the value's entered is " << sum_output << "\n"; 

//I don't know the meaning of you count_value, why don't just output input_size? 
double count_output = count_value(user_input, input_size); 
cout << "You entered " << count_output << " numbers." << "\n"; 

cout << "The average of your numbers is " << sum_output/count_output << "\n"; 

int shift; 
std::cout<<"How many positions do you want to shift?"<<std::endl; 
std::cin>>shift; 
std::vector<int> shift_array(input_size); 
std::rotate_copy(user_input, user_input + shift, user_input + input_size, std::begin(shift_array)); 


//don't know what are they for? 
std::string str; 

std::getline(std::cin,str); 
std::getline(std::cin,str); 

return 0; 
} 

если ваш компилятор не поддерживает C++ 11 функции еще

станд :: minmax_element может заменить станд :: min_element и Std: : max_element станд :: начать() можно заменить shift_array.begin()

Я не знаю, что это стиль обучения вашего класса, по моему скромному мнению, новички должны старт с теми компонентами более высокого уровня, предоставляемыми C++, такими как вектор, строка, алгоритмы и т. д. Предположим, ваши преподаватели так вас учат, и вам разрешено использовать алгоритмы и контейнеры с C++ (давайте попросим, ​​чтобы ваш класс не обучая вас «c уроками» и скажите что-то вроде «ООП - лучшая вещь в мире»).

пс: Вы можете использовать вектор, чтобы заменить сырой массив, если вам нравится

+0

С вашей сменой (с установленными алгоритмами std), как я могу сделать вывод о сдвинутых элементах? Например, если пользователь вводит 1, 2, 3, 4, 5 и выбирает сдвиг 1, я хотел бы выводить новые числа после смены.Также я избавился от count_value и использовал input_size для того, чтобы поймать это. Getline в конце моего кода - это то, как он научил нас держать экран открытым, чтобы видеть результаты при отладке. – user2331891