Премини към съдържанието
Форумът в приложение

По-лесно сърфиране. Научи повече.

Kaldata.com - Форуми

Приложение на форума на цял екран с push известия, значки и други.

За да инсталирате това приложение на iOS и iPadOS
  1. Докоснете Иконата за споделяне в Safari
  2. Превъртете менюто и докоснете Добавяне към началния екран.
  3. Докоснете Добавяне в горния десен ъгъл.
За да инсталирате това приложение на Android
  1. Докоснете менюто с 3 точки (⋮) в горния десен ъгъл на браузъра.
  2. Докоснете Добавяне към началния екран или Инсталиране на приложение.
  3. Потвърдете, като докоснете Инсталиране.

Добре дошли!

Добре дошли в нашите форуми, пълни с полезна информация. Имате проблем с компютъра или телефона си? Публикувайте нова тема и ще намерите решение на всичките си проблеми. Общувайте свободно и открийте безброй нови приятели.

Моля, регистрирайте се за да публикувате тема и да получите пълен достъп до всички функции.

 

С++ въпрос за масив..

Featured Replies

Здравейте, нуждая се от помощта ви зе една задача по програмиране. Ето и условието: Да се напише програма, която въвежда от клавиатурата цяло число n и след него - m на брой цели числа. Програмата проверява има ли измежду тях последователни равни числа и извежда YES или NO в съответния случай. Първи пример: 4 3, 7, 2, 3 No Втори пример: 7 15, 2, 2, 2, 4, 2, 19 YES Това е което съм написал: #include <iostream.h> int main() { int n, m[15]; cout<<"n=";cin>>n; for(int i=0;i<n;i++) cin>>m[n]; for(int r=1;r<=15;r++) //очевидно е че грешката е тук { for(int x=2;x<=15;x++) //и тук { if(m[r]==m[x])cout<<"YES"<<endl; else cout<<"NO"<<endl;} } return 0; } Въпроса ми е как мога да мога да направя съответната проверка за последователните елементи от масива? Благодаря предварително.

Въпроса ми е как мога да мога да направя съответната проверка за последователните елементи от масива?

Благодаря предварително.

Примерен алгоритъм за сравняване е да тръгнеш от елемент 1 в array m и докато не стигнеш до елемент (n - 1) да сравняваш m със m[i - 1], където "i" ти е loop variable-a.

Понеже не си написал максималният брой елементи, които могат да се сравняват, програмата не използва pre-allocated memory за m, т.е нямаш дефиниция от сорта на:

int m[15];

Вместо това "m" е дефиниран като поинтер, а паметта се allocate-ва, когато потребителя е въвел (n > 0). В края на програмата паметта заета от "m" трябва да се освободи с

free(m);

Ако не знаеш нищо за поинтери все още, то тогава разкарай "free(m);" и "m = (int*)malloc(n * sizeof(int)); // allocate memory for the input array" и промени дефиницията на "m" на "int m[20];". Тогава обаче ще трябва да проверяваш дали числото въведено от потребителя не е е случайно > от 20, за да избегнеш buffer overrun грешката в по нататъшните "for" loop-ове.

if ((n < 1) && (n > 20)) {
    cout << "n must be >= 0 and n <= 20";
    return -1;
}

#include <iostream>
#include <string.h>

using namespace std;

int main()
{
    int n;
    int i;
    int *m;
    bool found = false; // used in the comparison loop
    
    cout << "n =  "; cin >> n;
    
    // check whether n >= 0 and exit if not
    if (n > 0) {
        m = (int*)malloc(n * sizeof(int)); // allocate memory for the input array
    } else {
        cout << "n must be >= 0";
        return -1;
    }
    
    // read n numbers from the input and save them in m[]
    for (i = 0; i < n; i++) {
        cin >> m[i];
    }
    
    // compare the elements starting from element 1 and going to element < n
    for (i = 1; i < n; i++) {
        if (m[i] == m[i - 1]) {
            found = true;
            break;
        }
    }
    
    if (found) {
        cout << "YES" << endl;
    } else {
        cout << "NO" << endl;
    }
    
    free(m); // free the memory allocated with malloc
    
    return 0;
}
  • Автор

Благодаря за помощта!! Имам само един въпрос... за какво се използва " * "?

gueswho се е опитал в 10 реда да ти преподаде материала за динамична памет, но ще ти се наложи да почетеш повече! Освен това по необясними за мен причини хем пише на C++, пък използва malloc()/free() вместо new/delete?!? И алгоритъмът му не е съвсем коректен понеже сравнява само съседни елемент!

Ако въведеш: 1 2 3 4 2

в неговата програма ще ти изкара "NO"!

За това предлагам вложени цикли:

// Dev-C++ 4.9.9.2
#include <iostream> // I/O
using namespace std;

int main()
{
	int n = 0;
	
	while (n <= 0) {
		cout << "n = ";
		cin >> n;
	}
	int * m = new int [n];
	for (int i = 0; i < n; ++i)
		cin >> m[i];

	for (int r = 0; r < n-1; ++r) {
		for (int x = r+1; x < n; ++x) {
			if (m[r] == m[x]) {
				cout << "YES" << endl;
				delete [] m;
				return 0;
			}
		}
	}
	cout << "NO" << endl;
	delete [] m;
	return 0;
}
А за какво служи звездичката, почвай да четеш за указатели, една от най-големите болки за начинаещите програмисти, а чак след това за динамична памет!
  • Автор

gueswho се е опитал в 10 реда да ти преподаде материала за динамична памет, но ще ти се наложи да почетеш повече! Освен това по необясними за мен причини хем пише на C++, пък използва malloc()/free() вместо new/delete?!? И алгоритъмът му не е съвсем коректен понеже сравнява само съседни елемент!

Ако въведеш: 1 2 3 4 2

в неговата програма ще ти изкара "NO"!

За това предлагам вложени цикли:

// Dev-C++ 4.9.9.2
#include <iostream> // I/O
using namespace std;

int main()
{
	int n = 0;
	
	while (n <= 0) {
		cout << "n = ";
		cin >> n;
	}
	int * m = new int [n];
	for (int i = 0; i < n; ++i)
		cin >> m[i];

	for (int r = 0; r < n-1; ++r) {
		for (int x = r+1; x < n; ++x) {
			if (m[r] == m[x]) {
				cout << "YES" << endl;
				delete [] m;
				return 0;
			}
		}
	}
	cout << "NO" << endl;
	delete [] m;
	return 0;
}
А за какво служи звездичката, почвай да четеш за указатели, една от най-големите болки за начинаещите програмисти, а чак след това за динамична памет!

Ми точно така както той я е написал, така трябва да работи. Само ако са съседни и се равни трява да изважда "YES".

...И алгоритъмът му не е съвсем коректен понеже сравнява само съседни елемент!...

Алгоритъмът е коректен, изрично се търсят еднакви стойности на последователно въведените числа. Не е необходимо да се усложнява допълнително алгоритъма, ако условието не го изисква. Аз, дори бих махнал втория цикъл и проверката ще я правя в цикъла, в който се въвеждат числата - за всеки елемент след първия ще сравнявам с предишния. Нещо повече, задачата е решима и без масив. Условието на задачата (поне така както е дадено) не налага използването му - просто трябва да се помни предишното число и да се сравнява с текущото.

gueswho се е опитал в 10 реда да ти преподаде материала за динамична памет, но ще ти се наложи да почетеш повече! Освен това по необясними за мен причини хем пише на C++, пък използва malloc()/free() вместо new/delete?!? И алгоритъмът му не е съвсем коректен понеже сравнява само съседни елемент!

Това, което съм направил е да дам едно коректно решение на проблема, заедно с указание как да се промени решението, ако съответния човек не разбира все още нищо от поинтери (случва се. Все пак в училище това е темата, която всички отбягват).

Относно malloc()/free(): Ако стандарта не го забранява и знаеш как да го ползваш - ползвай го. Да не говорим, че утре някой ще поиска решение на подобна задача на Ц. Просто трябва тогава да се заменят само "cin/cout", което може да го направи всеки начинаещ. Да не говорим, че не всеки би разбрал/прочел как работи оператора new[] и че за да е коректен кода ще трябва още и bad_alloc exception try/catch block. Това е моето мнение.

А ти седни ако обичаш и разгледай много внимателно стандартната библиотека на Ц/Ц++ и виж какво има в нея и как се използва.

New operator for arrays

cstdlib - malloc()

  • Автор

С удоволствие бих седнал, но напоследък не ми остава никакво време от Cisco. А относно C++ сме го учили 1 срок и то не сериозно, и когато помолих госпожата за помощ по задачата не можа да ми помогне... Аз каквото съм научил до сега на С++ е било от клипове, блогове и виртуални учебници а не от училище.

Архивирана тема

Темата е твърде стара и е архивирана. Не можете да добавяте нови отговори в нея, но винаги можете да публикувате нова тема, в която да продължи дискусията. Регистрирайте се или влезте във вашия профил за да публикувате нова тема.

Разглеждащи това в момента 0

  • Няма регистрирани потребители разглеждащи тази страница.

Дарение

  • Подкрепи съществуването на форума - направи дарение
    32%
    Дарени 315 € от нужните 1 000 €

Бюлетин

Получавайте известие, когато има важна промяна или новина свързана с форума.

Профил

Навигация

Търсене

Търсене

Конфигуриране на push известия в браузъра

Chrome (Android)
  1. Докоснете иконата на катинар до адресната лента.
  2. Докоснете Разрешения → Известия.
  3. Променете предпочитанията си.
Chrome (Desktop)
  1. Кликнете върху иконата на катинар в адресната лента.
  2. Изберете Настройки на сайта.
  3. Намерете Известия и коригирайте предпочитанията си.