Язык Го очень похож на Си. Приведу несколько простейших программ.
Начнём… Вычислить 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)
}
}
}
}
