A connection string u toj ado komponenti ima relativnu ili punu putanju? Ako je puna putanja onda se ona mora maknuti, a zatim tu punu putanju maknuti i tamo gdje se definira prijevod (potražiti i tamo connection string).
Programiranje u C++-u - pitanja i odgovori
- poruka: 7.285
- |
- čitano: 1.712.417
- |
- moderatori:
Lazarus Long, XXX-Man, vincimus
- +/- sve poruke
- ravni prikaz
- starije poruke gore
Putanja je bila relativna, ali izgleda da nesto nije stimalo sa njom u prijevodima. Nanovo sam definirao putanju do baze (relativnu, sve isto kao i prvi puta) i proradilo je :)
Hvala profesore ;)
Pozdrav! Bilo bi mi od velike pomoći kad bi mi netko riješio ovaj zadatak, puno hvala. :)
Napiši rekurzivnu funkciju koja računa n-ti član niza i rekurzivnu
funkciju koja računa zbroj članova do n-tog uključujući i njega. U
glavnom programu učitaj n pa ispiši n-ti član i zbroj n članova.
U pravilu ne daje se gotov kod, nego smjernice za riješiti zadatak.
Dakle, pošto se radi o rekurziji, ovdje bi bilo idealno primjeniti aritmetiku pokazivača.
int rek(int* niz, int n)
{
if (n == 0) return *niz;
rek((niz+1), n-1);
}
U funkciji rek koja ima parametre pokazivač na niz i n sa svakim pozivom pomičeno pokazivač i smanjujemo n, kad n dođe do 0, vraća se vrijednost niza na koju pokazuje pokazivač, a to je n.
Drugi pokušaj istim konceptom, sa funkcijom koja ima iste parametre. Kad dođe do n = 0 vrati 0, inače vrati vrijednost na trenutnom pokazivaču koju zbrajaš sa vrijednosti iznad koja je na sljedećem pokazivaču.
Dakle, sa vha stoga zbrajaš vrijednosti, kad se skine cijeli stog, imaš sumu niza do n.
Ovako, napravio sam klasu Konto koja provjerava stanje na kontu, omogucuje transakcije, i izbacuje broj transakcija. Dosao sam do zadatka gdje trebam uvrsiti operator+. Treba uvrsiti
k1 = k + 2 -- to dupla stanje na kontu,
k2 = 7 + k -- povecava stanje na kontu 7 puta.
Upisao sam obicnu metodu int operator+ ...... u klasu Konto, i ona uspijeva ali do pola, tj moze uraditi ovo k + 2, ali ne moze 7 + k. Tu treba sada globalna funkcija koju ja nikako ne mogu da povezem.
Ja sam to zamislio kao:
Konto operator+ (varijabla stanjeKonta koju ne znam da povezem sa istom, i varijabla vrijednost (to je ova sedmica))
{
int neu;
neu = stanjeKonta * vrijednost;
return neu;
};
i to sam pisao van granica klase konto. Pokusao sam na razne nacine ali ne znam sta moram uraditi da dovedem ovu varijablu stanjeKonta i varijablu vrijednost u ovu funkciju, i da napravim ovo da funkcionise. Dobro bi mi dosla necija pomoc. Unaprijed sam zahvalan.
1. Moras deklarirat taj globalni operator kao friend operator od klase Konto.
Znaci unutar klase imas deklaraciju:
friend Konto operator+(const int value, const Konto& K);
2. Ne koristis varijablu stanjeKonta, vec objekt klase Konto. Kada si napravio operator+ unutar klase za koji kazes da radi pola posla, on ima implicitni parametar "this" koji je pokazivac na samog sebe. Dakle njegov tip je 'Konto', isto tako trebas i tu.
3. Valjda bi prvi argument trebala biti vrijednost, dakle ta sedmica, inace je isto kao da si implementirao kao operator klase.
4. Tvoj operator u definiciji kaze da vraca tip 'Konto', a unutar funkcije vracas int?? Obzirom na pitanje, sumnjam da imas definiran operator implicitne konverzije klase Konto u tip 'int', pa ti ovo nece ni kompajler dopustit.
Moras imat nesto tipa
Konto result;
result.stanjeKonta = (kombinacija ona dva)
return result;
5. "k + 2" i "7 + k" kreiraju privremeni objekt tipa Konto i pridruzuju ga (assign) objektu na lijevoj strani. Osim ako klasa nije trivijalna sto se tice privatnih varijabli, ovo znaci da bi trebao imat definiran assignment operator, dakle "Konto& operator=(const Konto&);"
6. friend funkcije se obicno nastoji izbjeci sto vise, jer stete enkapsulaciji. Ovdje to mozes ovako:
Konto operator+(const int stanje, const Konto& K)
{
return K+stanje;
}
T.j., jednostavno pozoves normalni operator+ koji radi kad je objekt prvi argument. Podrazumijevam tu da je operacija komutativna.
Inace, 7+K definirat kao 7 puta vece stanje je dosta cudno. operator* mi se cini kao puno smisleniji...
1. Moras deklarirat taj globalni operator kao friend operator od klase Konto.
Znaci unutar klase imas deklaraciju:
friend Konto operator+(const int value, const Konto& K);
2. Ne koristis varijablu stanjeKonta, vec objekt klase Konto. Kada si napravio operator+ unutar klase za koji kazes da radi pola posla, on ima implicitni parametar "this" koji je pokazivac na samog sebe. Dakle njegov tip je 'Konto', isto tako trebas i tu.
3. Valjda bi prvi argument trebala biti vrijednost, dakle ta sedmica, inace je isto kao da si implementirao kao operator klase.
4. Tvoj operator u definiciji kaze da vraca tip 'Konto', a unutar funkcije vracas int?? Obzirom na pitanje, sumnjam da imas definiran operator implicitne konverzije klase Konto u tip 'int', pa ti ovo nece ni kompajler dopustit.
Moras imat nesto tipa
Konto result;
result.stanjeKonta = (kombinacija ona dva)
return result;
5. "k + 2" i "7 + k" kreiraju privremeni objekt tipa Konto i pridruzuju ga (assign) objektu na lijevoj strani. Osim ako klasa nije trivijalna sto se tice privatnih varijabli, ovo znaci da bi trebao imat definiran assignment operator, dakle "Konto& operator=(const Konto&);"
6. friend funkcije se obicno nastoji izbjeci sto vise, jer stete enkapsulaciji. Ovdje to mozes ovako:
Konto operator+(const int stanje, const Konto& K)
{
return K+stanje;
}
T.j., jednostavno pozoves normalni operator+ koji radi kad je objekt prvi argument. Podrazumijevam tu da je operacija komutativna.
Inace, 7+K definirat kao 7 puta vece stanje je dosta cudno. operator* mi se cini kao puno smisleniji...
Uspio sam napokon. Ono sto me je kocilo je to sto nisam stavljao this objekat koji je imao tip konto kao i globalna funkcija, i sto nisam imao assignment operator. Hvala ti puno na pomoci i vremenu.
#include<stdio.h>
#include<math.h>
main(){
int a=0,b=0,zbr=0,umn=0;
printf("\n Ucitaj broj:");
scanf("%d",&a);
if(a>b){
zbr=a+b;
printf("\n Njihov zbroj je %d:",zbr);
}
if(a<b){
umn=a*b;
printf("\n Njihov umnozak je %d:",umn);
}
if(a=b)
printf("\n Brojevi su jednaki:");
}Zadatak je bio da učitam 2 broja a i b. Ako je a>b(izračunati i ispisati zbroj), ako je a<b(izračunati i ispisati umnožak),a ako je a=b(ispisati poruku: brojevi su jednaki). Problem je kad upišem npr. 1 1-> on mi izbaci,njihov zbroj je 1. A ako upišem 1 2,isto mi izbaci njihov zbroj je 1. Može pomoć? :)
scanf("%d%d",&a, &b);
Da nisi ovo zaboravio?
Program bi trebao prvo ispisati "kriptirane" podatke pa onda dekriptirane podatke problem je sto kad pokrenem program ne prikazu se "kriptirani" podaci? Koristim Codebloks na linuxu.
#include <iostream>
#include <string.h>
using namespace std;
int main() {
string toEncrypt = "podaci";
char keyToEncrypt = 's';
for (int temp = 0; temp < toEncrypt.size(); temp++)
toEncrypt[temp] ^= keyToEncrypt;
cout << "nThe encrypted data = " << toEncrypt << endl;
cout << endl;
for (int temp = 0; temp < toEncrypt.size(); temp++)
toEncrypt[temp] ^= keyToEncrypt;
cout << "nThe unencrypted data = " << toEncrypt;
return 0;
}
Program bi trebao prvo ispisati "kriptirane" podatke pa onda dekriptirane podatke problem je sto kad pokrenem program ne prikazu se "kriptirani" podaci? Koristim Codebloks na linuxu.
...Tako je ispalo kod kriptiranja. Probaj staviti neki drugi kljuc, recimo broj 2.
Program bi trebao prvo ispisati "kriptirane" podatke pa onda dekriptirane podatke problem je sto kad pokrenem program ne prikazu se "kriptirani" podaci? Koristim Codebloks na linuxu.
To je zapravo za očekivati kada malo bolje razmisliš što se događa sa znakovima kada ih kriptiraš. Jednostavno - pretvaraš ih u nešto drugo, a to nešto ne mora biti unutar seta znakova koji se mogu ispisivati bez nekih trikova.
Recimo da imaš neku transformaciju kojom ASCII 65 (veliko slovo 'A') pretvoriš u ASCII 3 (si vidio taj znak? spada u kontrolne kodove i postoji dobra šansa da ga sustav jednostavno ne želi ispisati na ekran: http://man7.org/linux/man-pages/man4/console_codes.4.html).
http://en.wikipedia.org/wiki/Code_page_437
Pogotovo ovaj zadnji link, slika na početku stranice. Već sam se zabrinuo da neću pronaći sliku kako DOS prikazuje pojedine kodove, ali Wikipedia to the rescue :) Pogledaj znakove u prvom redu, kladim se da to baš i nisi viđao uokolo.
Vidi recimo ovaj kod:
#include <stdio.h>
int main()
{
putchar(0x07);
return 0;
}
Ispisuje ASCII 0x07 (bell znak) na ekran. Što misliš što se dogodi? Moja WinXP konzola ga interpretira kao kratki beep (sukladno namijeni tog znaka) ali ga ne ispisuje na ekran. Ne da mi se sada paliti Win9x mašinu kako bih provjerio kako DOS reagira, znam sigurno da se i tamo čuje beep ali se ne mogu sjetiti pojavi li se i znak na ekranu. (kao klinac sam se znao zabavljati izvršavanjem 'type' komande na manjim binarnim datotekama, to su bili moji prvi pokušaji da zavirim u unutrašnjost nečega što inače nije namijenjeno ljudima za čitanje, tek sam kasnije otkrio dos tekst editor).
Hvala na detaljnom odgovoru.
Da postavim jos jedno pitanje..
Zanima me kako generirati slucajno odabran broj? Ne pseudorandom broj nego da je bas stvarno "random"?
I recimo da se novi broj mora generirati relativno cesto? Npr. svakih par sekundi?
Zanima me cisto kakve sve tehnike generiranja slucajno odabranih brojeva postoje a da nisu pseudo brojevi?
Hvala na detaljnom odgovoru.
Da postavim jos jedno pitanje..
Zanima me kako generirati slucajno odabran broj? Ne pseudorandom broj nego da je bas stvarno "random"?
I recimo da se novi broj mora generirati relativno cesto? Npr. svakih par sekundi?
Zanima me cisto kakve sve tehnike generiranja slucajno odabranih brojeva postoje a da nisu pseudo brojevi?
Nikako. Racunala su diskretni sustavi i kao takva ne mogu generirati stvarni random broj. Zato je jedna od bitnih stvari u kriptografiji napraviti cim bolji generator (pseudo)random brojeva.
Doduse, postoje nacini, ali ne vjerujem da ti se isplate. Potrebna ti je cim veca entropija (mjera za kaos, ajmo ju tako nazvati). Dakle, izvori ti mogu biti radioaktivni poluraspad, toplinski sum, nekakav elektromagnetski sum, akusticni sum (recimo buka ulice) i sl.
Doduse, na Linuxu (tj. *nix sustavima) mozes koristiti i /dev/random koji skuplja sum "okolisa", tj. klikove misa, tipkanje... Poprilicno je dobar za vecinu kriptografskih potreba, ali ne za dugorocne.
Imam problem, ovaj kod:
#include <iostream>
using namespace std;
int main(){
char a,b,c;
cout<<"Vodic za izbor Cherry MX prekidaca mehanicke tipkovnice"<<endl;
cout<<"Na pitanja molimo odgovorite s D za Da i N za Ne."<<endl;
cout<<endl;
cout<<"Volite li cujan klik mehanicke tipkovnice?"<<endl;
cin>>a;
cout<<endl;
if (a=='D' || a=='d'){
cout<<"Imate li snazne prste?"<<endl;
cin>>b;
cout<<endl;
if (b=='D' || b=='d'){
cout<<"Za Vas je Cherry MX green."<<endl;
} else {cout<<"Za Vas je Cherry MX Blue."<<endl;}
} else {
cout<<"Volite li taktilni osjet?"<<endl;
cin>>b;
cout<<endl;
if (b=='D' || b=='d'){
cout<<"Za Vas je Cherry MX Brown."<<endl;
} else
{
cout<<"Imate li snazne prste?"<<endl;
cin>>c;
cout<<endl;
if (c=='D' || c=='d'){
cout<<"Za Vas je Cherry MX Black."<<endl;
} else {cout<<"Za Vas je Cherry MX Red."<<endl;}
}
}
cout<<endl;
cout<<"Jeste li zadovoljni vodicem?"<<endl;
cin>>c;
return 0;
}
U VS2008 kompajliram i sve, program radi bez problema, no nikako ga ne mogu natjerati da radi na nekom drugom racunalu.
Dev-C++ ga kao kompajlira i sve ok, no ne želi ga pokrenuti, kada treba kaže do source nije kompajliran.
Kako da to čudo natjeram da exe radi i na drugim kompovima? Hvala.
Pozdrav, da li bi mi netko mogao napisati funkciju koja množi sve proste brojeve između a i b?
Ako nekome nije problem, bio bih zahvalan!
Pozdrav, da li bi mi netko mogao napisati funkciju koja množi sve proste brojeve između a i b?
Ako nekome nije problem, bio bih zahvalan!
Malo tko će ti to od nule ovako rješiti. Barem probaj nešto da ljudi vide da ti je stalo pa će ti pomoći ako si zapeo s nečim.
EDIT: Jesi siguran da ih baš treba množiti? Pitam zato jer bi za iole veći raspon a i b taj umnožak mogao lako overflowati unsigned (kad se sjetim faktorijela lol). Nema veze, imamo u C++-u unsigned long long, njega nećeš tako lako overflowati
Rješio sam zadatak koristeći samo funkciju za prost, i množeći ga unutar main-a.
Problem je što ne znam kako da ubacim ovaj dio gdje se dobiva umnožak u funkciju.
I vidim da vi koristite nekakve naprednije varijable i funkcije, ništa od toga nisam učio.
Evo i koda.
#include <stdio.h>
#include <stdlib.h>
int prost(int n)
{
int i;
if(n==1) return 0;
for(i=2;i<n;i++) if(n%i==0) return 0;
return 1;
}
int main(int argc, char *argv[])
{
int a,b,j,i,umn;
scanf("%i",&a);
scanf("%i",&b);
umn=1;
for(i=a;i<=b;i++)
{
if(prost(i)==1) umn=umn*i;
}
printf("%i\n",umn);
system("PAUSE");
return 0;
}
I ovo je što sam probavao u funkciji dobiti ali ne radi nikako.
Editirao bi post ali ne mogu ništa ubaciti ispod ovog koda, valjda je do browsera greška. Sorry na duplom.
#include <stdio.h>
#include <stdlib.h>
int prost_umn(int n, int m)
{
int j;
int umn=1;
for(j=n;j<m;j++)
{
int i;
if(j==1) umn=umn;
for(i=2;i<j;i++)
{
if(j%i==0) umn=umn;
else umn=umn*i;
}
return umn;
}
}
int main(int argc, char *argv[])
{
int a,b,j,i,umn;
scanf("%i",&a);
scanf("%i",&b);
umn=1;
printf("%i\n",prost_umn(a,b));
return 0;
}
Probaj indentirati kod, ovako je gotovo posve nečitljiv.
Čim ga uvučem baca mi onaj warning za kod, i moram maknuti svo oblikovanje :/
u funkciji stavi dvostruku petlju
vanjska ide u rasponu od min do max
unutarnja ispituje za svaki je li prost - ako jest množi
funkcija ima ovaj potpis
long long prostRaspon(int min, int max)
za ispitati da li je broj prost dosta ti je ovaj raspon
for(int i = 2; i <= sqrt(broj); i++) ili for(int i = 2; i * i <= broj; i++) - kako ti draže
Možda ima nekih gluposti, ali perem ruke jer sam i osobno početnik
Btw, rezultati su ogrooomni kako sam očekivao.
Dobro si ti to. Evo jedne varijacije na tvoj kod, pošto si koristio break, ja iz zafrkancije stavio i continue
#include <iostream>
#include <cmath>
using namespace std;
unsigned long long prime_number_product(unsigned lower, unsigned upper);
int main()
{
unsigned a, b;
cout << "Unesite a i b: ";
cin >> a >> b;
cout << "Umnozak prostih brojeva izmedu " << a << " i " << b << " je: " << prime_number_product(a, b) << endl;
}
unsigned long long prime_number_product(unsigned lower, unsigned upper)
{
int i, j;
unsigned long long product = 1;
for(i = lower < 2 ? 2 : lower; i <= upper; ++i)
{
double square_root = sqrt(static_cast<double>(i)); // naravno da tu moze biti i obicni c-ovski cast, ali ovo je ipak c++
for(j = 2; j <= square_root; ++j)
{
if(i % j == 0)
break;
}
if(j <= square_root) continue;
//cout << i << endl; ispis za provjeru ispravnosti
product *= i;
}
return product == 1 ? 0 : product;
}
Hvala vam puno dečki ali ovo unsigned i long long i break i continue opće nismo učili.
Onda stavi zastavicu iliti kontrolnu varijablu, koja mijenja vrijednost ako broj nije prim, ali tipove brojeva si morao učiti kad radiš funkcije, čak i prekide petji kad radiš petlje.
#include <iostream>
#include <cmath>
using namespace std;
unsigned long long prime_number_product(unsigned lower, unsigned upper);
int main()
{
unsigned a, b;
cout << "Unesite a i b: ";
cin >> a >> b;
cout << "Umnozak prostih brojeva izmedu " << a << " i " << b << " je: " << prime_number_product(a, b) << endl;
}
unsigned long long prime_number_product(unsigned lower, unsigned upper)
{
int i, j, kontrola;
unsigned long long product = 1;
for(i = lower < 2 ? 2 : lower; i <= upper; ++i)
{
kontrola = 0;
double square_root = sqrt(static_cast<double>(i)); // naravno da tu moze biti i obicni c-ovski cast, ali ovo je ipak c++
for(j = 2; j <= square_root; ++j)
{
if(i % j == 0)
kontrola = 1;
}
if(kontrola == 0)
product *= i;
}
return product == 1 ? 0 : product;
}
Hvala vam puno dečki ali ovo unsigned i long long i break i continue opće nismo učili.
Nema na čemu, inače bilo bi dobro izbjegavati printf i scanf jer su to C-ovski I/O mehanizmi - radije koristi cin i cout.
Osim ako to još niste radili, onda u redu mada mi je to čudno.
Posebna su gnjavaža ti format specifieri, ajd' ga ti sad traži za unsigned long long ili neki deseti primitvni tip - hau jes nou
Isto tako, koristiš C-ove headere što je također uglavnom nepotrebno u ovom kontekstu (ovi tvoji bi bili cstdio i cstdlib, ali imaš iostream za I/O potrebe).
Btw, što će ti command-line argumenti (argc, argv) u ovom zadatku?
Unsigned ti samo onemogućava da koristiš negativne brojeve, time dobiješ još jedan bit za samu vrijednost broja (onaj biti koji se inače koristi za predznak). To ti je onda duplo od signed tipa (npr. za int - od 0 do 2^32 - 1 je unsigned, a signed je -2^31 do 2^31 - 1).
Long long ti garantira osam bajta za pohranu broja, a to je prilično puno.
Break i continue je samo kontrola iteriranja petlje - break bezuvjetno izlazi iz petlje dok continue ulazi u sljedeću iteraciju petlje.
EDIT: Kada bolje razmislim, mogao si slobodno pitanje postaviti u temi o programiranju u C-u jer ovaj tvoj kod je čisti C.
Evo uspio sam uz pomoć prijatelja.
#include <stdio.h>
#include <stdlib.h>
int f(int a, int b)
{
int suma=1,i,ok;
for (a; a <= b; a++)
{
ok=1;
for (i = 2; i < a; i++)
{
if (a % i == 0 && i != a)ok=0;
}
if (ok==1) suma*=a;
}
return suma;
}
int main(int argc, char *argv[])
{
int a,b;
scanf("%i",&a);
scanf("%i",&b);
printf("%i \n",f(a,b));
return 0;
}
čemu taj uvjet da je i != a - kad u petlji i mora biti manji od a
nisi slušao
for(i = 2; i * i <= a; i++)
if(a % i == 0) ok = 0;
to je dovoljno
Moj problem nitko ništa?
Moj problem nitko ništa?
Kad radim samo u VS pa ne mogu provjeriti o čemu se radi - nije da te ignoriram.