2015-01-05 3 views
0

У конкурентов алгоритмов есть вопросы, которые обеспечивают ввод в нескольких строках, причем первая строка указывает количество входов. Пример:Чтение n целых чисел/float/string из стандартного ввода

3 
78 
42 
99 

В первой строке указывается, что будут три целых числа, за которыми следуют три целых числа.

В настоящее время у меня есть следующий код, чтобы прочитать их -

package main 

import "fmt" 

func main() { 
    var num []int 
    var input int 
    var count int 

    fmt.Scanf("%d", &count) 

    for { 
     if (count == 0) { 
      break 
     } 

     fmt.Scanf("%d", &input) 
     num = append(num, input) 

     count-- 
    } 
} 

Есть ли лучший способ выполнить это? Вышеупомянутый подход кажется неуклюжим по какой-то причине.

ответ

1

Этот код выталкивает все в заголовок цикла, а также помещает input в максимально возможную локальную область. Вы должны проверять ошибки, возвращаемые Scanf тоже:

package main 

import "fmt" 

func main() { 
    var num []int 
    var count int 
    var err error 

    for _, err = fmt.Scanf("%d\n", &count); err == nil && count > 0; count-- { 
     var input int 
     _, err = fmt.Scanf("%d\n", &input) 
     num = append(num, input) 
    } 

    if err != nil { 
     panic(err) 
    } 

} 

Есть около миллиона способов написать эквивалентный код, это казалось лучшим для меня. Аргумент мог бы быть сделан для того, чтобы поставить проверку ошибки в цикле до append, но так как встреча с ошибкой, по-видимому, делает недействительным список, я думал, что это выглядит красивее.

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