Форум программистов, компьютерный форум CyberForum.ru

не работает функция, не могу найти причину - C++

Восстановить пароль Регистрация
 
h_wolf
 Аватар для h_wolf
9 / 9 / 1
Регистрация: 24.01.2013
Сообщений: 211
13.09.2013, 16:14     не работает функция, не могу найти причину #1
Всех с праздником!

Задача:

Необходимо написать программу состоящую из нескольких функция - принимающая данные в массив, выводящая на экран массив и функция реверса(поменять порядок элементов массива наоборот не трогая при этом первый и последний эелемнт).
Важно: Максимальный размер массива 10ть элементов, но пользователь должен иметь возможность прекратить ввод раньше, в этом случае работать только с введенными элементами массива(тут кстати тоже непонятки, где-то туплю - в массив пишется 10ть элементов, но ввести можно 11ть. не пойму почему)

Код:

Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <iostream>
 
using namespace std;
 
int Fill_array(double, int);
void Show_array(double, int);
void Revers_array(double, int);
 
const int ArrSize=10;
 
int main()
{
    setlocale(LC_CTYPE, "");
 
    double Arr[ArrSize]={};
    int Count=0;
    cout<<"Заполните массив double значениями: ";
    Count=Fill_array(Arr, ArrSize); //получаем действительно количество элементов в массиве
    cout<<"Всего значений внесено: "<<Count<<endl;
    cout<<"Массив до реверса:\t";
    Show_array(Arr, Count);
    Revers_array(Arr, Count);
    cout<<"Массив после реверса:\t";
    Show_array(Arr, Count);
 
    return 0;
}
 
int Fill_array(double arr[], int as)
{
    int counter=0;
    int i=0;
    while((cin>>arr[i]) && (counter<as))
    {
        i++;
        counter++;
    }
    return counter;
}
 
void Show_array(double arr[], int counter)
{
    for(int i=0; i<counter; i++)
        cout<<arr[i]<<"\t";
    cout<<endl;
}
 
void Revers_array(double arr[], int counter)        //вот эта функция не работает. Элементы местами не меняются.
{
    double tmp;
 
    for(int i=1, b=counter-1; i>counter; i++, b--)
    {
        tmp=arr[b];
        arr[b]=arr[i];
        arr[i]=tmp;
    }
}


Конкретизирую вопросы:
  1. Почему не работает функция Reverse_array?
  2. почему вводится программа ожидает ввода 11 значений а не 10?

Добавление: Ошибка где-то в условии цикла for ф-и Revers_array, только вот как его правильно записать...

Добавлено через 4 минуты
Так-с, с первым вопросом разобрался.

Вот так это должно быть:

Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
void Revers_array(double* arr, int counter)
{
    double tmp;
 
    for(int i=1, b=counter-2; i<b; i++, b--)
    {
        tmp=arr[b];
        arr[b]=arr[i];
        arr[i]=tmp;
 
    }
}


В силе остается второй вопрос...

Добавлено через 28 минут
В общем всем спасибо, сам все отловил.

Вот полностью рабочий код. Если у кого-то есть замечания - буду рад адекватной критике.

Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <iostream>
 
using namespace std;
 
int Fill_array(double*, int);
void Show_array(double*, int);
void Revers_array(double*, int);
 
const int ArrSize=10;
 
int main()
{
    setlocale(LC_CTYPE, "");
 
    double Arr[ArrSize]={};
    int Count=0;
    cout<<"Заполните массив double значениями: ";
    Count=Fill_array(Arr, ArrSize); //получаем действительно количество элементов в массиве
    cout<<"Всего значений внесено: "<<Count<<endl;
    cout<<"Массив до реверса:\t";
    Show_array(Arr, Count);
    Revers_array(Arr, Count);
    cout<<"Массив после реверса:\t";
    Show_array(Arr, Count);
 
    return 0;
}
 
int Fill_array(double* arr, int as)
{
    int counter=1;
    int i=0;
    while((cin>>arr[i]) && (counter<as))
    {
        i++;
        counter++;
    }
    return counter;
}
 
void Show_array(double* arr, int counter)
{
    for(int i=0; i<counter; i++)
        cout<<arr[i]<<"\t";
    cout<<endl;
}
 
void Revers_array(double* arr, int counter)
{
    double tmp;
 
    for(int i=1, b=counter-2; i<b; i++, b--)
    {
        tmp=arr[b];
        arr[b]=arr[i];
        arr[i]=tmp;
 
    }
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.09.2013, 16:14     не работает функция, не могу найти причину
Посмотрите здесь:

Не правильно работает программа, не могу найти ошибку. C++
найти причину вылета программы C++
Функция,возращающая абсолютную величину числа( не могу найти ошибку) C++
C++ Учу классы. Не запускается простейшая прога.Не могу понять причину
не работет программа или функция, не могу найти ошибку, ругается не неправильные указатели C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nikitko_Cent
128 / 98 / 8
Регистрация: 27.10.2011
Сообщений: 629
Завершенные тесты: 2
13.09.2013, 16:16     не работает функция, не могу найти причину #2
Сорри, не заметил что ТС своими силами решил проблемы..
h_wolf
 Аватар для h_wolf
9 / 9 / 1
Регистрация: 24.01.2013
Сообщений: 211
13.09.2013, 16:19  [ТС]     не работает функция, не могу найти причину #3
Цитата Сообщение от Nikitko_Cent Посмотреть сообщение
поменять местами условия,
Однако, шаманство помогло =)
Спасибо.

Добавлено через 43 секунды
Nikitko_Cent, так или иначе, Ваш способ тоже оказался верным.
Nikitko_Cent
128 / 98 / 8
Регистрация: 27.10.2011
Сообщений: 629
Завершенные тесты: 2
13.09.2013, 16:20     не работает функция, не могу найти причину #4
Цитата Сообщение от h_wolf Посмотреть сообщение
Однако, шаманство помогло =)
Спасибо.
Логически все просто - программа в составном условии сначало проверяет первое, затем второе. Поэтому нужно было сначало проверять выход за пределы допустимых значений, а потом предоставлять пользователю ввод.

Никакой магии
h_wolf
 Аватар для h_wolf
9 / 9 / 1
Регистрация: 24.01.2013
Сообщений: 211
13.09.2013, 16:21  [ТС]     не работает функция, не могу найти причину #5
Nikitko_Cent, верю, но сам бы наверное не придал этому значения.
Nikitko_Cent
128 / 98 / 8
Регистрация: 27.10.2011
Сообщений: 629
Завершенные тесты: 2
13.09.2013, 16:23     не работает функция, не могу найти причину #6
И еще, зачем в этом цикле ты используешь две переменные? Достаточно убрать, например count, а из функции возвращать значение i

Добавлено через 47 секунд
Точнее I+1
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 5
Завершенные тесты: 1
13.09.2013, 16:25     не работает функция, не могу найти причину #7
почему вводится программа ожидает ввода 11 значений а не 10?
Да потому, что батенька условия проверяются слева на право, а не наоборот. И прежде чем проверить счетчик программы ждет когда завершится проверка первого условия. Попробуйте так:
C++
1
    while((counter<as) && (cin>>arr[i]))
P.S. На кой ляд вам две одинаковые переменные counter и i? Разве нельзя обойтись одной

Ой не заметил, что ответ уже дали
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.09.2013, 16:40     не работает функция, не могу найти причину
Еще ссылки по теме:

Не могу найти ошибку, работает не правильно C++
Как работает эта функция? Не могу никак разобраться! C++
C++ Помогите найти причину ошибок в коде

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
h_wolf
 Аватар для h_wolf
9 / 9 / 1
Регистрация: 24.01.2013
Сообщений: 211
13.09.2013, 16:40  [ТС]     не работает функция, не могу найти причину #8
Ilot, Nikitko_Cent, и действительно зачем...
Yandex
Объявления
13.09.2013, 16:40     не работает функция, не могу найти причину
Ответ Создать тему
Опции темы

Текущее время: 02:40. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru