Не удается реализовать пузырчатую сортировку и линейный поиск - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Добрый день всем, я для саморазвития решил изучить основы Си, сам я очень далек от программирования. Сейчас прохожу небольшой курс, выполняю практическую работу, но столкнулся с проблемой которую у меня не выходит решить. Изначально мне даны четыре программы:
generate.c
/**
 * generate.c
 *
 * Computer Science 50
 * Problem Set 3
 *
 * Generates pseudorandom numbers in [0,LIMIT), one per line.
 *
 * Usage: generate n [s]
 *
 * where n is number of pseudorandom numbers to print
 * and s is an optional seed
 */
 
#define _XOPEN_SOURCE
 
#include <cs50.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
// constant
#define LIMIT 65536
 
int main(int argc, string argv[])
{
    // TODO: comment me
    if (argc != 2 && argc != 3)
    {
        printf("Usage: generate n [s]\n");
        return 1;
    }
 
    // TODO: comment me
    int n = atoi(argv[1]);
 
    // TODO: comment me
    if (argc == 3)
    {
        srand48((long int) atoi(argv[2]));
    }
    else
    {
        srand48((long int) time(NULL));
    }
 
    // TODO: comment me
    for (int i = 0; i < n; i++)
    {
        printf("%i\n", (int) (drand48() * LIMIT));
    }
 
    // success
    return 0;
}

find.c
/**
 * find.c
 *
 * Computer Science 50
 * Problem Set 3
 *
 * Prompts user for as many as MAX values until EOF is reached, 
 * then proceeds to search that "haystack" of values for given needle.
 *
 * Usage: ./find needle
 *
 * where needle is the value to find in a haystack of values
 */
       
#include <cs50.h>
#include <stdio.h>
#include <stdlib.h>
 
#include "helpers.h"
 
// maximum amount of hay
const int MAX = 65536;
 
int main(int argc, string argv[])
{
    // ensure proper usage
    if (argc != 2)
    {
        printf("Usage: ./find needle\n");
        return -1;
    }
 
    // remember needle
    int needle = atoi(argv[1]);
 
    // fill haystack
    int size;
    int haystack[MAX];
    for (size = 0; size < MAX; size++)
    {
        // wait for hay until EOF
        printf("\nhaystack[%i] = ", size);
        int straw = GetInt();
        
        if (straw == INT_MAX)
        {
            break;
        }
     
        // add hay to stack
        
        haystack[size] = straw;
        
    }
    printf("\n");
 
    // sort the haystack
    sort(haystack, size);
 
    // try to find needle in haystack
    if (search(needle, haystack, size))
    {
        printf("\nFound needle in haystack!\n\n");
        return 0;
    }
    else
    {
        printf("\nDidn't find needle in haystack.\n\n");
        return 1;
    }
}

helpers.c
/**
 * helpers.c
 *
 * Computer Science 50
 * Problem Set 3
 *
 * Helper functions for Problem Set 3.
 */
       
#include <cs50.h>
 
#include "helpers.h"
 
/**
 * Returns true if value is in array of n values, else false.
 */
bool search(int value, int values[], int n)
{
    // TODO: implement a searching algorithm
    return false;
}
 
/**
 * Sorts array of n values.
 */
void sort(int values[], int n)
{
    // TODO: implement an O(n^2) sorting algorithm
    return;
}

helpers.h
/**
 * helpers.h
 *
 * Computer Science 50
 * Problem Set 3
 *
 * Helper functions for Problem Set 3.
 */
 
#include <cs50.h>
 
/**
 * Returns true if value is in array of n values, else false.
 */
bool search(int value, int values[], int n);
 
/**
 * Sorts array of n values.
 */
void sort(int values[], int n);
В программе helpers.c, я должен написать функцию сортировки, и функцию линейного поиска. Это я и попытался сделать, вот так выглядит мой код:
helpers.c
#include <cs50.h>
#include "helpers.h"

bool search(int value, int values[], int n)
{
    for (int i = 0; i < n; i++)
   {
      if (values[n] == value)
      {
       return true;
      }
      return false;
      
   }
}

void sort(int values[], int n)
{
    int temp; 
    int ctr = 0;
    int didswap;
 
    do
    {
        didswap = 0;
        for (int i = 0; i < n; i++)
        {
            if (values[i] > values[i + 1])
            {
                temp = values[i];
                values[i] = values[i + 1];
                values[i + 1] = temp;
                didswap = 1;
            }
        }
        
        ctr = ctr + 1; 
    }
    while (ctr < n && didswap != 0);
    
}
Остальные программы я не видоизменял. При попытке, проверить программу в автоматическим тестировании я вижу такой результат Я не очень понимаю, где ошибся, может быть кто знает?
Еще мне не очень понятно, почему при запуске команды - "./generate 10 50 | ./find 127", я получаю пустой массив. Ведь , как я понимаю должно было сгенерироваться 10 псевдослучайных чисел, и переместиться в программу find, и заполнить массив из haystack[]. а я получаю:

Решение задачи: «Не удается реализовать пузырчатую сортировку и линейный поиск»

textual
Листинг программы
bool search(int value, int values[], int n)
{
    for (int i = 0; i < n; i++)
   {
      if (values[n] == value)
      {
       return true;
      }
    //сразу уходим как первый раз не нашли, может нужно вынести return false; из цикла?
      return false;
      
   }
}

Объяснение кода листинга программы

В данном коде реализована функция поиска значения в массиве.

  1. bool search(int value, int values[], int n) - это объявление функции с тремя параметрами: value - значение, которое мы ищем в массиве, values - сам массив, n - его размер. Функция возвращает true, если значение найдено, и false в противном случае.
  2. for (int i = 0; i < n; i++) - это цикл, который проходит по всем элементам массива. На каждой итерации значение i увеличивается на 1.
  3. if (values[n] == value) - это условие, при котором мы нашли искомое значение. В данном случае мы сравниваем value с элементом массива с индексом n.
  4. return true; - если условие выполнено, то функция возвращает true.
  5. return false; - если мы не нашли искомое значение после прохода по всем элементам массива, то возвращаем false. Таким образом, данный код реализует линейный поиск значения в массиве.

Оцени полезность:

5   голосов , оценка 4.6 из 5
Похожие ответы