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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.10.2008, 21:07   #1
EfiopianDIMON
 
Регистрация: 03.06.2008
Сообщений: 8
По умолчанию Динамический двухмерный массив С++

Программа работает и почти выдает, что нужно. Но есть пробелы:
- не могу корректно указать параметры в функции initial() и number ();
- поэтому страдает функция number (), которая вместо символов выводит мусор (или что-то другое похожее на него);
- ранее выбранные “нужные числа” не отображаются на следующих этапах работы функции number ().
Помогите по пунктам пожалуйста!

Код:
#include <iostream>
#include <time.h>
using namespace std;
/*Создать двумерный массив и показать на экран только  угловые элементы. Остальные 
замаскировать под звездочки. Пользователь указывает номер строки и номер столбца нужное число открывается.*/
void initial ()
{	
	int N=7;
	char **str=new char* [N]; 
	for(int i=0;i<N;i++)
	{	srand(time(0));
		str[i]=new char [N];
		for(int j=0;j<N;j++)
		{
			str[i][j]=rand()%8+1;
		}
	}
	for(int i=0;i<N;i++)
	{
		for(int j=0;j<N;j++)
		{
			if((i==0&&j==0)||(i==N-1&&j==0)||(i==0&&j==N-1)||(i==N-1&&j==N-1))
			{
				cout<<str[i][j];
			}
			else{cout<<"*";}
		}
		cout<<"\n";
	}	
}
void number ()
{	
	int N=7,h=0;
	char **str=new char* [N]; 
	int n1,n2;
	cout<<"Put n1/n2:\n";
	cin>>n1>>n2;
	if(n1>6&&n2>6||n1<0&&n2<0)
	{
		cout<<"Put n1/n2(0<n1(n2)<6):\n";
		cin>>n1>>n2;
	}
	for(int i=0;i<N;i++)
	{	
		str[i]=new char [N];
		for(int j=0;j<N;j++)
		{	
			if(i==n1&&j==n2)
			{
				cout<<str[i][j];
			}
			else if((i==0&&j==0)||(i==N-1&&j==0)||(i==0&&j==N-1)||(i==N-1&&j==N-1))
			{
				cout<<str[i][j];
			}
			
			else{cout<<"*";}
		}
		cout<<"\n";
	}
}
void main()
{
	int N=7,h=0;
	char** str=new char*[N];
	for(int i=0;i<N;i++)
	{
		str[i]=new char[N];
	}

		system("cls");
		initial();
		for(int i=0;i<N;i++)
		{	
			number ();
		}
		system("cls");
}

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

Задание в студию, а то не сильно понятно, что твоя программа должна делать.
ПыСы: из того, что я заметил - не проще ли было сделать char **str глобальной, а то у тебя в каждой из функций (и в main к тому же) создается отдельная копия массива. Сделай массив глобальным или передавай в каждую функцию по сцылке или по указателю.
MaTBeu вне форума Ответить с цитированием
Старый 05.10.2008, 21:49   #3
EfiopianDIMON
 
Регистрация: 03.06.2008
Сообщений: 8
По умолчанию

Цитата:
Сообщение от MaTBeu Посмотреть сообщение
Задание в студию, а то не сильно понятно, что твоя программа должна делать.
ПыСы: из того, что я заметил - не проще ли было сделать char **str глобальной, а то у тебя в каждой из функций (и в main к тому же) создается отдельная копия массива. Сделай массив глобальным или передавай в каждую функцию по сцылке или по указателю.
Задание выделил, после подключения пространства имен std.
Передать указатель и ссылку, было бы здорово, но как раз в этом мой пробел. Не получается, возникает путаница. Глобальным не выходит.
EfiopianDIMON вне форума Ответить с цитированием
Старый 06.10.2008, 21:12   #4
reset
Пользователь
 
Регистрация: 21.09.2008
Сообщений: 14
По умолчанию

Код:
str[i][j]=rand()%8+1;
Какие символы ты хочешь увидеть здесь?
Загляни в таблицу кодов ASCII и посмотри символы с кодами от 1 до 8.

Вот кусок из моего кода с параметрами для функций.
Код:
#include <iostream>
#include <cstdlib>
#include <ctime>
void initial(char** a, int nstr, int nstb)
{
	std::srand(std::time(NULL));
	for(int i = 0; i < nstr; ++i)
	{
		for(int j = 0; j < nstb; ++j)
		{
			a[i][j] = std::rand()%10+48;
		}
	}
}
void view(char** a, int nstr, int nstb)
{
	for(int i = 0; i < nstr; ++i)
	{
		for(int j = 0; j < nstb; ++j)
		{
			if((i == 0 && j == 0) || (i == nstr-1 && j == nstb-1) || 
			   (i == 0 && j == nstb-1) || (i == nstr-1 && j == 0))
			{
				std::cout << a[i][j] << ' ';
			}
			else
			{
				std::cout << '*' << ' ';
			}
		}
		std::cout << std::endl;
	}
}
int main(int argc, char** argv)
{
	int nstr; //кол-во строк в массиве
	int nstb; //кол-во столбцов в массиве
	
	std::cout << "Кол-во строк и столбцов: ";
	std::cin >> nstr >> nstb; 
	
	char **array = new char *[nstr];
	for(int i = 0; i < nstr; ++i)
		array[i] = new char [nstb];
	
	initial(array, nstr, nstb);
	view(array, nstr, nstb);
	view_number(array, nstr, nstb);
}
reset вне форума Ответить с цитированием
Старый 18.11.2008, 20:55   #5
FW-TOT
Пользователь
 
Регистрация: 01.08.2008
Сообщений: 19
По умолчанию

А для чего нужен "std::"?
От неудач не ревут. С ними разбираются.
FW-TOT вне форума Ответить с цитированием
Старый 18.11.2008, 23:01   #6
filosof_x86
...
Форумчанин
 
Аватар для filosof_x86
 
Регистрация: 01.06.2008
Сообщений: 134
По умолчанию

Цитата:
Сообщение от FW-TOT Посмотреть сообщение
А для чего нужен "std::"?
Почитайте про пространства имен (namespace).
filosof_x86 вне форума Ответить с цитированием
Старый 19.11.2008, 12:00   #7
StarWorm
Форумчанин
 
Регистрация: 17.11.2008
Сообщений: 233
По умолчанию

Не проще ли, если везде используешь имена из стандартной библиотеки, написать
Код:
using namespace std;
P.S. и еще... где у вас функция или хотя бы объявление void view_number(char**,int,int);???
Т.к. в функции int main(){...} она присутствует... Или это опечатка, или недоработка, да и вообще зачем она нужна???

Последний раз редактировалось StarWorm; 19.11.2008 в 12:06.
StarWorm вне форума Ответить с цитированием
Старый 19.11.2008, 23:38   #8
filosof_x86
...
Форумчанин
 
Аватар для filosof_x86
 
Регистрация: 01.06.2008
Сообщений: 134
По умолчанию

Цитата:
Сообщение от StarWorm Посмотреть сообщение
Не проще ли, если везде используешь имена из стандартной библиотеки, написать
Код:
using namespace std;
Проще не значит лучше. Да, подключить одной строчкой все пространство имен просто, вот только и в простых программах (не используя другие пространства имен, строк кода: 600-1000) можно напороться на гемор в 2-3 часа работы.

P.S. вторая часть вопроса не ко мне
filosof_x86 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Двухмерный массив на поле Grigoriy251 Gamedev - cоздание игр: Unity, OpenGL, DirectX 2 21.09.2008 11:52
двухмерный массив Enchantner Паскаль, Turbo Pascal, PascalABC.NET 3 22.04.2008 20:47
Двухмерный массив xtraSHAD0W Паскаль, Turbo Pascal, PascalABC.NET 2 22.04.2008 18:17
Двухмерный массив, 2 задачи Juhn Паскаль, Turbo Pascal, PascalABC.NET 7 10.02.2008 18:55
Двухмерный массив Atheist Общие вопросы C/C++ 4 22.11.2007 14:05