2012-08-21 2 views
0

Я пишу программу Ruby для имитации системы управления курсом. Поскольку моя программа в настоящее время стоит, когда пользователь сначала загружает программу, ей представлено меню. В настоящее время я просто работаю над первым вариантом в меню, который заключается в добавлении модуля в схему.Программа Ruby выходит слишком рано, данные перезаписываются

Работая поэтапно, когда пользователь выбирает эту опцию из меню, им предлагается ввести имя схемы, которое сохраняется как ключ в хеше, называемый «схемами». Затем им предлагается ввести имя модуля, которое сохраняется в хеше, под ключом, который принадлежит только что введенной схеме.

После этого печатается строка с сообщением пользователю о том, что схема и модуль были добавлены в систему.

Затем их спрашивают, хотели бы они добавить еще один модуль. Здесь у меня есть несколько вопросов:

A. Если пользователь вводит «y», им предлагается ввести схему - если введенная в нее схема уже существует, им говорят, если нет, то она создается , и затем их попросят имя модуля. Затем их спрашивают, хотели бы они добавить еще один модуль. Если пользователь набирает «n», существующие в настоящее время схемы вместе с их модулями распечатываются, и программа завершается.

B. В этом случае я добавил два модуля к одной и той же схеме, но был напечатан только последний, поэтому, по-видимому, он переопределяет первый, который был введен, - как я могу убедиться, что это doesn «Случись, и что после того, как первый модуль был сохранен в хеш-схеме, любые последующие добавляются в конец хеша, а не заменяют уже существующий?

  1. Как я могу убедиться, что программа не выходит, когда пользователь «N» на стадии А, а возвращается в главное меню программы?

  2. Как я могу убедиться, что первая часть данных, сохраненная в хеше, не переопределяется никакими последующими фрагментами данных, которые я сохраняю в хеш, а скорее, что они становятся отдельными элементами? (Идея в том, чтобы иметь что-то похожее на Java ArrayList, которая будет автоматически добавлять следующий бит данных к следующему элементу массива, который free- увеличивается численно)

два класса у меня есть является (Application который действует как мой интерфейс с пользователем) и CourseModules (где хранятся данные, введенные пользователем).

Application.rb в настоящее время выглядит следующим образом:

class Application 
# To change this template use File | Settings | File Templates. 
require './courseModules.rb' 
def initialize 
    mainMenu 
end 

=begin 
    def navigateTo(what) 
    what.new(v).display 
    mainMenu 
    end 
=end 

    def mainMenu 
    puts "What would you like to do? 
     1: Add module to a scheme 
     2: Remove module from a scheme 
     3: Query modules 
     4: Modify module 
     5: Register a student on a scheme 
     6: Remove a student from a scheme 
     7: Register a student on a module 
     8: Remove a student from a module" 
    case gets.strip 
     when "1" 
     CourseModules.add_module 
     when "2" 
     CourseModules.removeModuleFromScheme 
     when "3" 
     navigateTo CourseModules 
     when "4" 
     navigateTo CourseModules 
     when "5" 
     navigateTo Student 
     when "6" 
     navigateTo Student 
     when "7" 
     navigateTo Student 
    end 
    end 
    Application.new 
end 

и CourseModules.гь в настоящее время выглядит следующим образом:

class CourseModules 
# To change this template use File | Settings | File Templates. 
@@moduleScheme = nil 
@@moduleYear = nil 
#@moduleTitle = "" 
@noOfModulesInScheme = 0 

def self.moduleYear 
    @@moduleYear 
end 

def initialize(v) 
    @val = v 
end 
# Set and get the @val object value 
def set (v) 
    @val = v 
end 
def get 
    return @val 
end 


# Attempt at add_module method on 21/08/2012 at 12:35 
def self.add_module 
    schemes = {} 
    scheme_exists = false 
    add_another_module = true 

while add_another_module 
    print "Enter scheme name: " 
    scheme_name = gets 
    schemes.has_key?(scheme_name.chop) ? scheme_exists = true : scheme_exists = false 

    if !scheme_exists 
    print "Enter module name: " 
    module_name = gets 
    schemes[scheme_name.chop] = module_name.chop 
    puts "Scheme #{scheme_name.chop} with module #{module_name} has been added to the system" 
    else 
    scheme_exists = false 
    puts "This scheme has already been added" 
    puts "Enter module name: " 
    module_name = gets 
    schemes[scheme_name.chop] = module_name.chop 
    puts "Scheme #{scheme_name.chop} with module #{module_name} has been added to the system" 
    end 

    print "Add another module? " 
    ask_if_user_wants_to_add_another_module = gets 
    if !(ask_if_user_wants_to_add_another_module.chop == "y" or ask_if_user_wants_to_add_another_module.chop == "yes") 
    add_another_module = false 
    end 
end 
puts schemes 
end 




end 
def removeModuleFromScheme 
    moduleName.moduleScheme = nil 
end 

def queryModule 

end 

* Редактировать 21/08/2012 в 18:00 **

Хорошо, мой класс courseModules теперь выглядит следующим образом:

class CourseModules 
# To change this template use File | Settings | File Templates. 
@@moduleScheme = nil 
@@moduleYear = nil 
#@moduleTitle = "" 
@noOfModulesInScheme = 0 

def self.moduleYear 
@@moduleYear 
end 

def initialize(v) 
@val = v 
end 
# Set and get the @val object value 
def set (v) 
@val = v 
end 
def get 
return @val 
end 


# Attempt at add_module method on 21/08/2012 at 16:30 
def self.add_module 
schemes = {} 
scheme_exists = false 
add_another_scheme = true 
add_another_module = true 

while add_another_scheme 
    print "Enter scheme name: " 
    scheme_name = gets 
    @schemes.has_key?(scheme_name.chop) ? scheme_exists = true : scheme_exists = false 

    if !scheme_exists 
    @schemes[scheme_name.chop] = [] 
    puts "Scheme #{scheme_name.chop} has been added to the system" 
    else 
    scheme_exists = false 
    puts "This scheme has already been added" 
    end 

    while add_another_module 
    print "Enter module name: " 
    module_name = gets 
    @schemes[scheme_name.chop].include?(module_name.chop) ? true : @schemes[scheme_name.chop] << module_name.chop 
    print "Add another module? " 
    ask_if_user_wants_to_add_another_module = gets 
    if(!ask_if_user_wants_to_add_another_module.chop == "y" or ask_if_user_wants_to_add_another_module == "yes") 
     add_another_scheme = false 
    end 

end 

print "Add another scheme? " 
ask_if_user_wants_to_add_another_scheme = gets 
if !(ask_if_user_wants_to_add_another_scheme.chop == "y" or ask_if_user_wants_to_add_another_scheme.chop == "yes") 
    add_another_scheme = false 
end 
puts @schemes 

end 

while add_another_module 
    print "Enter scheme name: " 
    scheme_name = gets 
    schemes.has_key?(scheme_name.chop) ? scheme_exists = true : scheme_exists = false 

    if !scheme_exists 
    print "Enter module name: " 
    module_name = gets 
    schemes[scheme_name.chop] = module_name.chop 
    puts "Scheme #{scheme_name.chop} with module #{module_name} has been added to the system" 
    else 
    scheme_exists = false 
    puts "This scheme has already been added" 
    puts "Enter module name: " 
    module_name = gets 
    schemes[scheme_name.chop] = module_name.chop 
    puts "Scheme #{scheme_name.chop} with module #{module_name} has been added to the system" 
    end 

    print "Add another module? " 
    ask_if_user_wants_to_add_another_module = gets 
    if !(ask_if_user_wants_to_add_another_module.chop == "y" or ask_if_user_wants_to_add_another_module.chop == "yes") 
    add_another_module = false 
    end 
end 
puts schemes 
end 

end 

, но теперь, когда я выбираю '1' из меню и вводим название схемы, я получаю сообщение об ошибке:

@schemes.has_key?(scheme_name.chop) ? scheme_exists = true : scheme_exists = false 

который говорит

add_module': undefined method в has_key? для nil: NilClass (NoMethodError)

Кто-нибудь знает, что я могу сделать, чтобы решить эту проблему?

ответ

0

Как я уже говорил вам по другому вопросу, если вам нужна связь 1: M между схемой и модулями, вам нужно хранить модули в массиве. Также вам нужно переопределить хэш хэш как переменную экземпляра. то есть в

def initialize 
    @schemes = {} 
    # ... your other code 
end 

def self.add_module 
    scheme_exists = false 
    add_another_scheme = true 

    while add_another_scheme 
     add_another_module = true 
     print "Enter scheme name: " 
     scheme_name = gets 
     @schemes.has_key?(scheme_name.chop) ? scheme_exists = true : scheme_exists = false 

     if !scheme_exists 
      @schemes[scheme_name.chop] = [] 
      puts "Scheme #{scheme_name.chop} has been added to the system" 
     else 
      scheme_exists = false 
      puts "This scheme has already been added" 
     end 

     while add_another_module 
      print "Enter module name: " 
      module_name = gets 
      @schemes[scheme_name.chop].include?(module_name.chop) ? true : @schemes[scheme_name.chop] << module_name.chop 
      print "Add another module? " 
      ask_if_user_wants_to_add_another_module = gets 
      if !(ask_if_user_wants_to_add_another_module.chop == "y" or ask_if_user_wants_to_add_another_module.chop == "yes") 
       add_another_module = false 
      end 
     end 

     print "Add another scheme? " 
     ask_if_user_wants_to_add_another_scheme = gets 
     if !(ask_if_user_wants_to_add_another_scheme.chop == "y" or ask_if_user_wants_to_add_another_scheme.chop == "yes") 
      add_another_scheme = false 
     end 
    end 
    puts @schemes 
end 
+0

Привет, извините, я так долго смотрел на это, я начинаю пропустить вещи ... Я изменил класс на то, что вы предложили, и попытался запустить его, но я получаю сообщение об ошибке в "while add_another_module part - он жалуется, что есть синтаксическая ошибка, неожиданно), ожидая ключевое слово_end ... – Someone2088

+0

хорошо проверить еще раз, должно быть, что-то испортило в копии, потому что, насколько я вижу там не является синтаксической ошибкой, и она отлично работает. – saihgala

+0

Я проверил еще раз, я удалил то, что было там, скопировано и вставлено снова, и я все еще получаю ту же ошибку. – Someone2088

Смежные вопросы