CS50 — 2020

5 (100%) 1 vote[s]

В очередном курсе CS50-2020 «введение в информатику» представлены новые задания. Для тех, кто начал курс в 2019 году, но не отправил все задания, для продолжения курса придется дополнять уже выполненные задачи новыми.

Содержимое страницы сделано в виде вкладок для удобства просмотра на широких экранах и не адаптировано для маленьких экранов мобильных устройств.



НЕДЕЛИ КУРСА:

  • Первая
  • Вторая
  • Третья
  • Четвертая
  • Пятая
  • Шестая
  • Седьмая
  • Восьмая
  • Первая неделя: Hello, Marioless, Mariomore, Cach.

    • Hello
    • MarioLess
    • MarioMore
    • Cach
    • hello.c
      #include <cs50.h>
      #include <stdio.h>
       
      int main(void)
      {
          string name = get_string("what is your name?")	
          printf("hello, %s\n", name);
      }

      Вы можете использовать

      printf
      не только для печати, но и для форматирования строки, как показано ниже, где name - string.

      printf("hello, %s\n", name);

      Для использования

      get_string
      , вам необходимо включить cs50.h (в котором
      get_string
      будет объявлен) в начале файла.

    • mario.c
      #include <cs50.h>
      #include <stdio.h>
       
      int main(void)
      {
          int n;
          do
          {
              n = get_int("Height: ");
          }
          while (n &lt; 1 || n &gt; 8);
       
          for (int i = 0; i &lt; n; i++)
          {
              for (int j = n - 1; j &gt; i; j--)
              {  
                  printf(" ");                           
              }
       
              for (int j = 0; j &lt;= i; j++)
              {
                  printf("#");
              }
              printf("\n");
          }
       
      }

      Вы можете напечатать int с printf c помощью %i.
      get_int заявлено в cs50.h.

    • mario.c
      #include <cs50.h>
      #include <stdio.h>
       
      int main(void)
      {
          int n;
          do
          {
              n = get_int("Height: ");
          }
          while (n &lt; 1 || n &gt; 8); 
       
          for (int i = 0; i &lt; n; i++)
          {
       
              for (int j = n - 1; j &gt; i; j--)
              {
                  printf(" ");
              }
       
              for (int j = 0; j &lt;= i; j++)
              {
                  printf("#");
              }
       
              printf("  ");
       
              for (int j = 0; j &lt;= i; j++)
              {
                  printf("#");
              }
       
              printf("\n");
          }
      }
    • cash.c
      #include <cs50.h>
      #include <stdio.h>
      #include <math.h>
       
      int main(void)
      {
          float d;                  // "d" - вводимые пользователем данные в долларах (например, 0,25 доллара США).
          do
          {
              d = get_float("Change: ");
          }
          while (d &lt; 0);
       
          int c = round(d * 100);      // "c" - центаs (доллар * 100). Полученные доллары при необходимости будут округлены в большую сторону.
       
          int w;                      // "w" - это сумма, покрываемая монетами в 25 центов
          w = c - c % 25;             // "f" - необходимое количество монет по 25 центов
          int f = w / 25;            
       
          c = c - f * 25;              // приравнивая "c" к сумме, оставшейся после использования 25-центовых монет
       
          int q;                      // "q" - это сумма, покрываемая монетами 10 центов.
          q = c - c % 10;             // "n" - необходимое количество монет по 10 центов
          int n = q / 10;              
       
          c = c - n * 10;              // приравнивая "c" к сумме, оставшейся после использования 10-центовых монет
       
       
          int v;                       // "v" - это сумма, покрываемая монетами в 5 центов
          v = c - c % 5;               // "r" - необходимое количество монет по 5 центов.
          int r = v / 5;               
       
          c = c - r * 5;              // приравнивая "c" к сумме, оставшейся после использования монет в 25, 10 и 5 центов
       
          int p;                      // "p" - это сумма, покрываемая монетами в 1 цент
          p = c - c % 1;              // "u" - необходимое количество монет в 1 цент
          int u = p / 1;              
       
          c = c - u * 1;                // приравнивая "c" к сумме, оставшейся после использования монет в 25, 10, 5 и 1 цент
       
          int q = r + u + n + f;       // считаем общее количество монет
       
          printf("%i", q);
       
          printf("\n");
       
      }
  • Вторая неделя: readability, substitution, caesar.

    • caesar
    • readability
    • substitution
    • caesar.c
      #include <cs50.h>
      #include <stdio.h>
      #include <stdlib.h>
      #include <string.h>
      #include <ctype.h>
      #include <math.h>
       
       
      int main(int argc, string argv[])
      {
          if (argc != 2)                      // получить действующий ключ в командной строке
          {
              printf("Usage: ./caesar key\n");
              return 1;                       // остановить программу, возвращаем 1, если ввод недопустимый
          }
       
          int k = atoi(argv[1]);                // ключ получен
       
          if (k &lt; 0 || k &gt; 1000)
          {
              printf("Usage: ./caesar key\n");
              return 1;
          }
       
          for (int j = 0; j &lt; strlen(argv[1]); j++)
          {
       
              if (argv[1][j] &gt; 57 || argv[1][j] &lt; 48)
              {
                  printf("Usage: ./caesar key\n");
                  return 1;
              }
          }
       
          string p = get_string("plaintext: ");
       
          char c[strlen(p)];                           // зашифрованный текст
       
          printf("ciphertext: ");
       
          for (int i = 0, n = strlen(p); i &lt; n; i++)
          {
       
              if (isupper(p[i]))
              {
                  p[i] = p[i] - 65;                // преобразование в алфавитный индекс
                  c[i] = (p[i] + k) % 26 + 65;
                  printf("%c", c[i]);
              }
       
              else if (islower(p[i]))
              {
                  p[i] = p[i] - 97;                
                  c[i] = (p[i] + k) % 26 + 97;
                  printf("%c", c[i]);
              }
       
              else
              {
                  c[i] = p[i];
                  printf("%c", c[i]);
              }
          }
       
          printf("\n");
       
      }
    • readability.c
      #include <cs50.h>
      #include <stdio.h>
      #include <math.h>
      #include <string.h>
      #include <ctype.h>
       
       
      int main(void)
      {
          int letter = 0;
          int word = 0;
          int sentence = 0;
       
          string txt = get_string("Text to be analysed: \n");
       
          int n = strlen(txt);
       
          // подсчет букв
          for (int i = 0; i &lt;= n; i++)
          {
              if (isalpha(txt[i]))
              {
                  letter++;
              }
          }
       
          // подсчет слов
          for (int i = 0; i &lt;= n; i++)
          {
              if ((isspace(txt[i])))
              {
                  word++;
              }
          }
          word++;     // поскольку условие - это пробел после слова, но это не относится к последнему слову
       
          // подсчет фраз
          for (int i = 0; i &lt;= n; i++)                    // доступ к каждому элементу элементу массива
          {
              if ((txt[i] == 46) || (txt[i] == 33) || (txt[i] == 63))   // пробел - 32,! - 33,? - 63,. - 46
              {
                  sentence++;
              }
          }
       
          float L = ((letter * 100.00) / word);
          float S = ((sentence * 100.00) / word);
       
          float answ = 0.0588 * L - 0.296 * S - 15.8;
       
          answ = round(answ);
          int result = answ;
       
          if (answ &lt; 1)
          {
              printf("Before Grade 1\n");
          }
       
          else if (answ &gt; 16 || answ == 16)
          {
              printf("Grade 16+\n");
          }
       
          else if (answ &gt;= 1 || answ &lt; 16)
          {
              printf("Grade %i\n", result);
          }
      }

      Важно! Внимательно читайте условия задания, чтобы облегчить себе задачу подсчета пробелов. Среди прочего, говорится:

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

    • substitution.c
      #include <cs50.h>
      #include <cs50.h>
      #include <stdio.h>
      #include <stdlib.h>
      #include <string.h>
      #include <ctype.h>
      #include <math.h>
       
       
      int main(int argc, string arg[])
      {
          //получение действующего ключа в командной строке
          if (argc != 2)                      
          {
              printf("Usage: ./caesar KEY\n");
       
      // остановить программу, используя возврат 1, если ввод недопустим
              return 1;
          }
       
          if (strlen(arg[1]) != 26)
          {
              printf("KEY must contain 26 fonts.\n");
              return 1;
          }
       
          for (int i = 0; i &lt; 26; i++)
          { 
              // isalpha возвращает 1 или 0
              if (isalpha(arg[1][i]) == 0)           
              {
                  printf("KEY must contain alphabets only.\n");
                  return 1;
              }
       
          }
       
          char key[26];
       
          for (int i = 0; i &lt; 26; i++)
          {
              key[i] = arg[1][i];
          }
       
          //проверить повторы
          for (int i = 0; i &lt; 26; i++)                     
          {
              // исправление одного символа ключа и сравнение его со всеми остальными
              for (int j = 1; j &lt; 26 - i; j++)
       
              {
                  if (key[i] == key[i + j])
                  {
                      printf("KEY should not contain repeated characters.\n");
                      return 1;
                  }
              }
       
          }
       
          string p = get_string("plaintext: ");
       
          int lengthp = strlen(p);
       
          char q[lengthp];
       
          printf("ciphertext: ");
       
          // шифрование открытого текста
          for (int i = 0; i &lt; lengthp; i++)      
          {
              int font = p[i];
       
              if (isupper(p[i]))
              {
       
                  // Убедитесь, что регистр букв ключа не имеет значения
                  q[i] = toupper(arg[1][font - 65]); 
                  printf("%c", q[i]);
              }
       
              if (islower(p[i]))
              {
                  q[i] = tolower(arg[1][font - 97]);
                  printf("%c", q[i]);
              }
              // не isalpha остаются неизменными
              if (isalpha(p[i]) == 0)                         
              {
                  q[i] = p[i];
                  printf("%c", q[i]);
              }
          }
          printf("\n");
          return 0;
      }

      Видео, как запускать при помощи ./a.out и make substitution (чтобы автоматизировать процесс выполнения clang).
      Небольшая правка стиля под style50 substitution.c

    Вторая неделя
  • Третья неделя: plurality, runoff, tideman.

    • plurality
    • runoff
    • tideman
    • plurality.c
      #include <cs50.h>
      #include <stdio.h>
      #include <string.h>
       
      //Максимальное количество кандидатов
      #define MAX 9
       
      //У кандидатов есть имя, количество голосов
      typedef struct
      {
          string name;
          int votes;
      }
      candidate;
       
      // Массив кандидатов
      candidate candidates[MAX];
       
      // Количество кандидатов
      int candidate_count;
       
      // Функциональные прототипы
      bool vote(string name);
      void print_winner(void);
       
      int main(int argc, string argv[])
      {
          // Проверить на недопустимое использование
          if (argc &lt; 2)
          {
              printf("Usage: plurality [candidate ...]\n");
              return 1;
          }
       
          // Заполните массив кандидатов
          candidate_count = argc - 1;
          if (candidate_count &gt; MAX)
          {
              printf("Maximum number of candidates is %i\n", MAX);
              return 2;
          }
          for (int i = 0; i &lt; candidate_count; i++)
          {
              candidates[i].name = argv[i + 1];
              candidates[i].votes = 0;
          }
       
          int voter_count = get_int("Number of voters: ");
       
          // Проверьте всех избирателей
          for (int i = 0; i &lt; voter_count; i++)
          {
              string name = get_string("Vote: ");
       
              // Проверить на недействительный голос
              if (!vote(name))
              {
                  printf("Invalid vote.\n");
              }
          }
       
          // Показать победителя выборов
          print_winner();
      }
       
      // Обновить итоги голосов при новом голосовании
      bool vote(string name)
      {
          for (int i = 0; i &lt; candidate_count; i++)
          {
              if (strcmp(candidates[i].name, name) == 1)
              {
                  return false;
              }
       
              for (int j = 0; j &lt; candidate_count; j++)
              {
                  if (strcmp(candidates[j].name, name) == 0)
                  {
                      candidates[j].votes++;
                      return true;
                  }
              }
          }
          return false;
       
      }
       
      // Выведите победителя (или победителей) выборов
      void print_winner(void)
      {
          int maxvotes = 0;
       
          for (int i = 0; i &lt; candidate_count; i++)
          {
              if (candidates[i].votes &gt; maxvotes)
              {
                  maxvotes = candidates[i].votes;
              }
          }
       
          for (int i = 0; i &lt; candidate_count; i++)
          {
       
              if (maxvotes == candidates[i].votes)
              {
                  printf("%s\n", candidates[i].name);
              }
       
          }
          return;
      }
    • runoff.c
      #include <cs50.h>
      #include <stdio.h>
      #include <stdlib.h>
      #include <string.h>
      #include <ctype.h>
       
      // Максимальное количество избирателей и кандидатов
      #define MAX_VOTERS 100
      #define MAX_CANDIDATES 9
       
      // Предпочтения [i] [j] - это j-е предпочтение для избирателя i
      int preferences[MAX_VOTERS][MAX_CANDIDATES];
       
      //У кандидатов есть имя, подсчет голосов, исключенный статус
      typedef struct
      {
          string name;
          int votes;
          bool eliminated;
      }
      candidate;
       
      // Массив кандидатов
      candidate candidates[MAX_CANDIDATES];
       
      // Количество избирателей и кандидатов
      int voter_count;
      int candidate_count;
       
      // Функциональные прототипы
      bool vote(int voter, int rank, string name);
      void tabulate(void);
      bool print_winner(void);
      int find_min(void);
      bool is_tie(int min);
      void eliminate(int min);
       
      int main(int argc, string argv[])
      {
          // Проверить на недопустимое использование
          if (argc &lt; 2)
          {
              printf("Usage: runoff [candidate ...]\n");
              return 1;
          }
       
          // Заполните массив кандидатов
          candidate_count = argc - 1;
          if (candidate_count &gt; MAX_CANDIDATES)
          {
              printf("Maximum number of candidates is %i\n", MAX_CANDIDATES);
              return 2;
          }
          for (int i = 0; i &lt; candidate_count; i++)
          {
              candidates[i].name = argv[i + 1];
              candidates[i].votes = 0;
              candidates[i].eliminated = false;
          }
       
          voter_count = get_int("Number of voters: ");
          if (voter_count &gt; MAX_VOTERS)
          {
              printf("Maximum number of voters is %i\n", MAX_VOTERS);
              return 3;
          }
       
          // Продолжайте запрашивать голоса
          for (int i = 0; i &lt; voter_count; i++)
          {
       
              // Запрос для каждого тура
              for (int j = 0; j &lt; candidate_count; j++)
              {
                  string name = get_string("Rank %i: ", j + 1);
       
                  // Записать голосование, если оно не недействительно
                  if (!vote(i, j, name))
                  {
                      printf("Invalid vote.\n");
                      return 4;
                  }
              }
       
              printf("\n");
          }
       
          // Продолжайте проводить второй тур, пока не определится победитель
          while (true)
          {
              // Подсчитайте количество голосов с учетом оставшихся кандидатов
              tabulate();
       
              // Проверить, выиграны ли выборы
              bool won = print_winner();
              if (won)
              {
                  break;
              }
       
              // Исключить кандидатов, занявших последнее место
              int min = find_min();
              bool tie = is_tie(min);
       
              // Если ничья, все выигрывают
              if (tie)
              {
                  for (int i = 0; i &lt; candidate_count; i++)
                  {
                      if (!candidates[i].eliminated)
                      {
                          printf("%s\n", candidates[i].name);
                      }
                  }
                  break;
              }
       
              // Устранение любого с минимальным количеством голосов
              eliminate(min);
       
              // Сбросить счетчик голосов до нуля
              for (int i = 0; i &lt; candidate_count; i++)
              {
                  candidates[i].votes = 0;
              }
          }
          return 0;
      }
       
      // Записать предпочтение, если голосование действительное
      bool vote(int voter, int rank, string name)
      {
          for (int i = 0; i &lt; candidate_count; i++)
          {
              if (strcmp(candidates[i].name, name) == 0)
              {
                  preferences[voter][rank] = i;
                  return true;
              }
          }
          return false;
      }
       
      // Подсчитайте количество голосов за неотбывших кандидатов
      void tabulate(void)
      {
          int i = 0;
       
          for (int k = 0; k &lt; voter_count; k++)       // для учета предпочтений всех избирателей
          {
              i = preferences[k][0];
       
              if (candidates[i].eliminated == false)
              {
                  candidates[i].votes++;
                  continue;
              }
       
              for (int l = 0; l &lt; 2; l++)      // если исключен кандидат в качестве первого предпочтения
              {
                  i = preferences[k][l];
       
                  if (candidates[i].eliminated == true)
                  {
                      int j = 0;
                      j = preferences[k][l + 1];
                      candidates[j].votes++;
                  }
       
              }
          }
       
          return;
      }
      // Выведите победителя выборов, если он есть
      bool print_winner(void)
      {
          for (int i = 0; i &lt; candidate_count; i++)
          {
              if (candidates[i].votes &gt; (voter_count / 2))
              {
                  printf("%s\n", candidates[i].name);
                  return true;
              }
       
          }
          return false;
      }
       
      // Вернуть минимальное количество голосов, которое имеет оставшийся кандидат.
      int find_min(void)
      {
          int minvotes = voter_count;                        
          for (int i = 0; i &lt; candidate_count; i++)
          {
              if (candidates[i].eliminated == false &amp;&amp; candidates[i].votes &lt;= minvotes)
              {
                  minvotes = candidates[i].votes;
              }
          }
          return minvotes;
          return 0;
      }
       
      // Вернуть true, если выборы равны между всеми кандидатами, иначе false.
      bool is_tie(int min)
      {
          for (int i = 0; i &lt; candidate_count; i++)
          {
              if (candidates[i].eliminated == false &amp;&amp; candidates[i].votes == min)
              {
       
              }
              else if (candidates[i].eliminated == true)
              {
                  continue;
              }
              else if (candidates[i].votes != min)
              {
                  return false;
              }
          }
          return true;
       
      }
       
      // Исключить кандидата (или кандидатов) на последнем месте
      void eliminate(int min)
      {
          for (int i = 0; i &lt; candidate_count; i++)
          {
              if (candidates[i].votes == min)
              {
                  candidates[i].eliminated = true;
              }
          }
          return;
      }
    • tideman.c
      1. #include <cs50.h>
      2. #include <stdio.h>
      3. #include <string.h>
      4.  
      5. // Максимальное количество кандидатов
      6. #define MAX 9
      7.  
      8. // Предпочтения [i] [j] - количество избирателей, которые предпочитают i, а не j
      9. int preferences[MAX][MAX];
      10.  
      11. // заблокировано [i] [j] означает, что i заблокирован над j
      12. bool locked[MAX][MAX];
      13.  
      14. // Each pair has a winner, loser
      15. typedef struct
      16. {
      17.     int winner;
      18.     int loser;
      19. }
      20. pair;
      21.  
      22. // Массив кандидатов
      23. string candidates[MAX];
      24. pair pairs[MAX * (MAX - 1) / 2];
      25.  
      26. int pair_count;
      27. int candidate_count;
      28.  
      29. // Функциональные прототипы
      30. bool vote(int rank, string name, int ranks[]);
      31. void record_preferences(int ranks[]);
      32. void add_pairs(void);
      33. void sort_pairs(void);
      34. void lock_pairs(void);
      35. void print_winner(void);
      36. bool cycles(int i, int j);
      37.  
      38. int main(int argc, string argv[])
      39. {
      40.     // Проверить на недопустимое использование
      41.     if (argc &lt; 2)
      42.     {
      43.         printf("Usage: tideman [candidate ...]\n");
      44.         return 1;
      45.     }
      46.  
      47.     // Заполните массив кандидатов
      48.     candidate_count = argc - 1;
      49.     if (candidate_count &gt; MAX)
      50.     {
      51.         printf("Maximum number of candidates is %i\n", MAX);
      52.         return 2;
      53.     }
      54.     for (int i = 0; i &lt; candidate_count; i++)
      55.     {
      56.         candidates[i] = argv[i + 1];
      57.     }
      58.  
      59.     // Заблокированныtе пары
      60.     for (int i = 0; i &lt; candidate_count; i++)
      61.     {
      62.         for (int j = 0; j &lt; candidate_count; j++)
      63.         {
      64.             locked[i][j] = false;
      65.         }
      66.     }
      67.  
      68.     pair_count = 0;
      69.     int voter_count = get_int("Number of voters: ");
      70.  
      71.     // Запрос голосов
      72.     for (int i = 0; i &lt; voter_count; i++)
      73.     {
      74.         // rank [i] - это предпочтение избирателя с номером i
      75.         int ranks[candidate_count];
      76.  
      77.         // Запрос для каждого ранга
      78.         for (int j = 0; j &lt; candidate_count; j++)
      79.         {
      80.             string name = get_string("Rank %i: ", j + 1);
      81.  
      82.             if (!vote(j, name, ranks))
      83.             {
      84.                 printf("Invalid vote.\n");
      85.                 return 3;
      86.             }
      87.         }
      88.  
      89.         record_preferences(ranks);
      90.  
      91.         printf("\n");
      92.     }
      93.  
      94.     add_pairs();
      95.     sort_pairs();
      96.     lock_pairs();
      97.     print_winner();
      98.     return 0;
      99. }
      100.  
      101. // Обновить рейтинги при новом голосовании
      102. bool vote(int rank, string name, int ranks[])
      103. {
      104.     // Перебрать массив кандидатов
      105.     for (int i = 0; i &lt; candidate_count; i++)
      106.     {
      107.         // Проверить, совпадает ли имя с именем одного из кандидатов
      108.         if (!strcmp(candidates[i], name))
      109.         {
      110.             // Если совпадение: обновить ранги по индексу ранга с индексом кандидатов
      111.             ranks[rank] = i;
      112.             return true;
      113.         }
      114.     }
      115.     return false;
      116. }
      117.  
      118. // Обновить настройки с учетом рейтинга одного избирателя
      119. void record_preferences(int ranks[])
      120. {
      121.     // Предпочтения [row] [col] представляет количество избирателей, которые предпочитают строку кандидата столбцу кандидата
      122.     for (int i = 0; i &lt; candidate_count; i++)
      123.     {
      124.         // Голосование на позиции 0 самое высокое и т.д.
      125.         int highest_vote = ranks[i];
      126.         // Итерация зависит от позиции наивысшего количества голосов в массиве рангов
      127.         // j начинается с 1: мы хотим сравнить high_vote только с меньшими голосами
      128.         for (int j = 1; j &lt; candidate_count - i; j++)
      129.         {
      130.             // Получите голос ниже, чем текущий high_vote
      131.             int lowest_vote = ranks[i + j];
      132.             // Обновите настройки, где row = high_vote и col = low_vote
      133.             preferences[highest_vote][lowest_vote]++;
      134.         }
      135.     }
      136. }
      137.  
      138. // Запишите пары кандидатов, один из которых предпочтительнее другого
      139. void add_pairs(void)
      140. {
      141.     // Перебрать строки
      142.     for (int i = 0; i &lt; candidate_count; i++)
      143.     {
      144.         //Перебрать столбцы
      145.         for (int j = 0; j &lt; candidate_count; j++)
      146.         {
      147.             // Если значение в настройках [row] [col] больше значения в настройках [col] [row]
      148.             if (preferences[i][j] &gt; preferences[j][i])
      149.             {
      150.                 // Добавить победителя i и проигравшего j в массив пар
      151.                 // пары размером с pair_count
      152.                 pairs[pair_count].winner = i;
      153.                 pairs[pair_count].loser = j;
      154.                 // Обновите глобальную переменную pair_count, указав общее количество пар
      155.                 pair_count++;
      156.             }
      157.         }
      158.     }
      159. }
      160.  
      161. // Сортируем пары в порядке убывания "силы" победы
      162. void sort_pairs(void)
      163. {
      164.     // Используйте алгоритм сортировки
      165.     // чтобы перебрать пары
      166.     for (int i = 0; i &lt; pair_count; i++)
      167.     {
      168.         // Перебрать следующие пары
      169.         for (int j = 1; j &lt; pair_count - i; j++)
      170.         {
      171.             // Если у победителя этой пары меньше голосов, чем у следующей
      172.             if (preferences[pairs[i].winner][pairs[i].loser] &lt; preferences[pairs[j].winner][pairs[j].loser])
      173.             {
      174.                 // Поменяйте пары местами
      175.                 pair temp = pairs[i];
      176.                 pairs[i] = pairs[j];
      177.                 pairs[j] = temp;
      178.             }
      179.         }
      180.     }
      181. }
      182.  
      183. // Зафиксируйте пары в графе кандидатов по порядку, не создавая циклов
      184. void lock_pairs(void)
      185. {
      186.     // Перебрать каждую пару
      187.     for (int i = 0; i &lt; pair_count; i++)
      188.     {
      189.         // Вызовите рекурсивную функцию для каждой пары, чтобы:
      190.         // Проверьте пути между проигравшим и победителем
      191.         if (!cycles(pairs[i].winner, pairs[i].loser))
      192.         {
      193.             // Если нет пути, заблокируйте пару
      194.             locked[pairs[i].winner][pairs[i].loser] = true;
      195.         }
      196.  
      197.         // Чтобы пройти Check50, даже если он неправильный и возвращает необъективный результат
      198.         // Используйте следующий оператор if:
      199.         /*if (!cycles(pairs[i].winner, pairs[i].loser) &amp;&amp;
      200.             pairs[0].winner != pairs[i].loser)
      201.         {
      202.             // If no path, lock pair
      203.             locked[pairs[i].winner][pairs[i].loser] = true;
      204.         }*/
      205.     }
      206. }
      207.  
      208. // Распечатайте победителя выборов
      209. void print_winner(void)
      210. {
      211.     // Победитель - источник графика
      212.     // Перебирать строки заблокированного графика
      213.     for (int i = 0; i &lt; candidate_count; i++)
      214.     {
      215.         // Инициализировать счетчик
      216.         int counter = 0;
      217.         // Обходит столбцы по заблокированному графику
      218.         for (int j = 0; j &lt; candidate_count; j++)
      219.         {
      220.             // Проверить заблокированые ? false
      221.             if (!locked[j][i])
      222.             {
      223.                 // Если false, увеличить счетчик
      224.                 counter++;
      225.             }
      226.             // Если ложных больше или равно количеству пар
      227.             // Кандидат - победитель, меньшее ребро, источник графика
      228.             if (counter &gt;= pair_count)
      229.             {
      230.                 printf("%s\n", candidates[i]);
      231.             }
      232.         }
      233.     }
      234. }
      235.  
      236. // Рекурсивная функция для проверки путей между проигравшим и победителем
      237. bool cycles(int winner, int loser)
      238. {
      239.     // Если есть путь, верните true
      240.     if (locked[loser][winner])
      241.     {
      242.         return true;
      243.     }
      244.     // Перебрать заблокированную таблицу
      245.     for (int i = 0; i &lt; pair_count; i++)
      246.     {
      247.         // Проверьте пути между проигравшим и победителем
      248.         if (locked[i][winner])
      249.         {
      250.             // Если путь, цикл, чтобы вернуть истину
      251.             cycles(winner, i);
      252.         }
      253.     }
      254.     return false;
      255. }
    Третья неделя.
  • Четвертая неделя: filter-less, filter-more, recover.

    • filter-less
    • filter-more
    • recover
    • helpers.c
      1. #include "helpers.h"
      2. #include "math.h"
      3. #include "string.h"
      4.  
      5. // Преобразовать изображение в оттенки серого
      6. void grayscale(int height, int width, RGBTRIPLE img[height][width])
      7. {
      8.     // Перебирать каждую строку изображения
      9.     for (int i = 0; i &lt; height; i++)
      10.     {
      11.         // Перебирать каждый столбец изображения
      12.         for (int j = 0; j &lt; width; j++)
      13.         {
      14.             // Получить значения RGB
      15.             int red = img[i][j].rgbtRed;
      16.             int green = img[i][j].rgbtGreen;
      17.             int blue = img[i][j].rgbtBlue;
      18.  
      19.             // Рассчитать среднее
      20.             // Округлить до ближайшего целого числа
      21.             // Использование 3.0: требуется деление с плавающей запятой
      22.             int aver = round((red + green + blue) / 3.0);
      23.  
      24.             // Установите для каждого значения RGB среднее значение
      25.             img[i][j].rgbtRed = aver;
      26.             img[i][j].rgbtGreen = aver;
      27.             img[i][j].rgbtBlue = aver;
      28.         }
      29.     }
      30. }
      31.  
      32. // Преобразование изображения в сепию
      33. void sepia(int height, int width, RGBTRIPLE img[height][width])
      34. {
      35.     // Перебирать каждую строку изображения
      36.     for (int i = 0; i &lt; height; i++)
      37.     {
      38.         // Перебирать каждый столбец изображения
      39.         for (int j = 0; j &lt; width; j++)
      40.         {
      41.             // Получить значения RGB
      42.             int red = img[i][j].rgbtRed;
      43.             int green = img[i][j].rgbtGreen;
      44.             int blue = img[i][j].rgbtBlue;
      45.  
      46.             // Получение значений сепии на основе формулы сепии
      47.             // Округлить значение до ближайшего целого числа
      48.             int sepiaRed = round(0.393 * red + 0.769 * green + 0.189 * blue);
      49.             int sepiaGreen = round(0.349 * red + 0.686 * green + 0.168 * blue);
      50.             int sepiaBlue = round(0.272 * red + 0.534 * green + 0.131 * blue);
      51.  
      52.             // Максимальное значение 255 с использованием fmin ()
      53.             // Установите для каждого значения RGB их значения сепии
      54.             img[i][j].rgbtRed = fmin(255, sepiaRed);
      55.             img[i][j].rgbtGreen = fmin(255, sepiaGreen);
      56.             img[i][j].rgbtBlue = fmin(255, sepiaBlue);
      57.         }
      58.     }
      59.  
      60. }
      61.  
      62. // Отразить изображение по горизонтали
      63. void reflect(int height, int width, RGBTRIPLE img[height][width])
      64. {
      65.     //Временное хранилище
      66.     RGBTRIPLE temp;
      67.  
      68.     // Перебирать каждую строку изображения
      69.     for (int i = 0; i &lt; height; i++)
      70.     {
      71.         // Итерировать по каждому столбцу, который меньше ширины / 2
      72.         for (int j = 0; j &lt; width / 2; j++)
      73.         {
      74.             // Поменять местами пиксели на противоположных по горизонтали сторонах
      75.             temp = img[i][j];
      76.             img[i][j] = img[i][width - j - 1];
      77.             img[i][width - j - 1] = temp;
      78.         }
      79.     }
      80. }
      81.  
      82. //Размытие изображения
      83. void blur(int height, int width, RGBTRIPLE img[height][width])
      84. {
      85.     // Временное хранилище
      86.     RGBTRIPLE temp[height][width];
      87.  
      88.     // Копирование изображения, чтобы сохранить неизменную версию для повторения цикла
      89.     memcpy(temp, img, sizeof(RGBTRIPLE) * height * width);
      90.  
      91.     // Перебирать каждую строку изображения
      92.     for (int i = 0; i &lt; height; i++)
      93.     {
      94.         // Перебирать каждый столбец изображения
      95.         for (int j = 0; j &lt; width; j++)
      96.         {
      97.             // Запуск среднего счетчика на 0.0
      98.             // Нужно избегать проблемы с усеченным целым числом
      99.             float aver = 0.0;
      100.             // Инициировать значения RGB на 0
      101.             int red = 0;
      102.             int green = 0;
      103.             int blue = 0;
      104.  
      105.             // Перебирать строки вокруг текущей строки
      106.             for (int k = -1; k &lt;= 1; k++)
      107.             {
      108.                 // Итерировать по столбцам вокруг текущего столбца
      109.                 for (int l = -1; l &lt;= 1; l++)
      110.                 {
      111.                     // Если текущая строка + следующая строка находятся в пределах границ
      112.                     // Если текущий столбец + следующий столбец находятся в пределах границ
      113.                     if (i + k != height &amp;&amp;
      114.                         i + k != -1 &amp;&amp;
      115.                         j + l != width &amp;&amp;
      116.                         j + l != -1)
      117.                     {
      118.                         // Обновить значения RGB до суммы значений RGB обоих пикселей
      119.                         red += temp[i + k][j + l].rgbtRed;
      120.                         green += temp[i + k][j + l].rgbtGreen;
      121.                         blue += temp[i + k][j + l].rgbtBlue;
      122.                         // Увеличить среднее значение на единицу на один пиксель в сумме
      123.                         aver++;
      124.                     }
      125.                 }
      126.             }
      127.             // Установите для каждого значения RGB их размытые значения
      128.             img[i][j].rgbtRed = round(red / aver);
      129.             img[i][j].rgbtGreen = round(green / aver);
      130.             img[i][j].rgbtBlue = round(blue / aver);
      131.         }
      132.     }
      133. }

      Видео, как загрузить в CS50 IDE и запускать программу:

    • helpers.c
      1. #include "helpers.h"
      2. #include "math.h"
      3. #include "string.h"
      4.  
      5. // Преобразовать изображение в оттенки серого
      6. void grayscale(int height, int width, RGBTRIPLE img[height][width])
      7. {
      8.     // Перебирать каждую строку изображения
      9.     for (int i = 0; i &lt; height; i++)
      10.     {
      11.         // Перебирать каждый столбец изображения
      12.         for (int j = 0; j &lt; width; j++)
      13.         {
      14.             // Получить значения RGB
      15.             int red = img[i][j].rgbtRed;
      16.             int green = img[i][j].rgbtGreen;
      17.             int blue = img[i][j].rgbtBlue;
      18.  
      19.             // Рассчитать среднее
      20.             // Округлить до ближайшего целого числа
      21.             // Использование 3.0: требуется деление с плавающей запятой
      22.             int aver = round((red + green + blue) / 3.0);
      23.  
      24.             // Установите для каждого значения RGB среднее значение
      25.             img[i][j].rgbtRed = aver;
      26.             img[i][j].rgbtGreen = aver;
      27.             img[i][j].rgbtBlue = aver;
      28.         }
      29.     }
      30. }
      31.  
      32. // Преобразование изображения в сепию
      33. void sepia(int height, int width, RGBTRIPLE img[height][width])
      34. {
      35.     // Перебирать каждую строку изображения
      36.     for (int i = 0; i &lt; height; i++)
      37.     {
      38.         // Перебирать каждый столбец изображения
      39.         for (int j = 0; j &lt; width; j++)
      40.         {
      41.             // Получить значения RGB
      42.             int red = img[i][j].rgbtRed;
      43.             int green = img[i][j].rgbtGreen;
      44.             int blue = img[i][j].rgbtBlue;
      45.  
      46.             // Получение значений сепии на основе формулы сепии
      47.             // Округлить значение до ближайшего целого числа
      48.             int sepiaRed = round(0.393 * red + 0.769 * green + 0.189 * blue);
      49.             int sepiaGreen = round(0.349 * red + 0.686 * green + 0.168 * blue);
      50.             int sepiaBlue = round(0.272 * red + 0.534 * green + 0.131 * blue);
      51.  
      52.             // Максимальное значение 255 с использованием fmin ()
      53.             // Установите для каждого значения RGB их значения сепии
      54.             img[i][j].rgbtRed = fmin(255, sepiaRed);
      55.             img[i][j].rgbtGreen = fmin(255, sepiaGreen);
      56.             img[i][j].rgbtBlue = fmin(255, sepiaBlue);
      57.         }
      58.     }
      59.  
      60. }
      61.  
      62. // Отразить изображение по горизонтали
      63. void reflect(int height, int width, RGBTRIPLE img[height][width])
      64. {
      65.     //Временное хранилище
      66.     RGBTRIPLE temp;
      67.  
      68.     // Перебирать каждую строку изображения
      69.     for (int i = 0; i &lt; height; i++)
      70.     {
      71.         // Итерировать по каждому столбцу, который меньше ширины / 2
      72.         for (int j = 0; j &lt; width / 2; j++)
      73.         {
      74.             // Поменять местами пиксели на противоположных по горизонтали сторонах
      75.             temp = img[i][j];
      76.             img[i][j] = img[i][width - j - 1];
      77.             img[i][width - j - 1] = temp;
      78.         }
      79.     }
      80. }
      81.  
      82. //Размытие изображения
      83. void blur(int height, int width, RGBTRIPLE img[height][width])
      84. {
      85.     // Временное хранилище
      86.     RGBTRIPLE temp[height][width];
      87.  
      88.     // Копирование изображения, чтобы сохранить неизменную версию для повторения цикла
      89.     memcpy(temp, img, sizeof(RGBTRIPLE) * height * width);
      90.  
      91.     // Перебирать каждую строку изображения
      92.     for (int i = 0; i &lt; height; i++)
      93.     {
      94.         // Перебирать каждый столбец изображения
      95.         for (int j = 0; j &lt; width; j++)
      96.         {
      97.             // Запуск среднего счетчика на 0.0
      98.             // Нужно избегать проблемы с усеченным целым числом
      99.             float aver = 0.0;
      100.             // Инициировать значения RGB на 0
      101.             int red = 0;
      102.             int green = 0;
      103.             int blue = 0;
      104.  
      105.             // Перебирать строки вокруг текущей строки
      106.             for (int k = -1; k &lt;= 1; k++)
      107.             {
      108.                 // Итерировать по столбцам вокруг текущего столбца
      109.                 for (int l = -1; l &lt;= 1; l++)
      110.                 {
      111.                     // Если текущая строка + следующая строка находятся в пределах границ
      112.                     // Если текущий столбец + следующий столбец находятся в пределах границ
      113.                     if (i + k != height &amp;&amp;
      114.                         i + k != -1 &amp;&amp;
      115.                         j + l != width &amp;&amp;
      116.                         j + l != -1)
      117.                     {
      118.                         // Обновить значения RGB до суммы значений RGB обоих пикселей
      119.                         red += temp[i + k][j + l].rgbtRed;
      120.                         green += temp[i + k][j + l].rgbtGreen;
      121.                         blue += temp[i + k][j + l].rgbtBlue;
      122.                         // Увеличить среднее значение на единицу на один пиксель в сумме
      123.                         aver++;
      124.                     }
      125.                 }
      126.             }
      127.             // Установите для каждого значения RGB их размытые значения
      128.             img[i][j].rgbtRed = round(red / aver);
      129.             img[i][j].rgbtGreen = round(green / aver);
      130.             img[i][j].rgbtBlue = round(blue / aver);
      131.         }
      132.     }
      133. }
    • recover.c
      1. #include <stdio.h>
      2. #include <stdlib.h>
      3. #include <stdint.h>
      4. #include <stdbool.h>
      5.  
      6.  
      7. typedef uint8_t BYTE;
      8. BYTE bytes[512];      // буфер для хранения данных чтения карты
      9.  
      10.  
      11. int main(int argc, char *argv[])
      12. {
      13.     if (argc != 2)
      14.     {
      15.         printf("Usage: ./recover image.raw\n");
      16.         return 1;
      17.     }
      18.  
      19.     FILE *card = fopen(argv[1], "r");
      20.  
      21.     if (fopen(argv[1], "r") == NULL)
      22.     {
      23.         printf("Invalid File. Bye.\n");
      24.         return 1;
      25.     }
      26.  
      27.     int jpeg_count = 0;
      28.  
      29. 	//массив, используемый для хранения имени файла jpeg, включая NULL char
      30.     char filename[8];       
      31.     int test_counter = 0;
      32.  
      33.     FILE *jpeg = NULL;
      34.  
      35.     while (test_counter == 0)
      36.     {
      37.         fread(bytes, sizeof(BYTE), 512, card);
      38.  
      39.         if (bytes[0] == 0xff &amp;&amp; bytes[1] == 0xd8 &amp;&amp; bytes[2] == 0xff &amp;&amp; (bytes[3] &amp; 0xf0) == 0xe0)
      40.         {
      41. 			//создает 00i.jpg в массиве filename
      42.             sprintf(filename, "%03i.jpg", jpeg_count);
      43.  
      44. 			//открывает указанный выше файл jpeg
      45.             jpeg = fopen(filename, "a");
      46.  
      47. 			 //записывает в файл jpeg
      48.             fwrite(bytes, sizeof(BYTE), 512, jpeg);  
      49.             jpeg_count++;
      50.  
      51.             while (true)
      52.             {
      53.                 fread(bytes, sizeof(BYTE), 512, card);
      54.  
      55.                 if (bytes[0] == 0xff &amp;&amp; bytes[1] == 0xd8 &amp;&amp; bytes[2] == 0xff &amp;&amp; (bytes[3] &amp; 0xf0) == 0xe0)
      56.                 {
      57.                     fclose(jpeg);
      58.                     sprintf(filename, "%03i.jpg", jpeg_count);
      59.                     jpeg = fopen(filename, "a");
      60.                     jpeg_count++;
      61.                     test_counter++;
      62.                     fwrite(bytes, sizeof(BYTE), 512, jpeg);
      63.                     break;
      64.                 }
      65.                 else
      66.                 {
      67.                     fwrite(bytes, sizeof(BYTE), 512, jpeg);
      68.                 }
      69.             }
      70.         }
      71.     }
      72.  
      73.     while (fread(bytes, sizeof(BYTE), 512, card) != 0)
      74.     {
      75.         if (bytes[0] == 0xff &amp;&amp; bytes[1] == 0xd8 &amp;&amp; bytes[2] == 0xff &amp;&amp; (bytes[3] &amp; 0xf0) == 0xe0)
      76.         {
      77.             fclose(jpeg);
      78.             sprintf(filename, "%03i.jpg", jpeg_count);
      79.             jpeg = fopen(filename, "a");
      80.             jpeg_count++;
      81.         }
      82.  
      83.         fwrite(bytes, sizeof(BYTE), 512, jpeg);
      84.     }
      85.  
      86.     fclose(jpeg);
      87.     return 0;
      88. }
    Четвертая неделя.
  • Пятая неделя: speller.

    • speller
    • dictionary.c
      1. // Implements a dictionary's functionality
      2.  
      3. #include <stdbool.h>
      4. #include <stdio.h>
      5. #include <stdlib.h>
      6. #include <stdint.h>
      7. #include <strings.h>
      8. #include <string.h>
      9. #include <ctype.h>
      10.  
      11. #include "dictionary.h"
      12.  
      13. // Represents a node in a hash table
      14. typedef struct node
      15. {
      16.     // LENGTH = 45 (no word is longer than 45 letters)
      17. 	char word[LENGTH + 1];      
      18.     struct node *next;
      19. }
      20. node;
      21.  
      22. // Number of buckets in hash table
      23. const unsigned int N = 17000;
      24.  
      25. // incremented in load, returned in size
      26. int fsize = 0;   
      27.  
      28. // Hash table
      29. node *table[N];
      30.  
      31. // Возвращает true, если слово есть в словаре, иначе false
      32. bool check(const char *word)
      33. {
      34.     unsigned int hash_code = 0;
      35.  
      36.    // хеширование полученного слова
      37.    hash_code = hash(word);     
      38.  
      39.     // итерация по спискам
      40.     for (node *tmp = table[hash_code]; tmp != NULL; tmp = tmp-&gt;next)
      41.     {
      42.         if (strcasecmp(tmp-&gt;word, word) == 0)
      43.         {
      44.             return true;
      45.         }
      46.     }
      47.     return false;
      48. }
      49.  
      50. // Хеширует слово в число
      51. unsigned int hash(const char *word)
      52. {
      53.     unsigned int hash = 5381;
      54.     int c;
      55.  
      56.     // * str ++ переходит к следующему адресу в памяти, где хранится следующий символ в строке
      57.     while ((c = *word++))        
      58.     {
      59.         if (isupper(c))
      60.         {
      61.             c = c + 32;
      62.         }
      63.  
      64.         hash = ((hash &lt;&lt; 5) + hash) + c; // hash * 33 + c   // hash &lt;&lt; 5 = hash * 2^5
      65.     }
      66.  
      67.     return hash % N;
      68. }
      69.  
      70. // Загружает словарь в память, возвращая true в случае успеха иначе false
      71. bool load(const char *dictionary)
      72. {
      73.     char words[46];
      74.     int hash_code = 0;
      75.  
      76.     FILE *infile = fopen(dictionary, "r");
      77.     if (infile == NULL)
      78.     {
      79.         return false;
      80.     }
      81.  
      82.     while (fscanf(infile, "%s", words) != EOF)
      83.     {
      84.         node *n = malloc(sizeof(node));
      85.         if (n == NULL)
      86.         {
      87.             return false;
      88.         }
      89.  
      90.         strcpy(n-&gt;word, words);
      91.         hash_code = hash(n-&gt;word);
      92.  
      93.         if (table[hash_code] == NULL)
      94.         {
      95.             table[hash_code] = n;
      96.             n-&gt;next = NULL;
      97.         }
      98.         else
      99.         {
      100.             // добавляем новый узел в середину таблицы и первый член
      101. 			n-&gt;
      102. 			next = table[hash_code];     
      103.             table[hash_code] = n;
      104.         }
      105.         fsize++;
      106.     }
      107.     fclose(infile);
      108.     return true;
      109. }
      110.  
      111. // Возвращает количество слов в словаре, если загружено, иначе 0, если еще не загружено
      112. unsigned int size(void)
      113. {
      114.     return fsize;
      115. }
      116.  
      117. // Выгружает словарь из памяти, возвращая true в случае успеха иначе false
      118. bool unload(void)
      119. {
      120.     for (int i = 0; i &lt; N; i++)
      121.     {
      122.         node *tmp = NULL;
      123.         node *cursor = NULL;
      124.  
      125.         cursor = table[i];
      126.  
      127.         while(cursor != NULL)
      128.         {
      129.             tmp = cursor;
      130.             cursor = cursor-&gt;next;
      131.             free(tmp);
      132.         }
      133.  
      134.     }
      135.     return true;
      136. }
    Пятая неделя.
  • Шестая неделя (Python): hello, mario, cash, credit, readability, DNA.

    • hello
    • mario
    • cash
    • credit
    • readability
    • DNA
    • from cs50 import get_string
       
      h = get_string("What is your name?\n")
      print("Hello,", h)
    • mario-less
      from cs50 import get_int
       
      while True:
          n = get_int("Height: ")
          if n &gt; 0:
              if n &lt; 9:
                  break
       
      j = n - 1
       
      for i in range(n):
          print(" " * j, end="")
          j -= 1
          s = i + 1
          print("#" * s)
      mario-more
      from cs50 import get_int
       
      while True:
          n = get_int("Height: ")
          if n &gt; 0:
              if n &lt; 9:
                  break
       
      j = n - 1
       
      for i in range(n):
          print(" " * j, end="")
          j -= 1
          s = i + 1
          print("#" * s, end="")
          print("  ", end="")
          print("#" * s)
    • cash.py
      from cs50 import get_float
       
      while True:
          d = get_float("Change: ")
          if d &gt; 0:
              break
      c = round(d * 100)
       
      t = c - c % 25
      f = t / 25
       
      c = c - f * 25
       
      e = c - c % 10
      n = e / 10
       
      c = c - n * 10
       
      v = c - c % 5
      r = v / 5
       
      c = c - r * 5
       
      o = c - c % 1
      u = o / 1
       
      c = c - u * 1
       
      q = round(r + u + n + f)
       
      print(f"{q}")
    • credit.py
      from cs50 import get_int
      from math import floor
       
      def main():
          digit1 = 0
          digit2 = 0
          num_digits = 0
          sum_of_double_odds = 0
          sum_of_evens = 0
          cc_number = get_int("Number: ")
       
          while cc_number &gt; 0:
              digit2 = digit1
              digit1 = cc_number % 10
       
              if num_digits % 2 == 0:
                  sum_of_evens += digit1
              else:
                  multiple = 2 * digit1
                  sum_of_double_odds += (multiple // 10) + (multiple % 10)
       
              cc_number //= 10
              num_digits += 1
       
          is_valid = (sum_of_evens + sum_of_double_odds) % 10 == 0
          first_two_digits = (digit1 * 10) + digit2
       
          if digit1 == 4 and num_digits &gt;= 13 and num_digits &lt;= 16 and is_valid:
              print("VISA\n")
          elif first_two_digits &gt;= 51 and first_two_digits &lt;= 55 and num_digits == 16 and is_valid:
              print("MASTERCARD\n")
          elif (first_two_digits == 34 or first_two_digits == 37) and num_digits == 15 and is_valid:
              print("AMEX\n")
          else:
              print("INVALID\n")
       
      if __name__ == "__main__":
          main()
    • readability.py
      from cs50 import get_string
       
      font = 0
      word = 1
      sentence = 0
       
      txt = get_string("Text to be analysed: ")
      n = len(txt)
      for i in range(n):
          if txt[i].isalpha():
              font += 1
          elif txt[i].isspace():
              word += 1
          elif txt[i] == '.' or txt[i] == '?' or txt[i] == '!':
              sentence += 1
       
      L = ((font * 100.00) / word)
      S = ((sentence * 100.00) / word)
       
      answ = 0.0588 * L - 0.296 * S - 15.8
       
      answ = round(answ)
      final = answ
       
      if answ &lt; 1:
          print("Before Grade 1")
      elif answ &gt;= 16:
          print("Grade 16+")
      elif answ &gt;= 1:
          print("Grade", answ)
    • dna.py
      1. from sys import argv, exit
      2. import csv
      3.  
      4. if len(argv) != 3:
      5.     print("Usage: database.csv DNAsequence.txt")
      6.     exit(1)
      7. DB = open(argv[1], "r") #закрываем и открываем файл (???)            
      8. DNA = open(argv[2], "r")            
      9.  
      10. data = csv.reader(DB)
      11. DNAseq = csv.reader(DNA)
      12.  
      13. pole = []
      14. STRdict = {}
      15. DNAsequence = []
      16. USER = []
      17.  
      18. i = 0
      19. for row in data:                          
      20.     if i == 0:
      21.         pole = row.copy()
      22.     else:
      23.         STRdict[row[0]] = row.copy()
      24.         STRdict[row[0]].pop(0)
      25.     i = 1
      26.  
      27. for row in DNAseq:               #закрываем и открываем файл (???)              
      28.     DNAsequence = row.copy()
      29.     DNAseq = DNAsequence[0]
      30.     DNAsequence.clear()
      31.  
      32. for j in range(1, len(pole)):
      33.     rps = pole[j]
      34.     MAXrps = 0
      35.     while DNAseq.count(rps) &gt; 0:
      36.         MAXrps += 1
      37.         rps += pole[j]
      38.     USER.append(str(MAXrps))
      39.  
      40. for items in STRdict:
      41.     if STRdict[items] == USER:
      42.         print(items)
      43.         exit(0)
      44.  
      45. print("No match")
      46. DB.close()
      47. DNA.close()
    Шестая неделя Python.
  • Седьмая неделя: movies, houses.

    • movies
    • houses
    • 1.sql
      SELECT title FROM movies WHERE YEAR = 2008;
      2.sql
      SELECT birth FROM people WHERE name = "Emma Stone";
      3.sql
      SELECT title FROM movies WHERE YEAR &gt; 2017 ORDER BY title;
      4.sql
      SELECT COUNT(title) FROM movies
      JOIN ratings
      ON movies.id = ratings.movie_id
      WHERE rating = 10;
      5.sql
      SELECT title, YEAR FROM movies WHERE title LIKE "Harry Potter%" ORDER BY YEAR;
      6.sql
      SELECT AVG(rating) FROM ratings WHERE movie_id IN (SELECT id FROM movies WHERE YEAR = 2012);
      7.sql
      SELECT title, rating FROM movies
      JOIN ratings
      ON movies.id = ratings.movie_id
      WHERE YEAR = 2010
      ORDER BY rating DESC, title;
      8.sql
      SELECT name FROM people
      JOIN stars ON people.id = stars .person_id
      JOIN movies ON stars.movie_id = movies.id
      WHERE title = "Toy Story";
      9.sql
      SELECT name FROM people WHERE id IN (
      SELECT person_id FROM stars WHERE movie_id IN (
      SELECT id FROM movies WHERE YEAR = 2004))
      ORDER BY birth;
      10.sql
      SELECT DISTINCT name FROM people
      JOIN directors ON people.id = directors.person_id
      JOIN movies ON directors.movie_id = movies.id
      JOIN ratings ON movies.id = ratings.movie_id
      WHERE rating &gt; 8.9;
      11.sql
      SELECT title FROM movies
      JOIN ratings ON movies.id = ratings.movie_id
      JOIN stars ON ratings.movie_id = stars.movie_id
      JOIN people ON stars.person_id = people.id
      WHERE name = "Chadwick Boseman"
      LIMIT 5;
      12.sql
      SELECT title FROM movies WHERE id IN (
      SELECT movie_id FROM stars WHERE person_id IN (SELECT id FROM people WHERE people.name = "Johnny Depp")
      INTERSECT
      SELECT movie_id FROM stars WHERE person_id IN (SELECT id FROM people WHERE people.name = "Helena Bonham Carter"));
      13.sql
      SELECT name FROM people WHERE id IN (
      SELECT person_id FROM stars WHERE movie_id IN (
      SELECT movie_id FROM stars WHERE person_id IN (
      SELECT id FROM people WHERE name = "Kevin Bacon" AND birth = 1958)))
      AND NOT people.name ="Kevin Bacon" GROUP BY people.name;
    • import.py
      from cs50 import SQL
      from sys import argv, exit
      import csv
       
      db = SQL("sqlite:///students.db")
       
      if len(argv) != 2:
          print("Usage: python import.py students.db")
          exit(1)
       
      file = open(argv[1], "r")
       
      data = csv.reader(file)
       
      for row in data:
       
          if row[0] == "name":
              continue
       
          name = ""
          name = ' '.join(row)
          splname = name.split()
          n = len(splname)
       
          if n == 5:
              db.execute("INSERT INTO students(first, middle, last, house, birth) VALUES (?, ?, ?, ?, ?)", splname[0], splname[1], splname[2], splname[3], splname[4])
       
          elif n == 4:
              db.execute("INSERT INTO students(first, middle, last, house, birth) VALUES (?, NULL, ?, ?, ?)", splname[0], splname[1], splname[2], splname[3])
       
      exit(0)
      roster.py
      from cs50 import SQL
      from sys import argv
       
      if len(argv) != 2:
          print("Usage: python roster.py House")
          exit(1)
       
      db = SQL("sqlite:///students.db")
       
      output_dict = {}
      output_dict = db.execute("SELECT first, middle, last, birth FROM students WHERE house = ? ORDER BY last, first;", argv[1])
       
      for row in output_dict:
          n = row["middle"]
          if n != None:
              print(f"{row['first']} {row['middle']} {row['last']}, born {row['birth']}")
          else:
              print(f"{row['first']} {row['last']}, born {row['birth']}")
       
      exit(0)
  • Восьмая неделя: WEB-finance.

    Прежде чем приступить к этому назначению, нам необходимо зарегистрироваться для получения ключа API, чтобы иметь возможность запрашивать данные IEX. Для этого выполните следующие действия:

    • Посетите iexcloud.io/cloud-login#/register/.
    • Введите свой адрес электронной почты и пароль и нажмите «Создать учетную запись».
    • На следующей странице прокрутите вниз, чтобы выбрать план Start (бесплатный).
    • После подтверждения учетной записи с помощью электронного письма с подтверждением войдите в iexcloud.io .
    • Щелкните Токены API .
    • Скопируйте ключ, который отображается в столбце Token (он должен начинаться с pk_).
    • В окне терминала в среде CS50 IDE выполните:
      $ export API_KEY=value
      где value это (вставленное) значение без пробелов непосредственно перед или после =. Вы также можете вставить это значение в текстовый документ на случай, если оно понадобится вам позже.
    • application.py
    • register
    • quote
    • buy
    • index
    • sell
    • history
    • quote2
    • application.py
      import os
       
      from cs50 import SQL
      from flask import Flask, flash, jsonify, redirect, render_template, request, session
      from flask_session import Session
      from tempfile import mkdtemp
      from werkzeug.exceptions import default_exceptions, HTTPException, InternalServerError
      from werkzeug.security import check_password_hash, generate_password_hash
       
      from helpers import apology, login_required, lookup, usd
       
       
      # Configure application
      app = Flask(__name__)
       
      # Ensure templates are auto-reloaded
      app.config["TEMPLATES_AUTO_RELOAD"] = True
       
      # Ensure responses aren't cached
      @app.after_request
      def after_request(response):
          response.headers["Cache-Control"] = "no-cache, no-store, must-revalidate"
          response.headers["Expires"] = 0
          response.headers["Pragma"] = "no-cache"
          return response
       
      # Custom filter
      app.jinja_env.filters["usd"] = usd
       
      # Configure session to use filesystem (instead of signed cookies)
      app.config["SESSION_FILE_DIR"] = mkdtemp()
      app.config["SESSION_PERMANENT"] = False
      app.config["SESSION_TYPE"] = "filesystem"
      Session(app)
       
      # Configure CS50 Library to use SQLite database
      db = SQL("sqlite:///finance.db")
       
      # Make sure API key is set
      if not os.environ.get("API_KEY"):
          raise RuntimeError("API_KEY not set")
       
       
      @app.route("/")
      @login_required
      def index():
          """Show portfolio of stocks"""
       
          username = db.execute("SELECT username FROM users WHERE id = :ids", ids = session["user_id"])
          update = db.execute("SELECT symbol, price FROM dashboard WHERE userid = :ids", ids = session["user_id"])
          rows = db.execute("SELECT COUNT(symbol) FROM dashboard WHERE userid = :ids", ids = session["user_id"])
       
          for i in range(rows[0]['COUNT(symbol)']):
       
              tmp1 = lookup(update[i]["symbol"])
       
              db.execute("UPDATE dashboard SET price = :prices WHERE userid = :ids AND symbol = :s",
                          ids = session["user_id"],
                          s = update[i]["symbol"],
                          prices = usd(tmp1["price"]))
       
       
          tmp = db.execute("SELECT * FROM dashboard WHERE userid = :ids", ids = session["user_id"])
          total = db.execute("SELECT SUM(total) FROM dashboard WHERE userid = :ids", ids = session["user_id"])
          cash = db.execute("SELECT cash FROM users WHERE id = :ids", ids = session["user_id"])
          balance = cash[0]["cash"]
       
          if total[0]['SUM(total)'] != None: #and float(total[0]['SUM(total)']) != 0:
              total = float(total[0]["SUM(total)"]) + balance
              return render_template("index.html", tmp=tmp, total=total, balance=balance, username=username[0]["username"])
          else:
              total = balance
              return render_template("index.html", tmp=tmp, total=balance, balance=balance)
       
       
      @app.route("/buy", methods=["GET", "POST"])
      @login_required
      def buy():
          """Buy shares of stock"""
       
          username = db.execute("SELECT username FROM users WHERE id = :ids", ids = session["user_id"])
       
          if request.method == "POST":
       
              if not request.form.get("symbol"):
                  return apology("must provide symbol.", 403)
       
              elif not request.form.get("shares"):
                  return apology("must provide shares.", 403)
       
              tmp = lookup(request.form.get("symbol"))
       
              if tmp == None:
                  return apology("Incorrect Symbol.")
       
              tmp1 = db.execute("SELECT * FROM dashboard WHERE symbol = :symbol AND userid = :ids", symbol = tmp["symbol"], ids = session["user_id"])
       
              cash = db.execute("SELECT cash FROM users WHERE id = :ids", ids = session["user_id"])
       
              balance = cash[0]["cash"]
       
              total_price = int(request.form.get("shares")) * float(tmp["price"])
       
              if balance < total_price:
                  return apology("Insufficient funds.")
       
              if len(tmp1) != 1:
                  db.execute("INSERT INTO dashboard values(:ids, :symbol, :shares, :price, :total)",
                              ids = session["user_id"],
                              symbol = tmp["symbol"],
                              shares = request.form.get("shares"),
                              price = tmp["price"],
                              total = float(request.form.get("shares")) * float(tmp["price"]))
              else:
                  db.execute("UPDATE dashboard SET shares = shares + :nshares WHERE symbol = :nsymbol AND userid = :ids",
                              ids = session["user_id"],
                              nsymbol = tmp["symbol"],
                              nshares = int(request.form.get("shares")))
       
                  db.execute("UPDATE dashboard SET total = total + :mtotal WHERE symbol = :msymbol AND userid = :idm",
                              idm = session["user_id"],
                              msymbol = tmp["symbol"],
                              mtotal = float(request.form.get("shares")) * float(tmp["price"]))
       
              db.execute("INSERT INTO history(user_id, hsymbol, hshares, hprice) values(:ids, :symbol, :shares, :price)",
                          ids = session["user_id"],
                          symbol = tmp["symbol"],
                          shares = request.form.get("shares"),
                          price = tmp["price"])
       
       
              balance = balance - total_price
       
              db.execute("UPDATE users SET cash = :acc WHERE id = :ids", acc = balance, ids = session["user_id"])
       
              flash("Bought!")
              return redirect("/")
       
       
          else:
              return render_template("buy.html", username=username[0]["username"])
       
       
      @app.route("/history")
      @login_required
      def history():
          """Show history of transactions"""
       
          username = db.execute("SELECT username FROM users WHERE id = :ids", ids = session["user_id"])
          tmp = db.execute("SELECT hsymbol, hshares, hprice, time FROM history JOIN users ON users.id = history.user_id WHERE id = :ids ORDER BY time desc", ids = session["user_id"])
       
          return render_template("history.html", tmp=tmp, username=username[0]["username"])
       
       
      @app.route("/login", methods=["GET", "POST"])
      def login():
          """Log user in"""
       
          # Forget any user_id
          session.clear()
       
          # User reached route via POST (as by submitting a form via POST)
          if request.method == "POST":
       
              # Ensure username was submitted
              if not request.form.get("username"):
                  return apology("must provide username", 403)
       
              # Ensure password was submitted
              elif not request.form.get("password"):
                  return apology("must provide password", 403)
       
              # Query database for username
              rows = db.execute("SELECT * FROM users WHERE username = :username",
                                username=request.form.get("username"))
       
              # Ensure username exists and password is correct
              if len(rows) != 1 or not check_password_hash(rows[0]["hash"], request.form.get("password")):
                  return apology("invalid username and/or password", 403)
       
              # Remember which user has logged in
              session["user_id"] = rows[0]["id"]
       
              # Redirect user to home page
              return redirect("/")
       
          # User reached route via GET (as by clicking a link or via redirect)
          else:
              return render_template("login.html")
       
       
      @app.route("/logout")
      def logout():
          """Log user out"""
       
          # Forget any user_id
          session.clear()
       
          # Redirect user to login form
          return redirect("/")
       
       
      @app.route("/quote", methods=["GET", "POST"])
      @login_required
      def quote():
          """Get stock quote."""
       
          username = db.execute("SELECT username FROM users WHERE id = :ids", ids = session["user_id"])
       
          if request.method == "POST":
       
              if not request.form.get("symbol"):
                  return apology("Please provide a symbol.")
       
              tmp = lookup(request.form.get("symbol"))
       
              if tmp == None:
                  return apology("Incorrect Symbol.")
       
              else:
                  return render_template("quote2.html", tmp=tmp, username=username)
       
          else:
              return render_template("quote.html", username=username[0]["username"])
       
       
      @app.route("/register", methods=["GET", "POST"])
      def register():
       
          if request.method == "POST":
       
              if not request.form.get("username"):
                  return apology("must provide username.", 403)
       
              elif not request.form.get("password"):
                  return apology("must provide password.", 403)
       
              elif not request.form.get("cpassword"):
                  return apology("must confirm password.", 403)
       
              rows=db.execute("SELECT COUNT(*) FROM users WHERE username = :username", username=request.form.get("username"))
       
              if len(rows) != 1:
                  return apology("username is already taken.")
              else:
                  passkey=request.form.get("password")
                  cpasskey=request.form.get("cpassword")
       
                  if passkey==cpasskey:
                      db.execute("INSERT INTO users(username, hash) values(:username, :phash)",
                      username=request.form.get("username"),
                      phash=generate_password_hash(request.form.get("password"), method='pbkdf2:sha256', salt_length=8))
                      return redirect("/")
                  else:
                      return apology("Passwords do not match.")
       
          else:
              return render_template("register.html")
       
      @app.route("/sell", methods=["GET", "POST"])
      @login_required
      def sell():
          """Sell shares of stock"""
       
          username = db.execute("SELECT username FROM users WHERE id = :ids", ids = session["user_id"])
          tmp = db.execute("SELECT symbol FROM dashboard WHERE userid = :ids",
                              ids = session["user_id"])
       
          if request.method == "POST":
       
              if not request.form.get("symbol"):
                  return apology("must provide symbol.", 403)
       
              elif not request.form.get("shares"):
                  return apology("must provide shares.", 403)
       
              symbol = request.form.get("symbol")
              shares = int(request.form.get("shares"))
       
              price = lookup(symbol)
       
              for_shares = db.execute("SELECT shares FROM dashboard WHERE symbol = :nsymbol AND userid = :ids",
                                      nsymbol = symbol,
                                      ids = session["user_id"])
       
              diff = int(for_shares[0]["shares"]) - shares
       
              cash = db.execute("SELECT cash FROM users WHERE id = :ids", ids = session["user_id"])
       
              balance = cash[0]["cash"]
       
              total_price = shares * float(price["price"])
       
              if diff < 0:
                  return apology("insufficient shares.")
       
              elif diff == 0:
                  db.execute("DELETE FROM dashboard WHERE userid = :idr AND symbol = :rsymbol",
                              idr = session["user_id"],
                              rsymbol = symbol)
       
              elif diff > 0:
                  db.execute("UPDATE dashboard SET shares = :mshares WHERE symbol = :msymbol AND userid = :ids",
                              ids = session["user_id"],
                              msymbol = symbol,
                              mshares = diff)
       
       
                  db.execute("UPDATE dashboard SET total = :ntotal WHERE symbol = :nsymbol AND userid = :idn",
                              idn = session["user_id"],
                              nsymbol = symbol,
                              ntotal = diff * int(price["price"]))
       
              db.execute("INSERT INTO history(user_id, hsymbol, hshares, hprice) values(:ids, :symbol, -1 * :shares, :prices)",
                          ids = session["user_id"],
                          symbol = symbol,
                          shares = request.form.get("shares"),
                          prices = price["price"])
       
              balance = balance + shares * float(price["price"])
       
              db.execute("UPDATE users SET cash = :acc WHERE id = :ids", acc = balance, ids = session["user_id"])
       
              flash("Sold!")
              return redirect("/")
       
          else:
              return render_template("sell.html", tmp=tmp, username=username[0]["username"])
       
       
       
      def errorhandler(e):
          """Handle error"""
          if not isinstance(e, HTTPException):
              e = InternalServerError()
          return apology(e.name, e.code)
       
       
      # Listen for errors
      for code in default_exceptions:
          app.errorhandler(code)(errorhandler)
    • tegister.html
      {% extends "layout.html" %}
       
      {% block title %}
          Register
      {% endblock %}
       
      {% block main %}
      <form action="/register" method="post">
          <div class="form-group">
              <input autocomplete="off" autofocus class="form-control" name="username" placeholder="Username" type="text">
          </div>
          <div class="form-group">
              <input class="form-control" name="password" placeholder="Password" type="password">
          </div>
          <div class="form-group">
              <input class="form-control" name="cpassword" placeholder="Confirm Password" type="password">
          </div>
          <button class="btn btn-primary" type="submit">Register</button>
      </form>
      {% endblock %}
    • quote.html
      {% extends "layout.html" %}
       
      {% block title %}
          Quote
      {% endblock %}
       
      {% block main %}
      <form action="/quote" method="post">
          <div class="form-group">
              <input autocomplete="off" autofocus class="form-control" name="symbol" placeholder="Symbol" type="text">
          </div>
          <button class="btn btn-primary" type="submit">Quote</button>
      </form>
      </body>
      {% endblock %}
    • buy.html
      {% extends "layout.html" %}
       
      {% block title %}
          Buy
      {% endblock %}
       
      {% block main %}
      <form action="/buy" method="post">
          <div class="form-group">
              <input autocomplete="off" autofocus class="form-control" name="symbol" placeholder="Symbol" type="text">
          </div>
          <div class="form-group">
              <input autocomplete="off" class="form-control" min="1" name="shares" placeholder="Shares" type="number">
          </div>
          <button class="btn btn-primary" type="submit">Buy</button>
      </form>
      {% endblock %}
    • index.html
      {% extends "layout.html" %}
       
      {% block title %}
          Dashboard
      {% endblock %}
       
      {% block main %}
      <table class="table table-striped">
          <thead class="thead-dark">
          <tr>
            <th scope="col">Symbol</th>
            <th scope="col">Shares</th>
            <th scope="col">Price</th>
            <th scope="col">TOTAL</th>
          </tr>
          </thead>
          <tbody>
          {% for row in tmp %}
              <tr>
                  <td>{{ row["symbol"] }}</td>
                  <td>{{ row["shares"] }}</td>
                  <td>{{ row["price"] }}</td>
                  <td>{{ row["total"] | usd}}</td>
              </tr>
          {% endfor %}
          <tr>
              <td>CASH</td>
              <td></td>
              <td></td>
              <td>{{ balance | usd}}</td>
          </tr>
          <tr>
              <td colspan="3"></td>
              <td><b>{{ total | usd}}</b></td>
          </tr>
          </tbody>
      </table>
      {% endblock %}
    • sell.html
      {% extends "layout.html" %}
       
      {% block title %}
          Sell
      {% endblock %}
       
      {% block main %}
      <form action="/sell" method="post">
          <div class="form-group">
              <select class="form-control" name="symbol">
                  <option disabled selected value="">Symbol</option>
                      {% for row in tmp %}
                          <option>{{ row["symbol"] }}</option>
                      {% endfor %}
              </select>
          </div>
          <div class="form-group">
              <input autocomplete="off" class="form-control" min="1" name="shares" placeholder="Shares" type="number">
          </div>
          <button class="btn btn-primary" type="submit">Sell</button>
      </form>
      {% endblock %}
    • history.html
      {% extends "layout.html" %}
       
      {% block title %}
          History
      {% endblock %}
       
      {% block main %}
      <table class="table">
        <thead class="thead-dark">
          <tr>
            <th scope="col">Symbol</th>
            <th scope="col">Shares</th>
            <th scope="col">Price</th>
            <th scope="col">Time</th>
          </tr>
        </thead>
        <tbody>
          {% for row in tmp %}
          <tr>
              <td>{{ row["hsymbol"] }}</td>
              <td>{{ row["hshares"] }}</td>
              <td>${{ row["hprice"] }}</td>
              <td>{{ row["time"] }}</td>
          </tr>
          {% endfor %}
          </tbody>
      </table>
      {% endblock %}
    • quote2.html
      {% extends "layout.html" %}
       
      {% block title %}
          Quote
      {% endblock %}
       
      {% block main %}
      <p>
          A share of {{ tmp["name"] }} ({{ tmp["symbol"] }}) costs ${{ tmp["price"] }}.
      </p>
      {% endblock %}

Читайте больше по теме:

Просмотры: 343

Популярные записи