2014-12-31 2 views
-1

У меня нет большого опыта работы C или знаний, и я застрял с какими-либо проблемами в выполнении домашних заданий,C программирование - массив/значение указателя comparisson

Я пытаюсь создать программу, чтобы найти минимальные и максимальную из массив с использованием (3/2)*n сравнений, я прошел через много Q & A здесь, и это помогло много, теперь все с ним в порядке, чем странная проблема, которую я не могу решить.

Когда я пытаюсь сравнитьif(a[0]>a[1]) or if(*(a)>*(a+1)) все в порядке, , когда я пытаюсь использовать еще после этих фраз или попытаться if(a[1]>a[0]) или if(*(a+1)>*(a)) то программа умирает.

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

void maximum(int *a, int n, int *max, int *min); 

    int main() 
    { 
     int i; 
     int number; 
     int *max; 
     int *min; 
     int *a; 
     puts("hello, pls enter the number of numbers"); 
     scanf("%d",&number); 
     a = (int*)calloc(number,sizeof(int)); 
     puts("enter the numbers"); 
     for(i=0;i<number;i++) 
     { 
      printf("%d",i); 
      puts("before"); 
      scanf("%d",&a[i]); 
      puts("after"); 
     } 

     puts("ok"); 
     maximum(a,number,max,min); 
     printf("min is %d, max is %d",*min,*max); 
     return(0); 


    } 

    void maximum(int *a, int n, int *max, int *min) 
    { 
     int i; 
     int temp; 
     int tempmax; 
     int tempmin; 

     if(n==0) 
      { 
       puts("come on, be serius"); 
       return(0); 
      } 
     if(n==1) 
      { 
       puts("the number you entered is the min and the max but where is the challenge?"); 
       *min=*max=a[0]; 
      } 
     puts("check3"); 

     **if(*(a+1)>*(a)) 
     { 
      *max=a[1]; 
      *min=a[0]; 
     }** 



     /*if(a[0]>a[1]) 
     { 
      *max=a[0]; 
      *min=a[1]; 
     }else 
     { 
      *max=a[1]; 
      *min=a[0]; 
     } 

     for(i==2;i<(n-2);i=i+2) 
     { 
      if(a[i]>a[i+1]) 
      { 
       tempmax=a[i]; 
       tempmin=a[i+1]; 
      }else 
      { 
       tempmin=a[i]; 
       tempmax=a[i+1]; 
      } 
      if(tempmax>*max) 
       *max=tempmax; 
      if(tempmin<*min) 
       *min=tempmin; 
     } 
    puts("check5"); 
     if((n%2)==1) 
     { 
      if(a[n-1]<*min) 
       *min=a[n-1]; 
      if(a[n-1]>*max) 
       *max=a[n-1]; 
     }/*else 
     { 
      if(a[i]>a[i+1]) 
      { 
       tempmax=a[i]; 
       tempmin=a[i+1]; 
      }else 
      { 
       tempmin=a[i]; 
       tempmax=a[i+1]; 
      } 
      if(tempmax>*max) 
       *max=tempmax; 
      if(tempmin<*min) 
       *min=tempmin; 
     } 
     */ 


    } 
+2

Не могу понять ваш код. Что прокомментировано, а что нет? – tapananand

+1

Кроме того, переменные 'min' и' max' в 'main' фактически не указывают точку. Вы должны объявить их как 'int' вместо' int * 'и называть' maximum (a, number, & max, & min) ', а не разыменовывать их в следующем' printf'. – pat

+0

Обратите внимание, что приведение '(int *)' не требуется в 'a = (int *) calloc (number, sizeof (int));'. Любопытно: почему это было закодировано именно так? – chux

ответ

0

В цикле for вы использовали == вместо = и i ранее не был инициализирован. Поэтому у меня есть значение мусора, вызывающее ошибку seg.

+0

спасибо человеку, это было частью проблемы, вы были правы – thebeancounter

1

В коде [видимо, комментировал], внутри void maximum() функции, int i не инициализируется, а затем, по ошибке, вместо инициализации =, вы comapring == и используя значение i. Сценарий чтения до записи. С неинициализированным i, a[i] может очень хорошо производить неопределенное поведение.

for(i==2;i<(n-2);i=i+2) 

должен быть

for(i=2;i<(n-2);i=i+2) 
    ^
    | 

В той же функции, вы использовали int *max и int *min, разыменования их без какой-либо проверки NULL. С main() вы поставляете неинициализированные указатели. Это также неопределенное поведение и, безусловно, может привести к ошибке сегментации.

Кроме того, вы никогда не проверяли успех scanf().

Тогда, никогда не используйте return(0);, функцией которого является тип возврата void. (спасибо @pat за комментарий ниже).

Далее, пожалуйста, do not cast Возвращаемое значение malloc()/calloc().

+0

Или 'return (0)' из 'void'. – pat

+0

@pat Право. Обновлено. –

+0

эй, спасибо. что вы подразумеваете под «Тогда никогда не возвращайте пользователя (0) ;, как упоминается @pat в комментарии ниже, из функции, из которой тип возврата является недействительным». – thebeancounter

1

Проверьте код ниже:

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

void maximum(int *a, int n, int *max, int *min); 

    int main() 
    { 
     int i; 
     int number; 
     int max; 
     int min; 
     int *a; 

     scanf("%d",&number); 
     a = malloc(sizeof(int) * number); 

     for(i=0;i<number;i++) 
     { 
      scanf("%d",&a[i]); 
     } 


     maximum(a,number,&max,&min); 
     printf("min is %d, max is %d",min,max); 
     return(0); 


    } 

    void maximum(int *a, int n, int *max, int *min) 
{ 
    int i,ma=a[0],mi = a[0],t1,t2; 
    for(i=n%2;i<(n-1);i= i+2) 
    { 
      if(a[i] > a[i+1]) 
      { 
       t1 = a[i]; 
       t2 = a[i+1]; 
      } 
      else 
      { 
       t1 = a[i+1]; 
       t2 = a[i]; 
      } 

      if(t1 > ma) 
      ma = t1; 

      if(t2<mi) 
      mi = t2; 
    } 
    *max = ma; 
    *min = mi; 
} 
+0

Это решение использует сравнение «2n», в отличие от «3n/2», которое сравнивает OP. – pat

+0

@pat Cool исправит его – Gopi

+0

Вы можете найти 'a = malloc (number * sizeof * a);' даже лучший стиль при вызове 'malloc()' и друзей. IMO, легче кодировать и поддерживать и менее подвержены ошибкам. – chux

0

Ваша программа умирает, потому что вы не определяете * макс и * мин значения, когда ваш Comparation терпит неудачу. Вам нужно добавить что-то вроде:

else 
{ 
     *min=a[1]; 
     *mmax=a[0]; 
} 

Это не будет решать свою домашнюю работу полностью. Если вы хотите найти максимум или минимум из массива, вы должны выполнить некоторое сравнение внутри цикла.

0

спасибо за помощь. это были проблемы с программой, и для (3n/2) части, решение было взять каждую пару чисел и найти локальный минимум и максимум, как следующее:

if(a>b) 
    { 
    max = a; 
    min = b; 
    } else 
    { 
    max=b; 
    min=a; 
    } 

, а затем сравнить каждый макс со следующим максимальным и минимальным значениями до минус как в

if(max1>max2) 
    totalmax=max1; 
    else 
    totalmax=max2; 
Смежные вопросы