C zadaci

NikolaCN

Početnik
Poruka
17
Pokusavao sam da napisem zadatke u C-u koji broje reci, znakove, redove, cak sam i prekucavao kod iz knjige tvoraca C-a, nije uspelo.
Evo ga kod, ako neko moze da ga analizira i ukaze mi na gresku. Program bi trebao da broji entere i da ispisuje nove redove, ali kod mene ne izlazi stampa broja redova.

#include <stdio.h>

int main()
{
int c, d;
d = 0;
while ((c = getchar()) != EOF)
{
if (c == '\n')
++d;
}
printf("\nBroj redova je: %d", d);
}

Koristim Code Blocks u radu.
Ujedino, ovo moze postati topic za razmenu iskustava u C-u i tumacenja vezana za njega :ok:
 
Kod ne radi to što ti treba jer ne izlazi iz while petlje. Ti ovim definišeš da se stalno povećava vrednost promenljive d za 1 kada korisnik unese Enter, ali ispis ti je van petlje i ne izvršava se. Moraš da ga staviš unutar petlje:

Kod:
#include <stdio.h>
#include <stdlib.h>

int main()  {

    int c, d;
    d = 0;

    while ((c = getchar()) != EOF)
    {
        if (c == '\n') {
            ++d;
        }
        printf("\nBroj redova je: %d", d);
    }

    return 0;

}

Ovim ćeš nakon svakog pritiska na Enter dobijati informaciju o broju redova. Elem, gledaj da uvek vraćaš vrednost na kraju funkcije , bezbednije je. I koristi code tagove da bi lakše moglo da se prati ;)
 
Zadatak1 , Stampati fibonacijeve brojeve do unetog N u fajl.


#include<stdio.h>
#include<string.h>
#include<math.h>


//funkcija ceo broj stampa u zadati fajl
void inttostr(int n,FILE *pero)
{ char c;
int k=1 ;
int s=n;
if(n==0)
fputc('0',pero);
else
{


while(s>0)
{

s=s/10;
k=k*10;
}
k=k/10;
while ( (n>0) ||(k>0))
{
c='0'+n/k;
fputc(c,pero);
n=n-(n/k)*k;
k=k/10;
}
}
}



int main ()
{

int fp=1, fpp=0 , fn ;
// fibonaci fp-fpredhodno , fpp- fpredpredhodno , fnovo
int i=0,n ;


FILE *drugi;
drugi = fopen ("fibn.txt","w");
printf( " unesi n \n");
scanf(" %d",&n);
fputs("f1=1 \n",drugi); //stavlja f1=1 u fibn
while (++i<n)
{
fn=fp+fpp;
fpp=fp;
fp=fn;

fputc('f',drugi);

inttostr(i+1,drugi);
fputc('=',drugi);
inttostr(fn,drugi);
fputc('\n',drugi);

}

fclose(drugi);
}


Svaki komentar i kritika dobrodosla
 
Program formira tabelu 10 x 10 , i ispisuje random brojeve do 10

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

int main()
{
int dniz[10][10];

int i,j ;
FILE *konj;
konj=fopen("niz.txt","w");
for(i=0; i<10;i++)

{ for(j=0;j<10;j++)
dniz[j]=rand()%10;
}

for(i=0; i<10;i++)

{ for(j=0;j<10;j++)
{

fputc('0'+dniz[j],konj);
fputc(' ',konj);
}
fputc('\n',konj);
}


fclose(konj);



return 0;



}
 
zad 3 Program stampa prijateljske brojeve . Ako je prvi broj jednak sumi delitelja drugog broja (i drugi sumi deljitelja prvog ) . Recimo 220 =1+2+4+71+142 , 284 =1+2+4+5+10+11+20+44+55+110

#include<stdio.h>
#include<math.h>



int sumn(int n)

{
int i=0;
int sum=0;
while(i++<=((n+2)/2))
{
if ((n%i)==0)
sum=sum+i;
}


return sum;
}

int main()
{
int i=0,j=0;
for(i=0;i<20000;i++)
for(j=0;j<20000;j++)
if((sumn(i)==j)&&(sumn(j)==i)&& (i!=j))
printf("brojevi %d %d su prijateljski\n",i,j);

return 0;
}

- - - - - - - - - -

zad 4
program koji stampa sve proste brojeve do n u jednu tekstualnu datoteku

#include<stdio.h>
#include<string.h>
#include<math.h>
void inttostr(int n,FILE *pero)
{ char c;
int k=1 ;
int s=n;
while(s>0)
{

s=s/10;
k=k*10;
}
k=k/10;
while ( (n>0) ||(k>0))
{
c='0'+n/k;
fputc(c,pero);
n=n-(n/k)*k;
k=k/10;
}
}


int prost(int n )
{


int i =2;



while(i<=sqrt(n))
{
if(n%i==0) return 0;
i=i+1+(i>2);
}
return 1;

}


int main ()
{
int i=1;
int n=500;

FILE *drugi;
drugi = fopen ("prosti.txt","w");

while((i=i+1)<200)
if(prost(i)){

inttostr(i,drugi);
putc('\n',drugi);
}
fclose(drugi);
}
 
Pozdrav, javljam se sa novim zadatkom.
Naime potrebno je napisati funkciju koja neparne elemente niza stavlja na kraj, a parne na pocetak tog niza.
Evo ga i kod koji radi delimicno, dakle ne radi :)

void ucitaj(int niz[], int n)
{
int i;
for(i=0;i<n;i++)
scanf("%d", &niz);
}

void ispisi(int niz[], int n)
{
int i;
for(i=0;i<n;i++)
{
printf("niz[%d] = %d\n", i, niz);
}
}

void swap(int *a, int *b)
{
int temp; temp=*a; *a=*b; *b=temp;
}
int main()
{
int n, niz[100], i, j;
scanf("%d", &n);
ucitaj(niz, n);
for(i=0;i<=((n-1)/2);i++)
{
if(niz%2)
{
for(j=1;j<(n-1);j++)
{
if(niz[i+j]%2==0)
{
swap(&niz, &niz[i+j]);
break;
}
}
}
else continue;
}
ispisi(niz, n);
return 0;
}


Kada unesem vrednosti niza 5 elemenata, ovim redosledom 55 44 33 22 11 izadje ovaj rezultat

niz[0] = 44
niz[1] = 22
niz[2] = 1999463792
niz[3] = 55
niz[4] = 11

Kad unesem elemente 1 2 2 2 1, vrati sve po ps-u dakle 2 2 2 1 1
Ima li neka dokona programerska glava da mi pomogne, ako ima hvala do neba.
Pozdrav!
 
Poslednja izmena:
Грешка ти је што пишеш

for(j=1;j<(n-1);j++)

а треба

for(j=1;i+j<(n-1);j++)

Можеш и овако да урадиш

for (j = i+1; j<(n - 1); j++)
{
if (niz[j] % 2 == 0)
{
swap(&niz, &niz[j]);
break;
}
}
 
Pitanje.

Imam cetiri niza i teba da mi na displej izbaci koliko ima brojeva, u svakom nizu po na osob, manje od sest. E sada ne znam da li da upotrebim cetiri FOR petlj, za svaki if uslov jedan for, ili da jedan for ya sve if ali ne znam kako da to lepo upakujem da proverava svaki niz a ne samo jedan.

Problem nije sa jednim nizom nego kada ima vise nizova....

Program nije ceo posto mi treba samo taj deo provere.

Kod:
byte niz1[16]={3,22,31,9,11,6,7,8,23,17,10,30,73,40,55,93};
 byte niz2[16]={11,14,7,13,17,19,97,2,12,128,1,124,123,122,33,21};
  byte niz3[16]={9,15,4,13,2,49,57,3,74,47,39,59,112,100,91,6};
   byte niz4[16]={33,58,68,66,21,19,97,3,1,2,5,12,27,9,15,11};
byte count1=0,count2=0,count3=0,count4=0;
a= niz1[i];
b= niz2[i];
c= niz3[i];
 d= niz4[i];

for (i=0;i<16;i++){
                           if(a<6) count1++;
                                displej=count1 ;

                           if(b<6) count2++;
                            displej=count2;
                           if(c<6) count3++;
                          displej=count3;
                           if(d<6) count4++;
                           displej=count4;  }
 
Pitanje.

Imam cetiri niza i teba da mi na displej izbaci koliko ima brojeva, u svakom nizu po na osob, manje od sest. E sada ne znam da li da upotrebim cetiri FOR petlj, za svaki if uslov jedan for, ili da jedan for ya sve if ali ne znam kako da to lepo upakujem da proverava svaki niz a ne samo jedan.

Problem nije sa jednim nizom nego kada ima vise nizova....

Program nije ceo posto mi treba samo taj deo provere.

Kod:
byte niz1[16]={3,22,31,9,11,6,7,8,23,17,10,30,73,40,55,93};
 byte niz2[16]={11,14,7,13,17,19,97,2,12,128,1,124,123,122,33,21};
  byte niz3[16]={9,15,4,13,2,49,57,3,74,47,39,59,112,100,91,6};
   byte niz4[16]={33,58,68,66,21,19,97,3,1,2,5,12,27,9,15,11};
byte count1=0,count2=0,count3=0,count4=0;
a= niz1[i];
b= niz2[i];
c= niz3[i];
 d= niz4[i];

for (i=0;i<16;i++){
                           if(a<6) count1++;
                                displej=count1 ;

                           if(b<6) count2++;
                            displej=count2;
                           if(c<6) count3++;
                          displej=count3;
                           if(d<6) count4++;
                           displej=count4;  }
Da prokomentarisem prvo tvoj kod. :)

Imas cetiri do kraja popunjena niza ciji su elementi velicine bajta.
Zatim imas cetiri brojaca koji bi, koliko sam shvatio, trebali da predstavljaju broj elemenata cija je vrednost manja od 6.
Dalje, imas cetiri promenljive, a, b, c i d. Pretpostavjam da je trebalo da koristis te promenljive za kretanje po nizu. Da bi to radilo, a, b, c i d moraju biti tip pokazivac na bajt, tj. byte *a, *b, *c, *d. Onda bi trebalo da pise a = niz1, b = niz2... i da tako te promenljive pokazuju na elemente niza, a ne ovako kako pise, jer ovde dodeljujes vrednosti elemenata niza tim promenljivim, a ne njihove adrese. Takodje, da bi ovo radilo, i mora da bude inicijalizovano, tj. moras mu dodeliti neku vrednost, inace ce i imati neku nasumicnu vrednost i neces znati sta je niz. Da bi pokazivalo na prvi element, i treba da bude 0.
Na kraju, trebalo bi proci kroz sve elemente niza. Primeti da u for petlji a, b, c i d ne menjaju svoju vrednost, tako da ti 16 puta proveravas jednu te istu vrednost.
Ako ti je a pokazivac na element niza, onda mozes da radis ovako:
Kod:
a = niz1;
for (i = 0; i < 16; i++) {
   if (*a < 6)
      count1++;

   a++; /* moras da pomeris pokazivac na sledeci element niza */
};
Mozes i da u promenljivu a upisujes vrednost elementa niza (pretpostavljam da je program zapravo trebalo tako da funkcionise), ali onda to moras svaki put da radis:
Kod:
for (i = 0; i < 16; i++) {
   a = niz1[i];
   if (a < 6)
      count1++;
};
Ipak, nema potrebe da ovo radis, da svaki put vrednost upisujes u promenljivu a, pa da tako proveravas.
Takodje, nema potrebe ni da u for petlji upisuje vrednost u displej, vec to mozes da uradis van for petlje, kada se brojanje zavrsi. I za svaki niz moras imati poseban displej.
Na kraju krajeva, promenljiva count1 ti ni ne treba, odmah broj pomocu displej1.

Ako sam dobro shvatio, imas cetiri niza i trebas da izbrojis koliko je elemenata cije su vrednosti manje od 6 u svakom od tih nizova, pa da broj tih vrednosti upises u displej. Evo kako bih ja to uradio:
Kod:
#include <stdio.h>

void main() {
	int niz1[16] = { 3, 22, 31, 9, 11, 6, 7, 8, 23, 17, 10, 30, 73, 40, 55, 93 };
	int niz2[16] = { 11, 14, 7, 13, 17, 19, 97, 2, 12, 128, 1, 124, 123, 122, 33, 21 };
	int niz3[16] = { 9, 15, 4, 13, 2, 49, 57, 3, 74, 47, 39, 59, 112, 100, 91, 6 };
	int niz4[16] = { 33, 58, 68, 66, 21, 19, 97, 3, 1, 2, 5, 12, 27, 9, 15, 11 };
	int displej1 = 0, displej2 = 0, displej3 = 0, displej4 = 0;
	int i;

	for (i = 0; i < 16; i++) {
		if (niz1[i] < 6)
			displej1++;
		if (niz2[i] < 6)
			displej2++;
		if (niz3[i] < 6)
			displej3++;
		if (niz4[i] < 6)
			displej4++;
	}

	printf("displej1 = %d\ndisplej1 = %d\ndisplej1 = %d\ndisplej1 = %d\n", displej1, displej2, displej3, displej4);
}
Pazi kada proveravas vrednosti niza. Da je niz2 imao manje od 16 elemenata, morala bi da ide neka provera:
Kod:
if (i < niz2duzina && niz2[i] < 6)

Svuda sam koristio int umesto byte, jer mi prijavljuje gresku da ne postoji tip byte.
 
Opet sam dobio motivaciju da radim c++ . Mada sam posle nekoliko neuspeha sa par problema izgubio volju, sad cu probati da radim 1-2 zadatka dnevno(godinu dana i nakupi se ) . Imao sam dosta problema dok sam skapirao pokazivace. Moze se reci da sam ih sada dosta bolje razumeo mada i dalje nije to to . . zadatak. Kreira povezanu listu u ovom slucaju 4 cvora i stampa zbir svih brojeva koji se nalaze u cvorovima .

#include<iostream>
#include<string>
#include<stdio.h>
using namespace std;
struct Node {
int x;
Node *next;
};

int main()
{
int s = 0;
Node *n= new Node;

Node * t;
Node * head;
n->x= 15;

t= n;
head= n ;
// t je temporalna dok je head za pocetak liste. head koristimo za pristup prvom clanu liste

n= new Node ;
n->x=12;
t->next = n;
t=t->next;


n= new Node ;
n->x=3;
t->next = n;
n->next=NULL ;


Node *z= head;

while (z!=NULL)
{
s=s+z->x;
printf(" vrednost u cvoru je %d \n ",z->x);
z=z->next;

}
printf("ukupna vrednost brojeva u cvorevima je %d ",s );


return 0;
}
 
#include <iostream>

using namespace std;

struct node
{ int number ;
node *next ;
};
bool isEmpty( node * head)
{if (head ==NULL )
return true;
else return false ;
}





char menu()
{
char choice ;
cout << "Menu \n";
cout<< " 1. Add an item \n" ;
cout<< " 2. Remove the item \n" ;
cout<< " 3. Show the list \n" ;
cout<< " 4. Exit \n" ;

cin >>choice ;

return choice ;

}

void insertAsFirstElement( node *&head, node *&last, int number )
{
node *temp=new node ;
temp->number= number ;
temp->next=NULL;
head=temp;
last =temp;


}



void insert(node *&head, node *&last, int number)

{if (isEmpty(head))
insertAsFirstElement(head, last, number );
else
{

node *temp=new node ;
temp->number= number ;
temp->next=NULL;
head=temp;
last->next=temp;
last = temp;
}
}

void remove(node *head, node *last)
{if (isEmpty(head))
cout <<"the list is already empty " << endl;
else if (head==last )
{ delete head;
head== NULL;
last ==NULL;
}
else {

node *temp = head;
head = head->next;
delete temp;
}

}
void showList(node *current )
{if(isEmpty(current))
cout << "The list is empty " << endl;
else
{
cout << "The list contains " << endl;
while (current !=NULL)
{

cout << current->number << endl;
current = current ->next;
}

}




}






int main()
{

node *head=NULL;
node *last= NULL;
char choice ;
int number ;

do {
choice = menu();
switch(choice )
{
case '1': cout << "please enter a number " ;
cin >> number ;
insert(head,last,number);
break;
case '2' : remove (head,last);
break;
case '3' : showList(head);
default : cout << "System exit\n";
}

}while(choice !='4');


return 0;
}


nije mi bas najjasnije *& i samo * kad se nalazi u funkciji
 
zadatak, kopira jedan string u drugi. U c-u ne postoji mogucnost dodele nego mora da se smara covek
#include<stdio.h>
#include<stdlib.h>


void kopi(char *s1, char *s2)
{
while (*s2=*s1) // radice sve dok ne dodje do kraja s1
{
s2++;
s1++;
}

}

int main()
{
char *s="U mog dragog obrve debele iz daleka izgleda ko tele " ;
char s1[40];
char *name =(char * ) malloc(5000*sizeof(char ));
s1[0]=*s;

kopi(s,name);
printf("%s",name);
free(name);
}


koliko sam primetio deklaracijom char *s= "nesto " ; s postaje read only . Kad pokusavam da izmenim nesto program poludi
 
funkcija koja proverava da li je dati string palindrom
[
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int pal(char *s)
{
char *p;
p=s+strlen(s)-1;

while (p>s && *p==*s)
{
*s++;
*p--;
}


return s>=p;
}

int main()
{
char * t="piotip" ;
if (pal(t))
printf(" string je palindrom ");
else printf("string nije palindrom");


}
 
funkicija koja vraca pokazivac na prvo pojavljivanje cchara u stringu
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

char * vracanaprvi(char t,char *s)
{
while(*s&& *s!=t) s++;
if(*s) return s;
return NULL;


}

int main()
{
char * t="piotip" ;
char *j;
j=vracanaprvi('t',t);
printf(" %s %s ",j,t);



}
 
izbacuje iz stringa trazeni znak
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
// funkcija izbacuje iz stringa s ,znak x ;
void modi(char x,char *s)
{
char * t ;
t =s ;
while (*t)
{
if (*t!=x) *s++=*t;
*t++;
printf( "%s \n",s);
}
*s='\0'; \\ prvo sam uradio bez ovoga ,ali string ne postaje skracen nego izmeni prvih par karaktera, dok je ostatak jednak starom delu , te je neophodno dati string prekinuti ovom naredbom
}

int main()
{
char k[]="pioitip" ;
char *t;
t=k;
printf("%s\n",t);
modi('i',t);
printf(" %s %s ",t,k);



}
 
Vraca poziciju pojavljivanja stringa p u stringu s. Ako se string p ne nalazi u stringu s vraca -1 kao vrednost.
koriscena je funkcija strstr(a,b) koja vraca pokazivac na prvo mesto pojavljivanja stringa b u a


#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int pozicija( char *s ,char *p)

{
if(strstr(s,p)!=NULL) return strstr(s,p)-s;
else return -1;


}
int main()
{
char * t="piotiptito" ;
char *j="ti";
int r=pozicija(t,j);
printf(" string se nalazi na %d mestu ",r);



}
 
// program koji brise iz stringa s d znakova od pozicije p; u ovom konkretnom primeru iz stringa dobarloszao brise los ;
// specijalan slucaj ali se lako uopstava
int main()
{
char t[]="dobarloszao";
char *p;
p=t;
*(p+5)='\0';
printf("%s\n",p);
strcat(p,p+8);
printf("%s\n",p);


}
 
Zameniti zadati karakter t sa stringom z . U datom primeru zamenjuje b sa xxxx .
#include<stdio.h>
#include<stdlib.h>
#include<string.h>


int main()
{
char t[]="dobarlosbzao";
char *p;
char *r;
char *z="xxxx";
r=t;
p=t;
int t1=1;
char x='b';
char pom[100];
printf("pocetak while schleife\n");
while ( (p=strchr(p,x))!=NULL)
{strcpy(pom,p+1);
strcpy(p,z);
strcat(r,pom);
p=p+strlen(z);

}
printf("Kad se umesto b umetne string xxxx dobija se %s\n",r);

}
 
Zamenjuje niz praznina jednom prazninom u datom stringu
#include<stdio.h>
#include<stdlib.h>
#include<string.h>


int main()
{
char s[100];
char *t;
printf("unesi string s \n");
gets(s);
t=s;
for ( int i=0;s;i++)
if( !i||!(s==' '&&s[i-1]==' '))
*t++=s;
*t='\0';
printf(" novodobijeni string je \n %s\n",s);
}
 
Program koji iz stringa s brise svaki znak koji odgovara bilo kom znaku stringa t
#include<stdio.h>
#include<string.h>
int main()
{

char s[50],t[50];
int i,j;
gets(s);
gets(t);
for (int i=j=0;s;i++)

if (!strchr(t,s))
s[j++]=s;
s[j]='\0';
puts(s);




}
 
brise iz unetog stringa karaktere koji se nalaze izmedju "/*" i " */ "


#include<stdio.h>
#include<string.h>
int main()
{

char s[100];
printf("unesi string s\n");

gets(s);
char *p,*t,*a;
char *i="/*";
p=s;
a=s;
while (p=strstr(s,i))
{
t=strstr(s,"*/");
strcpy(p,t+2);


}
puts(s);



}
 
Stampa reci iz datog stringa po jednu u redu
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main()
{
char s[40]="dobar los zao";

int i,j,k;
strcat(s," ");
for (i=k=0;s;i++)
if(s!=' ') k++;
else if (k)
{
for (j=0;j<k;j++)
printf("%c",s[i-k+j]);
printf("\n");
k=0;

}


}
 
iz datog stringa trazi najduzu rec koja pocinje i zavrsava se sa istim slovom . tj vraca pokazivac na pocetak te reci i pamti duzinu
#include<stdio.h>
#include<stdlib.h>
#include<string.h>


int main()
{ int len;
char s1[100];
char *t,*s;
printf("unesi string s koji se zavrsava sa prazninom \n");
gets(s1);
char *p;
char *x;
int max=0;
char *j=" ";
s=s1;

while ((p=strchr(s,' '))!=NULL)
{printf(" %c\n",*s);
printf (" %c\n",*(p-1));
printf(" vrednost izraza s-p je %d",s-p);
printf(" %s \n %s \n\n\n ",s,p);

if(s!=p)
if(*s==*(p-1))
if ((p-s)>max)
{max =len;
x=s;
}
s=p+1;


}




printf(" novodobijeni string je \n %s\n",x);
}
 
Stampa iz stringa reci duzine od 4 do 10 slova
#include<stdlib.h>
#include<string.h>


int main()
{
char t[]="dobar los bzao cedabeda";
char *p;
char *s;

s=t;
strcat(t," ");
while((p=strchr(s,' '))!=NULL)
{ if ((p-s)>=4 && (p-s)<=10)

{

for (int i=0; i<p-s;i++)
printf("%c",*(s+i));
printf("\n");
}
s=p+1;
}


}
 

Back
Top