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

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

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

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

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

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 11.08.2011, 21:29   #1
Corvette
Пользователь
 
Регистрация: 31.07.2011
Сообщений: 55
По умолчанию Массивы!!!

Здравствуйте!

Пожалуйста, объясните новичку, как можно реализовать задачу.

Дана матрица с 4 элементами размер 2х2.
- -
+ +

Нужно в одну матрицу размером 4х4 записать эту же матрицу, но 4 раза. Что бы в результате получилась матрица (массив) следующего вида:

- - - -
+ + + +
- - - -
+ + + +

Код исходной программы (написанной при помощи Форумчанинов ):

Код:
#include <iostream> 
#include <iomanip>   
#include <clocale>
#include <cstdlib>
#include <cstring>

using namespace std;

int main(void)
{
    setlocale(LC_ALL,"Russian"); 
    //  Блок переменных и констант    
    const int Hn = 2; // количество матриц в массиве 
    const int HnRow = 2;    // количество строк в матрице
    const int HnCol = 2;   // количество столбцов
    char H[Hn][HnRow][HnCol] = {
   {{'-','+'},{'+','+'}},
        {{'+','-'},{'+','+'}}
};

         
const int An = 1; // количество матриц в массиве
    const int AnRow = 4; // количество строк в матрице
    const int AnCol = 4;   // количество столбцов в матрице
    char A[An][AnRow][AnCol];
    
    for(int i = 0; i < Hn; i++)
	{
		cout << "Вывод" << i << "-i- ой матрицы:" << endl << endl; 
		for(int j = 0; j < HnRow; j++)
		{
			for(int k = 0; k < HnCol; k++)
		    cout << setw(4) << H[i][j][k]; 
			cout << endl << endl;
		}
		cout << endl;
	}
	
	system("PAUSE"); 
	return 0;
Как я понимаю надо задать матрицу размером 4х4. Можно ли использовать и функции strcat и strcpy при решении данной задачки? Я попытался написать эти функции как в ниже приведенной программе! Но компилятор ругается, и честно говоря я запутался окончательно!!!

Буду благодарен за помощь!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!

PS: Я написал код , реализации очень простой похожей задачки.
Дан исходный массив с элементами +-+. А потом в один массив записываться два раза символы из исходного массива. И в результате получается массив с элементами
+ - + + - +

Код:
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <conio.h>

using namespace std;

int main()
{
    int i;
    char massiv [4] = {'+','-','+'};
    char str [7];
    strcpy (str, massiv);
    strcat (str, massiv);
    cout << str << " ";
        
    getch ();
    return 0;
}
Но мне кажется, можно более рационально решить эту простую задачу

Последний раз редактировалось pproger; 11.08.2011 в 22:05.
Corvette вне форума
Старый 11.08.2011, 22:02   #2
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

Код:
#include <stdio.h>
#include <string.h>

int main()
{
    int i, j;

    // source matrix
    char arr[2][2] = {
        { '-', '-' },
        { '+', '+' }
    };

    // dest matrix
    char new_arr[4][4] = { {0} };

    // propagate matrix
    for (i = 0, j = 0; i < 4; i++, j = i % 2) {
        memcpy(new_arr[i], arr[j], sizeof(arr[j]));
        memcpy(&new_arr[i][2], arr[j], sizeof(arr[j]));
    }

    // print new matrix 
    for (i = 0; i < 4; i++) {
        for (j = 0; j < 4; j++)
            printf("%c ", new_arr[i][j]);
        printf("\n");
    }

    return 0;
}
вопросы?
пс. вообще правильней написать функцию, которая создаст новую матрицу, увеличенную в n раз. но мне влом
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance

Последний раз редактировалось pproger; 11.08.2011 в 22:09.
pproger вне форума
Старый 11.08.2011, 22:36   #3
Corvette
Пользователь
 
Регистрация: 31.07.2011
Сообщений: 55
По умолчанию

Спасибо огромное!!!
Если Вам не трудно объясните пожалуйста как работает следующий фрагмент программы. Я только учу С, не все еще к сожалению понимаю.
Код:
 
for (i = 0, j = 0; i < 4; i++, j = i % 2) {
        memcpy(new_arr[i], arr[j], sizeof(arr[j]));
        memcpy(&new_arr[i][2], arr[j], sizeof(arr[j]));
    }
Не могу понять j = i % 2 (я понимаю что это деление по модулю, но как работает в этой программе понять не могу)?

Про memcpy я прочитал что
char memcpy (dest, src, cnt);
char *dest; указатель на результат
char *src; указатель на исходный буфер
unsigned cnt; количество символов
Corvette вне форума
Старый 11.08.2011, 23:04   #4
MooNDeaR
В стагнации
Участник клуба
 
Аватар для MooNDeaR
 
Регистрация: 29.07.2011
Сообщений: 1,303
По умолчанию

Снова вы, Corvette Что ж у вас за проблемы с массивами

memcpy - копирует блок памяти размером sizeof(arr[j]) в массив new_arr. Т.е. как бы переносит j-ю строку массива arr в массив new_arr.

memcpy вызывается 2 раза, т.к. 1-я строка массива arr должна быть скопирована 2 раза в первую строку массива new_arr.

j = i % 2 - здесь работает примерно так: мы копируем в 0-ю строку массива new_arr 2 раза 0 % 2 = 0-ю строку массива arr. Потом в 1-ю строку new_arr копируем 2 раза 1 % 2 = 1-ю строку массива arr... Потом во 2-ю строку new_arr копируем 2 раза 2%2 = 0-ю строку массива arr... и т.д.
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание.
MooNDeaR вне форума
Старый 11.08.2011, 23:13   #5
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2Corvette
копирование можно переписать тк
Код:
for (k = 0; k <= 2; k += 2)
    for (i = 0, j = 0; i < 4; i++, j = i % 2)
        memcpy(&new_arr[i][k], arr[j], sizeof(arr[j]));
если так понятнее. т.е делим целевой массив на 2 столбца, сначала заполняем первый, потом второй. на основе этого можно уже написать нормальную, обобщенную функцию
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance

Последний раз редактировалось pproger; 11.08.2011 в 23:16.
pproger вне форума
Старый 12.08.2011, 00:38   #6
Corvette
Пользователь
 
Регистрация: 31.07.2011
Сообщений: 55
По умолчанию

Спасибо большое за объяснение Pproger и MooNDeaR!!!!! :-)

Код:
Код:
char new_arr[4][4] = { {0} };
Как я понимаю мы в новый массив сначала записываем нули?
Corvette вне форума
Старый 12.08.2011, 00:45   #7
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2Corvette
да, инициализируем нулями
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума
Старый 12.08.2011, 00:49   #8
Corvette
Пользователь
 
Регистрация: 31.07.2011
Сообщений: 55
По умолчанию

Еще раз спасибо за помощь и ответы на вопросы!!!
Corvette вне форума
Старый 12.08.2011, 17:36   #9
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

Цитата:
Сообщение от Corvette Посмотреть сообщение
Еще раз спасибо за помощь и ответы на вопросы!!!
Мне представляется, что вам дали совершенно неверные советы. Как я понимаю, от вас требовалось, используя циклы, именнно циклы, а не функции, переписать одну матрицу четыре раза в другую матрицу.
Поэтому правильное решение следующе. Сначала вы исходную матрицу переписываете два раза в первые две строки результирующей матрицы. А затем тоже самое делаете для двух последних строк результирующей матрицы. То есть у вас будет внешний цикл, где счетчик будет меняться от 0 до 1 включительно, и внутренний цикл, где счетчик будет меняться также от 0 до 1 включительно.

Примерный код на С будет выглядеть так

Код:
#include   <stdio.h>

#define   DIM_ONE    2
#define   DIM_TWO   4

int main( void )
{
   const  char a1 [DIM_ONE][DIM_ONE] = { { '-', '-' }, { '+', '+' } };
   char a2[DIM_TWO][DIM_TWO];
   int i, j, k, m;

   /* display out the source array */
   for ( i = 0; i < DIM_ONE; i++ )
   {
      for ( j = 0; j < DIM_ONE; j++ )
      {
         printf( "%c ", a1[i][j] );
      }
      printf( "\n" );
   }

   for ( i = 0; i < DIM_TWO; i += DIM_ONE )
   {
      for ( j = 0; j < DIM_TWO; j += DIM_ONE )
      {
         for ( k = 0; k < DIM_ONE; k++ )
         {
            for ( m = 0; m < DIM_ONE; m++ )
            {
               a2[i + k][j + m] = a1[i][j];
            }
         }
      }
   }

   /* display out the target array */
   for ( i = 0; i < DIM_TWO; i++ )
   {
      for ( j = 0; j < DIM_TWO; j++ )
      {
         printf( "%c ", a2[i][j] );
      }
      printf( "\n" );
   }

   return ( 0 );
}
Вот теперь можете говорить спасибо!
Со мной можно встретиться на www.clipper.borda.ru
Сыроежка вне форума
Старый 12.08.2011, 18:49   #10
MooNDeaR
В стагнации
Участник клуба
 
Аватар для MooNDeaR
 
Регистрация: 29.07.2011
Сообщений: 1,303
По умолчанию

Боже мой Что ж тут понаписано

Идею с функциями можно переписать и под циклы намного проще:

Код:
#include <iostream>
#include <cstdlib>

using namespace std;

int main(void)
{
	const int until = 2, after = 4;
	const char arr[until][until] = {{'-','-'},{'+','+'}};  //инициализируем массив
	char new_arr[after][after] = {0}			 //инициализируем новый массив нулями

	for(int i = 0; i < until; ++i)          //контрольный вывод массива arr
	{
		for(int j = 0; j < until; ++j)
			cout << arr[i][j] << ' ';
		cout << endl;
	}

	cout << endl;
	    
	for(int i = 0; i < after; ++i)         //непосредственно само заполнение new_arr
		for(int j = 0; j < after; ++j)
			new_arr[i][j] = arr[i%until][j%until];

	for(int i = 0; i < after; ++i)         //контрольный вывод new_arr
	{
		for(int j = 0; j < after; ++j)
			cout << new_arr[i][j] << ' ';
		cout << endl;
	}

	system("PAUSE");
}
P.S.
Абсолютно рабочий код. Без лишних функций.
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание.
MooNDeaR вне форума
Закрытая тема


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
указатели на массивы и массивы указателей blacktener Общие вопросы C/C++ 16 13.06.2011 20:45
Динамические массивы и массивы варианты N@stya Помощь студентам 0 11.06.2010 21:09
С++, Массивы, динамические массивы. -Sunshine- Помощь студентам 1 19.04.2010 02:17
Даны одномерные массивы А и В. Сформировать массивы, состоящие из элемент LyaLya Помощь студентам 15 20.12.2009 14:12
C++ и массивы StartMis Помощь студентам 4 19.12.2008 22:45