Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Fgets + stlen() [Problem z liczeniem znaków]
motyl-pl
post 6.11.2010, 00:07:47
Post #1





Grupa: Zarejestrowani
Postów: 294
Pomógł: 31
Dołączył: 2.04.2010

Ostrzeżenie: (0%)
-----


  1. <?php
  2. final class polowa {
  3. var $wiersz = array();
  4. var $linia = 0;
  5. var $t;
  6.  
  7. function __construct() {
  8. $uchwyt = fopen('tak.txt', 'r');
  9.  
  10. while(!feof($uchwyt)) {
  11. $this->wiersz[$this->linia] = fgets($uchwyt, 1024);
  12. $this->linia++;
  13. }
  14.  
  15. $this->t = $this->wiersz[0];
  16.  
  17. fclose($uchwyt);
  18. }
  19.  
  20. function sprawdzt() {
  21. if($this->t < 1 or $this->t > 100) {
  22. echo "Liczba t jest nie odpowiednia!";
  23. }
  24. }
  25.  
  26.  
  27. function wyswietl() {
  28. for($i=1; $i <= $this->t; $i++) {
  29. $this->sprciag($this->wiersz[$i]);
  30. $caly_wyraz = strlen($this->wiersz[$i]) / 2 ;
  31. $skrocony_wyraz = floor($caly_wyraz);
  32. echo substr($this->wiersz[$i], 0, $skrocony_wyraz)."\n";
  33. }
  34. }
  35.  
  36. function sprciag($wejscie) {
  37. $sprawdz = 2 * strlen($wejscie);
  38. if($sprawdz>1000) {
  39. echo "Ciąg jest za duży";
  40. }
  41. }
  42.  
  43. }
  44.  
  45. $tak = new polowa();
  46. $tak->sprawdzt();
  47. $tak->wyswietl();
  48.  
  49. ?>


tak.txt
Kod
3
pierwszy
lubiec
ktotozrobi


Wejście
W pierwszej linijce wejścia znajduje się jedna liczba całkowita t (1<=t<=100). Każdy wiersz o numerze od 2 do t+1, zawiera ciąg długości 2*k (1<=k<=1000).

Wyjście
Dla każdego przypadku testowego na wyjściu powinien pojawić się ciąg będący pierwszą połową wczytanego ciągu.


Mój problem gdy odczytuje poszczególne wiersze, to strlen jest nie prawidłowe.
Ma ktoś jakiś pomysł ?


--------------------
Go to the top of the page
+Quote Post
kiler129
post 6.11.2010, 00:26:41
Post #2





Grupa: Zarejestrowani
Postów: 566
Pomógł: 35
Dołączył: 21.06.2006

Ostrzeżenie: (0%)
-----


Nie mam czasu wgłębiać się w kod ale wykonujesz pracę 2x ;]
Do odczytu użyj funkcji file() która zwraca tablicę.


--------------------
flexiCMS v2 [|||||||+--] 75% done
Go to the top of the page
+Quote Post
motyl-pl
post 6.11.2010, 01:12:51
Post #3





Grupa: Zarejestrowani
Postów: 294
Pomógł: 31
Dołączył: 2.04.2010

Ostrzeżenie: (0%)
-----


Zamieniłem na file ale daje ten sam problem, że strlen źle zlicza.
  1. <?php
  2. final class polowa {
  3. var $uchwyt = array();
  4. var $linia = 0;
  5. var $t;
  6.  
  7. function __construct() {
  8. $this->uchwyt = file('tak.txt');
  9.  
  10. echo strlen($this->uchwyt[1]);
  11.  
  12. $this->t = $this->uchwyt[0];
  13. }
  14.  
  15. function sprawdzt() {
  16. if($this->t < 1 or $this->t > 100) {
  17. echo "Liczba t jest nie odpowiednia!";
  18. }
  19. }
  20.  
  21.  
  22. function wyswietl() {
  23. for($i=1; $i <= $this->t; $i++) {
  24.  
  25. $this->sprciag($this->uchwyt[$i]);
  26.  
  27. $caly_wyraz = strlen($this->uchwyt[$i]) / 2 ;
  28. $skrocony_wyraz = floor($caly_wyraz);
  29.  
  30. echo substr($this->uchwyt[$i], 0, $skrocony_wyraz)."\n";
  31. }
  32. }
  33.  
  34. function sprciag($wejscie) {
  35. $sprawdz = 2 * strlen($wejscie);
  36. if($sprawdz>1000) {
  37. echo "Ciąg jest za duży";
  38. }
  39. }
  40.  
  41. }
  42.  
  43. $tak = new polowa();
  44. $tak->sprawdzt();
  45. $tak->wyswietl();
  46.  
  47. ?>


Ktoś ma może inny pomysł ?

Ten post edytował motyl-pl 6.11.2010, 01:13:19


--------------------
Go to the top of the page
+Quote Post
kiler129
post 6.11.2010, 01:34:15
Post #4





Grupa: Zarejestrowani
Postów: 566
Pomógł: 35
Dołączył: 21.06.2006

Ostrzeżenie: (0%)
-----


Nudziło mi się smile.gif
  1. <?php
  2. final class half {
  3. var $date = array(); //Data array
  4. var $rowsToRead;
  5.  
  6. function __construct($file) {
  7. if(empty($file) || !is_readable($file)) { echo "Brak pliku lub jest nieczytelny!"; die(); }
  8. $this->data = file('tak.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); //Read file
  9. var_dump($this->data); //Check data by hand
  10.  
  11. $this->rowsToRead = $this->data[0]; //Number of rows
  12. if($this->rowsToRead < 1 || $this->rowsToRead > 100) {
  13. echo "Liczba t jest nie odpowiednia!";
  14. die();
  15. }
  16. }
  17.  
  18.  
  19. function spilt() {
  20. $res = "";
  21. for($i=1; $i<=$this->rowsToRead; $i++) {
  22. if((2*strlen($this->data[$i]))>1000) {
  23. echo "Ciąg w linii $i jest za duży";
  24. continue;
  25. }
  26.  
  27. $res .= substr($this->data[$i], 0, floor((strlen($this->data[$i]) / 2)))."\n";
  28. }
  29. return $res;
  30. }
  31. }
  32. /**************/
  33. $tak = new half("tak.txt");
  34. var_dump($tak->spilt());
  35. /**************/
  36.  
  37. //Expected results:
  38. /*
  39. array(4) {
  40.   [0]=>
  41.   string(1) "3"
  42.   [1]=>
  43.   string(8) "pierwszy"
  44.   [2]=>
  45.   string(6) "lubiec"
  46.   [3]=>
  47.   string(10) "ktotozrobi"
  48. }
  49. string(15) "pier
  50. lub
  51. ktoto
  52. "
  53. */
  54.  
  55.  
  56. ?>
  57.  


Ten post edytował kiler129 6.11.2010, 01:36:06


--------------------
flexiCMS v2 [|||||||+--] 75% done
Go to the top of the page
+Quote Post
motyl-pl
post 6.11.2010, 02:04:54
Post #5





Grupa: Zarejestrowani
Postów: 294
Pomógł: 31
Dołączył: 2.04.2010

Ostrzeżenie: (0%)
-----


zajebiście działa dziękuje za napisanie smile.gif)


--------------------
Go to the top of the page
+Quote Post
kiler129
post 6.11.2010, 04:42:09
Post #6





Grupa: Zarejestrowani
Postów: 566
Pomógł: 35
Dołączył: 21.06.2006

Ostrzeżenie: (0%)
-----


Wpadło mi do głowy - sprawdzaj czy ilość podanych linii do odczytania nie jest większa niż długość pliku bo może wysypać sporo Notice w razie błędnej wartości winksmiley.jpg


--------------------
flexiCMS v2 [|||||||+--] 75% done
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 21.06.2025 - 22:54