From fcaf485bd8bff2b7488cf7281f7619cf94578ab6 Mon Sep 17 00:00:00 2001 From: ohdair Date: Tue, 20 Dec 2022 10:15:58 +0900 Subject: [PATCH] =?UTF-8?q?Feat:=20=ED=95=99=EC=83=9D=20=EC=84=B1=EC=A0=81?= =?UTF-8?q?=20=EA=B4=80=EB=A6=AC=20=ED=94=84=EB=A1=9C=EA=B7=B8=EB=9E=A8=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 학생 추가 기능 추가 - 학생 삭제 기능 추가 - 학생 성적 반영 기능 추가 - 학생 성적 삭제 기능 추가 - 학생 성적 확인 기능 추가 - 프로그램 종료 기능 추가 --- GradeManagement.xcodeproj/project.pbxproj | 329 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../UserInterfaceState.xcuserstate | Bin 0 -> 62878 bytes .../xcdebugger/Breakpoints_v2.xcbkptlist | 24 ++ .../xcschemes/xcschememanagement.plist | 14 + GradeManagement/Modules/Modules.swift | 98 ++++++ GradeManagement/Utils/AddStudent.swift | 26 ++ GradeManagement/Utils/DeleteStudent.swift | 25 ++ GradeManagement/Utils/Exit.swift | 12 + GradeManagement/Utils/RemoveGrade.swift | 41 +++ GradeManagement/Utils/ReportCard.swift | 50 +++ GradeManagement/Utils/UpdateGrade.swift | 69 ++++ GradeManagement/main.swift | 35 ++ 14 files changed, 738 insertions(+) create mode 100644 GradeManagement.xcodeproj/project.pbxproj create mode 100644 GradeManagement.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 GradeManagement.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 GradeManagement.xcodeproj/project.xcworkspace/xcuserdata/bagjaeu.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 GradeManagement.xcodeproj/xcuserdata/bagjaeu.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist create mode 100644 GradeManagement.xcodeproj/xcuserdata/bagjaeu.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 GradeManagement/Modules/Modules.swift create mode 100644 GradeManagement/Utils/AddStudent.swift create mode 100644 GradeManagement/Utils/DeleteStudent.swift create mode 100644 GradeManagement/Utils/Exit.swift create mode 100644 GradeManagement/Utils/RemoveGrade.swift create mode 100644 GradeManagement/Utils/ReportCard.swift create mode 100644 GradeManagement/Utils/UpdateGrade.swift create mode 100644 GradeManagement/main.swift diff --git a/GradeManagement.xcodeproj/project.pbxproj b/GradeManagement.xcodeproj/project.pbxproj new file mode 100644 index 0000000..48a43e9 --- /dev/null +++ b/GradeManagement.xcodeproj/project.pbxproj @@ -0,0 +1,329 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 56; + objects = { + +/* Begin PBXBuildFile section */ + 904388E8294019B30042BDBF /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = 904388E7294019B30042BDBF /* main.swift */; }; + 904388EF29401B2A0042BDBF /* Modules.swift in Sources */ = {isa = PBXBuildFile; fileRef = 904388EE29401B2A0042BDBF /* Modules.swift */; }; + 904389062940748F0042BDBF /* AddStudent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 904389052940748F0042BDBF /* AddStudent.swift */; }; + 904389082940749D0042BDBF /* DeleteStudent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 904389072940749D0042BDBF /* DeleteStudent.swift */; }; + 9043890A2940752F0042BDBF /* UpdateGrade.swift in Sources */ = {isa = PBXBuildFile; fileRef = 904389092940752F0042BDBF /* UpdateGrade.swift */; }; + 9043890C2940753B0042BDBF /* RemoveGrade.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9043890B2940753B0042BDBF /* RemoveGrade.swift */; }; + 9043890E294075500042BDBF /* ReportCard.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9043890D294075500042BDBF /* ReportCard.swift */; }; + 90438913294075C00042BDBF /* Exit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90438912294075C00042BDBF /* Exit.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 904388E2294019B30042BDBF /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 904388E4294019B30042BDBF /* GradeManagement */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = GradeManagement; sourceTree = BUILT_PRODUCTS_DIR; }; + 904388E7294019B30042BDBF /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = ""; }; + 904388EE29401B2A0042BDBF /* Modules.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Modules.swift; sourceTree = ""; }; + 904389052940748F0042BDBF /* AddStudent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddStudent.swift; sourceTree = ""; }; + 904389072940749D0042BDBF /* DeleteStudent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeleteStudent.swift; sourceTree = ""; }; + 904389092940752F0042BDBF /* UpdateGrade.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpdateGrade.swift; sourceTree = ""; }; + 9043890B2940753B0042BDBF /* RemoveGrade.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RemoveGrade.swift; sourceTree = ""; }; + 9043890D294075500042BDBF /* ReportCard.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReportCard.swift; sourceTree = ""; }; + 90438912294075C00042BDBF /* Exit.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Exit.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 904388E1294019B30042BDBF /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 904388DB294019B30042BDBF = { + isa = PBXGroup; + children = ( + 904388E6294019B30042BDBF /* GradeManagement */, + 904388E5294019B30042BDBF /* Products */, + ); + sourceTree = ""; + }; + 904388E5294019B30042BDBF /* Products */ = { + isa = PBXGroup; + children = ( + 904388E4294019B30042BDBF /* GradeManagement */, + ); + name = Products; + sourceTree = ""; + }; + 904388E6294019B30042BDBF /* GradeManagement */ = { + isa = PBXGroup; + children = ( + 90438911294075630042BDBF /* Modules */, + 90438904294074750042BDBF /* Utils */, + 904388E7294019B30042BDBF /* main.swift */, + ); + path = GradeManagement; + sourceTree = ""; + }; + 90438904294074750042BDBF /* Utils */ = { + isa = PBXGroup; + children = ( + 904389052940748F0042BDBF /* AddStudent.swift */, + 904389072940749D0042BDBF /* DeleteStudent.swift */, + 904389092940752F0042BDBF /* UpdateGrade.swift */, + 9043890B2940753B0042BDBF /* RemoveGrade.swift */, + 9043890D294075500042BDBF /* ReportCard.swift */, + 90438912294075C00042BDBF /* Exit.swift */, + ); + path = Utils; + sourceTree = ""; + }; + 90438911294075630042BDBF /* Modules */ = { + isa = PBXGroup; + children = ( + 904388EE29401B2A0042BDBF /* Modules.swift */, + ); + path = Modules; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 904388E3294019B30042BDBF /* GradeManagement */ = { + isa = PBXNativeTarget; + buildConfigurationList = 904388EB294019B30042BDBF /* Build configuration list for PBXNativeTarget "GradeManagement" */; + buildPhases = ( + 904388E0294019B30042BDBF /* Sources */, + 904388E1294019B30042BDBF /* Frameworks */, + 904388E2294019B30042BDBF /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = GradeManagement; + productName = GradeManagement; + productReference = 904388E4294019B30042BDBF /* GradeManagement */; + productType = "com.apple.product-type.tool"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 904388DC294019B30042BDBF /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastSwiftUpdateCheck = 1400; + LastUpgradeCheck = 1400; + TargetAttributes = { + 904388E3294019B30042BDBF = { + CreatedOnToolsVersion = 14.0; + }; + }; + }; + buildConfigurationList = 904388DF294019B30042BDBF /* Build configuration list for PBXProject "GradeManagement" */; + compatibilityVersion = "Xcode 14.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 904388DB294019B30042BDBF; + productRefGroup = 904388E5294019B30042BDBF /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 904388E3294019B30042BDBF /* GradeManagement */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + 904388E0294019B30042BDBF /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 9043890E294075500042BDBF /* ReportCard.swift in Sources */, + 904389082940749D0042BDBF /* DeleteStudent.swift in Sources */, + 904388E8294019B30042BDBF /* main.swift in Sources */, + 904388EF29401B2A0042BDBF /* Modules.swift in Sources */, + 9043890C2940753B0042BDBF /* RemoveGrade.swift in Sources */, + 9043890A2940752F0042BDBF /* UpdateGrade.swift in Sources */, + 904389062940748F0042BDBF /* AddStudent.swift in Sources */, + 90438913294075C00042BDBF /* Exit.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 904388E9294019B30042BDBF /* 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 = 12.3; + 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; + }; + 904388EA294019B30042BDBF /* 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 = 12.3; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Release; + }; + 904388EC294019B30042BDBF /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + }; + name = Debug; + }; + 904388ED294019B30042BDBF /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 904388DF294019B30042BDBF /* Build configuration list for PBXProject "GradeManagement" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 904388E9294019B30042BDBF /* Debug */, + 904388EA294019B30042BDBF /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 904388EB294019B30042BDBF /* Build configuration list for PBXNativeTarget "GradeManagement" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 904388EC294019B30042BDBF /* Debug */, + 904388ED294019B30042BDBF /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 904388DC294019B30042BDBF /* Project object */; +} diff --git a/GradeManagement.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/GradeManagement.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/GradeManagement.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/GradeManagement.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/GradeManagement.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/GradeManagement.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/GradeManagement.xcodeproj/project.xcworkspace/xcuserdata/bagjaeu.xcuserdatad/UserInterfaceState.xcuserstate b/GradeManagement.xcodeproj/project.xcworkspace/xcuserdata/bagjaeu.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..01d2ab5ef19b30e5e438a3095a5005d78271bfdc GIT binary patch literal 62878 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 literal 0 HcmV?d00001 diff --git a/GradeManagement.xcodeproj/xcuserdata/bagjaeu.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/GradeManagement.xcodeproj/xcuserdata/bagjaeu.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist new file mode 100644 index 0000000..ce07c16 --- /dev/null +++ b/GradeManagement.xcodeproj/xcuserdata/bagjaeu.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -0,0 +1,24 @@ + + + + + + + + + diff --git a/GradeManagement.xcodeproj/xcuserdata/bagjaeu.xcuserdatad/xcschemes/xcschememanagement.plist b/GradeManagement.xcodeproj/xcuserdata/bagjaeu.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..0af47ad --- /dev/null +++ b/GradeManagement.xcodeproj/xcuserdata/bagjaeu.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,14 @@ + + + + + SchemeUserState + + GradeManagement.xcscheme_^#shared#^_ + + orderHint + 0 + + + + diff --git a/GradeManagement/Modules/Modules.swift b/GradeManagement/Modules/Modules.swift new file mode 100644 index 0000000..6ca0a4b --- /dev/null +++ b/GradeManagement/Modules/Modules.swift @@ -0,0 +1,98 @@ +// +// Modules.swift +// GradeManagement +// +// Created by 박재우 on 2022/12/07. +// + +import Foundation + +typealias Student = String + +class Management { + var students: [Student: [ReportCard]] = [:] +} + +struct ReportCard { + var subject: String + var grade: String +} + +enum Pattern: String { + case input = "^[0-9a-zA-Z+]*$" +} + +enum Score: Double { + case APlus = 4.5 + case AZero = 4.0 + case BPlus = 3.5 + case BZero = 3.0 + case CPlus = 2.5 + case CZero = 2.0 + case DPlus = 1.5 + case DZero = 1.0 + case F = 0.0 +} + +enum Grade: String { + case APlus = "A+" + case AZero = "A0" + case BPlus = "B+" + case BZero = "B0" + case CPlus = "C+" + case CZero = "C0" + case DPlus = "D+" + case DZero = "D0" + case F = "F" +} + +enum Commands: String { + case addStudent = "1" + case deleteStudent = "2" + case updateGrade = "3" + case removeGrade = "4" + case reportCard = "5" + case exit = "X" +} + +enum Errors: String { + case main = "뭔가 입력이 잘못되었습니다. 1~5 사이의 숫자 혹은 X를 입력해주세요." + case input = "입력이 잘못되었습니다. 다시 확인해주세요." + case containStudent = "은 이미 존재하는 학생입니다. 추가하지 않습니다." + case searchStudent = " 학생을 찾지 못했습니다." + case searchSubject = " 과목을 찾지 못했습니다." +} + +extension Errors { + func printSelf() { + print(self.rawValue) + } +} +enum Questions: String { + case main = "원하는 기능을 입력해주세요\n1: 학생추가, 2: 학생삭제, 3: 성적추가(변경), 4: 성적삭제, 5: 평점보기, X: 종료" + case addStudent = "추가할 학생의 이름을 입력해주세요." + case deleteStudent = "삭제할 학생의 이름을 입력해주세요" + case updateGrade = "성적을 추가할 학생의 이름, 과목 이름, 성적(A+, A0, F 등)을 띄어쓰기로 구분하여 차례로 작성해주세요." + case removeGrade = "성적을 삭제할 학생의 이름, 과목 이름을 띄어쓰기로 구분하여 차례로 작성해주세요." + case reportCard = "평점을 알고 싶은 학생의 이름을 입력해주세요" +} + +class Operations { + func addStudent(_ student: Student) { + print("\(student) 학생을 추가했습니다.") + } + func deleteStudent(_ student: Student) { + print("\(student) 학생을 삭제하였습니다.") + } + func updateGrade(_ reportCard: ReportCard, of student: Student) { + print("\(student) 학생의 \(reportCard.subject) 과목이 \(reportCard.grade)로 추가(변경)되었습니다.") + } + func removeGrade(_ subject: String, of student: Student) { + print("\(student) 학생의 \(subject) 과목의 성적이 삭제되었습니다.") + } + var exit: String { + return "프로그램을 종료합니다..." + } +} + + diff --git a/GradeManagement/Utils/AddStudent.swift b/GradeManagement/Utils/AddStudent.swift new file mode 100644 index 0000000..57d5962 --- /dev/null +++ b/GradeManagement/Utils/AddStudent.swift @@ -0,0 +1,26 @@ +// +// AddStudent.swift +// GradeManagement +// +// Created by 박재우 on 2022/12/07. +// + +import Foundation + +func addStudent() { + print(Questions.addStudent.rawValue) + guard let student = readLine() else { return } + guard let _ = student.range(of: Pattern.input.rawValue, options: .regularExpression), + student.isEmpty == false else { + print(Errors.input.rawValue) + return + } + let isContain = manager.contains { $0.key == student } + guard isContain == false else { + print(student, terminator: "") + Errors.containStudent.printSelf() + return + } + manager[student] = [] + Operations().addStudent(student) +} diff --git a/GradeManagement/Utils/DeleteStudent.swift b/GradeManagement/Utils/DeleteStudent.swift new file mode 100644 index 0000000..1b15f6e --- /dev/null +++ b/GradeManagement/Utils/DeleteStudent.swift @@ -0,0 +1,25 @@ +// +// DeleteStudent.swift +// GradeManagement +// +// Created by 박재우 on 2022/12/07. +// + +import Foundation + +func deleteStudent() { + print(Questions.deleteStudent.rawValue) + guard let student = readLine() else { return } + guard let _ = student.range(of: Pattern.input.rawValue, options: .regularExpression), + student.isEmpty == false else { + print(Errors.input.rawValue) + return + } + let isContain = manager.contains { $0.key == student } + guard isContain else { + print("\(student)\(Errors.searchStudent.rawValue)") + return + } + manager.removeValue(forKey: student) + Operations().deleteStudent(student) +} diff --git a/GradeManagement/Utils/Exit.swift b/GradeManagement/Utils/Exit.swift new file mode 100644 index 0000000..3341349 --- /dev/null +++ b/GradeManagement/Utils/Exit.swift @@ -0,0 +1,12 @@ +// +// Exit.swift +// GradeManagement +// +// Created by 박재우 on 2022/12/07. +// + +import Foundation + +func exit() { + print(Operations().exit) +} diff --git a/GradeManagement/Utils/RemoveGrade.swift b/GradeManagement/Utils/RemoveGrade.swift new file mode 100644 index 0000000..65ad8a3 --- /dev/null +++ b/GradeManagement/Utils/RemoveGrade.swift @@ -0,0 +1,41 @@ +// +// RemoveGrade.swift +// GradeManagement +// +// Created by 박재우 on 2022/12/07. +// + +import Foundation + +func removeGrade() { + print(Questions.removeGrade.rawValue) + guard let answer = readLine() else { return } + var inputs = answer.components(separatedBy: " ") + guard 2 == inputs.count else { + print(Errors.input.rawValue) + return + } + for input in inputs { + guard let _ = input.range(of: Pattern.input.rawValue, options: .regularExpression), + input.isEmpty == false else { + print(Errors.input.rawValue) + return + } + } + let student = inputs.removeFirst() + let isStudent = manager.contains { $0.key == student } + guard isStudent else { + print("\(student)\(Errors.searchStudent.rawValue)") + return + } + let subject = inputs.removeFirst() + guard let reports = manager[student] else {return} + for index in 0.. String? { + return readLine() +} + +var manager = Management().students +repeat { + print(Questions.main.rawValue) + guard let input = inputCommand() else { break } + switch Commands(rawValue: input) { + case .addStudent: + addStudent() + case .deleteStudent: + deleteStudent() + case .updateGrade: + updateGrade() + case .removeGrade: + removeGrade() + case .reportCard: + reportCard() + default: + print(Errors.main.rawValue) + } +} while input != Commands.exit.rawValue +