Programiranje

Programiranje u C++-u - pitanja i odgovori

Teofil čet 27.2.2020 22:03

Pozdrav,

Zanima me gdje sam pogrijesio u kodu.
Cilj zadatka je da provjeri da li se matrica b[m2][n2] nalazi u matrici a[m1][n1]

 

#include <stdio.h>
using namespace std;

int m1,n1,m2,n2;
int a[10][10];
int b[10][10];

int provjera(int i,int j)
{
int k,l,v=0;
for(k=1;k<=m2;k++)
for(l=1;l<=n2;l++)
if(a[i+k-1][j+l-1]==b[k][l])
v=v+1;
if(v==m2*n2) return 1;

}

main()
{
int i,j,t;
t=0,
scanf("%d %d",&m1,&n1);

for(i=1;i<=m1;i++)
for(j=1;j<=n1;j++)
{
scanf("%d",&a[i][j]);
}

scanf("%d %d",&m2,&n2);

for(i=1;i<=m2;i++)
for(j=1;j<=n2;j++)
{
scanf("%d",&b[i][j]);
}

for(i=1;i<=m1-m2+1;i++)
for(j=1;j<=n1-n2+1;j++)
t=provjera(i,j);

if(t==1) printf("DA");
else printf("NE");

return 0;
}

general_šu sub 29.2.2020 19:36

main()
{
   char x = 'x';
   int broj;
   int counter = 0;

   cout << "Unesi jedan broj: ";
   cin >> broj;

 

   for(int i = 0; i < broj; i++)
   {
     for (int i = 0; i < broj; i++)
     {
       cout << x;
     }
     cout << endl;
     broj -= 2;
     counter++;
     for (int k = 0; k < counter; k++)
     {
       cout << " ";
     }
   }

}

Zasto mi vanjska petlja ne ide do kraja?

Output je ovakav, trebao bi ići do kraja, sa while petljom ide, ali nije mi jasno zasto ovaj kod ne radi kako sam zamislio.

xxxxxxx

 xxxxx

  xxx

CyberDemonVZ ned 1.3.2020 14:19
general_šu kaže...

Popravio sam, opet neće.

 Onda pogledam kad navečer dođem do kompa..

Edit:

Problem je vjerojatno što za vrijeme petlje smanjuješ broj.

Opiši riječima što želiš postići programom.

 

I pogledam i onaj gore zadatak.

CyberDemonVZ ned 1.3.2020 18:19
general_šu kaže...

Popravio sam, opet neće.

Hoćeš dobiti obrnuti trokut s bazom onolikom koliki broj uneseš?

 

 

 Ti kad smanjujes "broj" smanjuješ ga i u unutarnjoj i vanjskoj petlji, pa ti ne broji dovoljno dugo da završi vanjsku petlju.

 

Možeš npr poslije unosa broja dodati   int brojac=broj; i onda vanjsku petlju promijeniti u:

for(int i = 0; i < (brojac/2)+1; i++)

 

 

/2 je zato jer redova ima duplo manje nego je brojeva, a +1 zbog zaokruživanja kod neparnih brojeva kad djeliš s 2.

malak ned 22.3.2020 17:29

Buduci da je karantena u tijeku, odlucio sam mao pojacati ucenje C++. Cisto u svrhu vjezbe, pokusavam napraviti jednostavnu String klasu i ne mogu pronaci problem pa ako ima jos netko sa viskom vremena da malo pregleda.

Ako je code prevelik neka admini kazu pa cu uploadati negdje na net. 

 

Header file:

#ifndef EX_13_44_H
#define EX_13_44_H

#include <memory>
#include <initializer_list>
#include <string>

#include <memory>
#include <algorithm>

class String
{
public:
//constructors and destructor
String() : String("") {}
String(const char*);
String(const String&);
String& operator=(const String&);
~String();

// member functions
const char* c_str() const { return first_element; }
std::size_t size() const { return end - first_element; }
std::size_t length() const { return end - first_element - 1; }

private:
std::pair<char*, char*> alloc_n_copy(const char*, const char*);
void range_initializer(const char*, const char*);
void free();

private:
std::allocator<char> alloc;

char* first_element;
char* end;
};

 

#endif // !EX_13_44_H

 

 

Source file:

#include "ex13.44.h"
#include <iostream>

std::pair<char*, char*> String::alloc_n_copy(const char* b, const char* e)
{
auto str = alloc.allocate(e - b);
return { str, std::uninitialized_copy(b, e, str) };
}

void String::range_initializer(const char* first, const char* last)
{
auto newstr = alloc_n_copy(first, last);
first_element = newstr.first;
end = newstr.second;
}

String::String(const char* s)
{
char* s1 = const_cast<char*>(s);
while (*s1)
++s1;
range_initializer(s, ++s1);
std::cout << "String(const char*) called" << std::endl;
}

String::String(const String& rhs)
{
range_initializer(rhs.first_element, rhs.end);
std::cout << "Copy constructor called" << std::endl;
}

void String::free()
{
while (first_element)
{
std::for_each(first_element, end, [this](char& c) { alloc.destroy(&c); });
}
alloc.deallocate(first_element, end - first_element);
std::cout << "Destructor called" << std::endl;
}

String::~String()
{
free();
}

String& String::operator=(const String& rhs)
{
auto newstr = alloc_n_copy(rhs.first_element, rhs.end);
free();
first_element = newstr.first;
end = newstr.second;
std::cout << "Copy assignment called" << std::endl;

return *this;
}

 

I main.cpp :

#include <iostream>
#include <vector>

#include "ex13.44.h"

void foo(String x)
{
std::cout << x.c_str() << std::endl;
}

void bar(const String& x)
{
std::cout << x.c_str() << std::endl;
}

String baz()
{
String ret("World");
return ret;
}


int main()
{
char text[] = "world";

String s0;
String s1("hello");
String s2(s0);
String s3 = s1;
String s4(text);

s2 = s1;

foo(s1);
bar(s1);
foo("temporary");
bar("temporary");

return 0;
}
/*
s2 = s1;

foo(s1);
bar(s1);
foo("temporary");
bar("temporary");

String s5 = baz();

std::vector<String> svec;
svec.reserve(8);
svec.push_back(s0);
svec.push_back(s1);
svec.push_back(s2);
svec.push_back(s3);
svec.push_back(s4);
svec.push_back(s5);
svec.push_back(baz());
svec.push_back("good job");

for (const auto& s : svec)
std::cout << s.c_str() << std::endl;

return 0;
}
*/

 

U konstruktore sam postavio ostream da vidim kada se sta poziva, ali nakon sto proslijedim text kod s4 zablokira, pretpostavljam nekakav infinite loop, ali ne vidim gdje bi mogla biti greska.

 

nibble sub 28.3.2020 19:03

Malo si usro šefa i stanicu... evo ti "nekakvo" rješenje. Nije idealno iz bezbroj razloga, no ipak bolje od prve verzije...

 

#ifndef EX_13_44_H
#define EX_13_44_H

 

#include <memory>

 

class String
{
public:
//constructors and destructor
String() = default;
String(const char*);

 

String(const String&);
String& operator=(const String&);

 

// member functions
const char* c_str() const { return count ? first_element.get() : nullptr; }
std::size_t size() const { return count; }
std::size_t length() const { return count ? count - 1 : 0; }

 

private:
std::size_t count{};
std::unique_ptr<char[]> first_element;
};

#endif // !EX_13_44_H

 

cpp

 

#include "String.h"


String::String(const char* s)
:
count( strlen( s ) + 1 ),
first_element(std::make_unique<char[]>( count ) )
{
   memcpy( first_element.get(), s, count );
}


String::String(const String& s)
:
count( s.count )
{
   if( count )
   {
     first_element = std::make_unique<char[]>( count );
     memcpy( first_element.get(), s.c_str(), count );
   }
}


String& String::operator=(const String& s)
{
   if( this != &s )
   {
     if( s.size() > count )
       first_element = std::make_unique<char[]>( s.size() );

     count = s.size();
     memcpy( first_element.get(), s.c_str(), count );
   }

   return *this;
}

 

I možda u main() želiš ovo:

 

for (const auto& s : svec)
   std::cout << ( s.length() ? s.c_str() : "" ) << std::endl;

Dex.pwn ned 29.3.2020 13:17

Za Arduino kod:

S malloc alociram 256+1 bajt, kastriram ga na char* te s memsetom postavim bajtove na \0
Kod "trpanja" bajtova dolazi do problema nakon 10 upisanih znakova.
Zašto?
Char je 1 bajt, a Char* su 2 bajta.

Upis znaka u memoriju ide ovim putem

*(buffer + buffIdx++) = incomingByte;
Gdje je buffIdx koji broji index bajta, kreće od nule.

Sve radi okej ako je ispod 10-11 znakova, nakon toga idu problemi. Zašto? Što krivo radim?

PzKpfw ned 29.3.2020 19:45

 

 

Drugovi ovo je banalno, ali dal' mi netko može pomoći, jer sam malo smušen baš u vezi ovo koda dole.

Naime, treba 'l" (vektor) natjerati da ga vidi funkcija mojNacin. Nemrem više misliti....

 

#include <list>
#include <iostream>
using namespace std;


void ispis(const list<int>& li) {

for (list<int>::const_iterator x = li.begin(); x != li.end(); x++)
cout << *x << ' ';
cout << endl;
}

 

bool mojNacin(const int& a, const int& b) {
if (a&l && !(b&l)) return true;
if (!(a&l) && b&l) return false;
return a<b;

}

 

 


int main() {

list <int> l;


for (int i=0; i < 15; i++)
l.push_back(i);

ispis(l);
l.sort(mojNacin);
ispis(l);

 

 

cout << "\n";
system("pause");
return 0;
}

nibble ned 29.3.2020 23:40
PzKpfw kaže...

 

 

Drugovi ovo je banalno, ali dal' mi netko može pomoći, jer sam malo smušen baš u vezi ovo koda dole.

Naime, treba 'l" (vektor) natjerati da ga vidi funkcija mojNacin. Nemrem više misliti....

 

#include <list>
#include <iostream>
using namespace std;


void ispis(const list<int>& li) {

for (list<int>::const_iterator x = li.begin(); x != li.end(); x++)
cout << *x << ' ';
cout << endl;
}

 

bool mojNacin(const int& a, const int& b) {
if (a&l && !(b&l)) return true;
if (!(a&l) && b&l) return false;
return a<b;

}

 

 


int main() {

list <int> l;


for (int i=0; i < 15; i++)
l.push_back(i);

ispis(l);
l.sort(mojNacin);
ispis(l);

 

 

cout << "\n";
system("pause");
return 0;
}

 

Lista, odnosno njena sort metoda vidi "mojNacin", ali si imaš undeclared identifier 'l' u funkciji mojNacin.

Šta bi 'l' uopće trebao biti?

nibble pon 30.3.2020 01:02

Najjednostavniji način je da 'l' bude globalna varijabla (definirana ispred mojNacin).

Ali, to se i dalje neće kompajlirati.

 

P.S.

Ako je to zaista iz knjige, baci knjigu u smeće.

 

P.S.#2

Ono što više ima smisla da 'l' nije malo slovo L, već broj 1 (jedan). Tada kod ima smisla.

nibble pon 30.3.2020 09:35
CyberDemonVZ kaže...
nibble kaže...

...

 

P.S.

Ako je to zaista iz knjige, baci knjigu u smeće.

 

....

 Možda je samo za vježbu?

Namjerno napisano s greškom ili djelomično da korisnik sam ispravi?

Ako autor knjige potiče varijable čije ime se sastoji od jednog znaka, onda je knjiga za smeće.

Iznimka je counter/index u petlji.

malak pon 30.3.2020 11:17
nibble kaže...
malak kaže...

Obo se jednostavno rijesi koridteci predicate.

https://en.cppreference.com/w/cpp/concepts/predicate

 S tim da treba koristiti std:bind.

 

Nspisem kod kasnije na mobu sam trenutno.

Nikakav predicate. Ne razumiješ problem.

 

P.S.

Danas, kad postoje lambde, std::bind gubi smisao.

 

Mozda nisam razumio sta mu treba, ali kako je rekao da uci iz knjige pretpostavljam da nije cilj koristiti lambdu. Ako sam dobro shvatio treba sortirati listu koristeci korisnicki definiranu funkciju.

 

#include <list>
#include <iostream>
#include <algorithm>

void ispis(const std::list<int>& li)
{
  for (const auto& el : li)
  std::cout << el << " ";
  std::cout << std::endl;
}

bool mojNacin(int a, int b)
{
  return (a < b) ? true : false;
}

int main()
{
  std::list<int> lis = { 2, 5, 7, 1, 6, 3 };

  ispis(lis);
  lis.sort(mojNacin);
  ispis(lis);

  return 0;
}

nibble pon 30.3.2020 14:14

Ne, nisi skužio.... on ima sve, samo je umjesto broja jedan koristio malo slovo "L". Zato mu primjer ne radi.

 

 

Lambda mu je puno korisnija, pogotovo ako jednog dana misli živjeti od programiranja. Tada ovakvi primjeri sa funkcijama često ne prolaze.

PzKpfw pon 30.3.2020 16:02

 

Da, to je to. Hvala, ljudi!
Kao, prvo hvala svima koji su pridonijeli svojim komentarima za pronalazak rješenja ovoga zadatka, te koji su
dodatno obrazložili materiju.

Radi se o mojoj greški što sam u kodu umjesto "1" (broj jedan), stavio slovo "l" (malo slovo L). Taj sam
kod pisao prije par dana, te sam svašta isprobavao, mislim čak i ovo sa jedinicom, ali nisam uspio
dobiti valjano rješenje. Stoga su mi vaši komentari pomogli da shvatim svoju grešku.

 

Radi se o knjizi "Napredno programiranje i algoritmi u C-u i C++u". Autor je Domagoj Kusalić.
Ima brdo materijala od C++, što u print izdanju, što u e-izdanju.
Knjiga mi je vrlo dobra. I problem nije bio u knjizi, nego u meni.

 

Evo i rješenja problema sa izlazlnim rezultatima:

 

nibble pon 30.3.2020 22:19
Dex.pwn kaže...
Nemam problem s l, već s mallocom. Zamijenio si me, ja sam onaj koji kastrira varijable 😅

 U liniji:

if (buffIdx < (buffAlloc - 1))

 

-1 ti je suvišan. Btw, komentirana linija ti je brža od ove druge.

 

Pointer na funkciju 'func', je li uvijek ista funkcija ili ih imaš više? Što radi ta funkcija? Možeš to pokazat?

 

Što radi dump()? Kod?

 

Čini se da ti neke od tih funkcija sjebu ili buffer, ili buffIdx/buffAlloc, jer su oba mutable. Kod koji si pokazao do sada ti ne radi probleme.

 

P.S.

U C++ si, a trošiš malloc()? unique_ptr<>, ništa?

Dex.pwn pon 30.3.2020 23:56

https://pastebin.com/sgDNtLLi

 

func je pointer na funkciju koja se pokreće kad buffer dođe do LF(\n). Ta funkcija može bilo šta raditi s bufferom. Buffer je inače u publicu, dok su ostale varijable u privateu.

Dump postavlja bajtove na \0(čisti buffer)

Znam samo za NULL, malloc, calloc. Iskreno C/C++ mi je ko bosanski i hrvatski. Isti k.

 

Jedini problem koji bi mogao biti je taj što objekt kreiram na globalnoj razini, a samim time i alociranje.

Budem pokušao alocirati memoriju iz setup funkcije, mada mislim da to nije problem.

Prije sam koristio komentiran kod. Mislio sam da je u njemu problem pa sam napisao drugačiji način za pristupiti bajtu.

 

Budem i s C++ načinom pokušao alocirati memoriju. RAM-a, iako ga imam 2kB na raspolaganju, imam preko 1kB slobodno. To ne bi trebao biti problem.

 

nibble uto 31.3.2020 00:41
Dex.pwn kaže...

https://pastebin.com/sgDNtLLi

 

func je pointer na funkciju koja se pokreće kad buffer dođe do LF(\n). Ta funkcija može bilo šta raditi s bufferom. Buffer je inače u publicu, dok su ostale varijable u privateu.

Dump postavlja bajtove na \0(čisti buffer)

Znam samo za NULL, malloc, calloc. Iskreno C/C++ mi je ko bosanski i hrvatski. Isti k.

 

Jedini problem koji bi mogao biti je taj što objekt kreiram na globalnoj razini, a samim time i alociranje.

Budem pokušao alocirati memoriju iz setup funkcije, mada mislim da to nije problem.

Prije sam koristio komentiran kod. Mislio sam da je u njemu problem pa sam napisao drugačiji način za pristupiti bajtu.

 

Budem i s C++ načinom pokušao alocirati memoriju. RAM-a, iako ga imam 2kB na raspolaganju, imam preko 1kB slobodno. To ne bi trebao biti problem.

 

Možda je problem u void (*func)() onda, jer kažeš da može raditi bilo što s bufferom. Definiraj "bilo što". Može li osloboditi buffer?

Ako ti paše malloc, fine, samo to znači da moraš ručno zvati i free(). Ne samo to, nego ti malloc ne može izvršiti kod u konstruktoru (u tvojem primjeru nebitno).

 

Iako je C podskup od C++ i dijele sintaksu, odnosno dio sintakse, C i C++ su dva totalno različita jezika.

 

Globalno/lokalno, nebitno.

 

Alociranje memorije ti nije problem, tako da je nebitno kako alociraš. unique_ptr<> sam ti spomenuo jer je to smart pointer i nešto, što se koristi u C++ danas u ovakim situacijama.

 

Dex.pwn uto 31.3.2020 07:43

Da, mogu osloboditi buffer, mogu ga usporediti s nečim i tako. U ovom slučaju ga samo ponovno ispisujem(echo radim)

Kako misliš da ne može izvršiti kod u konstruktoru? Free zovem u dekonstruktoru samo.