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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
ruspat
0 / 0 / 0
Регистрация: 23.09.2012
Сообщений: 24
#1

Найти ошибку. Одномерный массив - C++

04.11.2012, 22:58. Просмотров 500. Ответов 19
Метки нет (Все метки)

Программа должна находить три максимальных элемента массива, но вопреки моим ожиданиям она этого не делает, а вместо этого выводит три первых элемента. В чём ошибка?
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
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
 
int main()
{
    const int N=100;
    int a[N], i, n, m1, m2, m3, x;
    printf("enter dimensionality of the array: ");
    scanf("%d", &n);
    printf("enter elements of the array: ");
    for (i=0;i<n;i++)
        scanf("%d", &a[i]);
    m1=a[0];
    m2=a[1];
    m3=a[2];
    for (i=3;i<n;i++)
    {if (a[i]>m1 && a[i]<m2 && a[i]<m3) m1=a[i];
        if (a[i]>m2 && a[i]<m1 && a[i]<m3) m2=a[i];
        if (a[i]>m3 && a[i]<m1 && a[i]<m2) m3=a[i];}
    printf("max elements: %d,%d,%d",m1,m2,m3);
    getch();
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.11.2012, 22:58     Найти ошибку. Одномерный массив
Посмотрите здесь:

Не могу найти ошибку, одномерный массив - C++
// key.cpp: определяет точку входа для консольного приложения. // #include &lt;StdAfx.h&gt; #include &lt;iostream&gt; #include &lt;conio.h&gt; ...

Задача на одномерный массив. Найти ошибку - C++
#include &lt;fstream&gt; #include &lt;conio.h&gt; #include &lt;iostream&gt; using namespace std; int fak(int k) { return((k==1)?...

Найдите плз ошибку, Одномерный массив с указателями - C++
Если максимальный элемент находится левее минимального элемента, то упорядочить в порядке убывания элементы, находящиеся между максимальным...

Найти ошибку. Записать 20 целых чисел в массив. Переписать отрицательные в массив А, а положительные в Б - C++
Доброго времени суток. Записать 20 целых чисел в массив А. Переписать отрицательные из них подряд в массив В, а положительные - в массив C....

Одномерный массив, найти среднее значение - C++
помогите пожста. 2. Написать функцию, которая возвращает среднее значение элементов одномерного массива.

Одномерный массив. Найти количество палиндромов. - C++
Помогите написать программу...... Найти количество тех элементов массива, которые являются палиндромами (т.е. читаются одинаково слева...

Одномерный массив, как мне в нем найти - C++
Мне нужно найти: 1) Найти количество элементов, кратных 5 2) Найти сумму четных элементов массива, стоящих на нечетных...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
04.11.2012, 23:04     Найти ошибку. Одномерный массив #2
Логика ифов внутри цикла неверна
Простой пример 1 2 3 4
Здесь 4 не пройдет ни одно из ваших условий, хотя это максимум массива
ruspat
0 / 0 / 0
Регистрация: 23.09.2012
Сообщений: 24
04.11.2012, 23:16  [ТС]     Найти ошибку. Одномерный массив #3
А можно ли как-то пройти по массиву, пропустив какой-то один конкретный элемент?
John Prick
773 / 706 / 129
Регистрация: 27.07.2012
Сообщений: 2,022
Завершенные тесты: 3
04.11.2012, 23:19     Найти ошибку. Одномерный массив #4
Отсортируй массив и возьми столько максимальных, сколько тебе нужно. Кстати, что будет у тебя в программе, если число элементов в массиве будет 2?
I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
04.11.2012, 23:20     Найти ошибку. Одномерный массив #5
вполне, запоминайте индекс этого элемента
Например
C++
1
2
3
4
5
6
int index = 5;
for (int i = 0; i < size; ++i)
{
   if (i == index)continue;
   //...
}
Любителям оптимизации код явно не понравится
BumerangSP
4285 / 1407 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
04.11.2012, 23:22     Найти ошибку. Одномерный массив #6
Нуждается в тесте:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    m1=0;
    m2=1;
    m3=2;
    for (i=0;i<n;i++)
    {
     if (a[i]>a[m1] && i!=m2 && i!=m3) 
      m1=i;
    
     if (a[i]>a[m2] && i!=m1 && i!=m3) 
     m2=i;
   
     if (a[i]>a[m3] && i!=m1 && i!=m2) 
       m3=i;
    }
    printf("max elements: %d,%d,%d",a[m1],a[m2],a[m3]);
ruspat
0 / 0 / 0
Регистрация: 23.09.2012
Сообщений: 24
04.11.2012, 23:27  [ТС]     Найти ошибку. Одномерный массив #7
BumerangSP, с отрицательными элементами ведь не будет работать
BumerangSP
4285 / 1407 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
04.11.2012, 23:30     Найти ошибку. Одномерный массив #8
ruspat, да не, сработало)
http://liveworkspace.org/code/91dfea...dc7b711edba8fd
Мы ведь индекс элемента запоминаем, а не сам элемент.
I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
05.11.2012, 00:05     Найти ошибку. Одномерный массив #9
У меня так получилось. Но оптимальность под большим вопросом
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
#include <algorithm>
#include <array>
#include <iostream>
 
int main()
{
    std::array<int, 10> a = {5, 7, 1, 6, -3, 5, 42, 42, 0, 11};
 
    std::array<int, 3> result;
    std::copy(a.cbegin(), a.cbegin()+3, result.begin());
        
    for (int i = 3; i < a.size(); ++i)
    {
        auto it = std::min_element(result.begin(), result.end());
        if (a[i] > *it)
        {
            *it = a[i];
        }
    }
    std::sort(result.begin(), result.end());
    
    std::cout << result[0] << " " << result[1] << " " << result[2] << std::endl;
    system("pause");
    return 0;
}
ruspat
0 / 0 / 0
Регистрация: 23.09.2012
Сообщений: 24
05.11.2012, 00:14  [ТС]     Найти ошибку. Одномерный массив #10
Сделал вот так, но при вводе массива "2, 2, 1, 0, 1" выдаёт "2, 2, 2", что не есть правильно. Где ошибка на этот раз?
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
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
 
int main()
{
    const int N=100;
    int a[N], i, n, m1, m2, m3, x, y;
    printf("enter dimensionality of the array: ");
    scanf("%d", &n);
    printf("enter elements of the array: ");
    for (i=0;i<n;i++)
        scanf("%d", &a[i]);
    m1=a[0];
    m2=a[0];
    m3=a[0];
    for (i=0;i<n;i++)
        if (a[i]>m1) {m1=a[i]; x=i;}
    for (i=0;i<n;i++)
    {
        if (i==x) continue;
        if (a[i]>m2) {m2=a[i]; y=i;}
    }
    for (i=0;i<n;i++)
    {
        if (i==x) continue;
        if (i==y) continue;
        if (a[i]>m3) m3=a[i];
    }
    printf("maximum elements: %d,%d,%d",m1,m2,m3);
    getch();
    return 0;
}
valeriikozlov
Эксперт C++
4669 / 2495 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
05.11.2012, 00:17     Найти ошибку. Одномерный массив #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
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
 
int main()
{
    const int N=100;
    int a[N], i, n, m1, m2, m3, x;
    printf("enter dimensionality of the array: ");
    scanf("%d", &n);
    printf("enter elements of the array: ");
    for (i=0;i<n;i++)
        scanf("%d", &a[i]);
    m1=a[0];
    m2=a[1];
    m3=a[2];
    if(m1<m2) {x=m1; m1=m2; m2=x;}
    if(m1<m3) {x=m1; m1=m3; m3=x;}
    if(m2<m3) {x=m2; m2=m3; m3=x;}
    for (i=3;i<n;i++)
    {
        if(a[i]>m1)
        {
            m3=m2; m2=m1; m1=a[i];
        }
        else
        if(a[i]>m2)
        {
            m3=m2; m2=a[i];
        }
        else
        if(a[i]>m3)
            m3=a[i];
    }
    printf("max elements: %d,%d,%d",m1,m2,m3);
    getch();
    return 0;
}
I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
05.11.2012, 00:18     Найти ошибку. Одномерный массив #12
Цитата Сообщение от ruspat Посмотреть сообщение
m1=a[0];
m2=a[0];
m3=a[0];
тут
вы изначально присваиваете им максимальный элемент
BumerangSP
4285 / 1407 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
05.11.2012, 00:20     Найти ошибку. Одномерный массив #13
Потому что все три m указывают на наибольшее число, соответственно ни один из 3-х циклов не выполнится и они так и останутся все = 2. Чем Вам мой код не подошел
Kuzia domovenok
1889 / 1744 / 117
Регистрация: 25.03.2012
Сообщений: 5,922
Записей в блоге: 1
05.11.2012, 00:21     Найти ошибку. Одномерный массив #14
C++
1
2
3
m1=a[0];
    m2=a[0];
    m3=a[0];
у тебя он их и выдаёт, ничего не изменяя, т.к. a[0]=2 -максимальный элемент, и все сравнения не срабатывают
измени на, скажем
C++
1
2
3
4
m1=a[0];
m2=a[1];
m3=a[2];
for (i=3;i<n;i++){...}
ruspat
0 / 0 / 0
Регистрация: 23.09.2012
Сообщений: 24
05.11.2012, 00:26  [ТС]     Найти ошибку. Одномерный массив #15
valeriikozlov, если есть одинаковые максимальные элементы, Ваша программа учитывает только один из них, что по сути не правильно
valeriikozlov
Эксперт C++
4669 / 2495 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
05.11.2012, 00:29     Найти ошибку. Одномерный массив #16
Цитата Сообщение от ruspat Посмотреть сообщение
если есть одинаковые максимальные элементы, Ваша программа учитывает только один из них, что по сути не правильно
Если есть одинаковые максимальные элементы, то все эти одинаковые элементы учитываются.
Напишите что вводили и что выдала программа?
ruspat
0 / 0 / 0
Регистрация: 23.09.2012
Сообщений: 24
05.11.2012, 00:35  [ТС]     Найти ошибку. Одномерный массив #17
valeriikozlov, да, видимо я ошибся

Добавлено через 36 секунд
Такой код без ошибок? Кажется, работает, но не уверен.
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
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
 
int main()
{
    const int N=100;
    int a[N], i, n, m1, m2, m3, x, y;
    printf("enter dimensionality of the array: ");
    scanf("%d", &n);
    printf("enter elements of the array: ");
    for (i=0;i<n;i++)
        scanf("%d", &a[i]);
    m1=a[0];
    m2=a[1];
    m3=a[2];
    for (i=1;i<n;i++)
    for (i=2;i<n;i++)
        if (a[i]>m1) {m1=a[i]; x=i;}
    for (i=3;i<n;i++)
    {
        if (i==x) continue;
        if (a[i]>m2) {m2=a[i]; y=i;}
    }
    for (i=3;i<n;i++)
    {
        if (i==x) continue;
        if (i==y) continue;
        if (a[i]>m3) m3=a[i];
    }
    printf("maximum elements: %d,%d,%d",m1,m2,m3);
    getch();
    return 0;
}
valeriikozlov
Эксперт C++
4669 / 2495 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
05.11.2012, 00:38     Найти ошибку. Одномерный массив #18
Цитата Сообщение от ruspat Посмотреть сообщение
Кажется, работает, но не уверен.
я уверен )
см комментарии:
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
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
 
int main()
{
    const int N=100;
    int a[N], i, n, m1, m2, m3, x, y;// x и y не определены
    printf("enter dimensionality of the array: ");
    scanf("%d", &n);
    printf("enter elements of the array: ");
    for (i=0;i<n;i++)
        scanf("%d", &a[i]);
    m1=a[0];// считаем что m1 максимальное число
    m2=a[1];
    m3=a[2];
    for (i=1;i<n;i++)
    for (i=2;i<n;i++)
        if (a[i]>m1) {m1=a[i]; x=i;}// если окажется что a[0] было максимальным числом, то x останется неопределенным
    for (i=3;i<n;i++)
    {
        if (i==x) continue;// в этом цикле учитывается значение x которое неопределено, что не есть хорошо
        if (a[i]>m2) {m2=a[i]; y=i;}// тоже самое со значением y, которое будет учитываьтся в цикле ниже
    }
    for (i=3;i<n;i++)
    {
        if (i==x) continue;
        if (i==y) continue;
        if (a[i]>m3) m3=a[i];
    }
    printf("maximum elements: %d,%d,%d",m1,m2,m3);
    getch();
    return 0;
}
I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
05.11.2012, 00:39     Найти ошибку. Одномерный массив #19
17 - 18 строки. Что-то не то скопировали
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.11.2012, 00:42     Найти ошибку. Одномерный массив
Еще ссылки по теме:

Дан одномерный массив A[N]. Найти max(a2,a4,...a2*k)+min(a1,a3,...,a2*k+1 - C++
Дан одномерный массив A. Найти max(a2,a4,...a2*k)+min(a1,a3,...,a2*k+1=-O)

Дан одномерный массив . Найти минимум и максимум - C++
Дан одномерный массив . Найти минимум и максимум. Найти сумму чисел что стоят между минимумом и максимумом

Одномерный массив, найти минимальное и максимальное значение - C++
Помогите друзья очень прошу это задание на экзамен? Дан одномерный массив найти минимальное и максимальное значение?

Одномерный массив: найти элемент, сумму, перегруппировать - C++
В одномерном массиве из N вещественных элементов, вычислить: • количество элементов массива, меньших С; • сумму целых частей...

Преобразовать одномерный массив и найти в нем элемент - C++
Здравствуйте. Помогите пожалуйста в решении следующей задачи. В одномерном массиве состоящем из n вещественных элементов вычислить: ...


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

Или воспользуйтесь поиском по форуму:
ruspat
0 / 0 / 0
Регистрация: 23.09.2012
Сообщений: 24
05.11.2012, 00:42  [ТС]     Найти ошибку. Одномерный массив #20
I.M., да, действительно, 17-ая лишняя)
Yandex
Объявления
05.11.2012, 00:42     Найти ошибку. Одномерный массив
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru