Hirdetés
-
PROHARDVER!

Új hozzászólás Aktív témák
-
Sceemz
újonc
Sziasztok!
A segítségeteket szeretném kérni, jelenleg egy programot írok Visual Studioban (x86 assembly). A program lényege, hogy:"Készítsen programot, ami a felhasználó által megadott elemszámú, véletlen számokkal feltöltött tömbben, megadja a következő statisztikai eredményeket: átlag, medián, szórás. Az eredményeket írja ki a képernyőre. Az elemszám megadását billentyűzetről kell bekérni."
Jelenleg a kódom nagy része már kész van és az átlag, szórás számítás tökéletesen működik, visszont a medián számítás részére nem találok megoldást, ha esetleg valaki tudna benne segíteni azt nagyon meg köszöném.
//A változók létrehozásaint N, temp;int a;const char* hun = "Hun";//Setlocale_asm{mov temp, esp;//setlocale(LC_ALL, "Hun");//"Hun" -> LC_ALLpush hun;push LC_ALL;call dword ptr setlocale;mov esp, temp;}//Véletlen szám véletlenítése_asm{mov temp, esp;push 0;call dword ptr time;push eax;call dword ptr srand;mov esp, temp;}//N bekéréseconst char* be_N = "Kérem adja meg a tömb elemszámát: ";const char* intformat = "%d";_asm{mov temp, esp;rossz_N:push be_N;call printf;lea eax, N;push eax;push intformat;call scanf;//N vizsgálata, hogy pozítiv-ecmp N, 0;jle rossz_N;mov esp, temp;}// Az N elemű tömb létrehozása és feltöltése véletlen számokkalint* A = new int[N];//ESP mentő változóint saveESP;_asm{mov saveESP, ESP;}//Ciklus a feltöltéshez_asm{mov esi, 0;ciklus_feltölt:call rand; //eax->be elteszi a rand() értékétmov edx, 0;mov ecx, 1000; // a legnagyobb kigenerált szám 1000 lehetdiv ecx;add edx, 1; // a legkisebb kigenerált szám az 1 lehetmov a, edx;mov eax, esi;mov ebx, 4;mul ebx;mov ebx, eax;mov edx, ebx;mov ecx, dword ptr A;add ebx, ecx;mov eax, a;mov dword ptr[ebx], eax;//ciklus végeinc esi;cmp esi, N;jl ciklus_feltölt;}const char* tomkiiras = "A feltöltött tömb: ";const char* sortores = "\n";const char* szam = "%d, ";int ciklusValtozo;// A feltöltött tömb kiírása ellenőrzésképen_asm{push tomkiiras;call printf;pop tomkiiras;// for ciklusmov eax, N; // N alkalommal fut le a ciklus -> ciklusváltozómov ciklusValtozo, eax;mov esi, 0; //tömbindexhezciklus:// tömb elemeinek kiírása//memóriacím kimentése változóba a dinamikus tömb eléréséhez:mov ebx, dword ptr[A];add ebx, esi; //eltolás hozzáadása a pontos helyhezpush dword ptr[ebx]; //érték verembe helyezéspush szam;call printf;add esi, 4; //int típus 4 bájtospop szam;pop dword ptr[ebx];// tömb elemeinek kiírásának végedec ciklusValtozo;cmp ciklusValtozo, 0;jne ciklus; // ha nem egyenlő az ciklusValtozo tartalma 0-val akkor folytatódi a ciklus// for ciklus vegepush sortores;call printf;pop sortores;}// Átlag kiszámításafloat osszeg = 0.0;float atlag = 0.0;//A tömb átlaga_asm{mov esi, 0;ciklus_atlag://index kiszámításmov eax, esi;mov ebx, 4; // mivel int típusú tömbünk van, 4 byte méretű elemekkel dolgozunkmul ebx;mov ebx, eax; //i*4 kerül az ebx-be//-bmov edx, ebx;mov ecx, dword ptr A;add ebx, ecx;fild dword ptr[ebx]; // fild az integer értéket betölti a FPU regiszterbefld osszeg;fadd;fstp osszeg;//ciklus végeinc esi;cmp esi, N;jl ciklus_atlag;fld osszeg;fidiv N;fstp atlag;}// Átlag kiíratásaconst char* atlagText = "Átlag: ";const char* atlagFormat = "%.1f\n";_asm{mov eax, dword ptr[atlagText];push eax;call printf;add esp, 4;fld atlag; // az átlag értékének betöltése a lebegőpontos regiszterbesub esp, 8; // hely foglalása a veremben a kiíratáshozfstp qword ptr[esp]; // az átlag értékének a veremre helyezésepush dword ptr[atlagFormat];call printf;add esp, 12; // a hely felszabadítása a veremben}// Medián kiszámításafloat median;_asm{mov ecx, N; // ecx-be betöltjük a tömb méretétmov ebx, 2; // ebx-be betöltjük az 2-es értéket, hogy megkaphassuk a tömb középső elemétcdq; // eax regisztert bővíti edx regiszterrelidiv ebx; // az N-t osztjuk 2-vel, az eredmény az eax-ben lesz, a maradék pedig az edx-benmov edx, 0; // az edx-t nullázzuk, hogy ne maradjon benne az osztás eredményecmp edx, 0; // összehasonlítjuk a maradékot 0-val, hogy megállapítsuk, páros vagy páratlan a tömb méreteje paros_meret; // ha a maradék 0, akkor a tömb mérete páros// Ha a tömb mérete páratlan, a medián az N/2. elem leszmov ebx, N; // ebx-be betöltjük a tömb méretétmov eax, ebx; // az N-t mozgatjuk az eax-besar eax, 1; // az N-et osztjuk 2-vel, az eredmény az eax-ben leszmov ebx, eax; // az eredményt áttesszük a ebx-bemov edx, 0; // az edx-t nullázzukmov eax, dword ptr A[ebx * 4]; // az N/2. elemet betöltjük az eax-bejmp kiir; // ugorjunk a kiíratáshozparos_meret:// Ha a tömb mérete páros, a medián az N/2. és (N/2)+1. elem átlagamov ebx, N; // ebx-be betöltjük a tömb méretétmov eax, ebx; // az N-t mozgatjuk az eax-besar eax, 1; // az N-et osztjuk 2-vel, az eredmény az eax-ben leszmov ecx, eax; // az eredményt áttesszük a ecx-beadd eax, 1; // az N/2-hez hozzáadjuk 1-et, az eredményt az eax-be tesszükmov edx, 0; // az edx-t nullázzukmov ebx, dword ptr A[ecx * 4]; // az N/2. elemet betöltjük a ebx-beadd ebx, dword ptr A[eax * 4]; // az (N/2)+1. elemet hozzáadjuk a ebx-hezmov eax, ebx; // az eredményt áttesszük az eax-besar eax, 1; // az összeget osztjuk 2-vel, az eredmény az eax-ben leszkiir:movsd median, xmm0; // az eredményt áttesszük a median változóba}// Medián kiíratása:cout << "Medián: " << fixed << setprecision(2) << median << endl;// Szórás kiszámításafloat standardDeviation = 0.0;float variance = 0.0;int ezzelosztunk = N; // Módosítás: az ezzelosztunk változó értéke N lesz, mert a szórás számításánál N-el osztunk, nem N-1-gyel_asm{// for ciklusmov eax, N; // N alkalommal fut le a ciklus -> ciklusváltozómov ciklusValtozo, eax;mov esi, 0; //tömbindexhezszoras_ciklus:mov ebx, [A];add ebx, esi; //eltolás hozzáadása a pontos helyhezfild[ebx];fld atlag;fsub st(1), st(0); // kivonjuk a generált számból az átlagotfxch st(1); // st(1)-ben lévő eredményt átrakjuk st(0)-bafstp st(1); // st(1)-ben lévő értéket kiszedjük (töröljük)fmul st(0), st(0); // st(0)-ban lévő értékét megszorozzuk önmagával (négyzetre emelés)fadd variance; // a variance-hez hozzáadjuk az eredménytfstp variance; // az eredményt elmentjük a variance-baadd esi, 4; //int típus 4 bájtosdec ciklusValtozo;cmp ciklusValtozo, 0;jne szoras_ciklus; // ha nem egyenlő az ciklusValtozo tartalma 0-val akkor folytatódi a ciklus// ciklus végefld variance; // betöltjük st(0)-ba a variance változó értékétfidiv ezzelosztunk; // elosztjuk az st(0)-ban lévő értéket N-nelfsqrt; // gyökvonásfstp standardDeviation; // az st(0)-ban lévő értéket eltároljuk a standardDeviation változóban}// Szórás kiíratása:const char* standardDeviationText = "Szórás: ";const char* standardDeviationFormat = "%.1f\n";_asm{mov eax, dword ptr[standardDeviationText];push eax;call printf;add esp, 4;fld standardDeviation; // a szorás értékének betöltése a lebegőpontos regiszterbesub esp, 8; // hely foglalása a veremben a kiíratáshozfstp qword ptr[esp]; // a szórás értékének a veremre helyezésepush dword ptr[standardDeviationFormat];call printf;add esp, 12; // a hely felszabadítása a veremben}delete[] A; // Dynamikusan allo tomb memoria felszabaditasareturn 0;}
Új hozzászólás Aktív témák
● olvasd el a téma összefoglalót!
- Milyen NAS-t vegyek?
- Autós topik
- Hobby rádiós topik
- 5.1, 7.1 és gamer fejhallgatók
- Kínai és egyéb olcsó órák topikja
- droidic: Windows 11 önállóság nélküli világ: a kontroll új korszaka
- TCL LCD és LED TV-k
- Samsung Galaxy Fit 3 - keveset, de jól
- Samsung Galaxy A54 - türelemjáték
- Fotók, videók mobillal
- További aktív témák...
- PlayStation VR2 szett, töltőállomással és merev hordozótáskával, Bp-i üzletből eladó!
- PlayStation 4 Pro 1TB 7216B, frissen pasztázva, 6 hó garanciával, Bp-i üzletből eladó!
- Xiaomi Redmi Note 12 128GB, Kártyafüggetlen, 1 Év Garanciával
- Samsung Galaxy Tab A7 Lite 8,7" 3/32GB Wifi (SM-T220) szürke színben
- Apple iPad Air 5 10.9" (M1 Chip) 5G/64GB/8GB WiFi+Cellular
- LG 77G4 - 77" OLED evo - 4K 144Hz 0.1ms - MLA - 3000 Nits - NVIDIA G-Sync - AMD FreeSync - HDMI 2.1
- Telefon felváráslás!! Xiaomi 13T, Xiaomi 13T Pro, Xiaomi 14T, Xiaomi 14T Pro
- Újszerű Acer Aspire A515 - 15.6"FHD IPS - i5-1335U - 16GB - 512GB SSD - Win11
- GYÖNYÖRŰ iPhone 12 mini 128GB Blue -1 ÉV GARANCIA - Kártyafüggetlen, MS3464, 96% Akkumulátor
- Bomba ár! Lenovo ThinkPad T450s - i5-5GEN I 8GB I 240GB SSD I 14" HD+/FHD I Cam I W10 I Garancia!
Állásajánlatok
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest
Cég: Promenade Publishing House Kft.
Város: Budapest



