Problem je što se izmijenjeni string mora spremiti.
EDIT:
U mainu se učita string, u drugoj funkciji se obrne, pa se opet u mainu ispisuje.
Problem je što se izmijenjeni string mora spremiti.
EDIT:
U mainu se učita string, u drugoj funkciji se obrne, pa se opet u mainu ispisuje.
Problem je što se izmijenjeni string mora spremiti.
EDIT:
U mainu se učita string, u drugoj funkciji se obrne, pa se opet u mainu ispisuje.
Dobro onda ga obrnes pa ispises ali opet mozes preko chara a ne alociranja memorije.
btw kad okreces string nemozes mijenjat 99 sa 0 pa 98 sa 1 jer ta polja koja nisu popunjena pri ispisu ce ti davat ko zna sta, moras prvo vidit koja je velicina unesenog string pa onda minjat zadnji znak za prvi i tako redon to sredine, isto vrijedi za ispis nemozes ispisat cijeli string foron od 0 do 100 vec moras ic do velicine string.
Tvoj kod san priletia samo nabrzaka ali nigdi nevidin da si isa do velicine string niti da si je igdi proba odredit. odavno nisan radia nista u c-u tako da neznan jeli ima jos koja funkcija osim strlen za koju moras includat string.h
Prepravio sam nešto:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int N;
char *rec;
char *rec2;
int main()
{
int k;
char pom[100];
printf("\nUnesi string\n\n");
gets(pom);
N=strlen(pom);
rec=((char*)malloc(N*sizeof(char)));
rec2=((char*)malloc(N*sizeof(char)));
rec=pom;
int prepravi();
printf("\n\n");
for(k=0;k<N;k++){
printf("%c",rec2[k]);
}
printf("\n\n");
system("PAUSE");
return 0;
}
int prepravi()
{
int i,j=0;
i=N;
for(i;i>0;i--){
rec2[j]=rec[i];
j++;
}
return 0;
}
Program se sada pokreće, ali ispisuje gluposti.
Netreba ti alociranje memorije, nisi me skuzia sta san mislia :(
Evo kod valjda ce bit lakse za skuzit
#include <stdio.h>
#include <string.h>
void Reverse(char myString[])
{
char temp;
for(int i=0; i<strlen(myString)/2; i++)
{
temp = myString[i];
myString[i] = myString[strlen(myString) - i - 1];
myString[strlen(myString) - i - 1] = temp;
}
}
void Print(char myString[])
{
for(int i=0; i<strlen(myString); ++i)
printf("%c \n", myString[i]);
}
int main()
{
char myString[100];
gets(myString);
Reverse(myString);
Print(myString);
}
Ovaj tvoj program radi, ali ga ne razumijem da me hebeš.
Ja sam napisao ovo bez alokacije, ali sad uopće ne ispisuje ništa:
#include <stdio.h>
#include <stdlib.h>
char pom[50];
char rec[50];
int main()
{
int k;
printf("\nUnesi string\n\n");
gets(pom);
int prepravi();
printf("\n\n");
for(k=0;k<50;k++){
printf("%c",rec[k]);
}
printf("\n\n");
system("PAUSE");
return 0;
}
int prepravi()
{
int i,j=0;
for(i=50;i>0;i--){
rec[j]=pom[i];
j++;
}
return 0;
}
Pa pitaj sta nije jasno
Jel znas kako slat varijable funckciji? Vidim da stalno koristis globalne bez razloga pa pitam
U svom kodu imas jednu logicku gresku koju san ti reka par postova prije ali nisi skuzia :(
Tebi je polje veliko 50 znakova ali ti nemozes ispisat svih 50 jer ako si unia 10 i sad ides ispisat 11-ti znak on ce ti na ekran ispisat nesto livo bez obzia sta ga ti nisi unia zato moras koristit strlen(pom) ode umisto pom moze ic bilo koje polje chara i onda ti ta funkcija vrati kolikoliko si ti stvarno znakova unia
Kad to primjenis onda kod radi i na "tvoj" nacin
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char pom[50];
char rec[50];
//ako funkcije pises poslije main onda ispred main moras stavit deklaraciju funckije ili je cilu pisat ispred main
//tvoja funkcija nemoze bit int jer nakon zavrsetka nevraca nikakav broj tocnije nema smisla stavlja return 0 ka sta si ti samo da bi ti bila int radje pisi void
void prepravi();
int main()
{
int k;
printf("Unesi string\n\n");
gets(pom);
prepravi(); // kod poziva funkcije samo pises ime funkcije ne i tip koji vraca npr int., char, void ...
for(k=0; k<strlen(rec); k++)
{
printf("%c",rec[k]);
}
printf("\n\n");
system("PAUSE");
return 0;
}
void prepravi()
{
int i,j = 0;
//ode moras od strlen jos oduzet jedan jer ako tvoj string ima 12 znakova zadnje polje mu je zapravo 11 jer je pocetno 0
for(i= strlen(pom)- 1; i>=0 ;i--)
{
rec[j] = pom[i];
j++;
}
}
E, to je to. Sad sam skužio.
Jel mi može netko pomoći sa zadatkom prije?
Zna li netko što znači ovo: scanf("%10[^\n]",ime);
Zna li netko što znači ovo: scanf("%10[^\n]",ime);
Logično bi mi bilo - učitavaj 10 znakova ili dok ne dođeš do novog reda i to spremi u ime.
A s kojim zadatkom ti treba pomoć? Još uvijek onaj sa okretanjem stringova?
THx za tip. Sa onim velikim, koji sprema u binarnu datoteku i čita iz nje. Sve sam probavao, naišao na još nekoliko problem, otklonio ih ali mi se program konstantno ruši kada dođe do točke učitavanja odslužene kazne. Evo zadnje verzije:
#include <stdio.h>
#include <stdlib.h>
struct struktura{
int zatvorski;
char imeiprezime[50];
int duljina;
float odsluzeno;
int karakteristika;
}zatvorenik;
int N;
int main()
{
int i;
struct zatvorenik;
FILE *fh;
do{
printf("\n Unesite broj od 3 do 15\n\n");
scanf("%d",&N);
fflush(stdin);
if(N<3 || N>15) printf("\n Unijeli ste pogresan broj!\n\n");
}while(N<3 || N>15);
fh=fopen("cuza.dat","wb");
for(i=0;i<N;i++){
do{
printf("\n Unesite broj zatvorenika.\n\n");
scanf("%d[\n]",&zatvorenik.zatvorski);
fflush(stdin);
}while(zatvorenik.zatvorski<1000 || zatvorenik.zatvorski>9999);
fprintf(fh,"\n%d\n",zatvorenik.zatvorski);
printf("\n Unesite ime i prezime zatvorenika.\n\n");
gets(zatvorenik.imeiprezime);
fflush(stdin);
fputs(zatvorenik.imeiprezime,fh);
printf("\n Unesite duljinu kazne zatvorenika.\n\n");
scanf("%d[\n]",&zatvorenik.duljina);
fflush(stdin);
fprintf(fh,"\n%d\n",zatvorenik.duljina);
fflush(fh);
printf("\n Unesite odsluzeni dio kazne zatvorenika.\n\n");
scanf("%f[\n]",&zatvorenik.odsluzeno);
fflush(stdin);
fprintf(fh,"\n%f\n",zatvorenik.odsluzeno);
fflush(fh);
printf("\n Unesite karakteristiku ponasanja zatvorenika (1-dobro 0-lose).\n\n");
scanf("%d[\n]",&zatvorenik.karakteristika);
fflush(stdin);
fprintf(fh,"\n%d\n",zatvorenik.karakteristika);
}
fclose(fh);
int otvori();
system("PAUSE");
return 0;
}
int otvori()
{
FILE *fp;
int i;
struct zatvorenik;
fp=fopen("cuza.dat","rb");
for(i=0;i<N;i++){
fscanf(fp,"%d",&zatvorenik.zatvorski);
fgets(zatvorenik.imeiprezime,50,fp);
fscanf(fp,"%d",&zatvorenik.duljina);
fscanf(fp,"%f",&zatvorenik.odsluzeno);
fscanf(fp,"%d",&zatvorenik.karakteristika);
if(zatvorenik.karakteristika==1 && (zatvorenik.duljina/zatvorenik.odsluzeno<2)){printf("\n\n Zatvorenik %s ima pravo na pomilovanje. \n\n",zatvorenik.imeiprezime);}
}
fclose(fp);
system("PAUSE");
return 0;
}
EDIT: sad se ne ruši, ali i dalje ne radi.
int main()
{
struct zatvorenik;
To ne valja. Strukturu zatvorenik već imaš, i sad ono što ti treba je varijabla tipa zatvorenik. Dakle trebalo bi
zatvorenik z;
i onda kod unosa z.ime, z.odsluženo itd. Onako kako si napravio strukturu, njeno ime je "zatvorenik" i to je sad neki tvoj TIP podatka (ko int, float itd) i sad ti treba jedan od zatvorenika, nazovimo ga z.
btw onaj N ti ne treba biti globalna varijabla, a funkcija otvori može biti i void (pa onda bez returna)
Sada skoro pa radi-ne ispisuje sve:
#include <stdio.h>
#include <stdlib.h>
struct struktura{
int zatvorski;
char imeiprezime[50];
int duljina;
float odsluzeno;
int karakteristika;
}z;
int N;
void otvori();
int main()
{
int i;
struct z;
FILE *fh;
do{
printf("\n Unesite broj od 3 do 15\n\n");
scanf("%d",&N);
fflush(stdin);
if(N<3 || N>15) printf("\n Unijeli ste pogresan broj!\n\n");
}while(N<3 || N>15);
fh=fopen("cuza.dat","wb");
for(i=0;i<N;i++){
do{
printf("\n Unesite broj zatvorenika.\n\n");
scanf("%d[\n]",&z.zatvorski);
fflush(stdin);
}while(z.zatvorski<1000 || z.zatvorski>9999);
fprintf(fh,"\n%d\n",z.zatvorski);
printf("\n Unesite ime i prezime zatvorenika.\n\n");
gets(z.imeiprezime);
fflush(stdin);
fputs(z.imeiprezime,fh);
printf("\n Unesite duljinu kazne zatvorenika.\n\n");
scanf("%d[\n]",&z.duljina);
fflush(stdin);
fprintf(fh,"\n%d\n",z.duljina);
fflush(fh);
printf("\n Unesite odsluzeni dio kazne zatvorenika.\n\n");
scanf("%f[\n]",&z.odsluzeno);
fflush(stdin);
fprintf(fh,"\n%f\n",z.odsluzeno);
fflush(fh);
printf("\n Unesite karakteristiku ponasanja zatvorenika (1-dobro 0-lose).\n\n");
scanf("%d[\n]",&z.karakteristika);
fflush(stdin);
fprintf(fh,"\n%d\n",z.karakteristika);
}
fclose(fh);
otvori();
system("PAUSE");
return 0;
}
void otvori()
{
FILE *fp;
int i;
struct z;
fp=fopen("cuza.dat","rb");
for(i=0;i<N;i++){
fscanf(fp,"%d",&z.zatvorski);
fgets(z.imeiprezime,50,fp);
fscanf(fp,"%d",&z.duljina);
fscanf(fp,"%f",&z.odsluzeno);
fscanf(fp,"%d",&z.karakteristika);
if(z.karakteristika==1 && (z.duljina/z.odsluzeno<2)){printf("\n\n Zatvorenik %s ima pravo na pomilovanje. \n\n",z.imeiprezime);}
}
fclose(fp);
}
#include <stdio.h>
#include <stdlib.h>
struct struktura{
int zatvorski;
char imeiprezime[50];
int duljina;
float odsluzeno;
int karakteristika;
}z;
int N;
void otvori();
int main()
{
int i;
struct z;
Ma opet si isto napravil :D Evo taj kod kako bi trebo bit:
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int zatvorski;
char imeiprezime[50];
int duljina;
float odsluzeno;
int karakteristika;
}zatvorenik;
void otvori();
int main()
{
int i,N;
zatvorenik z;
dalje u kodu radiš sa z.zatvorski, z.imeiprezime itd...
OVDJE (strana 95) možeš vidjeti različite načine kako napraviti strukturu i kasnije napraviti varijablu te strkture. Ovaj način gore je po meni najjednostavniji.
Sad bi trebalo bit ok. Promijenio sam ti učitavanja u mainu i u funkciji otvori.
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int zatvorski;
char imeiprezime[50];
int duljina;
float odsluzeno;
int karakteristika;
}zatvorenik;
void otvori(int N);
int main()
{
int i,N;
zatvorenik z;
FILE *fh;
do{
printf("\n Unesite broj od 3 do 15\n\n");
scanf("%d",&N);
if(N<3 || N>15) printf("\n Unijeli ste pogresan broj!\n\n");
}while(N<3 || N>15);
fh=fopen("cuza.dat","w");
for(i=0;i<N;i++){
do{
printf("\n Unesite broj zatvorenika.\n\n");
scanf("%d",&z.zatvorski);
}while(z.zatvorski<1000 || z.zatvorski>9999);
fprintf(fh,"%d\n",z.zatvorski);
fflush(stdin);
printf("\n Unesite ime i prezime zatvorenika.\n\n");
gets(z.imeiprezime);
fprintf(fh,"%s\n",z.imeiprezime);
printf("\n Unesite duljinu kazne zatvorenika.\n\n");
scanf("%d",&z.duljina);
fprintf(fh,"%d\n",z.duljina);
printf("\n Unesite odsluzeni dio kazne zatvorenika.\n\n");
scanf("%f",&z.odsluzeno);
fprintf(fh,"%g\n",z.odsluzeno);
printf("\n Unesite karakteristiku ponasanja zatvorenika (1-dobro 0-lose).\n\n");
scanf("%d",&z.karakteristika);
fprintf(fh,"%d\n",z.karakteristika);
}
fclose(fh);
otvori(N);
system("PAUSE");
return 0;
}
void otvori(int N)
{
FILE *fp;
int i;
zatvorenik z;
fp=fopen("cuza.dat","r");
for(i=0;i<N;i++){
fscanf(fp,"%d\n",&z.zatvorski);
fscanf(fp,"%50[^\n]\n",z.imeiprezime);
fscanf(fp,"%d\n",&z.duljina);
fscanf(fp,"%f\n",&z.odsluzeno);
fscanf(fp,"%d\n",&z.karakteristika);
if(z.karakteristika==1 && (z.duljina/z.odsluzeno<2)){printf("\n\n Zatvorenik %s ima pravo na pomilovanje. \n\n",z.imeiprezime);}
}
fclose(fp);
}
Ma ja sam ti blesav ovih dana. Fali mi 4 boda da prođem programiranje jer sam se zeznuo na zadnjem testiranju.
u čemu je problem ovdje?
Napisati program koji kreira matricu (dvodimenzionalno polje) dimenzija NxN (dimenzije
matrice unosi korisnik s tipkovnice). Matricu je zatim potrebno popuniti sa slučajno
generiranim brojevima iz raspona od 10 do 99 (uključeno). Ispisati matricu na zaslon. Nakon
toga potrebno je uzlazno sortirati elemente glavne dijagonale, a sve ostale elemente zamijeniti
brojem 0. Ispisati novu matricu.
ja za početak samo želim stvoriti matricu sa random brojevima i ispisati ju, ali meni N puta ispiše jedan te isti red matrice
#include <stdio.h>
#include <time.h>
int main () {
int i, j, N, a[N][N];
srand((unsigned)time(NULL));
printf("Unesite N: ");
scanf("%d", &N);
for (i=0; i<N; i++){
for (j=0; j<N; j++){
a[i][j]=rand()%89+10;
}
}
for (i=0; i<N; i++){
for (j=0; j<N; j++){
printf("%d ", a[i][j]);
}
printf("\n");
}
return 0;
}
Meni je ok.
Samo ne preporučam raditi a[N][N], mislim da to nije ok ni po nekom standardu. U trenutku kad se zauzima memorija za tu matricu, program ne zna koliki je N i to na nekim compilerima izazove grešku. Ili napravi dinamičku alokaciju matrice, ili ju deklariraj sa dovoljno velikim konstantama.
Meni je ok.
Samo ne preporučam raditi a[N][N], mislim da to nije ok ni po nekom standardu. U trenutku kad se zauzima memorija za tu matricu, program ne zna koliki je N i to na nekim compilerima izazove grešku. Ili napravi dinamičku alokaciju matrice, ili ju deklariraj sa dovoljno velikim konstantama.
ok. sad sam umjesto N stavio 20 i sve je onda ok
jel moze netko ovo pretvorit u nešto "normalnije". odnosno, da nema one funkcije primFun i bez onog limits.h, naravno ako se moze tako
#include <stdio.h>
#include <limits.h>
int primFun(int x){
int i;
for (i=2; i<x; i++){
if (i==x-1 && x % i != 0)
return 1;
if (x % i != 0)
continue;
if (x % i == 0)
return 0;
}
}
int main() {
int N, unos, max, min, i, primbroj=404;
printf("unesite N\n");
scanf("%d",&N);
min = INT_MAX;
max = INT_MIN;
for(i=0; i<N; i++){
printf("\nunesite cijeli broj\n");
scanf("%d",&unos);
printf("\nunijeli ste broj %d ",unos);
if (unos > max)
max = unos;
if (unos < min)
min = unos;
}
for(i=max+1; i<INT_MAX; i++){
if ( primFun(i) == 1) {
primbroj = i;
break;
}
}
printf("\nNajveci od unesenih je: %d\n", max);
printf("Najmanji od unesenih je: %d\n", min);
printf("Prim broj koji je sljedeci poslije najveceg jest %d\n", primbroj);
getch();
return 0;
}
Zašto ti ovako ne izgleda fja za prost broj?
int primFun(int x)
{
int i;
for (i=2;i<=sqrt(x);++i)
if (x%i==0) return 0;
return 1;
}
ili ako želiš fju koja vraća prvi prim nakon x-a
int prviPrim(int x)
{
int i,prim;
while(1)
{
prim=1;
for (i=2;i<=sqrt(x);++i)
if (x%i==0) { prim=0; break; }
if (prim) break;
else ++x;
}
return x;
}
tu nešto nije dobro.
jer kad u onom starom načinu upišem 5, pa 1, 2, 3, 4, 5, izbaci mi 7 kao prvi prim, što je i točno, a sa ovom funkcijom izbaci mi 6
i da, ovo spada pod zadatke kad još nismo radili funkcije, pa bi sve trebalo biti u glavnoj funkciji
Editirao sam, treba ići x%i==0, a ne samo x%i :D
A možeš i unutar glavnog ubacit ovu fju prviPrim, svejedno je.
#include <stdio.h>
#include <limits.h>
#include <math.h>
int main() {
int N, unos, max, min, i, primbroj, prim;
printf("unesite N\n");
scanf("%d",&N);
min = INT_MAX;
max = INT_MIN;
for(i=0; i<N; i++){
printf("\nunesite cijeli broj\n");
scanf("%d",&unos);
printf("\nunijeli ste broj %d ",unos);
if (unos > max)
max = unos;
if (unos < min)
min = unos;
}
primbroj=max+1;
while(1)
{
prim=1;
for (i=2;i<=sqrt(primbroj);++i)
if (primbroj%i==0) { prim=0; break; }
if (prim) break;
else ++primbroj;
}
printf("\nNajveci od unesenih je: %d\n", max);
printf("Najmanji od unesenih je: %d\n", min);
printf("Prim broj koji je sljedeci poslije najveceg jest %d\n", primbroj);
getch();
return 0;
}
Btw možeš i bez limits.h :D
Samo razdvojiš slučaj i=0 i i>0 kod učitavanja. Kad je i=0, onda inicijaliziraš min i max, a inače radiš provjeru.
e to je to, hvala!
a zašto treba u zaglavlju uključiti limits.h? :/
edit: a sad vidim da si editirao, samo dok još to pokopčam :D
e to je to, hvala!
a zašto treba u zaglavlju uključiti limits.h? :/
edit: a sad vidim da si editirao, samo dok još to pokopčam :D
limits ti treba jer koristiš INT_MAX i INT_MIN, al ko što rekoh može i bez toga :D
Jedno učitavanje obaviš van petlje, pa inicijaliziraš min i max sa tim učitanim brojem, i onda petlja for(i=1;i<N;i++)
ili unutar petlje staviš if (i==0) inicijalizacija else usporedba. (što je lošije rješenje jer će N-1 puta radit provjeru dal je i=0 bezveze)
btw može i bez math.h (on je tu zbog funkcije sqrt), ali onda će bit sporiji kod provjere dal je broj prost.
gdje je ovdje greška?
tekst zadatka:
Napisati program koji će od korisnika zatražiti unošenje dva dvoznamenkasta broja A i B. Ukoliko
korisnik unese brojeve koji nisu dvoznamenkasti, od njega zatražiti ponovni unos brojeva. Ispisati sve
brojeve između A i B koji su neparni i čiji je zbroj znamenki djeljiv s brojem 5 (na primjer, broj 23 je
neparan, a zbroj njegovih znamenaka 2+3=5 je djeljiv s 5). Odrediti ukupan broj takvih brojeva
između broja A i B, te ga izraziti u postocima (npr. takvih brojeva ima 4,67%).
ne izbaci mi dobar postotak
edit: skužio
stavio sam u varijablu "broj" tipa float i sad je sve dobro
#include <stdio.h>
int main (){
int A, B, des, jed, i;
float postotak, broj=0.0;
printf("Unesi A: ");
scanf("%d", &A);
while (A<10 || A>99){
printf("Broj mora biti u intervalu [10, 99]\nUnesi A:");
scanf("%d", &A);
}
printf("Unesi B: ");
scanf("%d", &B);
while (B<10 || B>99){
printf("Broj mora biti u intervalu [10, 99]\nUnesi B:");
scanf("%d", &B);
}
for (i=A; i<=B; i++){
des=i/10;
jed=i-(des*10);
if (i%2!=0 && ((des+jed)%5==0)){
printf("%d ", i);
broj++;
}
}
postotak=(broj/(B-A))*100;
printf("\nTakvih brojeva je %.0f, odnosno %.2f posto", broj, postotak);
getch();
return 0;
}
Da, imao si cjelobrojno dijeljenje. Ako ostaviš da je broj int (što i jest), onda ide ovako:
postotak=((float)broj/(B-A))*100;
ili
postotak=(100.0*broj/(B-A));
Da, imao si cjelobrojno dijeljenje. Ako ostaviš da je broj int (što i jest), onda ide ovako:
postotak=((float)broj/(B-A))*100;
ili
postotak=(100.0*broj/(B-A));
da, na kraju sam i stavio ovo podebljano
evo sad se patim sa jednim zadatkom
U polje upisati N brojeva (<20,u protivnom ponoviti upis), zatim pronaći 2 susjedna broja u polju koja zajedno daju najveću razliku.
i sad mi palo na pamet, jel to možd ide sa funkcijom fabs iz math.h?
#include <stdio.h>
int main () {
int polje[20], i, elem, N, razl;
do{
printf("Unesi broj elemenata polja: ");
scanf("%d", &N);
} while (N>20);
for(i=0; i<N; i++){
printf("Upisi %d. element: ", i+1);
scanf("%d", &polje[i]);
}
razl = polje[1]-polje[0];
elem = 1;
for(i=2; i<N; i++){
if((polje[i]-polje[i-1])>razl){
razl=polje[i]-polje[i-1];
elem=i;
}
}
printf("Susjedna broja koja daju najvecu razliku su polje[%d] i polje[%d]\n");
printf("To su elementi %d i %d, a razlika je %d",
elem-1, elem, polje[elem-1], polje[elem], razl);
getch();
return 0;
}