Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
ruspat
0 / 0 / 0
Регистрация: 23.09.2012
Сообщений: 24
#1

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

04.11.2012, 22:58. Просмотров 552. Ответов 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;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.11.2012, 22:58
Ответы с готовыми решениями:

Задача на одномерный массив. Найти ошибку
#include &lt;fstream&gt; #include &lt;conio.h&gt; #include &lt;iostream&gt; using namespace...

Не могу найти ошибку, одномерный массив
// key.cpp: определяет точку входа для консольного приложения. // #include...

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

Массив: найти номера столбцов с положительными элементами и записать их в одномерный массив
ввести двумерный массив I . найти номера столбцов с положительными элементами и...

Организовать одномерный массив с вещественными числами и найти первый и последний отрицательный элемент массив
Организовать одномерный массив с вещественными числами и найти первый и...

19
I.M.
567 / 550 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
04.11.2012, 23:04 #2
Логика ифов внутри цикла неверна
Простой пример 1 2 3 4
Здесь 4 не пройдет ни одно из ваших условий, хотя это максимум массива
1
ruspat
0 / 0 / 0
Регистрация: 23.09.2012
Сообщений: 24
04.11.2012, 23:16  [ТС] #3
А можно ли как-то пройти по массиву, пропустив какой-то один конкретный элемент?
0
John Prick
831 / 764 / 256
Регистрация: 27.07.2012
Сообщений: 2,176
Завершенные тесты: 3
04.11.2012, 23:19 #4
Отсортируй массив и возьми столько максимальных, сколько тебе нужно. Кстати, что будет у тебя в программе, если число элементов в массиве будет 2?
1
I.M.
567 / 550 / 47
Регистрация: 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;
   //...
}
Любителям оптимизации код явно не понравится
1
BumerangSP
4287 / 1409 / 463
Регистрация: 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]);
1
ruspat
0 / 0 / 0
Регистрация: 23.09.2012
Сообщений: 24
04.11.2012, 23:27  [ТС] #7
BumerangSP, с отрицательными элементами ведь не будет работать
0
BumerangSP
4287 / 1409 / 463
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
04.11.2012, 23:30 #8
ruspat, да не, сработало)
http://liveworkspace.org/code/91dfeae26558462409dc7b711edba8fd
Мы ведь индекс элемента запоминаем, а не сам элемент.
1
I.M.
567 / 550 / 47
Регистрация: 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;
}
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;
}
0
valeriikozlov
Эксперт С++
4683 / 2509 / 751
Регистрация: 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;
}
1
I.M.
567 / 550 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
05.11.2012, 00:18 #12
Цитата Сообщение от ruspat Посмотреть сообщение
m1=a[0];
m2=a[0];
m3=a[0];
тут
вы изначально присваиваете им максимальный элемент
1
BumerangSP
4287 / 1409 / 463
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
05.11.2012, 00:20 #13
Потому что все три m указывают на наибольшее число, соответственно ни один из 3-х циклов не выполнится и они так и останутся все = 2. Чем Вам мой код не подошел
1
Kuzia domovenok
2261 / 2030 / 459
Регистрация: 25.03.2012
Сообщений: 7,173
Записей в блоге: 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++){...}
1
ruspat
0 / 0 / 0
Регистрация: 23.09.2012
Сообщений: 24
05.11.2012, 00:26  [ТС] #15
valeriikozlov, если есть одинаковые максимальные элементы, Ваша программа учитывает только один из них, что по сути не правильно
0
valeriikozlov
Эксперт С++
4683 / 2509 / 751
Регистрация: 18.08.2009
Сообщений: 4,550
05.11.2012, 00:29 #16
Цитата Сообщение от ruspat Посмотреть сообщение
если есть одинаковые максимальные элементы, Ваша программа учитывает только один из них, что по сути не правильно
Если есть одинаковые максимальные элементы, то все эти одинаковые элементы учитываются.
Напишите что вводили и что выдала программа?
1
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;
}
0
valeriikozlov
Эксперт С++
4683 / 2509 / 751
Регистрация: 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;
}
1
I.M.
567 / 550 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
05.11.2012, 00:39 #19
17 - 18 строки. Что-то не то скопировали
1
ruspat
0 / 0 / 0
Регистрация: 23.09.2012
Сообщений: 24
05.11.2012, 00:42  [ТС] #20
I.M., да, действительно, 17-ая лишняя)
0
05.11.2012, 00:42
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.11.2012, 00:42

Одномерный массив. Найти наименьшие среди элементов первого массива, которые не входят во второй массив.
Задано два массива. Найти наименьшие среди элементов первого массива, которые...

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

Матрица и одномерный массив (Составить одномерный массив, содержащий количество буквенных символов в каждом из ее столбцов, подсчет символов)
Помогите решить задачку: Дана матрица 5х7, элементами которой являются...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

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