Pomozte s programováním v Javě

Místo pro dotazy a rady ohledně programovacích jazyků (C++, C#, PHP, ASP, Javascript, VBS..) a tvorby webových stránek

Moderátor: Mods_senior

Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7397
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: Pomozte s programováním v Javě

Příspěvekod faraon » 03 lis 2011 00:42

A co takhle nějak?

Kód: Vybrat vše

    cislo=0;
    /* načítání čísla */
    do {
       scanf("%d",&cislo);
       } while (cislo<=2);
       /* dokud není větší než 2 */

    /* projde všechna menší čísla */
    for (i=2;i<cislo;++i)
        {
        prvocislo=TRUE;
        /* otestuje jestli je prvočíslo */
        for (j=2;j<=(int)sqrt((float)i) && prvocislo;++j)
            {
            /* když není zbytek po dělení, není */
            if ((i%j)==0)
               prvocislo=FALSE;
            }
        /* a pokud je, vypíše ho */
        if (prvocislo)
           printf("%d\n",i);
        }


Nebo s funkcí na test prvočísla místo druhé smyčky:

Kód: Vybrat vše

    cislo=0;
    /* načítání čísla */
    do {
       scanf("%d",&cislo);
       } while (cislo<=2);
       /* dokud není větší než 2 */

    /* projde všechna menší čísla */
    for (i=2;i<cislo;++i)
        {
        /* a vypíše prvočísla */
        if (prvocislo(i))
           printf("%d\n",i);
        }


Je to teda v Céčku, Javu neznám ;-)
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)

Reklama
Uživatelský avatar
Funstorm007
Level 5
Level 5
Příspěvky: 2031
Registrován: říjen 08
Pohlaví: Muž
Stav:
Online

Re: Pomozte s programováním v Javě

Příspěvekod Funstorm007 » 03 lis 2011 09:30

No já to nakonec udělal takhle:

Kód: Vybrat vše

import java.util.Scanner;

public class Ppa1_cv05_1_A11B0639P {
   
  public static int vstupMaxCisla() {
    Scanner sc = new Scanner(System.in);
    return sc.nextInt();
  }
  public static boolean jePrvocislo(int cislo) {   
     for (int i = 2; i*i <= cislo; i++) {
        if ((cislo % i) == 0) {
     return(false); }
     }
     return(true);
  }
  public static void main(String[] args) {
    System.out.print("Zadej max. cislo: ");
    int a = vstupMaxCisla();
    System.out.println("---Vysledky---");
    for (int i=2;i<a;i++) {
          if (jePrvocislo(i)) System.out.print(i + ", ");
       }
    }
}


K tomu, aby mi čísla nabíhali od dvou k zadanému číslu stačilo předělat ten for cyklus v mainu...

Uživatelský avatar
Funstorm007
Level 5
Level 5
Příspěvky: 2031
Registrován: říjen 08
Pohlaví: Muž
Stav:
Online

Re: Pomozte s programováním v Javě

Příspěvekod Funstorm007 » 07 lis 2011 18:46

Potřebuju znova pomoct. Program má nebo by mě fungovat asi takhle: Z klávesnice načtu velikost pole a do tohoto pole se mi vypočítají jednotlivé členy Fibonacciho posloupnosti. Bohužel, ať dělám co dělám, pořád se nedaří. Problém bude sřejmě ve zpětném volání metod což jsem doposud nepochopil takže ani pokus omyl nepomáhá. Zatím jsem sklohnil toto:

Kód: Vybrat vše

import java.util.Scanner;

public class XXX {
   
   static private Scanner sc = new Scanner(System.in);
   
      public static int dalsiClen(int[] pole) {
          int predCislo = 0;
          int minCislo = 1;
          int vysledek = 0;
         for(int i = 0; i < velikostPole.length; i++) {
             vysledek = predCislo + minCislo;
             predCislo = minCislo;
             minCislo = vysledek;
          }
          return vysledek;
      }
      public static void main(String[] args) {
         System.out.println("Zadej pocet clenu posloupnosti: ");
         int n = sc.nextInt();
         int[] velikostPole = new int[n];
         System.out.println("---Vysledky---");
         dalsiClen(i);
         
      }
}


Dle mého, je chyba (když neberu v úvahu chyby ve výpočtech, které nemohu ověřit) v tom, že nevracím hodnotu velikostPole do metody dalsiClen a tudíž to nepracuje a tudíž ani nevim, jestli to co dělám vůbec má někdy nějakou reálnou šanci na zprovoznení... Nakonec už jen zavolat metodu dalsiClen na výstup, kde by měla vyjet ta řada o zadaném počtu členů.

EDIT: Tak jsem se trošku pohnul a už to i něco počítá. Sice blbě ale počítá... :D Tady to je:

Kód: Vybrat vše

import java.util.Scanner;

public class XXX {
   
   static private Scanner sc = new Scanner(System.in);
   
      public static int dalsiClen(int[] pole) {
          int predCislo = 0;
          int minCislo = 1;
          int vysledek = 0;
         for(int i = 0; i < pole.length; i++) {
             vysledek = predCislo + minCislo;
             predCislo = minCislo;
             minCislo = vysledek;
          }
          return vysledek;
      }
      public static void main(String[] args) {
         System.out.print("Zadej pocet clenu posloupnosti: ");
         int n = sc.nextInt();
         int[] pole = new int[n];
         System.out.println("---Vysledky---");
         System.out.println("["+dalsiClen(pole)+"]");
         
      }
}

Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7397
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: Pomozte s programováním v Javě

Příspěvekod faraon » 07 lis 2011 21:54

To new int[n] ti zvětšuje pole? Já bych si vystačil s pevnou velikostí, vzhledem k tomu že při int dojde k přetečení na 47. úrovni:

Kód: Vybrat vše

    for (pocet=0;pocet>LIMIT || pocet<1;scanf("%d",&pocet));
    minule=0;
    cislo=1;

    for (i=0;i<pocet;++i)
        {
        fibonacci[i]=minule;
        w=cislo;
        cislo+=minule;
        minule=w;
        }


Opět je to v Céčku, ale to nějak rozluštíš ;-) A pro kontrolu výsledek:

Kód: Vybrat vše

0       0
1       1
2       1
3       2
4       3
5       5
6       8
7       13
8       21
9       34
10      55
11      89
12      144
13      233
14      377
15      610
16      987
17      1597
18      2584
19      4181
20      6765
21      10946
22      17711
23      28657
24      46368
25      75025
26      121393
27      196418
28      317811
29      514229
30      832040
31      1346269
32      2178309
33      3524578
34      5702887
35      9227465
36      14930352
37      24157817
38      39088169
39      63245986
40      102334155
41      165580141
42      267914296
43      433494437
44      701408733
45      1134903170
46      1836311903
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)

Uživatelský avatar
Funstorm007
Level 5
Level 5
Příspěvky: 2031
Registrován: říjen 08
Pohlaví: Muž
Stav:
Online

Re: Pomozte s programováním v Javě

Příspěvekod Funstorm007 » 07 lis 2011 22:28

To new int vytváří pole o proměnné n, ne? Tak tohle nevim jestli rozluštim... :D Jinak, potřeboval bych to dostat do takovéto podoby:
Zadej pocet clenu posloupnosti: 5
---Vysledky---
[0]
[0, 1]
[0, 1, 1]
[0, 1, 1, 2]
[0, 1, 1, 2, 3]
[0, 1, 1, 2, 3, 5]

Jde o to, aby s každým novým elementem v poli se vytvořila další posloupnost větší právě o ten jeden element...

BTW, k čemu že to dojde? Zkus to trošku popsat abych se v to zorientoval...

--- Doplnění předchozího příspěvku (08 Lis 2011 00:05) ---

Tak jsem to ještě dotvořil takhle:

Kód: Vybrat vše

import java.util.Scanner;

public class Ppa1_cv06_1_A11B0639P {
   
   static private Scanner sc = new Scanner(System.in);
   
      public static int vstup() {
         int n = sc.nextInt();
         return n;
      }
   
      public static int dalsiClen(int[] pole) {
         int n = vstup();
         if (n == 0) return 0;
         if (n == 1) return 1;
          int predCislo = 0;
          int minCislo = 1;
          int vysledek = 0;
         for(int i = 0; i < pole.length; i++) {
             vysledek = predCislo + minCislo;
             predCislo = minCislo;
             minCislo = vysledek;
          }
         return vysledek;
      }
      public static void main(String[] args) {
         System.out.print("Zadej pocet clenu posloupnosti: ");
         int n = vstup();
         int[] posloupnost = new int[n];
         System.out.println("---Vysledky---");
            System.out.println("["+dalsiClen(posloupnost)+"]");
      }
}


Problém je v tom, že já tu metodu prostě neumim zavolat na výstup. Počítat už by to mohlo správně ale potřebuju aby mi to i něco vyhodilo na výstupu... chjo, už z toho magořim :?

Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7397
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: Pomozte s programováním v Javě

Příspěvekod faraon » 08 lis 2011 19:12

Takže ty potřebuješ pole polí, a každé z těch polí bude o jednu buňku větší než předchozí? A všechna současně budou v operační paměti...
To by si ten co to vymyslel měl zkusit naprogramovat na osmibitovém počítači se 16 KB RAM, za trest a aby ho přešly takové pitomé nápady :lol:

Přetečení - to znamená že se výsledek nevejde do proměnné. Asi jako kdyby ti na počítadle došly kuličky.
Protože int je na běžných počítačích ve většině dnešních jazyků a kompilátorů dvaatřicetibitový (čtyři bajty), znamená to, že největší číslo co do něj můžeš uložit je 2^31 + 1 bit znaménko, což je v desítkové soustavě něco přes dvě miliardy. Pro záporná čísla platí totéž. Na PDP-11 to bylo horší, tam ses musel vejít do šestnácti bitů, takže se dalo počítat jen v intervalu -32768 až 32767.
Na 45. úrovni té Fibonacciho řady je 1134903170, na 46. zase 1836311903, což po součtu dá skoro tři miliardy, a na to je potřeba i ten 32. znaménkový bit, jenže tím že se změní z 0 na 1 proměnná přeteče do záporných čísel a vyjde úplně špatně -1323752223!

Trošku jsem si to usnadnil (abych tě neděsil ukazateli a funkcemi jako malloc() a sizeof()), pole mám statické, jde hlavně o ty smyčky. Takže nejdřív vstup, ošetřený o hlídání maxima:

Kód: Vybrat vše

    printf("Zadej počet prvků Fibonacciho posloupnosti (max. %d): ",LIMIT);
    for (pocet=-1;pocet>LIMIT || pocet<0;scanf("%d",&pocet));


Druhá část je naplnění polí jednotlivými posloupnostmi. Na začátku každé z nich je nutné resetovat proměnné minule a cislo, jinak ti vyjdou hausnumera:

Kód: Vybrat vše

    for (i=0;i<=pocet;++i)
        {
        minule=0;
        cislo=1;
        for (j=0;j<=i;++j)
            {
            pole[i][j]=temp=minule;
            minule=cislo;
            cislo+=temp;
            }
        }


Třetí část je jejich výpis. Tam jsem fakt nepochopil to
System.out.println("["+dalsiClen(posloupnost)+"]");
To má fungovat rekurzivně nebo Java umí vypsat celé pole jedním příkazem? Něco podobného je ve FORTRANu, v jiných jazycích jsem to zatím neviděl. Takže jsem vypsal jednotlivé prvky pěkně po jednom stejnými smyčkami jako jsem je vytvořil, a kolem nich nalepil tu bižuterii:

Kód: Vybrat vše

    /* výpis polí */
    for (i=0;i<=pocet;++i)
        {
        for (j=0;j<=i;++j)
            if (j)
               printf(", %d",pole[i][j]);
            else
               printf("[%d",pole[i][j]);
        printf("]\n");
        }


Výsledek vypadá takhle:

Kód: Vybrat vše

Zadej počet prvků Fibonacciho posloupnosti (max. 46): 10
[0]
[0, 1]
[0, 1, 1]
[0, 1, 1, 2]
[0, 1, 1, 2, 3]
[0, 1, 1, 2, 3, 5]
[0, 1, 1, 2, 3, 5, 8]
[0, 1, 1, 2, 3, 5, 8, 13]
[0, 1, 1, 2, 3, 5, 8, 13, 21]
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55]


Jen tak naslepo - když ti jedna metoda tu posloupnost vytvoří, nešlo by to tak že jí druhá metoda zobrazí?
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)

Uživatelský avatar
Funstorm007
Level 5
Level 5
Příspěvky: 2031
Registrován: říjen 08
Pohlaví: Muž
Stav:
Online

Re: Pomozte s programováním v Javě

Příspěvekod Funstorm007 » 08 lis 2011 20:27

Takže, to ošetřování maximální zadavetelné hodnoty být nemusí. Předpokládá se, že uživatel bude obeznámen a bude zadávat čísla řekněme třeba jen do deseti. Tím pádem první část odpadá a metoda vstup je tak vyřešena ne? pokud to tedy chápu správně, druhou část vložím do metody dalsiClen, kde "pocet" je zadané číslo (v mém případě n). Nevím ovšem, kam zařadit proměnnou temp. pole[i][j] = temp = minule; předpokládám vytváří pole? Jelikož mi u toho Eclipse vyhazuje chybu. Dále neznám příkaz printf a Eclipse sřejmě také ne. Můžu použít klacický System.out.print?

EDIT: Suma sumárum:

Kód: Vybrat vše

import java.util.Scanner;

public class XXX {
   
   static private Scanner sc = new Scanner(System.in);
   
      public static int vstup() {
         System.out.print("Zadej pocet clenu posloupnosti: ");
         int n = sc.nextInt();
         return n;
      }
   
      public static int dalsiClen(int[] pole) {
         int n = vstup();
          for (int i=0;i<=n;++i) {
           int minule=0;
           int cislo=1;
           for (int j=0;j<=i;++j) {
               pole[i][j] = temp = minule;
               minule = cislo;
               cislo += temp;
               }
           }
         return n;
      }
      public static void main(String[] args) {
         int n = vstup();
          for (int i=0;i<=n;++i) {
           for (int j=0;j<=i;++j)
               if (j == 0)
                  printf(", %d",pole[i][j]);
               else
                  printf("[%d",pole[i][j]);
           System.out.print("]\n");
           }
      }
}

Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7397
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: Pomozte s programováním v Javě

Příspěvekod faraon » 08 lis 2011 20:43

Nikdy nespoléhej na to že uživatel zadá jen povolenou nebo platnou hodnotu, osobně si radši ošetřuji vstupy i u programů které budu používat jen já a nikdo jiný ;-)

Pole jsem si nadeklaroval předem staticky a pro jistotu vyplnil nulami:
int pole[LIMIT][LIMIT]={0};
To si udělej podle svého jak to potřebuješ.

Složené přiřazení
temp. pole[i][j] = temp = minule;
je to samé jako
temp = minule;
temp. pole[i][j] = temp;

Přiřazuje se postupně zprava a dá se to použít třeba pro naplnění víc proměnných stejnou hodnotou.
Tímhle vlastně vkládám aktuální vypočítané číslo do správného místa posloupnosti.

printf() je funkce která píše na standardní výdtup, takže metoda System.out.print by podle názvu měla udělat to samé. Podobně to scanf() je pro čtení ze standardního vstupu...
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)

Uživatelský avatar
Funstorm007
Level 5
Level 5
Příspěvky: 2031
Registrován: říjen 08
Pohlaví: Muž
Stav:
Online

Re: Pomozte s programováním v Javě

Příspěvekod Funstorm007 » 08 lis 2011 20:59

Jasně, kdyby se ten program měl nějak používat jistě by to bylo vhodné, v mém případě tam budu zadávat čísla jen já a to do hodnoty 10. ;) Tím se teď nechci zabývam, momentálně toho. :D mám dost. :D Když ale použiju metodu int dalsiClen(int[] pole) nemůžu v ní vytvářet vícerozměrné pole ne? Nebo, pole[i][j] = temp = minule; je vícerozměrné pole ne? Tak mě napadá, nemůžu teda místo toho temp rovnou používat proměnnou minule?

Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7397
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: Pomozte s programováním v Javě

Příspěvekod faraon » 08 lis 2011 21:06

pole[i][j] je dvourozměrné statické, je to prakticky totéž jako kdybys měl pole[i] vyplněné ukazateli na dynamicky alokovaná pole, vytvořená pomocí toho new(). Pak bys v pole[0] měl ukazatel na pole obsahující nultou posloupnost (0), v pole[1] by byl ukazatel na další pole s první posloupností (0,1) a tak dále...
Akorát že při dynamické alokaci budeš muset trochu jinak napsat to přiřazení, nevím jak to v Javě má přesně vypadat.
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)

Uživatelský avatar
Funstorm007
Level 5
Level 5
Příspěvky: 2031
Registrován: říjen 08
Pohlaví: Muž
Stav:
Online

Re: Pomozte s programováním v Javě

Příspěvekod Funstorm007 » 08 lis 2011 21:18

Tak a teď už v tom mám tuplem bordel:

Kód: Vybrat vše

import java.util.Scanner;

public class XXX {
   
   static private Scanner sc = new Scanner(System.in);
   
      public static int vstup() {
         System.out.print("Zadej pocet clenu posloupnosti: ");
         int n = sc.nextInt();
         return n;
      }
   
      public static int dalsiClen(int[][] pole) {
         int n = vstup();
         for (int i=0;i<=n;++i) {
            int minule=0;
            int cislo=1;
           for (int j=0;j<=i;++j) {
              int temp = minule;
              pole[i][j] = temp = minule;
               minule = cislo;
               cislo += temp;
               }
           }
         return n;
      }
      public static void main(String[] args) {
         System.out.print("---Vysledky---");
         int n = vstup();
          for (int i=0;i<=n;++i) {
           for (int j=0;j<=i;++j)
               if (j == 0)
                  System.out.println(", %d",pole[i][j]);
               else
                  System.out.println("[%d",pole[i][j]);
              System.out.print("]\n");
           }
      }
}


vytvořil jsem proměnnou temp rovné proměnné minule. Zde cislo += temp; mi to ale u toho temp pořád vykazuje chybu. Pak mi to ještě háže chyby na výstupech u toho pole[i][j].

Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7397
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: Pomozte s programováním v Javě

Příspěvekod faraon » 08 lis 2011 21:30

Asi mi nezbyde nic jiného než se tu Javu také trochu naučit, moc věcí z Céčka tam nefunguje a já zase tomu zápisu skoro nerozumím. Ale je fakt že to moje algolské formátování také není pro jiné kdovíjak přehledné :-D

cislo+=temp; znamená cislo=cislo+temp;
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)


Zpět na “Programování a tvorba webu”

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 6 hostů