Pole v C – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Pole v C – C / C++ – Fórum – Programujte.comPole v C – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Tomilian0
Duch
30. 10. 2009   #1
-
0
-

Prosim o pomoc s ukolem, neco jsem sestavil, ale nevim jak by to melo kompletne vypadat...



1.V programu deklarujte jednorozměrné pole, naplněte ho čísly a vypište hodnoty čísel v tomto poli na obrazovku. Poté obraťte pořadí čísel v tomto poli (tj. první bude původně poslední číslo, druhé původně předposlední atd.) a hodnoty ve změněném poi vypište na obrazovku.
Není dovoleno použití druhého pole, ani znovunaplnění pole hodnotami v opačném pořadí. Část zdrojového kódu, která zaměňuje pořadí prvků v poli, musí být zcela nezávislá na tom, jakými hodnotami bylo pole původně naplněno.

2.V jazyku C vytvořte program, který pomocí algoritmu Eratosthenova síta určí a vypíše všechna prvočísla menší než číslo 100.
1. Vytvoříme pole všech čísel od 2 do požadovaného maximálního zkoumaného čísla.
2. Procházíme pole, dokud nenajdeme nevyškrtnuté číslo. Toto číslo je prvočíslem, můžeme jej proto vypsat na obrazovku.
3. Vyškrtáme z pole všechny násobky právě nalezeného prvočísla (např. změnou hodnoty na 0).
4. Pokračujeme krokem 2, dokud zbývají nějaká nevyškrtnutá čísla.

Nahlásit jako SPAM
IP: 213.192.4.–
Reklama
Reklama
Bald3rr0
Super člen
30. 10. 2009   #2
-
0
-

To Tomilian : Nikdo ti kompletní řešení nenapíše, napiš jaký máš konkrétní problém :)

Nahlásit jako SPAM
IP: 82.100.0.–
Tomilian0
Duch
30. 10. 2009   #3
-
0
-

Tak u ty jednicky mam



#include<stdlib.h>

int main()
{
int i, e, k;
int pole[10];
int eras[100];

//* Obrácené pole *//
for (i = 0;i < 10;i++){
pole[i] = i+1;
printf("%d, ", pole[i]);
}

ale nevim jak to udelat dal aby v dalsi podmince prvni prvek z pole puvodniho byl posledni a druhy predposledni atd...

Nahlásit jako SPAM
IP: 213.192.4.–
Tomilian0
Duch
30. 10. 2009   #4
-
0
-

A u toho Sita nevim jak napsat aby se ty nasobky cisla vymazali a prvocislo se ulozilo do pole...

Nahlásit jako SPAM
IP: 213.192.4.–
Bald3rr0
Super člen
30. 10. 2009   #5
-
0
-

To Tomilian : 1)

const int nVelikostPole = 10; // Počet prvků v poli (je lepš přepsat jednu hodontu, než pak upravovat půlku čísel ;))

int pole[nVelikostPole]; // Definice bude teda takto
//* prohozeni *//
for(i = 0; i < (nVelikostPole/2); i++) {
nTemp = pole[i];
pole[i] = pole[nVelikostPole-i-1];
pole[nVelikostPole-i-1] = nTemp;
}
// Výpis prohozenýho pole
for (i = 0;i < nVelikostPole;i++)
printf("%d, ", pole[i]);

To síto je taky jednoduché, kdyžtak zkus sám a kdybys nevěděl, mohu ti poradit :)

Nahlásit jako SPAM
IP: 82.100.0.–
Tomilian0
Duch
1. 11. 2009   #6
-
0
-

Díky za ten první, akorát šlo by tam ještě nějak vložit aby se po vypsani tech N prvku pole naplnilo nulami a pote se zase naplnilo prvky N v opacnem poradi a vypsalo?U toho sita jsem dumal a dumal, ale vubec netusim jak na to, jak by to melo vypadat...

Nahlásit jako SPAM
IP: 213.192.4.–
m->29+6
Super člen
1. 11. 2009   #7
-
0
-

U toho sita je to jednoduché. Začneš v poli na 2 a postupne všetky násobky 2 až do 100 nastavíš na 1. Na konci ti niektoré prvky ostanú v 0 a tie sú prvočísla.

uint sito[100] = {0};

for(uint i=2; i<100; i++) { // Eratosthenovo sito
if(sito[i]== 0) {
for(uint j=i*i; j<100; j+=i) {
sito[j] = 1;
}
}
}


Potom len skontroluješ ktoré položky sú nastavené na 0 a ich indexy sú prvočísla;-)

Nahlásit jako SPAM
IP: 147.229.208.–
Tomilian0
Duch
1. 11. 2009   #8
-
0
-



int sito[100] = {0};
int i, j;


for(i=2; i<100; i++) {

if(sito[i]== 0) {

for(j=i*i; j<100; j+=i) {

sito[j] = 1;
}
}

printf("%d ", sito[i]);

}
}


Jak to mam jeste prosim upravit aby se misto nul a jednicek vypsali primo ty prvocisla?

Nahlásit jako SPAM
IP: 213.192.4.–
m->29+6
Super člen
1. 11. 2009   #9
-
0
-

Prvočísla sú indexy položiek, kt. majú hodnotu 0. Čiže ti stačí v cykle vypisovať index, pri podmienke sito[i] == 0 (okrem i==0).

Nahlásit jako SPAM
IP: 147.229.208.–
Tomilian0
Duch
1. 11. 2009   #10
-
0
-

Tomu nejak nerozumim jak by to melo byt napsano...

Nahlásit jako SPAM
IP: 213.192.4.–
m->29+6
Super člen
2. 11. 2009   #11
-
0
-

Myslím, že som ti napísal dosť. Ak tomu nerozumieš tak si nájdi na googli čo je index pola, podmienka if a cyklus for. Toto je všetko čo je ti k tomu treba. Nech spravíš trochu tej úlohy aj ty :-D

Nahlásit jako SPAM
IP: 147.229.208.–
Tomilian0
Duch
6. 11. 2009   #12
-
0
-



for (y = 2;y <= e;y++){
for (x = 1;x < e;x++){
if(((eras[x]%y) == 0) && (eras[x] != y)){
eras[x] = 0;
}
}
}


Nevi nekdo prosim jak by sel upravit vnitřní cyklus(3krtac=i), aby se v nem uz nemuseli testovat dalsi podminky?

Nahlásit jako SPAM
IP: 213.192.4.–
Tomilian0
Duch
8. 11. 2009   #13
-
0
-

??

Nahlásit jako SPAM
IP: 213.192.4.–
Tomasko0
Duch
16. 5. 2010   #14
-
0
-

Ahojte,
mam v skole vytvoriť program (pomocou Dev-C++), ktorý zisti či je dane číslo prvočíslom. Samotne Erostonovo sito už spravené mam, t.j. dokázal by som vypísať na obrazovku prvočísla od 2 až napríklad po milión, takže s týmto problém nemám. Ale mojou úlohou nieje ich vypísanie, ale to aby po zadaní ľubovoľného čísla vypísal program či dané číslo je alebo nie je prvočíslom. A momentálne si s tým vôbec neviem rady. Neviem ako mám zadefinovať podmienku pre overenie či sa to číslo medzi nimi nachádza alebo nie. Viem,že to asi nebude moc ťažké nebude, ale čím dlhšie nad tým sedím tým viac sa mi to komplikuje a preto Vás chcem poprosiť o menšiu radu, ako sa pohnúť ďalej. Pre ukážku môj zdrojový kód.

   

#include<stdio.H>
#include<stdlib.H>
#include<math.H>

main()
{
int MAT[99999];
int i,j;

for(i=0;i<99999;i++){
MAT[i]=i+2;
}
for(i=0;i<99999;i++){
j=i+1;
if(MAT[i]!=0){
while(j<99999)
{
if(MAT[j]%MAT[i]==0)
{
MAT[j]=0;
}
j++;
}
}
}

/*
Ak by som ich chcel vypísať prvočísla na obrazovku,tak by som následne takto pokračoval.
Ale tu asi niekde by mala nasledovať ta podmienka overenia, len neviem ako ju zadefinovať.

for(i=0;i<99999;i++){
if(MAT[i]!=0){
printf("%d ",MAT[i]);
}
}
*/

system("pause");
return 0;
}

Nahlásit jako SPAM
IP: 195.168.24.–
Tomasko0
Duch
16. 5. 2010   #15
-
0
-

To Tomasko : Viem, že najskôr musím dané číslo načítať do nejakej premennej, len mam problém s tou podmienkou porovnania či to číslo tam je, resp. nie je.

Nahlásit jako SPAM
IP: 195.168.24.–
m->29+6
Super člen
16. 5. 2010   #16
-
0
-

Myslím, že chceš niečo takéto :-D

if(MAT[zadane_prvocislo]!=0) { puts("Je prvocislo"); }

else { puts("nie je prvocislo"); }
Program som ani neštudoval skoro, ale prvočíslom je index, takže by si mal vypisovať v tom poslednom cykle i, nie MAT[i]. Aspoň tak pracuje Erast. sito ;-)

Nahlásit jako SPAM
IP: 147.229.208.–
Tomasko0
Duch
17. 5. 2010   #17
-
0
-

To m->29 : Áno niečo v tomto duchu som chcel. Ďakujem za pomoc. Po odskúšaní programu však nastal ďalší problém. Pre niektoré prvočísla ako napr. 3 a 5 program vypíše to čo by mal, t.j. PRVOČÍSLO a pre prvočísla ako napr. 2 a 7 vypíše NIE JE PRVOČÍSLO. A teraz už vonkoncom netuším kde je pes zakopaný :-(

Nahlásit jako SPAM
IP: 195.168.24.–
zdenda
~ Anonymní uživatel
257 příspěvků
17. 5. 2010   #18
-
0
-

Ale obsah MAT začíná dvojkou.

if (MAT[zadane_prvocislo-2] != 0) ...

Nahlásit jako SPAM
IP: 213.211.51.–
Tomasko0
Duch
17. 5. 2010   #19
-
0
-

To zdenda :
Ahojte ďakujem všetkým za pomoc.... už to frčí tak ako by malo :smile18:

Nahlásit jako SPAM
IP: 195.168.24.–
m->29+6
Super člen
17. 5. 2010   #20
-
0
-

Hej, až teraz som to pozrel (včera som pozeral už do kódu dosť a nechcelo sa mi) a zisťujem, že on si tie prvočísla uložil ako hodnoty. Erastotenovo sito by malo fungovať ako bitové pole, čiže ako prvočíslo je index a hodnota je len 1. bit (0 alebo 1). Tým aj ušetríš pamäť. Takto použiješ 99999 int-ov a hentak by si použil len 99999/(sizeof(int)*8) int-ov.

Nahlásit jako SPAM
IP: 147.229.208.–
Tomasko0
Duch
19. 5. 2010   #21
-
0
-

To m->29 :
Určite na tom niečo pravdy bude, ale v tomto prípade je dôležitý výsledok, takže to či program pracuje správne :smile7:
Ak budem mať potom viac času na hranie sa s detailami, tak sa na to hodím očkom :smile19:

Nahlásit jako SPAM
IP: 195.168.24.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 143 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý