Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Указатели и массивы


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

Вот задача:
Объявить массив целых чисел и заполнить его случайными значениями. Размер массива = 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();
}

Автор: _hunter 27.3.2006, 14:16
и в чем эта ошибка заключается?
и почему бы самому по коду отладчиком не пойтись?..

Автор: Mister U 27.3.2006, 14:33
ну скажем, выводит индекс 82
я просматриваю массив и вижу, что до этой последовательности была ещё одна с положительными значениями. Или же индекс указывает на отрицательный элемент, после которого следует ещё один... :-/

Автор: LuckLess 27.3.2006, 15:03
попробуй это
Код

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;
    }



}

Автор: _hunter 27.3.2006, 15:05
ну а второй вопрос?..

Автор: LuckLess 27.3.2006, 15:10
чуть поправил
Код

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;
    }
}

Автор: MAKCim 27.3.2006, 16:55
Код

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++;
    }
}

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

int *ptr;

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

int ptr[100];

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

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

Код

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


Далее - как в Вашей программе. (Опять таки, я дальше не смотрел, мож там исче что-то есть)

Автор: Mister U 27.3.2006, 17:31
Всем спасибо! Разобрался.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)