Язык Го очень похож на Си. Приведу несколько простейших программ.
Начнём… Вычислить 2 в 12 степени.
package main import "fmt" func main () { a := 2 << 11 // or use this: math.Pow(2, 12) fmt.Println(a) }
Сгенерировать случайное число в диапазоне от 1 до 21
package main import ("fmt"; "math/rand"; "time") func main () { rand.Seed(time.Now().UnixNano()) a := rand.Intn(21) + 1 // from 1 to 21 fmt.Println(a) }
Далее идут примеры из книжки Калеба Докси «Введение в программирование на Go»:
Перевод температуры из градусов Фаренгейта в Цельсия (формула (F - 32) * 5/9
)
package main import "fmt" func main () { var input float64 fmt.Print("Enter temperature in F: ") fmt.Scanf("%f", &input) input = (input - 32) * 5/9 fmt.Println("It will be", input, "Celsius") }
Перевод футов в метры (1 ф = 0.3048 м).
package main import "fmt" func main () { var input float64 fmt.Print("Enter lenght in feet: ") fmt.Scanf("%f", &input) input *= 0.3048 fmt.Println("It will be", input, "meters") }
Вывод чисел от 1 до 100, которые делятся на 3 (3, 6, 9, 12, …).
package main import "fmt" func main () { for i := 1; i <= 100; i++ { if i % 3 == 0 { fmt.Println(i) } } }
Вывести числа от 1 до 100, но для кратных трём нужно вывести «Fizz» вместо числа, для кратных пяти — «Buzz», а для кратных как трём, так и пяти — «FizzBuzz».
package main import "fmt" func main () { for i := 1; i <= 100; i++ { if i % 3 == 0 && i % 5 == 0 { fmt.Println("FizzBuzz") } else if i % 3 == 0 { fmt.Println("Fizz") } else if i % 5 == 0 { fmt.Println("Buzz") } else { fmt.Println(i) } } }
Тут кстати можно первое условие выводить как % 15 или делать конкатенацию 🙂
Напечатать символы от A до Z
package main import ( "fmt" ) func main() { for i := 0; i < 26; i++ { fmt.Printf("%c", 65+i) } }
Далее следующее задание.. Найти самый наименьший элемент в списке:
x := []int{ 48,96,86,68, 57,82,63,70, 37,34,83,27, 93,94,99,97, }
Решение:
package main import "fmt" func main() { x := []int{ 48,96,86,68, 57,82,63,70, 37,34,83,27, 93,94,99,97, } tiny := x[0] for _, n := range x { if n < tiny { tiny = n } } fmt.Println(tiny) }
Ну или можно использовать библиотеку sort.Ints()
😀
Далее… Напишите функцию sum, которая бы принимала срез чисел и складывала их вместе.
package main import "fmt" func sum(nums ... int) int { total := 0 for _, i := range nums { total += i } return total } func main() { slice := []int{1, 3, 5, 7} x := sum(slice...) fmt.Println(x) }
Напишите функцию, которая принимает целое число и делит его пополам и возвращает true, если оно было четным, или false если оно нечетное. Например, half(1) должна возвращать (0, false), а half(2) должна возвращать (1, true).
package main import "fmt" func split (i int) (int, bool) { if i % 2 == 0 { return 1, true } else { return 0, false } } func main () { var input int fmt.Print("Enter number to split it and check is it even/odd: ") fmt.Scanf("%d", &input) fmt.Println(split(input)) }
Напишите функцию с переменным числом параметров, которая находит наибольшее число в списке.
package main import "fmt" func big (nums ... int) int { x := 0 for _, i := range nums { if i > x { x = i } } return x } func main () { slice := [] int {11, 1, 111, 12, 22, 32} fmt.Println(big(slice ...)) }
Используя в качестве примера функцию makeEvenGenerator напишите makeOddGenerator, генерирующую нечётные числа. Вот функция makeEvenGenerator:
func makeEvenGenerator() func() uint { i := uint(0) return func() (ret uint) { ret = i i += 2 return } } func main() { nextEven := makeEvenGenerator() fmt.Println(nextEven()) // 0 fmt.Println(nextEven()) // 2 fmt.Println(nextEven()) // 4 }
Решение: поменяйте переменную в начале функции 🙂
Поменять местами два числа. Например, x := 1; y := 2; swap(&x, &y) должно дать x = 2 и y = 1.
package main import ( "fmt" ) func swap (x *int, y *int) { tmp := *x *x = *y *y = tmp // в Го можно сделать так: *x, *y = *y, *x } func main() { x := 1 y := 2 swap(&x, &y) fmt.Println(x, y) }
Суммируйте цифры заданного числа, например, для 12345 сумма будет 15 (1+2+3+4+5)
package main import "fmt" func main() { n := 12345 var sum int for n > 0 { sum += n % 10 n /= 10 } fmt.Println(sum) }
Программа, которая повторяет то, что вы написали
package main import "fmt" func main() { var s string for { fmt.Scanf("%s", &s) if s != "" { fmt.Println("... ... ", s) } if s == "exit" { break } s = "" } }
Программа, которая выводит меню из трёх заданных блюд вида:
Enter a 1st dish: Cucumber Enter the price for 1st dish: 3 Enter a 2nd dish: Fried Fish Enter the price for 2nd dish: 12 Enter a 3rd dish: Water Enter the price for 3rd dish: 1 Here is your menu: | Cucumber | 3$ | | Fried Fish | 12$ | | Water | 1$ |
Код:
package main import ( "bufio" "fmt" "os" "strconv" "strings" ) func getDish(r *bufio.Reader, s string) (string, int) { fmt.Printf("Enter a %s dish: ", s) dishNameDirty, err := r.ReadString('\n') if err != nil { panic(err) } dishName := strings.TrimSpace(dishNameDirty) fmt.Printf("Enter the price for %s dish: ", s) dishPriceString, err := r.ReadString('\n') if err != nil { panic(err) } dishPrice, err := strconv.Atoi(strings.TrimSpace(dishPriceString)) if err != nil { panic(err) } return dishName, dishPrice } func main() { r := bufio.NewReader(os.Stdin) firstDishName, firstDishPrice := getDish(r, "1st") secondDishName, secondDishPrice := getDish(r, "2nd") thirdDishName, thirdDishPrice := getDish(r, "3rd") fmt.Println("Here is your menu: ") fFirstDishPrice := fmt.Sprintf("%d$", firstDishPrice) fSecondDishPrice := fmt.Sprintf("%d$", secondDishPrice) fThirdDishPrice := fmt.Sprintf("%d$", thirdDishPrice) fmt.Printf("| %-10s | %-7s | \n| %-10s | %-7s |\n| %-10s | %-7s |", firstDishName, fFirstDishPrice, secondDishName, fSecondDishPrice, thirdDishName, fThirdDishPrice) }
Игра «угадай число», которая загадывает числа заданного диапазона
package main import ( "bufio" "fmt" "math/rand" "os" "strconv" "strings" "time" ) func input(r *bufio.Reader) int { input, err := r.ReadString('\n') if err != nil { panic(err) } n, err := strconv.Atoi(strings.TrimSpace(input)) if err != nil { panic(err) } return n } func main() { r := bufio.NewReader(os.Stdin) fmt.Println("Enter range: ") n_range := input(r) fmt.Println("Enter you guess...") guess := input(r) rand.Seed(time.Now().UnixNano()) puzzle := rand.Intn(n_range) // not include last number if guess == puzzle { fmt.Print("Win!") } else { fmt.Printf("Lost.. answer was %d", puzzle) } }
Посчитать факториал числа
package main import ( "bufio" "fmt" "os" "strconv" "strings" ) func main() { r := bufio.NewReader(os.Stdin) input, _ := r.ReadString('\n') trim := strings.TrimSpace(input) n, _ := strconv.Atoi(trim) var f int = 1 for i := 1; i <= n; i++ { f *= i } fmt.Println(f) }
Вывести простые (prime) числа
package main import ( "bufio" "fmt" "os" "strconv" "strings" ) func main() { r := bufio.NewReader(os.Stdin) input, _ := r.ReadString('\n') trim := strings.TrimSpace(input) n, _ := strconv.Atoi(trim) for i := 2; i <= n; i++ { prime := true for x := 2; x < i; x++ { if i%x == 0 { prime = false break } } if prime { fmt.Print(i, " ") } } }
Выведем все варианты перемножения чисел от 1 до nRange, которые при перемножении дают число mult. Пример:
nRange = 50
mult = 360
20 * 18 = 360
24 * 15 = 360
30 * 12 = 360
36 * 10 = 360
40 * 9 = 360
45 * 8 = 360
Код:
package main import ( "bufio" "fmt" "os" "strconv" "strings" ) func main() { r := bufio.NewReader(os.Stdin) input, _ := r.ReadString('\n') trim := strings.TrimSpace(input) nRange, _ := strconv.Atoi(trim) input, _ = r.ReadString('\n') trim = strings.TrimSpace(input) mult, _ := strconv.Atoi(trim) for i := 1; i <= nRange; i++ { for x := 1; x <= i; x++ { if i*x == mult { fmt.Printf("%d * %d = %d \n", i, x, mult) } } } }