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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Указатели и массивы, найдите пожалуйста мою ошибку 
V
    Опции темы
Mister U
Дата 27.3.2006, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



На завтра (очень желательно) сделать лабораторную работу... Я правильно (по-моему) составил алгоритм решения и написал программу, но... увы и ах, неправильно работает! =(

Вот задача:
Объявить массив целых чисел и заполнить его случайными значениями. Размер массива = 100. Диапазон значений: [-100;100]
Вывести начальные индексы всех непрерывных последовательностей неотрицательных чисел, длина которых больше 5-ти.
0 считается положительным числом.
В тексте программы НЕ ПРИМЕНЯТЬ операцию индексации!

Вот мой алгоритм (блок-схема):
http://dmitriy.chatman.ru/temp_27.03.2006.jpg [68 кб]

Вот текст программы:
Код

#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

void main(void)
{
  int *ptr; // указатель на начало массива
  int *Fmin,*Lmin; // текущие указатели
  int FL,i; // количество элементов в последовательности

  clrscr();
  randomize();
  printf("Начальный массив: \n");
  for(Fmin=ptr;Fmin<(ptr+100);Fmin++)
  {
    *Fmin=random(200)-100;
    printf("%4d ",*Fmin);
  }
  printf("\n");

  //-------------- обработка по заданию ----------------
  if(*ptr>=0)
    Fmin=-1;
  else
    Fmin=0;
  printf("Начальные индексы последовательностей:\n");
  for(i=Fmin+1;i<=99;i++)
  {
    if(*(ptr+i)<0)
    {
      Lmin=i;
      FL=Lmin-Fmin-1;
      if(FL>=2) printf("%d; ",Fmin+1);
      Fmin=Lmin;
      i++;
    }
  }
  //----------------------------------------------------

  getch();
}


Это сообщение отредактировал(а) Mister U - 27.3.2006, 14:11
PM MAIL ICQ   Вверх
_hunter
Дата 27.3.2006, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



и в чем эта ошибка заключается?
и почему бы самому по коду отладчиком не пойтись?..


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Mister U
Дата 27.3.2006, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



ну скажем, выводит индекс 82
я просматриваю массив и вижу, что до этой последовательности была ещё одна с положительными значениями. Или же индекс указывает на отрицательный элемент, после которого следует ещё один... :-/
PM MAIL ICQ   Вверх
LuckLess
Дата 27.3.2006, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



попробуй это
Код

struct is_Odd:public std::unary_function<int,bool>{
        bool operator()(int val)const{
            return val%2;
        }
};


void main(void){
    srand(GetTickCount());
    std::vector<int> numbers;
    std::generate_n(std::back_inserter(numbers),100,rand);

    typedef std::vector<int>::iterator IT;

    std::ofstream log("test.txt");
    for (IT c = numbers.begin() ; c != numbers.end() ; ++c)
        log << *c << " ";
    log << "\n\n\n";

    IT iter=numbers.begin();
    
    while( (iter = std::find_if(iter,numbers.end(),is_Odd())) <= numbers.end()-5 ){
        IT width = std::find_if(iter,iter+5,std::not1(is_Odd()));
        if (width==iter+5) log << iter - numbers.begin() +1<<" ";
        ++iter;
    }



}

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


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



ну а второй вопрос?..


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
LuckLess
Дата 27.3.2006, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



чуть поправил
Код

struct is_Odd:public std::unary_function<int,bool>{
        bool operator()(int val)const{
            return val%2;
        }
};

struct rand_range{
    int operator()(){
        return rand()%201 -100;
    }
};


void main(void){
    srand(GetTickCount());
    std::vector<int> numbers;
    std::generate_n(std::back_inserter(numbers),100,rand_range());

    typedef std::vector<int>::iterator IT;

    std::ofstream log("test.txt");
    for (IT c = numbers.begin() ; c != numbers.end() ; ++c)
        log << *c << " ";
    log << "\n\n\n";

    IT iter=numbers.begin();
    
    while( (iter = std::find_if(iter,numbers.end(),is_Odd())) <= numbers.end()-6 ){
        IT width = std::find_if(iter,iter+6,std::not1(is_Odd()));
        if (width==iter+6) log << iter - numbers.begin() +1<<" ";
        ++iter;
    }
}

PM MAIL   Вверх
MAKCim
Дата 27.3.2006, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



Код

void print(int* array, unsigned int size, int num)
{
    unsigned int i=0;
    while (i<size)
    {
        unsigned int j=i;
        while (i<size && *(array+i)>=0) i++;
        if (i-j>num)  printf("%d",j);
        i++;
    }
}



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Lotrex
Дата 27.3.2006, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 95
Регистрация: 9.2.2006
Где: Казань

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



Mister U, у Вас (в Вашем варианте) указатели не инициализированы. Т.е. переменные ptr, Fmin, Lmin никуда не указывают, а точнее - указывают куда-то, и очень возможно, что на область памяти, которую занимают какие-то переменные. Для начала Вам объявить ptr как массив, а не как указатель, т.е. вместо этого:
Код

int *ptr;

написать это:
Код

int ptr[100];

В первом (Вашем) варианте память под массив не выделяется, ptr указывает бог знает куда и туда же Вы и пишете.

Пока что думаю Вам лучше сделать так(дабы меньше изменений делать):

Код

int Vect[100],
    *ptr = (int *)Vect;


Далее - как в Вашей программе. (Опять таки, я дальше не смотрел, мож там исче что-то есть)
PM MAIL ICQ   Вверх
Mister U
Дата 27.3.2006, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Всем спасибо! Разобрался.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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