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

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

Восстановить пароль Регистрация
 
Artole
0 / 0 / 0
Регистрация: 20.12.2011
Сообщений: 5
05.01.2012, 03:36     Подправить задачку. #1
Помогите, пожалуйста, у меня есть условие задачи:
дана последовательность упорядоченных по возрастанию чисел а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 элемента, какое число ты не введешь. Не могли бы вы подправить код как надо?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.01.2012, 03:36     Подправить задачку.
Посмотрите здесь:

C++ ПОМОГИТЕ отредактировать задачку!
Взгляните на задачку С++ C++
C++ Помогите решить задачку
Решить задачку C++
C++ посоветуйте задачку )
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 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; 
 } 
 }
Artole
0 / 0 / 0
Регистрация: 20.12.2011
Сообщений: 5
05.01.2012, 14:55  [ТС]     Подправить задачку. #3
Огромное спасибо, все ошибки учту!
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,511
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;
Artole
0 / 0 / 0
Регистрация: 20.12.2011
Сообщений: 5
07.01.2012, 05:07  [ТС]     Подправить задачку. #5
Спасибо, рассмотрю и такой вариант!
Yandex
Объявления
07.01.2012, 05:07     Подправить задачку.
Ответ Создать тему
Опции темы

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