From 7ab0c16302caaaf542d594bf95a64b0b661afc3a Mon Sep 17 00:00:00 2001 From: longlivedrgn Date: Tue, 20 Dec 2022 10:17:47 +0900 Subject: [PATCH 1/4] feat: add all the algorithm --- main.swift | 218 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 218 insertions(+) create mode 100644 main.swift diff --git a/main.swift b/main.swift new file mode 100644 index 0000000..e5d1923 --- /dev/null +++ b/main.swift @@ -0,0 +1,218 @@ +// +// main.swift +// MyCreditManager_kimye9808 +// +// Created by 김용재 on 2022/12/06. +// + +import Foundation + +// 이름, subject, 성적을 튜플을 넣어주는 리스트 +var temp : [(String,String,String)] = [("","","")] + +// 이름 추가 삭제용 리스트 +var name: [String] = [] + +// 이름이 존재하는 지 확인해보는 함수 +func checkIsIn(temp: [(String,String,String)], findingA: String, findingB: String) -> Bool { + let count = temp.count + var find = false + for i in 0...(count-1){ + if temp[i].0 == findingA && temp[i].1 == findingB{ + find = true + } else { + continue + } + } + return find +} + +// 이름이 존재한다면, 리스트 중에서 몇번째 인지 index를 알려주는 함수 +func checkTheIndex(temp: [(String,String,String)], findingA: String, findingB: String) -> Int{ + let count = temp.count + var index = 0 + for i in 0...(count-1){ + if temp[i].0 == findingA && temp[i].1 == findingB { + break + } else { + index += 1 + } + } + return index +} + +// score과 subject를 던지는 함수 +func calculateScore(temp: [(String,String,String)], who: String) -> ([String],[String]) { + let count = temp.count + var subject: [String] = [] + var score: [String] = [] + for i in 0...(count-1){ + if temp[i].0 == who{ + subject.append(temp[i].1) + score.append(temp[i].2) + } else { + continue + } + } + return (subject, score) +} + +// 성적의 총합을 계산해주는 함수 +func sumtheScore(scores:[String]) -> Double{ + var sum: Double = 0 + for i in 0...(scores.count-1){ + if scores[i] == "A+"{ + sum += 4.5 + } else if scores[i] == "A0"{ + sum += 4 + } else if scores[i] == "B+"{ + sum += 3.5 + } else if scores[i] == "B0"{ + sum += 3 + } else if scores[i] == "C+"{ + sum += 2.5 + } else if scores[i] == "C0"{ + sum += 2 + } else if scores[i] == "D+"{ + sum += 1.5 + } else if scores[i] == "D0"{ + sum += 1 + } else { + sum += 0 + } + } + return sum +} + +// 같은 말하는 함수 따로 빼주기 +func macro(){ + print("원하는 기능을 입력해주세요") + print("1: 학생추가, 2: 학생삭제, 3: 성적추가(변경), 4: 성적삭제, 5: 평점보기, X: 종료") +} + +print("----------------------") +macro() +print("----------------------") + +var input = readLine()! + +while input != "X" { + + if input == "1" { + print("추가할 학생의 이름을 입력해주세요!") + input = readLine()! + if name.contains(input){ + print("\(input)는 이미 존재하는 이름입니다. 추가하지 않습니다.") + } else { + name.append(input) + print("추가합니다!") + } + print("----------------------") + macro() + print("----------------------") + + + } else if input == "2"{ + print("삭제할 학생의 이름을 입력해주세요!") + input = readLine()! + if name.contains(input){ + if let firstIndex = name.firstIndex(of: input) { + name.remove(at: firstIndex) + } + print("\(input)를 삭제합니다!") + } else { + print("\(input) 학생을 찾지못했습니다!") + } + print("----------------------") + macro() + print("----------------------") + + } else if input == "3"{ + print("성적을 추가할 학생의 이름, 과목 이름, 성적(A+, A0, F 등)을 띄어쓰기로 구분하여 차례로 작성해주세요.") + print("입력예) Mickey Swift A+") + print("만약에 학생의 성적 중 해당 과목이 존재하면 기존 점수가 갱신됩니다.") + let add = readLine()!.components(separatedBy:" ") + + // 이름이 존재하는 지 확인하고, 입력 예처럼 작성했는 지 확인, 그리고 추가하는건지 변경하는것인지 확인하기 (추가할 경우) + if add.count == 3 && name.contains(add[0]) && !checkIsIn(temp: temp, findingA: add[0], findingB: add[1]){ + print("\(add[0])학생의 \(add[1]) 과목이 \(add[2])로 추가되었습니다.") + temp.append((add[0],add[1],add[2])) + + // 입력 예처럼 작성했는 지 확인하고, 추가하는것인지 변경하는 것인지 확인하기 (변경할 경우) + } else if add.count == 3 && checkIsIn(temp: temp, findingA: add[0], findingB: add[1]){ + temp.remove(at: checkTheIndex(temp: temp, findingA: add[0], findingB: add[1])) + temp.append((add[0],add[1],add[2])) + print("\(add[0])학생의 \(add[1]) 과목이 \(add[2])로 변경되었습니다.") + } + // 변경도 아니고 추가도 아닌 잘못된 입력이 들어왔을 경우 + else { + print("입력이 잘못되었습니다. 다시 확인해주십시요") + print("추가가 안된 학생일 수 있습니다!") + } + print("----------------------") + macro() + print("----------------------") + + + } else if input == "4"{ + print("성적을 삭제할 학생의 이름, 과목 이름을 띄어쓰기로 구분하여 차례로 작성해주세요.") + print("입력예) Mickey Swift") + let add = readLine()!.components(separatedBy:" ") + + // 입력예처럼 작성했는지 확인하고, 해당 학생이 과목을 수강했는지 확인하기(수강했을 경우) -> 삭제 가능 + if add.count == 2 && checkIsIn(temp: temp, findingA: add[0], findingB: add[1]){ + print("\(add[0])학생의 \(add[1])과목이 삭제되었습니다.") + temp.remove(at: checkTheIndex(temp: temp, findingA: add[0], findingB: add[1])) + + // 입력예처럼 작성했는 지 확인하고, 해당 과목을 수강했는지 확인하기(수강안했을 경우) -> 삭제 불가능 + } else if add.count == 2 && !checkIsIn(temp: temp, findingA: add[0], findingB: add[1]){ + print("\(add[0])학생은 \(add[1])과목을 수강하지 않습니다!") + + // 입력예처럼 작성했는 지 확인하고, 이름 리스트에 있는 지 확인하기 + } else if add.count == 2 && !name.contains(add[0]){ + print("\(add[0])이라는 학생은 존재하지 않습니다.") + } else { + print("입력이 잘못되었습니다! 다시 확인부탁드리겠습니다.") + } + print("----------------------") + macro() + print("----------------------") + + + } else if input == "5"{ + print("평점을 알고싶은 학생의 이름을 입력해주세요.") + input = readLine()! + // 이름 리스트에 있을 경우만 평점을 계산할 수 있다. + if name.contains(input){ + var subjects : [String] = [] + var scores : [String] = [] + var sum : Double = 0 + var mid : Double = 0 + (subjects, scores) = calculateScore(temp: temp, who: input) + sum = sumtheScore(scores: scores) + mid = sum/Double(subjects.count) + print("----------------------") + print("!!\(input)!!") + for i in 0...(subjects.count-1){ + print("\(subjects[i]) : \(scores[i])") + } + print("평점 :\(String(format: "%.2f",mid))") + + } else if !name.contains(input) { + print("\(input)학생은 존재하지 않습니다.") + } else { + print("입력이 잘못되었습니다! 다시 확인부탁드리겠습니다.") + } + print("----------------------") + macro() + print("----------------------") + } else { + print("----------------------") + print("뭔가 입력이 잘못되었습니다. 1~5 사이의 숫자 혹은 X를 입력해주세요!") + macro() + print("----------------------") + + } + input = readLine()! +} +print("프로그램을 종료합니다....") From 6608e977c51fbcd76a869dd350b16b3fd5b24907 Mon Sep 17 00:00:00 2001 From: longlivedrgn Date: Tue, 20 Dec 2022 10:48:01 +0900 Subject: [PATCH 2/4] fix: fix the naming --- main.swift | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/main.swift b/main.swift index e5d1923..0eb3236 100644 --- a/main.swift +++ b/main.swift @@ -14,7 +14,7 @@ var temp : [(String,String,String)] = [("","","")] var name: [String] = [] // 이름이 존재하는 지 확인해보는 함수 -func checkIsIn(temp: [(String,String,String)], findingA: String, findingB: String) -> Bool { +func checkName(temp: [(String,String,String)], findingA: String, findingB: String) -> Bool { let count = temp.count var find = false for i in 0...(count-1){ @@ -28,7 +28,7 @@ func checkIsIn(temp: [(String,String,String)], findingA: String, findingB: Strin } // 이름이 존재한다면, 리스트 중에서 몇번째 인지 index를 알려주는 함수 -func checkTheIndex(temp: [(String,String,String)], findingA: String, findingB: String) -> Int{ +func checkIndex(temp: [(String,String,String)], findingA: String, findingB: String) -> Int{ let count = temp.count var index = 0 for i in 0...(count-1){ @@ -58,7 +58,7 @@ func calculateScore(temp: [(String,String,String)], who: String) -> ([String],[S } // 성적의 총합을 계산해주는 함수 -func sumtheScore(scores:[String]) -> Double{ +func sum(scores:[String]) -> Double{ var sum: Double = 0 for i in 0...(scores.count-1){ if scores[i] == "A+"{ @@ -139,8 +139,8 @@ while input != "X" { temp.append((add[0],add[1],add[2])) // 입력 예처럼 작성했는 지 확인하고, 추가하는것인지 변경하는 것인지 확인하기 (변경할 경우) - } else if add.count == 3 && checkIsIn(temp: temp, findingA: add[0], findingB: add[1]){ - temp.remove(at: checkTheIndex(temp: temp, findingA: add[0], findingB: add[1])) + } else if add.count == 3 && checkName(temp: temp, findingA: add[0], findingB: add[1]){ + temp.remove(at: checkIndex(temp: temp, findingA: add[0], findingB: add[1])) temp.append((add[0],add[1],add[2])) print("\(add[0])학생의 \(add[1]) 과목이 \(add[2])로 변경되었습니다.") } @@ -160,12 +160,12 @@ while input != "X" { let add = readLine()!.components(separatedBy:" ") // 입력예처럼 작성했는지 확인하고, 해당 학생이 과목을 수강했는지 확인하기(수강했을 경우) -> 삭제 가능 - if add.count == 2 && checkIsIn(temp: temp, findingA: add[0], findingB: add[1]){ + if add.count == 2 && checkName(temp: temp, findingA: add[0], findingB: add[1]){ print("\(add[0])학생의 \(add[1])과목이 삭제되었습니다.") - temp.remove(at: checkTheIndex(temp: temp, findingA: add[0], findingB: add[1])) + temp.remove(at: checkIndex(temp: temp, findingA: add[0], findingB: add[1])) // 입력예처럼 작성했는 지 확인하고, 해당 과목을 수강했는지 확인하기(수강안했을 경우) -> 삭제 불가능 - } else if add.count == 2 && !checkIsIn(temp: temp, findingA: add[0], findingB: add[1]){ + } else if add.count == 2 && !checkName(temp: temp, findingA: add[0], findingB: add[1]){ print("\(add[0])학생은 \(add[1])과목을 수강하지 않습니다!") // 입력예처럼 작성했는 지 확인하고, 이름 리스트에 있는 지 확인하기 @@ -189,7 +189,7 @@ while input != "X" { var sum : Double = 0 var mid : Double = 0 (subjects, scores) = calculateScore(temp: temp, who: input) - sum = sumtheScore(scores: scores) + sum = sum(scores: scores) mid = sum/Double(subjects.count) print("----------------------") print("!!\(input)!!") From 4931b26cffb7145d5b7d5742aeca3ab6e337b733 Mon Sep 17 00:00:00 2001 From: longlivedrgn Date: Tue, 20 Dec 2022 10:51:24 +0900 Subject: [PATCH 3/4] fix: fix the sumScore code --- main.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/main.swift b/main.swift index 0eb3236..d146316 100644 --- a/main.swift +++ b/main.swift @@ -58,7 +58,7 @@ func calculateScore(temp: [(String,String,String)], who: String) -> ([String],[S } // 성적의 총합을 계산해주는 함수 -func sum(scores:[String]) -> Double{ +func sumScore(scores:[String]) -> Double{ var sum: Double = 0 for i in 0...(scores.count-1){ if scores[i] == "A+"{ @@ -189,7 +189,7 @@ while input != "X" { var sum : Double = 0 var mid : Double = 0 (subjects, scores) = calculateScore(temp: temp, who: input) - sum = sum(scores: scores) + sum = sumScore(scores: scores) mid = sum/Double(subjects.count) print("----------------------") print("!!\(input)!!") From 6ff0377f9664dae81c442f10ca42ad476f8993a9 Mon Sep 17 00:00:00 2001 From: longlivedrgn Date: Tue, 31 Jan 2023 10:04:06 +0900 Subject: [PATCH 4/4] =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contactManager.xcodeproj/project.pbxproj | 299 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../UserInterfaceState.xcuserstate | Bin 0 -> 18411 bytes .../xcschemes/xcschememanagement.plist | 14 + contactManager/AddContactFunction.swift | 44 +++ contactManager/CheckErrorFunction.swift | 36 +++ contactManager/FindContactFuction.swift | 10 + contactManager/main.swift | 89 ++++++ main.swift | 218 ------------- 10 files changed, 507 insertions(+), 218 deletions(-) create mode 100644 contactManager.xcodeproj/project.pbxproj create mode 100644 contactManager.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 contactManager.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 contactManager.xcodeproj/project.xcworkspace/xcuserdata/longlivedrgn.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 contactManager.xcodeproj/xcuserdata/longlivedrgn.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 contactManager/AddContactFunction.swift create mode 100644 contactManager/CheckErrorFunction.swift create mode 100644 contactManager/FindContactFuction.swift create mode 100644 contactManager/main.swift delete mode 100644 main.swift diff --git a/contactManager.xcodeproj/project.pbxproj b/contactManager.xcodeproj/project.pbxproj new file mode 100644 index 0000000..1f8e86e --- /dev/null +++ b/contactManager.xcodeproj/project.pbxproj @@ -0,0 +1,299 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 56; + objects = { + +/* Begin PBXBuildFile section */ + 8733744F295C3295000EAC23 /* CheckErrorFunction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8733744E295C3295000EAC23 /* CheckErrorFunction.swift */; }; + 87C3EE1D295D5ABF00A76712 /* FindContactFuction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87C3EE1C295D5ABF00A76712 /* FindContactFuction.swift */; }; + D9D3AEFD29597A7B0031A2F2 /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = D9D3AEFC29597A7B0031A2F2 /* main.swift */; }; + D9E15C03295C312C003FB06D /* AddContactFunction.swift in Sources */ = {isa = PBXBuildFile; fileRef = D9E15C02295C312C003FB06D /* AddContactFunction.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + D9D3AEF729597A7B0031A2F2 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 8733744E295C3295000EAC23 /* CheckErrorFunction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckErrorFunction.swift; sourceTree = ""; }; + 87C3EE1C295D5ABF00A76712 /* FindContactFuction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FindContactFuction.swift; sourceTree = ""; }; + D9D3AEF929597A7B0031A2F2 /* contactManager */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = contactManager; sourceTree = BUILT_PRODUCTS_DIR; }; + D9D3AEFC29597A7B0031A2F2 /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = ""; }; + D9E15C02295C312C003FB06D /* AddContactFunction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddContactFunction.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + D9D3AEF629597A7B0031A2F2 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + D9D3AEF029597A7B0031A2F2 = { + isa = PBXGroup; + children = ( + D9D3AEFB29597A7B0031A2F2 /* contactManager */, + D9D3AEFA29597A7B0031A2F2 /* Products */, + ); + sourceTree = ""; + }; + D9D3AEFA29597A7B0031A2F2 /* Products */ = { + isa = PBXGroup; + children = ( + D9D3AEF929597A7B0031A2F2 /* contactManager */, + ); + name = Products; + sourceTree = ""; + }; + D9D3AEFB29597A7B0031A2F2 /* contactManager */ = { + isa = PBXGroup; + children = ( + D9D3AEFC29597A7B0031A2F2 /* main.swift */, + D9E15C02295C312C003FB06D /* AddContactFunction.swift */, + 8733744E295C3295000EAC23 /* CheckErrorFunction.swift */, + 87C3EE1C295D5ABF00A76712 /* FindContactFuction.swift */, + ); + path = contactManager; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + D9D3AEF829597A7B0031A2F2 /* contactManager */ = { + isa = PBXNativeTarget; + buildConfigurationList = D9D3AF0029597A7B0031A2F2 /* Build configuration list for PBXNativeTarget "contactManager" */; + buildPhases = ( + D9D3AEF529597A7B0031A2F2 /* Sources */, + D9D3AEF629597A7B0031A2F2 /* Frameworks */, + D9D3AEF729597A7B0031A2F2 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = contactManager; + productName = contactManager; + productReference = D9D3AEF929597A7B0031A2F2 /* contactManager */; + productType = "com.apple.product-type.tool"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + D9D3AEF129597A7B0031A2F2 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastSwiftUpdateCheck = 1420; + LastUpgradeCheck = 1420; + TargetAttributes = { + D9D3AEF829597A7B0031A2F2 = { + CreatedOnToolsVersion = 14.2; + }; + }; + }; + buildConfigurationList = D9D3AEF429597A7B0031A2F2 /* Build configuration list for PBXProject "contactManager" */; + compatibilityVersion = "Xcode 14.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = D9D3AEF029597A7B0031A2F2; + productRefGroup = D9D3AEFA29597A7B0031A2F2 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + D9D3AEF829597A7B0031A2F2 /* contactManager */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + D9D3AEF529597A7B0031A2F2 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + D9E15C03295C312C003FB06D /* AddContactFunction.swift in Sources */, + D9D3AEFD29597A7B0031A2F2 /* main.swift in Sources */, + 8733744F295C3295000EAC23 /* CheckErrorFunction.swift in Sources */, + 87C3EE1D295D5ABF00A76712 /* FindContactFuction.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + D9D3AEFE29597A7B0031A2F2 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 13.1; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + D9D3AEFF29597A7B0031A2F2 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 13.1; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Release; + }; + D9D3AF0129597A7B0031A2F2 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + MACOSX_DEPLOYMENT_TARGET = 13.0; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + }; + name = Debug; + }; + D9D3AF0229597A7B0031A2F2 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + MACOSX_DEPLOYMENT_TARGET = 13.0; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + D9D3AEF429597A7B0031A2F2 /* Build configuration list for PBXProject "contactManager" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + D9D3AEFE29597A7B0031A2F2 /* Debug */, + D9D3AEFF29597A7B0031A2F2 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + D9D3AF0029597A7B0031A2F2 /* Build configuration list for PBXNativeTarget "contactManager" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + D9D3AF0129597A7B0031A2F2 /* Debug */, + D9D3AF0229597A7B0031A2F2 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = D9D3AEF129597A7B0031A2F2 /* Project object */; +} diff --git a/contactManager.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/contactManager.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/contactManager.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/contactManager.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/contactManager.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/contactManager.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/contactManager.xcodeproj/project.xcworkspace/xcuserdata/longlivedrgn.xcuserdatad/UserInterfaceState.xcuserstate b/contactManager.xcodeproj/project.xcworkspace/xcuserdata/longlivedrgn.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..31a1f37202c3371cf91d5510f218f9b34a747a08 GIT binary patch literal 18411 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 CEKR@w literal 0 HcmV?d00001 diff --git a/contactManager.xcodeproj/xcuserdata/longlivedrgn.xcuserdatad/xcschemes/xcschememanagement.plist b/contactManager.xcodeproj/xcuserdata/longlivedrgn.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..b43cf80 --- /dev/null +++ b/contactManager.xcodeproj/xcuserdata/longlivedrgn.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,14 @@ + + + + + SchemeUserState + + contactManager.xcscheme_^#shared#^_ + + orderHint + 0 + + + + diff --git a/contactManager/AddContactFunction.swift b/contactManager/AddContactFunction.swift new file mode 100644 index 0000000..8ae5cd9 --- /dev/null +++ b/contactManager/AddContactFunction.swift @@ -0,0 +1,44 @@ +func addContact(){ + var isAddContactError: Bool = false + + while !isAddContactError { + print("") + print("연락처 정보를 입력해주세요: ", terminator: "") + + guard let input = readLine(), input != "" else { + print("아무것도 입력되지 않았습니다. 입력 형식을 확인해주세요.") + continue + } + + guard Validation.validateInputBySlash(input: input) else { + print("입력된 정보가 [이름]/[나이]/[전화번호] 형식인지 확인해주세요") + continue + } + + let seperatedInput = input.components(separatedBy:"/") + + let trimSet = seperatedInput.map { + $0.trimmingCharacters(in: [" "]) + } + + let trimName = trimSet[0] + let trimAge = trimSet[1] + let trimNum = trimSet[2] + + let zeroBlankName = trimName.components(separatedBy: [" "]).joined() + + guard errorCheck(trimName: trimName, trimAge: trimAge, trimNum: trimNum) else { + continue + } + + isAddContactError = true + print("입력한 정보는 \(trimAge)세 \(zeroBlankName)(\(trimNum))입니다.\n") + + let contact = Contact(name: zeroBlankName, age: trimAge, phoneNumber: trimNum) + + contacts.insert(contact) + } + +} + + diff --git a/contactManager/CheckErrorFunction.swift b/contactManager/CheckErrorFunction.swift new file mode 100644 index 0000000..05a7d8f --- /dev/null +++ b/contactManager/CheckErrorFunction.swift @@ -0,0 +1,36 @@ +func checkNameError(name: String) -> Bool{ + guard name.range(of: regex, options: .regularExpression) != nil else { + errorTextOutput(with: .name) + return false + } + return true +} + + +func checkAgeError(age: String) -> Bool{ + guard age.allSatisfy({ $0.isNumber}) else { + errorTextOutput(with: .age) + return false + } + guard let changeToInt = Int(age), changeToInt <= 1000 else { + errorTextOutput(with: .age) + return false + } + return true +} + +func checkPhoneNumError(num: String) -> Bool { + guard Validation.validateInputByHyphenNum(input: num), num.components(separatedBy: ["-"]).joined().count >= 9 else { + errorTextOutput(with: .phoneNumber) + return false + } + return true +} + + +func errorCheck(trimName: String, trimAge: String, trimNum: String) -> Bool { + guard checkNameError(name: trimName), checkAgeError(age: trimAge), checkPhoneNumError(num: trimNum) else { + return false + } + return true +} diff --git a/contactManager/FindContactFuction.swift b/contactManager/FindContactFuction.swift new file mode 100644 index 0000000..d482a65 --- /dev/null +++ b/contactManager/FindContactFuction.swift @@ -0,0 +1,10 @@ +func findContact(inputName : String){ + var filteredContacts = contacts.filter { Contact in Contact.name == inputName } + if filteredContacts.count > 0 { + filteredContacts.forEach { print($0.description) } + } else { + print("연락처에 \(inputName) 이(가) 없습니다.\n") + } +} + + diff --git a/contactManager/main.swift b/contactManager/main.swift new file mode 100644 index 0000000..660a67a --- /dev/null +++ b/contactManager/main.swift @@ -0,0 +1,89 @@ +import Foundation + +struct Contact : Hashable { + let name : String + let age : String + let phoneNumber : String + + var description: String { + "- \(self.name) / \(self.age) / \(self.phoneNumber)" + } +} + +enum ErrorType{ + case name + case age + case phoneNumber +} + +enum GuideText { + static let menu = "1) 연락처 추가 2) 연락처 목록보기 3) 연락처 검색 x) 종료" + static let selectMenu = "메뉴를 선택해주세요 : " +} + +enum MenuType: String { + case addContact = "1" + case viewContactList = "2" + case findContact = "3" + case exit = "x" +} + +struct Validation { + static func validateInputBySlash(input: String) -> Bool { + guard (input.filter{ $0 == "/" }.count == 2) else { + return false + } + return true + } + + static func validateInputByHyphenNum(input: String) -> Bool { + guard (input.filter { $0 == "-" }.count == 2) else { + return false + } + return true + } +} + +func errorTextOutput(with type: ErrorType){ + let errorText: String + switch type { + case .name: errorText = "이름" + case .age: errorText = "나이" + case .phoneNumber: errorText = "연락처" + } + print("입력한 \(errorText)정보가 잘못되었습니다. 입력 형식을 확인해주세요.") +} + +var contacts : Set = [] + +var isMenuInputError: Bool = false +let regex = "^[A-Za-z\\s]+$" + +while !isMenuInputError { + print(GuideText.menu) + print(GuideText.selectMenu,terminator: "") + guard let input = readLine(), let menu = MenuType(rawValue: input) else{ + print("선택이 잘못되었습니다. 확인 후 다시 입력해주세요.\n") + continue + } + switch menu{ + case .addContact: + addContact() + case .viewContactList: + for contact in contacts.sorted(by: {$0.name < $1.name}) { + print(contact.description) + } + print("") + continue + case .findContact: + print("연락처에서 찾을 이름을 입력해주세요 : ", terminator: "") + guard let inputValue = readLine() else { + continue + } + findContact(inputName: inputValue) + continue + case .exit: + isMenuInputError = true + print("\n[프로그램 종료]") + } +} diff --git a/main.swift b/main.swift deleted file mode 100644 index d146316..0000000 --- a/main.swift +++ /dev/null @@ -1,218 +0,0 @@ -// -// main.swift -// MyCreditManager_kimye9808 -// -// Created by 김용재 on 2022/12/06. -// - -import Foundation - -// 이름, subject, 성적을 튜플을 넣어주는 리스트 -var temp : [(String,String,String)] = [("","","")] - -// 이름 추가 삭제용 리스트 -var name: [String] = [] - -// 이름이 존재하는 지 확인해보는 함수 -func checkName(temp: [(String,String,String)], findingA: String, findingB: String) -> Bool { - let count = temp.count - var find = false - for i in 0...(count-1){ - if temp[i].0 == findingA && temp[i].1 == findingB{ - find = true - } else { - continue - } - } - return find -} - -// 이름이 존재한다면, 리스트 중에서 몇번째 인지 index를 알려주는 함수 -func checkIndex(temp: [(String,String,String)], findingA: String, findingB: String) -> Int{ - let count = temp.count - var index = 0 - for i in 0...(count-1){ - if temp[i].0 == findingA && temp[i].1 == findingB { - break - } else { - index += 1 - } - } - return index -} - -// score과 subject를 던지는 함수 -func calculateScore(temp: [(String,String,String)], who: String) -> ([String],[String]) { - let count = temp.count - var subject: [String] = [] - var score: [String] = [] - for i in 0...(count-1){ - if temp[i].0 == who{ - subject.append(temp[i].1) - score.append(temp[i].2) - } else { - continue - } - } - return (subject, score) -} - -// 성적의 총합을 계산해주는 함수 -func sumScore(scores:[String]) -> Double{ - var sum: Double = 0 - for i in 0...(scores.count-1){ - if scores[i] == "A+"{ - sum += 4.5 - } else if scores[i] == "A0"{ - sum += 4 - } else if scores[i] == "B+"{ - sum += 3.5 - } else if scores[i] == "B0"{ - sum += 3 - } else if scores[i] == "C+"{ - sum += 2.5 - } else if scores[i] == "C0"{ - sum += 2 - } else if scores[i] == "D+"{ - sum += 1.5 - } else if scores[i] == "D0"{ - sum += 1 - } else { - sum += 0 - } - } - return sum -} - -// 같은 말하는 함수 따로 빼주기 -func macro(){ - print("원하는 기능을 입력해주세요") - print("1: 학생추가, 2: 학생삭제, 3: 성적추가(변경), 4: 성적삭제, 5: 평점보기, X: 종료") -} - -print("----------------------") -macro() -print("----------------------") - -var input = readLine()! - -while input != "X" { - - if input == "1" { - print("추가할 학생의 이름을 입력해주세요!") - input = readLine()! - if name.contains(input){ - print("\(input)는 이미 존재하는 이름입니다. 추가하지 않습니다.") - } else { - name.append(input) - print("추가합니다!") - } - print("----------------------") - macro() - print("----------------------") - - - } else if input == "2"{ - print("삭제할 학생의 이름을 입력해주세요!") - input = readLine()! - if name.contains(input){ - if let firstIndex = name.firstIndex(of: input) { - name.remove(at: firstIndex) - } - print("\(input)를 삭제합니다!") - } else { - print("\(input) 학생을 찾지못했습니다!") - } - print("----------------------") - macro() - print("----------------------") - - } else if input == "3"{ - print("성적을 추가할 학생의 이름, 과목 이름, 성적(A+, A0, F 등)을 띄어쓰기로 구분하여 차례로 작성해주세요.") - print("입력예) Mickey Swift A+") - print("만약에 학생의 성적 중 해당 과목이 존재하면 기존 점수가 갱신됩니다.") - let add = readLine()!.components(separatedBy:" ") - - // 이름이 존재하는 지 확인하고, 입력 예처럼 작성했는 지 확인, 그리고 추가하는건지 변경하는것인지 확인하기 (추가할 경우) - if add.count == 3 && name.contains(add[0]) && !checkIsIn(temp: temp, findingA: add[0], findingB: add[1]){ - print("\(add[0])학생의 \(add[1]) 과목이 \(add[2])로 추가되었습니다.") - temp.append((add[0],add[1],add[2])) - - // 입력 예처럼 작성했는 지 확인하고, 추가하는것인지 변경하는 것인지 확인하기 (변경할 경우) - } else if add.count == 3 && checkName(temp: temp, findingA: add[0], findingB: add[1]){ - temp.remove(at: checkIndex(temp: temp, findingA: add[0], findingB: add[1])) - temp.append((add[0],add[1],add[2])) - print("\(add[0])학생의 \(add[1]) 과목이 \(add[2])로 변경되었습니다.") - } - // 변경도 아니고 추가도 아닌 잘못된 입력이 들어왔을 경우 - else { - print("입력이 잘못되었습니다. 다시 확인해주십시요") - print("추가가 안된 학생일 수 있습니다!") - } - print("----------------------") - macro() - print("----------------------") - - - } else if input == "4"{ - print("성적을 삭제할 학생의 이름, 과목 이름을 띄어쓰기로 구분하여 차례로 작성해주세요.") - print("입력예) Mickey Swift") - let add = readLine()!.components(separatedBy:" ") - - // 입력예처럼 작성했는지 확인하고, 해당 학생이 과목을 수강했는지 확인하기(수강했을 경우) -> 삭제 가능 - if add.count == 2 && checkName(temp: temp, findingA: add[0], findingB: add[1]){ - print("\(add[0])학생의 \(add[1])과목이 삭제되었습니다.") - temp.remove(at: checkIndex(temp: temp, findingA: add[0], findingB: add[1])) - - // 입력예처럼 작성했는 지 확인하고, 해당 과목을 수강했는지 확인하기(수강안했을 경우) -> 삭제 불가능 - } else if add.count == 2 && !checkName(temp: temp, findingA: add[0], findingB: add[1]){ - print("\(add[0])학생은 \(add[1])과목을 수강하지 않습니다!") - - // 입력예처럼 작성했는 지 확인하고, 이름 리스트에 있는 지 확인하기 - } else if add.count == 2 && !name.contains(add[0]){ - print("\(add[0])이라는 학생은 존재하지 않습니다.") - } else { - print("입력이 잘못되었습니다! 다시 확인부탁드리겠습니다.") - } - print("----------------------") - macro() - print("----------------------") - - - } else if input == "5"{ - print("평점을 알고싶은 학생의 이름을 입력해주세요.") - input = readLine()! - // 이름 리스트에 있을 경우만 평점을 계산할 수 있다. - if name.contains(input){ - var subjects : [String] = [] - var scores : [String] = [] - var sum : Double = 0 - var mid : Double = 0 - (subjects, scores) = calculateScore(temp: temp, who: input) - sum = sumScore(scores: scores) - mid = sum/Double(subjects.count) - print("----------------------") - print("!!\(input)!!") - for i in 0...(subjects.count-1){ - print("\(subjects[i]) : \(scores[i])") - } - print("평점 :\(String(format: "%.2f",mid))") - - } else if !name.contains(input) { - print("\(input)학생은 존재하지 않습니다.") - } else { - print("입력이 잘못되었습니다! 다시 확인부탁드리겠습니다.") - } - print("----------------------") - macro() - print("----------------------") - } else { - print("----------------------") - print("뭔가 입력이 잘못되었습니다. 1~5 사이의 숫자 혹은 X를 입력해주세요!") - macro() - print("----------------------") - - } - input = readLine()! -} -print("프로그램을 종료합니다....")