June 13, 2021

Piscine C 00

Piscine C 00 ex00 (ft_putchar)

Задание:

• Write a function that displays the character passed as a parameter.

• It will be prototyped as follows : void ft_putchar(char c);

• To display the character, you must use the texttt write function as follows. write(1, &c, 1);

• Напишите функцию, которая отображает символ, переданный в качестве параметра.

• Функция должна быть объявлена следующим образом: void ft_putchar(char c);

• Чтобы отобразить символ, вы должны использовать в ней функцию записи текста в стандартный поток вывода, вот так: write(1, &c, 1); Скомпилируй файл тест. В нем можно увидеть как работает эта функция вживую.

#include <unistd.h>

void ft_putchar(char c)
{
  write(1, &c, 1);
}

Объяснения + проверка int main

Команда для компиляции и одновременного запуска:

gcc -Wall -Werror -Wextra названиефайла.c && chmod +x ./a.out && ./a.out

Piscine C 00 ex01 (ft_print_alphabet)

Задание:

• Create a function that displays the alphabet in lowercase, on a single line, by ascending order, starting from the letter ’a’. • Here’s how it should be prototyped : void ft_print_alphabet(void);

• Создайте функцию, которая отображает алфавит в нижнем регистре, на одной строке, в порядке возрастания, начиная с символа «а». • Функция должна быть объявлена следующим образом: void ft_print_alphabet(void);

Решение 1

#include <unistd.h>

void    ft_putchar(char c)
{
    write(1, &c, 1);
}

void    ft_print_alphabet(void)
{
    char    letter;

    letter = 'a';
    while (letter <= 'z')
    {
        ft_putchar(letter);
        letter++;
    }
}

Решение 2

#include <unistd.h>

void    ft_putchar(char c)
{
    write(1, &c, 1);
}

void    ft_print_alphabet(void)
{
    int        i;
    char    c;

    i = 97;
    while (i <= 122)
    {
        c = i;
        ft_putchar(c);
        i++;
    }
}

Объяснения + проверка int main

Команда для компиляции и одновременного запуска:

gcc -Wall -Werror -Wextra названиефайла.c && chmod +x ./a.out && ./a.out

Piscine C 00 ex02 (ft_print_reverse_alphabet)

Задание:

• Create a function that displays the alphabet in lowercase, on a single line, by descending order, starting from the letter ’z’. • Here’s how it should be prototyped : void ft_print_reverse_alphabet(void);

• Создайте функцию, которая отображает алфавит в нижнем регистре на одной строке в порядке убывания, начиная с символа «z». • Функция должна быть объявлена следующим образом: void ft_print_reverse_alphabet(void);

Решение 1

#include <unistd.h>

void    ft_putchar(char c)
{
    write(1, &c, 1);
}

void    ft_print_reverse_alphabet(void)
{
    char    letter;

    letter = 'z';
    while (letter >= 'a')
    {
        ft_putchar(letter);
        letter--;
    }
}

Решение 2

#include <unistd.h>

void    ft_putchar(char c)
{
    write(1, &c, 1);
}

void    ft_print_reverse_alphabet(void)
{
    int        i;
    char    c;

    i = 122;
    while (i >= 97)
    {
        c = i;
        ft_putchar(c);
        i--;
    }
}

Объяснения + проверка int main

Команда для компиляции и одновременного запуска:

gcc -Wall -Werror -Wextra названиефайла.c && chmod +x ./a.out && ./a.out

Piscine C 00 ex03 (ft_print_numbers)

Задание:

• Create a function that displays all digits, on a single line, by ascending order. • Here’s how it should be prototyped : void ft_print_numbers(void);

• Создайте функцию, которая отображает все цифры на одной строке в порядке возрастания. • Функция должна быть объявлена следующим образом: void ft_print_numbers(void);

#include <unistd.h>

void    ft_putchar(char c)
{
    write(1, &c, 1);
}

void    ft_print_numbers(void)
{
    char    number;

    number = '0';
    while (number <= '9')
    {
        ft_putchar(number);
        number++;
    }
}

Объяснения + проверка int main

Команда для компиляции и одновременного запуска:

gcc -Wall -Werror -Wextra названиефайла.c && chmod +x ./a.out && ./a.out

Piscine C 00 ex04 (ft_is_negative)

Задание:

• Create a function that displays ’N’ or ’P’ depending on the integer’s sign entered as a parameter. If n is negative, display ’N’. If n is positive or null, display ’P’. • Here’s how it should be prototyped : void ft_is_negative(int n);

• Создайте функцию, которая отображает символы «N» или «P» в зависимости от целочисленного знака, введенного в качестве параметра. Если n отрицательно, выведите символ «N». Если 'n' является положительным или нулевым, выведите символ «P». • Функция должна быть объявлена следующим образом: void ft_is_negative(int n);

#include <unistd.h>

void    ft_putchar(char c)
{
    write(1, &c, 1);
}

void    ft_is_negative(int n)
{
    if (n < 0)
         ft_putchar('N');
    else
         ft_putchar('P');
}

Объяснения + проверка int main

Команда для компиляции и одновременного запуска:

gcc -Wall -Werror -Wextra названиефайла.c && chmod +x ./a.out && ./a.out

Piscine C 00 ex05 (ft_print_comb)

Задание:

• Create a function that displays all different combinations of three different digits in ascending order, listed by ascending order - yes, repetition is voluntary. • Here’s the intended output :

gt;./a.out | cat -e

012, 013, 014, 015, 016, 017, 018, 019, 023, ..., 789gt;

• 987 isn’t there because 789 already is. • 999 isn’t there because the digit 9 is present more than once. • Here’s how it should be prototyped

void ft_print_comb(void);

• Создайте функцию, которая отображает все различные комбинации трех разных цифр в порядке возрастания, перечисленных в порядке возрастания - да,повторение является добровольным. • Вот предполагаемый результат:

gt;./a.out | cat -e

012, 013, 014, 015, 016, 017, 018, 019, 023, ..., 789gt;

• 987 не должно быть, потому что 789 уже есть. • 999 тоже, потому что цифра 9 присутствует более одного раза. • Функция должна быть объявлена следующим образом: void ft_print_comb(void);

Решение 1

#include <unistd.h>

void    ft_putchar(char c)
{
    write(1, &c, 1);
}

void    ft_commas(void)
{
    ft_putchar(',');
    ft_putchar(' ');
}

void    ft_print_comb(void)
{
    int num[3];

    num[0] = '0';
    while (num[0] <= '9')
    {
        num[1] = '0';
        while (num[1] <= '9')
        {
            num[2] = '0';
            while (num[2] <= '9')
            {
                if (num[0] < num[1] && num[1] < num[2])
                {
                    ft_putchar(num[0]);
                    ft_putchar(num[1]);
                    ft_putchar(num[2]);
                    if(!(num[0] == '7' && num[1] == '8' && num[2] == '9'))
                        ft_commas();
                }
                num[2]++;
            }
            num[1]++;
        }
        num[0]++;
    }
}

Решение 2

#include <unistd.h>

void    ft_putchar(char c)
{
    write(1, &c, 1);
}

void    ad_print_numbers(char c, char d, char u)
{
    ft_putchar(c);
    ft_putchar(d);
    ft_putchar(u);
}

void    ad_print_space(void)
{
    ft_putchar(',');
    ft_putchar(' ');
}

void    ft_print_comb(void)
{
    char c;
    char d;
    char u;

    c = '0';
    while (c <= '9')
    {
        d = c + 1;
        while (d <= '9')
        {
            u = d + 1;
            while (u <= '9')
            {
                ad_print_numbers(c, d, u);
                if (!(c == '7' && d == '8' && u == '9'))
                {
                    ad_print_space();
                }
                u++;
            }
            d++;
        }
        c++;
    }
}

Решение 3

#include <unistd.h>

void    ft_putchar(char c)
{
    write(1, &c, 1);
}

void    ft_print_comb(void)
{
    char    nbr1;
    char    nbr2;
    char    nbr3;

    nbr1 = '0' - 1;
    while (++nbr1 <= '9')
    {
        nbr2 = nbr1;
        while (++nbr2 <= '9')
        {
            nbr3 = nbr2;
            while (++nbr3 <= '9')
            {
                if (nbr1 != '0' || nbr2 != '1' || nbr3 != '2')
                    ft_putchar(',');
                if (nbr1 != '0' || nbr2 != '1' || nbr3 != '2')
                    ft_putchar(' ');
                ft_putchar(nbr1);
                ft_putchar(nbr2);
                ft_putchar(nbr3);
            }
        }
    }
}

Решение 4

#include <unistd.h>

void    ft_putchar(char c)
{
    write(1, &c, 1);
}

void    ft_print_comb(void)
{
    int    numbers[3] = {'0', '0', '0'};

    while (numbers[0] <= '9')
    {
        if ((numbers[0] < numbers[1]) && (numbers[1] < numbers[2]))
        {
            ft_putchar(numbers[0]);
            ft_putchar(numbers[1]);
            ft_putchar(numbers[2]);
            if (numbers[0] != '7')
                ft_putchar(',');
            if (numbers[0] != '7')
                ft_putchar(' ');
        }
        if (numbers[2]++ >= '9')
        {
            numbers[2] = '0';
            numbers[1]++;
        }
        if (numbers[1] == ':')
        {
            numbers[1] = '0';
            numbers[0]++;
        }
    }
}

Объяснения + проверка int main

Команда для компиляции и одновременного запуска:

gcc -Wall -Werror -Wextra названиефайла.c && chmod +x ./a.out && ./a.out

Piscine C 00 ex06 (ft_print_comb2)

Задание:

• Create a function that displays all different combination of two digits between 00 and 99, listed by ascending order. • Here’s the expected output :

gt;./a.out | cat -e

00 01, 00 02, 00 03, 00 04, 00 05, ..., 00 99, 01 02, ..., 97 99, 98 99gt;

• Here’s how it should be prototyped :

void ft_print_comb2(void);

• Создайте функцию, которая отображает все различные комбинации двух цифр от 00 до 99, перечисленные в порядке возрастания. • Пример вывода:

gt;./a.out | cat -e

00 01, 00 02, 00 03, 00 04, 00 05, ..., 00 99, 01 02, ..., 97 99, 98 99gt;

• Скомпилируй файл тест. В нем можно увидеть как работает эта функция вживую

void ft_print_comb2(void);

Решение 1

#include <unistd.h>

void    ft_putchar(char c)
{
    write(1, &c, 1);
}

void    ft_print_comb2(void)
{
    int        i;
    int        k;

    i = 0;
    k = 0;
    while (i < 100)
    {
        k = i + 1;
        while (k < 100)
        {
            ft_putchar(i / 10 + '0');
            ft_putchar(i % 10 + '0');
            ft_putchar(' ');
            ft_putchar(k / 10 + '0');
            ft_putchar(k % 10 + '0');
            if ((i / 10 != 9) || (i % 10 != 8))
            {
                ft_putchar(',');
                ft_putchar(' ');
            }
            k++;
        }
        i++;
    }
}

Решение 2

#include <unistd.h>

void    ft_putchar(char c)
{
    write(1, &c, 1);
}

void    ft_print_comb2(void)
{
    int        i;
    int        k;

    i = 0;
    k = 0;
    while (i < 100)
    {
        k = i + 1;
        while (k < 100)
        {
            ft_putchar(i / 10 + '0');
            ft_putchar(i % 10 + '0');
            ft_putchar(' ');
            ft_putchar(k / 10 + '0');
            ft_putchar(k % 10 + '0');
            if ((i / 10 != 9) || (i % 10 != 8))
            {
                ft_putchar(',');
                ft_putchar(' ');
            }
            k++;
        }
        i++;
    }
}

Решение 3

#include <unistd.h>

void        ft_putchar(char c)
{
    write(1, &c, 1);
}


void    ft_makechars(int i)
{
    ft_putchar(i / 10 + 48);
    ft_putchar(i % 10 + 48);
}

void    ft_putthem(int x, int y)
{
    if (x < 10)
    {
        ft_putchar(48);
        ft_putchar(x + 48);
    }
    else
        ft_makechars(x);
    ft_putchar(' ');
    if (y < 10)
    {
        ft_putchar(48);
        ft_putchar(y + 48);
    }
    else
        ft_makechars(y);
    if (!(x + y == 197))
    {
        ft_putchar(',');
        ft_putchar(' ');
    }
}

void    ft_print(int x, int y)
{
    if (x < y)
    {
        ft_putthem(x, y);
    }
}

void    ft_calc_numbers(int x[])
{
    while (x[0] < 100)
    {
        x[1] = 0;
        while (x[1] < 100)
        {
            ft_print(x[0], x[1]);
            x[1]++;
        }
        x[0]++;
    }
}

void    ft_print_comb2(void)
{
    int x[2];

    x[0] = 0;
    x[1] = 1;
    ft_calc_numbers(x);
}

Объяснения + проверка int main

Команда для компиляции и одновременного запуска:

gcc -Wall -Werror -Wextra названиефайла.c && chmod +x ./a.out && ./a.out

Piscine C 00 ex07 (ft_putnbr)

Задание:

• Create a function that displays the number entered as a parameter. The function has to be able to display all possible values within an int type variable. • Here’s how it should be prototyped : void ft_putnbr(int nb);

• For example: ft_putnbr(42) displays "42"

• Создайте функцию, которая отображает число, введенное в качестве параметра. Функция должна иметь возможность отображать все возможные значения в переменной типа int. • Вот как это должно быть объявлено: void ft_putnbr(int nb);

• Например: ft_putnbr(42) displays "42"

Решение 1

#include <unistd.h>

void    ft_putchar(char c)
{
    write(1, &c, 1);
}

void    ft_putnbr(int nb)
{
    int    temp;
    int    size;

    size = 1;
    if (nb < 0)
    {
        ft_putchar('-');
        nb = -nb;
    }
    if (nb == -2147483648)
    {
        ft_putchar('2');
        nb = 147483648;
    }
    temp = nb;
    while ((temp /= 10) > 0)
        size *= 10;
    temp = nb;
    while (size)
    {
        ft_putchar((char)((temp / size)) + 48);
        temp %= size;
        size /= 10;
    }
}

Решение 2

#include <unistd.h>

void    ft_putchar(char c)
{
    write(1, &c, 1);
}

void    ft_putnbr(int nb)
{
    char    c;

    if (nb < 0)
    {
        nb = -nb;
        ft_putchar('-');
    }
    if (nb < 10)
        ft_putchar(nb + '0');
    else
    {
        ft_putnbr(nb / 10);
        ft_putnbr(nb % 10);
    }
}

Решение 3

#include <unistd.h>

void    ft_putchar(char c)
{
    write(1, &c, 1);
}

void    ft_putnbr(int nb)
{
    if (nb >= 10)
    {
        ft_putnbr(nb / 10);
        ft_putnbr(nb % 10);
    }
    else
    {
        ft_putchar(nb + '0');
    }
}

Решение 4

#include <unistd.h>

void    ft_putchar(char c)
{
    write(1, &c, 1);
}

void    ft_printnbr(int x[])
{
    int i;
    int b;

    i = 0;
    b = 0;
    while (i < 10)
    {
        if (b == 1)
        {
            ft_putchar(x[i] + 48);
        }
        else
        {
            if (x[i] > 0)
            {
                b = 1;
                ft_putchar(x[i] + 48);
            }
        }
        i++;
    }
}

void    ft_preventoverflow(void)
{
    ft_putchar('-');
    ft_putchar('2');
    ft_putchar('1');
    ft_putchar('4');
    ft_putchar('7');
    ft_putchar('4');
    ft_putchar('8');
    ft_putchar('3');
    ft_putchar('6');
    ft_putchar('4');
    ft_putchar('8');
}

void    ft_fillarray(int x[], int nb)
{
    int t;

    t = 9;
    while (t >= 0)
    {
        x[t] = nb % 10;
        nb /= 10;
        t--;
    }
}

void    ft_putnbr(int nb)
{
    int x[10];

    if (nb == 0)
        ft_putchar('0');
    else
    {
        if (nb == -2147483648)
            ft_preventoverflow();
        else
        {
            if (nb < 0)
            {
                ft_putchar('-');
                nb = nb + -2 * nb;
            }
            ft_fillarray(x, nb);
            ft_printnbr(x);
        }
    }
}

Объяснения + проверка int main

Команда для компиляции и одновременного запуска:

gcc -Wall -Werror -Wextra названиефайла.c && chmod +x ./a.out && ./a.out

Piscine C 00 ex08 (ft_putnbr)

Задание:

• Create a function that displays all different combinations of n numbers by ascending
order.
• n will be so that : 0 < n < 10.
• If n = 2, here’s the expected output :

gt;./a.out | cat -e

01, 02, 03, ..., 09, 12, ..., 79, 89gt;

• Here’s how it should be prototyped : void ft_print_combn(int n);

• Создайте функцию, которая отображает все различные комбинации из 'n' чисел в порядке возрастания. • n должно быть таким таким, чтоб: 0 < n <10 • сли n = 2, результат должен быть таким:

gt;./a.out | cat -e

01, 02, 03, ..., 09, 12, ..., 79, 89gt;

Разрешенные функции: write

• Скомпилируй файл тест : void ft_print_combn(int n);

Решение 1

#include <unistd.h>

void    ft_putchar(char c)
{
    write(1, &c, 1);
}

void    ft_check_print(int x[], int n)
{
    int i;
    int yes;

    i = 0;
    yes = 1;
    while (i < n - 1)
    {
        if (!(x[i] < x[i + 1]))
            yes = 0;
        i++;
    }
    if (yes == 1)
    {
        i = 0;
        while (i < n)
        {
            ft_putchar(x[i]);
            i++;
        }
        if (x[0] != '9' - n + 1)
        {
            ft_putchar(',');
            ft_putchar(' ');
        }
    }
}

void    create_while(int x[], int k, int n)
{
    if (k == n - 1)
    {
        x[k] = '0';
        while (x[k] <= '9')
        {
            if (n == 9 && x[0] > '1')
                break ;
            ft_check_print(x, n);
            x[k]++;
        }
    }
    else
    {
        x[k] = '0';
        while (x[k] <= '9')
        {
            create_while(x, k + 1, n);
            x[k]++;
        }
    }
}

void    ft_print_combn(int n)
{
    int x[n];

    create_while(x, 0, n);
}

Решение 2

#include <unistd.h>

void    ft_putchar(char c)
{
    write(1, &c, 1);
}

static void    ft_me_cago_en_norminette(int *arr, int col, int n)
{
    int        i;

    while (col)
    {
        while (arr[col] == (9 + col - (n - 1)) && col >= 0)
            col -= 1;
        if (col < 0)
            break ;
        arr[col] += 1;
        i = (col + 1) - 1;
        while (i++ < n)
            arr[i] = arr[i - 1] + 1;
        col = n - 1;
        ft_putchar(',');
        ft_putchar(' ');
        i = 0;
        while (i < n)
            ft_putchar(arr[i++] + '0');
    }
}

void        ft_print_combn(int n)
{
    int        arr[n];
    int        i;
    int        col;

    col = n - 1;
    i = -1;
    if (n <= 10)
    {
        while (i++ < n)
            arr[i] = i;
        i = 0;
        while (i < n)
            ft_putchar(arr[i++] + '0');
        ft_me_cago_en_norminette(arr, col, n);
        ft_putchar('\n');
    }
}

Объяснения + проверка int main

Команда для компиляции и одновременного запуска:

gcc -Wall -Werror -Wextra названиефайла.c && chmod +x ./a.out && ./a.out