zwracanie najwiekszej liczby

0

czesc,
chcialbym zeby kompilator zwracal mi najwieksza liczbe z podanych 10, ale zamiast tego dostaje : https://imgur.com/a/HgkaE

kod:

#include <stdio.h>

int main()

{
    int a[10] , i , t ;
    for ( i=0 ; i<0 ; i++ )
    {
        printf ("enter number %d : ",i+1) ;
        scanf ( " %d" , &a[i]) ;
    }

    t=a[10] ;
    for (i=10 ; i<10 ; i++)
    {
        if(t<a[i])
        {
            t=a[i] ;
        }

        printf(" \n\n%d najwiekszy numer" , t);

    }
}

mam nadzieje, ze dobry dzial ;) jestem w tym wszystkim nowy, takze badzcie wyrozumiali :D

5

Serio?

  1. for ( i=0 ; i<0 ; i++ ) - pusta pętla
  2. t=a[10] ; - UB, tablica a ma 10 elementów, a[0]...a[9]
  3. for (i=10 ; i<10 ; i++) - kolejna pusta pętla
0

dzieki, wlasnie odszedlem na chwile i zauwazylem to for ( i=0 ; i<0 ; i++ ) :D

0

hmm, troche poprawilem i teraz mam inny problem... https://imgur.com/a/wDnpF

#include <stdio.h>

int main()

{
    int a[10] , i , t ;
    for ( i=0 ; i<10 ; i++ )
    {
        printf ("enter number %d : ",i+1) ;
        scanf ( " %d" , &a[i]) ;
    }

    t=a[10] ;
    for (i=0 ; i<10 ; i++)
    {
        if(t<a[i])
        {
            t=a[i] ;
        }

        printf(" \n\n%d najwiekszy numer" , t);

    }
}

czemu zwraca mi to jedno po drugim i skad to 64?

3
  1. patrz punkt drugi poprzedniego postu
  2. printf(" \n\n%d najwiekszy numer" , t); masz w pętli, więc "zwraca Ci to jedno po drugim"
0

wszystko juz dziala, ale z jakiegos powodu jesli wszystkie liczby podam mniejsze od 64, to zawsze ona jest podana jako najwieksza.. skad ta liczba sie bierze?

5

cytuję
2) t=a[10] ; - UB, tablica a ma 10 elementów, a[0]...a[9]

jeżeli tworzysz tablicę tak:
a[10]
to ta tablica ma 10 elementów, które wskazujesz tak:
a[0], a[1], .... aż do a[9]
a[10] byłoby 11-stym elementem tej tablicy (ale takiego elementu nie "stworzyłeś") więc są tam jakieś smiecie z pamięci które znajdują się za twoją tablicą (akurat trafiło się tak, że jest tam to 64)

0

zrobilem w ten sposob :
#include <stdio.h>

int main()

{
int a[10] , i , t ;
for ( i=0 ; i<10 ; i++ )
{
printf ("enter number %d : ",i+1) ;
scanf ( " %d" , &a[i]) ;
}

t=a[9] ;
for (i=0 ; i<10 ; i++)
{
    if(t<a[i])
    {
        t=a[i] ;
    }


}
if (i=9)
    printf ("\n %d najwieksza liczba ", t ) ;

}

, ale teraz probowalem zrobic funkcje zliczajaca powtarzajace sie cyfry i juz ten sposob z "if (i=9)" na koncu przestal dzialac :D co tutaj dodac, zebym nie mial tego zliczania krok po kroku, ale juz "wynik koncowy" ?

#include <stdio.h>

int main()
{
int a[10] , i ,k ,z=0 ;
for (i=0 ; i<10 ; i++)
{
printf ("podaj liczbe %d :" , i+1 ) ;
scanf ("%d" ,&a[i] ) ;
}
printf ("cyfra do zliczania " ) ;
scanf ("%d",&k );
for ( i=0 ; i<10 ; i++)
{
if (a[i]==k)
{
{
z++ ;
}

printf ("%d wystepuje %d razy" , k , z ) ;

}
}
}

2
if (i=9)

To jest przypisanie 9 do zmiennej i - nie porównanie. Ten "warunek" zawsze będzie prawdziwy.
Nie rozumiem również czemu miałby służyć ten if gdyż wiadomo że po zakończeniu pętli i == 10.

Co do zliczania występowań widzę nadmiar klamer i printf w środku pętli.
Wystarczy że wyrzucisz printf poza pętlę tak:

for (i = 0; i < 10; i++)
{
	if (a[i] == k)
	{
		z++;
	}
}
printf("%d wystepuje %d razy", k, z);
0
#include <stdio.h>

int main()
{
int a[10] , i ,k ,z=0 ;
for (i=0 ; i<10 ; i++)
{
printf ("podaj liczbe %d :" , i+1 ) ;
scanf ("%d" ,&a[i] ) ;
}
printf ("cyfra do zliczania " ) ;
scanf ("%d",&k );
for ( i=0 ; i<10 ; i++)
{
    if (a[i]==k)
        {
        z++ ;
}



if (i==9)   {
printf ("%d wystepuje %d razy" , k , z ) ;  }

}
}
}

czy teraz jest wszystko dobrze?

moglbym dostac jakies wskazowki w jaki sposob trzeba sie zabrac za pisanie funkcji, ktora usuwalalby powtarzajace sie cyfry w danej liczbie?
np:
11223 -> 12
4455-> 45
itd

doszedlem do tego, ze trzeba tutaj zrobic 2 tabele, ale nie wiem w jaki sposob po zliczeniu cyfr odpowienio je uporzadkowac...
zeby np nie wyszlo : 11443 -> 41

3

W powyższym kodzie nadal masz printf w pętli, tylko że sprawdzasz czy jest to ostatnia iteracja (i == 9). Wyżej napisałem już jak to ma wyglądać.

Do usuwania powtarzających się cyfr nie potrzebujesz żadnych tablic. Wystarczy coś takiego:

int remove_digits(int number)
{
	int previous = number % 10; // Ostatnia cyfra z liczby
	int power = 10; // Obecny mnożnik
	int final_number = previous; // Tutaj liczba która zostanie zwrócona

	while(number) // Dopóki number > 0
	{
		number /= 10; // Podziel przez 10 (112233 -> 11223)

		int rest = number % 10; // Reszta z dzielenia przez 10 daje nam ostatnią cyfrę
		if (rest != previous) // Jeżeli jest inna niż poprzednia
		{
			previous = rest; // Zmień poprzednią
			
			final_number = final_number + (rest * power); // "Wrzuć" cyfrę w odpowiednie miejsce
			power *= 10; // Zaktualizuj mnożnik
		}
	}
	return final_number;
}

Tylko że wyżej napisałeś że z 112233 zrobi się 12, u mnie wynikiem będzie 123, tak jak z resztą to opisałeś - powtarzające cyfry zostaną usunięte.

0

A wie ktoś, jak zwrócić sam indeks tej liczby w C? Czyli np. przy 8,5,13 max zwraca 3 a min 2?

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