2017-10-16 16 views
-1

這是我的紅寶石代碼。當你運行它並按1時,它會詢問你的姓名和出生日期。我想在完成輸入姓名和出生日期後給用戶一個個人號碼。此外,我很樂意搜索用戶號碼,以便在文件中找到它們。希望有人能幫助!我試圖讓一個代碼給用戶一個用戶後他們已經使用戶

我寫了#HELP HERE是我需要幫助。代碼工作正常,但我不知道如何編碼我的問題...

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

小記:標籤傳達的語言。標題中沒有必要重複這一點。 – tadman

+0

這看起來不像任何形狀或形式的Rails。這只是一堆普通的Ruby代碼。 – tadman

回答

0

我不知道你想如何生成的數字,但這樣的事情可以工作。

這將始終爲您提供文本文件中的最高編號,併爲其添加1。

請記住,此方法在僱員人數相當多的情況下會很慢。

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 

輸出:

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 

你也可以用類似的方法,通過陣列搜索:

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

有很多說這個代碼(你和我) 。與-w選項運行Ruby來顯示未使用的變量,它指向可能存在的錯誤,如:

$ 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 

有很多的File.read,我已經由一個IO.readlines這對於文件創建線的陣列(OK取代了它們其中不是Gigabytes大)。它也允許存儲用戶號碼。

和往常一樣,Ruby有許多方法可以做同樣的事情。

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 
相關問題