Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.11.2014, 23:40   #1
BaTpyXaaa
Пользователь
 
Регистрация: 06.11.2013
Сообщений: 40
По умолчанию Поиск методом аппроксимации

Добрый вечер. Помогите с заданием.

Необходимо отсортировать массив.
выполнить поиск заданного ключа в полученном (отсортированом) массиве методом аппроксимации.
Масив отсортировал. Поиском проблема. Не знаюв чем проблема, может быть некорректно перевел.




Код:
#include<iostream>
#include <math.h>
using namespace std;
 
 
int show (int *Mas,int n)
 
{
    for (int i=0;i<n;i++)
    {
    cout<<Mas[i]<<" ";
    }
 
    return *Mas;
}
int mass(int *Mas,int n)
{
    for (int i=0;i<n;i++)
    {
        Mas[i]=rand()%10;       
    }
    return *Mas;
}
 
int Sort(int *Mas,int n)
{
    for(int i=0; i<n-1; i++) 
    {
        for(int j=n-1; j>i; j--) 
        {
    if(Mas[j]<Mas[j-1]) 
            {
    int temp = Mas[j];
    Mas[j] = Mas[j-1];
    Mas[j-1] = temp;
            }
        }
    }
return *Mas;
}
 
void srch(int Mas[],int n,int key)
{
    if ((key<Mas[1]) || (key>Mas[n]))
        {
        cout<<"Netu  "<<endl;
        }
    else
    {
int i= (abs(ceil((n/(Mas[n]-Mas[1]+1))*(key-Mas[1])+1 )));
 
    do
        {
         i=i+1;
        }
    while (Mas[n]<key);
 
    do
    {
    i=i-1;
    }
    while (Mas[n]>key);
 
if (Mas[i]=key)
{
    cout<<"Idesk elementa:  "<< i << endl;
}
 else
{ 
    cout<<"Netu elementa:  " << endl;       
}
}
}
 
int main() 
 
{   
int n;
cin>>n;
int *Mas= new int [n];
mass(Mas,n);
show(Mas,n);
Sort(Mas,n);
srch(Mas,n,2);
system("Pause");
}
Пример поиска брал с Pascal

Код:
if (x<a[1]) or (x>a[n]) then writeline ("Net")
else begin 
i:=abs(round(n/(a[n]-a[1]+1))*(x-a[1])+1)
while a[i]<x do i:=i+1;
while a[i]>x do i:=i-1;
if a[i]=x then writelen ('Indeks',i);
else writeline('Netu');
end;
BaTpyXaaa вне форума Ответить с цитированием
Старый 08.11.2014, 00:34   #2
abit
Пользователь
 
Регистрация: 21.10.2014
Сообщений: 43
По умолчанию

Странно, что никто Вам не ответил, да вот я не по ленился...
итак, с первой строчкой встречаем
Код:
#include<iostream>
отлично C++ нас ждёт и дальше вижу
Код:
#include <math.h>
ой, жаль, должно быть <cmath>, кстати зачем он тут?

тут я уже теряю надежду на C++, но третья строка
Код:
using namespace std;
говорит таки о C++, хватит это терпеть!
давайте по поряду, если речь идёт именно о C++, во первых...
четвёртая строка "int show (int *Mas,int n)" это не просто устаревший C++ это чистый Си, давайте делать всё таки в C++, проходится по строкам дальше не вижу вообще никакого смысла, там всё ясно... лучше расскажу основные приницпы как это должно выглядеть и что тут не так:
1) если глядеть на "int show (int *Mas,int n)" сразу заметно, что эта функция только показывает что-то, не надо int* Mas, лучше const int& Mas, а ещё лучше перегрузить friend оператор << для iostream
2) int Sort(int *Mas,int n) - не нужно, есть std::sort
3) по причине выше спускаюсь вниз и говорю сходу int *Mas= new int [n]; - рудимент, избавьте себя от этого, сейчас в C++ new/delete не в почёте, кстати а где вообще у вас delete? утечку памяти делаем? во первых есть std::vector для вашей задачи и уж совсем идеально std::map
4) пока внизу программы смотрю на код якобы "брал с Pascal", вижу " writeline", да это помойму Вас обманули, похоже на Visual Basic, а не Паскаль
5) по поводу самого метода поиска - решаемо в пару строчек в std::map (в варианте самобалансирующихся бинарных деревьев) но если вам нужно по отсортированному массиву это провернуть самостоятельно, то поясните что это вообще такое, я никогда не слышал про "поиск методом аппроксимации", к своему стыду, и гугл мне ничем помочь не смог, исходя из кода, который вы тут написали на якобы Паскале я делаю вывод что речь идёт о бинарном поиске, который замусолен где только возможно

Последний раз редактировалось abit; 08.11.2014 в 00:50.
abit вне форума Ответить с цитированием
Старый 08.11.2014, 13:29   #3
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

BaTpyXaaa, вот здесь пример, как на практике сортируют: http://www.cplusplus.com/reference/algorithm/sort/

abit, проблема в том, что это преподаватели (далёкие от реалей) загоняют студентов в рамки: нельзя использовать контейнеры, нельзя использовать стандартные способы сортировки и т.д.
8Observer8 вне форума Ответить с цитированием
Старый 08.11.2014, 14:03   #4
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
сейчас в C++ new/delete не в почёте, кстати а где вообще у вас delete?
shared_ptr и т.п. уж тогда
Цитата:
ой, жаль, должно быть <cmath>, кстати зачем он тут?
почему должно? - наверняка я чего-то не знаю, но мне кажется, что cmath от math отличается тем, что заворачивает имена в пространство std. Но если прямо следом ты пишешь using namespace - то имена все равно попадают в глобальную область видимости и профита от cmath нет (по крайней мере я не вижу).
Цитата:
это не просто устаревший C++ это чистый Си
Чем отличается Си от С++? Ответь развернуто и сам, а не ссылкой, пожалсто. Как ты это понимаешь?
rrrFer вне форума Ответить с цитированием
Старый 08.11.2014, 21:31   #5
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Цитата:
Сообщение от rrrFer Посмотреть сообщение
shared_ptr и т.п. уж тогда
Он написал, что int *Mas= new int [n] надо заменить на std::vector

Цитата:
Сообщение от rrrFer Посмотреть сообщение
почему должно? - наверняка я чего-то не знаю, но мне кажется, что cmath от math отличается тем, что заворачивает имена в пространство std. Но если прямо следом ты пишешь using namespace - то имена все равно попадают в глобальную область видимости и профита от cmath нет (по крайней мере я не вижу).
Правильно писать cmath. Буковка c говорит, что это сишная библиотека

Цитата:
Сообщение от rrrFer Посмотреть сообщение
Чем отличается Си от С++? Ответь развернуто и сам, а не ссылкой, пожалсто. Как ты это понимаешь?
Странный вопрос. Ему придётся книгу писать с названием "Чем отличается Си от С++"

Последний раз редактировалось 8Observer8; 08.11.2014 в 21:36.
8Observer8 вне форума Ответить с цитированием
Старый 09.11.2014, 04:45   #6
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
должно быть <cmath>
Цитата:
Правильно писать cmath. Буковка c говорит, что это сишная библиотека
Вы оба упороты. Что значит "правильно"?
math.h - это не "сишная библиотека"?
Я написал о чем говорит буква "c", и в чем разница, прочитай внимательней.
Цитата:
Странный вопрос. Ему придётся книгу писать с названием "Чем отличается Си от С++"
Если не знаешь "разницы", то начнешь писать книгу.

Последний раз редактировалось rrrFer; 09.11.2014 в 04:55.
rrrFer вне форума Ответить с цитированием
Старый 09.11.2014, 08:52   #7
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Какой смысл писать "math.h"?

Цитата:
Чем отличается Си от С++
Тогда корректнее написать "Чем отличается Си11 от С++14". Сравнить можно по количеству кода, который потребуется для решения стандартных задач
8Observer8 вне форума Ответить с цитированием
Старый 09.11.2014, 09:39   #8
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
Тогда корректнее написать "Чем отличается Си11 от С++14". Сравнить можно по количеству кода, который потребуется для решения стандартных задач
Почему ты думаешь, что это корректнее? - ты безпардонно влез в диалог и не вник в контекст.
abit ничего не писал про Си11 и С++14, он писал про С++ и Си. Я задал ему вопрос именно по этой теме. Причем тут твои "корректировки"? - обоснуй что это будет корректнее, если уж на то пошло.

Цитата:
Какой смысл писать "math.h"?
это я у тебя спрашиваю. Я не говорил что "должно быть math.h" и "правильно писать math.h". Если вы утверждаете обратное и учите тут как правильно - подкрепите это какими-то фактами и аргументами.

Цитата:
Сравнить можно по количеству кода, который потребуется для решения стандартных задач
Нет такого понятия "стандартная задача". По количеству кода сравнивать вообще ничего нельзя. Это самая унылая метрика, это всем известно.

Последний раз редактировалось rrrFer; 09.11.2014 в 09:41.
rrrFer вне форума Ответить с цитированием
Старый 09.11.2014, 10:08   #9
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Тут нечего обсуджать.

Просто писать:
Код:
#include <cmath>
#include <cstdlib>
Вместо сишных заголовков:
Код:
#include <math.h>
#include <stdlib.h>
Никогда не использовать using std namespace. Только для коротких примеров и то лучше не привыкать, а писать std::cout и т.д.

Использовать стандарные решения из стандартной библиотеки (STL) и новые возможности из C++11 и C++14

Последний раз редактировалось 8Observer8; 09.11.2014 в 11:35.
8Observer8 вне форума Ответить с цитированием
Старый 09.11.2014, 10:29   #10
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
Тут нечего обсуджать.
Просто писать:
Ягода того же поля, что и "правильно писать" и "должно быть".

У меня все тот же вопрос - "почему"?
math.h не работает? Оно чем-то хуже? Оно менее стандартное?
Ну? - какие аргументы то?

Никого не хочу обидеть, но в 90х годах в ходе был термин "быдло". Быдло - это скот, который не имеет своего мнения, идет туда, куда скажет пастух. Не пытается спорить и задавать вопросы.

Дети в начальной школе - тоже своего рода "быдло" если не спрашивают "почему?". КОгда я учился в школе, мне постоянно было что-то не понятно и один товарищ постоянно ржал на эту тему xD. Ему все было понятно - "почему? - потому что учитель сказал так".

Дак вот чуть более старшим детям, которые по прежнему не задают вопросов (хотя бы самим себе), таки говорят что-то типа "если тебе скажут с крыши прыгнуть - прыгнешь?".

В 90х быдлом называли некоторых коммунистов и что-то в этом есть. Стадные чувства и бездействие при виде абсурда в совке присутствовали. Но в совке при этом валили на партию и т.п., которые принимали решение, т.е. хотя бы ссылались на авторитет.

А вот вы оба не только не пытаетесь задать себе вопрос "почему?", но и на авторитет сослаться не можете, но еще и учите окружающих. Заметь, что даже школьник говоря "так сказала марья ивановна" - ссылается на хоть какого-то хлипкого авторитета. А ты на что ссылаешься?

И вот ты - чувак с высшим образованием и вообще айтишник, меня чето пугает что ты так и не начал задавать вопросы типа "нахера мне прыгать с крыши, когда мне и на крыше хорошо?".

Дак вот ты мне гришь "пиши cmath", а я задаю более чем законный вопрос "нахера, если мне и с math.h хорошо?" - ты не можешь ответить ничего кроме того что "так надо". Как по мне - нефиг учить если не можешь объяснить нафига остальным следовать твоим советам.

Последний раз редактировалось rrrFer; 09.11.2014 в 10:35.
rrrFer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск методом Хоара Sashka_BezDelnik Общие вопросы C/C++ 0 06.10.2014 13:40
ошибка аппроксимации maxick96 Visual C++ 0 17.11.2013 22:41
Написать программу на языке VFP для аппроксимации методом наименьших квадратов austyuzhin Помощь студентам 0 31.05.2013 17:11
VBA: Одномерный поиск оптимума функции методом поиска с использованием квадратичной аппроксимации Potemkin Помощь студентам 1 29.09.2010 22:28
Метод аппроксимации Фогеля Unever Помощь студентам 2 19.12.2009 18:01