Форум программистов, компьютерный форум, киберфорум
Наши страницы
Ruby
Войти
Регистрация
Восстановить пароль
 
ЮрийКолычев
0 / 0 / 0
Регистрация: 07.01.2019
Сообщений: 5
1

Не работает программа

07.01.2019, 20:35. Просмотров 484. Ответов 6
Метки нет (Все метки)

Добрый день.
Я учусь программировать на Ruby 2.0 Пишу простые программы. Не получается вывести результат программы. не работает блок "each do" для "artist". Возможно class неправильно создан или ошибка в методе. Подскажите пожалуйста в чем проблема.

Ruby
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
# encoding: cp866
 
class Artist
   attr_reader :name
   attr_reader :artists
            
   def initialize name
      @name = name
      @artists = []
   end
 
   def add_artist artist
      @artists << artist
   end
 
end
 
class Album
 
   attr_reader :name           # Это атрибут он нужен для присвоения уровня доступа переменной
   attr_reader :songs          # (все переменные к которым мы устанавливаем доступ, называются свойствами)
                               # (свойство класса- это переменная которая доступна в нутри класса и к которому применен атрибут)
 
   def initialize name         # Этот метод еще называют конструктором
      @name = name             # Этот метод нужен если вы не знаете в какой последовательности эти методы будут вызваны
      @songs = []              # усли у вас есть метод1, метод2, метод3 это не значит что кто-то захочет вызвать класс  
   end                         # который вы написали именно в этом порядке, он может вызвать сначало метод3,
                               # а там не был опред. массив, определение мссива происходит в методе1, а в методе3 
                               # происходит запись в массив, чтобы этого избежать используется initialize, 
                               # который вызывается каждый раз при инициализации класса.
 
   def add_song song
      @songs << song
   end
 
end
 
class Song
 
   attr_reader :name
   attr_reader :duration
            
   def initialize name, duration
      @name = name
      @duration = duration
   end
 
end
 
# создание артиста
 
artist1 = Artist.new 'Freddie Mercury'
artist2 = Artist.new 'Farrukh Bulsara'
 
# создаем новые альбомы
 
albums = []
 
album1 = Album.new 'News of the World'
album2 = Album.new 'Innuendo'
 
# добавление альбомов к артистам
 
artist1.add_artist album1
artist2.add_artist album2
 
# добавляем альбомы в массив
 
albums << album1
albums << album2
 
# создаем новые песни для 1-го альбома
 
song1 = Song.new 'We Are the Champions', 6
song2 = Song.new 'The Show Must Go On', 4
song3 = Song.new 'Radio Ga Ga', 6
 
# добавляем новые песни в альбом
 
album1.add_song song1
album1.add_song song2
album1.add_song song3
 
# создаем новые песни для 2-го альбома
 
song4 = Song.new 'I Want to Break Free', 5
song5 = Song.new 'A Kind of Magic', 7 
song6 = Song.new 'We will Rock You', 4
 
# добавляем новые песни во 2-ой альбом
 
album2.add_song song4
album2.add_song song5
album2.add_song song6
 
# выводим результат 
 
artists.each do |artist|
   puts "Artist: #{artist.name}"
 
   albums.each do |album|
      puts "Album: #{album.name}"
      
      album.songs.each do |song|
         puts "Song: #{song.name}, #{song.duration}"
      end
   
   end
 
end
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.01.2019, 20:35
Ответы с готовыми решениями:

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

Почему программа не работает на MFC статичной библиотеки. а вот на стандартном мфс работает
почему программа не работает на MFC статичной библиотеки. а вот на стандартном мфс работает. Имею...

Программа работает на Delphi 2007 или более ранней но не работает на старших версиях (10.1 например)
В программе используются дополнительные файлы и dll написанные на fortran их кода нет ;( в ранних...

После AVZ не работает программа Credo Межевой план автоматически закрывается и не работает цифровая подпись
После AVZ не работает программа Credo Межевой план автоматически закрывается и не работает цифровая...

не пойму в чем дело, программа должна работать, но она черт побери не работает :( (программа по работе с реестром)
Программа предназначена для поиска какого-нить слова по реестру и удаления ключа или раздела если в...

6
j2FunOnly
Модератор
Эксперт JS
1143 / 1013 / 561
Регистрация: 05.06.2015
Сообщений: 2,275
08.01.2019, 09:41 2
Вы создаёте artist1, artist2. А artists откуда берёте?

Добавлено через 56 секунд
Ruby
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# code omitted for bravity
 
# выводим результат
 
artists = [artist1, artist2]
 
artists.each do |artist|
   puts "Artist: #{artist.name}"
 
   albums.each do |album|
      puts "Album: #{album.name}"
      
      album.songs.each do |song|
         puts "Song: #{song.name}, #{song.duration}"
      end
   
   end
 
end
0
ЮрийКолычев
0 / 0 / 0
Регистрация: 07.01.2019
Сообщений: 5
08.01.2019, 13:55  [ТС] 3
j2FunOnly, Массив "artistrs" у меня создан в классе "Artist" добавление в этот массив происходить через метод "add_artist". Делал по аналогии с классом "Album" где в массив "songs" добавляются "song", но там почему-то вывод работает, а в классе "Artist" не работает. Я понимаю, что если создать массив вне класса, то все выводится. Но у меня задача реализовать вывод из запроса к классу "Artist"
0
j2FunOnly
Модератор
Эксперт JS
1143 / 1013 / 561
Регистрация: 05.06.2015
Сообщений: 2,275
09.01.2019, 08:52 4
Возможно я что-то не совсем понял, но, мне кажется, у вас проблема с семантикой: зачем вы свойство класса Artist называете @artists (и соответственно метод Artist#add_artist) если туда добавляете альбомы?

То есть вы хотите создать артиста, добавить ему альбом, и в альбом добавить песни чтобы всё это дело вывести потом на экран?

Ruby
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
# encoding: cp866
 
class Artist
  attr_reader :name
  attr_reader :albums
 
  def initialize(name)
    @name = name
    @albums = []
  end
 
  def add_album(album)
    @albums << album
  end
end
 
class Album
  ##
  # Это атрибут он нужен для присвоения уровня доступа переменной
  # (все переменные к которым мы устанавливаем доступ, называются свойствами)
  # (свойство класса- это переменная которая доступна в нутри класса и к
  # которому применен атрибут)
  attr_reader :name
  attr_reader :songs
 
  ##
  # Этот метод еще называют конструктором
  # Этот метод нужен если вы не знаете в какой последовательности эти методы
  # будут вызваны.
  # Если у вас есть метод1, метод2, метод3 это не значит что кто-то захочет
  # вызвать класс который вы написали именно в этом порядке, он может вызвать
  # сначало метод3, а там не был опред. массив, определение мссива происходит в
  # методе1, а в методе3 происходит запись в массив, чтобы этого избежать
  # используется `initialize`, который вызывается каждый раз при инициализации
  # класса.
  def initialize(name)
    @name = name
    @songs = []
   end
 
   def add_song(song)
    @songs << song
   end
end
 
class Song
  attr_reader :name
  attr_reader :duration
 
  def initialize(name, duration)
    @name = name
    @duration = duration
  end
end
 
# создание артиста
 
artist1 = Artist.new 'Freddie Mercury'
artist2 = Artist.new 'Farrukh Bulsara'
 
# создаем новые альбомы
 
# albums = []
 
album1 = Album.new 'News of the World'
album2 = Album.new 'Innuendo'
 
# добавление альбомов к артистам
 
artist1.add_album album1
artist2.add_album album2
 
# добавляем альбомы в массив
 
# albums << album1
# albums << album2
 
# создаем новые песни для 1-го альбома
 
song1 = Song.new 'We Are the Champions', 6
song2 = Song.new 'The Show Must Go On', 4
song3 = Song.new 'Radio Ga Ga', 6
 
# добавляем новые песни в альбом
 
album1.add_song song1
album1.add_song song2
album1.add_song song3
 
# создаем новые песни для 2-го альбома
 
song4 = Song.new 'I Want to Break Free', 5
song5 = Song.new 'A Kind of Magic', 7
song6 = Song.new 'We will Rock You', 4
 
# добавляем новые песни во 2-ой альбом
 
album2.add_song song4
album2.add_song song5
album2.add_song song6
 
# выводим результат
 
artists = [artist1, artist2]
artists.each do |artist|
  puts "Artist: #{artist.name}"
 
  artist.albums.each do |album|
    puts "Album: #{album.name}"
 
    album.songs.each do |song|
      puts "Song: #{song.name}, #{song.duration}"
    end
  end
end
0
ЮрийКолычев
0 / 0 / 0
Регистрация: 07.01.2019
Сообщений: 5
10.01.2019, 06:44  [ТС] 5
j2FunOnly, Да. И чтобы вывод осуществлялся через итератор each из класса.
0
j2FunOnly
Модератор
Эксперт JS
1143 / 1013 / 561
Регистрация: 05.06.2015
Сообщений: 2,275
10.01.2019, 20:59 6
ЮрийКолычев, опишите, пожалуйста, подробнее что вы хотите получить и как этим будете пользоваться.
Что значит
Цитата Сообщение от ЮрийКолычев Посмотреть сообщение
чтобы вывод осуществлялся через итератор each из класса
?
0
ЮрийКолычев
0 / 0 / 0
Регистрация: 07.01.2019
Сообщений: 5
14.01.2019, 22:59  [ТС] 7
Спасибо. Я разобрался.
0
14.01.2019, 22:59
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.01.2019, 22:59

Программа работает в отладке, но не работает в скомпилированном виде
Доброго времени суток. Появилась не предвиденная проблема :( Не получается разобраться,...

Программа работает в консоли xp, но не работает в dosbox в 7ке
Добрый день, проблему описал в заголовке, код: .286 DSEG SEGMENT STR_ALRLOADED...

Программа не работает в Turbo но работает в ABC
запуская в ABC всё работает отлично но когда запускаю программу с точно таким же кодом в Турбо...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru