Vinnaren i pepparkakshustävlingen!
2008-02-02, 11:30
  #1
Medlem
rahanjams avatar
Jag sitter och funderar på hur jag ska göra så att programmet ställer frågan

: Vill du skriva över filen eller bara fortsätta mata in nummer och namn?
Nån liknande sån fråga.

Kod:
import java.io.*;
import cs1.Keyboard;

public class 
uppgift1{
    public static 
void main(String args[]) throws IOException{
        
String fil "kund.txt";
        
boolean läggTill true
        
FileWriter fw = new FileWriter(filläggTill);
        
BufferedWriter bw = new BufferedWriter(fw);
        
PrintWriter utFil = new PrintWriter(bw);
        
System.out.print("Hur många vänners Namn vill du mata in?: ");
        
int antal Keyboard.readInt();    
        
System.out.println("Du ska nu mata in dina vänners Namn & Nummer");
        
System.out.println(" ");

        for (
int i 0antali++){
    
                
System.out.print("Mata in din väns Nummer: ");
            
int nummer Keyboard.readInt();
            
System.out.print("Mata in din väns Namn: ");
            
String namn Keyboard.readString();
            
utFil.println(nummer "\t" namn +);
        }
        
utFil.close();
    }


Sen funderar jag över hur jag ska gå till väga för att inte tillåta fel inmatning vid "namn" eller "nummer" ...

Någon med lite hjälp förklaring ?, vore trevligt..
Förhasta inte med för avancerad kod bara då min nivå i programmering är riktigt låg !
__________________
Senast redigerad av rahanjam 2008-02-02 kl. 11:36.
Citera
2008-02-02, 12:06
  #2
Medlem
Tooners avatar
Den där eländiga csl.Keyboard klassen igen. Vart får alla den ifrån?..

Skrev om den som vanligt till buffered reader istället men poängen är ju samma. Så här kan man göra frågan om man ska skriva över filen eller inte:

Kod:
import java.io.*;

public class 
uppgift1{
    public static 
void main(String args[]) throws IOException{
        
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        
        
String filnamn "kund.txt";
        
File fil = new File(filnamn);
        
boolean läggTill true;

        
// Kontrollera om filen fanns redan och fråga om den ska skrivas över eller inte
        
if(fil.exists()){
            
System.out.println("Filen " filnamn " finns redan.");
            
System.out.println("Skriv '0' för att skriva över den och '1'  " 
                               
"för att lägga till information till den");
            if(
reader.readLine().equals("0")){
                
läggTill false;
            }
            
            
// Nu testar den bara 0, kan ju testa att den är 1 också, och
                // fråga igen om det är varken 0 eller 1
        
}
        
        
// Nu är läggaTill true om användaren vill lägga till information och
        // false om den vill skriva över filen
        
FileWriter fw = new FileWriter(filläggTill);
        
BufferedWriter bw = new BufferedWriter(fw);
        
PrintWriter utFil = new PrintWriter(bw);
        
System.out.print("Hur många vänners Namn vill du mata in?: ");
        
int antal Integer.parseInt(reader.readLine());    
        
System.out.println("Du ska nu mata in dina vänners Namn & Nummer");
        
System.out.println(" ");

        for (
int i 0antali++){
    
                
System.out.print("Mata in din väns Nummer: ");
            
int nummer Integer.parseInt(reader.readLine());
            
System.out.print("Mata in din väns Namn: ");
            
String namn reader.readLine();
            
utFil.println(nummer "\t" namn);
        }
        
utFil.close();
    }


Det där med att kontrollera att informationen är 'korrekt' får du nog utveckla lite, men är ju egentligen bara att göra en metod typ:
Kod:
private boolean kontrolleraNamn(String namn){
    if(
namn.length 50) return false;
    else return 
true;


Plus alla andra kontroller du kan tänkas vilja göra.

Jag antar att din Keyboard-klass redan kontrollerar så att du får in int och String med readInt och readString.

I mitt exempel är det alltid string som kommer in, så jag skulle behöva använda en try/catch sats när jag försöker omvandla från string till int med parseInt, för att fånga felaktiga nummer (som t.ex. innehåller bokstäver).

Är något fel kanske programmet ska fråga igen, och då är det ju bara att loopa över just den biten så att programmet frågar tills rätt information matats in.
__________________
Senast redigerad av Tooner 2008-02-02 kl. 12:11.
Citera
2008-02-02, 15:35
  #3
Medlem
rahanjams avatar
Okej .. Men då kommer vi till denna biten då:

Kod:
if(fil.exists()){
            
System.out.println("Filen " filnamn " finns redan.");
            
System.out.println("Skriv '0' för att skriva över den och '1'  " 
                               
"för att lägga till information till den");
            if(
reader.readLine().equals("0")){
                
läggTill false;
            }
            
             if(
reader.readLine().equals("1")){
                    
läggTill true;
            } 

Sen om han varken matar in 1 eller 0 så vill jag att frågan kommer "Fel inmatning" och sedan repeterar frågan..

Hur går jag till väga?
Måste jag loopa den då ?
Citera
2008-02-02, 15:58
  #4
Medlem
rahanjams avatar
Eller något sånt här ?
Hur ska jag få det att "repeteras" finns det någon "repeat" metod eller liknande ?

Kod:
string in reader.readLine();
            if(
in.equals("0")){
                
läggTill false;
            }
            else if(
in.equals("1")){}
            else { 
//Fel, inte 1 eller 0
                //Börja om
            


edit :

"string in = reader.readLine();"
__________________
Senast redigerad av rahanjam 2008-02-02 kl. 16:20.
Citera
2008-02-02, 16:09
  #5
Medlem
rahanjams avatar
Citat:
Ursprungligen postat av Tooner

Den där eländiga csl.Keyboard klassen igen. Vart får alla den ifrån?..


Inmatningar

Det finns en klass keyboard, med färdigskrivna programdelar, som kan ta hand om inmatningar från tangentbordet. För att keyboard.class ska kunna användas måste du tala om att du tänker använda denna klass. Detta gör du genom att skriva import. För att kunna läsa inmatning av ett heltal från tangentbordet så måste du initiera så här:
int tal = Keyboard.readInt();

Då har vi definierat en int-variabel, som ges namnet tal. Genom Keyboard.readInt() anropas metoden readInt i klassen Keyboard. Denna metod är skriven för att ta emot data från tangentbordet till en heltalsvariabel. Det inmatade värdet placeras i variabeln tal. För att ta emot decimaltal används metoden readDouble istället. Variabler som kan lagra decimaltal kan definieras:

Det tillhörde kursen helt enkelt :P, vi körde bara den klassen innan..
Citera
2008-02-02, 17:12
  #6
Medlem
rahanjams avatar
Sen en sak till ..

Kod:
System.out.print("Vad vill du att din fil ska heta?");
         
String filnamn Keyboard.readString();
         
File fil = new File(filnamn); 

Ja .. för att han ska spara detta som en "txt" per automatik. Hur gör jag då ?
Vill slippa lägga till att man ska ha filändelse i frågan.
Ursäkta om det är många frågor .. Börjar kännas som att jag vill ha allting på silverfatet. Ni får väl säga till mig
__________________
Senast redigerad av rahanjam 2008-02-02 kl. 17:14.
Citera
2008-02-03, 02:36
  #7
Medlem
Hazs avatar
Citat:
Ursprungligen postat av rahanjam
Sen en sak till ..

Kod:
System.out.print("Vad vill du att din fil ska heta?");
         
String filnamn Keyboard.readString();
         
File fil = new File(filnamn); 

Ja .. för att han ska spara detta som en "txt" per automatik. Hur gör jag då ?
Vill slippa lägga till att man ska ha filändelse i frågan.
Ursäkta om det är många frågor .. Börjar kännas som att jag vill ha allting på silverfatet. Ni får väl säga till mig
Eh, tja...

Kod:
System.out.print("Vad vill du att din fil ska heta?");
         String filnamn = Keyboard.readString();
         File fil = new File(filnamn + filnamn.indexOf(".") != -1 ? "" : ".txt");  
lägger till .txt om ingen extension finns (dvs ingen punkt i filnamnet).
Citera
2008-02-03, 03:11
  #8
Medlem
Citat:
Ursprungligen postat av Haz
Eh, tja...

Kod:
System.out.print("Vad vill du att din fil ska heta?");
         String filnamn = Keyboard.readString();
         File fil = new File(filnamn + filnamn.indexOf(".") != -1 ? "" : ".txt");  
lägger till .txt om ingen extension finns (dvs ingen punkt i filnamnet).

Finns en finfin metod i klassen String som man kan använda för detta ändamål.
ex:

Kod:
if(!filnamn.endsWith(".txt")) {
   
filnamn filnamn.concat(".txt");


edit: oops glömde en variabel
__________________
Senast redigerad av F-Ray 2008-02-03 kl. 03:13.
Citera
2008-02-03, 03:23
  #9
Medlem
Hazs avatar
Citat:
Ursprungligen postat av rahanjam
Okej .. Men då kommer vi till denna biten då:

Kod:
if(fil.exists()){
            
System.out.println("Filen " filnamn " finns redan.");
            
System.out.println("Skriv '0' för att skriva över den och '1'  " 
                               
"för att lägga till information till den");
            if(
reader.readLine().equals("0")){
                
läggTill false;
            }
            
             if(
reader.readLine().equals("1")){
                    
läggTill true;
            } 

Sen om han varken matar in 1 eller 0 så vill jag att frågan kommer "Fel inmatning" och sedan repeterar frågan..

Hur går jag till väga?
Måste jag loopa den då ?

Finns många sätt, ett kan vara med switch/case, typ
Kod:
        boolean foo = true;
        boolean laggTill;
        while (foo)
            switch(Integer.parseInt(reader.readLine())) {
            case 0: 
                  laggTill = false;
                  foo = false;
                  break;
            case 1:
                  laggTill = true;
                  foo = false;
                  break;
            default:
                  System.out.println("Fel svar!!!");
                  break;
            }
    }
 }
(Du borde kunna använda den berömda Keyboard.readInt()-metoden istället. Som jag skrivit det kastas ett fel om man matar in annat än siffror.)

Ett annat sätt är en enklare loop, i stil med
Kod:
       String g = "";
        while (!g.equals("0") && !g.equals("1")) {
            System.out.println("Ange svar");
            g=reader.readLine();
    }

Vill du stajla kan du ju köra med varianten
Kod:
        String g;
        boolean laggTill = true;
        while (!(g = reader.readLine()).equals("1") && (laggTill = !g.equals("0"))) 
            System.out.println("Fel svar!");

Själv skulle jag nog rekommendera switch/case-varianten med tanke på vilken nivå du just nu är på. Se de andra som exempel på vad man kan göra helt enkelt...

Citat:
Ursprungligen postat av F-Ray
Finns en finfin metod i klassen String som man kan använda för detta ändamål.
Helt riktigt, tänkte inte på den. Snyggare än min lösning!
Citera
2008-02-04, 14:37
  #10
Medlem
rahanjams avatar
Har ett nytt problem..

Kod:
do{
            
System.out.print("Mata in din väns Nummer: ");
            
nummer Keyboard.readString();
                }
          while((int)
nummer 58 && (int)nummer 47); 
             
        do{
        
System.out.print("Mata in din väns Namn: ");
            
String namn Keyboard.readString();
            
utFil.println(nummer "\t" namn);
         }      
    while((String)
namn ö && (String)namn a);
         } 

Saken är den att jag vill ha något undantag som inte tillåter inmatning av "tal i nummer" och "nummer i tal".

bara satt och fantsierade ifall de skulle gå o göra något i form av ascii? E.. Jag vet inte.
Loopen var också en idé som inte funkade

Någon som har en lösning ?
Citera
2008-02-04, 15:18
  #11
Medlem
Tooners avatar
Citat:
Ursprungligen postat av rahanjam
Saken är den att jag vill ha något undantag som inte tillåter inmatning av "tal i nummer" och "nummer i tal".

bara satt och fantsierade ifall de skulle gå o göra något i form av ascii? E.. Jag vet inte.
Loopen var också en idé som inte funkade

Någon som har en lösning ?

Du kanske menar nummer i namnen, och bokstäver i numren.

Som sagt vet jag inte hur eran Keyboard-klass fungerar, men att kontrollera att en sträng är ett giltigt nummer är rätt enkelt med en exception:

Kod:
try {
    
String ettNummer "34";
    
int numretSomInt Integer.parseInt(ettNummer);
} catch (
NumberFormatException e) {
    
System.err.println("Felaktigt nummer: " e.getMessage());


Det här fångar upp fel som uppstår vid omvandligen från sträng till int. Problemet är att du även får fel om numret är för stort för en int. En int kan ta nummer mellan -2147483647 och 2147483647, så matar du in 2147483648 som nummer kommer du få NumberFormatException.

Du kan förstås ta en long istället som klarar tal upp till 9223372036854775807. Ska väl egentligen inte vara några problem, bara man är medveten om att det kan inträffa.

Angående att det bara är bokstäver i en sträng så kan du använda ASCII som du tänkte. Bara att hämta ut ASCII-värdet och kontrollera så att det är en bokstav.

Här är ett litet program som skriver ut ASCII-numren:

Kod:
public class ASCIINumbers{
    public static 
void main(String[] args) {
        
String alphabet "ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvwxyzÅÄÖåäö";
        
        for(
int i 0alphabet.length(); i++){
            
            
System.out.println((int)alphabet.charAt(i));
        }
    }

Som synes skrev jag de svenska tecken sist för de följer inte numren. Så här är numren för alfabetet i ASCII:
Kod:
A-Z -> 65-96
a-z -> 97-122
å -> 229
ä -> 228
ö -> 246
Å -> 197
Ä -> 196
Ö -> 214

Så det är bara att loopa över alla bokstäver (som i exemplet ovan) och om något tecken har ett annat ASCII-värde än bokstav, så är det felaktigt.
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback