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


Автор: Gadge 16.5.2009, 00:29
Простое задание. На Visual C++ 2005.
http://smages.com/6d/a5/6da5e1b2a5973bbe070aa4218513bf02.jpg.htm

Проблема в том, что программа всегда выдаёт 0... =(( В чём ошибка?
Код

#include "stdafx.h"
#include <iostream>
#include <iomanip>
#include <time.h>
#include <math.h>
using namespace std;


int* zapoln(int max) 
{
   static int massiv[10];
   for(int i=0;i<max;i++) massiv[i]=rand()%5+4;
   return massiv;
}

void vuvod(int* massiv, int l)
{     int i;
     for (i=0;i<l;i++)
     {
cout << massiv[i]<< "  ";
     }
cout<<"\n ";
}

int proizv(int* massiv, int l, int minus) 
{
int q=1;
   for(int i=1;i<l;i++) q*=(massiv[i]-minus);
   return q;
}

double formula(int* M, int* L, int* C) {
  double Z=(proizv(M, 8, 1)-proizv(C, 9, 5))/(proizv(L, 7, 0)-proizv(M, 8, 0));
   return Z;
}

int main() 
{
   srand( (unsigned)time( NULL ) );
   int* M=zapoln(7);
   int* L=zapoln(6);
   int* C=zapoln(8);
   double Z=formula(M,L,C);

vuvod(M, 7);
vuvod(L, 6);
vuvod(C, 8);
   
cout<<"Z="<<Z<<"\n";
   
   return 0;

Автор: NightmareZ 16.5.2009, 00:40
Дэбаггером пользоваться не пробывал?

Автор: Dmi3ev 16.5.2009, 01:09
Первая глупость, которая уж очень бросается в глаза... это 
Цитата

int* zapoln(int max) 
{
   static int massiv[10];
   for(int i=0;i<max;i++) massiv[i]=rand()%5+4;
   return massiv;
}

и вот это ее использование...
Цитата

   int* M=zapoln(7);
   int* L=zapoln(6);
   int* C=zapoln(8);

вы знаете, что будет?
Расскажу по колхозному, допустим после выполнения 
Цитата

   int* M=zapoln(7);

*M или M[0] будет равно 5 (допустим)
потом выполняется
Цитата

   int* L=zapoln(6);

*L или L[0] будет равно 7 (допустим), а теперь внимание вопрос, а чему равно *М или М[0]? 5 ? как бы не так оно будет равно 7!!!
Остальное даже не смотрел... нет смысла...

Автор: artsb 16.5.2009, 01:10
Gadge, у тебя проблема в том, что ты в функции zapoln объявил массив как статический. В результате, после выполнения этих операций:
Код

   int* M=zapoln(7);
   int* L=zapoln(6);
   int* C=zapoln(8);
   double Z=formula(M,L,C);

И M, и L, и C ссылаются на один и тот же массив. Потом в функции formula ты делаешь с ними какие-то операции. Я не разбирался какие (хочу спасть smile), но мне кажется, что дело в этом.

Добавлено @ 01:10
Dmi3ev, опередил. smile Медленно я печатаю в сонном состоянии smile

Автор: Dov 16.5.2009, 03:00
Цитата(Gadge @  16.5.2009,  00:29 Найти цитируемый пост)
Проблема в том, что программа всегда выдаёт 0... =(( В чём ошибка?

так нужно, хотя бы:
Код
double Z=double(proizv(M, 8, 1)-proizv(C, 9, 5))/(proizv(L, 7, 0)-proizv(M, 8, 0));


Автор: NightmareZ 16.5.2009, 03:58
Код

#include <iostream>
#include <time.h>

int* fillArray(int count) 
{
   int* arr = new int[count];
   for(int i = 0; i < count; i++) arr[i] = rand() % 5 + 4;
   return arr;
}

void output(int* arr, int count)
{
    for (int i = 0; i < count; i++)
        std::cout << arr[i]<< "  ";

    std::cout << std::endl;
    delete[] arr;
}

double mul(int* arr, int count, int minus)
{
    double result = 1;
    for (int i = 0; i < count; i++)
        result *= arr[i] - minus;
    return result;
}

double mul(int* arr, int count)
{
    double result = 1;
    for (int i = 0; i < count; i++)
        result *= arr[i];
    return result;
}

int main()
{
    srand(time(NULL));

    int* M = fillArray(7);
    int* L = fillArray(6);
    int* C = fillArray(8);

    double Z = (mul(M, 7, 1) + mul(C, 8, 5)) / (mul(L, 6) - mul(M, 7));

    output(M, 7);
    output(L, 6);
    output(C, 8);

    std::cout << "Z = " << Z << std::endl;

    return 0;
}

Автор: Gadge 16.5.2009, 11:50
Всем откликнувшимся - спасибо.  smile 
Насколько я понял:
1) вносим изменение, которое подсказал Dov
2) первый блок, в котором заполняется массив, берём из варианта который предложил NightmareZ . (что бы было 3 разных массива а не один.)

В результате чего получаем вполне работующую прогу... Так? На первый взгляд вроде такой вариант работает вполне адекватно.

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