Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

Подправить задачку. - C++

05.01.2012, 03:36. Просмотров 360. Ответов 4
Метки нет (Все метки)

Помогите, пожалуйста, у меня есть условие задачи:
дана последовательность упорядоченных по возрастанию чисел а1...а15, и число n не равное ни одному из этих чисел, такое что а1<n<а15. найти элемент последовательности (его порядковый номер и значение) ближайший к n.
И решение:
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
#include <cstdlib>
#include <iostream>
 
#define m 15
using namespace std;
class base
{
 public:
        int n,arr[m],k,temp;
        base()
        {
        k=0;
        temp=1000;
        arr[0]=5;// первый элемент    
        }      
        void func()
        {
        cout<<arr[0]<<" ";
        for(int i=1;i<m;i++)
                {
                arr[i]=arr[i-1]+5;//заполняем массив по порядку с шагом 5
                cout<<arr[i]<<" ";
                }
        cout<<endl<<"n=";
        cin>>n;
        for(int i=1;i<m;i++)
                if((n==arr[i])||(n<arr[0])||(n>arr[m-1]))// проверка n
                {
                cout<<"nevernoe n"<<endl;
                break;  //не равное ни одному элементу, меньше последнего, больлше первого                                          
                }  
                else 
                for(int i=1;i<m;i++)
                {
                if (temp>abs(arr[i]-n));//abs модуль х
                   {
                   temp=abs(arr[i]-n);
                   k=i;                        
                   }     
                }   
        cout<<"n blizhe vsego k elementu "<<k+1<<", ravnomy "<<arr[k]<<endl;
        }
};
int main()
{
    base b;
    b.func();
    system("PAUSE");
    return EXIT_SUCCESS;
}
Но он выводит мне все время номер последнего, 15 элемента, какое число ты не введешь. Не могли бы вы подправить код как надо?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.01.2012, 03:36
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Подправить задачку. (C++):

Решить задачку - C++
Когда встречаю эпсилон возникают проблемы, не пойму что это и как мудрить , знаю что надо использовать float и int все ) Умножить, сложить...

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

Задайте задачку) - C++
Всем доброго времени суток! Я новичок в С++ Не могу найти простого задачника по С++ Читаю Шилдт &quot;Полный справочник по С++&quot;(там...

посоветуйте задачку ) - C++
Доброго времени суток!) Посоветуйте какую нить задачку на лето) желательно что то бы понять все плюсы использования ООП. и еще было...

Исправить задачку - C++
Здравствуйте, уважаемые пользователи! Пожалуйста подкорректируйте решение. Задача такова: &quot;Получить все шестизначные счастливые номера....

Взгляните на задачку С++ - C++
С клавиатуры последовательно вводятся числа типа short. Составить программу, которая выводит сначала положительные числа в порядке их...

4
valeriikozlov
Эксперт С++
4676 / 2502 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
05.01.2012, 08:17 #2
Цитата Сообщение от Artole Посмотреть сообщение
Но он выводит мне все время номер последнего, 15 элемента, какое число ты не введешь. Не могли бы вы подправить код как надо?
У Вас одна ошибка которая влияет на результат:
- вот в этой строке:
Цитата Сообщение от Artole Посмотреть сообщение
if (temp>abs(arr[i]-n));//abs модуль х
уберите ;

Вторая ошибка (на данные вычисления не влияет, но если будете что-нибудь наращивать в коде, то может всплыть):
см комментарии:



Цитата Сообщение от Artole Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
for(int i=1;i<m;i++)// вот здесь начинается новый цикл
 if((n==arr[i])||(n<arr[0])||(n>arr[m-1]))// проверка n
 {
 cout<<"nevernoe n"<<endl;
 break; //не равное ни одному элементу, меньше последнего, больлше первого 
 } 
 else 
 for(int i=1;i<m;i++)// а здесь Вы снова делаете проверку в цикле, эту строчку можно просто убрать.
 {
 if (temp>abs(arr[i]-n));//abs модуль х
 {
 temp=abs(arr[i]-n);
 k=i; 
 } 
 }
1
Artole
0 / 0 / 0
Регистрация: 20.12.2011
Сообщений: 5
05.01.2012, 14:55  [ТС] #3
Огромное спасибо, все ошибки учту!
0
Gepar
1180 / 536 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
05.01.2012, 15:51 #4
Задача показалась интересной и я написал свой вариант решения
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#define SIZE 15
 
int main()
{
    int a[SIZE]={1,3,5,7,9,11,13,15,17,19,21,23,25,27,29};
    int *ptr=a;
    int x=10;
    if (x>=a[SIZE-1] || x<=a[0])//по предусловию
     return 1;
 
    for (int i=0;(i<SIZE-1) && (*ptr<x);i++,ptr++);
    int *temp=(ptr-1);
    if ((x-*temp)<*ptr-x)
     cout<<*temp;
    else
     cout<<*ptr;
}
Если число находиться по середине то отдаётся предпочтение большему элементу, проверку на то что число != ни одному элементу массива не делаю так как это постусловие как-бы да и если число будет равно какому-нибудь элементу массива то этот же элемент и выведется как самое близкое.

Добавлено через 2 минуты
От temp правда можно избавиться
C++
1
2
3
4
    if ((x-*(ptr-1))<*ptr-x)
     cout<<*(ptr-1);
    else
     cout<<*ptr;
1
Artole
0 / 0 / 0
Регистрация: 20.12.2011
Сообщений: 5
07.01.2012, 05:07  [ТС] #5
Спасибо, рассмотрю и такой вариант!
0
07.01.2012, 05:07
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.01.2012, 05:07
Привет! Вот еще темы с ответами:

ПОМОГИТЕ отредактировать задачку! - C++
Я полностью запутался! и уже не понимаю как правильно задан вопрос! вообще уже каша....... Поле шахматной доски определяется парой...

Помогите решать задачку в C++ - C++
Пожалуйста, помогите решать задачку. Разработать алгоритм и программу решений следующих задач: Описать функцию Fib(N) целого типа,...

С Pascal в С++ перевести задачку - C++
program zadanie_5; uses crt; const nn=15; var n, i, j, k, imax, jmax: integer; a: array of real; b:array of real;{массив...

Сделать простенькую задачку. - C++
Ввести матрицу размерностью M*N и вывести ее на экран (т.е.сделать возможность работы с матрицами различной размерности).


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

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

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