Dwa proste programy sprawiające trudność.

0

Mam przed sobą takie oto zadania:

  1. "Napisz program, który pobiera z klawiatury liczby podane przez użytkownika aż do momentu, gdy ich suma będzie większa niż 50."

  2. "Napisz program wypisujący na ekranie monitora wszystkie dwucyfrowe liczby parzyste podzielne przez 3."

I kompletnie nie wiem jak się za to zabrać. Może podpowiecie od czego zacząć? Od razu mówię, że z c++ bawię się może z 2 tygodnie, a fakt, że dodatkowo mam to w szkole jeszcze bardziej mnie demotywuje :/

0

while wynik <= 50
wynik = wynik + pobrana

puszczasz pętlę od 10 do 99 , każda z liczb dzielisz (% przy użyciu tego znaku) przez 3, jeśli wynik dzielenia jest == 0 to wypisz te liczbę, w przeciwnym wypadku przejdź do sprawdzania kolejnej. Pamiętaj by w tym przypadku zmienne były typu float.

2

Xanias, co do 2 to prościej jest wziąć 12 i dodawać w pętli 6 póki liczba jest mniejsza od 99.

0
while wynik  >= 50
wynik = wynik + pobrana

Chyba while wynik <= 50...

puszczasz pętlę od 10 do 99 , każda z liczb dzielisz (% przy użyciu tego znaku) przez 3, jeśli wynik dzielenia jest == 0 to wypisz te liczbę, w przeciwnym wypadku przejdź do sprawdzania kolejnej. Pamiętaj by w tym przypadku zmienne były typu float.

Nie ma powodu żeby zmienne były typu float:

for i in zakres(10, 99):
    if i % 3 == 0:
        print i

Poza tym oczywiście to co napisał winerfresh, ale IMO to brzydsze trochę (zrobisz tak dla 100? ;p)

0

Nadal mi nie wychodzi. Zajmijmy się drugim zadaniem, bo według mnie trochę trudniejsze jest. Mam taką funkcję:

int i;
do {
    
    for(int i;i>=10;i+2)
            cout << i <<" ";
            
    
    }while(i<=99);

Lecz nadal nie mam pojęcia gdzie tkwi błąd w moim rozumowaniu :/

0

Robisz cos takiego
tworzysz zmienna i o nieznanej wartosci! potem w petli for przyslaniasz ta zmienna "wyzej" zmienna lokalna petli, rowniez o nieznanej wartosci. Teraz kazesz petli wypisywac, z krokiem co 2 dopoki i>= 10

Wiem mamy

i == ???
dajemy i+2 == ???
Sprawdzamy warunek czy to cos jest wieksze rowne 10. Nawet jesli jakims cudem i by bylo rowne 0 na starcie to petla nie wykona sie ani razu bo i<10 wiec petla sie przerwie. Do tego wszystkiego i "zewnetrzne" zostaje takie samo przez caly czas trwania petli do while, wiec otrzymujemy w rezultacie petle nieskonczona(i zapewne ma wartosc typu 1512737, wiec ani razu sie nie wykona).

To co chcesz zrobic w 2 to

Uzywasz samej petli for, gdzie tworzysz zmienna i rowna 12, potem dopoki i<100 zwiekszasz i co 6 w kazdym kroku i wypisujesz wartosc i na ekran.

1
#include <iostream>

using namespace std; //deklarujemy uzycie przestrzeni nazw std

int main()
{
   int wynik = 0;//deklaracja zmiennej przechowujacej sume wprowadzonych liczb
   while (wynik < 50)//dopoki wynik jest mniejszy od 50
   {
      int kolejna = 0;//zadeklaruj nowa zmienna
      cin>>kolejna;//wczytaj liczbe do nowej zmiennej
      wynik += kolejna;//dodaj wynik do nowej liczby
   }
   system("pause");//wstrzymaj program (opcjonalnie)
   return 0;//zwroc 0, program zakonczyl sie poprawnie
}
#include <iostream>

using namespace std; //deklarujemy uzycie przestrzeni nazw std

int main()
{
   for (int i = 10; i < 100; ++i)//sprawdzamy kazda liczbe dwucyfrawa, tzn 10 <= n < 100
   {
      if (i % 3 == 0 && i % 2 ==0) cout<<i<<" "; //jesli reszta z dzielenia i przez 3 rowna sie 0 ORAZ jesli reszta z dzielenia i przez 2 rowna sie 0 (czyli jesli i jest parzyste) to wypisz ta liczbe, mozna tez uzyc tego sposobu, ze zaczynami z liczba 12 i dodajemy przy kazdym przebiegu petli 6 dopoki liczba bedzie mniejsza badz rowna 99
   }
   system("pause");//wstrzymaj program (opcjonalnie)
   return 0;//zwroc 0, program zakonczyl sie poprawnie
}
0

Skopiowałem, przeanalizowałem i zrozumiałem, dzięki wielkie. Możecie mieć pewność, że wrócę :)

1

A oto Twoje programy w Asemblerze:
1.

.586
.model flat, stdcall

option casemap:none

include windows.inc
include kernel32.inc
include masm32.inc

includelib kernel32.lib
includelib masm32.lib

.data
szPrompt db "Enter numbers:",0
szNext db 32 dup(0)
dwResult dd 0
dwNext dd 0

.data?
consoleOutHandle dd ?
consoleInHandle dd ?
ReadWritten dd ? 


.code

start:
push STD_OUTPUT_HANDLE
call GetStdHandle

mov consoleOutHandle, eax

push STD_INPUT_HANDLE
call GetStdHandle

mov consoleInHandle, eax

push 0
push offset ReadWritten
push sizeof szPrompt
push offset szPrompt
push consoleOutHandle
call WriteConsole

_loop:
mov ecx, dwResult
cmp ecx, 50
jge _exit
push 0
push offset ReadWritten
push sizeof szNext
push offset szNext
push consoleInHandle
call ReadConsole

push offset szNext
call atol

add dwResult, eax

jmp _loop

_exit:
push 0
call ExitProcess

end start
.586
.model flat, stdcall

option casemap:none

include windows.inc
include kernel32.inc
include user32.inc
include masm32.inc

includelib kernel32.lib
includelib user32.lib
includelib masm32.lib

.data
dwCounter dd 10

.data?
consoleOutHandle dd ?
ReadWritten dd ? 
szBuff db 4 dup(?)


.code

start:
push STD_OUTPUT_HANDLE
call GetStdHandle

mov consoleOutHandle, eax

_loop:
mov ecx, dwCounter
cmp ecx, 100
je _exit
mov edx, 0
mov eax, dwCounter
mov ecx, 2
div ecx
cmp edx, 0
je _even
inc dwCounter
jmp _loop

_even:
mov edx, 0
mov eax, dwCounter
mov ecx, 3
div ecx
cmp edx, 0
je _write
inc dwCounter
jmp _loop

_write:
mov eax, dwCounter
push offset szBuff
push dwCounter
call dwtoa

push 0
push offset ReadWritten
push sizeof szBuff
push offset szBuff
push consoleOutHandle
call WriteConsole

inc dwCounter
jmp _loop

_exit:
push 0
call ExitProcess

end start

Zachęcam do nauki Asemblera ;)

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