Ezt a feladatot hogyan kell meg csinálni? Házi feladat. Sajnos nem értem? Tudnátok segíteni?
Töltsön fel egy 10 elemű long típusú vektort a program futása során bekért számokkal. Határozza meg a legnagyobb számot és a számok összegét.
A legnagyobb számot és a számok összegét egymás alá írja ki az
eredmeny.txt nevű szövegfileba.
Egyetemen, hogyan tanultok? Érdekel mert nem értem azt hogy miért nem tudod megcsinálni. A tanár kér tőletek esetleg olyat a feladatban amit nem vettetek vagy hogy van ez. Egyébként irigy vagyok rád mert nekem esélyem sem volt arra hogy tovább tanuljak.
Reiter Istvántól a c# jegyzet című könyvet csapd fel addig amíg az osztályokról nem lesz szó benne. Utána meg fogod tudni csinálni.
Kigoogleztam már értem.
"In computer programming, a vector is either a pointer or an array with only one dimension. 2. In mathematics, a vector is a quantity with both a magnitude and direction. ... In computer graphics, the term vector describes a line with a starting and ending point."
@10:54: „ezt bírtam belőle összehozni. ez így jó lesz?”
A hosszú bemásolt kód azt sejteti, hogy a teljes programodat be akartad mutatni, de ez nem az. Először: A fordító nem tud mit kezdeni a szövegeddel, ha nem közlöd vele, hogy a nyelvbe épített névterek közül melyeket akarod használni. Ez természetesen nekünk is hasznos infó, hiszen lehet, hogy már itt elszúrsz valamit. Ez egy nagyon egyszerű feladat, a közölt programodhoz elegendő a System bekapcsolása, de ezt nálad nem látom. Másodszor: A C-szerű nyelvekben szokásos módon kötelező, hogy legyen egy Main() metódus. Az esetedben az egész program belefér a Main()-be, de később, amikor majd négymillió soros világmegváltásokat írsz, húszezer metódusba kiszervezve, és a Main() esetleg csak annyit tartalmaz, hogy „uccu();”, akkor is lennie kell, mert a fordító ebből tudja, hogy honnan induljon. Harmadszor: A C# bizonyos sajátosságai miatt a Main() se fog lefutni, amíg bele nem teszed egy osztályba, ezt még a magam szintjén sem magyarázom el.
A fentieket garantáltan tanultátok (legalább annyiban, hogy ezeknek így kell lenniük, ha fene fenét eszik is), és nyilván minden eddigi programotokban használtátok. Tehát egy üres programban is legalább ennyinek benne kell lennie, hogy lefordítható legyen:
using System;
class Valami
{
static void Main()
{
}
}
Tegyük félre, hogy futtatáskor semmi értelmes dolog nem történik, hiszen a program nem tartalmaz utasításokat – mindenesetre lefordul, és lefut.
Nálad ez a három apróság véletlenül pont hiányzik, ergo lefordítani sem tudod, ezután nem egészen érthető a kérdés, hogy vajon jó lesz-e. Nem.
A következő lépés: Ha pótlod a fentieket, a compiler már valóban a programmal foglalkozik, és beleakad ebbe:
int legnagyobbOsszesen = 0, osszegOsszesen = 0;
error CS0266: Cannot implicitly convert type `long' to `int'. An explicit conversion exists (are you missing a cast?)
A kasztolás lehetőségével most ne foglalkozzunk, mivel teljesen érthető a fordító megütközése: int változókba raknád a jóval nagyobb méretű long elemek összegét, mintha egy gyufaskatulyába akarnál tíz utazóbőröndöt belepakolni. Erre nyilván akkora változók kellenének, amelyekbe ez az összeg akkor is belefér, ha minden elem maximális méretű. Kísérleteztem a long long típussal, de azt a fordítóm nem érti, gondolom, nem standard. Mindenesetre az illendő minimum, hogy ezek a változók maguk is long méretűek legyenek, és reménykedjünk, hogy a felhasználó nem ír be túl nagy számokat... A program immár lefordítható és futtatható.
„ez így jó lesz?” Hát, még mindig nem.
Újabb lépés: Futtatás után az tapasztalod, hogy a program tökéletes hülyeségeket ír ki, amelyeknek semmi közük a feladathoz. Ennek orvoslására már nem elég egy másra szolgáló random program ötletszerű össze-vissza műtése, hanem oda kell visszatérned, ahonnan eleve indulnod kellett volna: A gondolkodáshoz.
(Folyt. köv.)
A progamvázad ugyebár megvan, érdemes eltöprengened azon, hogy mit rakjál a Main()-be – mint említettem, most minden tennivaló belekerülhet. Elsőként persze a 10 elem tárolására alkalmas long-vektor (ami a kolléga helyénvaló megjegyzéséhez illeszkedve, a klasszikus jelentése szerinti egydimenziós tömb, nem pedig az újmódi vector típus):
long[] szam = new long[10];
Ezenkívül szükség lesz még két long típusú változóra, amelyek majd a legnagyobb értéket és a számok összegét tartalmazzák:
long legnagyobb, osszeg;
Az összeg értéke a számolás kezdetén természetesen 0, ezt érdemes is rögtön beállítani, de mi a helyzet a legnagyobb változóval? A program nyilván azt fogja vizsgálni, hogy az éppen sorra kerülő szám nagyobb-e egy bizonyos előző értéknél; Ahhoz, hogy a vizsgálat indulásakor is legyen ilyen érték, értelemszerűen legnagyobbnak is kezdőértéket kell adnod, de mi legyen az? Pozitív számok esetén lehet nulla, ennél kisebb számot úgysem kaphat. Ha negatív számok is játszanak, mondjuk kikötheted, hogy azok nem lehetnek mínusz százmilliónál kisebbek, így ezt adhatod meg kezdőértéknek...
A feladat azonban nem tartalmaz efféle korlátozásokat. Ennek megfelelően legnagyobb értéke legyen induláskor a létezhető legkisebb, amit a long típus egyáltalán felvehet. Ez egyszerűen lekérdezhető, a kérdéses sor tehát így módosul:
long legnagyobb = long.MinValue, osszeg = 0;
Ennyi maradt a kesze-kusza változódömpingből. Ezek után jön a program érdemi része. Tízszer egymás után fogja végrehajtani a következőket:
1. Beolvas egy értéket. A biztonságos beolvasás kérdését most hagyjuk, tételezzük fel hogy a felhasználó mindent jól ír be. Marad úgy, ahogyan te írtad.
2. Ellenőri, hogy a kapott szám nagyobb-e az eddigi legnagyobbnál. Ha igen, ezzel váltja fel legnagyobb addigi értékét. A vizsgálatkor – a te változatodtól eltérően – nem azt nézi, hogy a szám maradék nélkül osztható-e kettővel, hanem azt, amire kíváncsi:
if (szam[i] > legnagyobb ) legnagyobb = szam[i];
3. Az addigi összeghez hozzáadja a számot.
A lényeg ezzel meg is van. Mellékes kérdés, hogy a for ciklusváltozójaként csakugyan múlhatatlan szükséged van-e egy long méretű számlálóra. Tíz adatot kell összeszámolnod, erre 4 bit elegendő lenne. Ilyen kis méretű változó nem létezik, tehát az elérhető legkisebb, a byte is sokszorosan haladja meg az igényeket. De valószínűsítem, hogy a fordító a szokásos int-méretre módosítaná, ezért legegyszerűbb hagyományos módon eleve azt használni:
for (int i = 0; i < 10; i++)
A ciklus lefutása után birtokodban van a legnagyobb szám és az összeg, ezeket egyszerűen képernyőre tudnád íratni:
Console.WriteLine("A legnagyobb beírt szám: {0},\n a számok összege: {1}", legnagyobb, osszeg);
...csakhogy a feladat nem ezt kéri. Ennek megfelelően utánanézel, hogy hogyan tudsz fájlba írni (ehhez a System.IO névteret is használod), azzal azután meg is vagy.
Biztos vagyok abban, hogy a programot a fentiek fényében sem tudnád megírni, ezért jobb meggyőződésem ellenére is közlöm a saját próbálkozásomat. Vesd össze a leírtakkal, és legközelebb a program megtervezésével kezdd, ne pedig egy félig sem értett idegen kód ész nélküli nyiszatolásával.
using System;
using System.IO;
class Valami
{
static void Main()
{
long[] szam = new long[10];
long legnagyobb = long.MinValue, osszeg = 0;
for (int i = 0; i < 10; i++)
{
Console.Write("{0}. szám: ", i + 1);
szam[i] = long.Parse(Console.ReadLine());
if(szam[i] > legnagyobb ) legnagyobb = szam[i];
osszeg += szam[i];
}
StreamWriter fajl = new StreamWriter("eredmeny.txt", true);
fajl.WriteLine("A legnagyobb beírt szám: {0},\na számok összege: {1}", legnagyobb, osszeg);
fajl.Close();
Console.ReadKey();
}
}
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!