2017-10-16 1 views
-1

Voici mon code ruby. Lorsque vous l'exécutez et vous appuyez sur 1, il vous demandera le nom et la date de naissance. Je veux donner à l'utilisateur un numéro personnel après qu'il a fini de taper le nom et la date de naissance. En outre, je serais bien de chercher le numéro d'utilisateur pour les trouver dans le fichier. J'espère que quelqu'un peut aider!J'essaie de faire un code qui donne à l'utilisateur un numéro personnel après qu'il a fait un utilisateur

J'ai écrit #HELP ICI si j'avais besoin d'aide. Le code fonctionne très bien, mais je ne sais pas comment coder mon problème ...

file = File.new("Capgemini.txt", "a") #load information on startup, and create the file 

     class Customer # Making a class for the whole code to call it up later in the code 

      def new_custom 

    er # The costumer method 


       prompt = "> " #creating a class for prompt here, since I use it multiple times 
       puts"Full name of the person?" 
       print prompt 
       @name = gets.chomp.upcase #A global variabel which i can use outside the class 

       if File.read("Capgemini.txt").include?(@name) #so you don't register the same name, twice 
        puts"This name is already stored. Returning you to the main menu." 
        puts "_____________________________________________" 
        else 
       #puts"What is your employee number?" 
       #print prompt 
       #@number = gets.chomp #Global 
       puts"Date of birth? (DD/MM/YYYY)" 
       print prompt 
       @birth = gets.chomp #Global 

       puts"Thanks for the input." 
       puts "_____________________________________________" 

       puts"Is this information correct? " #Giving the user all the information back to check for mistakes, etc. 

       puts ("Name: #{@name} Number: #{@number} Date of birth: #{@birth}") 
       puts "_____________________________________________" 

       puts "Yes or No?" 
       print prompt 

       while user_input = gets.chomp.upcase #loop while getting user input 
        case user_input 
        when "YES" 
        file = File.new("Capgemini.txt", "a") 
        file.puts("#{@name}, Number: #{@number}, Date of birth: #{@birth}") #puts the information into the textfile, separeted by commas 
        file.close 

        #NEED HELP HERE 

        number = File.readlines('Capgemini.txt') 


        puts "_____________________________________________" 
        puts 
        puts "Your employee number: " 
        puts "_____________________________________________" 


        #NEED HELP OVER HERE^ 





        puts 
        puts "The information has now been stored in the Capgemini.txt file." 
        puts "_____________________________________________" 
        break # make sure to break so you don't ask again 
        when "NO" 
        puts "The information has not been stored. Returning you to the main menu." 
        puts "_____________________________________________" 
        break # and again 
        else 
        puts "Please either write 'Yes' or 'No'" 
        print prompt # print the prompt, so the user knows to re-enter input 
        end 
        end 
       end 
     end 

     def search_customer(search) 

       keyword = File.readlines('Capgemini.txt') #converting all the lines into indexes in an Array 



       matches = keyword.select { |name| name[/#{search}/] } # 



       if File.read("Capgemini.txt").include?(search) #An if statement that will print the results if the textfile matches the keyword 
        puts "_____________________________________________"    
        puts ("Search results including the word/number/birth " + search + ":") 
        puts "_____________________________________________" 

        puts matches 
        puts "_____________________________________________" 
        else #If not it will give the user feedback that its not there 
        puts "_____________________________________________" 
        puts ("Sorry, we couldnt find #{search} in the textfile.") 
        puts "_____________________________________________" 
       end 
     end 

     def all_customers 

      f = File.new("Capgemini.txt","r") 
      while !(f.eof?) 
       line = f.gets() 
       puts line 
    end 

     end 

     def delete_customer 

       puts("What customer do you want to delete?") 
       print("> ") 
       keyword = gets.chomp.upcase 



       txt_file = File.readlines('Capgemini.txt') 
       matches = txt_file.select { |name| name[/#{keyword}/] } 
       search_results = matches.length 




       if search_results > 1 
        puts "_____________________________________________"  
        puts "The name you entered gave these outputs:" 
        puts "" 
        puts matches 
        puts "" 
        puts "Please specify the name better, as we only allow one person to be deleted at the time. \nReturning you to the main menu." 
        puts "_____________________________________________"  

        else 

       if File.read("Capgemini.txt").include?(keyword) #An if statement that will print the results if the textfile matches the person 
        puts "_____________________________________________"    
        puts ("Is this the person you want to delete?") 
        puts matches 

        puts "_____________________________________________" 

        puts "Yes or No?" 
       print "> " 

       while user_input = gets.chomp.upcase # loop while getting user input 
        case user_input 
        when "YES" 

        no_matches = txt_file.reject { |name| name[/#{keyword}/] } 

        File.open('Capgemini.txt','w+'){|out| out.puts no_matches} 
        puts"User has been deleted. Returning you to the main menu." 


        puts "_____________________________________________" 
        break # make sure to break so you don't ask again 
        when "NO" 
        puts "User will not be deleted. Returning you to the main menu." 
        puts "_____________________________________________" 
        break # and again 
        else 
        puts "Please either write 'Yes' or 'No'" 
        print "> " # print the prompt, so the user knows to re-enter input 
        end 
        end 


        puts "_____________________________________________" 
        else #If not it will give the user feedback that its not there 
        puts "_____________________________________________" 
        puts ("Sorry, we couldnt find #{keyword} in the textfile.") 
        puts "_____________________________________________" 
       end 
       end 

      end 

    end 

    customer = Customer.new 
    require 'io/console' 
    select = 0 
    prompt = "> " 
    puts 
    puts 
    puts "Welcome to Capgemini Sogeti Denmark" 
    puts "_____________________________________________" 

    loop do (select != 7) 
     puts 
     puts("Press 1 to register a new user.\nPress 2 to search for a employee or keyword within the textfile.\nPress 3 to show all customers.\nPress 4 to delete a customer.\nPress 5 to exit.") 
     puts "_____________________________________________" 
     select = STDIN.getch.to_i 

     if(select == 1) 
      customer.new_customer 

     elsif(select == 2) 
     puts("What customer/keyword do you want to search for?") #You can search for a keyword, like forexample 'Manzur' which will prompt you back with every user names Manzur 
     print prompt 
     customer.search_customer(gets.chomp.upcase) 


     elsif(select == 3) 

     customer.all_customers 
     puts "_____________________________________________" 




     elsif(select == 4) 

     customer.delete_customer 


     elsif(select == 5) 
     puts 
     puts "The application will now exit." 
     puts "_____________________________________________" 

     break 

     else 
     puts"Invalid input. Please try again." 
     puts "_____________________________________________" 

     end 

    end 
+0

Petite note: Les étiquettes communiquent la langue. Il n'est pas nécessaire de répéter cela dans le titre. – tadman

+0

Cela ne ressemble en rien à Rails. C'est juste un tas de code Ruby régulier. – tadman

Répondre

0

Je ne sais pas comment vous voulez que les nombres générés, mais quelque chose comme ça pourrait fonctionner.

Cela vous donnera toujours le nombre le plus élevé de votre fichier texte, et ajouter 1 à celui-ci. Gardez à l'esprit que cette méthode sera lente avec un nombre d'employés plutôt important.

if File.exist?('Capgemini.txt') 
    number = File.readlines('Capgemini.txt') 
    @number = 1 
    number.each do |x| 
     customer = x.split(',') 
     customer_number = customer[1].gsub('Number: ', '').to_i 
     if customer_number >= @number 
     @number = customer_number + 1 
     end 
    end 
else 
    @number = 1 
end 

Sortie:

BOB ROSS, Number: 1, Date of birth: 07/07/2007 
WILL SMITH, Number: 2, Date of birth: 08/08/2008 
JIM BOB, Number: 3, Date of birth: 09/09/2009 

Vous pouvez également utiliser une méthode similaire pour la recherche par le biais d'un tableau:

number = File.readlines('Capgemini.txt') 
number.each do |x| 
    customer = x.split(',') 
    customer_name = customer[0] 
    customer_number = customer[1].gsub('Number: ', '').to_i 
    customer_bday = customer[2].gsub('Date of birth: ', '') 

    if customer_name == some_variable 
    puts x 
    end 
end 
0

Il y a beaucoup de choses à dire au sujet de ce code (le vôtre et le mien) . Exécutez Ruby avec l'option -w pour afficher les variables inutilisées, il fait des erreurs possibles comme:

$ ruby -w t_op.rb 
t_op.rb:180: warning: mismatched indentations at 'end' with 'class' at 3 
t_op.rb:191: warning: possibly useless use of != in void context 
t_op.rb:1: warning: assigned but unused variable - file 

Il y a beaucoup de File.read, je les ai remplacé par un IO.readlines qui crée un tableau de lignes (OK pour les fichiers qui ne sont pas gigabytes gros). Il permet également de stocker les numéros d'utilisateurs.

Comme toujours dans Ruby, il y a plusieurs façons de faire la même chose.

require 'io/console' 

class Customer 
    attr_reader :file 

    def initialize(p_file_name) 
     @file_name = p_file_name 
     refresh 
     @next_number = @numbers.max + 1 
    end 

    def refresh 
     @lines = IO.readlines(@file_name) # load information on startup 
     @numbers = [] 
     @names = @lines.collect do | line | 
      # the line has the format : <name>, Number: <number>, Date of birth: <birth> 
      idxn = line.index(', Number') 
      idxd = line.index(', Date') 
      @numbers << line[idxn + 10...idxd].to_i 
      line[0...idxn] 
     end 
    end 

    def new_customer 
     prompt = "> " # creating a local variable for prompt, since I use it multiple times 
     puts 'Full name of the person ?' 
     print prompt 
     name = gets.chomp.upcase 

     if @names.include?(name) #so you don't register the same name, twice 
     then 
      puts_underlined 'This name is already stored. Returning you to the main menu.' 
     else 
      puts 'Date of birth? (DD/MM/YYYY)' 
      print prompt 
      birth = gets.chomp # TODO check validity 
      puts_underlined 'Thanks for the input.' 

      puts 'Is this information correct ?' # Giving the user all the information back to check for mistakes, etc. 
      puts_underlined "Name: #{name} Number: #{@next_number} Date of birth: #{birth}" 
      puts 'Y(es) or N(o)' 
      print prompt 

      while user_input = gets.chomp.upcase #loop while getting user input 
       case user_input[0] 
       when 'Y' 
        line = "#{name}, Number: #{@next_number}, Date of birth: #{birth}" 
        @next_number +=1 
        @lines << line 
        File.open(@file_name, 'a') do | file | # open the file for append, ensure it will be closed by the end of the block 
         file.puts line # puts the information into the textfile, separeted by commas 
        end 
        puts 
        puts_underlined "The information has now been stored in the #{@file_name} file." 
        break # make sure to break so you don't ask again 
       when 'N' 
        puts_underlined 'The information has not been stored. Returning you to the main menu.' 
        break # and again 
       else 
        puts 'Please either write Y(es) or N(o)' 
        print prompt # print the prompt, so the user knows to re-enter input 
       end 
      end 
     end 
    end # new_customer 

    def search_customer(search) 
     matches = @lines.grep(/#{search}/) 

     unless matches.empty? # An if statement that will print the results if the textfile matches the keyword 
      puts_underlined() 
      puts_underlined "Search results including the word/number/birth #{search} :" 
      puts matches 
      puts_underlined() 
     else # If not it will give the user feedback that it's not there 
      puts_underlined() 
      puts_underlined "Sorry, we couldnt find #{search} in the text file." 
     end 
    end 

    def search_customer_number(search) 
     index = @numbers.index(search.to_i) 

     if index 
     then # found, print the user 
      puts_underlined() 
      puts_underlined "This is the user number #{search} :" 
      puts @lines[index] 
      puts_underlined() 
     else # not found, it will give the user feedback that it's not there 
      puts_underlined() 
      puts_underlined "Sorry, we couldnt find the user #{search}." 
     end 
    end 

    def all_customers 
     puts @lines 
    end 

    def delete_customer 
     puts 'Which customer do you want to delete ?' 
     print '> ' 
     keyword = gets.chomp.upcase 
     matches = @lines.grep(/#{keyword}/) 

     case matches.size 
     when 0 # not found, give the user feedback that it's not there 
      puts_underlined() 
      puts_underlined "Sorry, we couldnt find #{keyword} in the textfile." 
     when 1 # print the results if the textfile matches the person 
      puts_underlined() 
      puts 'Is this the person you want to delete ?' 
      puts_underlined matches 
      puts 'Yes or No?' 
      print '> ' 

      while user_input = gets.chomp.upcase # loop while getting user input 
       case user_input 
       when 'YES' 
        no_matches = @lines.reject { | line | line[/#{keyword}/] } 
        File.open(@file_name, 'w+') { | out | out.puts no_matches } 
        refresh 
        puts_underlined 'User has been deleted. Returning you to the main menu.' 
        break # make sure to break so you don't ask again 
       when 'NO' 
        puts_underlined 'User will not be deleted. Returning you to the main menu.' 
        break # and again 
       else 
        puts "Please either write 'Yes' or 'No'" 
        print '> ' # print the prompt, so the user knows to re-enter input 
       end 
      end 
     else 
      puts_underlined() 
      puts 'The name you entered gave these outputs:' 
      puts 
      puts matches 
      puts 
      puts_underlined "Please specify the name better, as we only allow one person to be deleted at the time. \nReturning you to the main menu." 
     end 
    end # delete_customer 
end # class Customer 

def puts_underlined(p_text = nil) 
    puts p_text if p_text 
    puts '_____________________________________________' 
end 

file_name = 'Capgemini.txt' 
customer = Customer.new(file_name) 
prompt = "> " 
puts 
puts_underlined 'Welcome to Capgemini Sogeti Denmark' 

loop do 
    puts 
    puts_underlined "Press 1 to register a new user.\nPress 2 to search for a employee.\nPress 3 to search for a keyword within the textfile.\nPress 4 to show all customers.\nPress 5 to delete a customer.\nPress 6 to exit." 
    select = STDIN.getch.to_i 

    case select 
    when 1 
     customer.new_customer 
    when 2 
     puts 'Which customer number do you want to search for ?' 
     print prompt 
     customer.search_customer_number(gets.chomp.upcase) 
    when 3 
     puts 'What keyword do you want to search for ?' # You can search for a keyword, like for example 'Manzur' which will prompt you back with every user names Manzur 
     print prompt 
     customer.search_customer(gets.chomp.upcase) 
    when 4 
     customer.all_customers 
     puts_underlined() 
    when 5 
     customer.delete_customer 
    when 6 
     puts 
     puts_underlined 'The application will now exit.' 
     break 
    else 
     puts_underlined 'Invalid input. Please try again.' 
    end 
end