我试图制作一个代码,在用户创建用户后为其提供个人号码

这是我的ruby代码。 当你运行它并按1时,它会询问你姓名和出生日期。 我想在输入姓名和出生日期后给用户一个个人号码。 此外,我会很高兴搜索用户编号,以便在文件中找到它们。 希望有人可以帮忙!

我写了#HELP,我需要帮助。 代码工作正常,但我不知道如何编码我的问题…

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 

我不确定你希望如何生成这些数字,但这样的事情可能有用。

这将始终为您提供文本文件中最高的数字,并为其添加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 

关于这段代码(你的和我的)有很多话要说。 使用-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替换了它们,这些行创建了一个行数组(对于不是千兆字节的文件,可以正常)。 它还允许存储用户号码。

和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 : , Number: , Date of 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