Язык Go. Простые программы для новичков


Язык Го очень похож на Си. Приведу несколько простейших программ.

Начнём… Вычислить 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)
			}
		}
	}

}

 

 

 

 


Запись опубликована в рубрике Go. Добавьте в закладки постоянную ссылку.

Добавить комментарий

🇬🇧 Attention! Comments with URLs/email are not allowed.
🇷🇺 Комментарии со ссылками/email удаляются автоматически.