2010-11-24 16 views
0

J'essaye de développer un système où cette application permet à l'utilisateur de réserver le siège de billet. J'essaye de mettre en application un système automatique (une fonction) où l'application peut choisir les meilleures places pour l'utilisateur.Fichier de données de mise à jour automatique et affichage?

Mon fichier base de données actuelle (seats.txt) magasin de cette façon (pas sûr si son un bon format:

X000X 
00000 
0XXX0 

où X signifie que le siège est occupé, 0 ne signifie rien

Après. l'utilisateur se connecte à mon système, et choisissez le "Choisissez le meilleur pour vous", l'utilisateur sera invité à entrer combien de sièges il/elle veut (j'ai fait cette partie), maintenant, si l'utilisateur sais: 2, je vais vérifier première rangée, voir s'il y a des sièges vides, si oui, alors j'attribue (c'est une manière simple, une fois que j'obtiens ce travail, j'écrirai un meilleur algorithme de "réservation automatique")

J'essaie de jouer avec sed, awk, grep ... mais ça ne marche pas (je suis novice en programmation bash, je viens d'apprendre bash il y a 3 jours).

Quelqu'un peut-il aider? FYI: Le format seats.txt ne doit pas forcément être comme ça. Il peut aussi être, stocker tous les sièges de 1 rang, comme: X000X0XXX00XXX

Merci =)

+0

Ceci est trop semblable à http://stackoverflow.com/questions/4268916/bash-programmingdisplay-data-in-matrix-format et un couple d'autres. Ajouter un tag de devoirs. – thkala

Répondre

1

Voici quelque chose pour vous aider à démarrer. Ce script lit dans chaque siège de votre fichier et affiche s'il est pris ou vide, en gardant la trace du numéro de ligne et de colonne tout le temps.

#!/bin/bash 

let ROW=1 
let COL=1 

# Read one character at a time into the variable $SEAT. 
while read -n 1 SEAT; do 
    # Check if $SEAT is an X, 0, or other. 
    case "$SEAT" in 
     # Taken. 
     X) echo "Row $ROW, col $COL is taken" 
      let COL++ 
      ;; 

     # Empty. 
     0) 
      echo "Row $ROW, col $COL is EMPTY" 
      let COL++ 
      ;; 

     # Must be a new line ('\n'). 
     *) let ROW++ 
      let COL=1 
      ;; 
    esac 
done < seats.txt 

Notez que nous alimentons en seats.txt à la fin du script, pas au début. C'est bizarre, mais c'est UNIX pour toi. Curieusement, l'ensemble tandis que la boucle se comporte comme une grosse commande:

while read -n 1 SEAT; do {stuff}; done < seats.txt 

Le < à la fin alimente en seats.txt à la boucle dans son ensemble, et plus particulièrement à la commande read.

+0

D'accord, bash est bizarre. Je suis resté à "if" déclaration, où j'écris ceci: si ["$ A" = ... juste parce qu'aucun espacement -_- !! Hé, merci pour votre solution, je pense que ça marche maintenant (j'espère, encore en "essai" étape) .J'ai trouvé 2 sièges, j'ai juste besoin d'apprendre à utiliser sed/awk/grep pour remplacer le texte maintenant. solution de niche – progamer

+0

J'ai essayé ceci: sed -i "/^$ ROW/s/0/X/$ COL" sièges.txt, quand il atteint le cas 0. Mais le résultat est abit bizarre.J'ai essayé, définir le fichier d'origine : 00000, alors le résultat est XX0X0 Doit être quelque chose de mal avec mon sed – progamer

+0

Est-ce que cela doit être écrit en bash Pour être honnête, ce n'est pas un très bon programme pour écrire dans un script shell. manipulation comme le tri et la recherche, mais jouer avec des caractères individuels n'est pas vraiment son fort –

1

L'aide que vous demandez ici n'est pas vraiment claire. "Quelqu'un peut-il aider?" est une question très large.

Si vous demandez si vous utilisez les bons outils alors oui, les outils de traitement de texte (sed/awk/grep et autres) sont idéaux pour cela étant donné l'exigence initiale qu'il soit fait dans bash en premier lieu. Personnellement, je choisirais une ligne de base différente de bash mais, si c'est ce que vous avez décidé, votre sélection d'outils est acceptable.

Je devrais mentionner que bash lui-même peut faire beaucoup de choses que vous ferez probablement avec les outils de traitement de texte et sans le coût de démarrage des processus externes. Mais, puisque vous utilisez bash, je vais supposer que la performance n'est pas votre primaire préoccupation (ne vous méprenez pas, bash sera probablement assez rapide pour vos fins).

I probablement rester avec la représentation de données multi-ligne pour deux raisons. La première est que les recherches de texte simples pour deux sièges ensemble seront plus faciles si vous gardez les lignes séparées les unes des autres.Dans le cas contraire, dans le 5seat par 2row XXXX00XXXX, une recherche simpliste considérerait ces deux sièges 0 ensemble malgré le fait qu'ils sont loin les uns des autres:

XXXX0 
0XXXX 

Deuxièmement, certaines personnes considèrent la ligne est très importante . Je ne vais pas m'asseoir dans les cinq premiers rangs au cinéma local simplement parce que je dois continuer à bouger la tête pour voir toute l'action.

A titre d'exemple, vous pouvez obtenir le plus en avant rangée avec deux sièges consécutifs (commandes sont divisées pour une meilleure lisibilité):

pax> cat seats.txt 
X000X 
00000 
0XXX0 

pax> expr $(
    (echo '00000';cat seats.txt) 
     | grep -n 00 
     | tail -1 
     | sed 's/:.*//' 
    ) - 1 
2 

La magie expr et echo supplémentaires sont pour vous assurer rentreras 0 si aucun siège n'est disponible Et vous pouvez obtenir la première position dans cette ligne avec:

pax> cat seats.txt 
    | grep 00 
    | tail -1 
    | awk '{print index($0,"00")}' 
3 
+0

Je devrais être précis la prochaine fois e. Mais généralement, vous obtenez mon idée, et me convaincre d'utiliser la méthode multi-ligne pour stocker les sièges. Merci – progamer

+0

?? La pax est ?? Je suis nouveau à bash, s'il vous plaît supporter avec ce genre de questions noob – progamer

+0

@progamer, excuses, c'est juste mon invite, comme '$'. Cela ne fait pas partie des commandes. – paxdiablo