Opdracht LOI hulp
Momenteel ben ik bezig met een PHP cursus maar ik loop vast bij een opdracht.
Hieronder de beschreven opdracht:
Maak een uitbreiding op compdna.php. De bedoeling van de uitbreiding is dat met behulp van een for lus de string onderzocht wordt op 'AAAAAA'. De leiding van het NFI wil graag dat bij iedere gevonden 'AAAAAA' de positie wordt afgedrukt.
Noem het programma compdna2.php .
compdna.php is het volgende script:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
$dna1 = "TATAGTTTCCTCTCTATAT";
$dna2 = <<<DNA
AAAGCCTCAAATCTCTCTAGTAAAAAAGCCTCAAATCTCTCTAGTAAA<BR>
AAAGCCTCAAATCTCTCTAGTAAAAAAGCCTCAAATCTCTCTAGTAAA<BR>
AAAGCCTCAAATCTCTCTAGTAAAAAAGCCTCAAATCTCTCTAGTAAA<BR>
AAAGCCTCAAATCTCTCTAGTAAAAAAGCCTCAAATCTCTCTAGTAAA<BR>
AAAGCCTCAAATCTCTCTAGTAAAAAAGCCTCAAATCTCTCTAGTAAA<BR>
AAAGCCTCAAATCTCTCTAGTAAAAAAGCCTCAAATCTCTCTAGTAAA
DNA;
$dnatotal = $dna1.$dna2;
echo $dnatotal;
?>
$dna1 = "TATAGTTTCCTCTCTATAT";
$dna2 = <<<DNA
AAAGCCTCAAATCTCTCTAGTAAAAAAGCCTCAAATCTCTCTAGTAAA<BR>
AAAGCCTCAAATCTCTCTAGTAAAAAAGCCTCAAATCTCTCTAGTAAA<BR>
AAAGCCTCAAATCTCTCTAGTAAAAAAGCCTCAAATCTCTCTAGTAAA<BR>
AAAGCCTCAAATCTCTCTAGTAAAAAAGCCTCAAATCTCTCTAGTAAA<BR>
AAAGCCTCAAATCTCTCTAGTAAAAAAGCCTCAAATCTCTCTAGTAAA<BR>
AAAGCCTCAAATCTCTCTAGTAAAAAAGCCTCAAATCTCTCTAGTAAA
DNA;
$dnatotal = $dna1.$dna2;
echo $dnatotal;
?>
Nu is het dus de bedoeling om met een for loop de substring positie van 'AAAAAA' te vinden en bij elke keer dat deze gevonden wordt de positie af te drukken. Ik heb het volgende script geschreven:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
$dna1 = "TATAGTTTCCTCTCTATAT";
$dna2 = <<<DNA
AAAGCCTCAAATCTCTCTAGTAAAAAAGCCTCAAATCTCTCTAGTAAA<BR>
AAAGCCTCAAATCTCTCTAGTAAAAAAGCCTCAAATCTCTCTAGTAAA<BR>
AAAGCCTCAAATCTCTCTAGTAAAAAAGCCTCAAATCTCTCTAGTAAA<BR>
AAAGCCTCAAATCTCTCTAGTAAAAAAGCCTCAAATCTCTCTAGTAAA<BR>
AAAGCCTCAAATCTCTCTAGTAAAAAAGCCTCAAATCTCTCTAGTAAA<BR>
AAAGCCTCAAATCTCTCTAGTAAAAAAGCCTCAAATCTCTCTAGTAAA
DNA;
$dnatotal = $dna1.$dna2;
$length = strlen($dnatotal);
for (
$count = 0;
$count <= $length;
$count++)
{
print strpos($dnatotal, 'AAAAAA',$count) and print "<BR>";
}
?>
$dna1 = "TATAGTTTCCTCTCTATAT";
$dna2 = <<<DNA
AAAGCCTCAAATCTCTCTAGTAAAAAAGCCTCAAATCTCTCTAGTAAA<BR>
AAAGCCTCAAATCTCTCTAGTAAAAAAGCCTCAAATCTCTCTAGTAAA<BR>
AAAGCCTCAAATCTCTCTAGTAAAAAAGCCTCAAATCTCTCTAGTAAA<BR>
AAAGCCTCAAATCTCTCTAGTAAAAAAGCCTCAAATCTCTCTAGTAAA<BR>
AAAGCCTCAAATCTCTCTAGTAAAAAAGCCTCAAATCTCTCTAGTAAA<BR>
AAAGCCTCAAATCTCTCTAGTAAAAAAGCCTCAAATCTCTCTAGTAAA
DNA;
$dnatotal = $dna1.$dna2;
$length = strlen($dnatotal);
for (
$count = 0;
$count <= $length;
$count++)
{
print strpos($dnatotal, 'AAAAAA',$count) and print "<BR>";
}
?>
Nu vind ik inderdaad de positie en druk deze telkens af, maar hij drukt nu elke keer de positie dubbel af zolang $count kleiner is of gelijk is aan $length. Volgens mij hoef ik maar een klein aanpassing te maken, maar ik kom er niet uit! Kan iemand mij op weg helpen? ;) Bedankt!!
waarom niet echo strpos($dnatotal, 'AAAAAA', $count).'<br>';
Kijk eens naar substr().
Ik ben een beginner, vandaar waarschijnlijk :P maar bedankt voor de tip
Albert de Wit op 17/08/2012 14:32:44:
waarom niet echo strpos($dnatotal, 'AAAAAA', $count).'<br>';
Gewijzigd op 17/08/2012 14:40:36 door - SanThe -
waarom niet? komt dacht ik toch op hetzelfde neer?
Toevoeging op 17/08/2012 14:37:01:
met accolades uiteraard
Sorry, ik zit heel ergens anders op te reageren.
Vergeet even mijn laatste bijdragen.
Gewijzigd op 17/08/2012 14:41:21 door - SanThe -
@TS
wat is het resultaat nu?
substr_count().
Raar van de LOI dat ze zo ouderwets werken terwijl het dus veel korter kan (welliswaar zonder for-lus, maar die is niet nodig).
Mocht je alles af hebben, en het werkt.... kijk dan eens naar Raar van de LOI dat ze zo ouderwets werken terwijl het dus veel korter kan (welliswaar zonder for-lus, maar die is niet nodig).
LOI had dit lesmateriaal waarschijnlijk in 2005 al, en gebruiken ze over 5 jaar nog denk ik. Als je wilt leren programmeren, niet op zoek gaan naar een school (tenzij je het papiertje graag wilt hebben), maar google. Fora als dit zijn je grootste vriend op het gebied van het leren van programmeren.
Zeg, waarom moet dat met een for?
strpos geeft je de locatie van het zoekresultaat. Wat je daarna moet doen, is de zoekopdracht pas beginnen vanaf de positie van het vorige zoekresultaat (1 karakter verder). Anders blijf je maar het zelfde vinden. Dus het vorige zoekresultaat + 1 geef je mee als derde parameter.
Hier een voorbeeld, met een while.
Code (php)
en aangezien een for niet veel meer is dan een speciale while ... kan je er dit van maken ook:
for(;FALSE !== $newPos = strpos($dnatotal, 'AAAAAA', $newPos);) {
Gewijzigd op 17/08/2012 15:02:04 door Kris Peeters
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
$dna1 = "TATAGTTTCCTCTCTATAT";
$dna2 = <<<DNA
AAAGCCTCAAATCTCTCTAGTAAAAAAGCCTCAAATCTCTCTAGTAAA<BR>
AAAGCCTCAAATCTCTCTAGTAAAAAAGCCTCAAATCTCTCTAGTAAA<BR>
AAAGCCTCAAATCTCTCTAGTAAAAAAGCCTCAAATCTCTCTAGTAAA<BR>
AAAGCCTCAAATCTCTCTAGTAAAAAAGCCTCAAATCTCTCTAGTAAA<BR>
AAAGCCTCAAATCTCTCTAGTAAAAAAGCCTCAAATCTCTCTAGTAAA<BR>
AAAGCCTCAAATCTCTCTAGTAAAAAAGCCTCAAATCTCTCTAGTAAA
DNA;
$dnatotal = $dna1.$dna2;
$length = strlen($dnatotal);
for($count = 0; $count < $length; $count++)
{
if(substr($dnatotal, $count,6) == 'AAAAAA') echo $count."<BR>";
}
?>
$dna1 = "TATAGTTTCCTCTCTATAT";
$dna2 = <<<DNA
AAAGCCTCAAATCTCTCTAGTAAAAAAGCCTCAAATCTCTCTAGTAAA<BR>
AAAGCCTCAAATCTCTCTAGTAAAAAAGCCTCAAATCTCTCTAGTAAA<BR>
AAAGCCTCAAATCTCTCTAGTAAAAAAGCCTCAAATCTCTCTAGTAAA<BR>
AAAGCCTCAAATCTCTCTAGTAAAAAAGCCTCAAATCTCTCTAGTAAA<BR>
AAAGCCTCAAATCTCTCTAGTAAAAAAGCCTCAAATCTCTCTAGTAAA<BR>
AAAGCCTCAAATCTCTCTAGTAAAAAAGCCTCAAATCTCTCTAGTAAA
DNA;
$dnatotal = $dna1.$dna2;
$length = strlen($dnatotal);
for($count = 0; $count < $length; $count++)
{
if(substr($dnatotal, $count,6) == 'AAAAAA') echo $count."<BR>";
}
?>
Code (php)
Maar misschien is dit nog iets te ver gegrepen voor de topic starter.
Edit:
Gewijzigd op 17/08/2012 15:09:51 door Wouter J
Zeg, wat was de opgave eigenlijk precies?
Wat moet er precies wel gebruikt worden en wat precies niet?
Want als het via een for-lus moet, verwachten ze waarschijnlijk iets met substr, zoals SanThe toont.
Als het met strpos mag ... staat die for-lus daar eigenlijk niets te doen.
---
EDIT:
nu ik het bekijk, had ik mijn code beter met een for gemaakt.
Dus laat me herformuleren: die for staat daar wel iets te doen, maar wordt niet gebruikt zoals men dit normaal gebruikt.
Code (php)
Gewijzigd op 17/08/2012 15:36:20 door Kris Peeters
Oefenopgave 1
Voor het Nederlands Forensisch Instituut schrijft u een programma dat 1 string DNA samenvoegt met een DNA string welke bestaat uit meerdere regels. Het programma heet compdna.php . Gebruik de onderstaande Strings voor het programma:
String1 = TATAGTTTCCTCTCTATAT
String2 = AAAGCCTCAAATCTCTCTAGTAAAAAAGCCTCAAATCTCTCTAGTAAA
AAAGCCTCAAATCTCTCTAGTAAAAAAGCCTCAAATCTCTCTAGTAAA
AAAGCCTCAAATCTCTCTAGTAAAAAAGCCTCAAATCTCTCTAGTAAA
AAAGCCTCAAATCTCTCTAGTAAAAAAGCCTCAAATCTCTCTAGTAAA
AAAGCCTCAAATCTCTCTAGTAAAAAAGCCTCAAATCTCTCTAGTAAA
AAAGCCTCAAATCTCTCTAGTAAAAAAGCCTCAAATCTCTCTAGTAAA
Test het programma met behulp van Wampserver.
LeesopdrachtLees paragraaf 8.2 van het boek.
Oefenopgave 2 Maak een uitbreiding op compdna.php. De bedoeling van de uitbreiding is dat met behulp van een for lus de string onderzocht wordt op 'AAAAAA'. De leiding van het NFI wil graag dat bij iedere gevonden 'AAAAAA' de positie wordt afgedrukt.
Noem het programma compdna2.php
Ik gebruik het boek http://www.sdu.nl/catalogus/9789039522813 (kreeg ik bijgeleverd bij de LOI Cursus). Dit is toch niet erg verouderd? Ik merk wel bij die opgaven van LOI dat er vaak achterhaalde dingen tussen zitten terwijl je ook op een simpelere/snellere manier opgaven kunt maken.
In ieder geval bedankt voor jullie snelle reacties, ik ga de opgave eens even aanpassen aan de hand van jullie tips. Als ik vragen heb laat ik het wel weten!
Toevoeging op 17/08/2012 15:59:43:
for (;FALSE !== $newPos = strpos($dnatotal, 'AAAAAA', $newPos);) {
Wat doet FALSE precies hier? Ik begrijp inderdaad dat je na het zoekresultaat verder moet zoeken vanaf de positie van het vorige zoekresultaat. De bovenste code zorgt hier blijkbaar voor (en de $newPos++ uiteraard). Ik begrijp alleen niet wat ;FALSE!== $newPos = strpos..etc. doet hier! Kan iemand dit uitleggen?
Dat kan 15 zijn, maar kan even goed 0 zijn (direct, vanaf het eerste karakter prijs).
Om duidelijk te maken dat de functie niets heeft gevonden, geeft het een FALSE terug.
Dus, laat je de while (of for) zoeken totdat strpos een FALSE terug geeft.
Let er op: 0 en FALSE worden nogal vlug als gelijk aanzien
met een === gebeurt dat niet (de negatie is dan !==). Dan wordt ook gekeken of het type van beide gelijk zijn.
Gewijzigd op 17/08/2012 16:48:44 door Kris Peeters
Ah, dat verklaart een hoop. Thanks!!
In PHP heb je 2 hele speciale waarden: true en false. Deze worden booleans (afgekort bool) genoemd. True staat gelijk aan een succes en false aan een niet succesvol iets.
Stel dat je de functie isset gebruikt. Deze kijkt of een variabele geset is (ingesteld is). Als dat zo is geeft hij true terug (het is een succes) mocht dit niet zo zijn dan komt er een false terug.
Onze functie, strpos, kan meerdere waardes terug geven. Zoals je in de PHP documentatie kan zien geeft deze de positie terug en als er niks gevonden is false.
We willen de loop doorlaten gaan totdat de strpos niks meer kan vinden en dus false retourneert. De voorwaarde voor het doorlaten gaan van een loop of het stoppen kun je plaatsen in het 2e gedeelte van de for conditie. Als deze true is, daar heb je hem weer, loopt de loop door, anders stopt ie.
In jou eerste code:
Jou voorwaarde van het door laten lopen van de loop is dat $count kleiner of gelijk moet zijn aan $length. Als dat zo is geeft $count <= $length namelijk true (een succes) terug en anders false en stopt de loop.
Nu weer terug naar ons voorbeeld, we willen de loop laten lopen zolang strpos iets kan vinden, en dus iets anders dan false retourneert. Nou dat doen we:
Maar nu hebben we een probleem. Die domme PHP taal accepteert neemt waardes als 0 of '' namelijk ook aan voor false. Dus mocht PHP de strpos positie 0 teruggeven stopt de loop ook. Daarom moeten we !== gaan gebruiken:
Wat willen we nu in de loop doen? We willen de positie echoën, dus:
Code (php)
Maar zie je hier het dubbele werk? We schrijven 2x het 'strpos($dnatotal, 'AAAAAA', $i)' gedeelte. Dat betekend dat we 'AAAAAA' op 2 plaatsen moeten aanpassen als we naar 'BBBBBB' willen zoeken. En nog erger, PHP zal 2 keer de hele string af moeten zoeken naar 'AAAAAA'.
Daarom slaan we de eerste waarde op in een variabele. Vervolgens moeten we kijken of die variabele geen false bevat:
Code (php)
Zie je wat er veranderd is? We doen nu 2 dingen op 1 regel:
Code (php)
En dan zijn we uit gekomen bij onze laatste code.
Bedankt Wouter voor je uitgebreide uitleg! Het is me nu helemaal duidelijk!