yangbongsoo / blockStudy

1 stars 0 forks source link

python-while&function #31

Closed yangbongsoo closed 1 year ago

yangbongsoo commented 1 year ago
# while

N = 10
sum = 0  # sum을 0으로 초기화
i = 1  # range 대신 counter i를 사용
while i <= N:
    sum = sum + i  # sum을 누적(accumulation)
    i = i + 1  # counter 1 증가

print("The sum is", sum)  # 출력 : The sum is 55

number = 1234
sum = 0
while number > 0:
    digit = number % 10
    sum = sum + digit
    number = number // 10

print("자리수의 합은 %d입니다." % sum)

# function
def functionName(n, l):
    print(n)
    print(l)
    return l

num = 10
list = [1, 2, 3, 4]

functionName(num, list)

def get_sum(start, end):
    sum = 0
    for i in range(start, end + 1):
        sum += i
    return sum

sum1 = get_sum(1, 10)
sum2 = get_sum(20, 30)
print(sum1, sum2)

# 함수에 return 이 없다고 반환값이 없는게 아니다 기본적으로 None 을 리턴한다.

# function2

# p11 참조 copy(주소값 넘김), shallow copy, deep copy

def func(p1, p2, L):
    sum = p1 + p2
    p1 += 4
    L[0] += 2
    return p1, sum

x = 1
y = 2
sq = [4, 1, 1]
x, hap = func(x, y, sq)
print(x, hap, sq)  # 5 3 [6,1,1]

while-problem1

# 임의의 정수들 입력받아 합계와 평균 계산해 출력
# 0 입력되면 더이상 입력 안받고 결과 출력, 출력 시 입력받은 정수들도 함께 출력
# while 사용, 입력받은 값은 리스트에 저장, 입력문은 한번 사용
list = []
sum = 0
while True:
    num = int(input("정수를 입력 (0을 입력하면 종료) : "))
    if num == 0:
        print("입력한 정수 리스트 : {}".format(list))
        print("합계 : {}".format(sum))
        if len(list) == 0:
            print("평균 : 0")
        else:
            print("평균 : {}".format(sum / len(list)))
        break
    sum += num
    list.append(num)

while-problem2

# 구하려는 소수의 갯수를 입력받아, 소수 구하기

def isPrime(num):
    primeChk = True
    k = 2
    while k < num :
        if num % k == 0:
            primeChk = False
            break
        k = k + 1
    if primeChk:
        return True
    else:
        return False

primeCount = int(input("구하려는 소수의 개수를 입력 :"))
fulfilledCount = 0
increaseCount = 1
while True:
    increaseCount += 1
    if fulfilledCount == primeCount:
        print("{} 개의 소수를 찾았습니다".format(fulfilledCount))
        break

    if isPrime(increaseCount):
        print(increaseCount)
        fulfilledCount += 1

while-problem3

# 여러 갯수의 정수 입력 받아, 각 수가 양수인지 음수인지 구하여 각각의 갯수 출력

# 입력으로부터 정수 리스트로 변환하는 것은 한 줄 코드로 작성
# list comprehension 써라
list = [int(x) for x in input("정수들을 입력 : \n").split()]

# 입력 받은 값 중 0은 무시
negativeCount = 0
positiveCount = 0
loopCount = 0
sum = 0

if len(list) == 0:
    print("입력한 숫자가 없습니다")
else:
    while loopCount < len(list):
        if list[loopCount] > 0:
            positiveCount += 1
        elif list[loopCount] < 0:
            negativeCount += 1
        else:
            loopCount += 1
            continue

        sum += list[loopCount]
        loopCount += 1

print("양수: {} 개, 음수 : {} 개, 합계 : {}".format(positiveCount, negativeCount, sum))

function-problem1

import re

# 사용자로부터 패스워드를 입력 받아 유효한 패스워드인지 검사

# 패스워드 유효성 검사 기능은 함수로 구현 할 것
def validatePassword(password):
    # 패스워드는 최소한 8자리 이상, 8자리 미만이면 False 반환
    if len(password) < 8:
        print("error! 8 글자 이상이어야 함")
        return False

    # 영문자, 숫자를 제외한 다른 문자가 있으면 False 반환
    if not password.isalnum():
        print("error! 영문자, 숫자로만 구성되어야 함")
        return False

    # 영문자로만 구성되었으면 False 반환
    if password.isalpha():
        print("error! 숫자도 포함되어야 함")
        return False

    # 숫자로만 구성되었으면 False 반환
    if password.isdecimal():
        print("error! 영문도 포함되어야 함")
        return False

    numList = re.findall(r'\d', password)
    if len(numList) < 2:
        print("error! 최소한 2개의 숫자를 포함해야 함")
        return False

    return True

# 총 5번의 패스워드 유효성 검사, 유효하면 종료함.
opportunityCount = 5
while opportunityCount > 0:
    password = input("Enter password: ")
    if validatePassword(password):
        print("Valid password")
        break
    else:
        print("Invalid password")

    opportunityCount -= 1

function-problem2

def calculateStringCount(string):
    dictionary = dict()
    # 대소문자 구분을 하지 않음
    stringList = list(string.lower())

    for i in range(len(stringList)):
        # 빈칸 무시
        if stringList[i] == ' ':
            continue
        if stringList[i] in dictionary:
            count = dictionary.get(stringList[i])
            count += 1
            dictionary[stringList[i]] = count
        else:
            dictionary[stringList[i]] = 1

    # 반환 받은 문자의 개수 정보는 메인에서 출력할 것
    return dictionary

# 메인에서 입력 받은 문자열을 넘겨
dictionary = calculateStringCount(input("문자열 입력 : "))
for key, value in dictionary.items():
    print("{} : {}".format(key, value))

function-problem3


def plus(num1, num2):
    return num1 + num2

def minus(num1, num2):
    return num1 - num2

def mul(num1, num2):
    return num1 * num2

def div(num1, num2):
    return num1 / num2

str = input("수식 입력(예: 20 * 40) : ")
n1, exp, n2 = str.split()
n1 = float(n1)
n2 = float(n2)

# 메인에서는 연산자에 따라 함수를 호출한다.
# 계산 결과를 반환 받아 출력한다.

if exp == "+":
    result = plus(n1, n2)
    print("%.6f + %.6f = %.6f" % (n1, n2, result))
elif exp == "-":
    result = minus(n1, n2)
    print("%.6f - %.6f = %.6f" % (n1, n2, result))
elif exp == "*":
    result = mul(n1, n2)
    print("%.6f * %.6f = %.6f" % (n1, n2, result))
elif exp == "/":
    if n2 == 0:
        print("%.6f 로 나누기를 수행할 수 없습니다." % n2)
    else:
        result = div(n1, n2)
        print("{} / {} = {}".format(n1, n2, result))
else:
    print("{} 지원하지 않는 연산자입니다.".format(exp))

function-problem4

import random

# 동전 던지기 횟수를 입력 받아, 정해진 횟수마다 앞면이 나온 확률 출력
# 함수는 던지기 횟수를 인수로 받으며, 앞면이 나온 횟수를 반환
def calculateCoinFrontCount(eachCount):
    coinFrontCount = 0
    for _ in range(eachCount):
        # 동전 던지기는 random 모듈의 randint() 함수를 사용하여 0이면 앞면이고 1이면 뒷면이다
        result = random.randint(0, 1)
        if result == 0:  # 앞면
            coinFrontCount += 1

    return coinFrontCount

count = int(input("동전 던지기 시도 횟수를 입력(1 - 100) : "))

totalCoinFrontCount = 0
lastProb = 0
for eachCount in range(1, count + 1):
    # 1~10 회까지는 매 횟수마다 출력하고, 11~100회는 10단위마다 출력
    coinFrontCount = calculateCoinFrontCount(eachCount)
    prob = round((coinFrontCount / eachCount) * 100)

    if eachCount == count:
        lastProb = prob

    if eachCount <= 10:
        print("{} 번째까지 던지기에서 앞면이 나온 확률 : {}%".format(eachCount, prob))
    else:
        if eachCount % 10 == 0:
            print("{} 번째까지 던지기에서 앞면이 나온 확률 : {}%".format(eachCount, prob))
        else:
            continue

# 마지막 총 ~번 던지기의 확률 출력은 메인에서 한다
print()
print("***********************************************")
print("총 {}번 동전 던지기에서 앞면이 나올 확률 : {}%".format(count, lastProb))