Problem z obliczeniem wartości maksymalnej w tablicy

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 ?

4

Zainicjalizuj sobie min i max jako pierwsze elementy tablicy

int min = a[0];
int max = a[0];

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.

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 : )

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;
}
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.

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ć.

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.

0

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

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