Hvala Luuka, ovo je stvarno bilo brzo :)
Programiranje u C-u - od svega pomalo
- poruka: 1.661
- |
- čitano: 388.512
- |
- moderatori:
Lazarus Long, XXX-Man, vincimus
- +/- sve poruke
- ravni prikaz
- starije poruke gore
U školi smo napravili program koji provjerava da li je unijeti broj savrsen ili ne.
Kod nam otprilike ide ovako:
#include <iostream>
using namespace std;
void Savrsen(int broj);
int main()
{
int broj ;
cout<<"Unesite broj : "<<endl;
cin>>broj;
Savrsen(broj);
system("pause");
return 0;
}
void Savrsen(int broj)
{
bool savrsen = false;
int zbroj = 0;
for(int i = 1;i<broj;i++)
{
if(broj%i==0)
{
zbroj+=i;
}
}
if(broj ==zbroj)
{
savrsen=true;
}
else
{
savrsen = false;
}
if(savrsen)
{
cout<<"Broj je savrsen!"<<endl;
}
else
{
cout<<"Broj nije savrsen!"<<endl;
}
}
Profesorica nam je zadala zadatak da ovo napravimo preko datoteke koristeci ofstream Izlaz, ali ja na koji god nacin uradim ne radi >.>
Ima li iko savjete?
Pretpostavljam da samo ispis ide u datoteku.
Sve napraviš isto, samo na kraju mala promjena:
ofstream izlaz("izlaz.txt");
if (savrsen) izlaz<<"Broj je savrsen!"<<endl;
else izlaz<<"Broj nije savrsen!"<<endl;
izlaz.close();
Btw kad pogledam tvoj kod, mogu samo reći - to se tak ne radi. Puno imaš beskorisnih varijabli i naredbi koje ti samo gomilaju kod. Uz to, funkcija bi trebala smao ispitati je li broj savršen ili nije, main se brine o ispisu.
Fukciju napravi ovako:
bool Savrsen(int broj)
{
int zbroj=0;
for (int i=1;i<broj;++i)
if (broj%i==0) zbroj+=i;
if (zbroj==broj) return true;
return false;
}
a onda u mainu:
ofstream izlaz("izlaz.txt");
if (Savrsen(broj)) izlaz<<"Broj je savrsen!"<<endl;
else izlaz<<"Broj nije savrsen!"<<endl;
izlaz.close();
Pozdrav, da li bi mi netko mogao pomoći i ukratko opisati stringove?
Evo imam i primjer zadatka.
Napiši program koji će učitat neki string. Program treba ispisati svaki string ali tako da se svaki znak pojavljuje samo jedanput.
Ili.
Napiši program koji učitava n znamenkasti cijeli broj. Program treba ispisati koliki je zbroj broja x i y, gdje je x najmanji broj kojeg možemo dobiti pomoću znamenaka broja n, a y najveći.
Hvala unaprijed.
Pozdrav, da li bi mi netko mogao pomoći i ukratko opisati stringove?
Sto ti kod stringova nije jasno?
C string je obicno polje charova, ciji zavrsetak oznacava char koji ima vrijednost nula
Ono sto je bitno za shvatiti jest da je char:
- 8 bitni broj koji moze imati vrijednost 0-255, te s njime mozes vrsiti racunske operacije kao i sa bilo kojim drugim brojem
- 1 bajt u memoriji
- broj kojem je ujedno dodjeljen i jedan od znakova iz ASCII tabele
Da bi to malo lakse probavio evo ti i prikladna slicica koju sam slozio (ponekad je lakse kad "vidis" nego kad ti pricaju):
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main()
{
char *slova, *string;
int n;
slova=(char*)calloc(255, 1);
string=(char*)calloc(1024, 1);
gets(string);
for (n=0; n<strlen(string); n++)
{
if (!slova[string[n]])
putchar(string[n]);
slova[string[n]]++;
}
putchar('\n');
free(slova);
free(string);
system("pause");
return 0;
}
Nadam se da sam dobro shvatio sto treba napraviti...
E sad ovaj mi zadatak nije skroz jasan, postoje dvije mogucnosti. Ako uneses broj 231, da li se moraju iskoristiti sve znamenke da se dobije najveci moguci broj -> 321 , ili se moze koristiti samo jedna (najveca) znamenka -> 333.
Posto je ovo drugo trivijalno, a ovo prvo po mojoj racunici zahtjeva nekakvo sortiranje, ja cu se pozabaviti prvim:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define ASCENDING 1
#define DESCENDING 2
char* bubble_sort(char* input, char order)
{
char temp, c=1, *output;
int n;
output=(char*)calloc(strlen(input)+1, 1);
strcpy(output, input);
if (strlen(output)<2)
return output;
while(c)
{
c=0;
for (n=0; n<strlen(output)-1; n++)
{
if (order==ASCENDING)
{
if (output[n]>output[n+1])
{
temp=output[n];
output[n]=output[n+1];
output[n+1]=temp;
c=1;
}
}
else
{
if (output[n]<output[n+1])
{
temp=output[n];
output[n]=output[n+1];
output[n+1]=temp;
c=1;
}
}
}
}
return output;
}
int main()
{
int broj, brojX, brojY;
char *broj_c, *brojX_c, *brojY_c;
broj_c=(char*)calloc(100, 1);
printf("Upisi neki broj: ");
gets(broj_c);
brojX_c=bubble_sort(broj_c, ASCENDING);
brojY_c=bubble_sort(broj_c, DESCENDING);
broj=atoi(broj_c);
brojX=atoi(brojX_c);
brojY=atoi(brojY_c);
printf("\nBroj je: %d\nNajmanji broj je: %d\nNajveci broj je: %d\n", broj, brojX, brojY);
printf("Zbroj najmanjeg i najveceg broja je: %d\n", brojX+brojY);
free(broj_c);
free(brojX_c);
free(brojY_c);
system("pause");
return 0;
}
E puno ti hvala, ali problem je što ja ne znam nijednu od tih varijabli.
Sve što ja znam, i s čime trebam rješiti zadatak su strlen, if, i for petlje.
Ništa više.
I obični scanf i printf naravno.
Opet, puno hvala na pojašnjenu char-a i stringa.
Pa onda ovako:
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int main()
{
char slova[256], string[100];
int n;
for (n=0; n<256; n++)
slova[n]=0;
scanf("%s", string);
for (n=0; n<strlen(string); n++)
{
if (!slova[string[n]])
printf("%c", string[n]);
slova[string[n]]++;
}
printf("\n");
system("pause");
return 0;
}
A ovaj drugi cu jos vidjeti kako bih ga pojednostavnio...
Hvala ti puno, savršeno radi.
Jel mi možeš reći zašto si ovo napisao na vrhu? jel se ikako može bez toga ili? Ne znam kako ću profesoru objasniti odkud mi to jer to isto nismo učili.
#include <string.h>
Hvala ti puno, savršeno radi.
Jel mi možeš reći zašto si ovo napisao na vrhu? jel se ikako može bez toga ili? Ne znam kako ću profesoru objasniti odkud mi to jer to isto nismo učili.
#include <string.h>
Naravno da ste ucili, da bi koristio strlen funkciju moras ukljuciti header string.h
Stvarno nismo.
Ja sam bez toga koristio i radi sasvim dobro.
Ma profesor je sav. Joj. On to zna, živi od toga, ali objašnjavanje mu nije jača strana.
Hvala ti puno na pomoći.
Stvarno nismo.
Ja sam bez toga koristio i radi sasvim dobro.
Nema sanse. Daj mi neki kôd u kojem ti strlen radi bez ukljucivanja string.h headera...
strlen je funkcija definirana u doticnom headeru, i da bi ju koristio taj header mora nekako biti ukljucen u tvoj program.
Vjerojatno koristis nekakav compiler koji tolerira svasta, a to nije dobro. Reci, u cemu programirate u skoli?
Evo, ovaj program svaki element u charu pomiče za jedno mjesto u desno, to jest jedno mjesto više u ASCII tabeli.
#include <stdio.h>#include <stdlib.h>
int main(int argc, char *argv[]){ char A[100]; int n,j,i,k char tmp; scanf("%s",A); n=strlen(A);
for(i=0;i<n;i++) { A[i]++; if(A[i]==91) A[i]=65; if(A[i]==123) A[i]=97; }
printf("%s \n",A);
system("PAUSE"); return 0;}
Evo, ovaj program svaki element u charu pomiče za jedno mjesto u desno, to jest jedno mjesto više u ASCII tabeli.
Ovo ja dobijem:
12 test_strlen.cpp `strlen' undeclared (first use this function)
Compiler se buni. Koji IDE ti koristis?
Oprosti, ne znam što je IDE.
Koristim Dev-c ++ ako na to misliš.
Oprosti, ne znam što je IDE.
Koristim Dev-c ++ ako na to misliš.
E pa to je IDE (Integrated Development Environment)
Nemam pojma sto se tu dogada, ja takoder ovo pokusavam compilirati u Dev-u, i compiler se zali. Uglavnom nemoj se oslanjati na to sto ti radi, to uopce nije dobra praksa
EDIT: Evo i Watcom mi se zali. To su dakle 2 razlicita compilera, mogu ja jos probati i sa borlandovim i LCC-om ali nekako mi se cini da ce rezultat biti isti...
Okej, odsad ću to uključivati u programe.
Kažem, mi smo tako učili. U svakom slučaju hvala puno. Valjda ću uspjet pozitivno iz testa dobit.
Evo, ovaj program svaki element u charu pomiče za jedno mjesto u desno, to jest jedno mjesto više u ASCII tabeli.
#include <stdio.h>#include <stdlib.h>
int main(int argc, char *argv[]){ char A[100]; int n,j,i,k char tmp; scanf("%s",A); n=strlen(A);
for(i=0;i<n;i++) { A[i]++; if(A[i]==91) A[i]=65; if(A[i]==123) A[i]=97; }
printf("%s \n",A);
system("PAUSE"); return 0;}
Ajde svi malo skupa lijepo razmislite o kodu koji pišete. Kako funkcija strlen "računa" duljinu stringa? Ide znak po znak pa vrati poziciju znaka \0, zar ne? Proučite sad ovo:
n=strlen(A); for(i=0;i<n;i++)
Tu se dvaput prolazi kroz cijeli string dok se ne dođe do nul-znaka! Funkcija strlen uopće nije potrebna (a s njoj i onaj header), nego treba samo jedna pametna petlja.
int i=0;
while (A[i] != '\0') {
...
i++;
}
I to je to. Zapravo iz toga koda se da izvući i funkcija strlen:
int strlen(char *A){
int i=0;
while (A[i] != '\0') i++;
return i;
}
(ne znam dal ovo prolazi - nisam baš upućen u to kako se šalju polja charova kao argumenti - ali mislim da bi trebali skužiti poantu).
Hvala na trudu i pokušaju objašnjenja, ali što se tiče programiranja skoro pa sam potpuni laik.
Ovaj kod je profesorov, nije moj.
int strlen(char *A){
int i=0;
while (A[i] != '\0') i++;
return i;
}
(ne znam dal ovo prolazi - nisam baš upućen u to kako se šalju polja charova kao argumenti - ali mislim da bi trebali skužiti poantu).
Prolazi, dobro si definirao argument.
Hvala na trudu i pokušaju objašnjenja, ali što se tiče programiranja skoro pa sam potpuni laik.
Ovaj kod je profesorov, nije moj.
Pokaži mu ovu moju izmjenu pa pitaj što misli o tome. U programiranju, pogotovo u učenju programiranja, treba razmišljati malo šire, ne se ograničavati. Njegov kôd je klasičan, ali ne ulazi u srž "problema".
Zapravo je situacija zanimljiva - takav kod je iskoristiv kad su u pitanju nul-terminated stringovi (polja sa znakovima kod kojih je znanji znak nul-znak i on kaže da je tu kraj stringa). Međutim, to nije iskoristivo kod drugih vrsta stringova - ne znam kakva je situacija u C/C++-u, no recimo u Pascalu duljina stringa je zapisana u njegovom nultom znaku - znači string[0] nije prvi znak stringa, nego duljina stringa. S tim je jasno da će funkcija za vraćanje duljine stringa biti ekspresno izvršena.
Uf, rađe ne bih. Samo ću navući njegov bijes, a to mi ne treba dok se za dvojku borim.
Inače nisam glup, i imam razvijenu logiku, ali nekako sam zaglibio u ovome.
Napiši program koji učitava n znamenkasti cijeli broj. Program treba ispisati koliki je zbroj broja x i y, gdje je x najmanji broj kojeg možemo dobiti pomoću znamenaka broja n, a y najveći.
što se ovdje traži?
npr 1594
najmanji - 1
najveći - 9
rezultat - 10
je li to cilj
Ne.
Dakle, imaš broj 132.
Najveći broj koji možeš dobiti od njegovih znamenaka je 321, a najmanji 123.
Sad, ta 2 broja treba zbrojiti.
Do kolko ti je n?
N je dužina stringa u kojem je unesen broj.
I koja je maksimalna duljina tog stringa?
Zar je bitno? Nemam pojma.
Bitno je, ako je neki mali, mozes spremat u broj, inace si prisiljen radit puno kompliciranije sa stringovima.
Ma broj može imat N znamenaka, tako da.
Haha, znam. Pitanje je, kolko je taj N, odnosno do kolko moze bit taj N? Koja je najveca vrijednost koju N moze postic?