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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.01.2010, 03:04   #11
amerhant
Пользователь
 
Регистрация: 19.10.2009
Сообщений: 24
По умолчанию

Мне нужен весь массив...
Вот со всеми изменениями которые мне посоветовали, но все равно возвращает не известно что((
amerhant вне форума Ответить с цитированием
Старый 17.01.2010, 03:05   #12
amerhant
Пользователь
 
Регистрация: 19.10.2009
Сообщений: 24
По умолчанию

Код:
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <stdlib.h>
#define E 40
#define R 50
float stepenn(float *a, int P, int Q, float f)
 {
 int j,i;
 float sum,average;
 float result[R];
 for(j=0;j<Q;j++)
 {
	       sum=0;
	       for(i=0;i<P;i++)
	       {
	       sum=sum+pow(a[i*R+j],f);
	       }
	       average=pow((sum/P),(1./f));
	       result[j]=average;
	       
 }
	       return result[R];
 }
float max(float x[],int L)
{
	int i;
	float MAX;
	for(MAX = x[0], i = 1; i < L; i++)
	{
	if(x[i] >MAX) MAX = x[i];
	}
	return (MAX);
}
main () {
clrscr ();
randomize ();
    float a [E][R];
    int t=0,b=10,i,j,scale=10;
    int P,Q;
    printf ("strok : ");
    scanf ("%d",&P);
    printf ("stolbow : ");
    scanf ("%d",&Q);

       for (i=0;i<P;i++)
       {
       printf("\n");
       for (j=0;j<Q;j++)
       {
       a[i][j]=(random((b-t+1)*scale)+t*scale)/(float)scale;
       printf ("%2.1f\t",a[i][j]);
       }
       printf("\n");
       }
       printf("\n\n\n");
       float f;
       float result[R];
       float sum, average;
       printf("Vvedite stepeny\n");
       scanf("%f",&f);
       printf("\n");
     result[R]=stepenn(*a,P,Q,f);
   for(j=0;j<Q;j++)
       {
	       
	       printf("%d %g\n",j,result[j]);
	   }
	   printf("\n\n");
	 float MAX=max(result,Q);
	printf ("Max resultat %g\n", MAX);
	getch();
	return 0;
}

Последний раз редактировалось amerhant; 17.01.2010 в 03:08.
amerhant вне форума Ответить с цитированием
Старый 17.01.2010, 10:16   #13
RoS
Форумчанин
 
Аватар для RoS
 
Регистрация: 13.12.2009
Сообщений: 272
По умолчанию

return result[R]; ну даже например вот это заведомо бред
ты пытаешься вернуть 50-ый элемент по индексу, а у тебя выделилось с 0 по 49, т.е. такого в принципе нет - внимательней читай код!
Если я помог вам - порадуйте меня, нажмите на весы слева
RoS вне форума Ответить с цитированием
Старый 17.01.2010, 13:30   #14
Sapfil
Пользователь
 
Аватар для Sapfil
 
Регистрация: 11.01.2010
Сообщений: 24
По умолчанию

amerhant. Я так понял, что ты - такой же новичок в С++, как и я
Так что будем вместе разбираться - мне это так же полезно как и тебе.

Глянь, как у тебя объявлена функция stepen

float stepenn (...аргументы...)

То есть функция по любому возвращает ОДНО значение типа float.

Чтобы от этого избавиться - сделаем, чтобы функция возвращала УКАЗАТЕЛЬ на первый элемент массива.
Вот тебе простой пример. Здесь создается массив 3 на 3 и заполняется циферками от 1 до 9.
Затем эти циферки выдается нам же на экран. Заметь, что обращаясь в виде a(i)(j) - мыобращаемся к значению определенной ячейки массива (естессно). А вот что происходит, если вывести на экран a[0] или вообще просто a - в обоих случаях появляется одинаковая странная цифра. Это адрес первого элемента массива.

Код:
#include <iostream>
using namespace std;

int main ()
{
	int a[3][3] = {1,2,3,4,5,6,7,8,9};
	for (int i=0; i<3; i++)
		for (int j=0; j<3 ; j++)
			cout << a[i][j] << "\n";
	cout << a[0] << "\n" << a;
	getchar();
};
Теперь возьмем твою функцию.
Чтобы она возвращала указатель надо писать так:

Код:
float * stepenn (...)                   // функция возвращает указатель на объект типа float
   {
   ...
   float * result = new float[R];   // result - это указатель на массив из R элементов типа float
   ...                                      // если быть точнее, то он указывает на первый элемент этого массива
   ...
   result[j] = average;                // по-моему можно так оставить - должно работать
   ...
   return result;                        // возвращаем указатель на первый элемент массива.
   }
Как обращаться этой функции из другого места:

Код:
int main()
   {
   ...
   float * res;               // в основной программе создается указатель res на переменную float
   res = stepenn (...)     // теперь наш указатель имеет адрес первого элемента той самой лабуды, которую мы вычисляли
   ...                           // в функции stepenn.
   ...
   float m = max(res)     // так ты передаешь этот указатель в функцию max
   }
Однако, все это не решит основной проблемы - как передается матрица A в функцию stepenn.
Чтобы увидеть - правильно она туда попадает или НЕ правильно - сделай так.
В основной программе прямо перед обращением к функции stepenn вставь цикл, который выводит тебе на экран твою матрицу. Затем в самой функции stepenn - в первой же строке функции - повтори этот же вывод твоей матрицы. И посмотри - отличаются ли результаты. ИМХО либо они будут сильно отличаться, либо прога не будет компилится . Но отсутствие результата - тоже результат. Будем работать смотреть дальше.

Последний раз редактировалось Sapfil; 17.01.2010 в 14:43.
Sapfil вне форума Ответить с цитированием
Старый 17.01.2010, 23:53   #15
amerhant
Пользователь
 
Регистрация: 19.10.2009
Сообщений: 24
По умолчанию

Ты прав это моя 4 программа и первая с использованием функции…
Только не в С++, а в Си…
Спасибо тебе большое теперь все работает правельно)))
Единственное про что я забыл – мне еще нужен номер столбика с максимумоми из функции мах, а как вернуть сразу 2 значения из функции я не знаю((
amerhant вне форума Ответить с цитированием
Старый 18.01.2010, 00:34   #16
Sapfil
Пользователь
 
Аватар для Sapfil
 
Регистрация: 11.01.2010
Сообщений: 24
По умолчанию

Чтобы функция выдала 2 значения - передай ей значение по ссылке. Вот как я сделал:

Код:
int max(int * b, int & maxi )
	{
	int m = 0;
	for (int i=0;i<3; i++)
		if (b[i] > m)
		{
			m = b[i];
			maxi = i;
		};
	return m;
	};
Это такая функция для примера - обрабатывает массив из трех элементов int и возвращает максимальный из них. Однако среди аргументов функции есть ссылка (значок & ).

Давай вызовем эту функцию:
Код:
int main ()
{
	...
	int m, j=0;
	int * b;
	b = ...
           ...
	m = max(b,j);

	cout << "\n" << m << "\t" << j;
	getchar();
};
Если первый элемент ( b[0] ) - максимальный, то функция max присвоит его значение переменной m. Значение переменной j - не изменится. Однако, если максимальным будет другой элемент, то функция не только присвоит его значение переменной m, но и изменит значение переменной j, так как в функцию передана ссылка на объект j. Фактически, у объекта maxi, озаявленного в функции - тот же адрес, что и у объекта j, объявленного в main. Изменяя значение по адресу maxi - мы меняем и значение j, потому что у них один и тот же адрес.

Вообще, это долгая тема - сам всю голову сломал, и то, конечно, не все до конца понял

Если я тебе помог - ткни в значок "весы" под любым из моих сообщений
Sapfil вне форума Ответить с цитированием
Старый 18.01.2010, 23:36   #17
amerhant
Пользователь
 
Регистрация: 19.10.2009
Сообщений: 24
По умолчанию

Очень помог спасибо!!
Я добавил отзыв...
amerhant вне форума Ответить с цитированием
Старый 18.01.2010, 23:56   #18
amerhant
Пользователь
 
Регистрация: 19.10.2009
Сообщений: 24
По умолчанию

А как реализовать защиту от неправельного ввода, например если я введу в размере столбца букву??
amerhant вне форума Ответить с цитированием
Старый 20.01.2010, 00:22   #19
Sapfil
Пользователь
 
Аватар для Sapfil
 
Регистрация: 11.01.2010
Сообщений: 24
По умолчанию

Вот чего не знаю - того не знаю...
Видимо надо вводить не сразу в int, а в какой-нибудь char. Сделать функцию, которая анализирует строки. У каждого символа - будь то буква, цифра или значок псевдографики - у всех есть номер по ASCII. Вот эта функция должна анализировать эти номера. И если они все разрешенные (цифры и еще точка (разделитель десятичный)) - тогда преобразует это все в число. А если нет - сообщает об ошибке и возвращает пользователя к началу ввода...
Sapfil вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
дана целочисленная прямоугольная матрица Jet-Tea Общие вопросы C/C++ 9 02.06.2010 16:41
Не могу найти ошибку в БД Bilargo Помощь студентам 0 26.11.2009 14:00
Не могу найти ошибку Tesmont Помощь студентам 2 20.05.2009 21:00
Дана целочисленная прямоугольная матрица... gregorio Помощь студентам 1 22.04.2009 20:27
Не могу найти ошибку. Picaso18 Паскаль, Turbo Pascal, PascalABC.NET 3 19.01.2009 17:05