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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.12.2009, 21:06   #1
NICmito
 
Регистрация: 13.12.2009
Сообщений: 9
По умолчанию не могу разобраться как правильно оформить цикл

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

собствено мне нужно чтобы процессор пробегая по двумерному масиву mtx находил столбец записывал его номер в colum(1ая часть структуры)
затем для этого столбца считал произведение всех его элементов и записывал в param(2ая часть структуры) этих структур N количиство в зависимости от того сколько колонок у нас в масиве mtx.

в моё коде он выдаёт количество колонок N-1 для каждого параметра column и выдаёт чушь всякую для param я знаю где моя ошибка это в тройном цикле но как исправить не знаю.

Буду очень признателен если поможете....остальное сделаю сам.

ЗЫ. если понадобиться озвучу задание лабороторной.

вот мой код:
Код:
#include "stdafx.h"
#include <iostream>
#include <iomanip>	// for setw(int)
#include <stdlib.h>
#include <time.h>

using namespace std;

struct structurs
	{
		int colum;
		int param;
	};

void print_matrix2(structurs *mtx, int N)
{
	for(int i=0; i<N; i++)
	cout << mtx[i].colum << " " << mtx[i].param << endl;	
}

void print_matrix(int **mtx, int N, int M)
{
	for(int i = 0; i < N; i++)
	{
		for(int j = 0; j < M; j++)
			cout << setw(4) << mtx[i][j] << " ";

		cout << endl;
	}
}

void fill_matrix(int **mtx, int N, int M)
{
	for(int i = 0; i < N; i++)
		for(int j = 0; j < M; j++)
			mtx [i][j]=rand() % 10;
}
int main()
{
	srand((unsigned)time(NULL));

	int		N = 0, M = 0;

	while(N == 0)
	{
		cout << "Enter number of rows: "; 
		cin >> N;
	}

	while(M == 0)
	{
		cout << "Enter number of columns: "; 
		cin >> M;
	}

	int		**mtx = (int**) malloc(N*sizeof(int*));

	if(mtx == NULL)
	{
		cout << "Error: cannot allocate memory" << endl;
		return -1;
	}

	for(int i = 0; i < N; i++)
	{
		mtx[i] = (int*) malloc(M*sizeof(int));

		if(mtx[i] == NULL)
		{
			cout << "Error: cannot allocate memory" << endl;
			return -1;
		}
	}

	fill_matrix(mtx, N, M);

	print_matrix(mtx, N, M);

	structurs *tempmtx=(structurs*)malloc(N*sizeof(structurs));
		for (int p=1; p<N; p++)
		{
			tempmtx[p].colum=0;
			tempmtx[p].param=1;
		}

    for(int p = 0; p < N; p++)
	    for(int i = 0; i < N; i++)
	        for(int j = 0; j < M; j++)
				{
				tempmtx[p].colum=i;
				tempmtx[p].param*=mtx[0][j];
			    }
			
	cout << "\n" << "\n" << endl;
	print_matrix2(tempmtx, N);
	cout << "\n" << "\n" << endl;

	print_matrix(mtx, N, M);

	for(int i = 0; i < N; i++)
		free(mtx[i]);

	free(mtx);
    free(tempmtx);
	return 0;
}
PS приношу свои извенения за бардак в коде.


И как мне кажеться в этом месте для mtx нужен ещё 1 цикл после tempmtx[p].colum=i; tempmtx[p].param*=mtx[0][j]; /// блин или я ошибаюсь, окончательно в этих 3ёх "соснах"(циклах) заблудился.

Код:
for(int p = 0; p < N; p++)
	    for(int i = 0; i < N; i++)
	        for(int j = 0; j < M; j++)
				{
				tempmtx[p].colum=i;
				tempmtx[p].param*=mtx[0][j];
			    }

Последний раз редактировалось NICmito; 13.12.2009 в 21:41. Причина: подумал и понял надо дописать.
NICmito вне форума Ответить с цитированием
Старый 13.12.2009, 22:23   #2
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

Не пойму зачем вам тройной цикл. Если вам нужно просто посчитать произведение всех элементов каждого столбца, то можно обойтись двойным циклом
Код:
for(int i = 0; i < M; i++) //цикл по столбцам(!!!)
{
	tempmtx[i].column = i;
	tempmtx[i].param = 1; //чтобы не получилось, что вы все на 0 умножаете
	for(int j = 0; j < N; j++)//цикл по строкам(!!!)
	{
		tempmtx[i].param *= mtx[i][j];
	}
}
MaTBeu вне форума Ответить с цитированием
Старый 13.12.2009, 22:46   #3
NICmito
 
Регистрация: 13.12.2009
Сообщений: 9
По умолчанию

МаТВеu спасибо большое. вы мне очень помогли.

Последний раз редактировалось NICmito; 13.12.2009 в 22:52.
NICmito вне форума Ответить с цитированием
Старый 14.12.2009, 02:13   #4
NICmito
 
Регистрация: 13.12.2009
Сообщений: 9
По умолчанию

Блин(( опять втрял уже 8 часов за сёдняшний день за лабой просидел...бошка не варит(

вобщем есть код каторый получает матрицу с динамической памятью заданых размеров пользователем. заполняеться рандом числами 0-9 выводиться на экран потом, для каждого столбца считаеться произведение всех элементов этого столбца и корень из них и записываеться под своим номером в структуру типа structures int column //номер столбца float param //корень из произведения всех значений столбца таких структур всего столько сколько столбцов, все структуры помещены в линейный масив.

затем программа сортирует этот линейный массив так чтобы было возрастание по критерию param и тут должен быть правильный код как заставить отсортировать изходную динамическую матрицу в том же порядке что и отсортированна линейная.

тобиш вот задание лабороторной:

Написать программу, которая выполняет операцию над матрицей целых чисел. Матрицу следует размещать в динамической памяти. Размер матрицы указывает пользователь после запуска программы. Матрица заполняется случайными числами. Программа выводит исходную матрицу на экран, осуществляет операцию согласно варианту работы (см. ниже), после чего выводит преобразованную матрицу на экран.

Назовем характеристикой столбца квадратный корень из произведения элементов столбца. Расположить столбцы в порядке возрастания их характеристик.

итак мои наброски
Код:
#include <stdafx.h> //for math.h
#include <math.h> //for sqrt
#include "stdafx.h"
#include <iostream>
#include <iomanip>	// for setw(int)
#include <stdlib.h>
#include <time.h>

using namespace std;

int temp3;
struct structurs
	{
		int colum;
		float param;
	};

void print_matrix2(structurs *mtx, int M)
{
	for(int i=0; i<M; i++)
	cout << mtx[i].colum << " " << mtx[i].param << endl;	
}


void print_matrix(int **mtx, int N, int M)
{
	for(int i = 0; i < N; i++)
	{
		for(int j = 0; j < M; j++)
			cout << setw(4) << mtx[i][j] << " ";

		cout << endl;
	}
}

void fill_matrix(int **mtx, int N, int M)
{
	for(int i = 0; i < N; i++)
		for(int j = 0; j < M; j++)
			mtx [i][j]=rand() % 10;
}
int main()
{
	srand((unsigned)time(NULL));

	int		N = 0, M = 0;

	while(N == 0)
	{
		cout << "Enter number of rows: "; 
		cin >> N;
	}

	while(M == 0)
	{
		cout << "Enter number of columns: "; 
		cin >> M;
	}

	int		**mtx = (int**) malloc(N*sizeof(int*));

	if(mtx == NULL)
	{
		cout << "Error: cannot allocate memory" << endl;
		return -1;
	}

	for(int i = 0; i < N; i++)
	{
		mtx[i] = (int*) malloc(M*sizeof(int));

		if(mtx[i] == NULL)
		{
			cout << "Error: cannot allocate memory" << endl;
			return -1;
		}
	}

	fill_matrix(mtx, N, M);

	print_matrix(mtx, N, M);

	structurs *tempmtx=(structurs*)malloc(M*sizeof(structurs));
		for (int p=1; p<M; p++)
		{
			tempmtx[p].colum=0;
			tempmtx[p].param=(float)1;
		}

  for(int j = 0; j < M; j++) 
{
	tempmtx[j].colum = j;
	tempmtx[j].param = (float)1; 
	for(int i = 0; i < N; i++)
	{
		tempmtx[j].param *=(float)mtx[i][j];
	}
}
for (int i=0; i<M; i++)
tempmtx[i].param=sqrt(tempmtx[i].param);
			
	cout << "\n" << endl;
	print_matrix2(tempmtx, M);
	cout << "\n" << endl;

	for(int t = M-1; t > 0; --t)
		for(int p = 1; p <= t; ++p)
			if(tempmtx[p-1].param > tempmtx[p].param)
			{
				float temp = tempmtx[p].param;
				tempmtx[p].param = tempmtx[p-1].param;
				tempmtx[p-1].param = temp;

				int temp2 = tempmtx[p].colum;
				tempmtx[p].colum = tempmtx[p-1].colum;
				tempmtx[p-1].colum = temp2;
				
				for(int t = 0; t < M; t++) 
					for(int p = 0; p < N; p++)
						temp3 = mtx[p][t];
				        mtx[p][t] = mtx[p-1][t];
						mtx[p-1][t] = temp3;
			}


	cout << "\n" << endl;
    print_matrix2(tempmtx, M);
	cout << "\n" << endl;

	

	print_matrix(mtx, N, M);

	for(int i = 0; i < N; i++)
		free(mtx[i]);

	free(mtx);
    free(tempmtx);
	return 0;
}
Сейчас при таком коде прогама ваще вылетает с ошибкой.... что то где то здесь не так...именно тут и надо что то сделать и всё заработает по сути.
Код:
for(int t = M-1; t > 0; --t)
		for(int p = 1; p <= t; ++p)
			if(tempmtx[p-1].param > tempmtx[p].param)
			{
				float temp = tempmtx[p].param;
				tempmtx[p].param = tempmtx[p-1].param;
				tempmtx[p-1].param = temp;

				int temp2 = tempmtx[p].colum;
				tempmtx[p].colum = tempmtx[p-1].colum;
				tempmtx[p-1].colum = temp2;
				
				for(int t = 0; t < M; t++) 
					for(int p = 0; p < N; p++)
						temp3 = mtx[p][t];
				        mtx[p][t] = mtx[p-1][t];
						mtx[p-1][t] = temp3;
			}
PS спасибо заранее всем кто помог или хотел помоч.
PSS блин всем лабы в группе решил кроме себя(((( толи вариант попался такой толи закон подлости...ведь никогда проблем не было с информатикой.

Последний раз редактировалось NICmito; 14.12.2009 в 02:18.
NICmito вне форума Ответить с цитированием
Старый 14.12.2009, 08:44   #5
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Чует мое сердце, вы забыли скобки расставить:
Код:
				for(int t = 0; t < M; t++) 
					for(int p = 0; p < N; p++)
						{
						temp3 = mtx[p][t];
						mtx[p][t] = mtx[p-1][t];
						mtx[p-1][t] = temp3;
						}
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 17.12.2009, 17:58   #6
NICmito
 
Регистрация: 13.12.2009
Сообщений: 9
По умолчанию

нет извените не в этом дело, про скобки мне и компилятор скажет))) не в них дело...
NICmito вне форума Ответить с цитированием
Старый 17.12.2009, 18:01   #7
NICmito
 
Регистрация: 13.12.2009
Сообщений: 9
По умолчанию

вобщем есть код каторый получает матрицу с динамической памятью заданых размеров пользователем. заполняеться рандом числами 0-9 выводиться на экран потом, для каждого столбца считаеться произведение всех элементов этого столбца и корень из них и записываеться под своим номером в структуру типа structures int column //номер столбца float param //корень из произведения всех значений столбца таких структур всего столько сколько столбцов, все структуры помещены в линейный масив.

затем программа сортирует этот линейный массив так чтобы было возрастание по критерию param и тут должен быть правильный код как заставить отсортировать изходную динамическую матрицу в том же порядке что и отсортированна линейная.

тобиш вот задание лабороторной:

Написать программу, которая выполняет операцию над матрицей целых чисел. Матрицу следует размещать в динамической памяти. Размер матрицы указывает пользователь после запуска программы. Матрица заполняется случайными числами. Программа выводит исходную матрицу на экран, осуществляет операцию согласно варианту работы (см. ниже), после чего выводит преобразованную матрицу на экран.

Назовем характеристикой столбца квадратный корень из произведения элементов столбца. Расположить столбцы в порядке возрастания их характеристик.

такс мои исходники.
Код:
#include <stdafx.h> //for math.h
#include <math.h> //for sqrt
#include "stdafx.h"
#include <iostream>
#include <iomanip>	// for setw(int)
#include <stdlib.h>
#include <time.h>

using namespace std;

struct structurs
	{
		int colum;
		float param;
	};

void print_matrix2(structurs *mtx, int M)
{
	for(int i=0; i<M; i++)
	cout << mtx[i].colum << " " << mtx[i].param << endl;	
}

void print_matrix(int **mtx, int N, int M)
{
	for(int i = 0; i < N; i++)
	{
		for(int j = 0; j < M; j++)
			cout << setw(4) << mtx[i][j] << " ";

		cout << endl;
	}
}

void fill_matrix(int **mtx, int N, int M)
{
	for(int i = 0; i < N; i++)
		for(int j = 0; j < M; j++)
			mtx [i][j]=rand() % 10;
}
int main()
{
	srand((unsigned)time(NULL));

	int		N = 0, M = 0;

	while(N == 0)
	{
		cout << "Enter number of rows: "; 
		cin >> N;
	}

	while(M == 0)
	{
		cout << "Enter number of columns: "; 
		cin >> M;
	}

	int		**mtx = (int**) malloc(N*sizeof(int*));

	if(mtx == NULL)
	{
		cout << "Error: cannot allocate memory" << endl;
		return -1;
	}

	for(int i = 0; i < N; i++)
	{
		mtx[i] = (int*) malloc(M*sizeof(int));

		if(mtx[i] == NULL)
		{
			cout << "Error: cannot allocate memory" << endl;
			return -1;
		}
	}

	fill_matrix(mtx, N, M);

	print_matrix(mtx, N, M);

	structurs *tempmtx=(structurs*)malloc(M*sizeof(structurs));
		for (int p=1; p<M; p++)
		{
			tempmtx[p].colum=0;
			tempmtx[p].param=(float)1;
		}

  for(int j = 0; j < M; j++) 
{
	tempmtx[j].colum = j;
	tempmtx[j].param = (float)1; 
	for(int i = 0; i < N; i++)
	{
		tempmtx[j].param *=(float)mtx[i][j];
	}
}
for (int i=0; i<M; i++)
tempmtx[i].param=sqrt(tempmtx[i].param);
			
	cout << "\n" << endl;
	print_matrix2(tempmtx, M);
	cout << "\n" << endl;

         	for(int s = M-1; s > 0; --s)
				for(int d = 1; d <= s; ++d)
					if(tempmtx[d-1].param > tempmtx[d].param)
					{
						float temp = tempmtx[d].param;
						tempmtx[d].param = tempmtx[d-1].param;
						tempmtx[d-1].param = temp;

						int temp2 = tempmtx[d].colum;
						tempmtx[d].colum = tempmtx[d-1].colum;
						tempmtx[d-1].colum = temp2;
					}

{
    for(int i = 0; i < N; i++)
	{
		for(int j = 0; j < M; j++)
		{
			if(tempmtx[j].colum < j)
			{
				int temp3 = mtx[i][j];
				mtx[i][j] = mtx[i][j-1];
				mtx[i][j-1] = temp3;
			}
		}
	}
}	
	


    print_matrix2(tempmtx, M);
	cout << "\n" << endl;	

	print_matrix(mtx, N, M);

	for(int i = 0; i < N; i++)
		free(mtx[i]);

	free(mtx);
    free(tempmtx);
	return 0;
}
что то не так иммено в этом месте(чтобы вам не искать долго)
Код:
{
    for(int i = 0; i < N; i++)
	{
		for(int j = 0; j < M; j++)
		{
			if(tempmtx[j].colum < j)
			{
				int temp3 = mtx[i][j];
				mtx[i][j] = mtx[i][j-1];
				mtx[i][j-1] = temp3;
			}
		}
	}
}
NICmito вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Цикл по времени - Как сделать так чтобы цикл выполнялся к примеру 10 секунд ? Anarki Общие вопросы C/C++ 3 13.11.2009 19:23
Не могу разобраться как менять строки в масмсиве Ker_33rus Общие вопросы C/C++ 4 10.11.2009 11:18
Как правильно построить цикл для выборки? Tanuska___:) БД в Delphi 1 12.01.2009 14:50
Не могу написать цикл ((( DM_bite Общие вопросы Delphi 10 30.07.2008 21:57