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

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

Восстановить пароль Регистрация
 
ruspat
0 / 0 / 0
Регистрация: 23.09.2012
Сообщений: 24
04.11.2012, 22:58     Найти ошибку. Одномерный массив #1
Программа должна находить три максимальных элемента массива, но вопреки моим ожиданиям она этого не делает, а вместо этого выводит три первых элемента. В чём ошибка?
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++ Дан одномерный массив, состоящий из N вещественных элементов. 4.1. Заполнить массив случайными числами. 4.2. Найти минимальный положительный элемент.
C++ Не могу найти ошибку, одномерный массив
Одномерный массив. Найти наименьшие среди элементов первого массива, которые не входят во второй массив. C++
Одномерный массив. Найти количество палиндромов. C++
Найдите плз ошибку, Одномерный массив с указателями C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
I.M.
 Аватар для 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
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
04.11.2012, 23:19     Найти ошибку. Одномерный массив #4
Отсортируй массив и возьми столько максимальных, сколько тебе нужно. Кстати, что будет у тебя в программе, если число элементов в массиве будет 2?
I.M.
 Аватар для 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
 Аватар для BumerangSP
4283 / 1405 / 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
 Аватар для BumerangSP
4283 / 1405 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
04.11.2012, 23:30     Найти ошибку. Одномерный массив #8
ruspat, да не, сработало)
http://liveworkspace.org/code/91dfea...dc7b711edba8fd
Мы ведь индекс элемента запоминаем, а не сам элемент.
I.M.
 Аватар для 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++
 Аватар для valeriikozlov
4660 / 2486 / 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.
 Аватар для 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
 Аватар для BumerangSP
4283 / 1405 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
05.11.2012, 00:20     Найти ошибку. Одномерный массив #13
Потому что все три m указывают на наибольшее число, соответственно ни один из 3-х циклов не выполнится и они так и останутся все = 2. Чем Вам мой код не подошел
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 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++
 Аватар для valeriikozlov
4660 / 2486 / 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++
 Аватар для valeriikozlov
4660 / 2486 / 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.
 Аватар для 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     Найти ошибку. Одномерный массив
Еще ссылки по теме:

Массив: найти номера столбцов с положительными элементами и записать их в одномерный массив C++
C++ Найти ошибку. Записать 20 целых чисел в массив. Переписать отрицательные в массив А, а положительные в Б
C++ Одномерный массив (Ввести массив из 10 вещественных чисел.Найти сумму чисел,стоящих на чётных местах)

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

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

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