Рекурсия

#include <cs50.h>
#include <stdio.h>

int sigma();

int main(void) 
{
    printf("Введите положительное целое число: ");
    int n = GetInt();
    printf("Сумма чисел от 0 до %i = %i\n", n, sigma(n));
}

int sigma(int k) // создаем рекурсивную функцию суммы от 0 до k
{
    if (k==0) return 0;
    
    return (k+sigma(k-1));
}

Бинарный поиск

bool search(int value, int values[], int n)
{
    // смотрим кол-во элементов в массиве, если деление на %2 дает остаток 0, значит, четное кол-во
    // иначе нечетное. Если четное - делим отсортированный массив на 2, смотрим последний элемент в левой части. Сравниваем с искомым.
    // Если нечетное, то вычитаем 1 элемент, делим на 2, смотрим последний элемент в левой части +1.
    // search(needle, haystack, size), где 1 - то, что ищем в массиве; 2 - массив; 3 - размер массива

    int a = 0; //начало массива
    int b = n-1; // конец массива
    int m = b-a; // длина выбранной части массива
    int centr, levo, pravo, i;
    int aa=values[0];
    int bb=values[n-1];
    
   if (aa<=value && bb>=value) 
   {
    do
    {
        float j = m%2; //для определения четного или нечетного
        if (j==0) //если нечетное кол-во элементов в массиве
        {
            centr = (b-a)/2+a;
            if (values[centr]>value)
            {
                b=centr-1;
            }
            else if ((values[centr]<value))
            {
                a=centr+1;
            }
            else return true;
        }
        else // если четное кол-во элементов в массиве
        {
            levo = (b-a+1)/2+a-1;
            pravo = (b-a+1)/2+a;
            if (values[levo]>=value)
            {
                b=levo;
            }
            else
            {
                a=pravo;
            }
        }
        m = b-a;
    
    printf("\na=%i b=%i\n", a, b);
    for (i=a;i<=b;i++)
    {
        printf("%i\n",values[i]);
    }
    
    }
    while (m!=0);
    
// запускаем последний этап проверки, т.к. если остался 1 элемент в конце m может быть равным 0 и цикл закончится

    if (values[a]==value) return true;
    else return false;
       
   }  else return false;
}

 

Линейный поиск

bool search(int value, int values[], int n)
{
// search(needle, haystack, size), где 1 - значение из командой строки, которую ищем в стоге; 2 - массив; 3 - размер массива, номер элемента в массиве
    int i;
    if (n<=0) return false;
    else
    {
        for (i=0; i<n; i++)
        {
            if (value == values[i]) return true;
        }
    }
    return false;
}

Пузырьковая сортировка

Реализация метода пузырьковой сортировки (попарное сравнение и смена места в массиве)

void sort(int values[], int n) // sort(haystack, size); - массив + его размер
{
    if (n<1) return;
    else
    {
        int i, a, b;
        int j=1;

        do
        {
            j=0;
            for (i=1; i<n; i++)
            {
                a = values[i-1];
                b = values[i];
                
                if (values[i]<values[i-1])
                {
                    values[i] = a;
                    values[i-1] = b;
                    j=1;
                }
            }
        }
        while (j!=0);
        
        return;
    }
}

 

Шифр Вижнера

Задача из курса CS50

#include <stdio.h> 
#include <cs50.h> 
#include <string.h>
#include <ctype.h>
#include <stdlib.h>

/*шифр Вижнера*/

//главная функция
int main(int argc, string argv[]) 
{
// проверка на количество аргументов в командой строке
    if (argc != 2)
    {
    printf("Usage: /home/cs50/pset2/vigenere <keyword>\n");
    return 1;
    }
    
// проверка на то, что в шифре одни буквы из алфавита
    string word = argv[1];
    int a = 0; // счетчик букв в шифре
    
    for (int i=0; i<strlen(word);i++)
    {
        if (isalpha(word[i]))
        {
            a=a+1;
        }
    }
    
    if (a != strlen(word))
    {
        printf("Keyword must only contain letters A-Z and a-z\n");
        return 1;
    }

//вводим исходное слово для шифровки    
    string p = GetString(); 
    int j = 0;
    int key = 0;
    
        for (int i = 0, n = strlen(p); i < n; i++)
            {
            if (isalpha(p[i]))
            {
                if (islower(p[i]))
                {
                        if (islower(word[j])) key=word[j]-97;
                        else key = word[j]-65;
                        
                        int pi = (p[i]-97+key)%26+97; 
                        
                        printf("%c", pi);
                }
                else 
                {
                        if (islower(word[j])) key=word[j]-97;
                        else key = word[j]-65;
                        
                        int pi = (p[i]-65+key)%26+65; 
                        
                        printf("%c", pi);
                }
                j=(j+1)%3;
            }
            else printf("%c", p[i]);
            }
    
    printf("\n");
    return 0;
}

 

Шифр Цезаря

Шифр Цезаря, задача из CS50.

Написать в файле caesar.c, программу, шифрующую текст с помощью шифра Цезаря. На вход программы подавайте один аргумент командной строки:
не негативное целое число. Для простоты назовем его k. Если пользователь выполняет программу без аргументов командной строки или более,
чем с одним аргументом, приложение должно возмутиться и вернуть значение 1 (обычно так обозначают ошибки):
return 1;

Во всех других случаях программа запрашивает у пользователя текст, который нужно зашифровать, затем выводит на экран текст,
зашифрованный ключом k (т.е., смещенный на k позиций вправо по циклу). Если в тексте есть символы, выходящие за пределы английского алфавита,
их программа не меняет. После вывода шифрованного текста, приложение завершает работу,main возвращает 0:

return 0;

Если main не возвращает нуль явно, он возвращается автоматически (на самом деле int — тип, возвращаемый main, но об этом в другой раз).
Согласно конвенции (правилам хорошего тона в программировании), если вы явно возвращаете 1 чтобы указать на ошибку, то нужно вернуть
и 0 в качестве указателя на успешное завершение работы программы.

Хотя в английском алфавите только 26 букв, k может быть и больше 26. По сути, ключ k = 27 даст тот же результат, что и k = 1,
но нужно позволить пользователю вводить любое неотрицательное число, не превышающее 2^31 – 26 (оно должно поместиться в int).
Программа также должна учитывать, что строчные буквы шифруются строчными, а прописные — прописными.

#include <stdio.h> 
#include <cs50.h> 
#include <string.h>
#include <ctype.h>
#include <stdlib.h>

//главная функция
int main(int argc, string argv[]) 
{
    if (argc != 2)
    {
    printf("Usage: /home/cs50/pset2/caesar <key>\n");
    return 1;
    }
    else
    {
        int k = atoi(argv[1]); //конвертируем строку в число
        
        if (k>=0)    
        {
        string p = GetString(); //вводим исходное слово
    
        for (int i = 0, n = strlen(p); i < n; i++)
            {
            if (isalpha(p[i]))
            {
                if (islower(p[i]))
                {
                        int pi = (p[i]-97+k%26)%26+97; //сделать так, чтобы при прибавлении ключа пошел по кругу (если pi больше 122, то на второй круг с 97 символа)
                        printf("%c", pi);
                }
                else 
                {
                        int pi = (p[i]-65+k%26)%26+65; //сделать так, чтобы при прибавлении ключа пошел по кругу (если pi больше 90, то на второй круг с 65 символа)
                        printf("%c", pi);
                }
            }
            else printf("%c", p[i]);
            }
        printf("\n");
        }
        else return 0;
    }
}