download.bg
 Вход Списание  Новини  Програми  Статии  Форум  Чат   Абонамент  Топ95   Архив 

Въпрос за входните данни в Java

Автор
Съобщение
anonymous
Сря, 26.03.08, 21:31
Написах една програма ето я и нея
class kordinati
  {
  	
  	public static void main (String args[])
  	     throws java.io.IOException
  	   
  	     {
  	     
  	     int X,Y;
  	     
  	       System.out.print("vavedi X=");
  	         X=(char) System.in.read();
  	       System.out.print("vavedi Y=");
  	         Y=(char) System.in.read();
  	         
  	         
  	          if ( X>0 & Y>0 )
  	           {
  	           
  	              System.out.print("X i Y se namirat v parvi kvadrant");
  	            
  	            }
  	          else
  	            {
  	            
  	              System.out.print("Te sa v drug kvadrant");
  	            
  	            }
  	            
  	      }
  	
  	
  	}

Въпроса ми е свързан със входните дани когато въведа число директно ми се появява резултат които не отговаря Това се получава и когато правя програми за събиране на числа числата са супер нереални

Може би проблема е във декларацията за входните данни ако може някои а напише работеща програма и да ми покаже грешката

boy4o
Чет, 27.03.08, 13:07
Аха, натресъл си се с рогата напред в една от най-неприятните особености на Жабата. Входните операции са голяма проклетия там. Даже се учудих, че изобщо се компилира този код.
Значи, номерът е в това, че в Жабата няма входни оператори, процедурите по въвеждане на данни се реализират от стандартни класове, които са част от задължителните пакети java.lang и System (горе-долу като библиотеките на С++). Обичайно за въвеждане от клавиатурата се използва обект от класа BufferedReader инициализиран със стандартния входен поток System.in. Той пък, от своя страна, е обект от клас InputStreamReader. Зверски засукано, но това е цената, която се плаща за платформената независимост.
Какво ще рече това на практика?
Първо, трябва ни обект от клас BufferedReader. Да го кръстим, в традицията на С/С++, stdin и да обявим съответната обектна променлива:

...
BufferedReader stdin;
...

ПонежеBufferedReader (също и InputStreamReader) е дефиниран в пакета java.io, налага се да го импортираме, т.е. в самото начало на програмата декларираме:

import java.io.*;
...

В краят на краищата получаваме следния код:
import java.io.*;
 
class kordinati  {
 
BufferedReader stdin;
...
 
stdin = new BufferedReader ( new InputStreamReader ( System.in )  );
...
 
public static void main (String args [])
...
...

Може малко да се съкрати, впрочем:
BufferedReader stdin = new BufferedReader ( new InputStreamReader ( System.in )  );

Т.е. създаваме обект от клас BufferedReader като го инициализираме с обекта in, предоставен от класа System. Самият in е от тип InputStreamReader.
Вече можем да четем данни от клавиатурата посредством метода readLine();, предоставен от класа BufferedReader (и достъпен чрез променливата stdin):

stdin.readLine();

Циркът, обаче, не свършва до тук. Методът readLine(); винаги връща обект от тип String. Значи, трябва тепърва да го преобразуваме в стойност от тип int. Това става посредством метода parseInt( ), който се съдържа в класа Integer.
Нещо такова:
String input = stdin.readLine();
X = Integer.parseInt( input );

или по-кратко:
X = Integer.parseInt( stdin.readLine() );

(Особено весело е, че ако X беше от тип double, щеше да се наложи да получим стойността по друг начин:
X = Double.valueOf( stdin.readLine() ).doubleValue(); )
 
Окончателно получаваме следния код:
import java.io.*;
 
class Kordinati {
	
   BufferedReader stdin;	
   int X,Y;
  
   Kordinati() throws IOException {
   	
   	stdin = new BufferedReader ( new InputStreamReader ( System.in )  );
      
       
         System.out.print("vavedi X=");
           X =  Integer.parseInt( stdin.readLine() );
         System.out.print("vavedi Y=");
           Y =  Integer.parseInt( stdin.readLine() );
           
           
            if ( X>0 & Y>0 )
             {
             
                System.out.print("X i Y se namirat v parvi kvadrant");
              
              }
            else
              {
              
                System.out.print("Te sa v drug kvadrant");
              
              }
   }
   	
   	
  public static void main (String args[]) throws IOException
     
       {
       
       new Kordinati();
              
        }
    
  }

Забележи, че съм изкарал основната част от програмата извън метода main. Причината е, че той е статичен метод и би трябвало да обявим променливата stdin като "static". Това, обаче, обикновено създава усложнения в работата на обектите от клас BufferedReader. Затова предпочитам да си вържа гащите и да изведа целия ефективен код от main. А в main оставям само създаването на анонимен обект от класа Kordinati - добра практика, която предпазва от неприятни изненади, свързани с употребата на статични променливи, методи и пр.
 
А тук намерих доста добро изложение на входно-изходните операции в Жабата. В същност огледай се из оня сайт, има доста неща, които може да ти бъдат от полза.

редактиран от boy4o на 27.03.08 13:51
anonymous
Вто, 13.05.08, 20:14
Браво, много добър пост, помогна ми с една задачка за IO в JAVA

Коментар

за нас | за разработчици | за реклама | станете автори | in english  © 1998-2024   Experta Ltd.