Problem z obliczeniem wartości maksymalnej w tablicy

Odpowiedz Nowy wątek
2018-11-06 01:45
0

Witam, męczę się z tym już pół dnia. Może ktoś mi powie dlaczego min wychodzi dobrze a max źle ?

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

int main()
{
    int a[10];
    printf("Podaj 10 cyfr:\n");
    for (int i=0;i<10;i++)
    {
    scanf("%d", &a[i]);
    }
    int p=0;
    int min,max;
    while (p<10)
    {
    p++;

    if (a[p]<min)
    {
    min=a[p];
    }
    if (a[p]>max)
    {
    max=a[p];
    }

    }
    printf("max to %d\n min to %d\n", max,min);
    return 0;
}

Ktoś pomoże ?

edytowany 1x, ostatnio: furious programming, 2018-11-06 03:19
cyfra to nie to samo co liczba. - Patryk27 2018-11-06 07:45

Pozostało 580 znaków

2018-11-06 03:11
4

Zainicjalizuj sobie min i max jako pierwsze elementy tablicy

int min = a[0];
int max = a[0];
Dziękuje, po twojej poradzie działa :) - Pabloo111 2018-11-06 08:51

Pozostało 580 znaków

2018-11-06 03:22
4

Po drugie, poniższy fragment zawiera błąd:

int p=0;
int min,max;

while (p<10)
{
  p++;
  // ..

Komórka tablicy o indeksie 0 nigdy nie jest brana pod uwagę. Przenieś p++ na koniec ciała pętli, a najlepiej to użyj pętli for – przecież wiesz dokładnie ile jest liczb w tablicy.


Pozostało 580 znaków

2018-11-06 08:54
0
furious programming napisał(a):

Po drugie, poniższy fragment zawiera błąd:

int p=0;
int min,max;

while (p<10)
{
  p++;
  // ..

Komórka tablicy o indeksie 0 nigdy nie jest brana pod uwagę. Przenieś p++ na koniec ciała pętli, a najlepiej to użyj pętli for – przecież wiesz dokładnie ile jest liczb w tablicy.

Ok tylko trochę tego nie rozumiem dlaczego nie jest brana skoro w a[0] też zapisuje zmienna. Nie kłócę się z tobą tylko chciałbym zrozumieć to co napisałeś ponieważ jestem początkującym : )

Pozostało 580 znaków

2018-11-06 08:57
0

aa i ktoś by mi mógł wyjaśnić co oznacza apostrof w tym kodzie ?

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

int main()
{
    int n, b=1,wynik ;
    char a;
do
{
  system("cls");
  printf("Podaj liczbe naturalna nie większa niz 10 \n");
  scanf("%d",&n);

  for(n;n>0;n--)
 {
    b*=n;
 }

   printf("Silnia podanej liczby to %d\n",b);
   printf("Czy chcesz zakonczyc program\nTak=t\nNie=n\n");
   scanf("%s",&a);
}while (a!= 't');

   return 0;
}
O jaki apostrof ci chodzi? - MasterBLB 2018-11-06 09:19
Literał znakowy w while na samym końcu. - furious programming 2018-11-06 13:06

Pozostało 580 znaków

2018-11-06 09:46
4

Nie mówimy o tym że nie bierzesz pod uwagę a[0], tylko że sprawdzasz wartość a[10], co jest już za tablicą. W kwestii apostrofu, 't' oznacza pojedynczy znak t (czyli jego kod ascii). Gdybyś ujął to w podwójnych apostrofach, byłby to ciąg znaków zawierających znak t oraz 0.

Pozostało 580 znaków

2018-11-06 09:49
3

Ok tylko trochę tego nie rozumiem dlaczego nie jest brana skoro w a[0] też zapisuje zmienna.

Nie umiesz tablic. No i co z tego, że tam zapisujesz? W pętli "czytającej" nie czytasz z a[0] z powodu, który napisł Ci @furious programming

aa i ktoś by mi mógł wyjaśnić co oznacza apostrof w tym kodzie ?

Nie umiesz stringów. Apostrofem w C/C++ oznacza się pojedyńczy znak.

(edit) Wypunktowałem Ci czego nie umiesz nie dlatego, bo chce być wredny. Chce Ci zwrócić uwagę na konkretne zagadnienia, które musisz sobie powtórzyć.

edytowany 1x, ostatnio: several, 2018-11-06 10:03
Po to pytam żeby się nauczyć :) teraz już będę wiedział ;) - Pabloo111 2018-11-06 15:34

Pozostało 580 znaków

2018-11-06 13:14
1
Pabloo111 napisał(a):

Ok tylko trochę tego nie rozumiem dlaczego nie jest brana skoro w a[0] też zapisuje zmienna.

Tak, tyle że pierwsze odczytanie następuje po inkrementacji licznika p. Wystarczy sobie to prześledzić – inicjalizujesz p wartością 0, wchodzisz do pętli i od razu inkrementujesz p, więc w tym momencie zawiera 1. Następnie odczytujesz wartość komórki numer 1, a więc drugiej.

@enedil słusznie zauważył, że wychodzisz poza zakres tablicy. W ostatniej iteracji pętli p jest równe 9, warunek jej działania zostaje spełniony, następnie zwiększasz p o 1 (wtedy jest równe 10) i odczytujesz wartość komórki. Ta o indeksie 10 nie istnieje, więc wczytujesz śmieci z pamięci.

Swój pierwotny kod możesz poprawić na wiele sposobów, jednak jeśli już chcesz zostać przy inicjalizacji iteratora wartością 0, to musisz przenieść p++ na koniec ciała pętli.

Pabloo111 napisał(a):

aa i ktoś by mi mógł wyjaśnić co oznacza apostrof w tym kodzie ?

Wystarczyło podać linijkę zawierającą apostrof.

Apostrofami i cudzysłowami otacza się literały – tymi pierwszymi znakowe, a drugimi łańcuchowe. Literały to stałe wartości bezpośrednio umieszczane w kodzie, takie jak właśnie znaki, ciągi znaków czy liczby.


Pozostało 580 znaków

2018-11-06 15:35
0

Dziękuję wszystkim za pomoc, już mi się rozjaśnilo. Temat można zamknąć

Zaznacz fajeczkę przy poście z rozwiązaniem problemu – w ten sposób się wątki zakańcza (ale nie zamyka – tego się u nas nie robi). - furious programming 2018-11-06 15:44

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0