#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; } }