Помош: Кратки програмки

  • Креатор на темата Креатор на темата back_rest
  • Време на започнување Време на започнување
Повели,
Код:
    org 0100h
    
    mov si, 0080h
        
    xor bx, bx
    mov bl, byte ptr [si]
    inc si
       
    mov byte ptr [si+bx], 00h
        
    cmp byte ptr [si], 00h
    jne otvori_datoteka
        
    mov ah, 09h
    mov dx, offset nema_datoteka
    int 21h
    
    ret
        
  otvori_datoteka: 
    mov ax, 3d00h
    mov dx, si
    int 21h
        
    jnc izbroj_zborovi
        
    mov ah, 09h
    mov dx, offset greska_otvoranje
    int 21h
    
    ret
        
  izbroj_zborovi:
    mov word ptr [datoteka], ax
        
  procitaj_znak:
    mov ah, 3fh 
    mov bx, word ptr [datoteka]
    mov cx, 0001h
    mov dx, offset procitan_znak
    int 21h
        
    cmp ax, 00h
    je  kraj
        
    mov al, byte ptr [procitan_znak]
        
    cmp al, 20h
    je  najden_razdeluvac
    
    cmp al, 0ch
    je  najden_razdeluvac
    
    cmp al, 0ah
    je  najden_razdeluvac
        
    cmp al, 09h
    je  najden_razdeluvac
     
    cmp al, 00h
    je  najden_razdeluvac
    
    mov byte ptr [vo_zbor], 01h
    
    jmp procitaj_znak
    
  najden_razdeluvac:      
    cmp byte ptr [vo_zbor], 01h
    jne procitaj_znak
        
    inc byte ptr [izbroeni_zborovi]
    mov byte ptr [vo_zbor], 00h
         
    jmp procitaj_znak
        
  kraj:
    cmp byte ptr [vo_zbor], 01
    jne zatvori_datoteka
    
    inc word ptr [izbroeni_zborovi]
    
  zatvori_datoteka:
    mov ah, 3eh
    mov bx, word ptr [datoteka]
    int 21h
    
    mov di, offset broj_na_zborovi
    add di, 00004h
    
    mov ax, word ptr [izbroeni_zborovi]
    
    cmp ax, 0000h
    je  prikazi_br_zborovi
    
    mov cx, 000ah
    
  pretvori_vo_dec:
    xor dx, dx
    div cx
    add dl, 30h
    
    mov byte ptr [di], dl
    dec di
    
    cmp ax, 0000h
    jne pretvori_vo_dec
  
  prikazi_br_zborovi: 
    mov ah, 09h
    mov dx, offset vkupno_zborovi
    int 21h
    
    ret
    
    nema_datoteka    db "[greska] nemate vneseno ime na datotekata!", "$" 
    greska_otvoranje db "[greska] neuspesno otvoranje na datotekata", "$"
    
    vkupno_zborovi   db "broj na zborovi : "
    broj_na_zborovi  db "00000"
                     db "$"
     
    datoteka         dw ?
    procitan_znak    db 00h
    vo_zbor          db 00h
    izbroeni_zborovi dw 0000h
Програмата ја изработив и тестирав со Emu8086. Прашај слободно ако има нешто нејасно :wink:

Mene me zanima (fakin kirilica)
interrupt 21h? na kratko?
Da ne e nekoi od onie veke isprogramiranite vo Emu8086?
 
HsIlOmEdUs,

Прекинот 21h се користи за повикување на MS-DOS API функции. Во AH регистерот секогаш се сместува бројот на функцијата а параметрите на функцијата се предаваат преку останатите регистри. Резултатите од функцијата се враќаат преку акумулаторскиот регистер AX или некој неков подрегистер како AH/AL а одредени функции ги користат и знаменцата (flags) од FLAG регистерот. int 21h е исто што и int 80h кај Linux/BSD системите кои работат на x86 платформата.

Еве пример,
Код:
mov ah, 4ch    ; 4ch => број на функцијата за исклучување на програмата
mov al, 00h    ; 00h => exit code
int 21h        ; извршување на функцијата

Еквивалент на ова за Windows:
Код:
; во асемблер
push 00000000h
call ExitProcess

// во C
ExitProcess(0);
 
imam edna vakva zadaca.treba da nacrtam vakva slika od zvezdicki
.... *...
.. ***
.*****
...***
.... *
vaka pocnuvam da ja crtam jas:
int n=5; //broj na redovi
int a=0;
for(int i=1;i<=n;i++) {
while((n+1)/2>a) {
for(int j=1;j<=n-i;j++) {
System.out.print("");
}
for(int k=1;k<=i;k++) {
System.out.print("*");
}
a++;
System.out.println();
}

e i sega neznam kako da go docrtam dolniot del od slikata koga pocnuvaat da se namaluvaat zvezdite

najverojatno e vakov uslovot za dolnite
while(a>=0)
a--;
daj neka pomogne nekoj ako znae

EDIT:ovie tockive na pocetokot ne gi gledajte ,niv gi zemav onaka za da mozam da vi go prikazam crtezot(nesto me zaebavase koga gi pisuvav zvezdive na forumov) :)
 
imam edna vakva zadaca.treba da nacrtam vakva slika od zvezdicki
.... *...
.. ***
.*****
...***
.... *
vaka pocnuvam da ja crtam jas:
int n=5; //broj na redovi
int a=0;
for(int i=1;i<=n;i++) {
while((n+1)/2>a) {
for(int j=1;j<=n-i;j++) {
System.out.print("");
}
for(int k=1;k<=i;k++) {
System.out.print("*");
}
a++;
System.out.println();
}

e i sega neznam kako da go docrtam dolniot del od slikata koga pocnuvaat da se namaluvaat zvezdite

najverojatno e vakov uslovot za dolnite
while(a>=0)
a--;
daj neka pomogne nekoj ako znae

EDIT:ovie tockive na pocetokot ne gi gledajte ,niv gi zemav onaka za da mozam da vi go prikazam crtezot(nesto me zaebavase koga gi pisuvav zvezdive na forumov) :)

Елена, се убив од мислење, али никако не ми испаѓаше тоа што се бара на начин кој доликува... но задачава ја решив на друг малце поише од дебилен начин кој го дава финалниот резултат кој се бара... еве го кодот:

Код:
public static void main(String args[]){
		
		int zv = 1, n=1, br=3;
		
		int pr = br - 1;
		
		for(int r=0; r<br; r++){
			
			for(int c=0; c<n; c++){
				
				for(int i=0; i<pr; i++)
					System.out.print(" ");
				
				for(int i=0; i<zv; i++)
					System.out.print("*");
				
				for(int i=0; i<pr; i++)
					System.out.print(" ");

			}
			System.out.println();
			pr--;
			zv += 2;
		}
			
			int vzv = 3, vn=1, vbr=2;
			
			int vpr = vbr - 1;
			
			for(int vr=0; vr<vbr; vr++){
				
				for(int c=0; c<n; c++){
					
					for(int i=0; i<vpr; i++)
						System.out.print(" ");
					
					for(int i=0; i<vzv; i++)
						System.out.print("*");
					
					for(int i=0; i<vpr; i++)
						System.out.print(" ");

				}
				System.out.println();
				vpr++;
				vzv -= 2;
	 }
      }
}

Финалниот резултат е:

Код:
  *  
 *** 
*****
 *** 
  *
 
imam edna vakva zadaca.treba da nacrtam vakva slika od zvezdicki
.... *...
.. ***
.*****
...***
.... *
vaka pocnuvam da ja crtam jas:
int n=5; //broj na redovi
int a=0;
for(int i=1;i<=n;i++) {
while((n+1)/2>a) {
for(int j=1;j<=n-i;j++) {
System.out.print("");
}
for(int k=1;k<=i;k++) {
System.out.print("*");
}
a++;
System.out.println();
}

e i sega neznam kako da go docrtam dolniot del od slikata koga pocnuvaat da se namaluvaat zvezdite

najverojatno e vakov uslovot za dolnite
while(a>=0)
a--;
daj neka pomogne nekoj ako znae

EDIT:ovie tockive na pocetokot ne gi gledajte ,niv gi zemav onaka za da mozam da vi go prikazam crtezot(nesto me zaebavase koga gi pisuvav zvezdive na forumov) :)
Дополнение на таа со триаголникот, но овој пат модифицирана да си црташ баклави, нормално колку сакаш (во серија) и во големина/висина

Код:
    public static void triagolni(double visina, double shirina, double red) {
        double vrv = shirina / visina;
        int broj_zvezdi = (int) (red * vrv);
        int prazni = (int) ((shirina - broj_zvezdi) / 2);
        for (int i = 1; i <= shirina; i++) {
            if (i <= prazni || i > shirina - prazni) {
                System.out.print(" ");
            } else {
                System.out.print("*");
            }
        }

    }

    public static void main(String[] args) {
        int visina = 10;
        int shirina = 20;
        int red = 5;
        for (int i = 1; i <= visina-1; i++) {

            for (int j = 1; j <= red; j++) {
                triagolni(visina, shirina, i);
                System.out.print(" ");
            }
            System.out.println();
        }
        for (int i = visina; i >= 1; i--) {

            for (int j = 1; j <= red; j++) {
                triagolni(visina, shirina, i);
                System.out.print(" ");
            }
            System.out.println();
        }
    }
Како изгледа
Код:
run:
         **                   **                   **                   **                   **          
        ****                 ****                 ****                 ****                 ****         
       ******               ******               ******               ******               ******        
      ********             ********             ********             ********             ********       
     **********           **********           **********           **********           **********      
    ************         ************         ************         ************         ************     
   **************       **************       **************       **************       **************    
  ****************     ****************     ****************     ****************     ****************   
 ******************   ******************   ******************   ******************   ******************  
******************** ******************** ******************** ******************** ******************** 
 ******************   ******************   ******************   ******************   ******************  
  ****************     ****************     ****************     ****************     ****************   
   **************       **************       **************       **************       **************    
    ************         ************         ************         ************         ************     
     **********           **********           **********           **********           **********      
      ********             ********             ********             ********             ********       
       ******               ******               ******               ******               ******        
        ****                 ****                 ****                 ****                 ****         
         **                   **                   **                   **                   **          
BUILD SUCCESSFUL (total time: 0 seconds)
Ако сакаш да сменеш параметри, едитирај тука

public static void main(String[] args) {
int visina = 10; (се мери до пола)
int shirina = 20;
int red = 5; (колку баклави да принта)
 
pak jas :)
imam edna zadaca so String . sakam da vnesam nekoj broj npr. 1235 i toj da mi go ispise na ekran vo digitalna forma
*digitalna forma kako sto se predstaveni brojkite na dig. casovnik
istockphoto_399523-digital-numbers.jpg
 
Повели,
Код:
    public static void prikaziBrVoDigitForma(String broj)
    {
        /* цифра 0 */
        String [] digit0 =
        {
            " ----- ",
            " |   | ",
            " |   | ",
            " |   | ",
            " ----- "
        };
        /* цифра 1 */
        String [] digit1 =
        {
            " | ",
            " | ",
            " | ",
            " | ",
            " | "
        };
        /* цифра 2 */
        String [] digit2 =
        {
            " ---- ",
            "    | ",
            " ---- ",
            " |    ",
            " ---- "
        };
        /* цифра 3 */
        String [] digit3 =
        {
            " ---- ",
            "    | ",
            " ---- ",
            "    | ",
            " ---- "
        };
        /* цифра 4 */
        String [] digit4 =
        {
            " |  | ",
            " |  | ",
            " ---- ",
            "    | ",
            "    | ",
        };
        /* цифра 5 */
        String [] digit5 =
        {
            " ---- ",
            " |    ",
            " ---- ",
            "    | ",
            " ---- "
        };
        /* цифра 6 */
        String [] digit6 =
        {
            " ---- ",
            " |    ",
            " ---- ",
            " |  | ",
            " ---- "
        };
        /* цифра 7 */
        String [] digit7 =
        {
            " ---- ",
            "    | ",
            "    | ",
            "    | ",
            "    | "
        };
        /* цифра 7 */
        String [] digit8 =
        {
            " ---- ",
            " |  | ",
            " ---- ",
            " |  | ",
            " ---- "
        };
        /* цифра 9 */
        String [] digit9 =
        {
            " ---- ",
            " |  | ",
            " ---- ",
            "    | ",
            " ---- "
        };
        
        for (int i = 0; i < 5; i++)
        {
            if (i != 0)
                System.out.println();
            
            for (int j = 0; j < broj.length(); j++)
            {
                switch (broj.charAt(j))
                {
                    case '0':
                        System.out.print(digit0[i]);
                        break;
                        
                    case '1':
                        System.out.print(digit1[i]);
                        break;
                    
                    case '2':
                        System.out.print(digit2[i]);
                        break;
                        
                    case '3':
                        System.out.print(digit3[i]);
                        break;
                        
                    case '4':
                        System.out.print(digit4[i]);
                        break;
                        
                    case '5':
                        System.out.print(digit5[i]);
                        break;
                        
                    case '6':
                        System.out.print(digit6[i]);
                        break;
                    
                    case '7':
                        System.out.print(digit7[i]);
                        break;
                    
                    case '8':
                        System.out.print(digit8[i]);
                        break;
                        
                    case '9':
                        System.out.print(digit9[i]);
                        break;
                }
            }
        }
    }

Испишување на број:
Код:
prikaziBrVoDigitForma("1235");
 
Повели,
Код:
    org 0100h
    
    mov si, 0080h
        
    xor bx, bx
    mov bl, byte ptr [si]
    inc si
       
    mov byte ptr [si+bx], 00h
        
    cmp byte ptr [si], 00h
    jne otvori_datoteka
        
    mov ah, 09h
    mov dx, offset nema_datoteka
    int 21h
    
    ret
        
  otvori_datoteka: 
    mov ax, 3d00h
    mov dx, si
    int 21h
        
    jnc izbroj_zborovi
        
    mov ah, 09h
    mov dx, offset greska_otvoranje
    int 21h
    
    ret
        
  izbroj_zborovi:
    mov word ptr [datoteka], ax
        
  procitaj_znak:
    mov ah, 3fh 
    mov bx, word ptr [datoteka]
    mov cx, 0001h
    mov dx, offset procitan_znak
    int 21h
        
    cmp ax, 00h
    je  kraj
        
    mov al, byte ptr [procitan_znak]
        
    cmp al, 20h
    je  najden_razdeluvac
    
    cmp al, 0ch
    je  najden_razdeluvac
    
    cmp al, 0ah
    je  najden_razdeluvac
        
    cmp al, 09h
    je  najden_razdeluvac
     
    cmp al, 00h
    je  najden_razdeluvac
    
    mov byte ptr [vo_zbor], 01h
    
    jmp procitaj_znak
    
  najden_razdeluvac:      
    cmp byte ptr [vo_zbor], 01h
    jne procitaj_znak
        
    inc byte ptr [izbroeni_zborovi]
    mov byte ptr [vo_zbor], 00h
         
    jmp procitaj_znak
        
  kraj:
    cmp byte ptr [vo_zbor], 01
    jne zatvori_datoteka
    
    inc word ptr [izbroeni_zborovi]
    
  zatvori_datoteka:
    mov ah, 3eh
    mov bx, word ptr [datoteka]
    int 21h
    
    mov di, offset broj_na_zborovi
    add di, 00004h
    
    mov ax, word ptr [izbroeni_zborovi]
    
    cmp ax, 0000h
    je  prikazi_br_zborovi
    
    mov cx, 000ah
    
  pretvori_vo_dec:
    xor dx, dx
    div cx
    add dl, 30h
    
    mov byte ptr [di], dl
    dec di
    
    cmp ax, 0000h
    jne pretvori_vo_dec
  
  prikazi_br_zborovi: 
    mov ah, 09h
    mov dx, offset vkupno_zborovi
    int 21h
    
    ret
    
    nema_datoteka    db "[greska] nemate vneseno ime na datotekata!", "$" 
    greska_otvoranje db "[greska] neuspesno otvoranje na datotekata", "$"
    
    vkupno_zborovi   db "broj na zborovi : "
    broj_na_zborovi  db "00000"
                     db "$"
     
    datoteka         dw ?
    procitan_znak    db 00h
    vo_zbor          db 00h
    izbroeni_zborovi dw 0000h
Програмата ја изработив и тестирав со Emu8086. Прашај слободно ако има нешто нејасно :wink:

Човеку респект за програмава. Иако појма немам што е како е во програмава, многу ги ценам луѓето кои на ова ниво знаат да програмираат. Не можам да најдам слободно време, а и немам некој добар туторијал за асемблер, инаку сум изгорен некој ден и јас нешто вакво да испрограмирам.
 
Луѓе ако може некој во паскал да ми ја напише задачата : генерирај паскалов триаголник за пресметување на коефициентите на биномот до n. :smir:
 
neznam kako e sintaksata vo Pascal ama eve ti go tvojot PaskalovTriagolnik vo Java.Vidi od tuka pa smeni si ja
Код:
import 


public class PaskalovTriagolnik {
    public static void main(String[] args) {
        // broj na redovi
       
        int n = 5;
        int[] red = new int[n];
       
        for (int i = 0; i<n; ++i) {
            //prazni mesta
            for (int j = 0; j<n-i-1; ++j) System.out.print(" ");

            //izpis na redot
            for (int j = 0; j<=i; j++) {
                if (j == 0 || j == i) red[i-j] = 1;
                else red[i-j] = red[i-j] + red[i-j-1];
                System.out.print(red[i-j] + " ");
            }
            System.out.println();
        }
        
    }
}

a ke moze li nekoj na mene da mi pomogne so sledniove Triagolnici vo java
Код:
              1                    1 2 3 4 5 6 7 8 7 6 5 4 3 2 1
            1 2 1                    1 2 3 4 5 6 7 6 5 4 3 2 1
          1 2 3 2 1                    1 2 3 4 5 6 5 4 3 2 1
        1 2 3 4 3 2 1                    1 2 3 4 5 4 3 2 1
      1 2 3 4 5 4 3 2 1                    1 2 3 4 3 2 1
    1 2 3 4 5 6 5 4 3 2 1                    1 2 3 2 1
  1 2 3 4 5 6 7 6 5 4 3 2 1                    1 2 1
1 2 3 4 5 6 7 8 7 6 5 4 3 2 1                    1
             (e)                                (f)
 

Kajgana Shop

Back
На врв Bottom