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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.11.2015, 22:26   #1
lHisoka
Новичок
Джуниор
 
Регистрация: 13.11.2015
Сообщений: 5
По умолчанию Дан 2-ух мерный массив. (новичок) - C++

Здравствуйте. Я только начал постигать язык С++ и остановился на одной задачи и не могу сдвинуться с места... Прочёл в 2-х книгах про массивы, но не могу понять алгоритма. В общем дело вот в чём.
Дан двумерный целочисленный массив А (N,N) . Элемент A(I,J) назовем особым, если он является числом Фибоначчи и сумма цифр этого числа – простое число. Удалить строки этого массива, в которых есть хотя бы один особый элемент

Я так понимаю, вот я создал 2-ух мерный массив:

Код:
#include <iostream>
#include "math.h"
#include "conio.h"
#include <iomanip>
using namespace std;


int main()
{
	int i, j;
	setlocale(LC_ALL, "Russian");
	int myArray[5][5]; // объявляем массив размером 5*5 элементов

	for (i = 0; i < 5; i++) {
		for (j = 0; j < 5; j++)
			myArray[i][j] = i + j; // каждому элементу присваиваем значение сумму текущих индексов элемента массива
	}
	printf("Вот такой массив у нас получился:\n");
	for (i = 0; i < 5; i++) {
		for (j = 0; j < 5; j++)
		{
			printf("[%d][%d]=%d ", i, j, myArray[i][j]);
		}
		int Prime(unsigned long a)
		{
			unsigned long i;
			if (a == 2)
				return 1;
			if (a == 0 || a == 1 || a % 2 == 0)
				return 0;
			for (i = 3; i*i <= a && a % i; i += 2)
				;
			return i*i > a;
		}
		long int Fib(int i)
		{
			int value = 0;
			if (i < 1) return 0;
			if (i == 1) return 1;
			return Fib(i - 1) + Fib(i - 2);
		}

		printf("\n");
	}
	getchar();
}
Пользуюсь Microsoft Visual Studio 2013 и в программе ошибки с синтаксисом... Я не понимаю как мне совместить так условие и проверку правильно и грамотно. Надеюсь на Вашу помощь.

З.Ы. Уже просто голова разрывается столько много информации, я просто не знаю, как это всё запомнить... Завёл конспект даже
lHisoka вне форума Ответить с цитированием
Старый 14.11.2015, 10:23   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Во-первых: Какие ошибки?
Во-вторых: Функции проверки на фибоначчи и простоту у тебя есть?
Если нет вот тебе проверка на простоту: http://www.programmersforum.ru/showp...6&postcount=38
А так можно проверить на вхождение в Фибоначчи: http://www.programmersforum.ru/showp...8&postcount=39
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.11.2015, 15:08   #3
lHisoka
Новичок
Джуниор
 
Регистрация: 13.11.2015
Сообщений: 5
По умолчанию

Я просто не понимаю, как нужно склеить:
двумерный массив + нахождение числа Фибоначчи и натурального одновременно + удалить в массиве строку. Как это должно выглядеть?
lHisoka вне форума Ответить с цитированием
Старый 14.11.2015, 15:31   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Например, так:
1) Завести счетчик количества оставшихся (после удаления) строк и инициализировать его нулем;
2) Написать цикл по строкам;
3) Написать внутренний цикл по столбцам;
4) Проверять, что текущий рассматриваемый элемент является числом Фибоначчи и сумма его цифр является простым числом;
5) Если условие выполнено, то закончить текущий цикл по столбцам и перейти к следующей строке;
6) Если условие не выполнено, то записать текущий элемент в строку с номером, равным текущему значению счетчика строк;
7) Если после цикла по столбцам условие ни разу не было выполнено, то увеличить счетчик строк.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 14.11.2015, 16:35   #5
lHisoka
Новичок
Джуниор
 
Регистрация: 13.11.2015
Сообщений: 5
По умолчанию

Я не понимаю...
1) Завести счетчик количества оставшихся (после удаления) строк и инициализировать его нулем;

Я могу написать двумерный массив в виде таблицы умножения например.
типо

Код:
#include <stdio.h>
#include <stdlib.h>
#include <iomanip>
using namespace std;

int main()
{
	int a[10][10];
	for (int i = 0; i < 10; i++)
	{
		for (int j = 0; j < 10; j++)
		{
			a[i][j] = (i + 1)*(j + 1);
		}
	}
	for (int i = 0; i < 10; i++)
	{
		for (int j = 0; j < 10; j++)
		{
			cout << setw(4) << a[i][j] << ' ';
		}
			cout << endl;
	}
	system("PAUSE >> VOID");
	return 0;
}
Это я по старым книгам...
2) Написать цикл по строкам;
3) Написать внутренний цикл по столбцам;


Получается вот по строчка и столбцам цикл:
Код:
for (int i = 0; i < 10; i++)
	{
		for (int j = 0; j < 10; j++)
4) Проверять, что текущий рассматриваемый элемент является числом Фибоначчи и сумма его цифр является простым числом;

При помощи этого кода, я смогу найти числа Фибоначчи? Как мне его разместить правильно?
В циклах со строчками и столбцами или же после циклов?

5) Если условие выполнено, то закончить текущий цикл по столбцам и перейти к следующей строке;


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

int z,k;

void FibList(int n){
 z=1;k=0;
 for(;n>0;n--){ //В цикле получаем n чисел Фибоначчи
     z+=k;//По уравнению где в которой каждое последующее число равно сумме двух предыдущих чисел
     k=z-k;//Вычисляем сумму двух предидущих, просто отнимая их от общей суммы
     printf("%d\t",z); //И выводим сие число
     //Если С++ то писать cout<<z<<'\t';
 } printf("\n");//Если С++ то писать cout<<endl;
}

void FibFindClose(int n){
 z=1;k=0;
 for(;z<=n;){ //В цикле получаем числа Фибоначчи пока очередное число меньше заданного
     z+=k;//По уравнению где в которой каждое последующее число равно сумме двух предыдущих чисел
     k=z-k;//Вычисляем сумму двух предидущих, просто отнимая их от общей суммы
 } printf("%d\t",z);//Если С++ то писать cout<<endl;
}


int main()
{
    FibList(10);//Ряд Фибоначчи
    FibFindClose(12); //Найти ближайшее число справа к указанному в ряду
    getchar(); //Если С++ то писать cin.get();
    return 0;
}

Я уже запутался. Пересмотрел все видио уроки с массивами, нашёл в литературе всё что связанно с массивами и у меня всё уже перемешалось...
Один пишет так, другой говорит по другому.
Знакомы и друзей нет, что бы мне хорошо объяснили и разжевали на примере, поэтому я обратился к профессионалам в этом деле.

З.Ы. Простите за назойливость.

Последний раз редактировалось lHisoka; 14.11.2015 в 17:09.
lHisoka вне форума Ответить с цитированием
Старый 14.11.2015, 16:52   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

"Один пишет так, другой говорит по другому." - ну да, но со временем выработается свое видение.
Набросок такой:
Код:
//пока константный размер
#define N 10

bool IsFib(int a) {
//...
}

bool IsPrime(int a) {
//...
}

int SumOfDigits(int a) {
//...
}

int main() {
    int A[N][N];
    //заполнение массива тут
    int saved_lines = 0;
    for (int i = 0; i < N; ++i) {
        bool need_save = true;
        for (int j = 0; j < N; ++j) {
            if (IsFib(A[i][j]) && IsPrime(SumOfDigits(A[i][j]))) {
                need_save = false;
                break;
            } else {
                A[saved_lines][j] = A[i][j];
            }
        }
        if (need_save)
            ++saved_lines;
    }
    //вывод первых saved_lines строк массива
    return 0;
}
Из вышеприведенной функции FibFindClose можно получить нужную IsFib, если после поиска ближайшего числа Фибоначчи вернуть в качестве результата работы функции результат сравнения исходного числа и полученного числа Фибоначчи.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 14.11.2015 в 16:56.
BDA на форуме Ответить с цитированием
Старый 15.11.2015, 13:33   #7
lHisoka
Новичок
Джуниор
 
Регистрация: 13.11.2015
Сообщений: 5
По умолчанию

Вообщем вот что у меня вышло за выходные.

Код:
#include <iostream> 
#include "math.h" 
#include "time.h" 
#include <string> 
#include <sstream> 

using namespace std;

const int N = 5;

bool simple(unsigned long chislo)
{
	if (chislo == 2)
	{
		return true;
	}

	if (chislo == 0 || chislo == 1 || chislo % 2 == 0)
	{
		return false;
	}

	for (unsigned long i = chislo; i * i <= chislo; i += 2)
	{
		if (chislo % i == 0)
		{
			return false;
		}
	}
	return true;
}

bool fibonachi(unsigned long n)
{
	unsigned long a, b(1), c(1);
	while (c < n)
	{
		a = b;
		b = c;
		c = a + b;
	}
	return c == n;
}

std::string to_string(unsigned long n)
{
	std::stringstream ss;
	ss << n;
	return ss.str();
}

unsigned long to_int(std::string s)
{
	std::stringstream ss(s);
	unsigned long n;
	ss >> n;
	return n;
}

int main(int argc, wchar_t argv[])
{
	setlocale(LC_ALL, "Russian");
	srand(time(NULL));
	int a[N][N];
	int f = 0, g = 0, max = 0;
	unsigned long int SP = 0;
	for (int i = 0; i<N; i++)
	{
		for (int j = 0; j<N; j++)
			a[i][j] = rand() % 89 + 10;
	}

	for (int i = 0; i<N; i++)
	{
		for (int j = 0; j<N; j++)
		{
			cout << a[i][j] << " ";
		}
		cout << endl;
	}

	cout << "\n";
	cout << "числа, удовлетворяющие условию: ";
	cout << "\n";

	while (max != 0)
	{
		for (int i = 0; i<N; i++)
		{
			for (int j = 0; j<N; j++)
			{
				string s(to_string(a[i][j])), s1, s2;

				s1 = s.substr(0, ceil(s.size() / 2));
				s2 = s.substr(s.size() / 2, s.size());

				if (simple(to_int(s1)) && fibonachi(to_int(s2)))
				{
					max = a[i][j];
					f = i;
					g = j;
				}
			}
		}
	}

	for (int i = 0; i<N; i++)
	{
		for (int j = 0; j<N; j++)
		{
			string s(to_string(a[i][j])), s1, s2;

			s1 = s.substr(0, ceil(s.size() / 2));
			s2 = s.substr(s.size() / 2, s.size());

			if (simple(to_int(s1)) && fibonachi(to_int(s2)))
			{
				cout << " " << a[i][j] << " ";
				if (max < a[i][j])
				{
					max = a[i][j]; //Элементы тут
					f = i; //Координаты
					g = j;
				
				}
			}
		}
	}

	cout << "\n";
	cout << "Максимальный элемент = " << max << "\n Находящийся на позиции [" << f + 1 << "][" << +1 << "]";
	cout << "\n";
	cout << "Произведение элементов:";
	cout << "\n";
	
	/*for (int i=1; i<N; i++)
	{
		a[i][g] = a[i + 1][g];
	}
	for (int i = 1; i<N; i++)
	{
		a[f][i] = a[f][i + 1];
	}

	for (int i = 0; i<N; i++)
	{
		for (int j = 0; j<N; j++)
		{
			cout << a[i][j] << " ";
		}
		cout << endl;
	}
	*/

	cout << "Удаление строки " << f + 1 << " и столбца " << g + 1 << endl;
	for (int i = f + 1; i<N; i++)
		for (int j = 0; j<N; j++)
			a[i - 1][j] = a[i][j];
	for (int i = 0; i<N; i++)
		for (int j = g + 1; j<N; j++)
			a[i][j - 1] = a[i][j];
	m = N - 1;
	for (int i = 0; i<m; i++)
	{
		for (int j = 0; j<m; j++)
		{
			cout << a[i][j] << " ";
		}
		cout << endl;
	}

	cout << "Скалярное произведение = " << SP;
	cout << "\n";
	system("pause");
}
Вот только у меня ошибка с удаление строки, я хз почему "m" подчёркивает и почему там число 2 как 1 считается. Подскажите пожалуйста.

[IMG][/IMG]
lHisoka вне форума Ответить с цитированием
Старый 15.11.2015, 14:51   #8
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Переменная m не объявлена (как указывает и сама студия). Про «2 как 1» не понял вопроса.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 15.11.2015, 14:59   #9
lHisoka
Новичок
Джуниор
 
Регистрация: 13.11.2015
Сообщений: 5
По умолчанию

Всё, разобрался, спасибо большое

Подчистить осталось
Изображения
Тип файла: jpg Снимок.jpg (20.9 Кб, 120 просмотров)

Последний раз редактировалось lHisoka; 15.11.2015 в 15:15.
lHisoka вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
2-мерный массив, максимум Midnight Kid C++ Builder 1 15.05.2015 20:40
1 мерный массив с++ rafael999 Помощь студентам 1 02.11.2013 18:10
Трех мерный массив bondik Общие вопросы .NET 2 09.11.2010 14:23
2-мерный массив Golovastik PHP 1 30.06.2010 23:13
N мерный массив Лубышев Общие вопросы Delphi 3 08.05.2009 12:12