#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));
}
Метка: C
Бинарный поиск
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;
}
}