1

(1 відповідей, залишених у C++)

привіт. у мене є завдання "Пошук заданих елементів у масиві (послідовний пошук, метод Фібоначчі). Масив не менше 1000 елементів - генерується випадковим чином." що потрібно поправити, аби метод Фібоначчі працював? бо він взагалі не шукає заданий елемент. при цьому, послідовний пошук працює добре.
в компіляторі або виводиться повідомлення "Елемент не знайдено за методом Фібоначчі", або нічого - зависає і не закінчує програму. можливо проблема у виділенні пам'яті?

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <locale.h>

int search(int *arr, int size, int k);
int fibonacci(int *arr, int size, int k);
void generate(int *arr, int size);
void writeToFile(int *arr, int size);
int *readFromFile(int size);
//int partition(int *arr, int low, int high);
//void quickSort(int *arr, int low, int high);

int main() 
{
 setlocale (LC_ALL, "UKR");
 system ("chcp 1251");
 
 int size;
 printf("Введіть розмір масиву: ");
 scanf("%d", &size);

    if (size < 1000) 
    {
        printf("Розмір масиву повинен бути більше 1000. Програма завершується.\n");
        return 0;
    }
 
 int *arr = (int *)malloc(size * sizeof(int));
 if (arr == NULL) 
    {
        printf("Помилка виділення пам'яті.\n");
        return 0;
    }
 generate(arr, size); 
 writeToFile(arr, size);
 printf("Масив записано у файл.\n");
 
 arr = readFromFile(size);
    if (arr == NULL) 
    {
        printf("Програма не виконана.\n");
        return 0;
    }
//    quickSort(arr, 0, size-1);
    printf("Програма працює успішно.\n");
 
 
 int k;
 printf("Введіть значення, яке потрібно знайти: ");
 scanf("%d", &k);

// Пошук за допомогою послідовного пошуку
 int sIndex = search(arr, size, k);
 if (sIndex != -1) 
    {
        printf("Елемент знайдено за послідовним пошуком під порядковим номером: %d\n", sIndex);
    } 
 else 
    {
        printf("Елемент не знайдено за послідовним пошуком.\n");
    }
    
// Пошук за допомогою методу Фібоначчі
 int fIndex = fibonacci(arr, size, k);
 if (fIndex != -1) 
    {
        printf("Елемент знайдено за методом Фібоначчі під порядковим номером: %d\n", fIndex);
    } 
 else 
    {
        printf("Елемент не знайдено за методом Фібоначчі.\n");
    }

 free(arr);

 return 0;
}


int search(int *arr, int size, int k) 
{
    int i;
    for (i=0; i<size; i++) 
    {
        if (arr[i] == k) 
        {
            return i;
        }
    }
    return -1;  
}

int fibonacci(int *arr, int size, int k) 
{
    if (arr == NULL || size == 0) 
    {
        return -1;
    }
    
    if (k < arr[0] || k > arr[size - 1]) 
    {
        return -1;
    }
    
    
    int fib2 = 0; // попереднє число Фiбoначчi
    int fib1 = 1; // поточне число Фiбoначчi
    int temp; 

    while (fib1 < size-1) 
    {
        temp = fib1;
        fib1 = fib1 + fib2;
        fib2 = temp;
    }
    
    int left_index = 0; 
    int mid_index = fib1 - 2;
    while (fib1 > 1) 
    {
        if (mid_index >= size-1) 
        {
            mid_index = size - 1;
        }
        switch (k - arr[mid_index]) 
        {
            case 0:
                return mid_index;
                
            case -1:
                mid_index = mid_index - (fib1 - fib2 - 1);
                temp = fib1;
                fib1 = fib1 - fib2;
                fib2 = temp - fib1;
                break;
                
            case 1:
              
                left_index = mid_index + 1;
                temp = fib1;
                fib1 = fib2;
                fib2 = temp - fib1;
                break;
        }
    }
        if (fib1 == 1 && arr[left_index] == k) 
            return left_index;
            
        return -1;
}

void generate(int *arr, int size) 
{
    int i;
    srand(time(NULL));
    
    for (i=0; i<size; i++) 
    {
        arr[i] = rand() % size + 1;
    }
}

void writeToFile(int *arr, int size) 
{
    FILE *file = fopen("array.txt", "w");
    if (file == NULL) 
    {
        printf("Помилка відкриття файлу для запису.\n");
        return;
    }

    int i;
    for (i=0; i<size; i++) 
    {
        fprintf(file, "%d\n", arr[i]);
    }
    fclose(file);
}

int *readFromFile(int size) 
{
    FILE *file = fopen("array.txt", "r");
    if (file == NULL) 
    {
        printf("Помилка відкриття файлу для читання.\n");
        return NULL;
    }

    int *arr = (int *)malloc(size * sizeof(int));
    if (arr == NULL) 
    {
        printf("Помилка виділення пам'яті.\n");
        fclose(file);
        return NULL;
    }

    int i;
    for (i=0; i<size; i++) 
    {
        if (fscanf(file, "%d", &arr[i]) != 1) 
        {
            printf("Помилка читання з файлу.\n");
            free(arr);
            fclose(file);
            return NULL;
        }
    }
    fclose(file);
    return arr;
}

/*int partition(int *arr, int low, int high) 
{
    int pivot=arr[high];  
    int i = low - 1;
    int j = high + 1;
    int temp;
    
    if (low >= high) 
    {  return high;  }
    
    while (1) 
    {
        do 
        {
            i++;
        } while (arr[i] < pivot);

        do 
        {
            j--;
        } while (arr[j] > pivot);

        if (i >= j)
            return j;

        temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
}

void quickSort(int *arr, int low, int high) 
{
    int stack[high - low + 1]; 
    int top = -1;

    stack[++top] = low;
    stack[++top] = high;

    while (top >= 0) 
    {
        high = stack[top--];
        low = stack[top--];

        int pi = partition(arr, low, high);
        if (pi - 1 > low) 
        {
            stack[++top] = low;
            stack[++top] = pi - 1;
        }
        
        if (pi + 1 < high) 
        {
            stack[++top] = pi + 1;
            stack[++top] = high;
        }
    }
}*/

P.S.: закоментовано дві функції для сортування масиву. пробувала так, але все одно не працювало

Ввожу з клавіатури матрицю розміром 3х4. Програма компілює. Виводить як результат не стовпчик з найбільшою сумою елементів, а просто три цифри в рядочок "-1 -1 -1". Що потрібно виправити?

#include <stdio.h>
#include <stdlib.h>
#define N 3             //N рядки і M стовпці прямокутної матриці
#define M 4
int main (void) 
{
  int A[N][M], mas[N][M], max, S, nomer;
  int i, j;
    for (i=0; i<N; i++)
    { 
        for (j=0; j<M; j++)
         {
           scanf("%d", &A[i][j]);
         }
        printf("\n");
    }   
    
  max=0;
  for (j=0; j<M; j++)
  {  S=0;
     for (i=0; i<N; i++)
     S= S+mas[i][j];
     if (S>max)      { max=S;
                          nomer=j; 
                   }
  }
  for (i=0; i<N; i++)
  printf ("%d \t", mas[nomer][j]);
    
    return 0;
} 

P.S. вибачте, якщо знову неправильно написала завдання, я прочитала правила.

3

(5 відповідей, залишених у C++)

дуже дякую!! виявляється така елементарна помилка. тепер все працює

4

(5 відповідей, залишених у C++)

зрозуміла, що некоректно написала. зараз виправлю.
компілятор показує помилку " 'isalphe' was not declared in this scope ".

int main (void) 
{ 
char str[127], *p, temp[127]=" ";
char* lim=".,;:?!"; 
printf("rechennia: ");
   gets (str);
   
   p=str+strlen(str)-1;
   while ((p>str) && isalphe(*p)) p--;
   *p='\0';
   puts (str);
     
    return 0;
}

5

(2 відповідей, залишених у C)

дякую, я розібралась)

6

(5 відповідей, залишених у C++)

допоможіть виправити помилку у 13 рядку.

#include <stdio.h>
//#include <ctyped>
#include <string.h>

int main (void) 
{ 
char str[127], *p, temp[127]=" ";
char* lim=".,;:?!"; 
printf("rechennia: ");
   gets (str);
   
   p=str+strlen(str)-1;
while ((p>str) && isalphe(*p)) p--;
 *p='\0';
  puts (str);
     
    return 0;
}

7

(2 відповідей, залишених у C)

завдання "Задано два довгих цілих числа. Написати вираз, який буде істинним, якщо остання цифра більшого з цих чисел є рівна 4." я написала початок, але не знаю як продовжити. потрібно використати if else?

int main (void)
{
    long numb1, numb2, n, i;
    printf ("numb1=");
    scanf ("%ld", &numb1);
    printf ("\n numb2=");
    scanf ("%ld", &numb2);

    i=0;

    return 0;
}