Siemka,
Dopiero uczę się programować w języku C# i mam problem z naprawdę prostymi rzeczami. Rozumiem instrukcje warunkowe i pętle, ale nie wiem jak np pokazać liczbę najmniejszą i największą wśród liczb losowanych (randoma umiem) bądź nie; np pokazać liczby co trzecie wśród losowanych bądź nie; wyznaczyć ile elementów jest większych lub mniejszych od średniej(średnią umiem); wypisać na ekranie jakieś liczby w odwrotnej kolejności i znajdą się jeszcze inne problemy tego typu. Nie wiem czy mam się ich nauczyć na pamięć, czy jest jakiś sposób aby to zrozumieć i wiedzieć jak takie zadanka robić? I mam taki sam problem przy zadaniach z tablicami. Bardzo Was proszę o pomoc :D
Popatrz sobie na przykłady w internecie, przeanalizuj i napisz takie coś samemu.
Najmniejsza i największa: trzymasz dwie takie zmienne, lecisz pętlą po tablicy i dla każdej liczby sprawdzasz czy jest mniejsza od najmniejszej (jeśli tak to ona staje się najmniejszą), podobnie dla największej.
Co trzecia - sprawdzasz czy index podzielny przez 3 (indexy w tablicy zaczynamy od 0, więc ma Ci wypisać tab[0], tab[3]. tab[6] itd.)
Odwrotna kolejność - iterujesz po tablicy od końca, czyli od indexu równego (tab.size - 1)
Trzeba dużo praktykować. Potem utrzymując odpowiednią kondycję programistyczną takie problemy będziesz rozwiązywał z marszu.
liczba najmniejsza
- przed losowaniem liczb inicjujesz zmienną
min
, powinna mieć wartośćint.MaxValue
. - każdą losowaną liczbę porównujesz do zmiennej min, jeśli dana liczba jest od niej mniejsza, to zamieniasz nią wartość zmiennej min.
- po wszystkim wypisujesz wartość zmiennej min.
wyznaczyć ile elementów jest większych lub mniejszych od średniej(średnią umiem)
- najpierw liczysz średnią i zapisujesz do zmiennej
avg
. - deklarujesz zmienne
lowerCount
,higherCount
i inicjujesz je zerem. - iterując po elementach zwiększasz zmienne
lowerCount/higherCount
w zależności od tego czy element jest mniejszy lub większy odavg
. - potem wyspisujesz wartości zmiennych
lowerCount
ihigherCount
itd.
Obejrzyj sobie filmik: http://www.cda.pl/video/114042037
A co do sumy trzecich liczb to o to chodzi?
for (int i = 1; i <= 10; i++)
{
int b = rnd.Next(-10, 11);
Console.WriteLine(b);
if (b% 3 == 0)
{
suma1 = suma1 + b;
}
}
Powinno być
if (i% 3 == 0)
b jest losowe i nie można od niego uzależniać tego algorytmu :)
Oki :)
A co do wyznaczenia ile elementów jest mniejszych, ile większych od średniej to dotyczy zadania z tablic, gdzie muszę zrobić 10 elementową tablicę i wypełnić ją losowymi liczbami z przedziału (-10,10) i jak to wtedy zrobić? :D
Tak jak Ci napisałem. Liczysz średnią. Porównujesz z nią każdy element tablicy wypełnionej liczbami losowymi i zwiększasz odpowiednie liczniki.
A jak ma wyglądać to porównanie z każdym elementem?
for (int i = 0; i < tablica.Length; i++) {
if (tablica[i] > avg) {
higherCount ++;
} else if (tablica[i] < avg) {
lowerCount ++;
}
}
Zgodne z treścią zadania, którą podałeś. Liczby równe średniej nie będą naliczane do żadnego licznika.
A dlaczego przy lowercount i highercount jest inkrementacja?
Sprawdziłbyś kod:
Random rnd = new Random();
int[] tablica;
tablica = new int[10];
int max = tablica[0];
int min = tablica[0];
double suma = 0;
int lowerCount = 0;
int higherCount = 0;
double avg = suma / 10;
for (int i = 0; i < tablica.Length; i++)
{
tablica[i] = rnd.Next(-10, 11);
Console.WriteLine(tablica[i]);
if (tablica[i] > max)
{
max = tablica[i];
}
else if (tablica[i] < min)
{
min = tablica[i];
}
else if (tablica[i] > avg)
{
higherCount++;
}
else if (tablica[i] < avg)
{
lowerCount++;
}
suma = suma + tablica[i];
}
Console.WriteLine("Nawiększy element to: " + max + " i " + "Najmniejszy element wynosi: " + min);
Console.WriteLine("Średnia arytmetyczna to: " + suma / 10);
Console.WriteLine("ilość liczb większej od średniej: " + higherCount + " i " + "ilość liczb mniejszej od średniej: " + lowerCount);
Console.ReadKey();
Twoj kod jest zly, bo masz za duzo else if. Wprowadz sobie dane i zobacz czy bedziesz miec dobry output (teraz Ci nie bedzie zliczal wystapien)
Korzystaj z jezyka, nie wynajduj kola na nowo
using System;
using System.Linq;
using System.Collections.Generic;
public class Test
{
public static void Main()
{
Random rand = new Random();
var listOfNumbers = Enumerable.Range(1, 10).Select(x => rand.Next(1, 7)).ToList();
var average = listOfNumbers.Sum() / listOfNumbers.Count; // tutaj jest blad bo policzy to jako int a nie jako float. To jest zadanie dla Ciebie
var numbersBelowAverage = listOfNumbers.Where(x => x < average).ToList().Count;
var numbersAboveAverage = listOfNumbers.Where(x => x > average).ToList().Count;
Console.WriteLine($"liczba elementow {listOfNumbers.Count} srednia {average} pozniej sredniej {numbersBelowAverage} powyzej {numbersAboveAverage}");
}
}
Skomplikowane bardzo xd
Kod jest błędny, jeśli chcesz w jednej pętli losować i szukać liczby największej (najmniejszej), to nie możesz tak inicjować zmiennych:
int max = tablica[0];
int min = tablica[0];
Dyskusje prowadź w postach, a nie w komentarzach.
@Spine w swoim pierwszym poście napisał jak masz inicjować. Twój kod z inicjalizacją
int max = tablica[0];
int min = tablica[0];
daje błędne wyniki gdy wszystkie wylosowane liczby są dodatnie (>0) albo wszystkie są ujemne (<0).
a liczba największa to jak, bo on napisał tylko najmniejszą? :)
takie coś?
Random rnd = new Random();
int[] tablica;
tablica = new int[10];
int max = -10;
int min = 10;
double suma = 0;
int lowerCount = 0;
int higherCount = 0;
double avg = suma / 10;
for (int i = 0; i < tablica.Length; i++)
{
tablica[i] = rnd.Next(-10, 11);
Console.WriteLine(tablica[i]);
if (tablica[i] < min)
{
min = tablica[i];
}
if (tablica[i] > max)
{
max = tablica[i];
}
if (tablica[i] > avg)
{
higherCount++;
}
if (tablica[i] < avg)
{
lowerCount++;
}
suma = suma + tablica[i];
}
Console.WriteLine("Największy element to: " + max + " i " + "Najmniejszy element wynosi: " + min);
Console.WriteLine("Średnia arytmetyczna to: " + suma / 10);
Console.WriteLine("ilość liczb większej od średniej: " + higherCount + " i " + "ilość liczb mniejszej od średniej: " + lowerCount);
Console.ReadKey();
Wstawiaj kod w znaczniki kolorujące kod.
Teraz jest lepiej, tzn. kod poprawnie znajduje wartość największą i najmniejszą. Dwie rzeczy bym poprawił:
- ostatni wyświetlany komunikat "ilość liczb większej .." spróbuj sformułować po polsku,
- bardzo łatwo o błędne działanie kodu gdy wpadniesz na pomysł by zmienić zakres losowanych liczb, zmiany musisz wtedy zrobić w dwóch miejscach kodu
int lowerBound = -10;
int upperBound = 10;
...
int max = lowerBound;
int min = upperBound;
...
tablica[i] = rnd.Next(lowerBound, upperBound + 1);
A jak zrobię tak jak napisałeś to tylko w jednym miejscu zmienie zakres tak?
Tak.
Post usunąłem bo znów nie "pokolorowałeś", ale zdążyłem zauważyć, że niczego z moich wskazówek nie zrozumiałeś.
A gdzie mam błąd?
A jak mam go pokolorowac?
Usunąłeś zmienne max
oraz min
, one miały zostać.
int lowerBound = -10; //dopisz.
int upperBound = 10; //dopisz
Random rnd = new Random();
int[] tablica;
tablica = new int[10];
int max = lowerBound; //zmień
int min = upperBound; //zmień
double suma = 0;
int lowerCount = 0;
int higherCount = 0;
double avg = suma / 10;
for (int i = 0; i < tablica.Length; i++)
{
tablica[i] = rnd.Next(lowerBound, upperBound + 1); //zmień
Reszty kodu **nie zmieniaj **
Skorzystaj z ostatniego przycisku po prawej na pasku narzędzi.
Znowu źle mi pokazuje :C
Random rnd = new Random();
int[] tablica;
tablica = new int[10];
int lowerbound = -10;
int upperbound = 10;
double suma = 0;
int max = lowerbound;
int min = upperbound;
int lowerCount = 0;
int higherCount = 0;
double avg = suma / 10;
for (int i = 0; i < tablica.Length; i++)
{
tablica[i] = rnd.Next(lowerbound, upperbound);
Console.WriteLine(tablica[i]);
if (tablica[i] < max)
{
max = tablica[i];
}
if (tablica[i] > min)
{
min = tablica[i];
}
Nieprawda, http://ideone.com/XrulqL
Debugger mi źle pokazuje, naprawdę :o pokauzje mi np -10 jak takiej wartosci w ogóle nie wylosowało
To pisz do twórców debuggera, że go spieprzyli.
Co ja mam Ci odpisać, jak mówię co widzę.
Dowód (skopiowane z debuggera):
-9
3
-10
1
-8
6
7
-2
4
-7
Nawiększy element to: 10 i Najmniejszy element wynosi: -10
Średnia arytmetyczna to: -1,5
ilość liczb większej od średniej: 5 i ilość liczb mniejszej od średniej: 5
W moim linku widać jednocześnie kod i wypisane prze ten kod wartości, wyniki są poprawne. U Ciebie widać tylko wartości, nie wiadomo jaki kod jest wykonywany.
Mój błąd, sorrka za kłopot
A wiesz może jak napisac kod,który odwróci kolejność elementów w tablicy?