Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> программа работает неверно 
:(
    Опции темы
werywery
Дата 4.12.2009, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 29.10.2009

Репутация: нет
Всего: нет



Здравствуйте! 
помогите пожалуйста разобраться с программой....
Код
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
//---------------------------------------------------------------------------
#include <iostream.h>
#pragma hdrstop
#include<stdio.h>
#include<conio.h>
#include<math.h>
#include<stdlib.h>
#include<time.h>
#pragma argsused

int const m=45;   //количество элементов
int n=1000;
int const g=2;
int const t=m*g;   //размер таблицы
int tab[t];        //таблица
int a[m];         //элементы
int a0=0;          //позиция в таблице
int k;          //сгенерированный элемент
int i,j;
int p=0,l=0;   //p-счетчик позиций(сколько ячеек в таблице заполнилось)
int a1=0; 
float kof=0;
float scs=0;

int main()
{
    for(i=0;i<t;i++){
        tab[i]=-1;
    }

    //генератор чисел

printf("--------------------------------------\n");
printf("|            massiv                  |\n");
printf("--------------------------------------\n");
    void random_all();
      for(i=0;i<m;i++)
          {
       x: k=((random(9)+1)*1000+random(999));
        for(j=0;j<i;j++){
            if(a[i]==k)
                goto x;
                
        }
                a[i]=k;
                cout<<a[i];   //выводим элементы
                l++;
                if(l==1){
                    cout<<" ";
                    l=0;
                }
    }
getch();


   // заполнение таблицы
    for(i=0;i<m;i++){  //for1               находим позицию
        a0=(a[i]/11)%t;
        a1=a0;
        scs++;
        //printf("\n%d",a0);
        if(tab[a0]==-1){        //если свободно
           tab[a0]=a[i];
           p++;
        }
        else {  //else1               //если занято(устранение коллизии)
            j=1; 
            while(tab[a0]!=-1){  //while1              
               a0=(a1+j*j)%t;
               scs++;
               if(tab[a0]!=-1)
                   j++;
               else{
                   tab[a0]=a[i];

                   p++;
                   break;
               }
            }
        }
    }


//p - счетчик позиций


    //выводим таблицу

        printf("\n--------------------------------------\n");
        printf("|            tablica                  |\n");
        printf("--------------------------------------\n");
    for(i=0;i<m;i++)
            if(tab[i]!=-1){
            cout<<"|"<<i<<"|"<<tab[i]<<" ";
                               }
    
        kof= m/t;
    printf("\n\nkof=%f",kof);
    scs+=m;
    scs=scs/m;
    printf("\n\nscs=%f",scs);

getch();

 }


Проблема в общем такая: когда таблица выводится на экран то почему то, во первых нумерация (i), начинается не с нуля а с единицы..... и каждый -1 элемент(не понятно как он получается ваще) в связи с if(tab[i]!=-1){ не выводится на экран..... то есть получается нумерация вот такая:
1 [значения]
3 ..........
5 ..........
7 ..........
и после четырех элементов пронумерованных неверно идут элементы пронумерованные правильно..... 
и еще коэффициент заполнения считается неверным...... он не может быть равным 0..... и быть больше 1...
Помогите кто чем может...... 
Буду благодарен за любые подсказки..
Зарание спасибо!!! 

Это сообщение отредактировал(а) werywery - 4.12.2009, 14:52
PM MAIL   Вверх
Albor
Дата 4.12.2009, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 2
Всего: 9



Это шедевр
Код

 cout<<a[i];   //выводим элементы
                l++;
                if(l==1){
                    cout<<" ";
                    l=0;
                }


Так было не проще?
Код

 cout<<a[i]<<" ";   

PM MAIL ICQ   Вверх
werywery
Дата 4.12.2009, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 29.10.2009

Репутация: нет
Всего: нет



Цитата(Albor @ 4.12.2009,  15:29)
Это шедевр
Код

 cout<<a[i];   //выводим элементы
                l++;
                if(l==1){
                    cout<<" ";
                    l=0;
                }


Так было не проще?
Код

 cout<<a[i]<<" ";   

проще..... но вопрос то другой....
сам сгенерированный массив то выводится нормально, а вот таблица косячно..... Как исправить? подскажите пожалста
PM MAIL   Вверх
Albor
Дата 4.12.2009, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 2
Всего: 9



Цитата(werywery @  4.12.2009,  14:49 Найти цитируемый пост)
Проблема в общем такая: когда таблица выводится на экран то почему то, во первых нумерация (i), начинается не с нуля а с единицы..... 

Значит tab[0] всегда остаётся равным -1, то есть не заполняется. Алгоритм заполнения таблицы довольно мудрёный и сходу тяжело что либо сказать, но по условию при печати таблицы видно, что те элементы, которые ты не видишь равны -1, то есть при заполнении таблицы эти ячейки пропускаются.

Добавлено через 5 минут и 9 секунд
Вот ещё
Код

kof= m/t;

и m, и t константы. Зачем каждый раз вычислять константное значение?
PM MAIL ICQ   Вверх
werywery
Дата 4.12.2009, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 29.10.2009

Репутация: нет
Всего: нет



Цитата(Albor @ 4.12.2009,  16:04)

Значит tab[0] всегда остаётся равным -1, то есть не заполняется. Алгоритм заполнения таблицы довольно мудрёный и сходу тяжело что либо сказать, но по условию при печати таблицы видно, что те элементы, которые ты не видишь равны -1, то есть при заполнении таблицы эти ячейки пропускаются.

а как просмотреть ячейку, пуста ли она, а потом , если пуста записать туда элемент!!!..(это же, как я думал, метод устранения коллизий квадратичными пробами( если ячейка занята - перейти к следующей и т.д.)) то есть предпологается что ячейка с элементом -1  - была коллизией и из нее мы перешли в следущую... то есть все верно???? но, элементы нумеруются неверно, как сделать правильную нумерацию....

Да, и с константами че то я перемудрил.... спасибо за подсказку...
PM MAIL   Вверх
Albor
Дата 4.12.2009, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 2
Всего: 9



Цитата(werywery @  4.12.2009,  17:28 Найти цитируемый пост)
то есть предпологается что ячейка с элементом -1  - была коллизией и из нее мы перешли в следущую...

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

Добавлено через 11 минут и 40 секунд
Таблица у тебя больше количества элементов в g-раз. При заполнении таблицы ты перебираешь все элементы от i до m и "разбрасываешь" их по таблице. Как ни крути, а в таблицу больше чем m значений не попадёт, остальные ячейки будут незаполненые и на печать не выведутся.
PM MAIL ICQ   Вверх
werywery
Дата 4.12.2009, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 29.10.2009

Репутация: нет
Всего: нет



Цитата(Albor @ 4.12.2009,  17:47)

Добавлено @ 17:59
Таблица у тебя больше количества элементов в g-раз. При заполнении таблицы ты перебираешь все элементы от i до m и "разбрасываешь" их по таблице. Как ни крути, а в таблицу больше чем m значений не попадёт, остальные ячейки будут незаполненые и на печать не выведутся.

а как мне пронумеровать элементы которые вывелись, тем индексом,которому они соответствуют......

или может представите свой алгоритм заполнения и печать таблицы, а то я уже совсем запутался..... буду очень вам благодарен.....
PM MAIL   Вверх
Albor
Дата 4.12.2009, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 2
Всего: 9



Сделай вывод таблицы без условия внутри и всё станет очевидно

Добавлено через 2 минуты и 33 секунды
Цитата(werywery @  4.12.2009,  18:11 Найти цитируемый пост)
или может представите свой алгоритм заполнения 

Ну, ты даёшь! Как можно представить алгоритм если даже не знаешь что нужно получить.
PM MAIL ICQ   Вверх
werywery
Дата 4.12.2009, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 29.10.2009

Репутация: нет
Всего: нет



Цитата(Albor @ 4.12.2009,  18:12)
Сделай вывод таблицы без условия внутри и всё станет очевидно

Добавлено @ 18:15
Цитата(werywery @  4.12.2009,  18:11 Найти цитируемый пост)
или может представите свой алгоритм заполнения 

Ну, ты даёшь! Как можно представить алгоритм если даже не знаешь что нужно получить.

Задание было такое!!!!
Построить хеш-таблицу содержащую последовательность из m=45 элементов размерностью n=4. Элементы генерируются с помощью датчика случайных чисел. Хеш-функция f(k)=(k/11)%t;
метод разрешения коллизий квадратичные пробы!

может это поможет!!!

PM MAIL   Вверх
Albor
Дата 4.12.2009, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 2
Всего: 9



Начни с этого. Чтобы решить задачу нужно сначала понять её.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0616 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.