Programiranje u C++-u - pitanja i odgovori
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
Imaš isti brojač (i)!
Stavi j u drugu.
Popravio sam, opet neć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.
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.
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.
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;
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?
Možda zato jer ga "kastriraš"
Moraš pokazati konkretan kod, jer je kristalna kugla trenutno na remontu.
Ali očito je da nemaš onoliko mjesta, koliko koristiš.
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;
}
Pointer?
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
Lista koja se sortira prema posebnom načinu kako je u funkciji opisano.
Kod nije moj, nego iz jedne knjige.
Ne žikim šta trebam učiniti da fja 'mojNacin' vidi 'l'?
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.
...
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?
...
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.
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.
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.
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;
}
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.
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:
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?
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.
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.
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.
Jednostavno, malloc ne izvršava kod u konstruktoru.
Stoga, s malloc ne možeš kreirati instancu SBuff-a na heapu.
To je onda bitno u ovom slučaju, zar ne?
Ako je isti kreiran na globalnoj razini.
Da li new[] može kreirati na globalnoj razini?
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;
}