Programiranje u C-u - od svega pomalo izdvojena tema

poruka: 1.630
|
čitano: 242.822
|
moderatori: Lazarus Long, XXX-Man, vincimus
+/- sve poruke
ravni prikaz
starije poruke gore
2 godine
online
Programiranje u C-u - od svega pomalo

Samo tuci po kodu, stackoverflow, geeksforgeeks itd će ti pomoći. Što više radiš sam bit ćeš bolji iako će ti duže trebati.

 
0 0 hvala 0
4 mjeseca
offline
Programiranje u C-u - od svega pomalo

Pozdrav, ljudi!

Prolazim kroz neke vježbe za početnike i naišao sam na zadatak gdje neki broj dana treba rasporediti u godine, mjesece, tjedne i ponovo dane (ostatak pri dijeljenju).

Nekako sam ga uspio riješiti, no htio sam da broj dana unosim iz konzole kao parametar (*char argv[]).

Taj string sam koristeći atoi() prebacio u integer i to šljaka.

Međutim, zanima me ima li neka caka da se umjesto *char argv[] unosi niz integera? int argv[] ili nešto slično.

Unaprijed hvala!

 

evo kod:

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

int main (int argc, char *argv[])
{
   int x = atoi(argv[1]);
   int years = x / 365;
   int months = (x % 365) / 30;
   int weeks = ((x % 365) % 30) / 7;
   int days = ((x % 365) % 30) % 7;
   
   printf ("YEARS: %d\n", years);
   printf ("MONTHS: %d\n", months);
   printf ("WEEKS: %d\n", weeks);
   printf ("DAYS: %d\n", days);

}

 
0 0 hvala 0
4 mjeseca
offline
Programiranje u C-u - od svega pomalo

Nevermind za zadnji post.

Pokušavam riješiti zadatak s nekog školskog natjecanja iz 2008. (slike u prilogu).

 

Ovo je kod koji sam napisao, međutim radi samo kada je rotacija istog tipa, čim ih pomiješam, ne radi više ništa.

Ima li itko ideju zašto je tomu tako?

Hvala unaprijed!

 

#include <stdio.h>

int main ()
{
   int fields[3][3] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
   char buffer1[100];
   int nm=0; // moves
   int memory[3][3];
   int command[20];
   int x=1;
   int i=0;
   int j=0;
   char buffer[100];

   fgets(buffer1, 100, stdin);
   sscanf(buffer1, "%d", &nm);

   fgets(buffer, 100, stdin);
   for (i=0; i<nm; i++) {
      sscanf(buffer, "%d", &command[i]);
      switch (command[i])
         {
         case 1:
         memory[0][0]=fields[0][0];
         memory[0][1]=fields[0][1];
         memory[0][2]=fields[1][1];
         memory[0][3]=fields[1][0];

         fields[0][0] = memory[0][3];
         fields[0][1] = memory[0][0];
         fields[1][0] = memory[0][2];
         fields[1][1] = memory[0][1];
         break;
         
         case 2:
         memory[1][0]=fields[0][1];
         memory[1][1]=fields[0][2];
         memory[1][2]=fields[1][1];
         memory[1][3]=fields[1][2];

         fields[0][2] = memory[1][0];
         fields[1][2] = memory[1][1];
         fields[1][1] = memory[1][3];
         fields[0][1] = memory[1][2];
         break;

         case 3:
         memory[2][0]=fields[1][0];
         memory[2][1]=fields[1][1];
         memory[2][2]=fields[2][0];
         memory[2][3]=fields[2][1];

         fields[1][1] = memory[2][0];
         fields[2][1] = memory[2][1];
         fields[2][0] = memory[2][3];
         fields[1][0] = memory[2][2];
         break;
   
         case 4:
         memory[3][0]=fields[1][1];
         memory[3][1]=fields[1][2];
         memory[3][2]=fields[2][1];
         memory[3][3]=fields[2][2];

         fields[1][2] = memory[3][0];
         fields[2][1] = memory[3][3];
         fields[2][2] = memory[3][1];
         fields[1][1] = memory[3][2];
         break;


         default:
         printf ("FAILED");
         }
      }
   //prints out the entire field
   for (i=0; i<3; i++) {
      for (j=0; j<3; j++) {
         printf ("%d", fields[i][j]);
      }
   printf("\n");
   }
   
         
            
   return 0;
}

 
0 0 hvala 0
8 godina
online
Re: Programiranje u C-u - od svega pomalo

Problem je

 

sscanf(buffer, "%d", &command[i]);

 

Ova linija kod svakog izvršavanja učita prvi broj iz stringa buffer, a ne i-ti broj iz stringa buffer.

 

Dodaj jedan printf("%d\n", command[i]); iza ove naredbe i vidjet ćeš da u svakom koraku radiš prvu rotaciju.

4 mjeseca
offline
Re: Programiranje u C-u - od svega pomalo
Bobobo-bo Bo-bobo kaže...

Problem je

 

sscanf(buffer, "%d", &command[i]);

 

Ova linija kod svakog izvršavanja učita prvi broj iz stringa buffer, a ne i-ti broj iz stringa buffer.

 

Dodaj jedan printf("%d\n", command[i]); iza ove naredbe i vidjet ćeš da u svakom koraku radiš prvu rotaciju.

 Da, hvala puno!

trebalo je upotrijebit pointer i onda neki %n i onda pointeru dodat taj n, nemam pojma što to točno radi, ali upalilo je:

 

char *at; // pointer

 

fgets(buffer, 100, stdin);
   at =buffer; //point to buffer
   for (i=0; i<nm; i++) {
      
      sscanf(at, "%d%n", &command[i], &n);

.

.

.

    at += n;

8 godina
online
Re: Programiranje u C-u - od svega pomalo

Taj %n je mehanizam kojim sscanf vraća broj znakova učitanih iz stringa at. Zadnja naredba omogućuje da sljedeći poziv sscanf nastavi tamo gdje je prethodni poziv završio.

9 godina
online
Re: Programiranje u C-u - od svega pomalo

Pozdrav,

 

Napisati C program koji će učitati dva cijela broja A i B, takvi da su veći od 300 i manji od 500, i da je B veće od A za najmanje 28. Ako nisu ispunjeni navedeni uvjeti ispisati poruku "Brojevi nisu u zadanim granicama" i ponoviti učitavanje brojeva.Izračunati broj i zbroj parnih brojevaizmeđuA i B čiji je zbroj znamenki jednak 11.Ispisati broj pronađenih brojeva i njihov zbroj porukom "Brojeva je _, zbroj je _".

 

#include <stdio.h>

int main()

{
    int A, B, C;
    int prva, druga, treca, treca_f;

    printf ("Upisite dva broja: ");
    scanf ("%d%d",&A,&B);

    while (A>500 || A<300 || B>500 || B<300 || B-A<28)
           {

    printf ("Brojevi nisu u zadanim granicama!");
     break;

    }

    for (A; A<B; A++)
    {
        prva=A/100;
        treca_f=A%100;
        treca=treca_f%10;
        druga=treca_f/10;

        if (A%2==0 && prva + druga+treca==11)
        {C++;
        printf ("\n%d", A);
    }
    }
    printf ("Broj brojeva je: %d", C);

    return 0;

}

 

 

Znači sve mi dobro izračuna no program se ne prekida nakon što se unesu pogrešni brojevi. Kako napraviti da se nakon ispisa poruke "Brojevi nisu u zadanim granicama" završi program i korisnik treba upet upisivati brojeve

Poruka je uređivana zadnji put uto 8.9.2020 17:52 (Hazar).
5 godina
offline
Re: Programiranje u C-u - od svega pomalo
Hazar kaže...

 

Napisati C program koji će učitati dva cijela broja A i B, takvi da su veći od 300 i manji od 500, i da je B veće od A za najmanje 28. Ako nisu ispunjeni navedeni uvjeti ispisati poruku "Brojevi nisu u zadanim granicama" i ponoviti učitavanje brojeva.Izračunati broj i zbroj parnih brojevaizmeđuA i B čiji je zbroj znamenki jednak 11.Ispisati broj pronađenih brojeva i njihov zbroj porukom "Brojeva je _, zbroj je _".

  

 

Znači sve mi dobro izračuna no program se ne prekida nakon što se unesu pogrešni brojevi. Kako napraviti da se nakon ispisa poruke "Brojevi nisu u zadanim granicama" završi program i korisnik treba upet upisivati brojeve

 

Ne želiš da ti se program završi, nego želiš da ponovno učitava brojeve.

 

While petlja ti trenutno ništa ne radi nego samo ispisuje poruku, ali se program dalje nastavi, tj radi kao obični if uvjet jer ako uđe u nju odmah izađe iz nje zbog break naredbe.

U while petlji moraš ponovit učitavanje brojeva nakon ispisa "Brojevi nisu u zadanim granicama!" i maknut break kako bi se radnja ponovila sve dok uneseni brojevi ne budu u redu.

2 godine
online
Re: Programiranje u C-u - od svega pomalo

Jesi uspio riješiti ?

9 godina
online
Re: Programiranje u C-u - od svega pomalo
Equi kaže...

Jesi uspio riješiti ?

 Jesam, ovako sam riješio taj problem, ne znam jel najelegantnije riješenje, ali funkcionira :D.

 

#include <stdio.h>

int main()

{
    int A, B, C;
    int prva, druga, treca, treca_f;

    printf ("Upisite dva broja: ");
    scanf ("%d%d",&A,&B);

    while (A>500 || A<300 || B>500 || B<300 || B-A<28)
           {

    printf ("Brojevi nisu u zadanim granicama!");
    printf ("\nPonovno upisite dva broja: ");
    scanf ("%d%d",&A, &B);

    }
    for (A; A<B; A++)
    {
        prva=A/100;
        treca_f=A%100;
        treca=treca_f%10;
        druga=treca_f/10;

        if (A%2==0 && prva + druga+treca==11)
        {C++;
        printf ("\n%d", A);
    }
    }
    printf ("\nBroj brojeva je: %d", C);

    return 0;

}

Nova poruka
E-mail:
Lozinka:
 
vrh stranice