3 - PROGRAMAÇÃO-BÁSICA

564 days ago by jmarcellopereira

PROGRAMAÇÃO BÁSICA

jmarcellopereira@ufpi.edu.br


OPERADORES LÓGIGOS E BOLEANOS

Operadores de comparação para determinar, por exemplo, se são iguais. Todos os operadores de comparação da SAGE retornam TRUE como verdade e FALSE como falso.
Resumo:

  • x < y, verdade se x é menor que y.
  • x <= y, verdade se x é menor ou igual a y.
  • x >= y, verdade se x é maior ou igual a y.
  • x > y, verdade se x é maior que y.
  • x == y, verdade se x é igual a y.
  • x != y,
  • x ~= y, verdade se x é diferente de y.

Uma expressão booleana elemento por elemento, é uma combinação de comparação de expressões usando os operadores:

  • | |, operador “ou”
  • & &, operador “e”
  • ~ ou !, operador “não”

Uma expressão booleana é verdadeira se o resultado do cálculo das combinações lógicas das expressões booleanas for verdadeira. O valor será considerado falso se for zero, e verdadeiro de outra forma.

ENTRADA E SAÍDA

 
       

ESTRUTURAS DE CONTROLE

Laços ocupam um lugar relevante no controle e núcleos de repetição. Os comandos de controle de laço são: while, for, do, if, switch

 
       

Condicional "SE" (IF)

x=randrange(0,10) y=randrange(0,10) x ; y 
       

# se x< y será impresso a mensagem, se x>y não será feito nada if x < y: print("x é menor que y") 
       
x é menor que y
x é menor que y
if x < y: show("x é menor que y .","Valor de x: ",x," Valor de y: ",y) else: show("x é maior que y .","Valor de x: ",x," Valor de y: ",y) 
       
Traceback (click to the left of this block for traceback)
...
NameError: name 'y' is not defined
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "_sage_input_29.py", line 10, in <module>
    exec compile(u'open("___code___.py","w").write("# -*- coding: utf-8 -*-\\n" + _support_.preparse_worksheet_cell(base64.b64decode("aWYgeCA8IHk6CiAgICBzaG93KCJ4IMOpIG1lbm9yIHF1ZSB5IC4iLCJWYWxvciBkZSB4OiAiLHgsIiBWYWxvciBkZSB5OiAiLHkpCiAgICAKZWxzZToKICAgIHNob3coInggw6kgbWFpb3IgcXVlIHkgLiIsIlZhbG9yIGRlIHg6ICIseCwiIFZhbG9yIGRlIHk6ICIseSk="),globals())+"\\n"); execfile(os.path.abspath("___code___.py"))
  File "", line 1, in <module>
    
  File "/tmp/tmpgPLfcs/___code___.py", line 2, in <module>
    if x < y:
NameError: name 'y' is not defined
if x < y: show("x é menor que y .","Valor de x: ",x," Valor de y: ",y) elif x > y: show("x é maior que y .","Valor de x: ",x," Valor de y: ",y) else: show("x é igual a y .","Valor de x: ",x," Valor de y: ",y) 
       

Definindo funções do tipo: 

f(x) =\begin{cases} \cos(x) & x \geq 0\\ 1 - e^{-1/x^2} & \text{x < 0}. \end{cases} ~

x = random() print(x) if x>=0: show("f = cos(x) = ",cos(x)) elif x<0: show("f = exp(-1/x^2) = ",exp(-1/x^2)) 
       
0.443665615541
0.443665615541
a = randrange(0,4); b = randrange(0,4) show('valor de a:', a, " valor de b:",b) if (a^2 + 2*b -10)*(b^2 + 2*b -10) < 0: show("Existe uma raiz entre os intervalos") elif (a^2 + 2*b -10)*(b^2 + 2*b -10) > 0: show("Não existe uma raiz entre os intervalos") elif (a^2 + 2*b -10)*(b^2 + 2*b -10) < 0 == 0: show("Os intervalos são raízes da função") else: show("intervalos inválidos, não existe raiz") 
       

Condicional "TROCAR" (SWITCH)

x = randrange(-10,10) y = n(sin(x)) if y == 0: show("Raiz: ",x) elif y > 0: show("Valor positivo: ",y,". valor de x: ",x) elif y < 0: show("Valor negativo: ",y,". valor de x: ",x) 
       

Repetição "PARA" (FOR)

for<referência>in<sequência>:

     <bloco de código>


for<referência>in<sequência>:

     condição
          continue
      else:
           
  <bloco de código>

for<referência>in<sequência>: 

      condição
            break
      else:
             <bloco de código>
show("Valor da função sin(x)*cos(x/2)+x:") for x in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]: show( n(sin(x)*cos(x/2)+x) , '. Para x = ', x) 
       










vetor = range(1,10) show("Valor da função sin(x)*cos(x/2)+x:") for x in range(1,len(vetor)): show( n(sin(x)*cos(x/2)+x)," Para x = ",x) 
       








# para i de 1 até 10, # se o resto da divisão i por 3 for diferente de zero, # então o loop é parado e retorna para o inicio do for # e o loop será continuado até final somente se o resto for 0 for i in range(1,10): if i % 3 != 0: continue show(i) 
       


# para i de 1 até 10, # se a divisão i por 3 for igual maior ou igual a 4, então o loop é encerrado for i in range(0,20): if (i / 3 >= 4): break show(i) 
       











for n in range(1,4): for m in range(1,4): show("n * m =", (n * m)) show('valor de n:',n) show('valor de m:',m) show("") 
       

















for n in range(1,4), m in range(1,4): show("n * m =", (n * m)) 
       
Traceback (click to the left of this block for traceback)
...
NameError: name 'm' is not defined
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "_sage_input_7.py", line 10, in <module>
    exec compile(u'open("___code___.py","w").write("# -*- coding: utf-8 -*-\\n" + _support_.preparse_worksheet_cell(base64.b64decode("Zm9yIG4gaW4gcmFuZ2UoMSw0KSwgbSBpbiByYW5nZSgxLDQpOgogICAgc2hvdygibiAqIG0gPSIsIChuICogbSkp"),globals())+"\\n"); execfile(os.path.abspath("___code___.py"))
  File "", line 1, in <module>
    
  File "/tmp/tmpSyXS2p/___code___.py", line 3, in <module>
    exec compile(u'for n in range(_sage_const_1 ,_sage_const_4 ), m in range(_sage_const_1 ,_sage_const_4 ):\n    show("n * m =", (n * m))
  File "", line 1, in <module>
    
NameError: name 'm' is not defined
%time # Método bruto de encontrar raízes de uma função sem otimização x = srange(1,10,0.000001) for k in range(1,len(x)): if abs(sin(x[k])*x[k]^2 + cos(x[k])*x[k]^2 + x[k] + cos(sin(x[k]))^2) < 0.0001: show("Valor(y):",sin(x[k])*x[k]^2+cos(x[k])*x[k]^2+x[k]+cos(sin(x[k]))^2," . Raiz(x): ",x[k]) print("fim") 
       
%time # Método bruto de encontrar raízes de uma função com otimização RDF x = srange(1,10,RDF(0.000001)) for k in range(1,len(x)): if abs(sin(x[k])*x[k]^2 + cos(x[k])*x[k]^2 + x[k] + cos(sin(x[k]))^2) < 0.0001: show("Valor(y):",sin(x[k])*x[k]^2+cos(x[k])*x[k]^2+x[k]+cos(sin(x[k]))^2," . Raiz(x): ",x[k]) print("fim") 
       


fim
CPU time: 8.85 s,  Wall time: 17.84 s
fim
CPU time: 8.85 s,  Wall time: 17.84 s

Benchmark: Comparação com outros Softwares

Octave MatLab Julia Python Sage sem RDF Sage com RDF
382.925* 77.34* 7.471* 45.190* 160.451* 33.887*

* tempo médio em segundos numa máquina I5 Haswell, 8GB Ram, Linux NETRunner 17, SageMath 7.0

Aritmética em RR(reais) é mais lento do que aritmética com tipos C nativos. Se vocês usar RDF em vez de RR , SageMath será mais rápido do que numpy.

 
       
/tmp/tmpT_tNPc
/tmp/tmpT_tNPc

Percorrimento de uma  matriz

mnum = matrix([[1,2,3],[4,5,6]]) mnum 
       
for i in range(0,mnum.nrows()): for j in range(0,mnum.ncols()): show('elemento da linha %d coluna %d é :'% (i,j) , mnum[i][j]) 
       





List Comprehension

lista = [ <expressão> for <referência> in <sequência> if <condição> ]

lc1 = [x*2 for x in range(10)] lc1 
       
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
num = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] # Eleve os numeros maiores ou igual a 4 ao quadrado lc2 = [ x^2 for x in num if x >= 4 ] lc2 
       
[16, 25, 36, 49, 64, 81, 100, 121, 144]
[16, 25, 36, 49, 64, 81, 100, 121, 144]
 
       

Repetição "ENQUANTO" (WHILE)

while condicao:
     instruções

while condicao:
     instruções
     if condição:
        continue ou break;
   
reset() 
       
i = 0 while true: print(i) i = i + 1 if (i / 3 > 4 ): break 
       
0
1
2
3
4
5
6
7
8
9
10
11
12
0
1
2
3
4
5
6
7
8
9
10
11
12
# Metodo da Bisseccao # Calcula uma aproximação para uma raiz da função de f(x) # Entre os intervalo [ao,bo] e a tolerencia de erro daddo por tol. # y = sin(x)*x^2 + cos(x)*x^2 + cos(sin(x))^2 ao = 1 bo = 5 tol = 0.000000001 interacao = 0 if ((sin(ao)*ao^2+cos(ao)*ao^2 + cos(sin(ao))^2) * (sin(bo)*bo^2+cos(bo)*bo^2 + cos(sin(bo))^2)) < 0: while (abs(bo-ao) > tol) & (interacao<10000000): x=(ao+bo)/2 interacao = interacao+1 if (sin(x)*x^2 + cos(x)*x^2 + cos(sin(x))^2)*(sin(ao)*ao^2 + cos(ao)*ao^2+ cos(sin(ao))^2) > 0: ao=x else: bo=x show("Interacoes: ",interacao) show("Valor da raiz: ",n(x)) show("Valor de f(x)= ",round(sin(x)*x^2 + cos(x)*x^2 + cos(sin(x))^2,9)," com erro menor que ",tol) else: show("Não há raízes no intervalo") 
       


Repetição "FAÇA ATÉ QUE" (DO...UNTIL)

 
       

FUNÇÕES ( function( ) )

Para definir uma nova função no Sage, use o comando def e dois pontos após a lista de nomes das variáveis. Em Python, blocos de código não são indicados por colchetes ou blocos de início e fim, como em outras linguagens. Em vez disso, blocos de código são indicados por tabulação, que devem estar alinhadas exatamente.

reset() 
       

Função básica

def matrixD(L): show('------------ inicio funcao -----------') show(L) show('a dimensão da matriz é :',L.dimensions()) show('_____________________________________') 
       
matrixD(matrix([[2,2],[1,5]])) ; matrixD(matrix([[2,2],[1,5],[5,2]])) 
       







def area(raio): areaCirc = pi * raio^2 show('A área vale: ', n(areaCirc) ) 
       
area(2.1) 
       

Calculo das raízes de uma função do segundo grau

def raiz(a,b,c): d=(b^2)-(4*a*c) if d<0: print('Delta negativo, raiz real impossivel de ser extraida.') else: print ('Delta: %f' % d) m1 = sqrt(d) x1 = (-b+m1)/(2*a) x2 = (-b-m1)/(2*a) show('Raiz X1 = %f' % x1) show('Raiz X2 = %f' % x2) 
       
raiz(-2,4,15) 
       
Delta: 136.000000

Delta: 136.000000

Função mais complexa

def bissec(funcao,a,b,tol): # Metodo da Bisseccao # Calcula uma aproximação para uma raiz da função de f(x) # Entre os intervalo [ao,bo] e a tolerencia de erro dado por tol. x = 1 ao = a bo = b tol = tol interacao = 0 show("f(x)=",funcao) g = funcao if (g(ao)*g(bo)<0): while (abs(bo-ao) > tol) & (interacao<10000000): x=(ao+bo)/2 interacao = interacao+1 if g(x)*g(ao) > 0: ao=x else: bo=x show("Interacoes: ",interacao) show("Valor da raiz: ",n(x) ) show("Valor de f(x)= ",round(g(x),8)," com erro menor que ",tol) else: show("Não há raízes no intervalo, defina outro intervalo") 
       
bissec(x^2-2*x,-1,1,0.00001) 
       



%%% FIM PROGRAMAÇÃO BÁSICA %%%