From d2818b244fdd9ce3cfcff99d3cd3c4753d117f87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BA=B7=E5=BB=BA=E4=BC=9F?= Date: Tue, 12 Nov 2019 23:47:30 +0800 Subject: [PATCH] =?UTF-8?q?:bulb:=20<04=20=E4=B8=B2>=E4=B9=A0=E9=A2=98?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CLion/ExerciseBook/04.10/04.10.c | 35 + CLion/ExerciseBook/04.10/CMakeLists.txt | 7 + CLion/ExerciseBook/04.10/String.c | 151 ++++ CLion/ExerciseBook/04.10/String.h | 43 + CLion/ExerciseBook/04.11/04.11.c | 69 ++ CLion/ExerciseBook/04.11/CMakeLists.txt | 7 + CLion/ExerciseBook/04.11/String.c | 151 ++++ CLion/ExerciseBook/04.11/String.h | 43 + CLion/ExerciseBook/04.12/04.12.c | 56 ++ CLion/ExerciseBook/04.12/CMakeLists.txt | 7 + CLion/ExerciseBook/04.12/String.c | 151 ++++ CLion/ExerciseBook/04.12/String.h | 43 + CLion/ExerciseBook/04.13/04.13.c | 41 + CLion/ExerciseBook/04.13/CMakeLists.txt | 7 + CLion/ExerciseBook/04.13/String.c | 151 ++++ CLion/ExerciseBook/04.13/String.h | 43 + CLion/ExerciseBook/04.14/04.14.c | 92 +++ CLion/ExerciseBook/04.14/CMakeLists.txt | 7 + CLion/ExerciseBook/04.14/SqStack.c | 89 +++ CLion/ExerciseBook/04.14/SqStack.h | 61 ++ CLion/ExerciseBook/04.14/String.c | 151 ++++ CLion/ExerciseBook/04.14/String.h | 43 + CLion/ExerciseBook/04.15-04.17/04.15-04.17.c | 92 +++ CLion/ExerciseBook/04.15-04.17/CMakeLists.txt | 7 + CLion/ExerciseBook/04.15-04.17/SString.c | 406 ++++++++++ CLion/ExerciseBook/04.15-04.17/SString.h | 179 +++++ CLion/ExerciseBook/04.18/04.18.c | 62 ++ CLion/ExerciseBook/04.18/CMakeLists.txt | 7 + CLion/ExerciseBook/04.18/SString.c | 406 ++++++++++ CLion/ExerciseBook/04.18/SString.h | 179 +++++ CLion/ExerciseBook/04.19/04.19.c | 77 ++ CLion/ExerciseBook/04.19/CMakeLists.txt | 7 + CLion/ExerciseBook/04.19/SString.c | 406 ++++++++++ CLion/ExerciseBook/04.19/SString.h | 179 +++++ CLion/ExerciseBook/04.20/04.20.c | 47 ++ CLion/ExerciseBook/04.20/CMakeLists.txt | 7 + CLion/ExerciseBook/04.20/SString.c | 406 ++++++++++ CLion/ExerciseBook/04.20/SString.h | 179 +++++ CLion/ExerciseBook/04.21/04.21.c | 336 ++++++++ CLion/ExerciseBook/04.21/CMakeLists.txt | 7 + CLion/ExerciseBook/04.22/04.22.c | 59 ++ CLion/ExerciseBook/04.22/CMakeLists.txt | 7 + CLion/ExerciseBook/04.22/LString.c | 747 +++++++++++++++++ CLion/ExerciseBook/04.22/LString.h | 169 ++++ CLion/ExerciseBook/04.23/04.23.c | 107 +++ CLion/ExerciseBook/04.23/CMakeLists.txt | 7 + CLion/ExerciseBook/04.23/LString.c | 748 ++++++++++++++++++ CLion/ExerciseBook/04.23/LString.h | 169 ++++ CLion/ExerciseBook/04.24-04.26/04.24-04.26.c | 101 +++ CLion/ExerciseBook/04.24-04.26/CMakeLists.txt | 7 + CLion/ExerciseBook/04.24-04.26/HString.c | 381 +++++++++ CLion/ExerciseBook/04.24-04.26/HString.h | 159 ++++ CLion/ExerciseBook/04.27/04.27.c | 81 ++ CLion/ExerciseBook/04.27/CMakeLists.txt | 7 + CLion/ExerciseBook/04.27/SString.c | 406 ++++++++++ CLion/ExerciseBook/04.27/SString.h | 179 +++++ CLion/ExerciseBook/04.28-04.29/04.28-04.29.c | 211 +++++ CLion/ExerciseBook/04.28-04.29/CMakeLists.txt | 7 + CLion/ExerciseBook/04.30/04.30.c | 116 +++ CLion/ExerciseBook/04.30/CMakeLists.txt | 7 + CLion/ExerciseBook/04.30/SString.c | 406 ++++++++++ CLion/ExerciseBook/04.30/SString.h | 179 +++++ CLion/ExerciseBook/04.31/04.31.c | 248 ++++++ CLion/ExerciseBook/04.31/CMakeLists.txt | 7 + CLion/ExerciseBook/04.31/SString.c | 406 ++++++++++ CLion/ExerciseBook/04.31/SString.h | 179 +++++ CLion/ExerciseBook/CMakeLists.txt | 18 + Dev-C++/ExerciseBook/04.10/04.10.cpp | 35 + Dev-C++/ExerciseBook/04.10/04.10.dev | 82 ++ Dev-C++/ExerciseBook/04.10/String.cpp | 151 ++++ Dev-C++/ExerciseBook/04.10/String.h | 43 + Dev-C++/ExerciseBook/04.11/04.11.cpp | 69 ++ Dev-C++/ExerciseBook/04.11/04.11.dev | 82 ++ Dev-C++/ExerciseBook/04.11/String.cpp | 151 ++++ Dev-C++/ExerciseBook/04.11/String.h | 43 + Dev-C++/ExerciseBook/04.12/04.12.cpp | 56 ++ Dev-C++/ExerciseBook/04.12/04.12.dev | 82 ++ Dev-C++/ExerciseBook/04.12/String.cpp | 151 ++++ Dev-C++/ExerciseBook/04.12/String.h | 43 + Dev-C++/ExerciseBook/04.13/04.13.cpp | 41 + Dev-C++/ExerciseBook/04.13/04.13.dev | 82 ++ Dev-C++/ExerciseBook/04.13/String.cpp | 151 ++++ Dev-C++/ExerciseBook/04.13/String.h | 43 + Dev-C++/ExerciseBook/04.14/04.14.cpp | 92 +++ Dev-C++/ExerciseBook/04.14/04.14.dev | 102 +++ Dev-C++/ExerciseBook/04.14/SqStack.cpp | 89 +++ Dev-C++/ExerciseBook/04.14/SqStack.h | 61 ++ Dev-C++/ExerciseBook/04.14/String.cpp | 151 ++++ Dev-C++/ExerciseBook/04.14/String.h | 43 + .../ExerciseBook/04.15-04.17/04.15-04.17.cpp | 92 +++ .../ExerciseBook/04.15-04.17/04.15-04.17.dev | 82 ++ Dev-C++/ExerciseBook/04.15-04.17/SString.cpp | 406 ++++++++++ Dev-C++/ExerciseBook/04.15-04.17/SString.h | 179 +++++ Dev-C++/ExerciseBook/04.18/04.18.cpp | 62 ++ Dev-C++/ExerciseBook/04.18/04.18.dev | 82 ++ Dev-C++/ExerciseBook/04.18/SString.cpp | 406 ++++++++++ Dev-C++/ExerciseBook/04.18/SString.h | 179 +++++ Dev-C++/ExerciseBook/04.19/04.19.cpp | 77 ++ Dev-C++/ExerciseBook/04.19/04.19.dev | 82 ++ Dev-C++/ExerciseBook/04.19/SString.cpp | 406 ++++++++++ Dev-C++/ExerciseBook/04.19/SString.h | 179 +++++ Dev-C++/ExerciseBook/04.20/04.20.cpp | 47 ++ Dev-C++/ExerciseBook/04.20/04.20.dev | 82 ++ Dev-C++/ExerciseBook/04.20/SString.cpp | 406 ++++++++++ Dev-C++/ExerciseBook/04.20/SString.h | 179 +++++ Dev-C++/ExerciseBook/04.21/04.21.cpp | 336 ++++++++ Dev-C++/ExerciseBook/04.21/04.21.dev | 62 ++ Dev-C++/ExerciseBook/04.22/04.22.cpp | 59 ++ Dev-C++/ExerciseBook/04.22/04.22.dev | 82 ++ Dev-C++/ExerciseBook/04.22/LString.cpp | 747 +++++++++++++++++ Dev-C++/ExerciseBook/04.22/LString.h | 169 ++++ Dev-C++/ExerciseBook/04.23/04.23.cpp | 107 +++ Dev-C++/ExerciseBook/04.23/04.23.dev | 82 ++ Dev-C++/ExerciseBook/04.23/LString.cpp | 748 ++++++++++++++++++ Dev-C++/ExerciseBook/04.23/LString.h | 169 ++++ .../ExerciseBook/04.24-04.26/04.24-04.26.cpp | 101 +++ .../ExerciseBook/04.24-04.26/04.24-04.26.dev | 82 ++ Dev-C++/ExerciseBook/04.24-04.26/HString.cpp | 381 +++++++++ Dev-C++/ExerciseBook/04.24-04.26/HString.h | 159 ++++ Dev-C++/ExerciseBook/04.27/04.27.cpp | 81 ++ Dev-C++/ExerciseBook/04.27/04.27.dev | 82 ++ Dev-C++/ExerciseBook/04.27/SString.cpp | 406 ++++++++++ Dev-C++/ExerciseBook/04.27/SString.h | 179 +++++ .../ExerciseBook/04.28-04.29/04.28-04.29.cpp | 211 +++++ .../ExerciseBook/04.28-04.29/04.28-04.29.dev | 62 ++ Dev-C++/ExerciseBook/04.30/04.30.cpp | 116 +++ Dev-C++/ExerciseBook/04.30/04.30.dev | 82 ++ Dev-C++/ExerciseBook/04.30/SString.cpp | 406 ++++++++++ Dev-C++/ExerciseBook/04.30/SString.h | 179 +++++ Dev-C++/ExerciseBook/04.31/04.31.cpp | 248 ++++++ Dev-C++/ExerciseBook/04.31/04.31.dev | 82 ++ Dev-C++/ExerciseBook/04.31/SString.cpp | 406 ++++++++++ Dev-C++/ExerciseBook/04.31/SString.h | 179 +++++ VisualC++/ExerciseBook/04.10/04.10.c | 35 + VisualC++/ExerciseBook/04.10/04.10.vcxproj | 76 ++ .../ExerciseBook/04.10/04.10.vcxproj.filters | 30 + .../ExerciseBook/04.10/04.10.vcxproj.user | 3 + VisualC++/ExerciseBook/04.10/String.c | 151 ++++ VisualC++/ExerciseBook/04.10/String.h | 43 + VisualC++/ExerciseBook/04.11/04.11.c | 69 ++ VisualC++/ExerciseBook/04.11/04.11.vcxproj | 76 ++ .../ExerciseBook/04.11/04.11.vcxproj.filters | 30 + .../ExerciseBook/04.11/04.11.vcxproj.user | 3 + VisualC++/ExerciseBook/04.11/String.c | 151 ++++ VisualC++/ExerciseBook/04.11/String.h | 43 + VisualC++/ExerciseBook/04.12/04.12.c | 56 ++ VisualC++/ExerciseBook/04.12/04.12.vcxproj | 76 ++ .../ExerciseBook/04.12/04.12.vcxproj.filters | 30 + .../ExerciseBook/04.12/04.12.vcxproj.user | 3 + VisualC++/ExerciseBook/04.12/String.c | 151 ++++ VisualC++/ExerciseBook/04.12/String.h | 43 + VisualC++/ExerciseBook/04.13/04.13.c | 41 + VisualC++/ExerciseBook/04.13/04.13.vcxproj | 76 ++ .../ExerciseBook/04.13/04.13.vcxproj.filters | 30 + .../ExerciseBook/04.13/04.13.vcxproj.user | 3 + VisualC++/ExerciseBook/04.13/String.c | 151 ++++ VisualC++/ExerciseBook/04.13/String.h | 43 + VisualC++/ExerciseBook/04.14/04.14.c | 92 +++ VisualC++/ExerciseBook/04.14/04.14.vcxproj | 78 ++ .../ExerciseBook/04.14/04.14.vcxproj.filters | 36 + .../ExerciseBook/04.14/04.14.vcxproj.user | 3 + VisualC++/ExerciseBook/04.14/SqStack.c | 89 +++ VisualC++/ExerciseBook/04.14/SqStack.h | 61 ++ VisualC++/ExerciseBook/04.14/String.c | 151 ++++ VisualC++/ExerciseBook/04.14/String.h | 43 + .../ExerciseBook/04.15-04.17/04.15-04.17.c | 92 +++ .../04.15-04.17/04.15-04.17.vcxproj | 76 ++ .../04.15-04.17/04.15-04.17.vcxproj.filters | 30 + .../04.15-04.17/04.15-04.17.vcxproj.user | 3 + VisualC++/ExerciseBook/04.15-04.17/SString.c | 406 ++++++++++ VisualC++/ExerciseBook/04.15-04.17/SString.h | 179 +++++ VisualC++/ExerciseBook/04.18/04.18.c | 62 ++ VisualC++/ExerciseBook/04.18/04.18.vcxproj | 76 ++ .../ExerciseBook/04.18/04.18.vcxproj.filters | 30 + .../ExerciseBook/04.18/04.18.vcxproj.user | 3 + VisualC++/ExerciseBook/04.18/SString.c | 406 ++++++++++ VisualC++/ExerciseBook/04.18/SString.h | 179 +++++ VisualC++/ExerciseBook/04.19/04.19.c | 77 ++ VisualC++/ExerciseBook/04.19/04.19.vcxproj | 76 ++ .../ExerciseBook/04.19/04.19.vcxproj.filters | 30 + .../ExerciseBook/04.19/04.19.vcxproj.user | 3 + VisualC++/ExerciseBook/04.19/SString.c | 406 ++++++++++ VisualC++/ExerciseBook/04.19/SString.h | 179 +++++ VisualC++/ExerciseBook/04.20/04.20.c | 47 ++ VisualC++/ExerciseBook/04.20/04.20.vcxproj | 76 ++ .../ExerciseBook/04.20/04.20.vcxproj.filters | 30 + .../ExerciseBook/04.20/04.20.vcxproj.user | 3 + VisualC++/ExerciseBook/04.20/SString.c | 406 ++++++++++ VisualC++/ExerciseBook/04.20/SString.h | 179 +++++ VisualC++/ExerciseBook/04.21/04.21.c | 336 ++++++++ VisualC++/ExerciseBook/04.21/04.21.vcxproj | 72 ++ .../ExerciseBook/04.21/04.21.vcxproj.filters | 22 + .../ExerciseBook/04.21/04.21.vcxproj.user | 3 + VisualC++/ExerciseBook/04.22/04.22.c | 59 ++ VisualC++/ExerciseBook/04.22/04.22.vcxproj | 76 ++ .../ExerciseBook/04.22/04.22.vcxproj.filters | 30 + .../ExerciseBook/04.22/04.22.vcxproj.user | 3 + VisualC++/ExerciseBook/04.22/LString.c | 747 +++++++++++++++++ VisualC++/ExerciseBook/04.22/LString.h | 169 ++++ VisualC++/ExerciseBook/04.23/04.23.c | 107 +++ VisualC++/ExerciseBook/04.23/04.23.vcxproj | 76 ++ .../ExerciseBook/04.23/04.23.vcxproj.filters | 30 + .../ExerciseBook/04.23/04.23.vcxproj.user | 3 + VisualC++/ExerciseBook/04.23/LString.c | 748 ++++++++++++++++++ VisualC++/ExerciseBook/04.23/LString.h | 169 ++++ .../ExerciseBook/04.24-04.26/04.24-04.26.c | 101 +++ .../04.24-04.26/04.24-04.26.vcxproj | 76 ++ .../04.24-04.26/04.24-04.26.vcxproj.filters | 30 + .../04.24-04.26/04.24-04.26.vcxproj.user | 3 + VisualC++/ExerciseBook/04.24-04.26/HString.c | 381 +++++++++ VisualC++/ExerciseBook/04.24-04.26/HString.h | 159 ++++ VisualC++/ExerciseBook/04.27/04.27.c | 81 ++ VisualC++/ExerciseBook/04.27/04.27.vcxproj | 76 ++ .../ExerciseBook/04.27/04.27.vcxproj.filters | 30 + .../ExerciseBook/04.27/04.27.vcxproj.user | 3 + VisualC++/ExerciseBook/04.27/SString.c | 406 ++++++++++ VisualC++/ExerciseBook/04.27/SString.h | 179 +++++ .../ExerciseBook/04.28-04.29/04.28-04.29.c | 211 +++++ .../04.28-04.29/04.28-04.29.vcxproj | 72 ++ .../04.28-04.29/04.28-04.29.vcxproj.filters | 22 + .../04.28-04.29/04.28-04.29.vcxproj.user | 3 + VisualC++/ExerciseBook/04.30/04.30.c | 116 +++ VisualC++/ExerciseBook/04.30/04.30.vcxproj | 76 ++ .../ExerciseBook/04.30/04.30.vcxproj.filters | 30 + .../ExerciseBook/04.30/04.30.vcxproj.user | 3 + VisualC++/ExerciseBook/04.30/SString.c | 406 ++++++++++ VisualC++/ExerciseBook/04.30/SString.h | 179 +++++ VisualC++/ExerciseBook/04.31/04.31.c | 248 ++++++ VisualC++/ExerciseBook/04.31/04.31.vcxproj | 76 ++ .../ExerciseBook/04.31/04.31.vcxproj.filters | 30 + .../ExerciseBook/04.31/04.31.vcxproj.user | 3 + VisualC++/ExerciseBook/04.31/SString.c | 406 ++++++++++ VisualC++/ExerciseBook/04.31/SString.h | 179 +++++ VisualC++/ExerciseBook/ExerciseBook.sdf | Bin 4280320 -> 4739072 bytes VisualC++/ExerciseBook/ExerciseBook.sln | 102 +++ VisualC++/ExerciseBook/ExerciseBook.suo | Bin 105984 -> 141312 bytes .../04 串/_v_images/20181128012650395_14443.png | Bin 0 -> 5362 bytes .../04 串/_v_images/20181128012749064_24270.png | Bin 0 -> 7263 bytes .../04 串/_v_images/20181128012817985_10766.png | Bin 0 -> 13918 bytes .../04 串/_v_images/20181128013044407_30919.png | Bin 0 -> 7837 bytes .../04 串/_v_images/20181128013157410_30749.png | Bin 0 -> 4560 bytes .../04 串/_v_images/20181128013251526_202.png | Bin 0 -> 2052 bytes .../04 串/_v_images/20181128013312950_14120.png | Bin 0 -> 2229 bytes 习题解析/04 串/第04章 串.md | 190 +++++ 244 files changed, 31894 insertions(+) create mode 100644 CLion/ExerciseBook/04.10/04.10.c create mode 100644 CLion/ExerciseBook/04.10/CMakeLists.txt create mode 100644 CLion/ExerciseBook/04.10/String.c create mode 100644 CLion/ExerciseBook/04.10/String.h create mode 100644 CLion/ExerciseBook/04.11/04.11.c create mode 100644 CLion/ExerciseBook/04.11/CMakeLists.txt create mode 100644 CLion/ExerciseBook/04.11/String.c create mode 100644 CLion/ExerciseBook/04.11/String.h create mode 100644 CLion/ExerciseBook/04.12/04.12.c create mode 100644 CLion/ExerciseBook/04.12/CMakeLists.txt create mode 100644 CLion/ExerciseBook/04.12/String.c create mode 100644 CLion/ExerciseBook/04.12/String.h create mode 100644 CLion/ExerciseBook/04.13/04.13.c create mode 100644 CLion/ExerciseBook/04.13/CMakeLists.txt create mode 100644 CLion/ExerciseBook/04.13/String.c create mode 100644 CLion/ExerciseBook/04.13/String.h create mode 100644 CLion/ExerciseBook/04.14/04.14.c create mode 100644 CLion/ExerciseBook/04.14/CMakeLists.txt create mode 100644 CLion/ExerciseBook/04.14/SqStack.c create mode 100644 CLion/ExerciseBook/04.14/SqStack.h create mode 100644 CLion/ExerciseBook/04.14/String.c create mode 100644 CLion/ExerciseBook/04.14/String.h create mode 100644 CLion/ExerciseBook/04.15-04.17/04.15-04.17.c create mode 100644 CLion/ExerciseBook/04.15-04.17/CMakeLists.txt create mode 100644 CLion/ExerciseBook/04.15-04.17/SString.c create mode 100644 CLion/ExerciseBook/04.15-04.17/SString.h create mode 100644 CLion/ExerciseBook/04.18/04.18.c create mode 100644 CLion/ExerciseBook/04.18/CMakeLists.txt create mode 100644 CLion/ExerciseBook/04.18/SString.c create mode 100644 CLion/ExerciseBook/04.18/SString.h create mode 100644 CLion/ExerciseBook/04.19/04.19.c create mode 100644 CLion/ExerciseBook/04.19/CMakeLists.txt create mode 100644 CLion/ExerciseBook/04.19/SString.c create mode 100644 CLion/ExerciseBook/04.19/SString.h create mode 100644 CLion/ExerciseBook/04.20/04.20.c create mode 100644 CLion/ExerciseBook/04.20/CMakeLists.txt create mode 100644 CLion/ExerciseBook/04.20/SString.c create mode 100644 CLion/ExerciseBook/04.20/SString.h create mode 100644 CLion/ExerciseBook/04.21/04.21.c create mode 100644 CLion/ExerciseBook/04.21/CMakeLists.txt create mode 100644 CLion/ExerciseBook/04.22/04.22.c create mode 100644 CLion/ExerciseBook/04.22/CMakeLists.txt create mode 100644 CLion/ExerciseBook/04.22/LString.c create mode 100644 CLion/ExerciseBook/04.22/LString.h create mode 100644 CLion/ExerciseBook/04.23/04.23.c create mode 100644 CLion/ExerciseBook/04.23/CMakeLists.txt create mode 100644 CLion/ExerciseBook/04.23/LString.c create mode 100644 CLion/ExerciseBook/04.23/LString.h create mode 100644 CLion/ExerciseBook/04.24-04.26/04.24-04.26.c create mode 100644 CLion/ExerciseBook/04.24-04.26/CMakeLists.txt create mode 100644 CLion/ExerciseBook/04.24-04.26/HString.c create mode 100644 CLion/ExerciseBook/04.24-04.26/HString.h create mode 100644 CLion/ExerciseBook/04.27/04.27.c create mode 100644 CLion/ExerciseBook/04.27/CMakeLists.txt create mode 100644 CLion/ExerciseBook/04.27/SString.c create mode 100644 CLion/ExerciseBook/04.27/SString.h create mode 100644 CLion/ExerciseBook/04.28-04.29/04.28-04.29.c create mode 100644 CLion/ExerciseBook/04.28-04.29/CMakeLists.txt create mode 100644 CLion/ExerciseBook/04.30/04.30.c create mode 100644 CLion/ExerciseBook/04.30/CMakeLists.txt create mode 100644 CLion/ExerciseBook/04.30/SString.c create mode 100644 CLion/ExerciseBook/04.30/SString.h create mode 100644 CLion/ExerciseBook/04.31/04.31.c create mode 100644 CLion/ExerciseBook/04.31/CMakeLists.txt create mode 100644 CLion/ExerciseBook/04.31/SString.c create mode 100644 CLion/ExerciseBook/04.31/SString.h create mode 100644 Dev-C++/ExerciseBook/04.10/04.10.cpp create mode 100644 Dev-C++/ExerciseBook/04.10/04.10.dev create mode 100644 Dev-C++/ExerciseBook/04.10/String.cpp create mode 100644 Dev-C++/ExerciseBook/04.10/String.h create mode 100644 Dev-C++/ExerciseBook/04.11/04.11.cpp create mode 100644 Dev-C++/ExerciseBook/04.11/04.11.dev create mode 100644 Dev-C++/ExerciseBook/04.11/String.cpp create mode 100644 Dev-C++/ExerciseBook/04.11/String.h create mode 100644 Dev-C++/ExerciseBook/04.12/04.12.cpp create mode 100644 Dev-C++/ExerciseBook/04.12/04.12.dev create mode 100644 Dev-C++/ExerciseBook/04.12/String.cpp create mode 100644 Dev-C++/ExerciseBook/04.12/String.h create mode 100644 Dev-C++/ExerciseBook/04.13/04.13.cpp create mode 100644 Dev-C++/ExerciseBook/04.13/04.13.dev create mode 100644 Dev-C++/ExerciseBook/04.13/String.cpp create mode 100644 Dev-C++/ExerciseBook/04.13/String.h create mode 100644 Dev-C++/ExerciseBook/04.14/04.14.cpp create mode 100644 Dev-C++/ExerciseBook/04.14/04.14.dev create mode 100644 Dev-C++/ExerciseBook/04.14/SqStack.cpp create mode 100644 Dev-C++/ExerciseBook/04.14/SqStack.h create mode 100644 Dev-C++/ExerciseBook/04.14/String.cpp create mode 100644 Dev-C++/ExerciseBook/04.14/String.h create mode 100644 Dev-C++/ExerciseBook/04.15-04.17/04.15-04.17.cpp create mode 100644 Dev-C++/ExerciseBook/04.15-04.17/04.15-04.17.dev create mode 100644 Dev-C++/ExerciseBook/04.15-04.17/SString.cpp create mode 100644 Dev-C++/ExerciseBook/04.15-04.17/SString.h create mode 100644 Dev-C++/ExerciseBook/04.18/04.18.cpp create mode 100644 Dev-C++/ExerciseBook/04.18/04.18.dev create mode 100644 Dev-C++/ExerciseBook/04.18/SString.cpp create mode 100644 Dev-C++/ExerciseBook/04.18/SString.h create mode 100644 Dev-C++/ExerciseBook/04.19/04.19.cpp create mode 100644 Dev-C++/ExerciseBook/04.19/04.19.dev create mode 100644 Dev-C++/ExerciseBook/04.19/SString.cpp create mode 100644 Dev-C++/ExerciseBook/04.19/SString.h create mode 100644 Dev-C++/ExerciseBook/04.20/04.20.cpp create mode 100644 Dev-C++/ExerciseBook/04.20/04.20.dev create mode 100644 Dev-C++/ExerciseBook/04.20/SString.cpp create mode 100644 Dev-C++/ExerciseBook/04.20/SString.h create mode 100644 Dev-C++/ExerciseBook/04.21/04.21.cpp create mode 100644 Dev-C++/ExerciseBook/04.21/04.21.dev create mode 100644 Dev-C++/ExerciseBook/04.22/04.22.cpp create mode 100644 Dev-C++/ExerciseBook/04.22/04.22.dev create mode 100644 Dev-C++/ExerciseBook/04.22/LString.cpp create mode 100644 Dev-C++/ExerciseBook/04.22/LString.h create mode 100644 Dev-C++/ExerciseBook/04.23/04.23.cpp create mode 100644 Dev-C++/ExerciseBook/04.23/04.23.dev create mode 100644 Dev-C++/ExerciseBook/04.23/LString.cpp create mode 100644 Dev-C++/ExerciseBook/04.23/LString.h create mode 100644 Dev-C++/ExerciseBook/04.24-04.26/04.24-04.26.cpp create mode 100644 Dev-C++/ExerciseBook/04.24-04.26/04.24-04.26.dev create mode 100644 Dev-C++/ExerciseBook/04.24-04.26/HString.cpp create mode 100644 Dev-C++/ExerciseBook/04.24-04.26/HString.h create mode 100644 Dev-C++/ExerciseBook/04.27/04.27.cpp create mode 100644 Dev-C++/ExerciseBook/04.27/04.27.dev create mode 100644 Dev-C++/ExerciseBook/04.27/SString.cpp create mode 100644 Dev-C++/ExerciseBook/04.27/SString.h create mode 100644 Dev-C++/ExerciseBook/04.28-04.29/04.28-04.29.cpp create mode 100644 Dev-C++/ExerciseBook/04.28-04.29/04.28-04.29.dev create mode 100644 Dev-C++/ExerciseBook/04.30/04.30.cpp create mode 100644 Dev-C++/ExerciseBook/04.30/04.30.dev create mode 100644 Dev-C++/ExerciseBook/04.30/SString.cpp create mode 100644 Dev-C++/ExerciseBook/04.30/SString.h create mode 100644 Dev-C++/ExerciseBook/04.31/04.31.cpp create mode 100644 Dev-C++/ExerciseBook/04.31/04.31.dev create mode 100644 Dev-C++/ExerciseBook/04.31/SString.cpp create mode 100644 Dev-C++/ExerciseBook/04.31/SString.h create mode 100644 VisualC++/ExerciseBook/04.10/04.10.c create mode 100644 VisualC++/ExerciseBook/04.10/04.10.vcxproj create mode 100644 VisualC++/ExerciseBook/04.10/04.10.vcxproj.filters create mode 100644 VisualC++/ExerciseBook/04.10/04.10.vcxproj.user create mode 100644 VisualC++/ExerciseBook/04.10/String.c create mode 100644 VisualC++/ExerciseBook/04.10/String.h create mode 100644 VisualC++/ExerciseBook/04.11/04.11.c create mode 100644 VisualC++/ExerciseBook/04.11/04.11.vcxproj create mode 100644 VisualC++/ExerciseBook/04.11/04.11.vcxproj.filters create mode 100644 VisualC++/ExerciseBook/04.11/04.11.vcxproj.user create mode 100644 VisualC++/ExerciseBook/04.11/String.c create mode 100644 VisualC++/ExerciseBook/04.11/String.h create mode 100644 VisualC++/ExerciseBook/04.12/04.12.c create mode 100644 VisualC++/ExerciseBook/04.12/04.12.vcxproj create mode 100644 VisualC++/ExerciseBook/04.12/04.12.vcxproj.filters create mode 100644 VisualC++/ExerciseBook/04.12/04.12.vcxproj.user create mode 100644 VisualC++/ExerciseBook/04.12/String.c create mode 100644 VisualC++/ExerciseBook/04.12/String.h create mode 100644 VisualC++/ExerciseBook/04.13/04.13.c create mode 100644 VisualC++/ExerciseBook/04.13/04.13.vcxproj create mode 100644 VisualC++/ExerciseBook/04.13/04.13.vcxproj.filters create mode 100644 VisualC++/ExerciseBook/04.13/04.13.vcxproj.user create mode 100644 VisualC++/ExerciseBook/04.13/String.c create mode 100644 VisualC++/ExerciseBook/04.13/String.h create mode 100644 VisualC++/ExerciseBook/04.14/04.14.c create mode 100644 VisualC++/ExerciseBook/04.14/04.14.vcxproj create mode 100644 VisualC++/ExerciseBook/04.14/04.14.vcxproj.filters create mode 100644 VisualC++/ExerciseBook/04.14/04.14.vcxproj.user create mode 100644 VisualC++/ExerciseBook/04.14/SqStack.c create mode 100644 VisualC++/ExerciseBook/04.14/SqStack.h create mode 100644 VisualC++/ExerciseBook/04.14/String.c create mode 100644 VisualC++/ExerciseBook/04.14/String.h create mode 100644 VisualC++/ExerciseBook/04.15-04.17/04.15-04.17.c create mode 100644 VisualC++/ExerciseBook/04.15-04.17/04.15-04.17.vcxproj create mode 100644 VisualC++/ExerciseBook/04.15-04.17/04.15-04.17.vcxproj.filters create mode 100644 VisualC++/ExerciseBook/04.15-04.17/04.15-04.17.vcxproj.user create mode 100644 VisualC++/ExerciseBook/04.15-04.17/SString.c create mode 100644 VisualC++/ExerciseBook/04.15-04.17/SString.h create mode 100644 VisualC++/ExerciseBook/04.18/04.18.c create mode 100644 VisualC++/ExerciseBook/04.18/04.18.vcxproj create mode 100644 VisualC++/ExerciseBook/04.18/04.18.vcxproj.filters create mode 100644 VisualC++/ExerciseBook/04.18/04.18.vcxproj.user create mode 100644 VisualC++/ExerciseBook/04.18/SString.c create mode 100644 VisualC++/ExerciseBook/04.18/SString.h create mode 100644 VisualC++/ExerciseBook/04.19/04.19.c create mode 100644 VisualC++/ExerciseBook/04.19/04.19.vcxproj create mode 100644 VisualC++/ExerciseBook/04.19/04.19.vcxproj.filters create mode 100644 VisualC++/ExerciseBook/04.19/04.19.vcxproj.user create mode 100644 VisualC++/ExerciseBook/04.19/SString.c create mode 100644 VisualC++/ExerciseBook/04.19/SString.h create mode 100644 VisualC++/ExerciseBook/04.20/04.20.c create mode 100644 VisualC++/ExerciseBook/04.20/04.20.vcxproj create mode 100644 VisualC++/ExerciseBook/04.20/04.20.vcxproj.filters create mode 100644 VisualC++/ExerciseBook/04.20/04.20.vcxproj.user create mode 100644 VisualC++/ExerciseBook/04.20/SString.c create mode 100644 VisualC++/ExerciseBook/04.20/SString.h create mode 100644 VisualC++/ExerciseBook/04.21/04.21.c create mode 100644 VisualC++/ExerciseBook/04.21/04.21.vcxproj create mode 100644 VisualC++/ExerciseBook/04.21/04.21.vcxproj.filters create mode 100644 VisualC++/ExerciseBook/04.21/04.21.vcxproj.user create mode 100644 VisualC++/ExerciseBook/04.22/04.22.c create mode 100644 VisualC++/ExerciseBook/04.22/04.22.vcxproj create mode 100644 VisualC++/ExerciseBook/04.22/04.22.vcxproj.filters create mode 100644 VisualC++/ExerciseBook/04.22/04.22.vcxproj.user create mode 100644 VisualC++/ExerciseBook/04.22/LString.c create mode 100644 VisualC++/ExerciseBook/04.22/LString.h create mode 100644 VisualC++/ExerciseBook/04.23/04.23.c create mode 100644 VisualC++/ExerciseBook/04.23/04.23.vcxproj create mode 100644 VisualC++/ExerciseBook/04.23/04.23.vcxproj.filters create mode 100644 VisualC++/ExerciseBook/04.23/04.23.vcxproj.user create mode 100644 VisualC++/ExerciseBook/04.23/LString.c create mode 100644 VisualC++/ExerciseBook/04.23/LString.h create mode 100644 VisualC++/ExerciseBook/04.24-04.26/04.24-04.26.c create mode 100644 VisualC++/ExerciseBook/04.24-04.26/04.24-04.26.vcxproj create mode 100644 VisualC++/ExerciseBook/04.24-04.26/04.24-04.26.vcxproj.filters create mode 100644 VisualC++/ExerciseBook/04.24-04.26/04.24-04.26.vcxproj.user create mode 100644 VisualC++/ExerciseBook/04.24-04.26/HString.c create mode 100644 VisualC++/ExerciseBook/04.24-04.26/HString.h create mode 100644 VisualC++/ExerciseBook/04.27/04.27.c create mode 100644 VisualC++/ExerciseBook/04.27/04.27.vcxproj create mode 100644 VisualC++/ExerciseBook/04.27/04.27.vcxproj.filters create mode 100644 VisualC++/ExerciseBook/04.27/04.27.vcxproj.user create mode 100644 VisualC++/ExerciseBook/04.27/SString.c create mode 100644 VisualC++/ExerciseBook/04.27/SString.h create mode 100644 VisualC++/ExerciseBook/04.28-04.29/04.28-04.29.c create mode 100644 VisualC++/ExerciseBook/04.28-04.29/04.28-04.29.vcxproj create mode 100644 VisualC++/ExerciseBook/04.28-04.29/04.28-04.29.vcxproj.filters create mode 100644 VisualC++/ExerciseBook/04.28-04.29/04.28-04.29.vcxproj.user create mode 100644 VisualC++/ExerciseBook/04.30/04.30.c create mode 100644 VisualC++/ExerciseBook/04.30/04.30.vcxproj create mode 100644 VisualC++/ExerciseBook/04.30/04.30.vcxproj.filters create mode 100644 VisualC++/ExerciseBook/04.30/04.30.vcxproj.user create mode 100644 VisualC++/ExerciseBook/04.30/SString.c create mode 100644 VisualC++/ExerciseBook/04.30/SString.h create mode 100644 VisualC++/ExerciseBook/04.31/04.31.c create mode 100644 VisualC++/ExerciseBook/04.31/04.31.vcxproj create mode 100644 VisualC++/ExerciseBook/04.31/04.31.vcxproj.filters create mode 100644 VisualC++/ExerciseBook/04.31/04.31.vcxproj.user create mode 100644 VisualC++/ExerciseBook/04.31/SString.c create mode 100644 VisualC++/ExerciseBook/04.31/SString.h create mode 100644 习题解析/04 串/_v_images/20181128012650395_14443.png create mode 100644 习题解析/04 串/_v_images/20181128012749064_24270.png create mode 100644 习题解析/04 串/_v_images/20181128012817985_10766.png create mode 100644 习题解析/04 串/_v_images/20181128013044407_30919.png create mode 100644 习题解析/04 串/_v_images/20181128013157410_30749.png create mode 100644 习题解析/04 串/_v_images/20181128013251526_202.png create mode 100644 习题解析/04 串/_v_images/20181128013312950_14120.png create mode 100644 习题解析/04 串/第04章 串.md diff --git a/CLion/ExerciseBook/04.10/04.10.c b/CLion/ExerciseBook/04.10/04.10.c new file mode 100644 index 0000000..f432071 --- /dev/null +++ b/CLion/ExerciseBook/04.10/04.10.c @@ -0,0 +1,35 @@ +#include +#include "String.h" //**字符串**// + +/* + * 字符串逆置:将T逆置为R。 + */ +StringType Algo_4_10(StringType T) { + int i; + StringType R = "", Sub; + + // 从后向前截取字符 + for(i = StrLength(T); i >= 1; i--) { + Sub = SubString(T, i, 1); + R = Concat(R, Sub); + } + + return R; +} + + +int main(int argc, char* argv[]) { + char* s = "0123456789"; + StringType T, R; + + printf("逆置前,T = "); + StrAssign(&T, s); + StrPrint(T); + + printf("逆置后,R = "); + R = Algo_4_10(T); + StrPrint(R); + + return 0; +} + diff --git a/CLion/ExerciseBook/04.10/CMakeLists.txt b/CLion/ExerciseBook/04.10/CMakeLists.txt new file mode 100644 index 0000000..722b166 --- /dev/null +++ b/CLion/ExerciseBook/04.10/CMakeLists.txt @@ -0,0 +1,7 @@ +# 包含公共库 +include_directories(${CMAKE_SOURCE_DIR}/Status) + +# 生成可执行文件 +add_executable(04.10 String.h String.c 04.10.c) +# 链接公共库 +target_link_libraries(04.10 Scanf_lib) \ No newline at end of file diff --git a/CLion/ExerciseBook/04.10/String.c b/CLion/ExerciseBook/04.10/String.c new file mode 100644 index 0000000..a476438 --- /dev/null +++ b/CLion/ExerciseBook/04.10/String.c @@ -0,0 +1,151 @@ +/*=========================== + * 习题4.10~4.14中使用的字符串 + ============================*/ + +#include "String.h" + +// 初始化:构造一个值为s的串t +void StrAssign(StringType* t, const char* s) { + if(s == NULL) { + *t = ""; + } + + *t = (char*) malloc((strlen(s) + 1) * sizeof(char)); + + strcpy(*t, s); +} + +// 比较:返回s与t的大小,如果大小一致,返回0 +int StrCompare(StringType s, StringType t) { + return strcmp(s, t); +} + +// 计数:返回字符串s的长度 +int StrLength(StringType s) { + return (int) strlen(s); +} + +// 联接:返回由s与t联接后的串 +StringType Concat(StringType s, StringType t) { + StringType r; + + if(s == NULL) { + s = ""; + } + + if(t == NULL) { + t = ""; + } + + r = (char*) malloc((strlen(s) + strlen(t) + 1) * sizeof(char)); + r[0] = '\0'; + + strcat(r, s); + strcat(r, t); + + return r; +} + +// 求子串:从s的start位置起,截取len个字符后返回 +StringType SubString(StringType s, int start, int len) { + int n; + char* sub; + + n = (int) strlen(s); + + if(start < 1 || start > n || start + len - 1 > n || len < 0) { + return ""; + } + + sub = (char*) malloc((len + 1) * sizeof(char)); + strncpy(sub, s + start - 1, len); + sub[len] = '\0'; + + return sub; +} + +// 查找:从s的pos位置起查找t,如果找到,返回其位置 +int Index(StringType s, StringType t, int pos) { + int m, n, i; + StringType sub; + + // 失败情形提前处理 + if(pos < 1 || pos > StrLength(s) || StrLength(t) == 0) { + return 0; + } + + n = StrLength(s); + m = StrLength(t); + i = pos; + + // 保证长度不越界 + while(i <= n - m + 1) { + // 获取S[i, i+m-1] + sub = SubString(s, i, m); + + // 如果子串与模式串不匹配,则需要继续推进 + if(StrCompare(sub, t) != 0) { + ++i; + } else { + return i; + } + } + + return 0; +} + +// 插入:在s的pos处插入t +Status StrInsert(StringType* s, int pos, StringType t) { + StringType r; + StringType s1, s2; + + if(pos < 1 || pos > StrLength(*s) + 1) { + return ERROR; + } + + r = (StringType) malloc((strlen(*s) + strlen(t) + 1) * sizeof(char)); + r[0] = '\0'; + + // 如果待插入的串为空,则提前返回 + if(StrLength(t) == 0) { + return OK; + } + + s1 = SubString(*s, 1, pos - 1); + s2 = SubString(*s, pos, (int) strlen(*s) - pos + 1); + + strcat(r, s1); + strcat(r, t); + strcat(r, s2); + + *s = r; + + return OK; +} + +// 删除:从s的pos位置起,删除len个字符 +Status StrDelete(StringType* s, int pos, int len) { + StringType r; + + if(pos < 1 || pos + len - 1 > StrLength(*s) || len < 0) { + return ERROR; + } + + // 如果待删除的长度为0,则提前返回 + if(len == 0) { + return OK; + } + + r = (StringType) malloc((StrLength(*s) - len + 1) * sizeof(char)); + strncpy(r, *s, pos - 1); + strcpy(r + pos - 1, *s + pos + len - 1); + + *s = r; + + return OK; +} + +// 输出字符串 +void StrPrint(StringType s) { + printf("%s\n", s); +} diff --git a/CLion/ExerciseBook/04.10/String.h b/CLion/ExerciseBook/04.10/String.h new file mode 100644 index 0000000..f4711a9 --- /dev/null +++ b/CLion/ExerciseBook/04.10/String.h @@ -0,0 +1,43 @@ +/*=========================== + * 习题4.10~4.14中使用的字符串 + ============================*/ + +#ifndef STRING_H +#define STRING_H + +#include +#include // 提供 strlen 原型 +#include "Status.h" //**▲01 绪论**// + +/* 字符串类型 */ +typedef char* StringType; + + +// 初始化:构造一个值为s的串t +void StrAssign(StringType* t, const char* s); + +// 比较:返回s与t的大小,如果大小一致,返回0 +int StrCompare(StringType s, StringType t); + +// 计数:返回字符串s的长度 +int StrLength(StringType s); + +// 联接:返回由s与t联接后的串 +StringType Concat(StringType s, StringType t); + +// 求子串:从s的start位置起,截取len个字符后返回 +StringType SubString(StringType s, int start, int len); + +// 查找:从s的pos位置起查找t,如果找到,返回其位置 +int Index(StringType s, StringType t, int pos); + +// 插入:在s的pos处插入t +Status StrInsert(StringType* s, int pos, StringType t); + +// 删除:从s的pos位置起,删除len个字符 +Status StrDelete(StringType* s, int pos, int len); + +// 输出字符串 +void StrPrint(StringType s); + +#endif diff --git a/CLion/ExerciseBook/04.11/04.11.c b/CLion/ExerciseBook/04.11/04.11.c new file mode 100644 index 0000000..daaa1b4 --- /dev/null +++ b/CLion/ExerciseBook/04.11/04.11.c @@ -0,0 +1,69 @@ +#include +#include +#include "String.h" //**字符串**// + +/* + * R=S-S∩T,数组a存储R中每个字符在S中第一次出现的位置 + * + * 注:数组a的0号单元存储的是a中元素的个数 + */ +void Algo_4_11(StringType* R, StringType S, StringType T, int** a) { + int i, p; + StringType ch; + + *a = (int*) malloc((StrLength(S) + 1) * sizeof(int)); + + StrAssign(R, ""); + + for(i = 1, (*a)[0] = 0; i <= StrLength(S); i++) { + // 取出字符进行判断 + ch = SubString(S, i, 1); + + // 获取S[i]在T中的位置 + p = Index(T, ch, 1); + + // 如果S[i]不在T中 + if(p == 0) { + // 获取S[i]在R中的位置 + p = Index(*R, ch, 1); + } + + // 如果S[i]既不在T中,又没在R中出现过 + if(p == 0) { + (*a)[0]++; + (*a)[(*a)[0]] = i; + + // 向R中添加S[i] + StrInsert(R, (*a)[0], ch); + } + } +} + + +int main(int argc, char* argv[]) { + char* s = "amdhcjgfdlpinbefcopgkqikeb"; + char* t = "mhjlpinopkqik"; + int* a; + StringType T, S, R; + int i; + + printf("初始化S和T...\n"); + StrAssign(&S, s); + StrAssign(&T, t); + printf("S = "); + StrPrint(S); + printf("T = "); + StrPrint(T); + + Algo_4_11(&R, S, T, &a); + printf("R = "); + StrPrint(R); + + printf("a = "); + for(i = 1; i <= a[0]; i++) { + printf("%d ", a[i]); + } + printf("\n"); + + return 0; +} diff --git a/CLion/ExerciseBook/04.11/CMakeLists.txt b/CLion/ExerciseBook/04.11/CMakeLists.txt new file mode 100644 index 0000000..6564f26 --- /dev/null +++ b/CLion/ExerciseBook/04.11/CMakeLists.txt @@ -0,0 +1,7 @@ +# 包含公共库 +include_directories(${CMAKE_SOURCE_DIR}/Status) + +# 生成可执行文件 +add_executable(04.11 String.h String.c 04.11.c) +# 链接公共库 +target_link_libraries(04.11 Scanf_lib) \ No newline at end of file diff --git a/CLion/ExerciseBook/04.11/String.c b/CLion/ExerciseBook/04.11/String.c new file mode 100644 index 0000000..a476438 --- /dev/null +++ b/CLion/ExerciseBook/04.11/String.c @@ -0,0 +1,151 @@ +/*=========================== + * 习题4.10~4.14中使用的字符串 + ============================*/ + +#include "String.h" + +// 初始化:构造一个值为s的串t +void StrAssign(StringType* t, const char* s) { + if(s == NULL) { + *t = ""; + } + + *t = (char*) malloc((strlen(s) + 1) * sizeof(char)); + + strcpy(*t, s); +} + +// 比较:返回s与t的大小,如果大小一致,返回0 +int StrCompare(StringType s, StringType t) { + return strcmp(s, t); +} + +// 计数:返回字符串s的长度 +int StrLength(StringType s) { + return (int) strlen(s); +} + +// 联接:返回由s与t联接后的串 +StringType Concat(StringType s, StringType t) { + StringType r; + + if(s == NULL) { + s = ""; + } + + if(t == NULL) { + t = ""; + } + + r = (char*) malloc((strlen(s) + strlen(t) + 1) * sizeof(char)); + r[0] = '\0'; + + strcat(r, s); + strcat(r, t); + + return r; +} + +// 求子串:从s的start位置起,截取len个字符后返回 +StringType SubString(StringType s, int start, int len) { + int n; + char* sub; + + n = (int) strlen(s); + + if(start < 1 || start > n || start + len - 1 > n || len < 0) { + return ""; + } + + sub = (char*) malloc((len + 1) * sizeof(char)); + strncpy(sub, s + start - 1, len); + sub[len] = '\0'; + + return sub; +} + +// 查找:从s的pos位置起查找t,如果找到,返回其位置 +int Index(StringType s, StringType t, int pos) { + int m, n, i; + StringType sub; + + // 失败情形提前处理 + if(pos < 1 || pos > StrLength(s) || StrLength(t) == 0) { + return 0; + } + + n = StrLength(s); + m = StrLength(t); + i = pos; + + // 保证长度不越界 + while(i <= n - m + 1) { + // 获取S[i, i+m-1] + sub = SubString(s, i, m); + + // 如果子串与模式串不匹配,则需要继续推进 + if(StrCompare(sub, t) != 0) { + ++i; + } else { + return i; + } + } + + return 0; +} + +// 插入:在s的pos处插入t +Status StrInsert(StringType* s, int pos, StringType t) { + StringType r; + StringType s1, s2; + + if(pos < 1 || pos > StrLength(*s) + 1) { + return ERROR; + } + + r = (StringType) malloc((strlen(*s) + strlen(t) + 1) * sizeof(char)); + r[0] = '\0'; + + // 如果待插入的串为空,则提前返回 + if(StrLength(t) == 0) { + return OK; + } + + s1 = SubString(*s, 1, pos - 1); + s2 = SubString(*s, pos, (int) strlen(*s) - pos + 1); + + strcat(r, s1); + strcat(r, t); + strcat(r, s2); + + *s = r; + + return OK; +} + +// 删除:从s的pos位置起,删除len个字符 +Status StrDelete(StringType* s, int pos, int len) { + StringType r; + + if(pos < 1 || pos + len - 1 > StrLength(*s) || len < 0) { + return ERROR; + } + + // 如果待删除的长度为0,则提前返回 + if(len == 0) { + return OK; + } + + r = (StringType) malloc((StrLength(*s) - len + 1) * sizeof(char)); + strncpy(r, *s, pos - 1); + strcpy(r + pos - 1, *s + pos + len - 1); + + *s = r; + + return OK; +} + +// 输出字符串 +void StrPrint(StringType s) { + printf("%s\n", s); +} diff --git a/CLion/ExerciseBook/04.11/String.h b/CLion/ExerciseBook/04.11/String.h new file mode 100644 index 0000000..f4711a9 --- /dev/null +++ b/CLion/ExerciseBook/04.11/String.h @@ -0,0 +1,43 @@ +/*=========================== + * 习题4.10~4.14中使用的字符串 + ============================*/ + +#ifndef STRING_H +#define STRING_H + +#include +#include // 提供 strlen 原型 +#include "Status.h" //**▲01 绪论**// + +/* 字符串类型 */ +typedef char* StringType; + + +// 初始化:构造一个值为s的串t +void StrAssign(StringType* t, const char* s); + +// 比较:返回s与t的大小,如果大小一致,返回0 +int StrCompare(StringType s, StringType t); + +// 计数:返回字符串s的长度 +int StrLength(StringType s); + +// 联接:返回由s与t联接后的串 +StringType Concat(StringType s, StringType t); + +// 求子串:从s的start位置起,截取len个字符后返回 +StringType SubString(StringType s, int start, int len); + +// 查找:从s的pos位置起查找t,如果找到,返回其位置 +int Index(StringType s, StringType t, int pos); + +// 插入:在s的pos处插入t +Status StrInsert(StringType* s, int pos, StringType t); + +// 删除:从s的pos位置起,删除len个字符 +Status StrDelete(StringType* s, int pos, int len); + +// 输出字符串 +void StrPrint(StringType s); + +#endif diff --git a/CLion/ExerciseBook/04.12/04.12.c b/CLion/ExerciseBook/04.12/04.12.c new file mode 100644 index 0000000..dd73f38 --- /dev/null +++ b/CLion/ExerciseBook/04.12/04.12.c @@ -0,0 +1,56 @@ +#include +#include "Status.h" //**▲01 绪论**// +#include "String.h" //**字符串**// + +/* + * 替换:Replace + * + * 用V替换主串S中出现的所有与T相等的且不重叠的子串 + */ +Status Algo_4_12(StringType* S, StringType T, StringType V) { + int i; + + if(StrLength(*S) == 0 || StrLength(T) == 0) { + return ERROR; + } + + i = 1; + + // 在主串S中寻找模式串T第一次出现的位置 + while((i = Index(*S, T, i)) != 0) { + StrDelete(S, i, StrLength(T)); // 从S中删除T + StrInsert(S, i, V); // 向S中插入V + + i += StrLength(V); // i切换到下一个位置 + } + + return OK; +} + + +int main(int argc, char* argv[]) { + char* s = "----***--*-**-****-*****-----"; + char* t = "**"; + char* v = "^^"; + StringType T, S, V; + + printf("替换前...\n"); + + StrAssign(&S, s); + StrAssign(&T, t); + StrAssign(&V, v); + + printf("S = "); + StrPrint(S); + printf("T = "); + StrPrint(T); + printf("V = "); + StrPrint(V); + + printf("替换后...\n"); + printf("S = "); + Algo_4_12(&S, T, V); + StrPrint(S); + + return 0; +} diff --git a/CLion/ExerciseBook/04.12/CMakeLists.txt b/CLion/ExerciseBook/04.12/CMakeLists.txt new file mode 100644 index 0000000..ab3a77a --- /dev/null +++ b/CLion/ExerciseBook/04.12/CMakeLists.txt @@ -0,0 +1,7 @@ +# 包含公共库 +include_directories(${CMAKE_SOURCE_DIR}/Status) + +# 生成可执行文件 +add_executable(04.12 String.h String.c 04.12.c) +# 链接公共库 +target_link_libraries(04.12 Scanf_lib) \ No newline at end of file diff --git a/CLion/ExerciseBook/04.12/String.c b/CLion/ExerciseBook/04.12/String.c new file mode 100644 index 0000000..a476438 --- /dev/null +++ b/CLion/ExerciseBook/04.12/String.c @@ -0,0 +1,151 @@ +/*=========================== + * 习题4.10~4.14中使用的字符串 + ============================*/ + +#include "String.h" + +// 初始化:构造一个值为s的串t +void StrAssign(StringType* t, const char* s) { + if(s == NULL) { + *t = ""; + } + + *t = (char*) malloc((strlen(s) + 1) * sizeof(char)); + + strcpy(*t, s); +} + +// 比较:返回s与t的大小,如果大小一致,返回0 +int StrCompare(StringType s, StringType t) { + return strcmp(s, t); +} + +// 计数:返回字符串s的长度 +int StrLength(StringType s) { + return (int) strlen(s); +} + +// 联接:返回由s与t联接后的串 +StringType Concat(StringType s, StringType t) { + StringType r; + + if(s == NULL) { + s = ""; + } + + if(t == NULL) { + t = ""; + } + + r = (char*) malloc((strlen(s) + strlen(t) + 1) * sizeof(char)); + r[0] = '\0'; + + strcat(r, s); + strcat(r, t); + + return r; +} + +// 求子串:从s的start位置起,截取len个字符后返回 +StringType SubString(StringType s, int start, int len) { + int n; + char* sub; + + n = (int) strlen(s); + + if(start < 1 || start > n || start + len - 1 > n || len < 0) { + return ""; + } + + sub = (char*) malloc((len + 1) * sizeof(char)); + strncpy(sub, s + start - 1, len); + sub[len] = '\0'; + + return sub; +} + +// 查找:从s的pos位置起查找t,如果找到,返回其位置 +int Index(StringType s, StringType t, int pos) { + int m, n, i; + StringType sub; + + // 失败情形提前处理 + if(pos < 1 || pos > StrLength(s) || StrLength(t) == 0) { + return 0; + } + + n = StrLength(s); + m = StrLength(t); + i = pos; + + // 保证长度不越界 + while(i <= n - m + 1) { + // 获取S[i, i+m-1] + sub = SubString(s, i, m); + + // 如果子串与模式串不匹配,则需要继续推进 + if(StrCompare(sub, t) != 0) { + ++i; + } else { + return i; + } + } + + return 0; +} + +// 插入:在s的pos处插入t +Status StrInsert(StringType* s, int pos, StringType t) { + StringType r; + StringType s1, s2; + + if(pos < 1 || pos > StrLength(*s) + 1) { + return ERROR; + } + + r = (StringType) malloc((strlen(*s) + strlen(t) + 1) * sizeof(char)); + r[0] = '\0'; + + // 如果待插入的串为空,则提前返回 + if(StrLength(t) == 0) { + return OK; + } + + s1 = SubString(*s, 1, pos - 1); + s2 = SubString(*s, pos, (int) strlen(*s) - pos + 1); + + strcat(r, s1); + strcat(r, t); + strcat(r, s2); + + *s = r; + + return OK; +} + +// 删除:从s的pos位置起,删除len个字符 +Status StrDelete(StringType* s, int pos, int len) { + StringType r; + + if(pos < 1 || pos + len - 1 > StrLength(*s) || len < 0) { + return ERROR; + } + + // 如果待删除的长度为0,则提前返回 + if(len == 0) { + return OK; + } + + r = (StringType) malloc((StrLength(*s) - len + 1) * sizeof(char)); + strncpy(r, *s, pos - 1); + strcpy(r + pos - 1, *s + pos + len - 1); + + *s = r; + + return OK; +} + +// 输出字符串 +void StrPrint(StringType s) { + printf("%s\n", s); +} diff --git a/CLion/ExerciseBook/04.12/String.h b/CLion/ExerciseBook/04.12/String.h new file mode 100644 index 0000000..f4711a9 --- /dev/null +++ b/CLion/ExerciseBook/04.12/String.h @@ -0,0 +1,43 @@ +/*=========================== + * 习题4.10~4.14中使用的字符串 + ============================*/ + +#ifndef STRING_H +#define STRING_H + +#include +#include // 提供 strlen 原型 +#include "Status.h" //**▲01 绪论**// + +/* 字符串类型 */ +typedef char* StringType; + + +// 初始化:构造一个值为s的串t +void StrAssign(StringType* t, const char* s); + +// 比较:返回s与t的大小,如果大小一致,返回0 +int StrCompare(StringType s, StringType t); + +// 计数:返回字符串s的长度 +int StrLength(StringType s); + +// 联接:返回由s与t联接后的串 +StringType Concat(StringType s, StringType t); + +// 求子串:从s的start位置起,截取len个字符后返回 +StringType SubString(StringType s, int start, int len); + +// 查找:从s的pos位置起查找t,如果找到,返回其位置 +int Index(StringType s, StringType t, int pos); + +// 插入:在s的pos处插入t +Status StrInsert(StringType* s, int pos, StringType t); + +// 删除:从s的pos位置起,删除len个字符 +Status StrDelete(StringType* s, int pos, int len); + +// 输出字符串 +void StrPrint(StringType s); + +#endif diff --git a/CLion/ExerciseBook/04.13/04.13.c b/CLion/ExerciseBook/04.13/04.13.c new file mode 100644 index 0000000..1fd33b9 --- /dev/null +++ b/CLion/ExerciseBook/04.13/04.13.c @@ -0,0 +1,41 @@ +#include +#include "String.h" //**字符串**// + +/* + * 删除S中包含的T + */ +Status Algo_4_13(StringType* S, StringType T) { + int i; + + // 在S中查找T,如果找到就删除 + while((i = Index(*S, T, 1)) != 0) { + if(StrDelete(S, i, StrLength(T)) == ERROR) { + return ERROR; + } + } + + return OK; +} + + +int main(int argc, char* argv[]) { + char* s = "----***--*-**-****-*****-----"; + char* t = "**"; + StringType T, S; + + printf("删除前...\n"); + StrAssign(&S, s); + StrAssign(&T, t); + + printf("S = "); + StrPrint(S); + printf("T = "); + StrPrint(T); + + printf("删除后...\n"); + printf("S = "); + Algo_4_13(&S, T); + StrPrint(S); + + return 0; +} diff --git a/CLion/ExerciseBook/04.13/CMakeLists.txt b/CLion/ExerciseBook/04.13/CMakeLists.txt new file mode 100644 index 0000000..7e1710f --- /dev/null +++ b/CLion/ExerciseBook/04.13/CMakeLists.txt @@ -0,0 +1,7 @@ +# 包含公共库 +include_directories(${CMAKE_SOURCE_DIR}/Status) + +# 生成可执行文件 +add_executable(04.13 String.h String.c 04.13.c) +# 链接公共库 +target_link_libraries(04.13 Scanf_lib) \ No newline at end of file diff --git a/CLion/ExerciseBook/04.13/String.c b/CLion/ExerciseBook/04.13/String.c new file mode 100644 index 0000000..a476438 --- /dev/null +++ b/CLion/ExerciseBook/04.13/String.c @@ -0,0 +1,151 @@ +/*=========================== + * 习题4.10~4.14中使用的字符串 + ============================*/ + +#include "String.h" + +// 初始化:构造一个值为s的串t +void StrAssign(StringType* t, const char* s) { + if(s == NULL) { + *t = ""; + } + + *t = (char*) malloc((strlen(s) + 1) * sizeof(char)); + + strcpy(*t, s); +} + +// 比较:返回s与t的大小,如果大小一致,返回0 +int StrCompare(StringType s, StringType t) { + return strcmp(s, t); +} + +// 计数:返回字符串s的长度 +int StrLength(StringType s) { + return (int) strlen(s); +} + +// 联接:返回由s与t联接后的串 +StringType Concat(StringType s, StringType t) { + StringType r; + + if(s == NULL) { + s = ""; + } + + if(t == NULL) { + t = ""; + } + + r = (char*) malloc((strlen(s) + strlen(t) + 1) * sizeof(char)); + r[0] = '\0'; + + strcat(r, s); + strcat(r, t); + + return r; +} + +// 求子串:从s的start位置起,截取len个字符后返回 +StringType SubString(StringType s, int start, int len) { + int n; + char* sub; + + n = (int) strlen(s); + + if(start < 1 || start > n || start + len - 1 > n || len < 0) { + return ""; + } + + sub = (char*) malloc((len + 1) * sizeof(char)); + strncpy(sub, s + start - 1, len); + sub[len] = '\0'; + + return sub; +} + +// 查找:从s的pos位置起查找t,如果找到,返回其位置 +int Index(StringType s, StringType t, int pos) { + int m, n, i; + StringType sub; + + // 失败情形提前处理 + if(pos < 1 || pos > StrLength(s) || StrLength(t) == 0) { + return 0; + } + + n = StrLength(s); + m = StrLength(t); + i = pos; + + // 保证长度不越界 + while(i <= n - m + 1) { + // 获取S[i, i+m-1] + sub = SubString(s, i, m); + + // 如果子串与模式串不匹配,则需要继续推进 + if(StrCompare(sub, t) != 0) { + ++i; + } else { + return i; + } + } + + return 0; +} + +// 插入:在s的pos处插入t +Status StrInsert(StringType* s, int pos, StringType t) { + StringType r; + StringType s1, s2; + + if(pos < 1 || pos > StrLength(*s) + 1) { + return ERROR; + } + + r = (StringType) malloc((strlen(*s) + strlen(t) + 1) * sizeof(char)); + r[0] = '\0'; + + // 如果待插入的串为空,则提前返回 + if(StrLength(t) == 0) { + return OK; + } + + s1 = SubString(*s, 1, pos - 1); + s2 = SubString(*s, pos, (int) strlen(*s) - pos + 1); + + strcat(r, s1); + strcat(r, t); + strcat(r, s2); + + *s = r; + + return OK; +} + +// 删除:从s的pos位置起,删除len个字符 +Status StrDelete(StringType* s, int pos, int len) { + StringType r; + + if(pos < 1 || pos + len - 1 > StrLength(*s) || len < 0) { + return ERROR; + } + + // 如果待删除的长度为0,则提前返回 + if(len == 0) { + return OK; + } + + r = (StringType) malloc((StrLength(*s) - len + 1) * sizeof(char)); + strncpy(r, *s, pos - 1); + strcpy(r + pos - 1, *s + pos + len - 1); + + *s = r; + + return OK; +} + +// 输出字符串 +void StrPrint(StringType s) { + printf("%s\n", s); +} diff --git a/CLion/ExerciseBook/04.13/String.h b/CLion/ExerciseBook/04.13/String.h new file mode 100644 index 0000000..f4711a9 --- /dev/null +++ b/CLion/ExerciseBook/04.13/String.h @@ -0,0 +1,43 @@ +/*=========================== + * 习题4.10~4.14中使用的字符串 + ============================*/ + +#ifndef STRING_H +#define STRING_H + +#include +#include // 提供 strlen 原型 +#include "Status.h" //**▲01 绪论**// + +/* 字符串类型 */ +typedef char* StringType; + + +// 初始化:构造一个值为s的串t +void StrAssign(StringType* t, const char* s); + +// 比较:返回s与t的大小,如果大小一致,返回0 +int StrCompare(StringType s, StringType t); + +// 计数:返回字符串s的长度 +int StrLength(StringType s); + +// 联接:返回由s与t联接后的串 +StringType Concat(StringType s, StringType t); + +// 求子串:从s的start位置起,截取len个字符后返回 +StringType SubString(StringType s, int start, int len); + +// 查找:从s的pos位置起查找t,如果找到,返回其位置 +int Index(StringType s, StringType t, int pos); + +// 插入:在s的pos处插入t +Status StrInsert(StringType* s, int pos, StringType t); + +// 删除:从s的pos位置起,删除len个字符 +Status StrDelete(StringType* s, int pos, int len); + +// 输出字符串 +void StrPrint(StringType s); + +#endif diff --git a/CLion/ExerciseBook/04.14/04.14.c b/CLion/ExerciseBook/04.14/04.14.c new file mode 100644 index 0000000..82d606d --- /dev/null +++ b/CLion/ExerciseBook/04.14/04.14.c @@ -0,0 +1,92 @@ +#include +#include +#include "SqStack.h" //**▲03 栈和队列**// +#include "String.h" //**字符串**// + +/* + * 将前缀表达式prefix转换为后缀表达式 + * + *【注】 + * 未对前缀表达式的正确性进行验证 + */ +Status Algo_4_14(const char* prefix, char** suffix) { + StringType P, S; + StringType Operator; // 运算符 + SqStack stack; // 表达式栈 + StringType e; // 栈顶元素 + StringType o; // 靠近栈顶的运算符 + int i, len; + int readStr; // 是否需要读取字符串 + + len = (int) strlen(prefix); + + if(len == 0) { + *suffix = NULL; + return ERROR; + } + + // 运算符和操作数 + StrAssign(&Operator, "+-*/"); + + // 前缀表达式 + StrAssign(&P, prefix); + + // 后缀表达式栈 + InitStack(&stack); + + readStr = 1; + i = 1; + + // 遍历前缀表达式,逐个获取元素 + while(TRUE) { + if(readStr == 1) { + S = SubString(P, i++, 1); + } + + // 如果遇到了运算符,则直接入栈 + if(Index(Operator, S, 1) != 0) { + Push(&stack, S); + readStr = 1; + + // 如果遇到了操作数 + } else { + // 获取栈顶元素,如果栈已经为空,则S中存储了后缀表达式 + if(GetTop(stack, &e) == ERROR) { + break; + } + + // 如果栈顶元素是运算符,则将操作数直接入栈 + if(Index(Operator, e, 1) != 0) { + Push(&stack, S); + readStr = 1; + + // 否则栈顶也是操作数,需要进行简单运算 + } else { + Pop(&stack, &e); // 弹出栈顶操作数 + Pop(&stack, &o); // 弹出靠近栈顶的运算符 + + S = Concat(e, S); + S = Concat(S, o); + + // 此种情形下不需要读取字符串,而需要判断刚刚计算出的Sub + readStr = 0; + } + } + } + + // 获取后缀表达式 + *suffix = S; + + return OK; +} + + +int main(int argc, char* argv[]) { + char* prefix = "-+a*bc/de"; // 其后缀表达式为:abc*+de/- + char* suffix; + + Algo_4_14(prefix, &suffix); + + printf("前缀表达式:%s\n", prefix); + printf("后缀表达式:%s\n", suffix); +} diff --git a/CLion/ExerciseBook/04.14/CMakeLists.txt b/CLion/ExerciseBook/04.14/CMakeLists.txt new file mode 100644 index 0000000..e379689 --- /dev/null +++ b/CLion/ExerciseBook/04.14/CMakeLists.txt @@ -0,0 +1,7 @@ +# 包含公共库 +include_directories(${CMAKE_SOURCE_DIR}/Status) + +# 生成可执行文件 +add_executable(04.14 SqStack.h SqStack.c String.h String.c 04.14.c) +# 链接公共库 +target_link_libraries(04.14 Scanf_lib) \ No newline at end of file diff --git a/CLion/ExerciseBook/04.14/SqStack.c b/CLion/ExerciseBook/04.14/SqStack.c new file mode 100644 index 0000000..fd5d388 --- /dev/null +++ b/CLion/ExerciseBook/04.14/SqStack.c @@ -0,0 +1,89 @@ +/*========================= + * 栈的顺序存储结构(顺序栈) + ==========================*/ + +#include "SqStack.h" //**▲03 栈和队列**// + +/* + * 初始化 + * + * 构造一个空栈。初始化成功则返回OK,否则返回ERROR。 + */ +Status InitStack(SqStack* S) { + if(S == NULL) { + return ERROR; + } + + (*S).base = (SElemType*) malloc(STACK_INIT_SIZE * sizeof(SElemType)); + if((*S).base == NULL) { + exit(OVERFLOW); + } + + (*S).top = (*S).base; + (*S).stacksize = STACK_INIT_SIZE; + + return OK; +} + +/* + * 取值 + * + * 返回栈顶元素,并用e接收。 + */ +Status GetTop(SqStack S, SElemType* e) { + if(S.base == NULL || S.top == S.base) { + return ERROR; + } + + // 不会改变栈中元素 + *e = *(S.top - 1); + + return OK; +} + +/* + * 入栈 + * + * 将元素e压入到栈顶。 + */ +Status Push(SqStack* S, SElemType e) { + if(S == NULL || (*S).base == NULL) { + return ERROR; + } + + // 栈满时,追加存储空间 + if((*S).top - (*S).base >= (*S).stacksize) { + (*S).base = (SElemType*) realloc((*S).base, ((*S).stacksize + STACKINCREMENT) * sizeof(SElemType)); + if((*S).base == NULL) { + exit(OVERFLOW); // 存储分配失败 + } + + (*S).top = (*S).base + (*S).stacksize; + (*S).stacksize += STACKINCREMENT; + } + + // 进栈先赋值,栈顶指针再自增 + *(S->top++) = e; + + return OK; +} + +/* + * 出栈 + * + * 将栈顶元素弹出,并用e接收。 + */ +Status Pop(SqStack* S, SElemType* e) { + if(S == NULL || (*S).base == NULL) { + return ERROR; + } + + if((*S).top == (*S).base) { + return ERROR; + } + + // 出栈栈顶指针先递减,再赋值 + *e = *(--(*S).top); + + return OK; +} diff --git a/CLion/ExerciseBook/04.14/SqStack.h b/CLion/ExerciseBook/04.14/SqStack.h new file mode 100644 index 0000000..3e743cc --- /dev/null +++ b/CLion/ExerciseBook/04.14/SqStack.h @@ -0,0 +1,61 @@ +/*========================= + * 栈的顺序存储结构(顺序栈) + ==========================*/ + +#ifndef SQSTACK_H +#define SQSTACK_H + +#include +#include // 提供malloc、realloc、free、exit原型 +#include "Status.h" //**▲01 绪论**// +#include "String.h" //**▲04 串**// + +/* 宏定义 */ +#define STACK_INIT_SIZE 100 // 顺序栈存储空间的初始分配量 +#define STACKINCREMENT 10 // 顺序栈存储空间的分配增量 + +/* + * 顺序栈元素类型定义 + * + *【注】 + * 这里的元素类型为字符串 + */ +typedef StringType SElemType; + +// 顺序栈元素结构 +typedef struct { + SElemType* base; // 栈底指针 + SElemType* top; // 栈顶指针 + int stacksize; // 当前已分配的存储空间,以元素为单位 +} SqStack; + + +/* + * 初始化 + * + * 构造一个空栈。初始化成功则返回OK,否则返回ERROR。 + */ +Status InitStack(SqStack* S); + +/* + * 取值 + * + * 返回栈顶元素,并用e接收。 + */ +Status GetTop(SqStack S, SElemType* e); + +/* + * 入栈 + * + * 将元素e压入到栈顶。 + */ +Status Push(SqStack* S, SElemType e); + +/* + * 出栈 + * + * 将栈顶元素弹出,并用e接收。 + */ +Status Pop(SqStack* S, SElemType* e); + +#endif diff --git a/CLion/ExerciseBook/04.14/String.c b/CLion/ExerciseBook/04.14/String.c new file mode 100644 index 0000000..a476438 --- /dev/null +++ b/CLion/ExerciseBook/04.14/String.c @@ -0,0 +1,151 @@ +/*=========================== + * 习题4.10~4.14中使用的字符串 + ============================*/ + +#include "String.h" + +// 初始化:构造一个值为s的串t +void StrAssign(StringType* t, const char* s) { + if(s == NULL) { + *t = ""; + } + + *t = (char*) malloc((strlen(s) + 1) * sizeof(char)); + + strcpy(*t, s); +} + +// 比较:返回s与t的大小,如果大小一致,返回0 +int StrCompare(StringType s, StringType t) { + return strcmp(s, t); +} + +// 计数:返回字符串s的长度 +int StrLength(StringType s) { + return (int) strlen(s); +} + +// 联接:返回由s与t联接后的串 +StringType Concat(StringType s, StringType t) { + StringType r; + + if(s == NULL) { + s = ""; + } + + if(t == NULL) { + t = ""; + } + + r = (char*) malloc((strlen(s) + strlen(t) + 1) * sizeof(char)); + r[0] = '\0'; + + strcat(r, s); + strcat(r, t); + + return r; +} + +// 求子串:从s的start位置起,截取len个字符后返回 +StringType SubString(StringType s, int start, int len) { + int n; + char* sub; + + n = (int) strlen(s); + + if(start < 1 || start > n || start + len - 1 > n || len < 0) { + return ""; + } + + sub = (char*) malloc((len + 1) * sizeof(char)); + strncpy(sub, s + start - 1, len); + sub[len] = '\0'; + + return sub; +} + +// 查找:从s的pos位置起查找t,如果找到,返回其位置 +int Index(StringType s, StringType t, int pos) { + int m, n, i; + StringType sub; + + // 失败情形提前处理 + if(pos < 1 || pos > StrLength(s) || StrLength(t) == 0) { + return 0; + } + + n = StrLength(s); + m = StrLength(t); + i = pos; + + // 保证长度不越界 + while(i <= n - m + 1) { + // 获取S[i, i+m-1] + sub = SubString(s, i, m); + + // 如果子串与模式串不匹配,则需要继续推进 + if(StrCompare(sub, t) != 0) { + ++i; + } else { + return i; + } + } + + return 0; +} + +// 插入:在s的pos处插入t +Status StrInsert(StringType* s, int pos, StringType t) { + StringType r; + StringType s1, s2; + + if(pos < 1 || pos > StrLength(*s) + 1) { + return ERROR; + } + + r = (StringType) malloc((strlen(*s) + strlen(t) + 1) * sizeof(char)); + r[0] = '\0'; + + // 如果待插入的串为空,则提前返回 + if(StrLength(t) == 0) { + return OK; + } + + s1 = SubString(*s, 1, pos - 1); + s2 = SubString(*s, pos, (int) strlen(*s) - pos + 1); + + strcat(r, s1); + strcat(r, t); + strcat(r, s2); + + *s = r; + + return OK; +} + +// 删除:从s的pos位置起,删除len个字符 +Status StrDelete(StringType* s, int pos, int len) { + StringType r; + + if(pos < 1 || pos + len - 1 > StrLength(*s) || len < 0) { + return ERROR; + } + + // 如果待删除的长度为0,则提前返回 + if(len == 0) { + return OK; + } + + r = (StringType) malloc((StrLength(*s) - len + 1) * sizeof(char)); + strncpy(r, *s, pos - 1); + strcpy(r + pos - 1, *s + pos + len - 1); + + *s = r; + + return OK; +} + +// 输出字符串 +void StrPrint(StringType s) { + printf("%s\n", s); +} diff --git a/CLion/ExerciseBook/04.14/String.h b/CLion/ExerciseBook/04.14/String.h new file mode 100644 index 0000000..f4711a9 --- /dev/null +++ b/CLion/ExerciseBook/04.14/String.h @@ -0,0 +1,43 @@ +/*=========================== + * 习题4.10~4.14中使用的字符串 + ============================*/ + +#ifndef STRING_H +#define STRING_H + +#include +#include // 提供 strlen 原型 +#include "Status.h" //**▲01 绪论**// + +/* 字符串类型 */ +typedef char* StringType; + + +// 初始化:构造一个值为s的串t +void StrAssign(StringType* t, const char* s); + +// 比较:返回s与t的大小,如果大小一致,返回0 +int StrCompare(StringType s, StringType t); + +// 计数:返回字符串s的长度 +int StrLength(StringType s); + +// 联接:返回由s与t联接后的串 +StringType Concat(StringType s, StringType t); + +// 求子串:从s的start位置起,截取len个字符后返回 +StringType SubString(StringType s, int start, int len); + +// 查找:从s的pos位置起查找t,如果找到,返回其位置 +int Index(StringType s, StringType t, int pos); + +// 插入:在s的pos处插入t +Status StrInsert(StringType* s, int pos, StringType t); + +// 删除:从s的pos位置起,删除len个字符 +Status StrDelete(StringType* s, int pos, int len); + +// 输出字符串 +void StrPrint(StringType s); + +#endif diff --git a/CLion/ExerciseBook/04.15-04.17/04.15-04.17.c b/CLion/ExerciseBook/04.15-04.17/04.15-04.17.c new file mode 100644 index 0000000..bcb35a6 --- /dev/null +++ b/CLion/ExerciseBook/04.15-04.17/04.15-04.17.c @@ -0,0 +1,92 @@ +#include +#include "Status.h" //**▲01 绪论**// +#include "SString.h" //**▲04 串**// + +/* + * 初始化:StrAssign + * + *【注】 + * 该函数已在SString相关文件中定义 + */ +Status Algo_4_15(SString T, char* chars); + +/* + * 比较:StrCompare + * + *【注】 + * 该函数已在SString相关文件中定义 + */ +int Algo_4_16(SString S, SString T); + +/* + * 替换:Replace + * + *【注】 + * 该函数已在SString相关文件中定义 + */ +Status Algo_4_17(SString S, SString T, SString V); + + +int main(int argc, char* argv[]) { + char* t = "ab**c*de***fg"; + char* s = "ab**c*de***fh"; + SString T, S, M1, M2; + int i; + + printf("███题 4.15 验证...███\n"); + Algo_4_15(T, t); + Algo_4_15(S, s); + printf("T = "); + StrPrint(T); + printf("S = "); + StrPrint(S); + + printf("███题 4.16 验证...███\n"); + i = Algo_4_16(S, T); + if(i > 0) { + printf("S > T\n"); + } else if(i < 0) { + printf("S < T\n"); + } else { + printf("S == T\n"); + } + + printf("███题 4.17 验证...███\n"); + Algo_4_15(M1, "**"); + Algo_4_15(M2, "^"); + Algo_4_17(S, M1, M2); + printf("用 \"^\" 替换 \"**\" 后:\nS = "); + StrPrint(S); + + return 0; +} + +/* + * 初始化:StrAssign + * + *【注】 + * 该函数已在SString相关文件中定义 + */ +Status Algo_4_15(SString T, char* chars) { + return StrAssign(T, chars); +} + +/* + * 比较:StrCompare + * + *【注】 + * 该函数已在SString相关文件中定义 + */ +int Algo_4_16(SString S, SString T) { + return StrCompare(S, T); +} + +/* + * 替换:Replace + * + *【注】 + * 该函数已在SString相关文件中定义 + */ +Status Algo_4_17(SString S, SString T, SString V) { + return Replace(S, T, V); +} diff --git a/CLion/ExerciseBook/04.15-04.17/CMakeLists.txt b/CLion/ExerciseBook/04.15-04.17/CMakeLists.txt new file mode 100644 index 0000000..3483e43 --- /dev/null +++ b/CLion/ExerciseBook/04.15-04.17/CMakeLists.txt @@ -0,0 +1,7 @@ +# 包含公共库 +include_directories(${CMAKE_SOURCE_DIR}/Status) + +# 生成可执行文件 +add_executable(04.15-04.17 SString.h SString.c 04.15-04.17.c) +# 链接公共库 +target_link_libraries(04.15-04.17 Scanf_lib) \ No newline at end of file diff --git a/CLion/ExerciseBook/04.15-04.17/SString.c b/CLion/ExerciseBook/04.15-04.17/SString.c new file mode 100644 index 0000000..8673b3b --- /dev/null +++ b/CLion/ExerciseBook/04.15-04.17/SString.c @@ -0,0 +1,406 @@ +/*============================= + * 串的定长顺序存储表示(顺序串) + * + * 包含算法: 4.1、4.2、4.3、4.5 + ==============================*/ + +#include "SString.h" //**▲04 串**// + +/* + * 初始化 + * + * 构造一个值为chars的串T。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status StrAssign(SString T, const char* chars) { + int i, len; + + len = (int) strlen(chars); + + // chars过长 + if(len > MAXSTRLEN) { + return ERROR; + } + + T[0] = len; + for(i = 1; i <= len; i++) { + T[i] = chars[i - 1]; + } + + return OK; +} + +/* + * 销毁 + * + * 将串S销毁。 + * + *【注】 + * 顺序串的结构无法销毁 + */ +Status DestroyString(SString S) { + return OK; +} + +/* + * 清空 + * + * 将串S清空。 + */ +Status ClearString(SString S) { + // 只需要将长度置为0就可以 + S[0] = 0; + return OK; +} + +/* + * 判空 + * + * 判断串S中是否包含有效数据。 + * + * 返回值: + * TRUE : 串S为空 + * FALSE: 串S不为空 + */ +Status StrEmpty(SString S) { + return S[0] == 0 ? TRUE : FALSE; +} + +/* + * 计数 + * + * 返回串S中元素的个数。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrLength(SString S) { + return S[0]; +} + +/* + * ████████ 算法4.3 ████████ + * + * 求子串 + * + * 用Sub返回S[pos, pos+len-1]。 + * 返回值指示是否截取成功。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status SubString(SString Sub, SString S, int pos, int len) { + int i; + + if(pos < 1 || pos > S[0] || len < 0 || pos + len - 1 > S[0]) { + return ERROR; + } + + // 复制元素 + for(i = 1; i <= len; i++) { + Sub[i] = S[pos + i - 1]; + } + + // 确定新长度 + Sub[0] = len; + + return OK; +} + +/* + * ████████ 算法4.1 ████████ + * + * 查找 + * + * 从pos处开始搜索模式串T在主串S中首次出现的位置,如果不存在,则返回0。 + * 如果查找成功,返回匹配的位置。 + * + *【注】 + * 1.此实现需要依赖串的最小操作子集 + * 2.该实现比较低效 + */ +int Index_1(SString S, SString T, int pos) { + int i, n, m; // 记录S和T的长度 + SString sub; + + /* + * 失败情形提前处理 + * 这里与教材写法略微不同 + */ + if(pos < 1 || pos > S[0] || StrEmpty(T)) { + return 0; + } + + n = StrLength(S); + m = StrLength(T); + i = pos; + + // 保证长度不越界 + while(i <= n - m + 1) { + // 获取S[i, i+m-1] + SubString(sub, S, i, m); + + // 如果子串与模式串不匹配,则需要继续推进 + if(StrCompare(sub, T) != 0) { + ++i; + } else { + return i; + } + } + + return 0; +} + +/* + * ████████ 算法4.5 ████████ + * + * 查找 + * + * 从pos处开始搜索模式串T在主串S中首次出现的位置,如果不存在,则返回0。 + * 如果查找成功,返回匹配的位置。 + * + *【注】 + * 1.此实现不依赖串的最小操作子集 + * 2.该实现比较低效 + */ +int Index_2(SString S, SString T, int pos) { + int i = pos; + int j = 1; + + if(pos < 1 || pos > S[0] || StrEmpty(T)) { + return 0; + } + + while(i <= S[0] && j <= T[0]) { + // 遇到相同字符,则继续比较后继字符 + if(S[i] == T[j]) { + i++; + j++; + + // 遇到不同的字符,则游标需要回退,重新比较 + } else { + i = i - (j - 1) + 1; // j-1代表徒劳地前进了j-1个元素,在第j个元素上功亏一篑 + j = 1; // 游标j回到串T的第一个位置 + } + } + + // 增加了一个T[0]>0的判断 + if(j > T[0] && T[0] > 0) { // T不为空串 + return i - T[0]; // 匹配成功 + } else { + return 0; + } +} + +/* + * 插入 + * + * 将串T插入到主串S的pos位置处。 + */ +Status StrInsert(SString S, int pos, SString T) { + int i; + + if(pos < 1 || pos > S[0] + 1 || S[0] + T[0] > MAXSTRLEN) { + return ERROR; + } + + // 如果待插入的串为空,则提前返回 + if(StrEmpty(T)) { + return OK; + } + + // 在S中腾出位置,为插入T做准备 + for(i = S[0]; i >= pos; i--) { + // 从后向前遍历,将前面的元素挪到后面 + S[i + T[0]] = S[i]; + } + + // 将串T插入在S中腾出的位置上 + for(i = pos; i <= pos + T[0] - 1; i++) { + S[i] = T[i - pos + 1]; + } + + // 长度增加 + S[0] += T[0]; + + return OK; +} + +/* + * 删除 + * + * 删除S[pos, pos+len-1]。 + */ +Status StrDelete(SString S, int pos, int len) { + int i; + + if(pos < 1 || pos + len - 1 > S[0] || len < 0) { + return ERROR; + } + + // 如果待删除的长度为0,则提前返回 + if(len == 0) { + return OK; + } + + // 把后面的元素挪到前面,覆盖掉被删除的元素 + for(i = pos + len; i <= S[0]; i++) { + S[i - len] = S[i]; + } + + // 长度减少 + S[0] -= len; + + return OK; +} + +/* + * 比较 + * + * 比较串S和串T,返回比较结果。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrCompare(SString S, SString T) { + int i = 1; + + while(i <= S[0] && i <= T[0]) { + // 遇到不同的字符时,比较其大小 + if(S[i] != T[i]) { + return S[i] - T[i]; + } + + i++; + } + + return S[0] - T[0]; +} + +/* + * 复制 + * + * 将串S复制到串T。 + */ +Status StrCopy(SString T, SString S) { + int i; + + // 连同长度信息一起复制 + for(i = 0; i <= S[0]; i++) { + T[i] = S[i]; + } + + return OK; +} + +/* + * 替换 + * + * 用V替换主串S中出现的所有与T相等的且不重叠的子串。 + * + *【注】 + * 1.该操作依赖最小操作子集 + * 2.该实现比较低效 + */ +Status Replace(SString S, SString T, SString V) { + int i; + + if(StrEmpty(S) || StrEmpty(T)) { + return ERROR; + } + + // 在主串S中寻找模式串T第一次出现的位置 + i = Index_2(S, T, 1); + + // 如果存在匹配的字符串,且可以被完全替换(替换后不溢出) + while(i != 0 && S[0] - T[0] + V[0] <= MAXSTRLEN) { + StrDelete(S, i, StrLength(T)); // 从S中删除T + StrInsert(S, i, V); // 向S中插入V + + i += StrLength(V); // i切换到下一个位置 + + i = Index_2(S, T, i); // 查找下一个匹配的字符串 + } + + if(i == 0) { // S中的T已全部被替换 + return OK; + } else { // S中尚有T,但是V已经插不进去了 + return ERROR; + } +} + +/* + * ████████ 算法4.2 ████████ + * + * 串联接 + * + * 联接S1和S2,并存储到T中返回。如果联接后的长度溢出,则只保留未溢出的部分。 + * 返回值表示联接后的串是否完整。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status Concat(SString T, SString S1, SString S2) { + int i; + int uncut; // 新串是否完整 + + // 完全不需要裁剪 + if(S1[0] + S2[0] <= MAXSTRLEN) { + // 复制S1到T中 + for(i = 1; i <= S1[0]; i++) { + T[i] = S1[i]; + } + + // 复制S2到T中 + for(i = S1[0] + 1; i <= S1[0] + S2[0]; i++) { + T[i] = S2[i - S1[0]]; + } + + // 设置新长度 + T[0] = S1[0] + S2[0]; + + // 未裁剪,完整 + uncut = TRUE; + + // 需要裁剪S2 + } else if(S1[0] <= MAXSTRLEN) { + // 复制S1到T中 + for(i = 1; i <= S1[0]; i++) { + T[i] = S1[i]; + } + + // 将S2的一部分复制到T中 + for(i = S1[0] + 1; i <= MAXSTRLEN; i++) { + T[i] = S2[i - S1[0]]; + } + + // 设置新长度 + T[0] = MAXSTRLEN; + + uncut = FALSE; + + // 只需要复制S1的一部分 + } else { + // 连同长度信息一起复制 + for(i = 0; i <= MAXSTRLEN; i++) { + T[i] = S1[i]; + } + + uncut = FALSE; + } + + return uncut; +} + +// 输出:打印字符串 +void StrPrint(SString S) { + int i; + + for(i = 1; i<=S[0] ; i++) { + printf("%c", S[i]); + } + + printf("\n"); +} diff --git a/CLion/ExerciseBook/04.15-04.17/SString.h b/CLion/ExerciseBook/04.15-04.17/SString.h new file mode 100644 index 0000000..d164913 --- /dev/null +++ b/CLion/ExerciseBook/04.15-04.17/SString.h @@ -0,0 +1,179 @@ +/*============================= + * 串的定长顺序存储表示(顺序串) + * + * 包含算法: 4.1、4.2、4.3、4.5 + ==============================*/ + +#ifndef SSTRING_H +#define SSTRING_H + +#include +#include // 提供strlen原型 +#include "Status.h" //**▲01 绪论**// + +/* 宏定义 */ +#define MAXSTRLEN 255 // 顺序串的最大串长 + +/* + * 串的顺序存储类型定义 + * + * 注:有效元素从SString的1号单元开始存储 + * SString的0号单元用来存储其长度 + */ +typedef unsigned char SString[MAXSTRLEN + 1]; // 0号单元存放串的长度 + + +/* + * ████ 提示 ████ + * + * 遵循教材的书写习惯,pos指示字符的位序(不是索引),从1开始计数 + */ + + +/* + * 初始化 + * + * 构造一个值为chars的串T。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status StrAssign(SString T, const char* chars); + +/* + * 销毁 + * + * 将串S销毁。 + * + *【注】 + * 顺序串的结构无法销毁 + */ +Status DestroyString(SString S); + +/* + * 清空 + * + * 将串S清空。 + */ +Status ClearString(SString S); + +/* + * 判空 + * + * 判断串S中是否包含有效数据。 + * + * 返回值: + * TRUE : 串S为空 + * FALSE: 串S不为空 + */ +Status StrEmpty(SString S); + +/* + * 计数 + * + * 返回串S中元素的个数。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrLength(SString S); + +/* + * ████████ 算法4.3 ████████ + * + * 求子串 + * + * 用Sub返回S[pos, pos+len-1]。 + * 返回值指示是否截取成功。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status SubString(SString Sub, SString S, int pos, int len); + +/* + * ████████ 算法4.1 ████████ + * + * 查找 + * + * 从pos处开始搜索模式串T在主串S中首次出现的位置,如果不存在,则返回0。 + * 如果查找成功,返回匹配的位置。 + * + *【注】 + * 1.此实现需要依赖串的最小操作子集 + * 2.该实现比较低效 + */ +int Index_1(SString S, SString T, int pos); + +/* + * ████████ 算法4.5 ████████ + * + * 查找 + * + * 从pos处开始搜索模式串T在主串S中首次出现的位置,如果不存在,则返回0。 + * 如果查找成功,返回匹配的位置。 + * + *【注】 + * 1.此实现不依赖串的最小操作子集 + * 2.该实现比较低效 + */ +int Index_2(SString S, SString T, int pos); + +/* + * 插入 + * + * 将串T插入到主串S的pos位置处。 + */ +Status StrInsert(SString S, int pos, SString T); + +/* + * 删除 + * + * 删除S[pos, pos+len-1]。 + */ +Status StrDelete(SString S, int pos, int len); + +/* + * 比较 + * + * 比较串S和串T,返回比较结果。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrCompare(SString S, SString T); + +/* + * 复制 + * + * 将串S复制到串T。 + */ +Status StrCopy(SString T, SString S); + +/* + * 替换 + * + * 用V替换主串S中出现的所有与T相等的且不重叠的子串。 + * + *【注】 + * 该操作依赖最小操作子集,效率较低。 + */ +Status Replace(SString S, SString T, SString V); + +/* + * ████████ 算法4.2 ████████ + * + * 串联接 + * + * 联接S1和S2,并存储到T中返回。如果联接后的长度溢出,则只保留未溢出的部分。 + * 返回值表示联接后的串是否完整。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status Concat(SString T, SString S1, SString S2); + +// 输出:打印字符串 +void StrPrint(SString S); + +#endif diff --git a/CLion/ExerciseBook/04.18/04.18.c b/CLion/ExerciseBook/04.18/04.18.c new file mode 100644 index 0000000..38049c4 --- /dev/null +++ b/CLion/ExerciseBook/04.18/04.18.c @@ -0,0 +1,62 @@ +#include +#include +#include "SString.h" //**▲04 串**// + +/* + * 统计字符串S中不同字符总数与每种字符的个数,返回统计结果 + */ +int* Algo_4_18(SString S); + + +int main(int argc, char* argv[]) { + char* s = "dbasydujhge638940[gptokljrsehgadcsbnmv,c.b'ng[p098437eywdghswqdecxvghju"; + SString S; + int* total; + int i; + + StrAssign(S, s); + printf("S = "); + StrPrint(S); + + total = Algo_4_18(S); + printf(" S 中不同的字符共计 %d 个:\n", total[0]); + for(i = 1; i <= 127; i++) { + if(total[i] != 0) { + printf("字符 \'%c\' 有 %d 个.\n", i, total[i]); + } + } + printf("统计完毕...\n"); + + return 0; +} + + +/* + * 统计字符串S中不同字符总数与每种字符的个数,返回统计结果 + */ +int* Algo_4_18(SString S) { + int i; + int* total; + + /* + * total长度设为128, + * 0号单元存储不同字符的总数, + * 其他单元存储各种不同字符的数量。 + * + * 注:不统计空字符'\0' + */ + total = (int*) malloc(128 * sizeof(int)); + memset(total, 0, 128 * sizeof(int)); + + for(i = 1; i <= S[0]; i++) { + // 如果遇到了新字符,则统计不同字符的数量 + if(total[S[i]] == 0) { + total[0]++; + } + + // 统计遇到的字符数量 + total[S[i]]++; + } + + return total; +} diff --git a/CLion/ExerciseBook/04.18/CMakeLists.txt b/CLion/ExerciseBook/04.18/CMakeLists.txt new file mode 100644 index 0000000..5df8341 --- /dev/null +++ b/CLion/ExerciseBook/04.18/CMakeLists.txt @@ -0,0 +1,7 @@ +# 包含公共库 +include_directories(${CMAKE_SOURCE_DIR}/Status) + +# 生成可执行文件 +add_executable(04.18 SString.h SString.c 04.18.c) +# 链接公共库 +target_link_libraries(04.18 Scanf_lib) \ No newline at end of file diff --git a/CLion/ExerciseBook/04.18/SString.c b/CLion/ExerciseBook/04.18/SString.c new file mode 100644 index 0000000..8673b3b --- /dev/null +++ b/CLion/ExerciseBook/04.18/SString.c @@ -0,0 +1,406 @@ +/*============================= + * 串的定长顺序存储表示(顺序串) + * + * 包含算法: 4.1、4.2、4.3、4.5 + ==============================*/ + +#include "SString.h" //**▲04 串**// + +/* + * 初始化 + * + * 构造一个值为chars的串T。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status StrAssign(SString T, const char* chars) { + int i, len; + + len = (int) strlen(chars); + + // chars过长 + if(len > MAXSTRLEN) { + return ERROR; + } + + T[0] = len; + for(i = 1; i <= len; i++) { + T[i] = chars[i - 1]; + } + + return OK; +} + +/* + * 销毁 + * + * 将串S销毁。 + * + *【注】 + * 顺序串的结构无法销毁 + */ +Status DestroyString(SString S) { + return OK; +} + +/* + * 清空 + * + * 将串S清空。 + */ +Status ClearString(SString S) { + // 只需要将长度置为0就可以 + S[0] = 0; + return OK; +} + +/* + * 判空 + * + * 判断串S中是否包含有效数据。 + * + * 返回值: + * TRUE : 串S为空 + * FALSE: 串S不为空 + */ +Status StrEmpty(SString S) { + return S[0] == 0 ? TRUE : FALSE; +} + +/* + * 计数 + * + * 返回串S中元素的个数。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrLength(SString S) { + return S[0]; +} + +/* + * ████████ 算法4.3 ████████ + * + * 求子串 + * + * 用Sub返回S[pos, pos+len-1]。 + * 返回值指示是否截取成功。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status SubString(SString Sub, SString S, int pos, int len) { + int i; + + if(pos < 1 || pos > S[0] || len < 0 || pos + len - 1 > S[0]) { + return ERROR; + } + + // 复制元素 + for(i = 1; i <= len; i++) { + Sub[i] = S[pos + i - 1]; + } + + // 确定新长度 + Sub[0] = len; + + return OK; +} + +/* + * ████████ 算法4.1 ████████ + * + * 查找 + * + * 从pos处开始搜索模式串T在主串S中首次出现的位置,如果不存在,则返回0。 + * 如果查找成功,返回匹配的位置。 + * + *【注】 + * 1.此实现需要依赖串的最小操作子集 + * 2.该实现比较低效 + */ +int Index_1(SString S, SString T, int pos) { + int i, n, m; // 记录S和T的长度 + SString sub; + + /* + * 失败情形提前处理 + * 这里与教材写法略微不同 + */ + if(pos < 1 || pos > S[0] || StrEmpty(T)) { + return 0; + } + + n = StrLength(S); + m = StrLength(T); + i = pos; + + // 保证长度不越界 + while(i <= n - m + 1) { + // 获取S[i, i+m-1] + SubString(sub, S, i, m); + + // 如果子串与模式串不匹配,则需要继续推进 + if(StrCompare(sub, T) != 0) { + ++i; + } else { + return i; + } + } + + return 0; +} + +/* + * ████████ 算法4.5 ████████ + * + * 查找 + * + * 从pos处开始搜索模式串T在主串S中首次出现的位置,如果不存在,则返回0。 + * 如果查找成功,返回匹配的位置。 + * + *【注】 + * 1.此实现不依赖串的最小操作子集 + * 2.该实现比较低效 + */ +int Index_2(SString S, SString T, int pos) { + int i = pos; + int j = 1; + + if(pos < 1 || pos > S[0] || StrEmpty(T)) { + return 0; + } + + while(i <= S[0] && j <= T[0]) { + // 遇到相同字符,则继续比较后继字符 + if(S[i] == T[j]) { + i++; + j++; + + // 遇到不同的字符,则游标需要回退,重新比较 + } else { + i = i - (j - 1) + 1; // j-1代表徒劳地前进了j-1个元素,在第j个元素上功亏一篑 + j = 1; // 游标j回到串T的第一个位置 + } + } + + // 增加了一个T[0]>0的判断 + if(j > T[0] && T[0] > 0) { // T不为空串 + return i - T[0]; // 匹配成功 + } else { + return 0; + } +} + +/* + * 插入 + * + * 将串T插入到主串S的pos位置处。 + */ +Status StrInsert(SString S, int pos, SString T) { + int i; + + if(pos < 1 || pos > S[0] + 1 || S[0] + T[0] > MAXSTRLEN) { + return ERROR; + } + + // 如果待插入的串为空,则提前返回 + if(StrEmpty(T)) { + return OK; + } + + // 在S中腾出位置,为插入T做准备 + for(i = S[0]; i >= pos; i--) { + // 从后向前遍历,将前面的元素挪到后面 + S[i + T[0]] = S[i]; + } + + // 将串T插入在S中腾出的位置上 + for(i = pos; i <= pos + T[0] - 1; i++) { + S[i] = T[i - pos + 1]; + } + + // 长度增加 + S[0] += T[0]; + + return OK; +} + +/* + * 删除 + * + * 删除S[pos, pos+len-1]。 + */ +Status StrDelete(SString S, int pos, int len) { + int i; + + if(pos < 1 || pos + len - 1 > S[0] || len < 0) { + return ERROR; + } + + // 如果待删除的长度为0,则提前返回 + if(len == 0) { + return OK; + } + + // 把后面的元素挪到前面,覆盖掉被删除的元素 + for(i = pos + len; i <= S[0]; i++) { + S[i - len] = S[i]; + } + + // 长度减少 + S[0] -= len; + + return OK; +} + +/* + * 比较 + * + * 比较串S和串T,返回比较结果。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrCompare(SString S, SString T) { + int i = 1; + + while(i <= S[0] && i <= T[0]) { + // 遇到不同的字符时,比较其大小 + if(S[i] != T[i]) { + return S[i] - T[i]; + } + + i++; + } + + return S[0] - T[0]; +} + +/* + * 复制 + * + * 将串S复制到串T。 + */ +Status StrCopy(SString T, SString S) { + int i; + + // 连同长度信息一起复制 + for(i = 0; i <= S[0]; i++) { + T[i] = S[i]; + } + + return OK; +} + +/* + * 替换 + * + * 用V替换主串S中出现的所有与T相等的且不重叠的子串。 + * + *【注】 + * 1.该操作依赖最小操作子集 + * 2.该实现比较低效 + */ +Status Replace(SString S, SString T, SString V) { + int i; + + if(StrEmpty(S) || StrEmpty(T)) { + return ERROR; + } + + // 在主串S中寻找模式串T第一次出现的位置 + i = Index_2(S, T, 1); + + // 如果存在匹配的字符串,且可以被完全替换(替换后不溢出) + while(i != 0 && S[0] - T[0] + V[0] <= MAXSTRLEN) { + StrDelete(S, i, StrLength(T)); // 从S中删除T + StrInsert(S, i, V); // 向S中插入V + + i += StrLength(V); // i切换到下一个位置 + + i = Index_2(S, T, i); // 查找下一个匹配的字符串 + } + + if(i == 0) { // S中的T已全部被替换 + return OK; + } else { // S中尚有T,但是V已经插不进去了 + return ERROR; + } +} + +/* + * ████████ 算法4.2 ████████ + * + * 串联接 + * + * 联接S1和S2,并存储到T中返回。如果联接后的长度溢出,则只保留未溢出的部分。 + * 返回值表示联接后的串是否完整。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status Concat(SString T, SString S1, SString S2) { + int i; + int uncut; // 新串是否完整 + + // 完全不需要裁剪 + if(S1[0] + S2[0] <= MAXSTRLEN) { + // 复制S1到T中 + for(i = 1; i <= S1[0]; i++) { + T[i] = S1[i]; + } + + // 复制S2到T中 + for(i = S1[0] + 1; i <= S1[0] + S2[0]; i++) { + T[i] = S2[i - S1[0]]; + } + + // 设置新长度 + T[0] = S1[0] + S2[0]; + + // 未裁剪,完整 + uncut = TRUE; + + // 需要裁剪S2 + } else if(S1[0] <= MAXSTRLEN) { + // 复制S1到T中 + for(i = 1; i <= S1[0]; i++) { + T[i] = S1[i]; + } + + // 将S2的一部分复制到T中 + for(i = S1[0] + 1; i <= MAXSTRLEN; i++) { + T[i] = S2[i - S1[0]]; + } + + // 设置新长度 + T[0] = MAXSTRLEN; + + uncut = FALSE; + + // 只需要复制S1的一部分 + } else { + // 连同长度信息一起复制 + for(i = 0; i <= MAXSTRLEN; i++) { + T[i] = S1[i]; + } + + uncut = FALSE; + } + + return uncut; +} + +// 输出:打印字符串 +void StrPrint(SString S) { + int i; + + for(i = 1; i<=S[0] ; i++) { + printf("%c", S[i]); + } + + printf("\n"); +} diff --git a/CLion/ExerciseBook/04.18/SString.h b/CLion/ExerciseBook/04.18/SString.h new file mode 100644 index 0000000..d164913 --- /dev/null +++ b/CLion/ExerciseBook/04.18/SString.h @@ -0,0 +1,179 @@ +/*============================= + * 串的定长顺序存储表示(顺序串) + * + * 包含算法: 4.1、4.2、4.3、4.5 + ==============================*/ + +#ifndef SSTRING_H +#define SSTRING_H + +#include +#include // 提供strlen原型 +#include "Status.h" //**▲01 绪论**// + +/* 宏定义 */ +#define MAXSTRLEN 255 // 顺序串的最大串长 + +/* + * 串的顺序存储类型定义 + * + * 注:有效元素从SString的1号单元开始存储 + * SString的0号单元用来存储其长度 + */ +typedef unsigned char SString[MAXSTRLEN + 1]; // 0号单元存放串的长度 + + +/* + * ████ 提示 ████ + * + * 遵循教材的书写习惯,pos指示字符的位序(不是索引),从1开始计数 + */ + + +/* + * 初始化 + * + * 构造一个值为chars的串T。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status StrAssign(SString T, const char* chars); + +/* + * 销毁 + * + * 将串S销毁。 + * + *【注】 + * 顺序串的结构无法销毁 + */ +Status DestroyString(SString S); + +/* + * 清空 + * + * 将串S清空。 + */ +Status ClearString(SString S); + +/* + * 判空 + * + * 判断串S中是否包含有效数据。 + * + * 返回值: + * TRUE : 串S为空 + * FALSE: 串S不为空 + */ +Status StrEmpty(SString S); + +/* + * 计数 + * + * 返回串S中元素的个数。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrLength(SString S); + +/* + * ████████ 算法4.3 ████████ + * + * 求子串 + * + * 用Sub返回S[pos, pos+len-1]。 + * 返回值指示是否截取成功。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status SubString(SString Sub, SString S, int pos, int len); + +/* + * ████████ 算法4.1 ████████ + * + * 查找 + * + * 从pos处开始搜索模式串T在主串S中首次出现的位置,如果不存在,则返回0。 + * 如果查找成功,返回匹配的位置。 + * + *【注】 + * 1.此实现需要依赖串的最小操作子集 + * 2.该实现比较低效 + */ +int Index_1(SString S, SString T, int pos); + +/* + * ████████ 算法4.5 ████████ + * + * 查找 + * + * 从pos处开始搜索模式串T在主串S中首次出现的位置,如果不存在,则返回0。 + * 如果查找成功,返回匹配的位置。 + * + *【注】 + * 1.此实现不依赖串的最小操作子集 + * 2.该实现比较低效 + */ +int Index_2(SString S, SString T, int pos); + +/* + * 插入 + * + * 将串T插入到主串S的pos位置处。 + */ +Status StrInsert(SString S, int pos, SString T); + +/* + * 删除 + * + * 删除S[pos, pos+len-1]。 + */ +Status StrDelete(SString S, int pos, int len); + +/* + * 比较 + * + * 比较串S和串T,返回比较结果。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrCompare(SString S, SString T); + +/* + * 复制 + * + * 将串S复制到串T。 + */ +Status StrCopy(SString T, SString S); + +/* + * 替换 + * + * 用V替换主串S中出现的所有与T相等的且不重叠的子串。 + * + *【注】 + * 该操作依赖最小操作子集,效率较低。 + */ +Status Replace(SString S, SString T, SString V); + +/* + * ████████ 算法4.2 ████████ + * + * 串联接 + * + * 联接S1和S2,并存储到T中返回。如果联接后的长度溢出,则只保留未溢出的部分。 + * 返回值表示联接后的串是否完整。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status Concat(SString T, SString S1, SString S2); + +// 输出:打印字符串 +void StrPrint(SString S); + +#endif diff --git a/CLion/ExerciseBook/04.19/04.19.c b/CLion/ExerciseBook/04.19/04.19.c new file mode 100644 index 0000000..6b9845c --- /dev/null +++ b/CLion/ExerciseBook/04.19/04.19.c @@ -0,0 +1,77 @@ +#include +#include +#include "SString.h" //**▲04 串**// + +/* + * R=S-S∩T,数组a存储R中每个字符在S中第一次出现的位置 + * + * 注:数组a的0号单元存储的是a中元素的个数 + */ +void Algo_4_19(SString R, SString S, SString T, int** a); + + +int main(int argc, char* argv[]) { + char* s = "amdhcjgfdlpinbefcopgkqikeb"; + char* t = "mhjlpinopkqik"; + int* a; + SString T, S, R; + int i; + + printf("初始化S和T...\n"); + StrAssign(S, s); + StrAssign(T, t); + + printf("S = "); + StrPrint(S); + printf("T = "); + StrPrint(T); + + Algo_4_19(R, S, T, &a); + printf("R = "); + StrPrint(R); + printf("a = "); + for(i = 1; i <= a[0]; i++) { + printf("%d ", a[i]); + } + printf("\n"); + + return 0; +} + + +/* + * R=S-S∩T,数组a存储R中每个字符在S中第一次出现的位置 + * + * 注:数组a的0号单元存储的是a中元素的个数 + */ +void Algo_4_19(SString R, SString S, SString T, int** a) { + int i, p; + SString ch; + + *a = (int*) malloc((StrLength(S) + 1) * sizeof(int)); + + StrAssign(R, ""); + + for(i = 1, (*a)[0] = 0; i <= StrLength(S); i++) { + // 取出字符进行判断 + SubString(ch, S, i, 1); + + // 获取S[i]在T中的位置 + p = Index_2(T, ch, 1); + + // 如果S[i]不在T中 + if(p == 0) { + // 获取S[i]在R中的位置 + p = Index_2(R, ch, 1); + } + + // 如果S[i]既不在T中,又没在R中出现过 + if(p == 0) { + (*a)[0]++; + (*a)[(*a)[0]] = i; + + // 向R中添加S[i] + StrInsert(R, (*a)[0], ch); + } + } +} diff --git a/CLion/ExerciseBook/04.19/CMakeLists.txt b/CLion/ExerciseBook/04.19/CMakeLists.txt new file mode 100644 index 0000000..73378ec --- /dev/null +++ b/CLion/ExerciseBook/04.19/CMakeLists.txt @@ -0,0 +1,7 @@ +# 包含公共库 +include_directories(${CMAKE_SOURCE_DIR}/Status) + +# 生成可执行文件 +add_executable(04.19 SString.h SString.c 04.19.c) +# 链接公共库 +target_link_libraries(04.19 Scanf_lib) \ No newline at end of file diff --git a/CLion/ExerciseBook/04.19/SString.c b/CLion/ExerciseBook/04.19/SString.c new file mode 100644 index 0000000..8673b3b --- /dev/null +++ b/CLion/ExerciseBook/04.19/SString.c @@ -0,0 +1,406 @@ +/*============================= + * 串的定长顺序存储表示(顺序串) + * + * 包含算法: 4.1、4.2、4.3、4.5 + ==============================*/ + +#include "SString.h" //**▲04 串**// + +/* + * 初始化 + * + * 构造一个值为chars的串T。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status StrAssign(SString T, const char* chars) { + int i, len; + + len = (int) strlen(chars); + + // chars过长 + if(len > MAXSTRLEN) { + return ERROR; + } + + T[0] = len; + for(i = 1; i <= len; i++) { + T[i] = chars[i - 1]; + } + + return OK; +} + +/* + * 销毁 + * + * 将串S销毁。 + * + *【注】 + * 顺序串的结构无法销毁 + */ +Status DestroyString(SString S) { + return OK; +} + +/* + * 清空 + * + * 将串S清空。 + */ +Status ClearString(SString S) { + // 只需要将长度置为0就可以 + S[0] = 0; + return OK; +} + +/* + * 判空 + * + * 判断串S中是否包含有效数据。 + * + * 返回值: + * TRUE : 串S为空 + * FALSE: 串S不为空 + */ +Status StrEmpty(SString S) { + return S[0] == 0 ? TRUE : FALSE; +} + +/* + * 计数 + * + * 返回串S中元素的个数。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrLength(SString S) { + return S[0]; +} + +/* + * ████████ 算法4.3 ████████ + * + * 求子串 + * + * 用Sub返回S[pos, pos+len-1]。 + * 返回值指示是否截取成功。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status SubString(SString Sub, SString S, int pos, int len) { + int i; + + if(pos < 1 || pos > S[0] || len < 0 || pos + len - 1 > S[0]) { + return ERROR; + } + + // 复制元素 + for(i = 1; i <= len; i++) { + Sub[i] = S[pos + i - 1]; + } + + // 确定新长度 + Sub[0] = len; + + return OK; +} + +/* + * ████████ 算法4.1 ████████ + * + * 查找 + * + * 从pos处开始搜索模式串T在主串S中首次出现的位置,如果不存在,则返回0。 + * 如果查找成功,返回匹配的位置。 + * + *【注】 + * 1.此实现需要依赖串的最小操作子集 + * 2.该实现比较低效 + */ +int Index_1(SString S, SString T, int pos) { + int i, n, m; // 记录S和T的长度 + SString sub; + + /* + * 失败情形提前处理 + * 这里与教材写法略微不同 + */ + if(pos < 1 || pos > S[0] || StrEmpty(T)) { + return 0; + } + + n = StrLength(S); + m = StrLength(T); + i = pos; + + // 保证长度不越界 + while(i <= n - m + 1) { + // 获取S[i, i+m-1] + SubString(sub, S, i, m); + + // 如果子串与模式串不匹配,则需要继续推进 + if(StrCompare(sub, T) != 0) { + ++i; + } else { + return i; + } + } + + return 0; +} + +/* + * ████████ 算法4.5 ████████ + * + * 查找 + * + * 从pos处开始搜索模式串T在主串S中首次出现的位置,如果不存在,则返回0。 + * 如果查找成功,返回匹配的位置。 + * + *【注】 + * 1.此实现不依赖串的最小操作子集 + * 2.该实现比较低效 + */ +int Index_2(SString S, SString T, int pos) { + int i = pos; + int j = 1; + + if(pos < 1 || pos > S[0] || StrEmpty(T)) { + return 0; + } + + while(i <= S[0] && j <= T[0]) { + // 遇到相同字符,则继续比较后继字符 + if(S[i] == T[j]) { + i++; + j++; + + // 遇到不同的字符,则游标需要回退,重新比较 + } else { + i = i - (j - 1) + 1; // j-1代表徒劳地前进了j-1个元素,在第j个元素上功亏一篑 + j = 1; // 游标j回到串T的第一个位置 + } + } + + // 增加了一个T[0]>0的判断 + if(j > T[0] && T[0] > 0) { // T不为空串 + return i - T[0]; // 匹配成功 + } else { + return 0; + } +} + +/* + * 插入 + * + * 将串T插入到主串S的pos位置处。 + */ +Status StrInsert(SString S, int pos, SString T) { + int i; + + if(pos < 1 || pos > S[0] + 1 || S[0] + T[0] > MAXSTRLEN) { + return ERROR; + } + + // 如果待插入的串为空,则提前返回 + if(StrEmpty(T)) { + return OK; + } + + // 在S中腾出位置,为插入T做准备 + for(i = S[0]; i >= pos; i--) { + // 从后向前遍历,将前面的元素挪到后面 + S[i + T[0]] = S[i]; + } + + // 将串T插入在S中腾出的位置上 + for(i = pos; i <= pos + T[0] - 1; i++) { + S[i] = T[i - pos + 1]; + } + + // 长度增加 + S[0] += T[0]; + + return OK; +} + +/* + * 删除 + * + * 删除S[pos, pos+len-1]。 + */ +Status StrDelete(SString S, int pos, int len) { + int i; + + if(pos < 1 || pos + len - 1 > S[0] || len < 0) { + return ERROR; + } + + // 如果待删除的长度为0,则提前返回 + if(len == 0) { + return OK; + } + + // 把后面的元素挪到前面,覆盖掉被删除的元素 + for(i = pos + len; i <= S[0]; i++) { + S[i - len] = S[i]; + } + + // 长度减少 + S[0] -= len; + + return OK; +} + +/* + * 比较 + * + * 比较串S和串T,返回比较结果。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrCompare(SString S, SString T) { + int i = 1; + + while(i <= S[0] && i <= T[0]) { + // 遇到不同的字符时,比较其大小 + if(S[i] != T[i]) { + return S[i] - T[i]; + } + + i++; + } + + return S[0] - T[0]; +} + +/* + * 复制 + * + * 将串S复制到串T。 + */ +Status StrCopy(SString T, SString S) { + int i; + + // 连同长度信息一起复制 + for(i = 0; i <= S[0]; i++) { + T[i] = S[i]; + } + + return OK; +} + +/* + * 替换 + * + * 用V替换主串S中出现的所有与T相等的且不重叠的子串。 + * + *【注】 + * 1.该操作依赖最小操作子集 + * 2.该实现比较低效 + */ +Status Replace(SString S, SString T, SString V) { + int i; + + if(StrEmpty(S) || StrEmpty(T)) { + return ERROR; + } + + // 在主串S中寻找模式串T第一次出现的位置 + i = Index_2(S, T, 1); + + // 如果存在匹配的字符串,且可以被完全替换(替换后不溢出) + while(i != 0 && S[0] - T[0] + V[0] <= MAXSTRLEN) { + StrDelete(S, i, StrLength(T)); // 从S中删除T + StrInsert(S, i, V); // 向S中插入V + + i += StrLength(V); // i切换到下一个位置 + + i = Index_2(S, T, i); // 查找下一个匹配的字符串 + } + + if(i == 0) { // S中的T已全部被替换 + return OK; + } else { // S中尚有T,但是V已经插不进去了 + return ERROR; + } +} + +/* + * ████████ 算法4.2 ████████ + * + * 串联接 + * + * 联接S1和S2,并存储到T中返回。如果联接后的长度溢出,则只保留未溢出的部分。 + * 返回值表示联接后的串是否完整。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status Concat(SString T, SString S1, SString S2) { + int i; + int uncut; // 新串是否完整 + + // 完全不需要裁剪 + if(S1[0] + S2[0] <= MAXSTRLEN) { + // 复制S1到T中 + for(i = 1; i <= S1[0]; i++) { + T[i] = S1[i]; + } + + // 复制S2到T中 + for(i = S1[0] + 1; i <= S1[0] + S2[0]; i++) { + T[i] = S2[i - S1[0]]; + } + + // 设置新长度 + T[0] = S1[0] + S2[0]; + + // 未裁剪,完整 + uncut = TRUE; + + // 需要裁剪S2 + } else if(S1[0] <= MAXSTRLEN) { + // 复制S1到T中 + for(i = 1; i <= S1[0]; i++) { + T[i] = S1[i]; + } + + // 将S2的一部分复制到T中 + for(i = S1[0] + 1; i <= MAXSTRLEN; i++) { + T[i] = S2[i - S1[0]]; + } + + // 设置新长度 + T[0] = MAXSTRLEN; + + uncut = FALSE; + + // 只需要复制S1的一部分 + } else { + // 连同长度信息一起复制 + for(i = 0; i <= MAXSTRLEN; i++) { + T[i] = S1[i]; + } + + uncut = FALSE; + } + + return uncut; +} + +// 输出:打印字符串 +void StrPrint(SString S) { + int i; + + for(i = 1; i<=S[0] ; i++) { + printf("%c", S[i]); + } + + printf("\n"); +} diff --git a/CLion/ExerciseBook/04.19/SString.h b/CLion/ExerciseBook/04.19/SString.h new file mode 100644 index 0000000..d164913 --- /dev/null +++ b/CLion/ExerciseBook/04.19/SString.h @@ -0,0 +1,179 @@ +/*============================= + * 串的定长顺序存储表示(顺序串) + * + * 包含算法: 4.1、4.2、4.3、4.5 + ==============================*/ + +#ifndef SSTRING_H +#define SSTRING_H + +#include +#include // 提供strlen原型 +#include "Status.h" //**▲01 绪论**// + +/* 宏定义 */ +#define MAXSTRLEN 255 // 顺序串的最大串长 + +/* + * 串的顺序存储类型定义 + * + * 注:有效元素从SString的1号单元开始存储 + * SString的0号单元用来存储其长度 + */ +typedef unsigned char SString[MAXSTRLEN + 1]; // 0号单元存放串的长度 + + +/* + * ████ 提示 ████ + * + * 遵循教材的书写习惯,pos指示字符的位序(不是索引),从1开始计数 + */ + + +/* + * 初始化 + * + * 构造一个值为chars的串T。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status StrAssign(SString T, const char* chars); + +/* + * 销毁 + * + * 将串S销毁。 + * + *【注】 + * 顺序串的结构无法销毁 + */ +Status DestroyString(SString S); + +/* + * 清空 + * + * 将串S清空。 + */ +Status ClearString(SString S); + +/* + * 判空 + * + * 判断串S中是否包含有效数据。 + * + * 返回值: + * TRUE : 串S为空 + * FALSE: 串S不为空 + */ +Status StrEmpty(SString S); + +/* + * 计数 + * + * 返回串S中元素的个数。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrLength(SString S); + +/* + * ████████ 算法4.3 ████████ + * + * 求子串 + * + * 用Sub返回S[pos, pos+len-1]。 + * 返回值指示是否截取成功。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status SubString(SString Sub, SString S, int pos, int len); + +/* + * ████████ 算法4.1 ████████ + * + * 查找 + * + * 从pos处开始搜索模式串T在主串S中首次出现的位置,如果不存在,则返回0。 + * 如果查找成功,返回匹配的位置。 + * + *【注】 + * 1.此实现需要依赖串的最小操作子集 + * 2.该实现比较低效 + */ +int Index_1(SString S, SString T, int pos); + +/* + * ████████ 算法4.5 ████████ + * + * 查找 + * + * 从pos处开始搜索模式串T在主串S中首次出现的位置,如果不存在,则返回0。 + * 如果查找成功,返回匹配的位置。 + * + *【注】 + * 1.此实现不依赖串的最小操作子集 + * 2.该实现比较低效 + */ +int Index_2(SString S, SString T, int pos); + +/* + * 插入 + * + * 将串T插入到主串S的pos位置处。 + */ +Status StrInsert(SString S, int pos, SString T); + +/* + * 删除 + * + * 删除S[pos, pos+len-1]。 + */ +Status StrDelete(SString S, int pos, int len); + +/* + * 比较 + * + * 比较串S和串T,返回比较结果。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrCompare(SString S, SString T); + +/* + * 复制 + * + * 将串S复制到串T。 + */ +Status StrCopy(SString T, SString S); + +/* + * 替换 + * + * 用V替换主串S中出现的所有与T相等的且不重叠的子串。 + * + *【注】 + * 该操作依赖最小操作子集,效率较低。 + */ +Status Replace(SString S, SString T, SString V); + +/* + * ████████ 算法4.2 ████████ + * + * 串联接 + * + * 联接S1和S2,并存储到T中返回。如果联接后的长度溢出,则只保留未溢出的部分。 + * 返回值表示联接后的串是否完整。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status Concat(SString T, SString S1, SString S2); + +// 输出:打印字符串 +void StrPrint(SString S); + +#endif diff --git a/CLion/ExerciseBook/04.20/04.20.c b/CLion/ExerciseBook/04.20/04.20.c new file mode 100644 index 0000000..a5aa91e --- /dev/null +++ b/CLion/ExerciseBook/04.20/04.20.c @@ -0,0 +1,47 @@ +#include +#include "Status.h" //**▲01 绪论**// +#include "SString.h" //**▲04 串**// + +/* + * 删除S中包含的T + */ +Status Algo_4_20(SString S, SString T); + + +int main(int argc, char* argv[]) { + char* s = "----***--*-**-****-*****-----"; + char* t = "**"; + SString T, S; + + printf("删除前...\n"); + StrAssign(S, s); + StrAssign(T, t); + printf("S = "); + StrPrint(S); + printf("T = "); + StrPrint(T); + + printf("删除后...\n"); + printf("S = "); + Algo_4_20(S, T); + StrPrint(S); + + return 0; +} + + +/* + * 删除S中包含的T + */ +Status Algo_4_20(SString S, SString T) { + int i; + + // 在S中查找T,如果找到就删除 + while((i = Index_2(S, T, 1)) != 0) { + if(StrDelete(S, i, StrLength(T)) == ERROR) { + return ERROR; + } + } + + return OK; +} diff --git a/CLion/ExerciseBook/04.20/CMakeLists.txt b/CLion/ExerciseBook/04.20/CMakeLists.txt new file mode 100644 index 0000000..9dcf39c --- /dev/null +++ b/CLion/ExerciseBook/04.20/CMakeLists.txt @@ -0,0 +1,7 @@ +# 包含公共库 +include_directories(${CMAKE_SOURCE_DIR}/Status) + +# 生成可执行文件 +add_executable(04.20 SString.h SString.c 04.20.c) +# 链接公共库 +target_link_libraries(04.20 Scanf_lib) \ No newline at end of file diff --git a/CLion/ExerciseBook/04.20/SString.c b/CLion/ExerciseBook/04.20/SString.c new file mode 100644 index 0000000..8673b3b --- /dev/null +++ b/CLion/ExerciseBook/04.20/SString.c @@ -0,0 +1,406 @@ +/*============================= + * 串的定长顺序存储表示(顺序串) + * + * 包含算法: 4.1、4.2、4.3、4.5 + ==============================*/ + +#include "SString.h" //**▲04 串**// + +/* + * 初始化 + * + * 构造一个值为chars的串T。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status StrAssign(SString T, const char* chars) { + int i, len; + + len = (int) strlen(chars); + + // chars过长 + if(len > MAXSTRLEN) { + return ERROR; + } + + T[0] = len; + for(i = 1; i <= len; i++) { + T[i] = chars[i - 1]; + } + + return OK; +} + +/* + * 销毁 + * + * 将串S销毁。 + * + *【注】 + * 顺序串的结构无法销毁 + */ +Status DestroyString(SString S) { + return OK; +} + +/* + * 清空 + * + * 将串S清空。 + */ +Status ClearString(SString S) { + // 只需要将长度置为0就可以 + S[0] = 0; + return OK; +} + +/* + * 判空 + * + * 判断串S中是否包含有效数据。 + * + * 返回值: + * TRUE : 串S为空 + * FALSE: 串S不为空 + */ +Status StrEmpty(SString S) { + return S[0] == 0 ? TRUE : FALSE; +} + +/* + * 计数 + * + * 返回串S中元素的个数。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrLength(SString S) { + return S[0]; +} + +/* + * ████████ 算法4.3 ████████ + * + * 求子串 + * + * 用Sub返回S[pos, pos+len-1]。 + * 返回值指示是否截取成功。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status SubString(SString Sub, SString S, int pos, int len) { + int i; + + if(pos < 1 || pos > S[0] || len < 0 || pos + len - 1 > S[0]) { + return ERROR; + } + + // 复制元素 + for(i = 1; i <= len; i++) { + Sub[i] = S[pos + i - 1]; + } + + // 确定新长度 + Sub[0] = len; + + return OK; +} + +/* + * ████████ 算法4.1 ████████ + * + * 查找 + * + * 从pos处开始搜索模式串T在主串S中首次出现的位置,如果不存在,则返回0。 + * 如果查找成功,返回匹配的位置。 + * + *【注】 + * 1.此实现需要依赖串的最小操作子集 + * 2.该实现比较低效 + */ +int Index_1(SString S, SString T, int pos) { + int i, n, m; // 记录S和T的长度 + SString sub; + + /* + * 失败情形提前处理 + * 这里与教材写法略微不同 + */ + if(pos < 1 || pos > S[0] || StrEmpty(T)) { + return 0; + } + + n = StrLength(S); + m = StrLength(T); + i = pos; + + // 保证长度不越界 + while(i <= n - m + 1) { + // 获取S[i, i+m-1] + SubString(sub, S, i, m); + + // 如果子串与模式串不匹配,则需要继续推进 + if(StrCompare(sub, T) != 0) { + ++i; + } else { + return i; + } + } + + return 0; +} + +/* + * ████████ 算法4.5 ████████ + * + * 查找 + * + * 从pos处开始搜索模式串T在主串S中首次出现的位置,如果不存在,则返回0。 + * 如果查找成功,返回匹配的位置。 + * + *【注】 + * 1.此实现不依赖串的最小操作子集 + * 2.该实现比较低效 + */ +int Index_2(SString S, SString T, int pos) { + int i = pos; + int j = 1; + + if(pos < 1 || pos > S[0] || StrEmpty(T)) { + return 0; + } + + while(i <= S[0] && j <= T[0]) { + // 遇到相同字符,则继续比较后继字符 + if(S[i] == T[j]) { + i++; + j++; + + // 遇到不同的字符,则游标需要回退,重新比较 + } else { + i = i - (j - 1) + 1; // j-1代表徒劳地前进了j-1个元素,在第j个元素上功亏一篑 + j = 1; // 游标j回到串T的第一个位置 + } + } + + // 增加了一个T[0]>0的判断 + if(j > T[0] && T[0] > 0) { // T不为空串 + return i - T[0]; // 匹配成功 + } else { + return 0; + } +} + +/* + * 插入 + * + * 将串T插入到主串S的pos位置处。 + */ +Status StrInsert(SString S, int pos, SString T) { + int i; + + if(pos < 1 || pos > S[0] + 1 || S[0] + T[0] > MAXSTRLEN) { + return ERROR; + } + + // 如果待插入的串为空,则提前返回 + if(StrEmpty(T)) { + return OK; + } + + // 在S中腾出位置,为插入T做准备 + for(i = S[0]; i >= pos; i--) { + // 从后向前遍历,将前面的元素挪到后面 + S[i + T[0]] = S[i]; + } + + // 将串T插入在S中腾出的位置上 + for(i = pos; i <= pos + T[0] - 1; i++) { + S[i] = T[i - pos + 1]; + } + + // 长度增加 + S[0] += T[0]; + + return OK; +} + +/* + * 删除 + * + * 删除S[pos, pos+len-1]。 + */ +Status StrDelete(SString S, int pos, int len) { + int i; + + if(pos < 1 || pos + len - 1 > S[0] || len < 0) { + return ERROR; + } + + // 如果待删除的长度为0,则提前返回 + if(len == 0) { + return OK; + } + + // 把后面的元素挪到前面,覆盖掉被删除的元素 + for(i = pos + len; i <= S[0]; i++) { + S[i - len] = S[i]; + } + + // 长度减少 + S[0] -= len; + + return OK; +} + +/* + * 比较 + * + * 比较串S和串T,返回比较结果。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrCompare(SString S, SString T) { + int i = 1; + + while(i <= S[0] && i <= T[0]) { + // 遇到不同的字符时,比较其大小 + if(S[i] != T[i]) { + return S[i] - T[i]; + } + + i++; + } + + return S[0] - T[0]; +} + +/* + * 复制 + * + * 将串S复制到串T。 + */ +Status StrCopy(SString T, SString S) { + int i; + + // 连同长度信息一起复制 + for(i = 0; i <= S[0]; i++) { + T[i] = S[i]; + } + + return OK; +} + +/* + * 替换 + * + * 用V替换主串S中出现的所有与T相等的且不重叠的子串。 + * + *【注】 + * 1.该操作依赖最小操作子集 + * 2.该实现比较低效 + */ +Status Replace(SString S, SString T, SString V) { + int i; + + if(StrEmpty(S) || StrEmpty(T)) { + return ERROR; + } + + // 在主串S中寻找模式串T第一次出现的位置 + i = Index_2(S, T, 1); + + // 如果存在匹配的字符串,且可以被完全替换(替换后不溢出) + while(i != 0 && S[0] - T[0] + V[0] <= MAXSTRLEN) { + StrDelete(S, i, StrLength(T)); // 从S中删除T + StrInsert(S, i, V); // 向S中插入V + + i += StrLength(V); // i切换到下一个位置 + + i = Index_2(S, T, i); // 查找下一个匹配的字符串 + } + + if(i == 0) { // S中的T已全部被替换 + return OK; + } else { // S中尚有T,但是V已经插不进去了 + return ERROR; + } +} + +/* + * ████████ 算法4.2 ████████ + * + * 串联接 + * + * 联接S1和S2,并存储到T中返回。如果联接后的长度溢出,则只保留未溢出的部分。 + * 返回值表示联接后的串是否完整。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status Concat(SString T, SString S1, SString S2) { + int i; + int uncut; // 新串是否完整 + + // 完全不需要裁剪 + if(S1[0] + S2[0] <= MAXSTRLEN) { + // 复制S1到T中 + for(i = 1; i <= S1[0]; i++) { + T[i] = S1[i]; + } + + // 复制S2到T中 + for(i = S1[0] + 1; i <= S1[0] + S2[0]; i++) { + T[i] = S2[i - S1[0]]; + } + + // 设置新长度 + T[0] = S1[0] + S2[0]; + + // 未裁剪,完整 + uncut = TRUE; + + // 需要裁剪S2 + } else if(S1[0] <= MAXSTRLEN) { + // 复制S1到T中 + for(i = 1; i <= S1[0]; i++) { + T[i] = S1[i]; + } + + // 将S2的一部分复制到T中 + for(i = S1[0] + 1; i <= MAXSTRLEN; i++) { + T[i] = S2[i - S1[0]]; + } + + // 设置新长度 + T[0] = MAXSTRLEN; + + uncut = FALSE; + + // 只需要复制S1的一部分 + } else { + // 连同长度信息一起复制 + for(i = 0; i <= MAXSTRLEN; i++) { + T[i] = S1[i]; + } + + uncut = FALSE; + } + + return uncut; +} + +// 输出:打印字符串 +void StrPrint(SString S) { + int i; + + for(i = 1; i<=S[0] ; i++) { + printf("%c", S[i]); + } + + printf("\n"); +} diff --git a/CLion/ExerciseBook/04.20/SString.h b/CLion/ExerciseBook/04.20/SString.h new file mode 100644 index 0000000..d164913 --- /dev/null +++ b/CLion/ExerciseBook/04.20/SString.h @@ -0,0 +1,179 @@ +/*============================= + * 串的定长顺序存储表示(顺序串) + * + * 包含算法: 4.1、4.2、4.3、4.5 + ==============================*/ + +#ifndef SSTRING_H +#define SSTRING_H + +#include +#include // 提供strlen原型 +#include "Status.h" //**▲01 绪论**// + +/* 宏定义 */ +#define MAXSTRLEN 255 // 顺序串的最大串长 + +/* + * 串的顺序存储类型定义 + * + * 注:有效元素从SString的1号单元开始存储 + * SString的0号单元用来存储其长度 + */ +typedef unsigned char SString[MAXSTRLEN + 1]; // 0号单元存放串的长度 + + +/* + * ████ 提示 ████ + * + * 遵循教材的书写习惯,pos指示字符的位序(不是索引),从1开始计数 + */ + + +/* + * 初始化 + * + * 构造一个值为chars的串T。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status StrAssign(SString T, const char* chars); + +/* + * 销毁 + * + * 将串S销毁。 + * + *【注】 + * 顺序串的结构无法销毁 + */ +Status DestroyString(SString S); + +/* + * 清空 + * + * 将串S清空。 + */ +Status ClearString(SString S); + +/* + * 判空 + * + * 判断串S中是否包含有效数据。 + * + * 返回值: + * TRUE : 串S为空 + * FALSE: 串S不为空 + */ +Status StrEmpty(SString S); + +/* + * 计数 + * + * 返回串S中元素的个数。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrLength(SString S); + +/* + * ████████ 算法4.3 ████████ + * + * 求子串 + * + * 用Sub返回S[pos, pos+len-1]。 + * 返回值指示是否截取成功。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status SubString(SString Sub, SString S, int pos, int len); + +/* + * ████████ 算法4.1 ████████ + * + * 查找 + * + * 从pos处开始搜索模式串T在主串S中首次出现的位置,如果不存在,则返回0。 + * 如果查找成功,返回匹配的位置。 + * + *【注】 + * 1.此实现需要依赖串的最小操作子集 + * 2.该实现比较低效 + */ +int Index_1(SString S, SString T, int pos); + +/* + * ████████ 算法4.5 ████████ + * + * 查找 + * + * 从pos处开始搜索模式串T在主串S中首次出现的位置,如果不存在,则返回0。 + * 如果查找成功,返回匹配的位置。 + * + *【注】 + * 1.此实现不依赖串的最小操作子集 + * 2.该实现比较低效 + */ +int Index_2(SString S, SString T, int pos); + +/* + * 插入 + * + * 将串T插入到主串S的pos位置处。 + */ +Status StrInsert(SString S, int pos, SString T); + +/* + * 删除 + * + * 删除S[pos, pos+len-1]。 + */ +Status StrDelete(SString S, int pos, int len); + +/* + * 比较 + * + * 比较串S和串T,返回比较结果。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrCompare(SString S, SString T); + +/* + * 复制 + * + * 将串S复制到串T。 + */ +Status StrCopy(SString T, SString S); + +/* + * 替换 + * + * 用V替换主串S中出现的所有与T相等的且不重叠的子串。 + * + *【注】 + * 该操作依赖最小操作子集,效率较低。 + */ +Status Replace(SString S, SString T, SString V); + +/* + * ████████ 算法4.2 ████████ + * + * 串联接 + * + * 联接S1和S2,并存储到T中返回。如果联接后的长度溢出,则只保留未溢出的部分。 + * 返回值表示联接后的串是否完整。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status Concat(SString T, SString S1, SString S2); + +// 输出:打印字符串 +void StrPrint(SString S); + +#endif diff --git a/CLion/ExerciseBook/04.21/04.21.c b/CLion/ExerciseBook/04.21/04.21.c new file mode 100644 index 0000000..4dac89b --- /dev/null +++ b/CLion/ExerciseBook/04.21/04.21.c @@ -0,0 +1,336 @@ +#include +#include // 提供 malloc、realloc、free、exit 原型 +#include +#include "Status.h" //**▲01 绪论**// + +/* + * 单链表元素类型定义 + * + *【注】 + * 这里的链表虽然用作字符串,但是元素类型仍然用int,原因是: + * 1.需要借用头结点存储结点的数量,所以用int比直接用char合适 + * 2.char可以与int兼容,所以结点虽然是int,但也可以用来存储char + */ +typedef int ElemType; + +/* + * 单链表结构 + * + * 注:这里的单链表存在头结点 + */ +typedef struct SNode { + ElemType data; // 数据结点 + struct SNode* next; // 指向下一个结点的指针 +} SNode; + +// 指向单链表结点的指针,用作字符串类型 +typedef SNode* String; + + +/* + * 初始化 + * + * 构造一个值为chars的串T。 + */ +Status StrAssign_4_21(String* S, char* chars); + +/* + * 复制 + * + * 将串S复制到串T。 + */ +Status StrCopy_4_21(String* S, String T); + +/* + * 比较 + * + * 比较串S和串T,返回比较结果。 + */ +int StrCompare_4_21(String S, String T); + +/* + * 计数 + * + * 返回串S中元素的个数。 + */ +int StrLength_4_21(String S); + +/* + * 串联接 + * + * 联接S1和S2,并存储到T中返回。如果联接后的长度溢出,则只保留未溢出的部分。 + * 返回值表示联接后的串是否完整。 + */ +Status Concat_4_21(String* R, String S1, String S2); + +/* + * 求子串 + * + * 用Sub返回S[pos, pos+len-1]。 + * 返回值指示是否截取成功。 + */ +Status SubString_4_21(String* Sub, String S, int pos, int len); + +// 字符串输出 +void StrPrint_4_21(String S); + + +int main(int argc, char* argv[]) { + char* chars = "0123456789"; + String S, T; + int i; + + printf("████████ StrAssign \n"); + { + printf("█ 为顺序串 S 赋值...\n"); + StrAssign_4_21(&S, chars); + printf("█ S = "); + StrPrint_4_21(S); + } + PressEnterToContinue(); + + printf("████████ StrLength \n"); + { + i = StrLength_4_21(S); + printf("█ S 的长度为 %d \n", i); + } + PressEnterToContinue(); + + printf("████████ StrCopy \n"); + { + printf("█ 复制 S 到 T ...\n"); + StrCopy_4_21(&T, S); + printf("█ T = "); + StrPrint_4_21(T); + } + PressEnterToContinue(); + + printf("████████ StrCompare \n"); + { + printf("█ 比较字符串 S 和 T ...\n"); + i = StrCompare_4_21(S, T); + i == 0 ? printf("█ S==T\n") : (i < 0 ? printf("█ ST\n")); + } + PressEnterToContinue(); + + printf("████████ SubString \n"); + { + String Sub; + + printf("█ 用 Sub 返回 S 中第 6 个字符起的 5 个字符...\n"); + SubString_4_21(&Sub, S, 6, 5); + printf("█ Sub = "); + StrPrint_4_21(Sub); + } + PressEnterToContinue(); + + + printf("████████ Concat \n"); + { + String Tmp, S1, S2; + + StrAssign_4_21(&S1, "+++++"); + StrAssign_4_21(&S2, "-----"); + + printf("█ 联接 \"+++++\" 和 \"-----\" 形成 Tmp ...\n"); + Concat_4_21(&Tmp, S1, S2); + printf("█ Tmp = "); + StrPrint_4_21(Tmp); + } + PressEnterToContinue(); + + return 0; +} + + +/* + * 初始化 + * + * 构造一个值为chars的串T。 + */ +Status StrAssign_4_21(String* S, char* chars) { + int i, len; + String p; + + if(S == NULL || chars == NULL) { + return ERROR; + } + + len = (int) strlen(chars); + + *S = (SNode*) malloc(sizeof(SNode)); + (*S)->data = len; + + p = *S; + + for(i = 0; i < len; i++) { + p->next = (SNode*) malloc(sizeof(SNode)); + p->next->data = chars[i]; + p = p->next; + } + + p->next = NULL; + + return OK; +} + +/* + * 复制 + * + * 将串S复制到串T。 + */ +Status StrCopy_4_21(String* S, String T) { + String p, r, t; + + if(S == NULL || T == NULL) { + return ERROR; + } + + for(t = T; t != NULL; t = t->next) { + r = (SNode*) malloc(sizeof(SNode)); + r->data = t->data; + + if(t == T) { + *S = r; + p = r; + } else { + p->next = r; + p = p->next; + } + } + + p->next = NULL; + + return OK; +} + +/* + * 比较 + * + * 比较串S和串T,返回比较结果。 + */ +int StrCompare_4_21(String S, String T) { + String s, t; + + if(S == NULL || T == NULL) { + return StrLength_4_21(S) - StrLength_4_21(T); + } + + s = S->next; + t = T->next; + + while(s != NULL && t != NULL) { + if(s->data != t->data) { + return s->data - t->data; + } + + s = s->next; + t = t->next; + } + + if(s == NULL && t != NULL) { + return -1; + } else if(s != NULL && t == NULL) { + return 1; + } else { + return 0; + } +} + +/* + * 计数 + * + * 返回串S中元素的个数。 + */ +int StrLength_4_21(String S) { + return S == NULL ? 0 : S->data; +} + +/* + * 串联接 + * + * 联接S1和S2,并存储到T中返回。如果联接后的长度溢出,则只保留未溢出的部分。 + * 返回值表示联接后的串是否完整。 + */ +Status Concat_4_21(String* R, String S1, String S2) { + String r, s, p; + + if(R == NULL || S1 == NULL || S2 == NULL) { + return ERROR; + } + + *R = (SNode*) malloc(sizeof(SNode)); + (*R)->data = S1->data + S2->data; + + r = *R; + + for(s = S1->next; s != NULL; s = s->next) { + p = (SNode*) malloc(sizeof(SNode)); + p->data = s->data; + r->next = p; + r = r->next; + } + + for(s = S2->next; s != NULL; s = s->next) { + p = (SNode*) malloc(sizeof(SNode)); + p->data = s->data; + r->next = p; + r = r->next; + } + + r->next = NULL; + + return OK; +} + +/* + * 求子串 + * + * 用Sub返回S[pos, pos+len-1]。 + * 返回值指示是否截取成功。 + */ +Status SubString_4_21(String* Sub, String S, int pos, int len) { + int i, slen; + String sub, s, p; + + slen = StrLength_4_21(S); + + if(Sub == NULL || S == NULL || pos < 1 || pos > slen || len < 0 || pos + len - 1 > slen) { + return ERROR; + } + + *Sub = (SNode*) malloc(sizeof(SNode)); + (*Sub)->data = len; + + for(i = 0, s = S; i < pos; i++, s = s->next) { + // 查找第pos个结点,并用s指向它 + } + + sub = *Sub; + + for(i = 0; i < len; i++) { + sub->next = (SNode*) malloc(sizeof(SNode)); + sub->next->data = s->data; + sub = sub->next; + + s = s->next; + } + + sub->next = NULL; + + return OK; +} + +// 字符串输出 +void StrPrint_4_21(String S) { + String p; + + if(S == NULL) { + return; + } + + for(p = S->next; p != NULL; p = p->next) { + printf("%c", p->data); + } + printf("\n"); +} diff --git a/CLion/ExerciseBook/04.21/CMakeLists.txt b/CLion/ExerciseBook/04.21/CMakeLists.txt new file mode 100644 index 0000000..6c8d8c2 --- /dev/null +++ b/CLion/ExerciseBook/04.21/CMakeLists.txt @@ -0,0 +1,7 @@ +# 包含公共库 +include_directories(${CMAKE_SOURCE_DIR}/Status) + +# 生成可执行文件 +add_executable(04.21 04.21.c) +# 链接公共库 +target_link_libraries(04.21 Scanf_lib) \ No newline at end of file diff --git a/CLion/ExerciseBook/04.22/04.22.c b/CLion/ExerciseBook/04.22/04.22.c new file mode 100644 index 0000000..2f5a8ef --- /dev/null +++ b/CLion/ExerciseBook/04.22/04.22.c @@ -0,0 +1,59 @@ +#include +#include "LString.h" //**▲04 串**// + +/* + * 将S插入到T中的字符c之后。 + * 如果有多个c,则将S插入到从左向右遍历T时遇到的首个c之后。 + * 如果T在不存在c,则将S插入到T的末尾。 + */ +void Algo_4_22(LString* T, char ch, LString S); + + +int main(int argc, char* argv[]) { + char* t = "----***--*-**-**^**-*****-----"; + char* s = "12345"; + char ch = '^'; + LString T, S; + + StrAssign(&T, t); + StrAssign(&S, s); + printf("T = "); + StrPrint(T); + printf("S = "); + StrPrint(S); + + Algo_4_22(&T, ch, S); + printf("T = "); + StrPrint(T); + + return 0; +} + + +/* + * 将S插入到T中的字符c之后。 + * 如果有多个c,则将S插入到从左向右遍历T时遇到的首个c之后。 + * 如果T在不存在c,则将S插入到T的末尾。 + */ +void Algo_4_22(LString* T, char c, LString S) { + int i; + char tmp[2]; + LString Tmp; + + // 构造目标串 + tmp[0] = c; + tmp[1] = '\0'; + StrAssign(&Tmp, tmp); + + // 寻找字符c在T中的位置 + i = Index((*T), Tmp, 1); + + // 如果找到了c,则将S插入到字符c之后 + if(i != 0) { + StrInsert(T, i + 1, S); + + // 如果没找到c,则将S插入到T的末尾 + } else { + StrInsert(T, (*T).curlen + 1, S); + } +} diff --git a/CLion/ExerciseBook/04.22/CMakeLists.txt b/CLion/ExerciseBook/04.22/CMakeLists.txt new file mode 100644 index 0000000..56e4da6 --- /dev/null +++ b/CLion/ExerciseBook/04.22/CMakeLists.txt @@ -0,0 +1,7 @@ +# 包含公共库 +include_directories(${CMAKE_SOURCE_DIR}/Status) + +# 生成可执行文件 +add_executable(04.22 LString.h LString.c 04.22.c) +# 链接公共库 +target_link_libraries(04.22 Scanf_lib) \ No newline at end of file diff --git a/CLion/ExerciseBook/04.22/LString.c b/CLion/ExerciseBook/04.22/LString.c new file mode 100644 index 0000000..bbec257 --- /dev/null +++ b/CLion/ExerciseBook/04.22/LString.c @@ -0,0 +1,747 @@ +/*============================= + * 串的块链分配存储表示(块链串) + ==============================*/ + +#include "LString.h" //**▲04 串**// + +/* + * 初始化 + * + * 构造一个值为chars的串T。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status StrAssign(LString* T, const char* chars) { + int len; // chars的长度 + int i, count; // 遍历块链串和字符串chars的游标 + int m; // 总块数 + int n; // 如果存在未填满的块,存储该块中的有效元素数量 + Chunk* r; + + // 求chars的长度 + len = (int) strlen(chars); + + // 没有有效元素 + if(len == 0) { + (*T).head = NULL; + (*T).tail = NULL; + (*T).curlen = 0; + + return OK; + } + + m = len / CHUNKSIZE; // 先计算需要填满的块 + n = len % CHUNKSIZE; // 如果存在未填满的块,计算该块中填充的有效元素数量 + if(n != 0) { + m++; // 计算总块数 + } + + // 1.创建块链串的结构 + for(i = 1; i <= m; i++) { + // 创建新块 + r = (Chunk*) malloc(sizeof(Chunk)); + if(r == NULL) { + exit(OVERFLOW); + } + r->next = NULL; + + // 第一个块 + if(i == 1) { + (*T).head = (*T).tail = r; + + // 联接后面的块 + } else { + (*T).tail->next = r; + (*T).tail = r; + } + } + + r = (*T).head; + i = 0; // 块链串T的游标 + count = 0; // 统计遍历过的元素,顺便作为chars的游标 + + // 2.为块链串填充内容 + while(count < len) { + r->ch[i] = chars[count]; + + i = (i + 1) % CHUNKSIZE; + if(i == 0) { + r = r->next; // 指向下一个块 + } + + count++; + } + + // 3.如果存在未填满的块 + if(n != 0) { + // 填充非串值内容(补上'\0') + while(i < CHUNKSIZE) { + (*T).tail->ch[i] = '\0'; + i++; + } + } + + // 4.记录长度信息 + (*T).curlen = len; + + return OK; +} + +/* + * 销毁 + * + *【注】 + * 块链串的结构可以销毁,但不是在销毁操作中 + */ +Status DestroyString(LString* S) { + return OK; +} + +/* + * 清空 + * + * 将串S清空。 + */ +Status ClearString(LString* S) { + Chunk* p, * q; + + p = (*S).head; + + // 释放所有串占用的空间 + while(p != NULL) { + q = p->next; + free(p); + p = q; + } + + (*S).head = NULL; + (*S).tail = NULL; + (*S).curlen = 0; + + return OK; +} + +/* + * 判空 + * + * 判断串S中是否包含有效数据。 + * + * 返回值: + * TRUE : 串S为空 + * FALSE: 串S不为空 + */ +Status StrEmpty(LString S) { + return S.curlen == 0 ? TRUE : FALSE; +} + +/* + * 计数 + * + * 返回串S中元素的个数。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrLength(LString S) { + return S.curlen; +} + +/* + * 求子串 + * + * 用Sub返回S[pos, pos+len-1]。 + * 返回值指示是否截取成功。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status SubString(LString* Sub, LString S, int pos, int len) { + int m; // Sub的总块数 + int n; // 如果Sub存在未填满的块,存储该块中的有效元素数量 + int i, j, count; + Chunk* r, * p; + + if(pos < 1 || pos > S.curlen || len < 0 || pos + len - 1 > S.curlen) { + return ERROR; + } + + // 如果是截取0个字符,不需要分配空间 + if(len == 0) { + (*Sub).head = NULL; + (*Sub).tail = NULL; + (*Sub).curlen = 0; + + return OK; + } + + m = len / CHUNKSIZE; // 先计算需要填满的块 + n = len % CHUNKSIZE; // 如果Sub存在未填满的块,计算该块中填充的有效元素数量 + if(n != 0) { + m++; // 计算Sub的总块数 + } + + // 1.创建Sub的结构 + for(i = 1; i <= m; i++) { + // 创建新块 + r = (Chunk*) malloc(sizeof(Chunk)); + if(r == NULL) { + exit(OVERFLOW); + } + r->next = NULL; + + // 第一个块 + if(i == 1) { + (*Sub).head = (*Sub).tail = r; + + // 联接后面的块 + } else { + (*Sub).tail->next = r; + (*Sub).tail = r; + } + } + + // 查找S中第pos个元素所在的块,并用指针p指向它 + for(count = 1, p = S.head; pos > count * CHUNKSIZE; count++, p = p->next) { + // 空循环 + } + + r = (*Sub).head; // 指向Sub的块 + + i = 0; // 块链串Sub的游标 + j = (pos - 1) % CHUNKSIZE; // 块链串S 的游标 + count = 0; // 统计遍历过的元素 + + // 2.为块链串Sub填充内容 + while(count < len) { + r->ch[i] = p->ch[j]; + + i = (i + 1) % CHUNKSIZE; + if(i == 0) { + r = r->next; // 指向Sub中下一个块 + } + + j = (j + 1) % CHUNKSIZE; + if(j == 0) { + p = p->next; // 指向S中下一个块 + } + + count++; + } + + // 3.如果存在未填满的块 + if(n != 0) { + // 填充非串值内容(补上'\0') + while(i < CHUNKSIZE) { + (*Sub).tail->ch[i] = '\0'; + i++; + } + } + + // 4.记录长度信息 + (*Sub).curlen = len; + + return OK; +} + +/* + * 查找 + * + * 从pos处开始搜索模式串T在主串S中首次出现的位置,如果不存在,则返回0。 + * 如果查找成功,返回匹配的位置。 + * + *【注】 + * 1.此实现需要依赖串的最小操作子集 + * 2.该实现比较低效 + */ +int Index(LString S, LString T, int pos) { + int i, s, t; + LString sub; + + if(pos < 1 || pos > S.curlen || StrEmpty(T)) { + return 0; + } + + s = S.curlen; //主串S长度 + t = T.curlen; //模式串T长度 + i = pos; + + while(i + t - 1 <= s) { + // 获取S[i, i+m-1] + SubString(&sub, S, i, t); + + // 如果子串与模式串不匹配,则需要继续推进 + if(StrCompare(sub, T) != 0) { + ++i; + } else { + return i; + } + } + + return 0; //找不到匹配的则返回0 +} + +/* + * 插入 + * + * 将串T插入到主串S的pos位置处。 + */ +Status StrInsert(LString* S, int pos, LString T) { + Chunk* pre, * p; // pre指向目标块的前驱,p指向目标块 + Chunk* h, * t; // 指向新增的块链的头部和尾部 + Chunk* r; + Chunk* s; + int i, j, count; + + if(pos < 1 || pos > (*S).curlen + 1) { + return ERROR; + } + + // 如果待插入的串为空,则提前返回 + if(StrEmpty(T)) { + return OK; + } + + // 记录待插入块的起始块和终止块 + h = t = NULL; + + // 复制T中的块(只复制结构) + for(r = T.head; r != NULL; r = r->next) { + s = (Chunk*) malloc(sizeof(Chunk)); + if(s == NULL) { + exit(OVERFLOW); + } + s->next = NULL; + + if(r == T.head) { + h = t = s; + } else { + t->next = s; + t = s; + } + } + + // 查找S中第pos个元素所在的块(注:称为目标块),并用指针pre指向它的前驱 + if(pos >= 1 && pos <= CHUNKSIZE) { + pre = NULL; // 说明第pos个元素所在块为head + p = (*S).head; + } else { + for(count = 1, pre = (*S).head; count < (pos - 1) / CHUNKSIZE; count++, pre = pre->next) { + // 空循环 + } + p = pre->next; + } + + /* + * 接下来,将h到t范围的块插入到pos所在的块之前 + */ + + if(pre == NULL) { + t->next = (*S).head; + (*S).head = h; + } else { + pre->next = h; + t->next = p; + } + + if(pre == (*S).tail) { + (*S).tail = t; + } + + /* + * 移动/复制元素 + */ + + j = 0; + + // 如果插入到了某个块的“中间” + if((pos - 1) % CHUNKSIZE != 0) { + // 移动目标块中pos位置之前的元素 + for(i = 1; i <= (pos - 1) % CHUNKSIZE; i++) { + h->ch[j++] = p->ch[i - 1]; + p->ch[i - 1] = '\0'; + } + } + + r = T.head; + i = 0; + + // 复制T中的元素到S中 + for(count = 1; count <= T.curlen; count++) { + h->ch[j] = r->ch[i]; + + j = (j + 1) % CHUNKSIZE; + i = (i + 1) % CHUNKSIZE; + + if(j == 0) { + h = h->next; + } + + if(i == 0) { + r = r->next; + } + } + + // 如果T中最后一个块中包含'\0' + if(T.curlen % CHUNKSIZE != 0) { + r = p; // 指向目标块 + i = (pos - 1) % CHUNKSIZE; + + // 移动目标块中pos位置及其之后的元素 + for(count = pos; count <= (*S).curlen; count++) { + h->ch[j] = r->ch[i]; + r->ch[i] = '\0'; + + j = (j + 1) % CHUNKSIZE; + i = (i + 1) % CHUNKSIZE; + + if(j == 0) { + h = h->next; + } + + if(i == 0) { + r = r->next; + } + } + } + + (*S).curlen += T.curlen; + + return OK; +} + +/* + * 删除 + * + * 删除S[pos, pos+len-1]。 + */ +Status StrDelete(LString* S, int pos, int len) { + Chunk* pre; // 指向元素S[pos]所在的块的前驱 + Chunk* p; // 指向元素S[pos]所在的块 + Chunk* q; // 指向元素S[pos+len]所在的块 + Chunk* r; + int i, j, count, total; + + if(pos < 1 || pos > (*S).curlen || len < 0 || pos + len - 1 > (*S).curlen) { + return ERROR; + } + + // 如果待删除的长度为0,则提前返回 + if(len == 0) { + return OK; + } + + // 查找S[pos]所在的块,并用指针pre指向它的前驱 + if(pos >= 1 && pos <= CHUNKSIZE) { + pre = NULL; // 说明第pos个元素所在块为head + p = (*S).head; + } else { + for(count = 1, pre = (*S).head; count < (pos - 1) / CHUNKSIZE; count++, pre = pre->next) { + // 空循环 + } + p = pre->next; + } + + // 查找S[pos+len]所在的块 + for(count = (pos - 1) / CHUNKSIZE, q = p; count < (pos + len - 1) / CHUNKSIZE; count++, q = q->next) { + // 空循环 + } + + // 计算可能需要移动的元素个数 + total = (*S).curlen - (pos + len) + 1; + + // 把最终的长度先定下来 + (*S).curlen -= len; + + i = (pos - 1) % CHUNKSIZE; + j = (pos + len - 1) % CHUNKSIZE; + + if(p != q) { + // 删除p与q之间的块 + r = p->next; + while(r != q) { + p->next = r->next; + free(r); + r = p->next; + } + + if(q == NULL) { + (*S).tail = p; + } + + // 如果需要删除p指向的整个块 + if((pos - 1) % CHUNKSIZE == 0) { + // p已经指向块链的头部 + if(pre == NULL) { + (*S).head = q; + } else { + pre->next = q; + } + + free(p); + p = q; + + if(q == NULL) { + (*S).tail = pre; + } + } + } + + // 已经就位 + if(p == q && i == j) { + return OK; + } + + for(count = 1; count <= total; count++) { + // 移动元素 + p->ch[i] = q->ch[j]; + + i = (i + 1) % CHUNKSIZE; + j = (j + 1) % CHUNKSIZE; + + if(i == 0) { + pre = p; + p = p->next; + } + + if(j == 0) { + q = q->next; + } + } + + // 恰好填满了最后的块 + if(i == 0) { + (*S).tail = pre; + r = p; + } else { + (*S).tail = p; + + // 剩余部分填充非串值字符 + while(i < CHUNKSIZE) { + p->ch[i++] = '\0'; + } + + r = p->next; + } + + // 释放多余的空间 + while(r != NULL) { + (*S).tail->next = r->next; + free(r); + r = (*S).tail->next; + } + + return OK; +} + +/* + * 比较 + * + * 比较串S和串T,返回比较结果。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrCompare(LString S, LString T) { + int i; + Chunk* s = S.head; + Chunk* t = T.head; + + while(s != NULL && t != NULL) { + for(i = 0; i < CHUNKSIZE; i++) { + if(s->ch[i] != t->ch[i]) { + return s->ch[i] - t->ch[i]; + } + } + + s = s->next; + t = t->next; + } + + if(s != NULL) { + return 1; + } else if(t != NULL) { + return -1; + } else { + return 0; + } +} + +/* + * 复制 + * + * 将串S复制到串T。 + */ +Status StrCopy(LString* T, LString S) { + int i; + Chunk* s, * p; + + for(p = S.head; p; p = p->next) { + s = (Chunk*) malloc(sizeof(Chunk)); + if(s == NULL) { + exit(OVERFLOW); + } + s->next = NULL; + + if(p == S.head) { + (*T).head = (*T).tail = s; + } else { + (*T).tail->next = s; + (*T).tail = s; + } + + for(i = 0; i < CHUNKSIZE; i++) { + (*s).ch[i] = (*p).ch[i]; + } + } + + (*T).curlen = S.curlen; + + return OK; +} + +/* + * 替换 + * + * 用V替换主串S中出现的所有与T相等的且不重叠的子串。 + * + *【注】 + * 1.该操作依赖最小操作子集 + * 2.该实现比较低效 + */ +Status Replace(LString* S, LString T, LString V) { + int i; + + if(StrEmpty(*S) || StrEmpty(T)) { + return ERROR; + } + + // 在主串S中寻找模式串T第一次出现的位置 + i = Index(*S, T, 1); + + // 如果存在匹配的字符串 + while(i != 0) { + StrDelete(S, i, StrLength(T)); // 从S中删除T + StrInsert(S, i, V); // 向S中插入V + + i += StrLength(V); // i切换到下一个位置 + + i = Index(*S, T, i); // 查找下一个匹配的字符串 + } + + return OK; +} + +/* + * 串联接 + * + * 联接S1和S2,并存储到T中返回。如果联接后的长度溢出,则只保留未溢出的部分。 + * 返回值表示联接后的串是否完整。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status Concat(LString* T, LString S1, LString S2) { + Chunk* p; // 用来遍历S1和S2 + Chunk* r; // 遍历T + Chunk* s; + int i, j, count; + + // 计算长度信息 + (*T).curlen = S1.curlen + S2.curlen; + + // 计算需要创建多少个块 + count = (*T).curlen / CHUNKSIZE + ((*T).curlen % CHUNKSIZE == 0 ? 0 : 1); + + // 复制S1的结构 + for(i = 1; i <= count; i++) { + s = (Chunk*) malloc(sizeof(Chunk)); + if(s == NULL) { + exit(OVERFLOW); + } + s->next = NULL; + + if(i == 1) { + (*T).head = (*T).tail = s; + } else { + (*T).tail->next = s; + (*T).tail = s; + } + } + + i = 0; + r = (*T).head; + + // 复制S1中的数据 + j = 0; + p = S1.head; + for(count = 0; count < S1.curlen; count++) { + r->ch[i] = p->ch[j]; + + i = (i + 1) % CHUNKSIZE; + j = (j + 1) % CHUNKSIZE; + + if(i == 0) { + r = r->next; + } + + if(j == 0) { + p = p->next; + } + } + + // 复制S2中的数据 + j = 0; + p = S2.head; + for(count = 0; count < S2.curlen; count++) { + r->ch[i] = p->ch[j]; + + i = (i + 1) % CHUNKSIZE; + j = (j + 1) % CHUNKSIZE; + + if(i == 0) { + r = r->next; + } + + if(j == 0) { + p = p->next; + } + } + + // 多余的空间填充非串值字符 + if(i != 0) { + while(i < CHUNKSIZE) { + r->ch[i] = '\0'; + i++; + } + } + + return OK; +} + +// 测试函数,打印字符串 +void StrPrint(LString S) { + int i = 0; + Chunk* p = S.head; + + if(S.curlen == 0 || S.head == NULL || S.tail == NULL) { + return; + } + + while(p != NULL) { + // 遇到非串值符号时结束遍历 + if(p->ch[i] == '\0') { + break; + } + + printf("%c", p->ch[i]); + + i = (i + 1) % CHUNKSIZE; + + if(i == 0) { + p = p->next; + } + } + + printf("\n"); +} diff --git a/CLion/ExerciseBook/04.22/LString.h b/CLion/ExerciseBook/04.22/LString.h new file mode 100644 index 0000000..54359bb --- /dev/null +++ b/CLion/ExerciseBook/04.22/LString.h @@ -0,0 +1,169 @@ +/*============================= + * 串的块链分配存储表示(块链串) + ==============================*/ + +#ifndef LSTRING_H +#define LSTRING_H + +#include +#include // 提供malloc、realloc、free、exit原型 +#include // 提供strlen原型 +#include "Status.h" //**▲01 绪论**// + +/* 宏定义 */ +#define CHUNKSIZE 3 // 块大小(自定义) + +/* 串的块链存储结构 */ +typedef struct Chunk { + char ch[CHUNKSIZE]; // 当前块中的内容 + struct Chunk* next; // 指向下一个块 +} Chunk; + +/* 串的块链存储类型定义 */ +typedef struct { + Chunk* head; //串的头指针 + Chunk* tail; //串的尾指针 + int curlen; //串的当前长度 +} LString; + + +/* + * ████ 提示 ████ + * + * 遵循教材的书写习惯,pos指示字符的位序(不是索引),从1开始计数 + */ + +/* + * ████ 注意 ████ + * + * 1.教材示例中使用#作为非串值字符,而这里使用C语言中的\0作为非串值字符 + * 2.教材中指出,块链的最后一个块中,末尾可能是用非串值字符填充的。 + * 例如块大小为4,长度为14的块可能为:ABCD -> EFGH -> IJKL -> MN\0\0 + */ + + +/* + * 初始化 + * + * 构造一个值为chars的串T。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status StrAssign(LString* T, const char* chars); + +/* + * 销毁 + * + * 将串S销毁。 + */ +Status DestroyString(LString* S); + +/* + * 清空 + * + * 将串S清空。 + */ +Status ClearString(LString* S); + +/* + * 判空 + * + * 判断串S中是否包含有效数据。 + * + * 返回值: + * TRUE : 串S为空 + * FALSE: 串S不为空 + */ +Status StrEmpty(LString S); + +/* + * 计数 + * + * 返回串S中元素的个数。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrLength(LString S); + +/* + * 求子串 + * + * 用Sub返回S[pos, pos+len-1]。 + * 返回值指示是否截取成功。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status SubString(LString* Sub, LString S, int pos, int len); + +/* + * 查找 + * + * 从pos处开始搜索模式串T在主串S中首次出现的位置,如果不存在,则返回0。 + * 如果查找成功,返回匹配的位置。 + * + *【注】 + * 1.此实现需要依赖串的最小操作子集 + * 2.该实现比较低效 + */ +int Index(LString S, LString T, int pos); + +/* + * 插入 + * + * 将串T插入到主串S的pos位置处。 + */ +Status StrInsert(LString* S, int pos, LString T); + +/* + * 删除 + * + * 删除S[pos, pos+len-1]。 + */ +Status StrDelete(LString* S, int pos, int len); + +/* + * 比较 + * + * 比较串S和串T,返回比较结果。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status StrCompare(LString S, LString T); + +/* + * 复制 + * + * 将串S复制到串T。 + */ +Status StrCopy(LString* T, LString S); + +/* + * 替换 + * + * 用V替换主串S中出现的所有与T相等的且不重叠的子串。 + * + *【注】 + * 1.该操作依赖最小操作子集 + * 2.该实现比较低效 + */ +Status Replace(LString* S, LString T, LString V); + +/* + * 串联接 + * + * 联接S1和S2,并存储到T中返回。如果联接后的长度溢出,则只保留未溢出的部分。 + * 返回值表示联接后的串是否完整。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status Concat(LString* T, LString S1, LString S2); + +// 测试函数,打印字符串 +void StrPrint(LString S); + +#endif diff --git a/CLion/ExerciseBook/04.23/04.23.c b/CLion/ExerciseBook/04.23/04.23.c new file mode 100644 index 0000000..20d78c4 --- /dev/null +++ b/CLion/ExerciseBook/04.23/04.23.c @@ -0,0 +1,107 @@ +#include +#include "LString.h" //**▲04 串**// + +/* + * 判断给定的串是否对称。 + * 空串或单字符的串会被认为是对称的。 + */ +Status Algo_4_23(LString T); + + +int main(int argc, char* argv[]) { + char* t = "abcdefgfedcba"; + LString T; + + StrAssign(&T, t); + printf("T = "); + StrPrint(T); + + Algo_4_23(T) ? printf("T是对称串!\n") : printf("T是非对称串!!\n"); + + return 0; +} + + +/* + * 判断给定的串是否对称。 + * 空串或单字符的串会被认为是对称的。 + */ +Status Algo_4_23(LString T) { + int len; // T的长度 + + int a1, b1; // T的前半部分边界 + int a2, b2; // T的后半部分边界 + int k; // 限制遍历T时需要经过的元素数量 + int i; // 遍历T时的游标 + Chunk* t; + + char* stack; // 模拟栈 + int top; // 栈游标 + + char c; // 从T中取出的字符 + + len = StrLength(T); + + // 空串被认为是对称的 + if(len == 0) { + return OK; + } + + // 如果串的长度是偶数 + if(len % 2 == 0) { + a1 = 0; + b1 = len / 2 - 1; + a2 = len / 2; + b2 = len - 1; + // 如果串的长度是奇数 + } else { + a1 = 0; + b1 = len / 2 - 1; + a2 = len / 2 + 1; + b2 = len - 1; + } + + stack = (char*) malloc(len * sizeof(char)); + top = -1; + + i = 0; + t = T.head; + + // 对于串的前半部分,将其入栈 + for(k = a1; k <= b1; k++) { + c = t->ch[i]; + i = (i + 1) % CHUNKSIZE; + if(i == 0) { + t = t->next; + } + + stack[++top] = c; + } + + // 如果串长为奇数,需要跨过一个字符 + if(len % 2 == 1) { + i = (i + 1) % CHUNKSIZE; + if(i == 0) { + t = t->next; + } + } + + for(k = a2; k <= b2; k++) { + c = t->ch[i]; + i = (i + 1) % CHUNKSIZE; + if(i == 0) { + t = t->next; + } + + // 遇到了不对称的字符 + if(stack[top--] != c) { + return ERROR; + } + } + + if(top == -1) { + return OK; + } else { + return ERROR; + } +} diff --git a/CLion/ExerciseBook/04.23/CMakeLists.txt b/CLion/ExerciseBook/04.23/CMakeLists.txt new file mode 100644 index 0000000..577b55d --- /dev/null +++ b/CLion/ExerciseBook/04.23/CMakeLists.txt @@ -0,0 +1,7 @@ +# 包含公共库 +include_directories(${CMAKE_SOURCE_DIR}/Status) + +# 生成可执行文件 +add_executable(04.23 LString.h LString.c 04.23.c) +# 链接公共库 +target_link_libraries(04.23 Scanf_lib) \ No newline at end of file diff --git a/CLion/ExerciseBook/04.23/LString.c b/CLion/ExerciseBook/04.23/LString.c new file mode 100644 index 0000000..77783f4 --- /dev/null +++ b/CLion/ExerciseBook/04.23/LString.c @@ -0,0 +1,748 @@ +/*============================= + * 串的块链分配存储表示(块链串) + ==============================*/ + +#include "LString.h" //**▲04 串**// + +/* + * 初始化 + * + * 构造一个值为chars的串T。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status StrAssign(LString* T, const char* chars) { + int len; // chars的长度 + int i, count; // 遍历块链串和字符串chars的游标 + int m; // 总块数 + int n; // 如果存在未填满的块,存储该块中的有效元素数量 + Chunk* r; + + // 求chars的长度 + len = (int) strlen(chars); + + // 没有有效元素 + if(len == 0) { + (*T).head = NULL; + (*T).tail = NULL; + (*T).curlen = 0; + + return OK; + } + + m = len / CHUNKSIZE; // 先计算需要填满的块 + n = len % CHUNKSIZE; // 如果存在未填满的块,计算该块中填充的有效元素数量 + if(n != 0) { + m++; // 计算总块数 + } + + // 1.创建块链串的结构 + for(i = 1; i <= m; i++) { + // 创建新块 + r = (Chunk*) malloc(sizeof(Chunk)); + if(r == NULL) { + exit(OVERFLOW); + } + r->next = NULL; + + // 第一个块 + if(i == 1) { + (*T).head = (*T).tail = r; + + // 联接后面的块 + } else { + (*T).tail->next = r; + (*T).tail = r; + } + } + + r = (*T).head; + i = 0; // 块链串T的游标 + count = 0; // 统计遍历过的元素,顺便作为chars的游标 + + // 2.为块链串填充内容 + while(count < len) { + r->ch[i] = chars[count]; + + i = (i + 1) % CHUNKSIZE; + if(i == 0) { + r = r->next; // 指向下一个块 + } + + count++; + } + + // 3.如果存在未填满的块 + if(n != 0) { + // 填充非串值内容(补上'\0') + while(i < CHUNKSIZE) { + (*T).tail->ch[i] = '\0'; + i++; + } + } + + // 4.记录长度信息 + (*T).curlen = len; + + return OK; +} + +/* + * 销毁 + * + *【注】 + * 块链串的结构可以销毁,但不是在销毁操作中 + */ +Status DestroyString(LString* S) { + return OK; +} + +/* + * 清空 + * + * 将串S清空。 + */ +Status ClearString(LString* S) { + Chunk* p, * q; + + p = (*S).head; + + // 释放所有串占用的空间 + while(p != NULL) { + q = p->next; + free(p); + p = q; + } + + (*S).head = NULL; + (*S).tail = NULL; + (*S).curlen = 0; + + return OK; +} + +/* + * 判空 + * + * 判断串S中是否包含有效数据。 + * + * 返回值: + * TRUE : 串S为空 + * FALSE: 串S不为空 + */ +Status StrEmpty(LString S) { + return S.curlen == 0 ? TRUE : FALSE; +} + +/* + * 计数 + * + * 返回串S中元素的个数。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrLength(LString S) { + return S.curlen; +} + +/* + * 求子串 + * + * 用Sub返回S[pos, pos+len-1]。 + * 返回值指示是否截取成功。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status SubString(LString* Sub, LString S, int pos, int len) { + int m; // Sub的总块数 + int n; // 如果Sub存在未填满的块,存储该块中的有效元素数量 + int i, j, count; + Chunk* r, * p; + + if(pos < 1 || pos > S.curlen || len < 0 || pos + len - 1 > S.curlen) { + return ERROR; + } + + // 如果是截取0个字符,不需要分配空间 + if(len == 0) { + (*Sub).head = NULL; + (*Sub).tail = NULL; + (*Sub).curlen = 0; + + return OK; + } + + m = len / CHUNKSIZE; // 先计算需要填满的块 + n = len % CHUNKSIZE; // 如果Sub存在未填满的块,计算该块中填充的有效元素数量 + if(n != 0) { + m++; // 计算Sub的总块数 + } + + // 1.创建Sub的结构 + for(i = 1; i <= m; i++) { + // 创建新块 + r = (Chunk*) malloc(sizeof(Chunk)); + if(r == NULL) { + exit(OVERFLOW); + } + r->next = NULL; + + // 第一个块 + if(i == 1) { + (*Sub).head = (*Sub).tail = r; + + // 联接后面的块 + } else { + (*Sub).tail->next = r; + (*Sub).tail = r; + } + } + + // 查找S中第pos个元素所在的块,并用指针p指向它 + for(count = 1, p = S.head; pos > count * CHUNKSIZE; count++, p = p->next) { + // 空循环 + } + + r = (*Sub).head; // 指向Sub的块 + + i = 0; // 块链串Sub的游标 + j = (pos - 1) % CHUNKSIZE; // 块链串S 的游标 + count = 0; // 统计遍历过的元素 + + // 2.为块链串Sub填充内容 + while(count < len) { + r->ch[i] = p->ch[j]; + + i = (i + 1) % CHUNKSIZE; + if(i == 0) { + r = r->next; // 指向Sub中下一个块 + } + + j = (j + 1) % CHUNKSIZE; + if(j == 0) { + p = p->next; // 指向S中下一个块 + } + + count++; + } + + // 3.如果存在未填满的块 + if(n != 0) { + // 填充非串值内容(补上'\0') + while(i < CHUNKSIZE) { + (*Sub).tail->ch[i] = '\0'; + i++; + } + } + + // 4.记录长度信息 + (*Sub).curlen = len; + + return OK; +} + +/* + * 查找 + * + * 从pos处开始搜索模式串T在主串S中首次出现的位置,如果不存在,则返回0。 + * 如果查找成功,返回匹配的位置。 + * + *【注】 + * 1.此实现需要依赖串的最小操作子集 + * 2.该实现比较低效 + */ +int Index(LString S, LString T, int pos) { + int i, s, t; + LString sub; + + if(pos < 1 || pos > S.curlen || StrEmpty(T)) { + return 0; + } + + s = S.curlen; //主串S长度 + t = T.curlen; //模式串T长度 + i = pos; + + while(i + t - 1 <= s) { + // 获取S[i, i+m-1] + SubString(&sub, S, i, t); + + // 如果子串与模式串不匹配,则需要继续推进 + if(StrCompare(sub, T) != 0) { + ++i; + } else { + return i; + } + } + + return 0; //找不到匹配的则返回0 +} + +/* + * 插入 + * + * 将串T插入到主串S的pos位置处。 + */ +Status StrInsert(LString* S, int pos, LString T) { + Chunk* pre, * p; // pre指向目标块的前驱,p指向目标块 + Chunk* h, * t; // 指向新增的块链的头部和尾部 + Chunk* r; + Chunk* s; + int i, j, count; + + if(pos < 1 || pos > (*S).curlen + 1) { + return ERROR; + } + + // 如果待插入的串为空,则提前返回 + if(StrEmpty(T)) { + return OK; + } + + // 记录待插入块的起始块和终止块 + h = t = NULL; + + // 复制T中的块(只复制结构) + for(r = T.head; r != NULL; r = r->next) { + s = (Chunk*) malloc(sizeof(Chunk)); + if(s == NULL) { + exit(OVERFLOW); + } + s->next = NULL; + + if(r == T.head) { + h = t = s; + } else { + t->next = s; + t = s; + } + } + + // 查找S中第pos个元素所在的块(注:称为目标块),并用指针pre指向它的前驱 + if(pos >= 1 && pos <= CHUNKSIZE) { + pre = NULL; // 说明第pos个元素所在块为head + p = (*S).head; + } else { + for(count = 1, pre = (*S).head; count < (pos - 1) / CHUNKSIZE; count++, pre = pre->next) { + // 空循环 + } + p = pre->next; + } + + /* + * 接下来,将h到t范围的块插入到pos所在的块之前 + */ + + if(pre == NULL) { + t->next = (*S).head; + (*S).head = h; + } else { + pre->next = h; + t->next = p; + } + + if(pre == (*S).tail) { + (*S).tail = t; + } + + /* + * 移动/复制元素 + */ + + j = 0; + + // 如果插入到了某个块的“中间” + if((pos - 1) % CHUNKSIZE != 0) { + // 移动目标块中pos位置之前的元素 + for(i = 1; i <= (pos - 1) % CHUNKSIZE; i++) { + h->ch[j++] = p->ch[i - 1]; + p->ch[i - 1] = '\0'; + } + } + + r = T.head; + i = 0; + + // 复制T中的元素到S中 + for(count = 1; count <= T.curlen; count++) { + h->ch[j] = r->ch[i]; + + j = (j + 1) % CHUNKSIZE; + i = (i + 1) % CHUNKSIZE; + + if(j == 0) { + h = h->next; + } + + if(i == 0) { + r = r->next; + } + } + + // 如果T中最后一个块中包含'\0' + if(T.curlen % CHUNKSIZE != 0) { + r = p; // 指向目标块 + i = (pos - 1) % CHUNKSIZE; + + // 移动目标块中pos位置及其之后的元素 + for(count = pos; count <= (*S).curlen; count++) { + h->ch[j] = r->ch[i]; + r->ch[i] = '\0'; + + j = (j + 1) % CHUNKSIZE; + i = (i + 1) % CHUNKSIZE; + + if(j == 0) { + h = h->next; + } + + if(i == 0) { + r = r->next; + } + } + } + + (*S).curlen += T.curlen; + + return OK; +} + +/* + * 删除 + * + * 删除S[pos, pos+len-1]。 + */ +Status StrDelete(LString* S, int pos, int len) { + Chunk* pre; // 指向元素S[pos]所在的块的前驱 + Chunk* p; // 指向元素S[pos]所在的块 + Chunk* q; // 指向元素S[pos+len]所在的块 + Chunk* r; + int i, j, count, total; + + if(pos < 1 || pos > (*S).curlen || len < 0 || pos + len - 1 > (*S).curlen) { + return ERROR; + } + + // 如果待删除的长度为0,则提前返回 + if(len == 0) { + return OK; + } + + // 查找S[pos]所在的块,并用指针pre指向它的前驱 + if(pos >= 1 && pos <= CHUNKSIZE) { + pre = NULL; // 说明第pos个元素所在块为head + p = (*S).head; + } else { + for(count = 1, pre = (*S).head; count < (pos - 1) / CHUNKSIZE; count++, pre = pre->next) { + // 空循环 + } + p = pre->next; + } + + // 查找S[pos+len]所在的块 + for(count = (pos - 1) / CHUNKSIZE, q = p; count < (pos + len - 1) / CHUNKSIZE; count++, q = q->next) { + // 空循环 + } + + // 计算可能需要移动的元素个数 + total = (*S).curlen - (pos + len) + 1; + + // 把最终的长度先定下来 + (*S).curlen -= len; + + i = (pos - 1) % CHUNKSIZE; + j = (pos + len - 1) % CHUNKSIZE; + + if(p != q) { + // 删除p与q之间的块 + r = p->next; + while(r != q) { + p->next = r->next; + free(r); + r = p->next; + } + + if(q == NULL) { + (*S).tail = p; + } + + // 如果需要删除p指向的整个块 + if((pos - 1) % CHUNKSIZE == 0) { + // p已经指向块链的头部 + if(pre == NULL) { + (*S).head = q; + } else { + pre->next = q; + } + + free(p); + p = q; + + if(q == NULL) { + (*S).tail = pre; + } + } + } + + // 已经就位 + if(p == q && i == j) { + return OK; + } + + for(count = 1; count <= total; count++) { + // 移动元素 + p->ch[i] = q->ch[j]; + + i = (i + 1) % CHUNKSIZE; + j = (j + 1) % CHUNKSIZE; + + if(i == 0) { + pre = p; + p = p->next; + } + + if(j == 0) { + q = q->next; + } + } + + // 恰好填满了最后的块 + if(i == 0) { + (*S).tail = pre; + r = p; + } else { + (*S).tail = p; + + // 剩余部分填充非串值字符 + while(i < CHUNKSIZE) { + p->ch[i++] = '\0'; + } + + r = p->next; + } + + // 释放多余的空间 + while(r != NULL) { + (*S).tail->next = r->next; + free(r); + r = (*S).tail->next; + } + + return OK; +} + +/* + * 比较 + * + * 比较串S和串T,返回比较结果。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrCompare(LString S, LString T) { + int i; + Chunk* s = S.head; + Chunk* t = T.head; + + while(s != NULL && t != NULL) { + for(i = 0; i < CHUNKSIZE; i++) { + if(s->ch[i] != t->ch[i]) { + return s->ch[i] - t->ch[i]; + } + } + + s = s->next; + t = t->next; + } + + if(s != NULL) { + return 1; + } else if(t != NULL) { + return -1; + } else { + return 0; + } +} + +/* + * 复制 + * + * 将串S复制到串T。 + */ +Status StrCopy(LString* T, LString S) { + int i; + Chunk* s, * p; + + for(p = S.head; p; p = p->next) { + s = (Chunk*) malloc(sizeof(Chunk)); + if(s == NULL) { + exit(OVERFLOW); + } + s->next = NULL; + + if(p == S.head) { + (*T).head = (*T).tail = s; + } else { + (*T).tail->next = s; + (*T).tail = s; + } + + for(i = 0; i < CHUNKSIZE; i++) { + (*s).ch[i] = (*p).ch[i]; + } + } + + (*T).curlen = S.curlen; + + return OK; +} + +/* + * 替换 + * + * 用V替换主串S中出现的所有与T相等的且不重叠的子串。 + * + *【注】 + * 1.该操作依赖最小操作子集 + * 2.该实现比较低效 + */ +Status Replace(LString* S, LString T, LString V) { + int i; + + if(StrEmpty(*S) || StrEmpty(T)) { + return ERROR; + } + + // 在主串S中寻找模式串T第一次出现的位置 + i = Index(*S, T, 1); + + // 如果存在匹配的字符串 + while(i != 0) { + StrDelete(S, i, StrLength(T)); // 从S中删除T + StrInsert(S, i, V); // 向S中插入V + + i += StrLength(V); // i切换到下一个位置 + + i = Index(*S, T, i); // 查找下一个匹配的字符串 + } + + return OK; +} + +/* + * 串联接 + * + * 联接S1和S2,并存储到T中返回。如果联接后的长度溢出,则只保留未溢出的部分。 + * 返回值表示联接后的串是否完整。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status Concat(LString* T, LString S1, LString S2) { + Chunk* p; // 用来遍历S1和S2 + Chunk* r; // 遍历T + Chunk* s; + int i, j, count; + + // 计算长度信息 + (*T).curlen = S1.curlen + S2.curlen; + + // 计算需要创建多少个块 + count = (*T).curlen / CHUNKSIZE + ((*T).curlen % CHUNKSIZE == 0 ? 0 : 1); + + // 复制S1的结构 + for(i = 1; i <= count; i++) { + s = (Chunk*) malloc(sizeof(Chunk)); + if(s == NULL) { + exit(OVERFLOW); + } + s->next = NULL; + + if(i == 1) { + (*T).head = (*T).tail = s; + } else { + (*T).tail->next = s; + (*T).tail = s; + } + } + + i = 0; + r = (*T).head; + + // 复制S1中的数据 + j = 0; + p = S1.head; + for(count = 0; count < S1.curlen; count++) { + r->ch[i] = p->ch[j]; + + i = (i + 1) % CHUNKSIZE; + j = (j + 1) % CHUNKSIZE; + + if(i == 0) { + r = r->next; + } + + if(j == 0) { + p = p->next; + } + } + + // 复制S2中的数据 + j = 0; + p = S2.head; + for(count = 0; count < S2.curlen; count++) { + r->ch[i] = p->ch[j]; + + i = (i + 1) % CHUNKSIZE; + j = (j + 1) % CHUNKSIZE; + + if(i == 0) { + r = r->next; + } + + if(j == 0) { + p = p->next; + } + } + + // 多余的空间填充非串值字符 + if(i != 0) { + while(i < CHUNKSIZE) { + r->ch[i] = '\0'; + i++; + } + } + + return OK; +} + +// 测试函数,打印字符串 +void StrPrint(LString S) { + int i = 0; + Chunk* p = S.head; + + if(S.curlen == 0 || S.head == NULL || S.tail == NULL) { + printf("\n"); + return; + } + + while(p != NULL) { + // 遇到非串值符号时结束遍历 + if(p->ch[i] == '\0') { + break; + } + + printf("%c", p->ch[i]); + + i = (i + 1) % CHUNKSIZE; + + if(i == 0) { + p = p->next; + } + } + + printf("\n"); +} diff --git a/CLion/ExerciseBook/04.23/LString.h b/CLion/ExerciseBook/04.23/LString.h new file mode 100644 index 0000000..54359bb --- /dev/null +++ b/CLion/ExerciseBook/04.23/LString.h @@ -0,0 +1,169 @@ +/*============================= + * 串的块链分配存储表示(块链串) + ==============================*/ + +#ifndef LSTRING_H +#define LSTRING_H + +#include +#include // 提供malloc、realloc、free、exit原型 +#include // 提供strlen原型 +#include "Status.h" //**▲01 绪论**// + +/* 宏定义 */ +#define CHUNKSIZE 3 // 块大小(自定义) + +/* 串的块链存储结构 */ +typedef struct Chunk { + char ch[CHUNKSIZE]; // 当前块中的内容 + struct Chunk* next; // 指向下一个块 +} Chunk; + +/* 串的块链存储类型定义 */ +typedef struct { + Chunk* head; //串的头指针 + Chunk* tail; //串的尾指针 + int curlen; //串的当前长度 +} LString; + + +/* + * ████ 提示 ████ + * + * 遵循教材的书写习惯,pos指示字符的位序(不是索引),从1开始计数 + */ + +/* + * ████ 注意 ████ + * + * 1.教材示例中使用#作为非串值字符,而这里使用C语言中的\0作为非串值字符 + * 2.教材中指出,块链的最后一个块中,末尾可能是用非串值字符填充的。 + * 例如块大小为4,长度为14的块可能为:ABCD -> EFGH -> IJKL -> MN\0\0 + */ + + +/* + * 初始化 + * + * 构造一个值为chars的串T。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status StrAssign(LString* T, const char* chars); + +/* + * 销毁 + * + * 将串S销毁。 + */ +Status DestroyString(LString* S); + +/* + * 清空 + * + * 将串S清空。 + */ +Status ClearString(LString* S); + +/* + * 判空 + * + * 判断串S中是否包含有效数据。 + * + * 返回值: + * TRUE : 串S为空 + * FALSE: 串S不为空 + */ +Status StrEmpty(LString S); + +/* + * 计数 + * + * 返回串S中元素的个数。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrLength(LString S); + +/* + * 求子串 + * + * 用Sub返回S[pos, pos+len-1]。 + * 返回值指示是否截取成功。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status SubString(LString* Sub, LString S, int pos, int len); + +/* + * 查找 + * + * 从pos处开始搜索模式串T在主串S中首次出现的位置,如果不存在,则返回0。 + * 如果查找成功,返回匹配的位置。 + * + *【注】 + * 1.此实现需要依赖串的最小操作子集 + * 2.该实现比较低效 + */ +int Index(LString S, LString T, int pos); + +/* + * 插入 + * + * 将串T插入到主串S的pos位置处。 + */ +Status StrInsert(LString* S, int pos, LString T); + +/* + * 删除 + * + * 删除S[pos, pos+len-1]。 + */ +Status StrDelete(LString* S, int pos, int len); + +/* + * 比较 + * + * 比较串S和串T,返回比较结果。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status StrCompare(LString S, LString T); + +/* + * 复制 + * + * 将串S复制到串T。 + */ +Status StrCopy(LString* T, LString S); + +/* + * 替换 + * + * 用V替换主串S中出现的所有与T相等的且不重叠的子串。 + * + *【注】 + * 1.该操作依赖最小操作子集 + * 2.该实现比较低效 + */ +Status Replace(LString* S, LString T, LString V); + +/* + * 串联接 + * + * 联接S1和S2,并存储到T中返回。如果联接后的长度溢出,则只保留未溢出的部分。 + * 返回值表示联接后的串是否完整。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status Concat(LString* T, LString S1, LString S2); + +// 测试函数,打印字符串 +void StrPrint(LString S); + +#endif diff --git a/CLion/ExerciseBook/04.24-04.26/04.24-04.26.c b/CLion/ExerciseBook/04.24-04.26/04.24-04.26.c new file mode 100644 index 0000000..c7bb3d8 --- /dev/null +++ b/CLion/ExerciseBook/04.24-04.26/04.24-04.26.c @@ -0,0 +1,101 @@ +#include +#include "Status.h" //**▲01 绪论**// +#include "HString.h" //**▲04 串**// + +/* + * 联接:Concat + * + *【注】 + * 该函数已在HString相关文件中定义 + */ +Status Algo_4_24(HString* T, HString S1, HString S2); + +/* + * 替换:Replace + * + *【注】 + * 该函数已在HString相关文件中定义 + */ +Status Algo_4_25(HString* S, HString T, HString V); + +/* + * 插入:StrInsert + * + *【注】 + * 该函数已在HString相关文件中定义 + */ +Status Algo_4_26(HString* S, int pos, HString T); + + +int main(int argc, char* argv[]) { + char* s = "---*^***^*^*^*---"; + char* s1 = "*"; + char* s2 = "^*"; + char* v = "*_*"; + HString S1, S2, T, V, S; + + StrAssign(&S1, s1); + StrAssign(&S2, s2); + StrAssign(&V, v); + StrAssign(&S, s); + + printf("S1 = "); + StrPrint(S1); + printf("S2 = "); + StrPrint(S2); + printf("V = "); + StrPrint(V); + printf("S = "); + StrPrint(S); + + printf("███题 4.24 验证...███\n"); + printf("连接S1和S2为T...\n"); + Algo_4_24(&T, S1, S2); + printf("T = "); + StrPrint(T); + + printf("███题 4.25 验证...███\n"); + printf("用 V 替换 S 中的 T...\n"); + Algo_4_25(&S, T, V); + printf("S = "); + StrPrint(S); + + printf("███题 4.26 验证...███\n"); + printf("将 T 插入到 S 的第 2 个位置...\n"); + Algo_4_26(&S, 2, T); + printf("S = "); + StrPrint(S); + + return 0; +} + + +/* + * 联接:Concat + * + *【注】 + * 该函数已在HString相关文件中定义 + */ +Status Algo_4_24(HString* T, HString S1, HString S2) { + return Concat(T, S1, S2); +} + +/* + * 替换:Replace + * + *【注】 + * 该函数已在HString相关文件中定义 + */ +Status Algo_4_25(HString* S, HString T, HString V) { + return Replace(S, T, V); +} + +/* + * 插入:StrInsert + * + *【注】 + * 该函数已在HString相关文件中定义 + */ +Status Algo_4_26(HString* S, int pos, HString T) { + return StrInsert(S, pos, T); +} diff --git a/CLion/ExerciseBook/04.24-04.26/CMakeLists.txt b/CLion/ExerciseBook/04.24-04.26/CMakeLists.txt new file mode 100644 index 0000000..1024464 --- /dev/null +++ b/CLion/ExerciseBook/04.24-04.26/CMakeLists.txt @@ -0,0 +1,7 @@ +# 包含公共库 +include_directories(${CMAKE_SOURCE_DIR}/Status) + +# 生成可执行文件 +add_executable(04.24-04.26 HString.h HString.c 04.24-04.26.c) +# 链接公共库 +target_link_libraries(04.24-04.26 Scanf_lib) \ No newline at end of file diff --git a/CLion/ExerciseBook/04.24-04.26/HString.c b/CLion/ExerciseBook/04.24-04.26/HString.c new file mode 100644 index 0000000..ce68be5 --- /dev/null +++ b/CLion/ExerciseBook/04.24-04.26/HString.c @@ -0,0 +1,381 @@ +/*========================= + * 串的堆分配存储表示(堆串) + * + * 包含算法: 4.4 + ==========================*/ + +#include "HString.h" //**▲04 串**// + +/* + * 初始化 + * + * 构造一个值为chars的串T。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status StrAssign(HString* T, const char* chars) { + int i, j; + + // 求chars的长度 + i = (int) strlen(chars); + + // 没有有效元素 + if(i == 0) { + (*T).ch = NULL; + (*T).length = 0; + + return OK; + } + + // 存在有效元素时,需要分配存储空间 + (*T).ch = (char*) malloc(i * sizeof(char)); + if(!((*T).ch)) { + exit(OVERFLOW); + } + + for(j = 0; j < i; j++) { + (*T).ch[j] = chars[j]; + } + + (*T).length = i; + + return OK; +} + +/* + * 销毁 + * + * 将串S销毁。 + * + *【注】 + * 堆串的结构可以销毁,但不是在销毁操作中 + */ +Status DestroyString(HString* S) { + return OK; +} + +/* + * 清空 + * + * 将串S清空。 + */ +Status ClearString(HString* S) { + // 没有有效元素时,销毁堆串结构 + if((*S).ch != 0) { + free((*S).ch); + (*S).ch = NULL; + } + + (*S).length = 0; + + return OK; +} + +/* + * 判空 + * + * 判断串S中是否包含有效数据。 + * + * 返回值: + * TRUE : 串S为空 + * FALSE: 串S不为空 + */ +Status StrEmpty(HString S) { + return S.length == 0 ? TRUE : FALSE; +} + +/* + * 计数 + * + * 返回串S中元素的个数。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrLength(HString S) { + return S.length; +} + +/* + * 求子串 + * + * 用Sub返回S[pos, pos+len-1]。 + * 返回值指示是否截取成功。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status SubString(HString* Sub, HString S, int pos, int len) { + int i; + + if(pos < 1 || pos > S.length || len < 0 || pos + len - 1 > S.length) { + return ERROR; + } + + // 如果是截取0个字符,不需要分配空间 + if(len == 0) { + (*Sub).ch = NULL; + (*Sub).length = 0; + + return OK; + } + + (*Sub).ch = (char*) malloc(len * sizeof(char)); + if(!(*Sub).ch) { + exit(OVERFLOW); + } + + // 复制元素 + for(i = 0; i < len; i++) { + (*Sub).ch[i] = S.ch[i + pos - 1]; + } + + // 确定新长度 + (*Sub).length = len; + + return OK; +} + +/* + * 查找 + * + * 从pos处开始搜索模式串T在主串S中首次出现的位置,如果不存在,则返回0。 + * 如果查找成功,返回匹配的位置。 + * + *【注】 + * 1.此实现需要依赖串的最小操作子集 + * 2.该实现比较低效 + */ +int Index(HString S, HString T, int pos) { + int i, s, t; + HString sub; + + if(pos < 1 || pos > S.length || StrEmpty(T)) { + return 0; + } + + s = S.length; + t = T.length; + i = pos; + + // 保证长度不越界 + while(i + t - 1 <= s) { + // 获取S[i, i+t-1] + SubString(&sub, S, i, t); + + // 如果子串与模式串不匹配,则需要继续推进 + if(StrCompare(sub, T) != 0) { + ++i; + } else { + return i; + } + } + + return 0; +} + +/* + * ████████ 算法4.4 ████████ + * + * 插入 + * + * 将串T插入到主串S的pos位置处。 + */ +Status StrInsert(HString* S, int pos, HString T) { + int i; + + if(pos < 1 || pos > (*S).length + 1) { + return ERROR; + } + + // 如果待插入的串为空,则提前返回 + if(StrEmpty(T)) { + return OK; + } + + // 分配新空间,会将旧元素一起复制过去 + (*S).ch = (char*) realloc((*S).ch, ((*S).length + T.length) * sizeof(char)); + if(!(*S).ch) { + exit(OVERFLOW); + } + + // 在S中腾出位置,为插入T做准备 + for(i = (*S).length - 1; i >= pos - 1; i--) { + // 从后向前遍历,将前面的元素挪到后面 + (*S).ch[i + T.length] = (*S).ch[i]; + } + + // 将串T插入在S中腾出的位置上 + for(i = pos - 1; i <= pos + T.length - 2; i++) { + (*S).ch[i] = T.ch[i - pos + 1]; + } + + // 长度增加 + (*S).length += T.length; + + return OK; +} + +/* + * 删除 + * + * 删除S[pos, pos+len-1]。 + */ +Status StrDelete(HString* S, int pos, int len) { + int i; + + if(pos < 1 || pos + len - 1 > (*S).length || len < 0) { + return ERROR; + } + + // 如果待删除的长度为0,则提前返回 + if(len == 0) { + return OK; + } + + // 把后面的元素挪到前面,覆盖掉被删除的元素 + for(i = pos + len - 1; i <= (*S).length - 1; i++) { + (*S).ch[i - len] = (*S).ch[i]; + } + + // 长度减少 + (*S).length -= len; + + // 缩减分配的空间(如果长度减少为0,这里会返回空指针) + (*S).ch = (char*) realloc((*S).ch, (*S).length * sizeof(char)); + + return OK; +} + +/* + * 比较 + * + * 比较串S和串T,返回比较结果。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status StrCompare(HString S, HString T) { + int i; + + for(i = 0; i < S.length && i < T.length; i++) { + // 遇到不同的字符时,比较其大小 + if(S.ch[i] != T.ch[i]) { + return S.ch[i] - T.ch[i]; + } + } + + return S.length - T.length; +} + +/* + * 复制 + * + * 将串S复制到串T。 + */ +Status StrCopy(HString* T, HString S) { + int i; + + if(StrEmpty(S)) { + (*T).ch = NULL; + (*T).length = 0; + } else { + // 分配空间 + (*T).ch = (char*) malloc(S.length * sizeof(char)); + if(!(*T).ch) { + exit(OVERFLOW); + } + + // 复制元素 + for(i = 0; i < S.length; i++) { + (*T).ch[i] = S.ch[i]; + } + + // 复制长度信息 + (*T).length = S.length; + } + + return OK; +} + +/* + * 替换 + * + * 用V替换主串S中出现的所有与T相等的且不重叠的子串。 + * + *【注】 + * 1.该操作依赖最小操作子集 + * 2.该实现比较低效 + */ +Status Replace(HString* S, HString T, HString V) { + int i; + + if(StrEmpty(*S) || StrEmpty(T)) { + return ERROR; + } + + // 在主串S中寻找模式串T第一次出现的位置 + i = Index(*S, T, 1); + + // 如果存在匹配的字符串 + while(i != 0) { + StrDelete(S, i, StrLength(T)); // 从S中删除T + StrInsert(S, i, V); // 向S中插入V + + i += StrLength(V); // i切换到下一个位置 + + i = Index(*S, T, i); // 查找下一个匹配的字符串 + } + + return OK; +} + +/* + * 串联接 + * + * 联接S1和S2,并存储到T中返回。如果联接后的长度溢出,则只保留未溢出的部分。 + * 返回值表示联接后的串是否完整。 + * 堆串的空间被认为是无限的,因此这里总是返回TRUE,指示串不会被裁剪。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status Concat(HString* T, HString S1, HString S2) { + int i; + + // 确定新长度 + (*T).length = S1.length + S2.length; + + // 分配空间 + (*T).ch = (char*) malloc((*T).length * sizeof(char)); + if(!(*T).ch) { + exit(OVERFLOW); + } + + // 先把S1的内容拷贝出来 + for(i = 0; i < S1.length; i++) { + (*T).ch[i] = S1.ch[i]; + } + + // 再拷贝S2的内容 + for(i = 0; i < S2.length; i++) { + (*T).ch[S1.length + i] = S2.ch[i]; + } + + return TRUE; +} + +// 输出:打印字符串 +void StrPrint(HString S) { + int i; + + if(S.length == 0) { + return; + } + + for(i = 0; i < S.length; i++) { + printf("%c", S.ch[i]); + } + printf("\n"); +} \ No newline at end of file diff --git a/CLion/ExerciseBook/04.24-04.26/HString.h b/CLion/ExerciseBook/04.24-04.26/HString.h new file mode 100644 index 0000000..98deed4 --- /dev/null +++ b/CLion/ExerciseBook/04.24-04.26/HString.h @@ -0,0 +1,159 @@ +/*========================= + * 串的堆分配存储表示(堆串) + * + * 包含算法: 4.4 + ==========================*/ + +#ifndef HSTRING +#define HSTRING + +#include +#include // 提供malloc、realloc、free、exit原型 +#include // 提供strlen原型 +#include "Status.h" //**▲01 绪论**// + +/* + * 串的堆存储表示 + * + * 注:有效元素从ch的0号单元开始存储 + */ +typedef struct { + char* ch; // 若是非空串,则按串长分配存储区,否则ch为NULL + int length; +} HString; + + +/* + * ████ 提示 ████ + * + * 遵循教材的书写习惯,pos指示字符的位序(不是索引),从1开始计数 + */ + + +/* + * 初始化 + * + * 构造一个值为chars的串T。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status StrAssign(HString* T, const char* chars); + +/* + * 销毁 + * + * 将串S销毁。 + */ +Status DestroyString(HString* S); + +/* + * 清空 + * + * 将串S清空。 + */ +Status ClearString(HString* S); + +/* + * 判空 + * + * 判断串S中是否包含有效数据。 + * + * 返回值: + * TRUE : 串S为空 + * FALSE: 串S不为空 + */ +Status StrEmpty(HString S); + +/* + * 计数 + * + * 返回串S中元素的个数。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrLength(HString S); + +/* + * 求子串 + * + * 用Sub返回S[pos, pos+len-1]。 + * 返回值指示是否截取成功。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status SubString(HString* Sub, HString S, int pos, int len); + +/* + * 查找 + * + * 从pos处开始搜索模式串T在主串S中首次出现的位置,如果不存在,则返回0。 + * 如果查找成功,返回匹配的位置。 + * + *【注】 + * 1.此实现需要依赖串的最小操作子集 + * 2.该实现比较低效 + */ +int Index(HString S, HString T, int pos); + +/* + * ████████ 算法4.4 ████████ + * + * 插入 + * + * 将串T插入到主串S的pos位置处。 + */ +Status StrInsert(HString* S, int pos, HString T); + +/* + * 删除 + * + * 删除S[pos, pos+len-1]。 + */ +Status StrDelete(HString* S, int pos, int len); + +/* + * 比较 + * + * 比较串S和串T,返回比较结果。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status StrCompare(HString S, HString T); + +/* + * 复制 + * + * 将串S复制到串T。 + */ +Status StrCopy(HString* T, HString S); + +/* + * 替换 + * + * 用V替换主串S中出现的所有与T相等的且不重叠的子串。 + * + *【注】 + * 1.该操作依赖最小操作子集 + * 2.该实现比较低效 + */ +Status Replace(HString* S, HString T, HString V); + +/* + * 串联接 + * + * 联接S1和S2,并存储到T中返回。如果联接后的长度溢出,则只保留未溢出的部分。 + * 返回值表示联接后的串是否完整。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status Concat(HString* T, HString S1, HString S2); + +// 输出:打印字符串 +void StrPrint(HString S); + +#endif diff --git a/CLion/ExerciseBook/04.27/04.27.c b/CLion/ExerciseBook/04.27/04.27.c new file mode 100644 index 0000000..b054b80 --- /dev/null +++ b/CLion/ExerciseBook/04.27/04.27.c @@ -0,0 +1,81 @@ +#include +#include "SString.h" //**▲04 串**// + +/* 函数原型 */ +int Algo_4_27(SString S, SString T, int pos); + + +/* + * 查找:Index + * + * 从pos处开始搜索模式串T在主串S中首次出现的位置,如果不存在,则返回0。 + * 如果查找成功,返回匹配的位置。 + * + *【注】 + * 相比与传统的Index函数,其改进之处在于会先比较首个字符与末尾字符, + * 当它们都匹配时,才会继续比较剩下的字符 + */ +int main(int argc, char* argv[]) { + char* s = "aaaaaaaaaaaaaaab"; + char* t = "aaaab"; + SString S, T; + + StrAssign(S, s); + StrAssign(T, t); + printf("S = "); + StrPrint(S); + printf("T = "); + StrPrint(T); + + printf("T在S中首次出现的位置为:"); + printf("%d\n", Algo_4_27(S, T, 1)); + + return 0; +} + + +/* + * 查找:Index + * + * 从pos处开始搜索模式串T在主串S中首次出现的位置,如果不存在,则返回0。 + * 如果查找成功,返回匹配的位置。 + * + *【注】 + * 相比与传统的Index函数,其改进之处在于会先比较首个字符与末尾字符, + * 当它们都匹配时,才会继续比较剩下的字符 + */ +int Algo_4_27(SString S, SString T, int pos) { + int i, j; + + if(pos < 1 || pos > S[0] || T[0] == 0) { + return 0; + } + + i = pos; + j = 1; + + while(i <= S[0] - T[0] + 1) { + // 先尝试比较首个字符与末尾字符 + if(S[i] != T[j] || S[i + T[0] - 1] != T[T[0]]) { + i++; + continue; + } + + // 这里的j不需要等于T[0],因为T[0]这种情形已经验证了 + for(i++,j++; j MAXSTRLEN) { + return ERROR; + } + + T[0] = len; + for(i = 1; i <= len; i++) { + T[i] = chars[i - 1]; + } + + return OK; +} + +/* + * 销毁 + * + * 将串S销毁。 + * + *【注】 + * 顺序串的结构无法销毁 + */ +Status DestroyString(SString S) { + return OK; +} + +/* + * 清空 + * + * 将串S清空。 + */ +Status ClearString(SString S) { + // 只需要将长度置为0就可以 + S[0] = 0; + return OK; +} + +/* + * 判空 + * + * 判断串S中是否包含有效数据。 + * + * 返回值: + * TRUE : 串S为空 + * FALSE: 串S不为空 + */ +Status StrEmpty(SString S) { + return S[0] == 0 ? TRUE : FALSE; +} + +/* + * 计数 + * + * 返回串S中元素的个数。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrLength(SString S) { + return S[0]; +} + +/* + * ████████ 算法4.3 ████████ + * + * 求子串 + * + * 用Sub返回S[pos, pos+len-1]。 + * 返回值指示是否截取成功。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status SubString(SString Sub, SString S, int pos, int len) { + int i; + + if(pos < 1 || pos > S[0] || len < 0 || pos + len - 1 > S[0]) { + return ERROR; + } + + // 复制元素 + for(i = 1; i <= len; i++) { + Sub[i] = S[pos + i - 1]; + } + + // 确定新长度 + Sub[0] = len; + + return OK; +} + +/* + * ████████ 算法4.1 ████████ + * + * 查找 + * + * 从pos处开始搜索模式串T在主串S中首次出现的位置,如果不存在,则返回0。 + * 如果查找成功,返回匹配的位置。 + * + *【注】 + * 1.此实现需要依赖串的最小操作子集 + * 2.该实现比较低效 + */ +int Index_1(SString S, SString T, int pos) { + int i, n, m; // 记录S和T的长度 + SString sub; + + /* + * 失败情形提前处理 + * 这里与教材写法略微不同 + */ + if(pos < 1 || pos > S[0] || StrEmpty(T)) { + return 0; + } + + n = StrLength(S); + m = StrLength(T); + i = pos; + + // 保证长度不越界 + while(i <= n - m + 1) { + // 获取S[i, i+m-1] + SubString(sub, S, i, m); + + // 如果子串与模式串不匹配,则需要继续推进 + if(StrCompare(sub, T) != 0) { + ++i; + } else { + return i; + } + } + + return 0; +} + +/* + * ████████ 算法4.5 ████████ + * + * 查找 + * + * 从pos处开始搜索模式串T在主串S中首次出现的位置,如果不存在,则返回0。 + * 如果查找成功,返回匹配的位置。 + * + *【注】 + * 1.此实现不依赖串的最小操作子集 + * 2.该实现比较低效 + */ +int Index_2(SString S, SString T, int pos) { + int i = pos; + int j = 1; + + if(pos < 1 || pos > S[0] || StrEmpty(T)) { + return 0; + } + + while(i <= S[0] && j <= T[0]) { + // 遇到相同字符,则继续比较后继字符 + if(S[i] == T[j]) { + i++; + j++; + + // 遇到不同的字符,则游标需要回退,重新比较 + } else { + i = i - (j - 1) + 1; // j-1代表徒劳地前进了j-1个元素,在第j个元素上功亏一篑 + j = 1; // 游标j回到串T的第一个位置 + } + } + + // 增加了一个T[0]>0的判断 + if(j > T[0] && T[0] > 0) { // T不为空串 + return i - T[0]; // 匹配成功 + } else { + return 0; + } +} + +/* + * 插入 + * + * 将串T插入到主串S的pos位置处。 + */ +Status StrInsert(SString S, int pos, SString T) { + int i; + + if(pos < 1 || pos > S[0] + 1 || S[0] + T[0] > MAXSTRLEN) { + return ERROR; + } + + // 如果待插入的串为空,则提前返回 + if(StrEmpty(T)) { + return OK; + } + + // 在S中腾出位置,为插入T做准备 + for(i = S[0]; i >= pos; i--) { + // 从后向前遍历,将前面的元素挪到后面 + S[i + T[0]] = S[i]; + } + + // 将串T插入在S中腾出的位置上 + for(i = pos; i <= pos + T[0] - 1; i++) { + S[i] = T[i - pos + 1]; + } + + // 长度增加 + S[0] += T[0]; + + return OK; +} + +/* + * 删除 + * + * 删除S[pos, pos+len-1]。 + */ +Status StrDelete(SString S, int pos, int len) { + int i; + + if(pos < 1 || pos + len - 1 > S[0] || len < 0) { + return ERROR; + } + + // 如果待删除的长度为0,则提前返回 + if(len == 0) { + return OK; + } + + // 把后面的元素挪到前面,覆盖掉被删除的元素 + for(i = pos + len; i <= S[0]; i++) { + S[i - len] = S[i]; + } + + // 长度减少 + S[0] -= len; + + return OK; +} + +/* + * 比较 + * + * 比较串S和串T,返回比较结果。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrCompare(SString S, SString T) { + int i = 1; + + while(i <= S[0] && i <= T[0]) { + // 遇到不同的字符时,比较其大小 + if(S[i] != T[i]) { + return S[i] - T[i]; + } + + i++; + } + + return S[0] - T[0]; +} + +/* + * 复制 + * + * 将串S复制到串T。 + */ +Status StrCopy(SString T, SString S) { + int i; + + // 连同长度信息一起复制 + for(i = 0; i <= S[0]; i++) { + T[i] = S[i]; + } + + return OK; +} + +/* + * 替换 + * + * 用V替换主串S中出现的所有与T相等的且不重叠的子串。 + * + *【注】 + * 1.该操作依赖最小操作子集 + * 2.该实现比较低效 + */ +Status Replace(SString S, SString T, SString V) { + int i; + + if(StrEmpty(S) || StrEmpty(T)) { + return ERROR; + } + + // 在主串S中寻找模式串T第一次出现的位置 + i = Index_2(S, T, 1); + + // 如果存在匹配的字符串,且可以被完全替换(替换后不溢出) + while(i != 0 && S[0] - T[0] + V[0] <= MAXSTRLEN) { + StrDelete(S, i, StrLength(T)); // 从S中删除T + StrInsert(S, i, V); // 向S中插入V + + i += StrLength(V); // i切换到下一个位置 + + i = Index_2(S, T, i); // 查找下一个匹配的字符串 + } + + if(i == 0) { // S中的T已全部被替换 + return OK; + } else { // S中尚有T,但是V已经插不进去了 + return ERROR; + } +} + +/* + * ████████ 算法4.2 ████████ + * + * 串联接 + * + * 联接S1和S2,并存储到T中返回。如果联接后的长度溢出,则只保留未溢出的部分。 + * 返回值表示联接后的串是否完整。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status Concat(SString T, SString S1, SString S2) { + int i; + int uncut; // 新串是否完整 + + // 完全不需要裁剪 + if(S1[0] + S2[0] <= MAXSTRLEN) { + // 复制S1到T中 + for(i = 1; i <= S1[0]; i++) { + T[i] = S1[i]; + } + + // 复制S2到T中 + for(i = S1[0] + 1; i <= S1[0] + S2[0]; i++) { + T[i] = S2[i - S1[0]]; + } + + // 设置新长度 + T[0] = S1[0] + S2[0]; + + // 未裁剪,完整 + uncut = TRUE; + + // 需要裁剪S2 + } else if(S1[0] <= MAXSTRLEN) { + // 复制S1到T中 + for(i = 1; i <= S1[0]; i++) { + T[i] = S1[i]; + } + + // 将S2的一部分复制到T中 + for(i = S1[0] + 1; i <= MAXSTRLEN; i++) { + T[i] = S2[i - S1[0]]; + } + + // 设置新长度 + T[0] = MAXSTRLEN; + + uncut = FALSE; + + // 只需要复制S1的一部分 + } else { + // 连同长度信息一起复制 + for(i = 0; i <= MAXSTRLEN; i++) { + T[i] = S1[i]; + } + + uncut = FALSE; + } + + return uncut; +} + +// 输出:打印字符串 +void StrPrint(SString S) { + int i; + + for(i = 1; i<=S[0] ; i++) { + printf("%c", S[i]); + } + + printf("\n"); +} diff --git a/CLion/ExerciseBook/04.27/SString.h b/CLion/ExerciseBook/04.27/SString.h new file mode 100644 index 0000000..d164913 --- /dev/null +++ b/CLion/ExerciseBook/04.27/SString.h @@ -0,0 +1,179 @@ +/*============================= + * 串的定长顺序存储表示(顺序串) + * + * 包含算法: 4.1、4.2、4.3、4.5 + ==============================*/ + +#ifndef SSTRING_H +#define SSTRING_H + +#include +#include // 提供strlen原型 +#include "Status.h" //**▲01 绪论**// + +/* 宏定义 */ +#define MAXSTRLEN 255 // 顺序串的最大串长 + +/* + * 串的顺序存储类型定义 + * + * 注:有效元素从SString的1号单元开始存储 + * SString的0号单元用来存储其长度 + */ +typedef unsigned char SString[MAXSTRLEN + 1]; // 0号单元存放串的长度 + + +/* + * ████ 提示 ████ + * + * 遵循教材的书写习惯,pos指示字符的位序(不是索引),从1开始计数 + */ + + +/* + * 初始化 + * + * 构造一个值为chars的串T。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status StrAssign(SString T, const char* chars); + +/* + * 销毁 + * + * 将串S销毁。 + * + *【注】 + * 顺序串的结构无法销毁 + */ +Status DestroyString(SString S); + +/* + * 清空 + * + * 将串S清空。 + */ +Status ClearString(SString S); + +/* + * 判空 + * + * 判断串S中是否包含有效数据。 + * + * 返回值: + * TRUE : 串S为空 + * FALSE: 串S不为空 + */ +Status StrEmpty(SString S); + +/* + * 计数 + * + * 返回串S中元素的个数。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrLength(SString S); + +/* + * ████████ 算法4.3 ████████ + * + * 求子串 + * + * 用Sub返回S[pos, pos+len-1]。 + * 返回值指示是否截取成功。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status SubString(SString Sub, SString S, int pos, int len); + +/* + * ████████ 算法4.1 ████████ + * + * 查找 + * + * 从pos处开始搜索模式串T在主串S中首次出现的位置,如果不存在,则返回0。 + * 如果查找成功,返回匹配的位置。 + * + *【注】 + * 1.此实现需要依赖串的最小操作子集 + * 2.该实现比较低效 + */ +int Index_1(SString S, SString T, int pos); + +/* + * ████████ 算法4.5 ████████ + * + * 查找 + * + * 从pos处开始搜索模式串T在主串S中首次出现的位置,如果不存在,则返回0。 + * 如果查找成功,返回匹配的位置。 + * + *【注】 + * 1.此实现不依赖串的最小操作子集 + * 2.该实现比较低效 + */ +int Index_2(SString S, SString T, int pos); + +/* + * 插入 + * + * 将串T插入到主串S的pos位置处。 + */ +Status StrInsert(SString S, int pos, SString T); + +/* + * 删除 + * + * 删除S[pos, pos+len-1]。 + */ +Status StrDelete(SString S, int pos, int len); + +/* + * 比较 + * + * 比较串S和串T,返回比较结果。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrCompare(SString S, SString T); + +/* + * 复制 + * + * 将串S复制到串T。 + */ +Status StrCopy(SString T, SString S); + +/* + * 替换 + * + * 用V替换主串S中出现的所有与T相等的且不重叠的子串。 + * + *【注】 + * 该操作依赖最小操作子集,效率较低。 + */ +Status Replace(SString S, SString T, SString V); + +/* + * ████████ 算法4.2 ████████ + * + * 串联接 + * + * 联接S1和S2,并存储到T中返回。如果联接后的长度溢出,则只保留未溢出的部分。 + * 返回值表示联接后的串是否完整。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status Concat(SString T, SString S1, SString S2); + +// 输出:打印字符串 +void StrPrint(SString S); + +#endif diff --git a/CLion/ExerciseBook/04.28-04.29/04.28-04.29.c b/CLion/ExerciseBook/04.28-04.29/04.28-04.29.c new file mode 100644 index 0000000..62bdcc7 --- /dev/null +++ b/CLion/ExerciseBook/04.28-04.29/04.28-04.29.c @@ -0,0 +1,211 @@ +#include +#include +#include +#include "Status.h" //**▲01 绪论**// + +/* + * 单链表元素类型定义 + * + *【注】 + * 这里的链表虽然用作字符串,但是元素类型仍然用int,原因是: + * 1.需要借用头结点存储结点的数量,所以用int比直接用char合适 + * 2.char可以与int兼容,所以结点虽然是int,但也可以用来存储char + */ +typedef int ElemType; + +/* 字符串结点 */ +typedef struct SNode { + ElemType chdata; // 数据结点 + struct SNode* succ; // 指向后继结点 + struct SNode* next; // next在主串中,指向前驱结点,在模式串中,指向该结点处失配时应当参与比较的下一个结点 +} SNode; + +// 字符串 +typedef SNode* String; + + +// 初始化 +Status StrAssign_4_28(String* S, char* chars); + +// 求串长 +int StrLength_4_28(String S); + +// 字符串输出 +void StrPrint_4_28(String S); + +/* + * 计算模式串的next值(改进后的算法) + * + * 功能相当于KMP算法那章的get_nextval函数 + */ +Status Algo_4_28(String T); + +/* + * KMP算法 + * + * 功能相当于KMP算法那章的Index_KMP函数 + */ +int Algo_4_29(String S, String T, int pos); + + +int main(int argc, char* argv[]) { + char* s = "abaaabaababaabcaabaabcacabaabcaabaabcac"; + char* t = "abaabcac"; + String S, T; + int pos, i; + + StrAssign_4_28(&S, s); //主串 + StrAssign_4_28(&T, t); //模式串 + + printf("主 串:S = "); + StrPrint_4_28(S); + printf("模式串:T = "); + StrPrint_4_28(T); + + printf("███题 4.28 验证...███\n"); + Algo_4_28(T); + printf("创建next表...\n"); + + printf("███题 4.29 验证...███\n"); + pos = 18; + i = Algo_4_29(S, T, pos); + printf("模式串 T 从主串 S 的第 %d 个字符起第一次匹配成功的位置为 %d\n", pos, i); + + return 0; +} + + +// 初始化 +Status StrAssign_4_28(String* S, char* chars) { + int i, len; + String p; + + if(S == NULL || chars == NULL) { + return ERROR; + } + + len = (int) strlen(chars); + + // 创建头结点 + *S = (String) malloc(sizeof(SNode)); + (*S)->chdata = len; // 记录串的长度 + (*S)->next = NULL; // 头结点的前驱 + + p = *S; + + for(i = 0; i < len; i++) { + p->succ = (String) malloc(sizeof(SNode)); + p->succ->chdata = chars[i]; + p->succ->next = p; // next默认指向前一个结点 + p = p->succ; + } + + // 最后一个结点的后继为NULL + p->succ = NULL; + + return OK; +} + +// 求串长 +int StrLength_4_28(String S) { + return S == NULL ? 0 : S->chdata; +} + +// 字符串输出 +void StrPrint_4_28(String S) { + String p; + + if(S == NULL) { + printf("\n"); + return; + } + + for(p = S->succ; p != NULL; p = p->succ) { + printf("%c", p->chdata); + } + + printf("\n"); +} + +/* + * 计算模式串的next值(改进后的算法) + * + * 功能相当于KMP算法那章的get_nextval函数 + */ +Status Algo_4_28(String T) { + SNode* i, * j; + + if(StrLength_4_28(T) == 0) { + return ERROR; + } + + i = T->succ; // 相当于之前的i=1 + j = T; // 相当于之前的j=0 + + // 模式串第一个字符处失配时,模式串需要从头比较,主串需要前进到下一个位置比较 + i->next = T; + + // 遍历模式串上的字符 + while(i->succ != NULL) { + if(j == T || i->chdata == j->chdata) { + i = i->succ; + j = j->succ; + + if(i->chdata != j->chdata) { + i->next = j; + } else { + i->next = j->next; + } + } else { + j = j->next; + } + } + + return OK; +} + +/* + * KMP算法 + * + * 功能相当于KMP算法那章的Index_KMP函数 + */ +int Algo_4_29(String S, String T, int pos) { + int count; // 记录i的位置 + SNode* i, * j; // i遍历S,j遍历T + + if(pos < 1 || StrLength_4_28(S) == 0 || StrLength_4_28(T) == 0) { + return 0; + } + + for(count = 1, i = S->succ; count < pos; count++, i = i->succ) { + // 用i指向第pos个结点 + } + + j = T->succ; + + // 比较字符串 + while(i != NULL && j != NULL) { + /* + * 两种情形: + * 1.在模式串的第一个字符处就失配 + * 2.主串和模式串处的字符相等 + */ + if(j == T || i->chdata == j->chdata) { + i = i->succ; + j = j->succ; + + count++; // 记录i的位置 + } else { + // 失配时回到前一个适当的位置 + j = j->next; + } + } + + // 匹配成功,返回匹配位置 + if(j == NULL) { + return count-StrLength_4_28(T); + } else { + // 匹配失败 + return 0; + } +} diff --git a/CLion/ExerciseBook/04.28-04.29/CMakeLists.txt b/CLion/ExerciseBook/04.28-04.29/CMakeLists.txt new file mode 100644 index 0000000..bacd1d9 --- /dev/null +++ b/CLion/ExerciseBook/04.28-04.29/CMakeLists.txt @@ -0,0 +1,7 @@ +# 包含公共库 +include_directories(${CMAKE_SOURCE_DIR}/Status) + +# 生成可执行文件 +add_executable(04.28-04.29 04.28-04.29.c) +# 链接公共库 +target_link_libraries(04.28-04.29 Scanf_lib) \ No newline at end of file diff --git a/CLion/ExerciseBook/04.30/04.30.c b/CLion/ExerciseBook/04.30/04.30.c new file mode 100644 index 0000000..013c5b4 --- /dev/null +++ b/CLion/ExerciseBook/04.30/04.30.c @@ -0,0 +1,116 @@ +#include +#include "SString.h" //**▲04 串**// + +/* + * 在串S中查找首次出现的最长重复子串及其位置 + * Sub用来记录重复子串 + * pos用来记录其在S中出现的位置 + * + * 此处的最长重复子串有以下含义: + * 1.子串必须连续 + * 2.此子串在所有重复子串中是首个出现且最长的; + * 3.子串间可以重叠,比如求取abcabca的结果为abca; + * 4.子串内可以重复,如求取aaaa的结果为aaa。 + */ +Status Algo_4_30(SString S, SString Sub, int* pos); + + +int main(int argc, char* argv[]) { + char* s = "abcdeabcabcbcdefbcdefefghefgh"; + SString Sub, S; + int pos; + + StrAssign(S, s); + printf("主串...\n"); + printf("S = "); + StrPrint(S); + + printf("计算首个最长不重复子串...\n"); + printf("Sub = "); + Algo_4_30(S, Sub, &pos); + StrPrint(Sub); + printf("Sub 在 S 中首次出现的位置为 %d\n", pos); + + return 0; +} + + +/* + * 在串S中查找首次出现的最长重复子串及其位置 + * Sub用来记录重复子串 + * pos用来记录其在S中出现的位置 + * + * 此处的最长重复子串有以下含义: + * 1.子串必须连续 + * 2.此子串在所有重复子串中是首个出现且最长的; + * 3.子串间可以重叠,比如求取abcabca的结果为abca; + * 4.子串内可以重复,如求取aaaa的结果为aaa。 + */ +Status Algo_4_30(SString S, SString Sub, int* pos) { + int i, j, is, js; + int k, start; + int len, maxLen; + + // 主串长度不能少于2 + if(S[0] < 2) { + return ERROR; + } + + start = 0; + maxLen = 0; + + // 遍历主串上所有可能的起点 + for(k = 1; k < S[0]; k++) { + is = k; // 主串起点 + js = k + 1; // 子串起点 + + // 如果剩余的字符数量不比已知的最长重复字符串更长,则无需再遍历下去 + if(S[0] - js + 1 <= maxLen) { + break; + } + + // 查找与is为起点的串重复的串 + while(TRUE) { + // 寻找潜在的重复子串起点 + while(js <= S[0] && S[is] != S[js]) { + js++; + } + + // 说明主串起点处的字符串唯一 + if(js > S[0]) { + break; + } + + // 如果剩余的字符数量不比已知的最长重复字符串更长,则无需再遍历下去 + if(S[0] - js + 1 <= maxLen) { + break; + } + + len = 0; + i = is; + j = js; + + // 计算重复串的长度 + while(j <= S[0] && S[i] == S[j]) { + i++; + j++; + len++; + } + + if(len > maxLen) { + start = k; + maxLen = len; + } + + // 查看后面有没有更长的重复串 + if(j < S[0]) { + js++; + } + } + } + + *pos = start; + SubString(Sub, S, start, maxLen); + + return OK; +} diff --git a/CLion/ExerciseBook/04.30/CMakeLists.txt b/CLion/ExerciseBook/04.30/CMakeLists.txt new file mode 100644 index 0000000..c8daaf7 --- /dev/null +++ b/CLion/ExerciseBook/04.30/CMakeLists.txt @@ -0,0 +1,7 @@ +# 包含公共库 +include_directories(${CMAKE_SOURCE_DIR}/Status) + +# 生成可执行文件 +add_executable(04.30 SString.h SString.c 04.30.c) +# 链接公共库 +target_link_libraries(04.30 Scanf_lib) \ No newline at end of file diff --git a/CLion/ExerciseBook/04.30/SString.c b/CLion/ExerciseBook/04.30/SString.c new file mode 100644 index 0000000..8673b3b --- /dev/null +++ b/CLion/ExerciseBook/04.30/SString.c @@ -0,0 +1,406 @@ +/*============================= + * 串的定长顺序存储表示(顺序串) + * + * 包含算法: 4.1、4.2、4.3、4.5 + ==============================*/ + +#include "SString.h" //**▲04 串**// + +/* + * 初始化 + * + * 构造一个值为chars的串T。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status StrAssign(SString T, const char* chars) { + int i, len; + + len = (int) strlen(chars); + + // chars过长 + if(len > MAXSTRLEN) { + return ERROR; + } + + T[0] = len; + for(i = 1; i <= len; i++) { + T[i] = chars[i - 1]; + } + + return OK; +} + +/* + * 销毁 + * + * 将串S销毁。 + * + *【注】 + * 顺序串的结构无法销毁 + */ +Status DestroyString(SString S) { + return OK; +} + +/* + * 清空 + * + * 将串S清空。 + */ +Status ClearString(SString S) { + // 只需要将长度置为0就可以 + S[0] = 0; + return OK; +} + +/* + * 判空 + * + * 判断串S中是否包含有效数据。 + * + * 返回值: + * TRUE : 串S为空 + * FALSE: 串S不为空 + */ +Status StrEmpty(SString S) { + return S[0] == 0 ? TRUE : FALSE; +} + +/* + * 计数 + * + * 返回串S中元素的个数。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrLength(SString S) { + return S[0]; +} + +/* + * ████████ 算法4.3 ████████ + * + * 求子串 + * + * 用Sub返回S[pos, pos+len-1]。 + * 返回值指示是否截取成功。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status SubString(SString Sub, SString S, int pos, int len) { + int i; + + if(pos < 1 || pos > S[0] || len < 0 || pos + len - 1 > S[0]) { + return ERROR; + } + + // 复制元素 + for(i = 1; i <= len; i++) { + Sub[i] = S[pos + i - 1]; + } + + // 确定新长度 + Sub[0] = len; + + return OK; +} + +/* + * ████████ 算法4.1 ████████ + * + * 查找 + * + * 从pos处开始搜索模式串T在主串S中首次出现的位置,如果不存在,则返回0。 + * 如果查找成功,返回匹配的位置。 + * + *【注】 + * 1.此实现需要依赖串的最小操作子集 + * 2.该实现比较低效 + */ +int Index_1(SString S, SString T, int pos) { + int i, n, m; // 记录S和T的长度 + SString sub; + + /* + * 失败情形提前处理 + * 这里与教材写法略微不同 + */ + if(pos < 1 || pos > S[0] || StrEmpty(T)) { + return 0; + } + + n = StrLength(S); + m = StrLength(T); + i = pos; + + // 保证长度不越界 + while(i <= n - m + 1) { + // 获取S[i, i+m-1] + SubString(sub, S, i, m); + + // 如果子串与模式串不匹配,则需要继续推进 + if(StrCompare(sub, T) != 0) { + ++i; + } else { + return i; + } + } + + return 0; +} + +/* + * ████████ 算法4.5 ████████ + * + * 查找 + * + * 从pos处开始搜索模式串T在主串S中首次出现的位置,如果不存在,则返回0。 + * 如果查找成功,返回匹配的位置。 + * + *【注】 + * 1.此实现不依赖串的最小操作子集 + * 2.该实现比较低效 + */ +int Index_2(SString S, SString T, int pos) { + int i = pos; + int j = 1; + + if(pos < 1 || pos > S[0] || StrEmpty(T)) { + return 0; + } + + while(i <= S[0] && j <= T[0]) { + // 遇到相同字符,则继续比较后继字符 + if(S[i] == T[j]) { + i++; + j++; + + // 遇到不同的字符,则游标需要回退,重新比较 + } else { + i = i - (j - 1) + 1; // j-1代表徒劳地前进了j-1个元素,在第j个元素上功亏一篑 + j = 1; // 游标j回到串T的第一个位置 + } + } + + // 增加了一个T[0]>0的判断 + if(j > T[0] && T[0] > 0) { // T不为空串 + return i - T[0]; // 匹配成功 + } else { + return 0; + } +} + +/* + * 插入 + * + * 将串T插入到主串S的pos位置处。 + */ +Status StrInsert(SString S, int pos, SString T) { + int i; + + if(pos < 1 || pos > S[0] + 1 || S[0] + T[0] > MAXSTRLEN) { + return ERROR; + } + + // 如果待插入的串为空,则提前返回 + if(StrEmpty(T)) { + return OK; + } + + // 在S中腾出位置,为插入T做准备 + for(i = S[0]; i >= pos; i--) { + // 从后向前遍历,将前面的元素挪到后面 + S[i + T[0]] = S[i]; + } + + // 将串T插入在S中腾出的位置上 + for(i = pos; i <= pos + T[0] - 1; i++) { + S[i] = T[i - pos + 1]; + } + + // 长度增加 + S[0] += T[0]; + + return OK; +} + +/* + * 删除 + * + * 删除S[pos, pos+len-1]。 + */ +Status StrDelete(SString S, int pos, int len) { + int i; + + if(pos < 1 || pos + len - 1 > S[0] || len < 0) { + return ERROR; + } + + // 如果待删除的长度为0,则提前返回 + if(len == 0) { + return OK; + } + + // 把后面的元素挪到前面,覆盖掉被删除的元素 + for(i = pos + len; i <= S[0]; i++) { + S[i - len] = S[i]; + } + + // 长度减少 + S[0] -= len; + + return OK; +} + +/* + * 比较 + * + * 比较串S和串T,返回比较结果。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrCompare(SString S, SString T) { + int i = 1; + + while(i <= S[0] && i <= T[0]) { + // 遇到不同的字符时,比较其大小 + if(S[i] != T[i]) { + return S[i] - T[i]; + } + + i++; + } + + return S[0] - T[0]; +} + +/* + * 复制 + * + * 将串S复制到串T。 + */ +Status StrCopy(SString T, SString S) { + int i; + + // 连同长度信息一起复制 + for(i = 0; i <= S[0]; i++) { + T[i] = S[i]; + } + + return OK; +} + +/* + * 替换 + * + * 用V替换主串S中出现的所有与T相等的且不重叠的子串。 + * + *【注】 + * 1.该操作依赖最小操作子集 + * 2.该实现比较低效 + */ +Status Replace(SString S, SString T, SString V) { + int i; + + if(StrEmpty(S) || StrEmpty(T)) { + return ERROR; + } + + // 在主串S中寻找模式串T第一次出现的位置 + i = Index_2(S, T, 1); + + // 如果存在匹配的字符串,且可以被完全替换(替换后不溢出) + while(i != 0 && S[0] - T[0] + V[0] <= MAXSTRLEN) { + StrDelete(S, i, StrLength(T)); // 从S中删除T + StrInsert(S, i, V); // 向S中插入V + + i += StrLength(V); // i切换到下一个位置 + + i = Index_2(S, T, i); // 查找下一个匹配的字符串 + } + + if(i == 0) { // S中的T已全部被替换 + return OK; + } else { // S中尚有T,但是V已经插不进去了 + return ERROR; + } +} + +/* + * ████████ 算法4.2 ████████ + * + * 串联接 + * + * 联接S1和S2,并存储到T中返回。如果联接后的长度溢出,则只保留未溢出的部分。 + * 返回值表示联接后的串是否完整。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status Concat(SString T, SString S1, SString S2) { + int i; + int uncut; // 新串是否完整 + + // 完全不需要裁剪 + if(S1[0] + S2[0] <= MAXSTRLEN) { + // 复制S1到T中 + for(i = 1; i <= S1[0]; i++) { + T[i] = S1[i]; + } + + // 复制S2到T中 + for(i = S1[0] + 1; i <= S1[0] + S2[0]; i++) { + T[i] = S2[i - S1[0]]; + } + + // 设置新长度 + T[0] = S1[0] + S2[0]; + + // 未裁剪,完整 + uncut = TRUE; + + // 需要裁剪S2 + } else if(S1[0] <= MAXSTRLEN) { + // 复制S1到T中 + for(i = 1; i <= S1[0]; i++) { + T[i] = S1[i]; + } + + // 将S2的一部分复制到T中 + for(i = S1[0] + 1; i <= MAXSTRLEN; i++) { + T[i] = S2[i - S1[0]]; + } + + // 设置新长度 + T[0] = MAXSTRLEN; + + uncut = FALSE; + + // 只需要复制S1的一部分 + } else { + // 连同长度信息一起复制 + for(i = 0; i <= MAXSTRLEN; i++) { + T[i] = S1[i]; + } + + uncut = FALSE; + } + + return uncut; +} + +// 输出:打印字符串 +void StrPrint(SString S) { + int i; + + for(i = 1; i<=S[0] ; i++) { + printf("%c", S[i]); + } + + printf("\n"); +} diff --git a/CLion/ExerciseBook/04.30/SString.h b/CLion/ExerciseBook/04.30/SString.h new file mode 100644 index 0000000..d164913 --- /dev/null +++ b/CLion/ExerciseBook/04.30/SString.h @@ -0,0 +1,179 @@ +/*============================= + * 串的定长顺序存储表示(顺序串) + * + * 包含算法: 4.1、4.2、4.3、4.5 + ==============================*/ + +#ifndef SSTRING_H +#define SSTRING_H + +#include +#include // 提供strlen原型 +#include "Status.h" //**▲01 绪论**// + +/* 宏定义 */ +#define MAXSTRLEN 255 // 顺序串的最大串长 + +/* + * 串的顺序存储类型定义 + * + * 注:有效元素从SString的1号单元开始存储 + * SString的0号单元用来存储其长度 + */ +typedef unsigned char SString[MAXSTRLEN + 1]; // 0号单元存放串的长度 + + +/* + * ████ 提示 ████ + * + * 遵循教材的书写习惯,pos指示字符的位序(不是索引),从1开始计数 + */ + + +/* + * 初始化 + * + * 构造一个值为chars的串T。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status StrAssign(SString T, const char* chars); + +/* + * 销毁 + * + * 将串S销毁。 + * + *【注】 + * 顺序串的结构无法销毁 + */ +Status DestroyString(SString S); + +/* + * 清空 + * + * 将串S清空。 + */ +Status ClearString(SString S); + +/* + * 判空 + * + * 判断串S中是否包含有效数据。 + * + * 返回值: + * TRUE : 串S为空 + * FALSE: 串S不为空 + */ +Status StrEmpty(SString S); + +/* + * 计数 + * + * 返回串S中元素的个数。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrLength(SString S); + +/* + * ████████ 算法4.3 ████████ + * + * 求子串 + * + * 用Sub返回S[pos, pos+len-1]。 + * 返回值指示是否截取成功。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status SubString(SString Sub, SString S, int pos, int len); + +/* + * ████████ 算法4.1 ████████ + * + * 查找 + * + * 从pos处开始搜索模式串T在主串S中首次出现的位置,如果不存在,则返回0。 + * 如果查找成功,返回匹配的位置。 + * + *【注】 + * 1.此实现需要依赖串的最小操作子集 + * 2.该实现比较低效 + */ +int Index_1(SString S, SString T, int pos); + +/* + * ████████ 算法4.5 ████████ + * + * 查找 + * + * 从pos处开始搜索模式串T在主串S中首次出现的位置,如果不存在,则返回0。 + * 如果查找成功,返回匹配的位置。 + * + *【注】 + * 1.此实现不依赖串的最小操作子集 + * 2.该实现比较低效 + */ +int Index_2(SString S, SString T, int pos); + +/* + * 插入 + * + * 将串T插入到主串S的pos位置处。 + */ +Status StrInsert(SString S, int pos, SString T); + +/* + * 删除 + * + * 删除S[pos, pos+len-1]。 + */ +Status StrDelete(SString S, int pos, int len); + +/* + * 比较 + * + * 比较串S和串T,返回比较结果。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrCompare(SString S, SString T); + +/* + * 复制 + * + * 将串S复制到串T。 + */ +Status StrCopy(SString T, SString S); + +/* + * 替换 + * + * 用V替换主串S中出现的所有与T相等的且不重叠的子串。 + * + *【注】 + * 该操作依赖最小操作子集,效率较低。 + */ +Status Replace(SString S, SString T, SString V); + +/* + * ████████ 算法4.2 ████████ + * + * 串联接 + * + * 联接S1和S2,并存储到T中返回。如果联接后的长度溢出,则只保留未溢出的部分。 + * 返回值表示联接后的串是否完整。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status Concat(SString T, SString S1, SString S2); + +// 输出:打印字符串 +void StrPrint(SString S); + +#endif diff --git a/CLion/ExerciseBook/04.31/04.31.c b/CLion/ExerciseBook/04.31/04.31.c new file mode 100644 index 0000000..2edc497 --- /dev/null +++ b/CLion/ExerciseBook/04.31/04.31.c @@ -0,0 +1,248 @@ +#include +#include +#include "Status.h" //**▲01 绪论**// +#include "SString.h" //**▲04 串**// + +/* + * ████ 提示 ████ + * + * 本问题是一个动态规划问题,详细思路参见《算法导论》第三版第15.4节。 + * + * 注:《算法导论》中的"最长公共子序列"问题会统计不连续的子串,但是本题只会统计连续的子串。 + */ + + +/* 最长公共子串密码表 */ +typedef struct { + char dir; + int len; +} LCS; + +/* 子串坐标 */ +typedef struct { + int s; // 该子串在串S中的位置 + int t; // 该子串在串T中的位置 +} Pos; + +/* 最长公共子串集合 */ +typedef struct { + int maxlen; // 最长公共子串的长度 + Pos* pos; // 所有最长公共子串的坐标 + int count; // 最长公共子串的数量 +} Strs; + + +/* + * 计算S和T中的最长公共子串。 + * + * 其中,坐标最靠左的被称为"第一个出现的最长公共子串"。 + */ +Status Algo_4_31(SString S, SString T); + +/* + * 获取最长公共子串的坐标信息 + */ +void LocationPos(SString S, SString T, Strs* strs); + +/* + * 建立最长公共子串密码表,并获取最长公共子串的长度。 + */ +Status BuildLCS(SString S, SString T, LCS*** lcs, int* maxLen); + +/* + * 打印最长公共子串密码表(可选操作)。 + */ +void PrintLCS(SString S, SString T, LCS** lcs); + + +int main(int argc, char* argv[]) { + char* s = "csajcu123456ewjfskhsdufasawx"; + char* t = "m123456vsadksjewjfshcdsdufassgcx"; + SString S, T; + + StrAssign(S, s); + StrAssign(T, t); + + Algo_4_31(S, T); + + return 0; +} + + +/* + * 计算S和T中的最长公共子串。 + * + * 其中,坐标最靠左的被称为"第一个出现的最长公共子串"。 + */ +Status Algo_4_31(SString S, SString T) { + Strs strs; + SString sub; + int i; + + LocationPos(S, T, &strs); + + printf("最长公共子串的长度为:%d \n", strs.maxlen); + printf("输出所有最长公共子串及其坐标:\n"); + for(i=0; i=size) { + size += 10; + (*strs).pos = (Pos*) realloc((*strs).pos, size * sizeof(Pos)); + } + + (*strs).pos[(*strs).count].s = i-maxLen+1; + (*strs).pos[(*strs).count].t = j-maxLen+1; + (*strs).count++; + } + } +} + +/* + * 建立最长公共子串密码表,并获取最长公共子串的长度。 + */ +Status BuildLCS(SString S, SString T, LCS*** lcs, int* maxLen) { + int sLen, tLen; + int i, j; + int max; + LCS node; + + sLen = StrLength(S); + tLen = StrLength(T); + + if(sLen == 0 || tLen == 0) { + return ERROR; + } + + // 初始化LCS表格 + *lcs = (LCS**) malloc((sLen + 1) * sizeof(LCS*)); + for(i = 0; i <= sLen; i++) { + (*lcs)[i] = (LCS*) malloc((tLen + 1) * sizeof(LCS)); + } + + for(i = 0; i <= sLen; i++) { + (*lcs)[i][0].dir = ' '; + (*lcs)[i][0].len = 0; + } + + for(j = 0; j <= tLen; j++) { + (*lcs)[0][j].dir = ' '; + (*lcs)[0][j].len = 0; + } + + max = 0; + + for(i = 1; i <= sLen; i++) { + for(j = 1; j <= tLen; j++) { + // 此种情形与《算法导论》中的解析略微不同,此处需要统计连续的子串 + if(S[i] == T[j]) { + // 如果前一个字符也相等,说明这是个连续的公共子串 + if(i > 1 && j > 1 && S[i - 1] == T[j - 1]) { + node.dir = '\\'; + node.len = (*lcs)[i - 1][j - 1].len + 1; + + // 断开了 + } else { + node.dir = ' '; + node.len = 1; + } + + if(node.len > max) { + max = node.len; + } + } else { + if((*lcs)[i - 1][j].len >= (*lcs)[i][j - 1].dir) { + node.dir = '^'; + node.len = (*lcs)[i - 1][j].len; + } else { + node.dir = '<'; + node.len = (*lcs)[i][j - 1].len; + } + } + + (*lcs)[i][j] = node; + } + } + + *maxLen = max; + + return ERROR; +} + +/* + * 打印最长公共子串密码表(可选操作)。 + */ +void PrintLCS(SString S, SString T, LCS** lcs) { + int sLen, tLen; + int i, j; + + sLen = StrLength(S); + tLen = StrLength(T); + + if(sLen == 0 || tLen == 0) { + return; + } + + // 第一行 + printf(" "); + for(j = 1; j <= tLen; j++) { + printf(" %c ", T[j]); + } + printf("\n"); + + // 第二行 + printf(" "); + for(j = 1; j <= tLen; j++) { + printf("--- "); + } + printf("\n"); + + for(i = 1; i <= sLen; i++) { + for(j = 1; j <= tLen; j++) { + // 每一行的开始 + if(j == 1) { + printf("%c |", S[i]); + } + + printf("%c%2d ", lcs[i][j].dir, lcs[i][j].len); + } + printf("\n"); + } + + printf("\n"); +} diff --git a/CLion/ExerciseBook/04.31/CMakeLists.txt b/CLion/ExerciseBook/04.31/CMakeLists.txt new file mode 100644 index 0000000..204b130 --- /dev/null +++ b/CLion/ExerciseBook/04.31/CMakeLists.txt @@ -0,0 +1,7 @@ +# 包含公共库 +include_directories(${CMAKE_SOURCE_DIR}/Status) + +# 生成可执行文件 +add_executable(04.31 SString.h SString.c 04.31.c) +# 链接公共库 +target_link_libraries(04.31 Scanf_lib) \ No newline at end of file diff --git a/CLion/ExerciseBook/04.31/SString.c b/CLion/ExerciseBook/04.31/SString.c new file mode 100644 index 0000000..8673b3b --- /dev/null +++ b/CLion/ExerciseBook/04.31/SString.c @@ -0,0 +1,406 @@ +/*============================= + * 串的定长顺序存储表示(顺序串) + * + * 包含算法: 4.1、4.2、4.3、4.5 + ==============================*/ + +#include "SString.h" //**▲04 串**// + +/* + * 初始化 + * + * 构造一个值为chars的串T。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status StrAssign(SString T, const char* chars) { + int i, len; + + len = (int) strlen(chars); + + // chars过长 + if(len > MAXSTRLEN) { + return ERROR; + } + + T[0] = len; + for(i = 1; i <= len; i++) { + T[i] = chars[i - 1]; + } + + return OK; +} + +/* + * 销毁 + * + * 将串S销毁。 + * + *【注】 + * 顺序串的结构无法销毁 + */ +Status DestroyString(SString S) { + return OK; +} + +/* + * 清空 + * + * 将串S清空。 + */ +Status ClearString(SString S) { + // 只需要将长度置为0就可以 + S[0] = 0; + return OK; +} + +/* + * 判空 + * + * 判断串S中是否包含有效数据。 + * + * 返回值: + * TRUE : 串S为空 + * FALSE: 串S不为空 + */ +Status StrEmpty(SString S) { + return S[0] == 0 ? TRUE : FALSE; +} + +/* + * 计数 + * + * 返回串S中元素的个数。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrLength(SString S) { + return S[0]; +} + +/* + * ████████ 算法4.3 ████████ + * + * 求子串 + * + * 用Sub返回S[pos, pos+len-1]。 + * 返回值指示是否截取成功。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status SubString(SString Sub, SString S, int pos, int len) { + int i; + + if(pos < 1 || pos > S[0] || len < 0 || pos + len - 1 > S[0]) { + return ERROR; + } + + // 复制元素 + for(i = 1; i <= len; i++) { + Sub[i] = S[pos + i - 1]; + } + + // 确定新长度 + Sub[0] = len; + + return OK; +} + +/* + * ████████ 算法4.1 ████████ + * + * 查找 + * + * 从pos处开始搜索模式串T在主串S中首次出现的位置,如果不存在,则返回0。 + * 如果查找成功,返回匹配的位置。 + * + *【注】 + * 1.此实现需要依赖串的最小操作子集 + * 2.该实现比较低效 + */ +int Index_1(SString S, SString T, int pos) { + int i, n, m; // 记录S和T的长度 + SString sub; + + /* + * 失败情形提前处理 + * 这里与教材写法略微不同 + */ + if(pos < 1 || pos > S[0] || StrEmpty(T)) { + return 0; + } + + n = StrLength(S); + m = StrLength(T); + i = pos; + + // 保证长度不越界 + while(i <= n - m + 1) { + // 获取S[i, i+m-1] + SubString(sub, S, i, m); + + // 如果子串与模式串不匹配,则需要继续推进 + if(StrCompare(sub, T) != 0) { + ++i; + } else { + return i; + } + } + + return 0; +} + +/* + * ████████ 算法4.5 ████████ + * + * 查找 + * + * 从pos处开始搜索模式串T在主串S中首次出现的位置,如果不存在,则返回0。 + * 如果查找成功,返回匹配的位置。 + * + *【注】 + * 1.此实现不依赖串的最小操作子集 + * 2.该实现比较低效 + */ +int Index_2(SString S, SString T, int pos) { + int i = pos; + int j = 1; + + if(pos < 1 || pos > S[0] || StrEmpty(T)) { + return 0; + } + + while(i <= S[0] && j <= T[0]) { + // 遇到相同字符,则继续比较后继字符 + if(S[i] == T[j]) { + i++; + j++; + + // 遇到不同的字符,则游标需要回退,重新比较 + } else { + i = i - (j - 1) + 1; // j-1代表徒劳地前进了j-1个元素,在第j个元素上功亏一篑 + j = 1; // 游标j回到串T的第一个位置 + } + } + + // 增加了一个T[0]>0的判断 + if(j > T[0] && T[0] > 0) { // T不为空串 + return i - T[0]; // 匹配成功 + } else { + return 0; + } +} + +/* + * 插入 + * + * 将串T插入到主串S的pos位置处。 + */ +Status StrInsert(SString S, int pos, SString T) { + int i; + + if(pos < 1 || pos > S[0] + 1 || S[0] + T[0] > MAXSTRLEN) { + return ERROR; + } + + // 如果待插入的串为空,则提前返回 + if(StrEmpty(T)) { + return OK; + } + + // 在S中腾出位置,为插入T做准备 + for(i = S[0]; i >= pos; i--) { + // 从后向前遍历,将前面的元素挪到后面 + S[i + T[0]] = S[i]; + } + + // 将串T插入在S中腾出的位置上 + for(i = pos; i <= pos + T[0] - 1; i++) { + S[i] = T[i - pos + 1]; + } + + // 长度增加 + S[0] += T[0]; + + return OK; +} + +/* + * 删除 + * + * 删除S[pos, pos+len-1]。 + */ +Status StrDelete(SString S, int pos, int len) { + int i; + + if(pos < 1 || pos + len - 1 > S[0] || len < 0) { + return ERROR; + } + + // 如果待删除的长度为0,则提前返回 + if(len == 0) { + return OK; + } + + // 把后面的元素挪到前面,覆盖掉被删除的元素 + for(i = pos + len; i <= S[0]; i++) { + S[i - len] = S[i]; + } + + // 长度减少 + S[0] -= len; + + return OK; +} + +/* + * 比较 + * + * 比较串S和串T,返回比较结果。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrCompare(SString S, SString T) { + int i = 1; + + while(i <= S[0] && i <= T[0]) { + // 遇到不同的字符时,比较其大小 + if(S[i] != T[i]) { + return S[i] - T[i]; + } + + i++; + } + + return S[0] - T[0]; +} + +/* + * 复制 + * + * 将串S复制到串T。 + */ +Status StrCopy(SString T, SString S) { + int i; + + // 连同长度信息一起复制 + for(i = 0; i <= S[0]; i++) { + T[i] = S[i]; + } + + return OK; +} + +/* + * 替换 + * + * 用V替换主串S中出现的所有与T相等的且不重叠的子串。 + * + *【注】 + * 1.该操作依赖最小操作子集 + * 2.该实现比较低效 + */ +Status Replace(SString S, SString T, SString V) { + int i; + + if(StrEmpty(S) || StrEmpty(T)) { + return ERROR; + } + + // 在主串S中寻找模式串T第一次出现的位置 + i = Index_2(S, T, 1); + + // 如果存在匹配的字符串,且可以被完全替换(替换后不溢出) + while(i != 0 && S[0] - T[0] + V[0] <= MAXSTRLEN) { + StrDelete(S, i, StrLength(T)); // 从S中删除T + StrInsert(S, i, V); // 向S中插入V + + i += StrLength(V); // i切换到下一个位置 + + i = Index_2(S, T, i); // 查找下一个匹配的字符串 + } + + if(i == 0) { // S中的T已全部被替换 + return OK; + } else { // S中尚有T,但是V已经插不进去了 + return ERROR; + } +} + +/* + * ████████ 算法4.2 ████████ + * + * 串联接 + * + * 联接S1和S2,并存储到T中返回。如果联接后的长度溢出,则只保留未溢出的部分。 + * 返回值表示联接后的串是否完整。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status Concat(SString T, SString S1, SString S2) { + int i; + int uncut; // 新串是否完整 + + // 完全不需要裁剪 + if(S1[0] + S2[0] <= MAXSTRLEN) { + // 复制S1到T中 + for(i = 1; i <= S1[0]; i++) { + T[i] = S1[i]; + } + + // 复制S2到T中 + for(i = S1[0] + 1; i <= S1[0] + S2[0]; i++) { + T[i] = S2[i - S1[0]]; + } + + // 设置新长度 + T[0] = S1[0] + S2[0]; + + // 未裁剪,完整 + uncut = TRUE; + + // 需要裁剪S2 + } else if(S1[0] <= MAXSTRLEN) { + // 复制S1到T中 + for(i = 1; i <= S1[0]; i++) { + T[i] = S1[i]; + } + + // 将S2的一部分复制到T中 + for(i = S1[0] + 1; i <= MAXSTRLEN; i++) { + T[i] = S2[i - S1[0]]; + } + + // 设置新长度 + T[0] = MAXSTRLEN; + + uncut = FALSE; + + // 只需要复制S1的一部分 + } else { + // 连同长度信息一起复制 + for(i = 0; i <= MAXSTRLEN; i++) { + T[i] = S1[i]; + } + + uncut = FALSE; + } + + return uncut; +} + +// 输出:打印字符串 +void StrPrint(SString S) { + int i; + + for(i = 1; i<=S[0] ; i++) { + printf("%c", S[i]); + } + + printf("\n"); +} diff --git a/CLion/ExerciseBook/04.31/SString.h b/CLion/ExerciseBook/04.31/SString.h new file mode 100644 index 0000000..d164913 --- /dev/null +++ b/CLion/ExerciseBook/04.31/SString.h @@ -0,0 +1,179 @@ +/*============================= + * 串的定长顺序存储表示(顺序串) + * + * 包含算法: 4.1、4.2、4.3、4.5 + ==============================*/ + +#ifndef SSTRING_H +#define SSTRING_H + +#include +#include // 提供strlen原型 +#include "Status.h" //**▲01 绪论**// + +/* 宏定义 */ +#define MAXSTRLEN 255 // 顺序串的最大串长 + +/* + * 串的顺序存储类型定义 + * + * 注:有效元素从SString的1号单元开始存储 + * SString的0号单元用来存储其长度 + */ +typedef unsigned char SString[MAXSTRLEN + 1]; // 0号单元存放串的长度 + + +/* + * ████ 提示 ████ + * + * 遵循教材的书写习惯,pos指示字符的位序(不是索引),从1开始计数 + */ + + +/* + * 初始化 + * + * 构造一个值为chars的串T。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status StrAssign(SString T, const char* chars); + +/* + * 销毁 + * + * 将串S销毁。 + * + *【注】 + * 顺序串的结构无法销毁 + */ +Status DestroyString(SString S); + +/* + * 清空 + * + * 将串S清空。 + */ +Status ClearString(SString S); + +/* + * 判空 + * + * 判断串S中是否包含有效数据。 + * + * 返回值: + * TRUE : 串S为空 + * FALSE: 串S不为空 + */ +Status StrEmpty(SString S); + +/* + * 计数 + * + * 返回串S中元素的个数。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrLength(SString S); + +/* + * ████████ 算法4.3 ████████ + * + * 求子串 + * + * 用Sub返回S[pos, pos+len-1]。 + * 返回值指示是否截取成功。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status SubString(SString Sub, SString S, int pos, int len); + +/* + * ████████ 算法4.1 ████████ + * + * 查找 + * + * 从pos处开始搜索模式串T在主串S中首次出现的位置,如果不存在,则返回0。 + * 如果查找成功,返回匹配的位置。 + * + *【注】 + * 1.此实现需要依赖串的最小操作子集 + * 2.该实现比较低效 + */ +int Index_1(SString S, SString T, int pos); + +/* + * ████████ 算法4.5 ████████ + * + * 查找 + * + * 从pos处开始搜索模式串T在主串S中首次出现的位置,如果不存在,则返回0。 + * 如果查找成功,返回匹配的位置。 + * + *【注】 + * 1.此实现不依赖串的最小操作子集 + * 2.该实现比较低效 + */ +int Index_2(SString S, SString T, int pos); + +/* + * 插入 + * + * 将串T插入到主串S的pos位置处。 + */ +Status StrInsert(SString S, int pos, SString T); + +/* + * 删除 + * + * 删除S[pos, pos+len-1]。 + */ +Status StrDelete(SString S, int pos, int len); + +/* + * 比较 + * + * 比较串S和串T,返回比较结果。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrCompare(SString S, SString T); + +/* + * 复制 + * + * 将串S复制到串T。 + */ +Status StrCopy(SString T, SString S); + +/* + * 替换 + * + * 用V替换主串S中出现的所有与T相等的且不重叠的子串。 + * + *【注】 + * 该操作依赖最小操作子集,效率较低。 + */ +Status Replace(SString S, SString T, SString V); + +/* + * ████████ 算法4.2 ████████ + * + * 串联接 + * + * 联接S1和S2,并存储到T中返回。如果联接后的长度溢出,则只保留未溢出的部分。 + * 返回值表示联接后的串是否完整。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status Concat(SString T, SString S1, SString S2); + +// 输出:打印字符串 +void StrPrint(SString S); + +#endif diff --git a/CLion/ExerciseBook/CMakeLists.txt b/CLion/ExerciseBook/CMakeLists.txt index 61c7125..0d77604 100644 --- a/CLion/ExerciseBook/CMakeLists.txt +++ b/CLion/ExerciseBook/CMakeLists.txt @@ -49,3 +49,21 @@ add_subdirectory(03.30+03.32) add_subdirectory(03.31) add_subdirectory(03.33) add_subdirectory(03.34) + +add_subdirectory(04.10) +add_subdirectory(04.11) +add_subdirectory(04.12) +add_subdirectory(04.13) +add_subdirectory(04.14) +add_subdirectory(04.15-04.17) +add_subdirectory(04.18) +add_subdirectory(04.19) +add_subdirectory(04.20) +add_subdirectory(04.21) +add_subdirectory(04.22) +add_subdirectory(04.23) +add_subdirectory(04.24-04.26) +add_subdirectory(04.27) +add_subdirectory(04.28-04.29) +add_subdirectory(04.30) +add_subdirectory(04.31) diff --git a/Dev-C++/ExerciseBook/04.10/04.10.cpp b/Dev-C++/ExerciseBook/04.10/04.10.cpp new file mode 100644 index 0000000..5a98ea3 --- /dev/null +++ b/Dev-C++/ExerciseBook/04.10/04.10.cpp @@ -0,0 +1,35 @@ +#include +#include "String.h" //**ַ**// + +/* + * ַãTΪR + */ +StringType Algo_4_10(StringType T) { + int i; + StringType R = "", Sub; + + // Ӻǰȡַ + for(i = StrLength(T); i >= 1; i--) { + Sub = SubString(T, i, 1); + R = Concat(R, Sub); + } + + return R; +} + + +int main(int argc, char* argv[]) { + char* s = "0123456789"; + StringType T, R; + + printf("ǰT = "); + StrAssign(&T, s); + StrPrint(T); + + printf("úR = "); + R = Algo_4_10(T); + StrPrint(R); + + return 0; +} + diff --git a/Dev-C++/ExerciseBook/04.10/04.10.dev b/Dev-C++/ExerciseBook/04.10/04.10.dev new file mode 100644 index 0000000..afe9c74 --- /dev/null +++ b/Dev-C++/ExerciseBook/04.10/04.10.dev @@ -0,0 +1,82 @@ +[Project] +FileName=04.10.dev +Name=04.10 +Type=1 +Ver=2 +ObjFiles= +Includes= +Libs= +PrivateResource= +ResourceIncludes= +MakeIncludes= +Compiler= +CppCompiler= +Linker= +IsCpp=0 +Icon= +ExeOutput= +ObjectOutput= +LogOutput= +LogOutputEnabled=0 +OverrideOutput=0 +OverrideOutputName= +HostApplication= +UseCustomMakefile=0 +CustomMakefile= +CommandLine= +Folders= +IncludeVersionInfo=0 +SupportXPThemes=0 +CompilerSet=1 +CompilerSettings=0000000000000000001000000 +UnitCount=3 + +[VersionInfo] +Major=1 +Minor=0 +Release=0 +Build=0 +LanguageID=1033 +CharsetID=1252 +CompanyName= +FileVersion= +FileDescription=Developed using the Dev-C++ IDE +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion= +AutoIncBuildNr=0 +SyncProduct=1 + +[Unit1] +FileName=04.10.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit2] +FileName=String.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=String.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Dev-C++/ExerciseBook/04.10/String.cpp b/Dev-C++/ExerciseBook/04.10/String.cpp new file mode 100644 index 0000000..41df51c --- /dev/null +++ b/Dev-C++/ExerciseBook/04.10/String.cpp @@ -0,0 +1,151 @@ +/*=========================== + * ϰ4.10~4.14ʹõַ + ============================*/ + +#include "String.h" + +// ʼһֵΪsĴt +void StrAssign(StringType* t, const char* s) { + if(s == NULL) { + *t = ""; + } + + *t = (char*) malloc((strlen(s) + 1) * sizeof(char)); + + strcpy(*t, s); +} + +// ȽϣstĴССһ£0 +int StrCompare(StringType s, StringType t) { + return strcmp(s, t); +} + +// ַsij +int StrLength(StringType s) { + return (int) strlen(s); +} + +// ӣstӺĴ +StringType Concat(StringType s, StringType t) { + StringType r; + + if(s == NULL) { + s = ""; + } + + if(t == NULL) { + t = ""; + } + + r = (char*) malloc((strlen(s) + strlen(t) + 1) * sizeof(char)); + r[0] = '\0'; + + strcat(r, s); + strcat(r, t); + + return r; +} + +// Ӵsstartλ𣬽ȡlenַ󷵻 +StringType SubString(StringType s, int start, int len) { + int n; + char* sub; + + n = (int) strlen(s); + + if(start < 1 || start > n || start + len - 1 > n || len < 0) { + return ""; + } + + sub = (char*) malloc((len + 1) * sizeof(char)); + strncpy(sub, s + start - 1, len); + sub[len] = '\0'; + + return sub; +} + +// ңsposλtҵλ +int Index(StringType s, StringType t, int pos) { + int m, n, i; + StringType sub; + + // ʧǰ + if(pos < 1 || pos > StrLength(s) || StrLength(t) == 0) { + return 0; + } + + n = StrLength(s); + m = StrLength(t); + i = pos; + + // ֤ȲԽ + while(i <= n - m + 1) { + // ȡS[i, i+m-1] + sub = SubString(s, i, m); + + // Ӵģʽƥ䣬Ҫƽ + if(StrCompare(sub, t) != 0) { + ++i; + } else { + return i; + } + } + + return 0; +} + +// 룺spost +Status StrInsert(StringType* s, int pos, StringType t) { + StringType r; + StringType s1, s2; + + if(pos < 1 || pos > StrLength(*s) + 1) { + return ERROR; + } + + r = (StringType) malloc((strlen(*s) + strlen(t) + 1) * sizeof(char)); + r[0] = '\0'; + + // ĴΪգǰ + if(StrLength(t) == 0) { + return OK; + } + + s1 = SubString(*s, 1, pos - 1); + s2 = SubString(*s, pos, (int) strlen(*s) - pos + 1); + + strcat(r, s1); + strcat(r, t); + strcat(r, s2); + + *s = r; + + return OK; +} + +// ɾsposλɾlenַ +Status StrDelete(StringType* s, int pos, int len) { + StringType r; + + if(pos < 1 || pos + len - 1 > StrLength(*s) || len < 0) { + return ERROR; + } + + // ɾijΪ0ǰ + if(len == 0) { + return OK; + } + + r = (StringType) malloc((StrLength(*s) - len + 1) * sizeof(char)); + strncpy(r, *s, pos - 1); + strcpy(r + pos - 1, *s + pos + len - 1); + + *s = r; + + return OK; +} + +// ַ +void StrPrint(StringType s) { + printf("%s\n", s); +} diff --git a/Dev-C++/ExerciseBook/04.10/String.h b/Dev-C++/ExerciseBook/04.10/String.h new file mode 100644 index 0000000..9d984af --- /dev/null +++ b/Dev-C++/ExerciseBook/04.10/String.h @@ -0,0 +1,43 @@ +/*=========================== + * ϰ4.10~4.14ʹõַ + ============================*/ + +#ifndef STRING_H +#define STRING_H + +#include +#include // ṩ strlen ԭ +#include "Status.h" //**01 **// + +/* ַ */ +typedef char* StringType; + + +// ʼһֵΪsĴt +void StrAssign(StringType* t, const char* s); + +// ȽϣstĴССһ£0 +int StrCompare(StringType s, StringType t); + +// ַsij +int StrLength(StringType s); + +// ӣstӺĴ +StringType Concat(StringType s, StringType t); + +// Ӵsstartλ𣬽ȡlenַ󷵻 +StringType SubString(StringType s, int start, int len); + +// ңsposλtҵλ +int Index(StringType s, StringType t, int pos); + +// 룺spost +Status StrInsert(StringType* s, int pos, StringType t); + +// ɾsposλɾlenַ +Status StrDelete(StringType* s, int pos, int len); + +// ַ +void StrPrint(StringType s); + +#endif diff --git a/Dev-C++/ExerciseBook/04.11/04.11.cpp b/Dev-C++/ExerciseBook/04.11/04.11.cpp new file mode 100644 index 0000000..7dd1b18 --- /dev/null +++ b/Dev-C++/ExerciseBook/04.11/04.11.cpp @@ -0,0 +1,69 @@ +#include +#include +#include "String.h" //**ַ**// + +/* + * R=S-STa洢RÿַSеһγֵλ + * + * עa0ŵԪ洢aԪصĸ + */ +void Algo_4_11(StringType* R, StringType S, StringType T, int** a) { + int i, p; + StringType ch; + + *a = (int*) malloc((StrLength(S) + 1) * sizeof(int)); + + StrAssign(R, ""); + + for(i = 1, (*a)[0] = 0; i <= StrLength(S); i++) { + // ȡַж + ch = SubString(S, i, 1); + + // ȡS[i]Tеλ + p = Index(T, ch, 1); + + // S[i]T + if(p == 0) { + // ȡS[i]Rеλ + p = Index(*R, ch, 1); + } + + // S[i]ȲTУûRгֹ + if(p == 0) { + (*a)[0]++; + (*a)[(*a)[0]] = i; + + // RS[i] + StrInsert(R, (*a)[0], ch); + } + } +} + + +int main(int argc, char* argv[]) { + char* s = "amdhcjgfdlpinbefcopgkqikeb"; + char* t = "mhjlpinopkqik"; + int* a; + StringType T, S, R; + int i; + + printf("ʼST...\n"); + StrAssign(&S, s); + StrAssign(&T, t); + printf("S = "); + StrPrint(S); + printf("T = "); + StrPrint(T); + + Algo_4_11(&R, S, T, &a); + printf("R = "); + StrPrint(R); + + printf("a = "); + for(i = 1; i <= a[0]; i++) { + printf("%d ", a[i]); + } + printf("\n"); + + return 0; +} diff --git a/Dev-C++/ExerciseBook/04.11/04.11.dev b/Dev-C++/ExerciseBook/04.11/04.11.dev new file mode 100644 index 0000000..6b7e1ec --- /dev/null +++ b/Dev-C++/ExerciseBook/04.11/04.11.dev @@ -0,0 +1,82 @@ +[Project] +FileName=04.11.dev +Name=04.11 +Type=1 +Ver=2 +ObjFiles= +Includes= +Libs= +PrivateResource= +ResourceIncludes= +MakeIncludes= +Compiler= +CppCompiler= +Linker= +IsCpp=0 +Icon= +ExeOutput= +ObjectOutput= +LogOutput= +LogOutputEnabled=0 +OverrideOutput=0 +OverrideOutputName= +HostApplication= +UseCustomMakefile=0 +CustomMakefile= +CommandLine= +Folders= +IncludeVersionInfo=0 +SupportXPThemes=0 +CompilerSet=1 +CompilerSettings=0000000000000000001000000 +UnitCount=3 + +[VersionInfo] +Major=1 +Minor=0 +Release=0 +Build=0 +LanguageID=1033 +CharsetID=1252 +CompanyName= +FileVersion= +FileDescription=Developed using the Dev-C++ IDE +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion= +AutoIncBuildNr=0 +SyncProduct=1 + +[Unit1] +FileName=04.11.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit2] +FileName=String.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=String.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Dev-C++/ExerciseBook/04.11/String.cpp b/Dev-C++/ExerciseBook/04.11/String.cpp new file mode 100644 index 0000000..41df51c --- /dev/null +++ b/Dev-C++/ExerciseBook/04.11/String.cpp @@ -0,0 +1,151 @@ +/*=========================== + * ϰ4.10~4.14ʹõַ + ============================*/ + +#include "String.h" + +// ʼһֵΪsĴt +void StrAssign(StringType* t, const char* s) { + if(s == NULL) { + *t = ""; + } + + *t = (char*) malloc((strlen(s) + 1) * sizeof(char)); + + strcpy(*t, s); +} + +// ȽϣstĴССһ£0 +int StrCompare(StringType s, StringType t) { + return strcmp(s, t); +} + +// ַsij +int StrLength(StringType s) { + return (int) strlen(s); +} + +// ӣstӺĴ +StringType Concat(StringType s, StringType t) { + StringType r; + + if(s == NULL) { + s = ""; + } + + if(t == NULL) { + t = ""; + } + + r = (char*) malloc((strlen(s) + strlen(t) + 1) * sizeof(char)); + r[0] = '\0'; + + strcat(r, s); + strcat(r, t); + + return r; +} + +// Ӵsstartλ𣬽ȡlenַ󷵻 +StringType SubString(StringType s, int start, int len) { + int n; + char* sub; + + n = (int) strlen(s); + + if(start < 1 || start > n || start + len - 1 > n || len < 0) { + return ""; + } + + sub = (char*) malloc((len + 1) * sizeof(char)); + strncpy(sub, s + start - 1, len); + sub[len] = '\0'; + + return sub; +} + +// ңsposλtҵλ +int Index(StringType s, StringType t, int pos) { + int m, n, i; + StringType sub; + + // ʧǰ + if(pos < 1 || pos > StrLength(s) || StrLength(t) == 0) { + return 0; + } + + n = StrLength(s); + m = StrLength(t); + i = pos; + + // ֤ȲԽ + while(i <= n - m + 1) { + // ȡS[i, i+m-1] + sub = SubString(s, i, m); + + // Ӵģʽƥ䣬Ҫƽ + if(StrCompare(sub, t) != 0) { + ++i; + } else { + return i; + } + } + + return 0; +} + +// 룺spost +Status StrInsert(StringType* s, int pos, StringType t) { + StringType r; + StringType s1, s2; + + if(pos < 1 || pos > StrLength(*s) + 1) { + return ERROR; + } + + r = (StringType) malloc((strlen(*s) + strlen(t) + 1) * sizeof(char)); + r[0] = '\0'; + + // ĴΪգǰ + if(StrLength(t) == 0) { + return OK; + } + + s1 = SubString(*s, 1, pos - 1); + s2 = SubString(*s, pos, (int) strlen(*s) - pos + 1); + + strcat(r, s1); + strcat(r, t); + strcat(r, s2); + + *s = r; + + return OK; +} + +// ɾsposλɾlenַ +Status StrDelete(StringType* s, int pos, int len) { + StringType r; + + if(pos < 1 || pos + len - 1 > StrLength(*s) || len < 0) { + return ERROR; + } + + // ɾijΪ0ǰ + if(len == 0) { + return OK; + } + + r = (StringType) malloc((StrLength(*s) - len + 1) * sizeof(char)); + strncpy(r, *s, pos - 1); + strcpy(r + pos - 1, *s + pos + len - 1); + + *s = r; + + return OK; +} + +// ַ +void StrPrint(StringType s) { + printf("%s\n", s); +} diff --git a/Dev-C++/ExerciseBook/04.11/String.h b/Dev-C++/ExerciseBook/04.11/String.h new file mode 100644 index 0000000..9d984af --- /dev/null +++ b/Dev-C++/ExerciseBook/04.11/String.h @@ -0,0 +1,43 @@ +/*=========================== + * ϰ4.10~4.14ʹõַ + ============================*/ + +#ifndef STRING_H +#define STRING_H + +#include +#include // ṩ strlen ԭ +#include "Status.h" //**01 **// + +/* ַ */ +typedef char* StringType; + + +// ʼһֵΪsĴt +void StrAssign(StringType* t, const char* s); + +// ȽϣstĴССһ£0 +int StrCompare(StringType s, StringType t); + +// ַsij +int StrLength(StringType s); + +// ӣstӺĴ +StringType Concat(StringType s, StringType t); + +// Ӵsstartλ𣬽ȡlenַ󷵻 +StringType SubString(StringType s, int start, int len); + +// ңsposλtҵλ +int Index(StringType s, StringType t, int pos); + +// 룺spost +Status StrInsert(StringType* s, int pos, StringType t); + +// ɾsposλɾlenַ +Status StrDelete(StringType* s, int pos, int len); + +// ַ +void StrPrint(StringType s); + +#endif diff --git a/Dev-C++/ExerciseBook/04.12/04.12.cpp b/Dev-C++/ExerciseBook/04.12/04.12.cpp new file mode 100644 index 0000000..fe34fd9 --- /dev/null +++ b/Dev-C++/ExerciseBook/04.12/04.12.cpp @@ -0,0 +1,56 @@ +#include +#include "Status.h" //**01 **// +#include "String.h" //**ַ**// + +/* + * 滻Replace + * + * V滻SгֵTȵҲصӴ + */ +Status Algo_4_12(StringType* S, StringType T, StringType V) { + int i; + + if(StrLength(*S) == 0 || StrLength(T) == 0) { + return ERROR; + } + + i = 1; + + // SѰģʽTһγֵλ + while((i = Index(*S, T, i)) != 0) { + StrDelete(S, i, StrLength(T)); // SɾT + StrInsert(S, i, V); // SвV + + i += StrLength(V); // iлһλ + } + + return OK; +} + + +int main(int argc, char* argv[]) { + char* s = "----***--*-**-****-*****-----"; + char* t = "**"; + char* v = "^^"; + StringType T, S, V; + + printf("滻ǰ...\n"); + + StrAssign(&S, s); + StrAssign(&T, t); + StrAssign(&V, v); + + printf("S = "); + StrPrint(S); + printf("T = "); + StrPrint(T); + printf("V = "); + StrPrint(V); + + printf("滻...\n"); + printf("S = "); + Algo_4_12(&S, T, V); + StrPrint(S); + + return 0; +} diff --git a/Dev-C++/ExerciseBook/04.12/04.12.dev b/Dev-C++/ExerciseBook/04.12/04.12.dev new file mode 100644 index 0000000..30818c0 --- /dev/null +++ b/Dev-C++/ExerciseBook/04.12/04.12.dev @@ -0,0 +1,82 @@ +[Project] +FileName=04.12.dev +Name=04.12 +Type=1 +Ver=2 +ObjFiles= +Includes= +Libs= +PrivateResource= +ResourceIncludes= +MakeIncludes= +Compiler= +CppCompiler= +Linker= +IsCpp=0 +Icon= +ExeOutput= +ObjectOutput= +LogOutput= +LogOutputEnabled=0 +OverrideOutput=0 +OverrideOutputName= +HostApplication= +UseCustomMakefile=0 +CustomMakefile= +CommandLine= +Folders= +IncludeVersionInfo=0 +SupportXPThemes=0 +CompilerSet=1 +CompilerSettings=0000000000000000001000000 +UnitCount=3 + +[VersionInfo] +Major=1 +Minor=0 +Release=0 +Build=0 +LanguageID=1033 +CharsetID=1252 +CompanyName= +FileVersion= +FileDescription=Developed using the Dev-C++ IDE +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion= +AutoIncBuildNr=0 +SyncProduct=1 + +[Unit1] +FileName=04.12.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit2] +FileName=String.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=String.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Dev-C++/ExerciseBook/04.12/String.cpp b/Dev-C++/ExerciseBook/04.12/String.cpp new file mode 100644 index 0000000..41df51c --- /dev/null +++ b/Dev-C++/ExerciseBook/04.12/String.cpp @@ -0,0 +1,151 @@ +/*=========================== + * ϰ4.10~4.14ʹõַ + ============================*/ + +#include "String.h" + +// ʼһֵΪsĴt +void StrAssign(StringType* t, const char* s) { + if(s == NULL) { + *t = ""; + } + + *t = (char*) malloc((strlen(s) + 1) * sizeof(char)); + + strcpy(*t, s); +} + +// ȽϣstĴССһ£0 +int StrCompare(StringType s, StringType t) { + return strcmp(s, t); +} + +// ַsij +int StrLength(StringType s) { + return (int) strlen(s); +} + +// ӣstӺĴ +StringType Concat(StringType s, StringType t) { + StringType r; + + if(s == NULL) { + s = ""; + } + + if(t == NULL) { + t = ""; + } + + r = (char*) malloc((strlen(s) + strlen(t) + 1) * sizeof(char)); + r[0] = '\0'; + + strcat(r, s); + strcat(r, t); + + return r; +} + +// Ӵsstartλ𣬽ȡlenַ󷵻 +StringType SubString(StringType s, int start, int len) { + int n; + char* sub; + + n = (int) strlen(s); + + if(start < 1 || start > n || start + len - 1 > n || len < 0) { + return ""; + } + + sub = (char*) malloc((len + 1) * sizeof(char)); + strncpy(sub, s + start - 1, len); + sub[len] = '\0'; + + return sub; +} + +// ңsposλtҵλ +int Index(StringType s, StringType t, int pos) { + int m, n, i; + StringType sub; + + // ʧǰ + if(pos < 1 || pos > StrLength(s) || StrLength(t) == 0) { + return 0; + } + + n = StrLength(s); + m = StrLength(t); + i = pos; + + // ֤ȲԽ + while(i <= n - m + 1) { + // ȡS[i, i+m-1] + sub = SubString(s, i, m); + + // Ӵģʽƥ䣬Ҫƽ + if(StrCompare(sub, t) != 0) { + ++i; + } else { + return i; + } + } + + return 0; +} + +// 룺spost +Status StrInsert(StringType* s, int pos, StringType t) { + StringType r; + StringType s1, s2; + + if(pos < 1 || pos > StrLength(*s) + 1) { + return ERROR; + } + + r = (StringType) malloc((strlen(*s) + strlen(t) + 1) * sizeof(char)); + r[0] = '\0'; + + // ĴΪգǰ + if(StrLength(t) == 0) { + return OK; + } + + s1 = SubString(*s, 1, pos - 1); + s2 = SubString(*s, pos, (int) strlen(*s) - pos + 1); + + strcat(r, s1); + strcat(r, t); + strcat(r, s2); + + *s = r; + + return OK; +} + +// ɾsposλɾlenַ +Status StrDelete(StringType* s, int pos, int len) { + StringType r; + + if(pos < 1 || pos + len - 1 > StrLength(*s) || len < 0) { + return ERROR; + } + + // ɾijΪ0ǰ + if(len == 0) { + return OK; + } + + r = (StringType) malloc((StrLength(*s) - len + 1) * sizeof(char)); + strncpy(r, *s, pos - 1); + strcpy(r + pos - 1, *s + pos + len - 1); + + *s = r; + + return OK; +} + +// ַ +void StrPrint(StringType s) { + printf("%s\n", s); +} diff --git a/Dev-C++/ExerciseBook/04.12/String.h b/Dev-C++/ExerciseBook/04.12/String.h new file mode 100644 index 0000000..9d984af --- /dev/null +++ b/Dev-C++/ExerciseBook/04.12/String.h @@ -0,0 +1,43 @@ +/*=========================== + * ϰ4.10~4.14ʹõַ + ============================*/ + +#ifndef STRING_H +#define STRING_H + +#include +#include // ṩ strlen ԭ +#include "Status.h" //**01 **// + +/* ַ */ +typedef char* StringType; + + +// ʼһֵΪsĴt +void StrAssign(StringType* t, const char* s); + +// ȽϣstĴССһ£0 +int StrCompare(StringType s, StringType t); + +// ַsij +int StrLength(StringType s); + +// ӣstӺĴ +StringType Concat(StringType s, StringType t); + +// Ӵsstartλ𣬽ȡlenַ󷵻 +StringType SubString(StringType s, int start, int len); + +// ңsposλtҵλ +int Index(StringType s, StringType t, int pos); + +// 룺spost +Status StrInsert(StringType* s, int pos, StringType t); + +// ɾsposλɾlenַ +Status StrDelete(StringType* s, int pos, int len); + +// ַ +void StrPrint(StringType s); + +#endif diff --git a/Dev-C++/ExerciseBook/04.13/04.13.cpp b/Dev-C++/ExerciseBook/04.13/04.13.cpp new file mode 100644 index 0000000..1478bf4 --- /dev/null +++ b/Dev-C++/ExerciseBook/04.13/04.13.cpp @@ -0,0 +1,41 @@ +#include +#include "String.h" //**ַ**// + +/* + * ɾSаT + */ +Status Algo_4_13(StringType* S, StringType T) { + int i; + + // SвTҵɾ + while((i = Index(*S, T, 1)) != 0) { + if(StrDelete(S, i, StrLength(T)) == ERROR) { + return ERROR; + } + } + + return OK; +} + + +int main(int argc, char* argv[]) { + char* s = "----***--*-**-****-*****-----"; + char* t = "**"; + StringType T, S; + + printf("ɾǰ...\n"); + StrAssign(&S, s); + StrAssign(&T, t); + + printf("S = "); + StrPrint(S); + printf("T = "); + StrPrint(T); + + printf("ɾ...\n"); + printf("S = "); + Algo_4_13(&S, T); + StrPrint(S); + + return 0; +} diff --git a/Dev-C++/ExerciseBook/04.13/04.13.dev b/Dev-C++/ExerciseBook/04.13/04.13.dev new file mode 100644 index 0000000..920b539 --- /dev/null +++ b/Dev-C++/ExerciseBook/04.13/04.13.dev @@ -0,0 +1,82 @@ +[Project] +FileName=04.13.dev +Name=04.13 +Type=1 +Ver=2 +ObjFiles= +Includes= +Libs= +PrivateResource= +ResourceIncludes= +MakeIncludes= +Compiler= +CppCompiler= +Linker= +IsCpp=0 +Icon= +ExeOutput= +ObjectOutput= +LogOutput= +LogOutputEnabled=0 +OverrideOutput=0 +OverrideOutputName= +HostApplication= +UseCustomMakefile=0 +CustomMakefile= +CommandLine= +Folders= +IncludeVersionInfo=0 +SupportXPThemes=0 +CompilerSet=1 +CompilerSettings=0000000000000000001000000 +UnitCount=3 + +[VersionInfo] +Major=1 +Minor=0 +Release=0 +Build=0 +LanguageID=1033 +CharsetID=1252 +CompanyName= +FileVersion= +FileDescription=Developed using the Dev-C++ IDE +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion= +AutoIncBuildNr=0 +SyncProduct=1 + +[Unit1] +FileName=04.13.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit2] +FileName=String.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=String.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Dev-C++/ExerciseBook/04.13/String.cpp b/Dev-C++/ExerciseBook/04.13/String.cpp new file mode 100644 index 0000000..41df51c --- /dev/null +++ b/Dev-C++/ExerciseBook/04.13/String.cpp @@ -0,0 +1,151 @@ +/*=========================== + * ϰ4.10~4.14ʹõַ + ============================*/ + +#include "String.h" + +// ʼһֵΪsĴt +void StrAssign(StringType* t, const char* s) { + if(s == NULL) { + *t = ""; + } + + *t = (char*) malloc((strlen(s) + 1) * sizeof(char)); + + strcpy(*t, s); +} + +// ȽϣstĴССһ£0 +int StrCompare(StringType s, StringType t) { + return strcmp(s, t); +} + +// ַsij +int StrLength(StringType s) { + return (int) strlen(s); +} + +// ӣstӺĴ +StringType Concat(StringType s, StringType t) { + StringType r; + + if(s == NULL) { + s = ""; + } + + if(t == NULL) { + t = ""; + } + + r = (char*) malloc((strlen(s) + strlen(t) + 1) * sizeof(char)); + r[0] = '\0'; + + strcat(r, s); + strcat(r, t); + + return r; +} + +// Ӵsstartλ𣬽ȡlenַ󷵻 +StringType SubString(StringType s, int start, int len) { + int n; + char* sub; + + n = (int) strlen(s); + + if(start < 1 || start > n || start + len - 1 > n || len < 0) { + return ""; + } + + sub = (char*) malloc((len + 1) * sizeof(char)); + strncpy(sub, s + start - 1, len); + sub[len] = '\0'; + + return sub; +} + +// ңsposλtҵλ +int Index(StringType s, StringType t, int pos) { + int m, n, i; + StringType sub; + + // ʧǰ + if(pos < 1 || pos > StrLength(s) || StrLength(t) == 0) { + return 0; + } + + n = StrLength(s); + m = StrLength(t); + i = pos; + + // ֤ȲԽ + while(i <= n - m + 1) { + // ȡS[i, i+m-1] + sub = SubString(s, i, m); + + // Ӵģʽƥ䣬Ҫƽ + if(StrCompare(sub, t) != 0) { + ++i; + } else { + return i; + } + } + + return 0; +} + +// 룺spost +Status StrInsert(StringType* s, int pos, StringType t) { + StringType r; + StringType s1, s2; + + if(pos < 1 || pos > StrLength(*s) + 1) { + return ERROR; + } + + r = (StringType) malloc((strlen(*s) + strlen(t) + 1) * sizeof(char)); + r[0] = '\0'; + + // ĴΪգǰ + if(StrLength(t) == 0) { + return OK; + } + + s1 = SubString(*s, 1, pos - 1); + s2 = SubString(*s, pos, (int) strlen(*s) - pos + 1); + + strcat(r, s1); + strcat(r, t); + strcat(r, s2); + + *s = r; + + return OK; +} + +// ɾsposλɾlenַ +Status StrDelete(StringType* s, int pos, int len) { + StringType r; + + if(pos < 1 || pos + len - 1 > StrLength(*s) || len < 0) { + return ERROR; + } + + // ɾijΪ0ǰ + if(len == 0) { + return OK; + } + + r = (StringType) malloc((StrLength(*s) - len + 1) * sizeof(char)); + strncpy(r, *s, pos - 1); + strcpy(r + pos - 1, *s + pos + len - 1); + + *s = r; + + return OK; +} + +// ַ +void StrPrint(StringType s) { + printf("%s\n", s); +} diff --git a/Dev-C++/ExerciseBook/04.13/String.h b/Dev-C++/ExerciseBook/04.13/String.h new file mode 100644 index 0000000..9d984af --- /dev/null +++ b/Dev-C++/ExerciseBook/04.13/String.h @@ -0,0 +1,43 @@ +/*=========================== + * ϰ4.10~4.14ʹõַ + ============================*/ + +#ifndef STRING_H +#define STRING_H + +#include +#include // ṩ strlen ԭ +#include "Status.h" //**01 **// + +/* ַ */ +typedef char* StringType; + + +// ʼһֵΪsĴt +void StrAssign(StringType* t, const char* s); + +// ȽϣstĴССһ£0 +int StrCompare(StringType s, StringType t); + +// ַsij +int StrLength(StringType s); + +// ӣstӺĴ +StringType Concat(StringType s, StringType t); + +// Ӵsstartλ𣬽ȡlenַ󷵻 +StringType SubString(StringType s, int start, int len); + +// ңsposλtҵλ +int Index(StringType s, StringType t, int pos); + +// 룺spost +Status StrInsert(StringType* s, int pos, StringType t); + +// ɾsposλɾlenַ +Status StrDelete(StringType* s, int pos, int len); + +// ַ +void StrPrint(StringType s); + +#endif diff --git a/Dev-C++/ExerciseBook/04.14/04.14.cpp b/Dev-C++/ExerciseBook/04.14/04.14.cpp new file mode 100644 index 0000000..b996927 --- /dev/null +++ b/Dev-C++/ExerciseBook/04.14/04.14.cpp @@ -0,0 +1,92 @@ +#include +#include +#include "SqStack.h" //**03 ջͶ**// +#include "String.h" //**ַ**// + +/* + * ǰ׺ʽprefixתΪ׺ʽ + * + *ע + * δǰ׺ʽȷԽ֤ + */ +Status Algo_4_14(const char* prefix, char** suffix) { + StringType P, S; + StringType Operator; // + SqStack stack; // ʽջ + StringType e; // ջԪ + StringType o; // ջ + int i, len; + int readStr; // ǷҪȡַ + + len = (int) strlen(prefix); + + if(len == 0) { + *suffix = NULL; + return ERROR; + } + + // Ͳ + StrAssign(&Operator, "+-*/"); + + // ǰ׺ʽ + StrAssign(&P, prefix); + + // ׺ʽջ + InitStack(&stack); + + readStr = 1; + i = 1; + + // ǰ׺ʽȡԪ + while(TRUE) { + if(readStr == 1) { + S = SubString(P, i++, 1); + } + + // ֱջ + if(Index(Operator, S, 1) != 0) { + Push(&stack, S); + readStr = 1; + + // ˲ + } else { + // ȡջԪأջѾΪգSд洢˺׺ʽ + if(GetTop(stack, &e) == ERROR) { + break; + } + + // ջԪ򽫲ֱջ + if(Index(Operator, e, 1) != 0) { + Push(&stack, S); + readStr = 1; + + // ջҲDzҪм + } else { + Pop(&stack, &e); // ջ + Pop(&stack, &o); // ջ + + S = Concat(e, S); + S = Concat(S, o); + + // ²ҪȡַҪжϸոռSub + readStr = 0; + } + } + } + + // ȡ׺ʽ + *suffix = S; + + return OK; +} + + +int main(int argc, char* argv[]) { + char* prefix = "-+a*bc/de"; // ׺ʽΪabc*+de/- + char* suffix; + + Algo_4_14(prefix, &suffix); + + printf("ǰ׺ʽ%s\n", prefix); + printf("׺ʽ%s\n", suffix); +} diff --git a/Dev-C++/ExerciseBook/04.14/04.14.dev b/Dev-C++/ExerciseBook/04.14/04.14.dev new file mode 100644 index 0000000..ecb682c --- /dev/null +++ b/Dev-C++/ExerciseBook/04.14/04.14.dev @@ -0,0 +1,102 @@ +[Project] +FileName=04.14.dev +Name=04.14 +Type=1 +Ver=2 +ObjFiles= +Includes= +Libs= +PrivateResource= +ResourceIncludes= +MakeIncludes= +Compiler= +CppCompiler= +Linker= +IsCpp=0 +Icon= +ExeOutput= +ObjectOutput= +LogOutput= +LogOutputEnabled=0 +OverrideOutput=0 +OverrideOutputName= +HostApplication= +UseCustomMakefile=0 +CustomMakefile= +CommandLine= +Folders= +IncludeVersionInfo=0 +SupportXPThemes=0 +CompilerSet=1 +CompilerSettings=0000000000000000001000000 +UnitCount=5 + +[VersionInfo] +Major=1 +Minor=0 +Release=0 +Build=0 +LanguageID=1033 +CharsetID=1252 +CompanyName= +FileVersion= +FileDescription=Developed using the Dev-C++ IDE +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion= +AutoIncBuildNr=0 +SyncProduct=1 + +[Unit1] +FileName=04.14.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit2] +FileName=SqStack.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit4] +FileName=String.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=SqStack.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit5] +FileName=String.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Dev-C++/ExerciseBook/04.14/SqStack.cpp b/Dev-C++/ExerciseBook/04.14/SqStack.cpp new file mode 100644 index 0000000..70e35c0 --- /dev/null +++ b/Dev-C++/ExerciseBook/04.14/SqStack.cpp @@ -0,0 +1,89 @@ +/*========================= + * ջ˳洢ṹ˳ջ + ==========================*/ + +#include "SqStack.h" //**03 ջͶ**// + +/* + * ʼ + * + * һջʼɹ򷵻OK򷵻ERROR + */ +Status InitStack(SqStack* S) { + if(S == NULL) { + return ERROR; + } + + (*S).base = (SElemType*) malloc(STACK_INIT_SIZE * sizeof(SElemType)); + if((*S).base == NULL) { + exit(OVERFLOW); + } + + (*S).top = (*S).base; + (*S).stacksize = STACK_INIT_SIZE; + + return OK; +} + +/* + * ȡֵ + * + * ջԪأeա + */ +Status GetTop(SqStack S, SElemType* e) { + if(S.base == NULL || S.top == S.base) { + return ERROR; + } + + // ıջԪ + *e = *(S.top - 1); + + return OK; +} + +/* + * ջ + * + * Ԫeѹ뵽ջ + */ +Status Push(SqStack* S, SElemType e) { + if(S == NULL || (*S).base == NULL) { + return ERROR; + } + + // ջʱ׷Ӵ洢ռ + if((*S).top - (*S).base >= (*S).stacksize) { + (*S).base = (SElemType*) realloc((*S).base, ((*S).stacksize + STACKINCREMENT) * sizeof(SElemType)); + if((*S).base == NULL) { + exit(OVERFLOW); // 洢ʧ + } + + (*S).top = (*S).base + (*S).stacksize; + (*S).stacksize += STACKINCREMENT; + } + + // ջȸֵջָ + *(S->top++) = e; + + return OK; +} + +/* + * ջ + * + * ջԪصeա + */ +Status Pop(SqStack* S, SElemType* e) { + if(S == NULL || (*S).base == NULL) { + return ERROR; + } + + if((*S).top == (*S).base) { + return ERROR; + } + + // ջջָȵݼٸֵ + *e = *(--(*S).top); + + return OK; +} diff --git a/Dev-C++/ExerciseBook/04.14/SqStack.h b/Dev-C++/ExerciseBook/04.14/SqStack.h new file mode 100644 index 0000000..db29792 --- /dev/null +++ b/Dev-C++/ExerciseBook/04.14/SqStack.h @@ -0,0 +1,61 @@ +/*========================= + * ջ˳洢ṹ˳ջ + ==========================*/ + +#ifndef SQSTACK_H +#define SQSTACK_H + +#include +#include // ṩmallocreallocfreeexitԭ +#include "Status.h" //**01 **// +#include "String.h" //**04 **// + +/* 궨 */ +#define STACK_INIT_SIZE 100 // ˳ջ洢ռijʼ +#define STACKINCREMENT 10 // ˳ջ洢ռķ + +/* + * ˳ջԪͶ + * + *ע + * ԪΪַ + */ +typedef StringType SElemType; + +// ˳ջԪؽṹ +typedef struct { + SElemType* base; // ջָ + SElemType* top; // ջָ + int stacksize; // ǰѷĴ洢ռ䣬ԪΪλ +} SqStack; + + +/* + * ʼ + * + * һջʼɹ򷵻OK򷵻ERROR + */ +Status InitStack(SqStack* S); + +/* + * ȡֵ + * + * ջԪأeա + */ +Status GetTop(SqStack S, SElemType* e); + +/* + * ջ + * + * Ԫeѹ뵽ջ + */ +Status Push(SqStack* S, SElemType e); + +/* + * ջ + * + * ջԪصeա + */ +Status Pop(SqStack* S, SElemType* e); + +#endif diff --git a/Dev-C++/ExerciseBook/04.14/String.cpp b/Dev-C++/ExerciseBook/04.14/String.cpp new file mode 100644 index 0000000..41df51c --- /dev/null +++ b/Dev-C++/ExerciseBook/04.14/String.cpp @@ -0,0 +1,151 @@ +/*=========================== + * ϰ4.10~4.14ʹõַ + ============================*/ + +#include "String.h" + +// ʼһֵΪsĴt +void StrAssign(StringType* t, const char* s) { + if(s == NULL) { + *t = ""; + } + + *t = (char*) malloc((strlen(s) + 1) * sizeof(char)); + + strcpy(*t, s); +} + +// ȽϣstĴССһ£0 +int StrCompare(StringType s, StringType t) { + return strcmp(s, t); +} + +// ַsij +int StrLength(StringType s) { + return (int) strlen(s); +} + +// ӣstӺĴ +StringType Concat(StringType s, StringType t) { + StringType r; + + if(s == NULL) { + s = ""; + } + + if(t == NULL) { + t = ""; + } + + r = (char*) malloc((strlen(s) + strlen(t) + 1) * sizeof(char)); + r[0] = '\0'; + + strcat(r, s); + strcat(r, t); + + return r; +} + +// Ӵsstartλ𣬽ȡlenַ󷵻 +StringType SubString(StringType s, int start, int len) { + int n; + char* sub; + + n = (int) strlen(s); + + if(start < 1 || start > n || start + len - 1 > n || len < 0) { + return ""; + } + + sub = (char*) malloc((len + 1) * sizeof(char)); + strncpy(sub, s + start - 1, len); + sub[len] = '\0'; + + return sub; +} + +// ңsposλtҵλ +int Index(StringType s, StringType t, int pos) { + int m, n, i; + StringType sub; + + // ʧǰ + if(pos < 1 || pos > StrLength(s) || StrLength(t) == 0) { + return 0; + } + + n = StrLength(s); + m = StrLength(t); + i = pos; + + // ֤ȲԽ + while(i <= n - m + 1) { + // ȡS[i, i+m-1] + sub = SubString(s, i, m); + + // Ӵģʽƥ䣬Ҫƽ + if(StrCompare(sub, t) != 0) { + ++i; + } else { + return i; + } + } + + return 0; +} + +// 룺spost +Status StrInsert(StringType* s, int pos, StringType t) { + StringType r; + StringType s1, s2; + + if(pos < 1 || pos > StrLength(*s) + 1) { + return ERROR; + } + + r = (StringType) malloc((strlen(*s) + strlen(t) + 1) * sizeof(char)); + r[0] = '\0'; + + // ĴΪգǰ + if(StrLength(t) == 0) { + return OK; + } + + s1 = SubString(*s, 1, pos - 1); + s2 = SubString(*s, pos, (int) strlen(*s) - pos + 1); + + strcat(r, s1); + strcat(r, t); + strcat(r, s2); + + *s = r; + + return OK; +} + +// ɾsposλɾlenַ +Status StrDelete(StringType* s, int pos, int len) { + StringType r; + + if(pos < 1 || pos + len - 1 > StrLength(*s) || len < 0) { + return ERROR; + } + + // ɾijΪ0ǰ + if(len == 0) { + return OK; + } + + r = (StringType) malloc((StrLength(*s) - len + 1) * sizeof(char)); + strncpy(r, *s, pos - 1); + strcpy(r + pos - 1, *s + pos + len - 1); + + *s = r; + + return OK; +} + +// ַ +void StrPrint(StringType s) { + printf("%s\n", s); +} diff --git a/Dev-C++/ExerciseBook/04.14/String.h b/Dev-C++/ExerciseBook/04.14/String.h new file mode 100644 index 0000000..9d984af --- /dev/null +++ b/Dev-C++/ExerciseBook/04.14/String.h @@ -0,0 +1,43 @@ +/*=========================== + * ϰ4.10~4.14ʹõַ + ============================*/ + +#ifndef STRING_H +#define STRING_H + +#include +#include // ṩ strlen ԭ +#include "Status.h" //**01 **// + +/* ַ */ +typedef char* StringType; + + +// ʼһֵΪsĴt +void StrAssign(StringType* t, const char* s); + +// ȽϣstĴССһ£0 +int StrCompare(StringType s, StringType t); + +// ַsij +int StrLength(StringType s); + +// ӣstӺĴ +StringType Concat(StringType s, StringType t); + +// Ӵsstartλ𣬽ȡlenַ󷵻 +StringType SubString(StringType s, int start, int len); + +// ңsposλtҵλ +int Index(StringType s, StringType t, int pos); + +// 룺spost +Status StrInsert(StringType* s, int pos, StringType t); + +// ɾsposλɾlenַ +Status StrDelete(StringType* s, int pos, int len); + +// ַ +void StrPrint(StringType s); + +#endif diff --git a/Dev-C++/ExerciseBook/04.15-04.17/04.15-04.17.cpp b/Dev-C++/ExerciseBook/04.15-04.17/04.15-04.17.cpp new file mode 100644 index 0000000..0e74b14 --- /dev/null +++ b/Dev-C++/ExerciseBook/04.15-04.17/04.15-04.17.cpp @@ -0,0 +1,92 @@ +#include +#include "Status.h" //**01 **// +#include "SString.h" //**04 **// + +/* + * ʼStrAssign + * + *ע + * úSStringļж + */ +Status Algo_4_15(SString T, char* chars); + +/* + * ȽϣStrCompare + * + *ע + * úSStringļж + */ +int Algo_4_16(SString S, SString T); + +/* + * 滻Replace + * + *ע + * úSStringļж + */ +Status Algo_4_17(SString S, SString T, SString V); + + +int main(int argc, char* argv[]) { + char* t = "ab**c*de***fg"; + char* s = "ab**c*de***fh"; + SString T, S, M1, M2; + int i; + + printf(" 4.15 ֤...\n"); + Algo_4_15(T, t); + Algo_4_15(S, s); + printf("T = "); + StrPrint(T); + printf("S = "); + StrPrint(S); + + printf(" 4.16 ֤...\n"); + i = Algo_4_16(S, T); + if(i > 0) { + printf("S > T\n"); + } else if(i < 0) { + printf("S < T\n"); + } else { + printf("S == T\n"); + } + + printf(" 4.17 ֤...\n"); + Algo_4_15(M1, "**"); + Algo_4_15(M2, "^"); + Algo_4_17(S, M1, M2); + printf(" \"^\" 滻 \"**\" \nS = "); + StrPrint(S); + + return 0; +} + +/* + * ʼStrAssign + * + *ע + * úSStringļж + */ +Status Algo_4_15(SString T, char* chars) { + return StrAssign(T, chars); +} + +/* + * ȽϣStrCompare + * + *ע + * úSStringļж + */ +int Algo_4_16(SString S, SString T) { + return StrCompare(S, T); +} + +/* + * 滻Replace + * + *ע + * úSStringļж + */ +Status Algo_4_17(SString S, SString T, SString V) { + return Replace(S, T, V); +} diff --git a/Dev-C++/ExerciseBook/04.15-04.17/04.15-04.17.dev b/Dev-C++/ExerciseBook/04.15-04.17/04.15-04.17.dev new file mode 100644 index 0000000..a517d83 --- /dev/null +++ b/Dev-C++/ExerciseBook/04.15-04.17/04.15-04.17.dev @@ -0,0 +1,82 @@ +[Project] +FileName=04.15-04.17.dev +Name=04.15-04.17 +Type=1 +Ver=2 +ObjFiles= +Includes= +Libs= +PrivateResource= +ResourceIncludes= +MakeIncludes= +Compiler= +CppCompiler= +Linker= +IsCpp=0 +Icon= +ExeOutput= +ObjectOutput= +LogOutput= +LogOutputEnabled=0 +OverrideOutput=0 +OverrideOutputName= +HostApplication= +UseCustomMakefile=0 +CustomMakefile= +CommandLine= +Folders= +IncludeVersionInfo=0 +SupportXPThemes=0 +CompilerSet=1 +CompilerSettings=0000000000000000001000000 +UnitCount=3 + +[VersionInfo] +Major=1 +Minor=0 +Release=0 +Build=0 +LanguageID=1033 +CharsetID=1252 +CompanyName= +FileVersion= +FileDescription=Developed using the Dev-C++ IDE +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion= +AutoIncBuildNr=0 +SyncProduct=1 + +[Unit1] +FileName=04.15-04.17.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit2] +FileName=SString.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=SString.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Dev-C++/ExerciseBook/04.15-04.17/SString.cpp b/Dev-C++/ExerciseBook/04.15-04.17/SString.cpp new file mode 100644 index 0000000..fc4c757 --- /dev/null +++ b/Dev-C++/ExerciseBook/04.15-04.17/SString.cpp @@ -0,0 +1,406 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#include "SString.h" //**04 **// + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars) { + int i, len; + + len = (int) strlen(chars); + + // chars + if(len > MAXSTRLEN) { + return ERROR; + } + + T[0] = len; + for(i = 1; i <= len; i++) { + T[i] = chars[i - 1]; + } + + return OK; +} + +/* + * + * + * S١ + * + *ע + * ˳򴮵Ľṹ޷ + */ +Status DestroyString(SString S) { + return OK; +} + +/* + * + * + * Sա + */ +Status ClearString(SString S) { + // ֻҪΪ0Ϳ + S[0] = 0; + return OK; +} + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S) { + return S[0] == 0 ? TRUE : FALSE; +} + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S) { + return S[0]; +} + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len) { + int i; + + if(pos < 1 || pos > S[0] || len < 0 || pos + len - 1 > S[0]) { + return ERROR; + } + + // Ԫ + for(i = 1; i <= len; i++) { + Sub[i] = S[pos + i - 1]; + } + + // ȷ³ + Sub[0] = len; + + return OK; +} + +/* + * 㷨4.1 + * + * + * + * posʼģʽTS״γֵλãڣ򷵻0 + * ҳɹƥλá + * + *ע + * 1.ʵҪСӼ + * 2.ʵֱȽϵЧ + */ +int Index_1(SString S, SString T, int pos) { + int i, n, m; // ¼STij + SString sub; + + /* + * ʧǰ + * ̲д΢ͬ + */ + if(pos < 1 || pos > S[0] || StrEmpty(T)) { + return 0; + } + + n = StrLength(S); + m = StrLength(T); + i = pos; + + // ֤ȲԽ + while(i <= n - m + 1) { + // ȡS[i, i+m-1] + SubString(sub, S, i, m); + + // Ӵģʽƥ䣬Ҫƽ + if(StrCompare(sub, T) != 0) { + ++i; + } else { + return i; + } + } + + return 0; +} + +/* + * 㷨4.5 + * + * + * + * posʼģʽTS״γֵλãڣ򷵻0 + * ҳɹƥλá + * + *ע + * 1.ʵֲСӼ + * 2.ʵֱȽϵЧ + */ +int Index_2(SString S, SString T, int pos) { + int i = pos; + int j = 1; + + if(pos < 1 || pos > S[0] || StrEmpty(T)) { + return 0; + } + + while(i <= S[0] && j <= T[0]) { + // ַͬȽϺַ + if(S[i] == T[j]) { + i++; + j++; + + // ַͬαҪˣ±Ƚ + } else { + i = i - (j - 1) + 1; // j-1ͽ͵ǰj-1ԪأڵjԪϹһ + j = 1; // αjصTĵһλ + } + } + + // һT[0]>0ж + if(j > T[0] && T[0] > 0) { // TΪմ + return i - T[0]; // ƥɹ + } else { + return 0; + } +} + +/* + * + * + * T뵽Sposλô + */ +Status StrInsert(SString S, int pos, SString T) { + int i; + + if(pos < 1 || pos > S[0] + 1 || S[0] + T[0] > MAXSTRLEN) { + return ERROR; + } + + // ĴΪգǰ + if(StrEmpty(T)) { + return OK; + } + + // SڳλãΪT׼ + for(i = S[0]; i >= pos; i--) { + // ӺǰǰԪŲ + S[i + T[0]] = S[i]; + } + + // TSڳλ + for(i = pos; i <= pos + T[0] - 1; i++) { + S[i] = T[i - pos + 1]; + } + + // + S[0] += T[0]; + + return OK; +} + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len) { + int i; + + if(pos < 1 || pos + len - 1 > S[0] || len < 0) { + return ERROR; + } + + // ɾijΪ0ǰ + if(len == 0) { + return OK; + } + + // ѺԪŲǰ棬ǵɾԪ + for(i = pos + len; i <= S[0]; i++) { + S[i - len] = S[i]; + } + + // ȼ + S[0] -= len; + + return OK; +} + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T) { + int i = 1; + + while(i <= S[0] && i <= T[0]) { + // ַͬʱȽС + if(S[i] != T[i]) { + return S[i] - T[i]; + } + + i++; + } + + return S[0] - T[0]; +} + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S) { + int i; + + // ͬϢһ + for(i = 0; i <= S[0]; i++) { + T[i] = S[i]; + } + + return OK; +} + +/* + * 滻 + * + * V滻SгֵTȵҲصӴ + * + *ע + * 1.òСӼ + * 2.ʵֱȽϵЧ + */ +Status Replace(SString S, SString T, SString V) { + int i; + + if(StrEmpty(S) || StrEmpty(T)) { + return ERROR; + } + + // SѰģʽTһγֵλ + i = Index_2(S, T, 1); + + // ƥַҿԱȫ滻滻 + while(i != 0 && S[0] - T[0] + V[0] <= MAXSTRLEN) { + StrDelete(S, i, StrLength(T)); // SɾT + StrInsert(S, i, V); // SвV + + i += StrLength(V); // iлһλ + + i = Index_2(S, T, i); // һƥַ + } + + if(i == 0) { // SеTȫ滻 + return OK; + } else { // STVѾ岻ȥ + return ERROR; + } +} + +/* + * 㷨4.2 + * + * + * + * S1S2洢TзءӺijֻδIJ֡ + * ֵʾӺĴǷ + * + *ע + * òСӼ + */ +Status Concat(SString T, SString S1, SString S2) { + int i; + int uncut; // ´Ƿ + + // ȫҪü + if(S1[0] + S2[0] <= MAXSTRLEN) { + // S1T + for(i = 1; i <= S1[0]; i++) { + T[i] = S1[i]; + } + + // S2T + for(i = S1[0] + 1; i <= S1[0] + S2[0]; i++) { + T[i] = S2[i - S1[0]]; + } + + // ³ + T[0] = S1[0] + S2[0]; + + // δü + uncut = TRUE; + + // ҪüS2 + } else if(S1[0] <= MAXSTRLEN) { + // S1T + for(i = 1; i <= S1[0]; i++) { + T[i] = S1[i]; + } + + // S2һָƵT + for(i = S1[0] + 1; i <= MAXSTRLEN; i++) { + T[i] = S2[i - S1[0]]; + } + + // ³ + T[0] = MAXSTRLEN; + + uncut = FALSE; + + // ֻҪS1һ + } else { + // ͬϢһ + for(i = 0; i <= MAXSTRLEN; i++) { + T[i] = S1[i]; + } + + uncut = FALSE; + } + + return uncut; +} + +// ӡַ +void StrPrint(SString S) { + int i; + + for(i = 1; i<=S[0] ; i++) { + printf("%c", S[i]); + } + + printf("\n"); +} diff --git a/Dev-C++/ExerciseBook/04.15-04.17/SString.h b/Dev-C++/ExerciseBook/04.15-04.17/SString.h new file mode 100644 index 0000000..386ffb8 --- /dev/null +++ b/Dev-C++/ExerciseBook/04.15-04.17/SString.h @@ -0,0 +1,179 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#ifndef SSTRING_H +#define SSTRING_H + +#include +#include // ṩstrlenԭ +#include "Status.h" //**01 **// + +/* 궨 */ +#define MAXSTRLEN 255 // ˳򴮵󴮳 + +/* + * ˳洢Ͷ + * + * עЧԪشSString1ŵԪʼ洢 + * SString0ŵԪ洢䳤 + */ +typedef unsigned char SString[MAXSTRLEN + 1]; // 0ŵԪŴij + + +/* + * ʾ + * + * ѭ̲ĵдϰߣposָʾַλ()1ʼ + */ + + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars); + +/* + * + * + * S١ + * + *ע + * ˳򴮵Ľṹ޷ + */ +Status DestroyString(SString S); + +/* + * + * + * Sա + */ +Status ClearString(SString S); + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S); + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S); + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len); + +/* + * 㷨4.1 + * + * + * + * posʼģʽTS״γֵλãڣ򷵻0 + * ҳɹƥλá + * + *ע + * 1.ʵҪСӼ + * 2.ʵֱȽϵЧ + */ +int Index_1(SString S, SString T, int pos); + +/* + * 㷨4.5 + * + * + * + * posʼģʽTS״γֵλãڣ򷵻0 + * ҳɹƥλá + * + *ע + * 1.ʵֲСӼ + * 2.ʵֱȽϵЧ + */ +int Index_2(SString S, SString T, int pos); + +/* + * + * + * T뵽Sposλô + */ +Status StrInsert(SString S, int pos, SString T); + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len); + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T); + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S); + +/* + * 滻 + * + * V滻SгֵTȵҲصӴ + * + *ע + * òСӼЧʽϵ͡ + */ +Status Replace(SString S, SString T, SString V); + +/* + * 㷨4.2 + * + * + * + * S1S2洢TзءӺijֻδIJ֡ + * ֵʾӺĴǷ + * + *ע + * òСӼ + */ +Status Concat(SString T, SString S1, SString S2); + +// ӡַ +void StrPrint(SString S); + +#endif diff --git a/Dev-C++/ExerciseBook/04.18/04.18.cpp b/Dev-C++/ExerciseBook/04.18/04.18.cpp new file mode 100644 index 0000000..3e352c7 --- /dev/null +++ b/Dev-C++/ExerciseBook/04.18/04.18.cpp @@ -0,0 +1,62 @@ +#include +#include +#include "SString.h" //**04 **// + +/* + * ͳַSвַͬÿַĸͳƽ + */ +int* Algo_4_18(SString S); + + +int main(int argc, char* argv[]) { + char* s = "dbasydujhge638940[gptokljrsehgadcsbnmv,c.b'ng[p098437eywdghswqdecxvghju"; + SString S; + int* total; + int i; + + StrAssign(S, s); + printf("S = "); + StrPrint(S); + + total = Algo_4_18(S); + printf(" S вַͬ %d \n", total[0]); + for(i = 1; i <= 127; i++) { + if(total[i] != 0) { + printf("ַ \'%c\' %d .\n", i, total[i]); + } + } + printf("ͳ...\n"); + + return 0; +} + + +/* + * ͳַSвַͬÿַĸͳƽ + */ +int* Algo_4_18(SString S) { + int i; + int* total; + + /* + * totalΪ128 + * 0ŵԪ洢ַͬ + * Ԫ洢ֲַͬ + * + * עͳƿַ'\0' + */ + total = (int*) malloc(128 * sizeof(int)); + memset(total, 0, 128 * sizeof(int)); + + for(i = 1; i <= S[0]; i++) { + // ַͳƲַͬ + if(total[S[i]] == 0) { + total[0]++; + } + + // ͳַ + total[S[i]]++; + } + + return total; +} diff --git a/Dev-C++/ExerciseBook/04.18/04.18.dev b/Dev-C++/ExerciseBook/04.18/04.18.dev new file mode 100644 index 0000000..8178407 --- /dev/null +++ b/Dev-C++/ExerciseBook/04.18/04.18.dev @@ -0,0 +1,82 @@ +[Project] +FileName=04.18.dev +Name=04.18 +Type=1 +Ver=2 +ObjFiles= +Includes= +Libs= +PrivateResource= +ResourceIncludes= +MakeIncludes= +Compiler= +CppCompiler= +Linker= +IsCpp=0 +Icon= +ExeOutput= +ObjectOutput= +LogOutput= +LogOutputEnabled=0 +OverrideOutput=0 +OverrideOutputName= +HostApplication= +UseCustomMakefile=0 +CustomMakefile= +CommandLine= +Folders= +IncludeVersionInfo=0 +SupportXPThemes=0 +CompilerSet=1 +CompilerSettings=0000000000000000001000000 +UnitCount=3 + +[VersionInfo] +Major=1 +Minor=0 +Release=0 +Build=0 +LanguageID=1033 +CharsetID=1252 +CompanyName= +FileVersion= +FileDescription=Developed using the Dev-C++ IDE +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion= +AutoIncBuildNr=0 +SyncProduct=1 + +[Unit2] +FileName=SString.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit1] +FileName=04.18.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=SString.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Dev-C++/ExerciseBook/04.18/SString.cpp b/Dev-C++/ExerciseBook/04.18/SString.cpp new file mode 100644 index 0000000..fc4c757 --- /dev/null +++ b/Dev-C++/ExerciseBook/04.18/SString.cpp @@ -0,0 +1,406 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#include "SString.h" //**04 **// + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars) { + int i, len; + + len = (int) strlen(chars); + + // chars + if(len > MAXSTRLEN) { + return ERROR; + } + + T[0] = len; + for(i = 1; i <= len; i++) { + T[i] = chars[i - 1]; + } + + return OK; +} + +/* + * + * + * S١ + * + *ע + * ˳򴮵Ľṹ޷ + */ +Status DestroyString(SString S) { + return OK; +} + +/* + * + * + * Sա + */ +Status ClearString(SString S) { + // ֻҪΪ0Ϳ + S[0] = 0; + return OK; +} + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S) { + return S[0] == 0 ? TRUE : FALSE; +} + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S) { + return S[0]; +} + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len) { + int i; + + if(pos < 1 || pos > S[0] || len < 0 || pos + len - 1 > S[0]) { + return ERROR; + } + + // Ԫ + for(i = 1; i <= len; i++) { + Sub[i] = S[pos + i - 1]; + } + + // ȷ³ + Sub[0] = len; + + return OK; +} + +/* + * 㷨4.1 + * + * + * + * posʼģʽTS״γֵλãڣ򷵻0 + * ҳɹƥλá + * + *ע + * 1.ʵҪСӼ + * 2.ʵֱȽϵЧ + */ +int Index_1(SString S, SString T, int pos) { + int i, n, m; // ¼STij + SString sub; + + /* + * ʧǰ + * ̲д΢ͬ + */ + if(pos < 1 || pos > S[0] || StrEmpty(T)) { + return 0; + } + + n = StrLength(S); + m = StrLength(T); + i = pos; + + // ֤ȲԽ + while(i <= n - m + 1) { + // ȡS[i, i+m-1] + SubString(sub, S, i, m); + + // Ӵģʽƥ䣬Ҫƽ + if(StrCompare(sub, T) != 0) { + ++i; + } else { + return i; + } + } + + return 0; +} + +/* + * 㷨4.5 + * + * + * + * posʼģʽTS״γֵλãڣ򷵻0 + * ҳɹƥλá + * + *ע + * 1.ʵֲСӼ + * 2.ʵֱȽϵЧ + */ +int Index_2(SString S, SString T, int pos) { + int i = pos; + int j = 1; + + if(pos < 1 || pos > S[0] || StrEmpty(T)) { + return 0; + } + + while(i <= S[0] && j <= T[0]) { + // ַͬȽϺַ + if(S[i] == T[j]) { + i++; + j++; + + // ַͬαҪˣ±Ƚ + } else { + i = i - (j - 1) + 1; // j-1ͽ͵ǰj-1ԪأڵjԪϹһ + j = 1; // αjصTĵһλ + } + } + + // һT[0]>0ж + if(j > T[0] && T[0] > 0) { // TΪմ + return i - T[0]; // ƥɹ + } else { + return 0; + } +} + +/* + * + * + * T뵽Sposλô + */ +Status StrInsert(SString S, int pos, SString T) { + int i; + + if(pos < 1 || pos > S[0] + 1 || S[0] + T[0] > MAXSTRLEN) { + return ERROR; + } + + // ĴΪգǰ + if(StrEmpty(T)) { + return OK; + } + + // SڳλãΪT׼ + for(i = S[0]; i >= pos; i--) { + // ӺǰǰԪŲ + S[i + T[0]] = S[i]; + } + + // TSڳλ + for(i = pos; i <= pos + T[0] - 1; i++) { + S[i] = T[i - pos + 1]; + } + + // + S[0] += T[0]; + + return OK; +} + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len) { + int i; + + if(pos < 1 || pos + len - 1 > S[0] || len < 0) { + return ERROR; + } + + // ɾijΪ0ǰ + if(len == 0) { + return OK; + } + + // ѺԪŲǰ棬ǵɾԪ + for(i = pos + len; i <= S[0]; i++) { + S[i - len] = S[i]; + } + + // ȼ + S[0] -= len; + + return OK; +} + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T) { + int i = 1; + + while(i <= S[0] && i <= T[0]) { + // ַͬʱȽС + if(S[i] != T[i]) { + return S[i] - T[i]; + } + + i++; + } + + return S[0] - T[0]; +} + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S) { + int i; + + // ͬϢһ + for(i = 0; i <= S[0]; i++) { + T[i] = S[i]; + } + + return OK; +} + +/* + * 滻 + * + * V滻SгֵTȵҲصӴ + * + *ע + * 1.òСӼ + * 2.ʵֱȽϵЧ + */ +Status Replace(SString S, SString T, SString V) { + int i; + + if(StrEmpty(S) || StrEmpty(T)) { + return ERROR; + } + + // SѰģʽTһγֵλ + i = Index_2(S, T, 1); + + // ƥַҿԱȫ滻滻 + while(i != 0 && S[0] - T[0] + V[0] <= MAXSTRLEN) { + StrDelete(S, i, StrLength(T)); // SɾT + StrInsert(S, i, V); // SвV + + i += StrLength(V); // iлһλ + + i = Index_2(S, T, i); // һƥַ + } + + if(i == 0) { // SеTȫ滻 + return OK; + } else { // STVѾ岻ȥ + return ERROR; + } +} + +/* + * 㷨4.2 + * + * + * + * S1S2洢TзءӺijֻδIJ֡ + * ֵʾӺĴǷ + * + *ע + * òСӼ + */ +Status Concat(SString T, SString S1, SString S2) { + int i; + int uncut; // ´Ƿ + + // ȫҪü + if(S1[0] + S2[0] <= MAXSTRLEN) { + // S1T + for(i = 1; i <= S1[0]; i++) { + T[i] = S1[i]; + } + + // S2T + for(i = S1[0] + 1; i <= S1[0] + S2[0]; i++) { + T[i] = S2[i - S1[0]]; + } + + // ³ + T[0] = S1[0] + S2[0]; + + // δü + uncut = TRUE; + + // ҪüS2 + } else if(S1[0] <= MAXSTRLEN) { + // S1T + for(i = 1; i <= S1[0]; i++) { + T[i] = S1[i]; + } + + // S2һָƵT + for(i = S1[0] + 1; i <= MAXSTRLEN; i++) { + T[i] = S2[i - S1[0]]; + } + + // ³ + T[0] = MAXSTRLEN; + + uncut = FALSE; + + // ֻҪS1һ + } else { + // ͬϢһ + for(i = 0; i <= MAXSTRLEN; i++) { + T[i] = S1[i]; + } + + uncut = FALSE; + } + + return uncut; +} + +// ӡַ +void StrPrint(SString S) { + int i; + + for(i = 1; i<=S[0] ; i++) { + printf("%c", S[i]); + } + + printf("\n"); +} diff --git a/Dev-C++/ExerciseBook/04.18/SString.h b/Dev-C++/ExerciseBook/04.18/SString.h new file mode 100644 index 0000000..386ffb8 --- /dev/null +++ b/Dev-C++/ExerciseBook/04.18/SString.h @@ -0,0 +1,179 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#ifndef SSTRING_H +#define SSTRING_H + +#include +#include // ṩstrlenԭ +#include "Status.h" //**01 **// + +/* 궨 */ +#define MAXSTRLEN 255 // ˳򴮵󴮳 + +/* + * ˳洢Ͷ + * + * עЧԪشSString1ŵԪʼ洢 + * SString0ŵԪ洢䳤 + */ +typedef unsigned char SString[MAXSTRLEN + 1]; // 0ŵԪŴij + + +/* + * ʾ + * + * ѭ̲ĵдϰߣposָʾַλ()1ʼ + */ + + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars); + +/* + * + * + * S١ + * + *ע + * ˳򴮵Ľṹ޷ + */ +Status DestroyString(SString S); + +/* + * + * + * Sա + */ +Status ClearString(SString S); + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S); + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S); + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len); + +/* + * 㷨4.1 + * + * + * + * posʼģʽTS״γֵλãڣ򷵻0 + * ҳɹƥλá + * + *ע + * 1.ʵҪСӼ + * 2.ʵֱȽϵЧ + */ +int Index_1(SString S, SString T, int pos); + +/* + * 㷨4.5 + * + * + * + * posʼģʽTS״γֵλãڣ򷵻0 + * ҳɹƥλá + * + *ע + * 1.ʵֲСӼ + * 2.ʵֱȽϵЧ + */ +int Index_2(SString S, SString T, int pos); + +/* + * + * + * T뵽Sposλô + */ +Status StrInsert(SString S, int pos, SString T); + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len); + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T); + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S); + +/* + * 滻 + * + * V滻SгֵTȵҲصӴ + * + *ע + * òСӼЧʽϵ͡ + */ +Status Replace(SString S, SString T, SString V); + +/* + * 㷨4.2 + * + * + * + * S1S2洢TзءӺijֻδIJ֡ + * ֵʾӺĴǷ + * + *ע + * òСӼ + */ +Status Concat(SString T, SString S1, SString S2); + +// ӡַ +void StrPrint(SString S); + +#endif diff --git a/Dev-C++/ExerciseBook/04.19/04.19.cpp b/Dev-C++/ExerciseBook/04.19/04.19.cpp new file mode 100644 index 0000000..9a2dbf0 --- /dev/null +++ b/Dev-C++/ExerciseBook/04.19/04.19.cpp @@ -0,0 +1,77 @@ +#include +#include +#include "SString.h" //**04 **// + +/* + * R=S-STa洢RÿַSеһγֵλ + * + * עa0ŵԪ洢aԪصĸ + */ +void Algo_4_19(SString R, SString S, SString T, int** a); + + +int main(int argc, char* argv[]) { + char* s = "amdhcjgfdlpinbefcopgkqikeb"; + char* t = "mhjlpinopkqik"; + int* a; + SString T, S, R; + int i; + + printf("ʼST...\n"); + StrAssign(S, s); + StrAssign(T, t); + + printf("S = "); + StrPrint(S); + printf("T = "); + StrPrint(T); + + Algo_4_19(R, S, T, &a); + printf("R = "); + StrPrint(R); + printf("a = "); + for(i = 1; i <= a[0]; i++) { + printf("%d ", a[i]); + } + printf("\n"); + + return 0; +} + + +/* + * R=S-STa洢RÿַSеһγֵλ + * + * עa0ŵԪ洢aԪصĸ + */ +void Algo_4_19(SString R, SString S, SString T, int** a) { + int i, p; + SString ch; + + *a = (int*) malloc((StrLength(S) + 1) * sizeof(int)); + + StrAssign(R, ""); + + for(i = 1, (*a)[0] = 0; i <= StrLength(S); i++) { + // ȡַж + SubString(ch, S, i, 1); + + // ȡS[i]Tеλ + p = Index_2(T, ch, 1); + + // S[i]T + if(p == 0) { + // ȡS[i]Rеλ + p = Index_2(R, ch, 1); + } + + // S[i]ȲTУûRгֹ + if(p == 0) { + (*a)[0]++; + (*a)[(*a)[0]] = i; + + // RS[i] + StrInsert(R, (*a)[0], ch); + } + } +} diff --git a/Dev-C++/ExerciseBook/04.19/04.19.dev b/Dev-C++/ExerciseBook/04.19/04.19.dev new file mode 100644 index 0000000..ef0f901 --- /dev/null +++ b/Dev-C++/ExerciseBook/04.19/04.19.dev @@ -0,0 +1,82 @@ +[Project] +FileName=04.19.dev +Name=04.19 +Type=1 +Ver=2 +ObjFiles= +Includes= +Libs= +PrivateResource= +ResourceIncludes= +MakeIncludes= +Compiler= +CppCompiler= +Linker= +IsCpp=0 +Icon= +ExeOutput= +ObjectOutput= +LogOutput= +LogOutputEnabled=0 +OverrideOutput=0 +OverrideOutputName= +HostApplication= +UseCustomMakefile=0 +CustomMakefile= +CommandLine= +Folders= +IncludeVersionInfo=0 +SupportXPThemes=0 +CompilerSet=1 +CompilerSettings=0000000000000000001000000 +UnitCount=3 + +[VersionInfo] +Major=1 +Minor=0 +Release=0 +Build=0 +LanguageID=1033 +CharsetID=1252 +CompanyName= +FileVersion= +FileDescription=Developed using the Dev-C++ IDE +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion= +AutoIncBuildNr=0 +SyncProduct=1 + +[Unit2] +FileName=SString.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit1] +FileName=04.19.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=SString.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Dev-C++/ExerciseBook/04.19/SString.cpp b/Dev-C++/ExerciseBook/04.19/SString.cpp new file mode 100644 index 0000000..fc4c757 --- /dev/null +++ b/Dev-C++/ExerciseBook/04.19/SString.cpp @@ -0,0 +1,406 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#include "SString.h" //**04 **// + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars) { + int i, len; + + len = (int) strlen(chars); + + // chars + if(len > MAXSTRLEN) { + return ERROR; + } + + T[0] = len; + for(i = 1; i <= len; i++) { + T[i] = chars[i - 1]; + } + + return OK; +} + +/* + * + * + * S١ + * + *ע + * ˳򴮵Ľṹ޷ + */ +Status DestroyString(SString S) { + return OK; +} + +/* + * + * + * Sա + */ +Status ClearString(SString S) { + // ֻҪΪ0Ϳ + S[0] = 0; + return OK; +} + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S) { + return S[0] == 0 ? TRUE : FALSE; +} + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S) { + return S[0]; +} + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len) { + int i; + + if(pos < 1 || pos > S[0] || len < 0 || pos + len - 1 > S[0]) { + return ERROR; + } + + // Ԫ + for(i = 1; i <= len; i++) { + Sub[i] = S[pos + i - 1]; + } + + // ȷ³ + Sub[0] = len; + + return OK; +} + +/* + * 㷨4.1 + * + * + * + * posʼģʽTS״γֵλãڣ򷵻0 + * ҳɹƥλá + * + *ע + * 1.ʵҪСӼ + * 2.ʵֱȽϵЧ + */ +int Index_1(SString S, SString T, int pos) { + int i, n, m; // ¼STij + SString sub; + + /* + * ʧǰ + * ̲д΢ͬ + */ + if(pos < 1 || pos > S[0] || StrEmpty(T)) { + return 0; + } + + n = StrLength(S); + m = StrLength(T); + i = pos; + + // ֤ȲԽ + while(i <= n - m + 1) { + // ȡS[i, i+m-1] + SubString(sub, S, i, m); + + // Ӵģʽƥ䣬Ҫƽ + if(StrCompare(sub, T) != 0) { + ++i; + } else { + return i; + } + } + + return 0; +} + +/* + * 㷨4.5 + * + * + * + * posʼģʽTS״γֵλãڣ򷵻0 + * ҳɹƥλá + * + *ע + * 1.ʵֲСӼ + * 2.ʵֱȽϵЧ + */ +int Index_2(SString S, SString T, int pos) { + int i = pos; + int j = 1; + + if(pos < 1 || pos > S[0] || StrEmpty(T)) { + return 0; + } + + while(i <= S[0] && j <= T[0]) { + // ַͬȽϺַ + if(S[i] == T[j]) { + i++; + j++; + + // ַͬαҪˣ±Ƚ + } else { + i = i - (j - 1) + 1; // j-1ͽ͵ǰj-1ԪأڵjԪϹһ + j = 1; // αjصTĵһλ + } + } + + // һT[0]>0ж + if(j > T[0] && T[0] > 0) { // TΪմ + return i - T[0]; // ƥɹ + } else { + return 0; + } +} + +/* + * + * + * T뵽Sposλô + */ +Status StrInsert(SString S, int pos, SString T) { + int i; + + if(pos < 1 || pos > S[0] + 1 || S[0] + T[0] > MAXSTRLEN) { + return ERROR; + } + + // ĴΪգǰ + if(StrEmpty(T)) { + return OK; + } + + // SڳλãΪT׼ + for(i = S[0]; i >= pos; i--) { + // ӺǰǰԪŲ + S[i + T[0]] = S[i]; + } + + // TSڳλ + for(i = pos; i <= pos + T[0] - 1; i++) { + S[i] = T[i - pos + 1]; + } + + // + S[0] += T[0]; + + return OK; +} + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len) { + int i; + + if(pos < 1 || pos + len - 1 > S[0] || len < 0) { + return ERROR; + } + + // ɾijΪ0ǰ + if(len == 0) { + return OK; + } + + // ѺԪŲǰ棬ǵɾԪ + for(i = pos + len; i <= S[0]; i++) { + S[i - len] = S[i]; + } + + // ȼ + S[0] -= len; + + return OK; +} + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T) { + int i = 1; + + while(i <= S[0] && i <= T[0]) { + // ַͬʱȽС + if(S[i] != T[i]) { + return S[i] - T[i]; + } + + i++; + } + + return S[0] - T[0]; +} + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S) { + int i; + + // ͬϢһ + for(i = 0; i <= S[0]; i++) { + T[i] = S[i]; + } + + return OK; +} + +/* + * 滻 + * + * V滻SгֵTȵҲصӴ + * + *ע + * 1.òСӼ + * 2.ʵֱȽϵЧ + */ +Status Replace(SString S, SString T, SString V) { + int i; + + if(StrEmpty(S) || StrEmpty(T)) { + return ERROR; + } + + // SѰģʽTһγֵλ + i = Index_2(S, T, 1); + + // ƥַҿԱȫ滻滻 + while(i != 0 && S[0] - T[0] + V[0] <= MAXSTRLEN) { + StrDelete(S, i, StrLength(T)); // SɾT + StrInsert(S, i, V); // SвV + + i += StrLength(V); // iлһλ + + i = Index_2(S, T, i); // һƥַ + } + + if(i == 0) { // SеTȫ滻 + return OK; + } else { // STVѾ岻ȥ + return ERROR; + } +} + +/* + * 㷨4.2 + * + * + * + * S1S2洢TзءӺijֻδIJ֡ + * ֵʾӺĴǷ + * + *ע + * òСӼ + */ +Status Concat(SString T, SString S1, SString S2) { + int i; + int uncut; // ´Ƿ + + // ȫҪü + if(S1[0] + S2[0] <= MAXSTRLEN) { + // S1T + for(i = 1; i <= S1[0]; i++) { + T[i] = S1[i]; + } + + // S2T + for(i = S1[0] + 1; i <= S1[0] + S2[0]; i++) { + T[i] = S2[i - S1[0]]; + } + + // ³ + T[0] = S1[0] + S2[0]; + + // δü + uncut = TRUE; + + // ҪüS2 + } else if(S1[0] <= MAXSTRLEN) { + // S1T + for(i = 1; i <= S1[0]; i++) { + T[i] = S1[i]; + } + + // S2һָƵT + for(i = S1[0] + 1; i <= MAXSTRLEN; i++) { + T[i] = S2[i - S1[0]]; + } + + // ³ + T[0] = MAXSTRLEN; + + uncut = FALSE; + + // ֻҪS1һ + } else { + // ͬϢһ + for(i = 0; i <= MAXSTRLEN; i++) { + T[i] = S1[i]; + } + + uncut = FALSE; + } + + return uncut; +} + +// ӡַ +void StrPrint(SString S) { + int i; + + for(i = 1; i<=S[0] ; i++) { + printf("%c", S[i]); + } + + printf("\n"); +} diff --git a/Dev-C++/ExerciseBook/04.19/SString.h b/Dev-C++/ExerciseBook/04.19/SString.h new file mode 100644 index 0000000..386ffb8 --- /dev/null +++ b/Dev-C++/ExerciseBook/04.19/SString.h @@ -0,0 +1,179 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#ifndef SSTRING_H +#define SSTRING_H + +#include +#include // ṩstrlenԭ +#include "Status.h" //**01 **// + +/* 궨 */ +#define MAXSTRLEN 255 // ˳򴮵󴮳 + +/* + * ˳洢Ͷ + * + * עЧԪشSString1ŵԪʼ洢 + * SString0ŵԪ洢䳤 + */ +typedef unsigned char SString[MAXSTRLEN + 1]; // 0ŵԪŴij + + +/* + * ʾ + * + * ѭ̲ĵдϰߣposָʾַλ()1ʼ + */ + + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars); + +/* + * + * + * S١ + * + *ע + * ˳򴮵Ľṹ޷ + */ +Status DestroyString(SString S); + +/* + * + * + * Sա + */ +Status ClearString(SString S); + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S); + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S); + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len); + +/* + * 㷨4.1 + * + * + * + * posʼģʽTS״γֵλãڣ򷵻0 + * ҳɹƥλá + * + *ע + * 1.ʵҪСӼ + * 2.ʵֱȽϵЧ + */ +int Index_1(SString S, SString T, int pos); + +/* + * 㷨4.5 + * + * + * + * posʼģʽTS״γֵλãڣ򷵻0 + * ҳɹƥλá + * + *ע + * 1.ʵֲСӼ + * 2.ʵֱȽϵЧ + */ +int Index_2(SString S, SString T, int pos); + +/* + * + * + * T뵽Sposλô + */ +Status StrInsert(SString S, int pos, SString T); + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len); + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T); + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S); + +/* + * 滻 + * + * V滻SгֵTȵҲصӴ + * + *ע + * òСӼЧʽϵ͡ + */ +Status Replace(SString S, SString T, SString V); + +/* + * 㷨4.2 + * + * + * + * S1S2洢TзءӺijֻδIJ֡ + * ֵʾӺĴǷ + * + *ע + * òСӼ + */ +Status Concat(SString T, SString S1, SString S2); + +// ӡַ +void StrPrint(SString S); + +#endif diff --git a/Dev-C++/ExerciseBook/04.20/04.20.cpp b/Dev-C++/ExerciseBook/04.20/04.20.cpp new file mode 100644 index 0000000..0a839aa --- /dev/null +++ b/Dev-C++/ExerciseBook/04.20/04.20.cpp @@ -0,0 +1,47 @@ +#include +#include "Status.h" //**01 **// +#include "SString.h" //**04 **// + +/* + * ɾSаT + */ +Status Algo_4_20(SString S, SString T); + + +int main(int argc, char* argv[]) { + char* s = "----***--*-**-****-*****-----"; + char* t = "**"; + SString T, S; + + printf("ɾǰ...\n"); + StrAssign(S, s); + StrAssign(T, t); + printf("S = "); + StrPrint(S); + printf("T = "); + StrPrint(T); + + printf("ɾ...\n"); + printf("S = "); + Algo_4_20(S, T); + StrPrint(S); + + return 0; +} + + +/* + * ɾSаT + */ +Status Algo_4_20(SString S, SString T) { + int i; + + // SвTҵɾ + while((i = Index_2(S, T, 1)) != 0) { + if(StrDelete(S, i, StrLength(T)) == ERROR) { + return ERROR; + } + } + + return OK; +} diff --git a/Dev-C++/ExerciseBook/04.20/04.20.dev b/Dev-C++/ExerciseBook/04.20/04.20.dev new file mode 100644 index 0000000..f480545 --- /dev/null +++ b/Dev-C++/ExerciseBook/04.20/04.20.dev @@ -0,0 +1,82 @@ +[Project] +FileName=04.20.dev +Name=04.20 +Type=1 +Ver=2 +ObjFiles= +Includes= +Libs= +PrivateResource= +ResourceIncludes= +MakeIncludes= +Compiler= +CppCompiler= +Linker= +IsCpp=0 +Icon= +ExeOutput= +ObjectOutput= +LogOutput= +LogOutputEnabled=0 +OverrideOutput=0 +OverrideOutputName= +HostApplication= +UseCustomMakefile=0 +CustomMakefile= +CommandLine= +Folders= +IncludeVersionInfo=0 +SupportXPThemes=0 +CompilerSet=1 +CompilerSettings=0000000000000000001000000 +UnitCount=3 + +[VersionInfo] +Major=1 +Minor=0 +Release=0 +Build=0 +LanguageID=1033 +CharsetID=1252 +CompanyName= +FileVersion= +FileDescription=Developed using the Dev-C++ IDE +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion= +AutoIncBuildNr=0 +SyncProduct=1 + +[Unit2] +FileName=SString.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit1] +FileName=04.20.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=SString.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Dev-C++/ExerciseBook/04.20/SString.cpp b/Dev-C++/ExerciseBook/04.20/SString.cpp new file mode 100644 index 0000000..fc4c757 --- /dev/null +++ b/Dev-C++/ExerciseBook/04.20/SString.cpp @@ -0,0 +1,406 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#include "SString.h" //**04 **// + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars) { + int i, len; + + len = (int) strlen(chars); + + // chars + if(len > MAXSTRLEN) { + return ERROR; + } + + T[0] = len; + for(i = 1; i <= len; i++) { + T[i] = chars[i - 1]; + } + + return OK; +} + +/* + * + * + * S١ + * + *ע + * ˳򴮵Ľṹ޷ + */ +Status DestroyString(SString S) { + return OK; +} + +/* + * + * + * Sա + */ +Status ClearString(SString S) { + // ֻҪΪ0Ϳ + S[0] = 0; + return OK; +} + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S) { + return S[0] == 0 ? TRUE : FALSE; +} + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S) { + return S[0]; +} + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len) { + int i; + + if(pos < 1 || pos > S[0] || len < 0 || pos + len - 1 > S[0]) { + return ERROR; + } + + // Ԫ + for(i = 1; i <= len; i++) { + Sub[i] = S[pos + i - 1]; + } + + // ȷ³ + Sub[0] = len; + + return OK; +} + +/* + * 㷨4.1 + * + * + * + * posʼģʽTS״γֵλãڣ򷵻0 + * ҳɹƥλá + * + *ע + * 1.ʵҪСӼ + * 2.ʵֱȽϵЧ + */ +int Index_1(SString S, SString T, int pos) { + int i, n, m; // ¼STij + SString sub; + + /* + * ʧǰ + * ̲д΢ͬ + */ + if(pos < 1 || pos > S[0] || StrEmpty(T)) { + return 0; + } + + n = StrLength(S); + m = StrLength(T); + i = pos; + + // ֤ȲԽ + while(i <= n - m + 1) { + // ȡS[i, i+m-1] + SubString(sub, S, i, m); + + // Ӵģʽƥ䣬Ҫƽ + if(StrCompare(sub, T) != 0) { + ++i; + } else { + return i; + } + } + + return 0; +} + +/* + * 㷨4.5 + * + * + * + * posʼģʽTS״γֵλãڣ򷵻0 + * ҳɹƥλá + * + *ע + * 1.ʵֲСӼ + * 2.ʵֱȽϵЧ + */ +int Index_2(SString S, SString T, int pos) { + int i = pos; + int j = 1; + + if(pos < 1 || pos > S[0] || StrEmpty(T)) { + return 0; + } + + while(i <= S[0] && j <= T[0]) { + // ַͬȽϺַ + if(S[i] == T[j]) { + i++; + j++; + + // ַͬαҪˣ±Ƚ + } else { + i = i - (j - 1) + 1; // j-1ͽ͵ǰj-1ԪأڵjԪϹһ + j = 1; // αjصTĵһλ + } + } + + // һT[0]>0ж + if(j > T[0] && T[0] > 0) { // TΪմ + return i - T[0]; // ƥɹ + } else { + return 0; + } +} + +/* + * + * + * T뵽Sposλô + */ +Status StrInsert(SString S, int pos, SString T) { + int i; + + if(pos < 1 || pos > S[0] + 1 || S[0] + T[0] > MAXSTRLEN) { + return ERROR; + } + + // ĴΪգǰ + if(StrEmpty(T)) { + return OK; + } + + // SڳλãΪT׼ + for(i = S[0]; i >= pos; i--) { + // ӺǰǰԪŲ + S[i + T[0]] = S[i]; + } + + // TSڳλ + for(i = pos; i <= pos + T[0] - 1; i++) { + S[i] = T[i - pos + 1]; + } + + // + S[0] += T[0]; + + return OK; +} + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len) { + int i; + + if(pos < 1 || pos + len - 1 > S[0] || len < 0) { + return ERROR; + } + + // ɾijΪ0ǰ + if(len == 0) { + return OK; + } + + // ѺԪŲǰ棬ǵɾԪ + for(i = pos + len; i <= S[0]; i++) { + S[i - len] = S[i]; + } + + // ȼ + S[0] -= len; + + return OK; +} + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T) { + int i = 1; + + while(i <= S[0] && i <= T[0]) { + // ַͬʱȽС + if(S[i] != T[i]) { + return S[i] - T[i]; + } + + i++; + } + + return S[0] - T[0]; +} + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S) { + int i; + + // ͬϢһ + for(i = 0; i <= S[0]; i++) { + T[i] = S[i]; + } + + return OK; +} + +/* + * 滻 + * + * V滻SгֵTȵҲصӴ + * + *ע + * 1.òСӼ + * 2.ʵֱȽϵЧ + */ +Status Replace(SString S, SString T, SString V) { + int i; + + if(StrEmpty(S) || StrEmpty(T)) { + return ERROR; + } + + // SѰģʽTһγֵλ + i = Index_2(S, T, 1); + + // ƥַҿԱȫ滻滻 + while(i != 0 && S[0] - T[0] + V[0] <= MAXSTRLEN) { + StrDelete(S, i, StrLength(T)); // SɾT + StrInsert(S, i, V); // SвV + + i += StrLength(V); // iлһλ + + i = Index_2(S, T, i); // һƥַ + } + + if(i == 0) { // SеTȫ滻 + return OK; + } else { // STVѾ岻ȥ + return ERROR; + } +} + +/* + * 㷨4.2 + * + * + * + * S1S2洢TзءӺijֻδIJ֡ + * ֵʾӺĴǷ + * + *ע + * òСӼ + */ +Status Concat(SString T, SString S1, SString S2) { + int i; + int uncut; // ´Ƿ + + // ȫҪü + if(S1[0] + S2[0] <= MAXSTRLEN) { + // S1T + for(i = 1; i <= S1[0]; i++) { + T[i] = S1[i]; + } + + // S2T + for(i = S1[0] + 1; i <= S1[0] + S2[0]; i++) { + T[i] = S2[i - S1[0]]; + } + + // ³ + T[0] = S1[0] + S2[0]; + + // δü + uncut = TRUE; + + // ҪüS2 + } else if(S1[0] <= MAXSTRLEN) { + // S1T + for(i = 1; i <= S1[0]; i++) { + T[i] = S1[i]; + } + + // S2һָƵT + for(i = S1[0] + 1; i <= MAXSTRLEN; i++) { + T[i] = S2[i - S1[0]]; + } + + // ³ + T[0] = MAXSTRLEN; + + uncut = FALSE; + + // ֻҪS1һ + } else { + // ͬϢһ + for(i = 0; i <= MAXSTRLEN; i++) { + T[i] = S1[i]; + } + + uncut = FALSE; + } + + return uncut; +} + +// ӡַ +void StrPrint(SString S) { + int i; + + for(i = 1; i<=S[0] ; i++) { + printf("%c", S[i]); + } + + printf("\n"); +} diff --git a/Dev-C++/ExerciseBook/04.20/SString.h b/Dev-C++/ExerciseBook/04.20/SString.h new file mode 100644 index 0000000..386ffb8 --- /dev/null +++ b/Dev-C++/ExerciseBook/04.20/SString.h @@ -0,0 +1,179 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#ifndef SSTRING_H +#define SSTRING_H + +#include +#include // ṩstrlenԭ +#include "Status.h" //**01 **// + +/* 궨 */ +#define MAXSTRLEN 255 // ˳򴮵󴮳 + +/* + * ˳洢Ͷ + * + * עЧԪشSString1ŵԪʼ洢 + * SString0ŵԪ洢䳤 + */ +typedef unsigned char SString[MAXSTRLEN + 1]; // 0ŵԪŴij + + +/* + * ʾ + * + * ѭ̲ĵдϰߣposָʾַλ()1ʼ + */ + + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars); + +/* + * + * + * S١ + * + *ע + * ˳򴮵Ľṹ޷ + */ +Status DestroyString(SString S); + +/* + * + * + * Sա + */ +Status ClearString(SString S); + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S); + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S); + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len); + +/* + * 㷨4.1 + * + * + * + * posʼģʽTS״γֵλãڣ򷵻0 + * ҳɹƥλá + * + *ע + * 1.ʵҪСӼ + * 2.ʵֱȽϵЧ + */ +int Index_1(SString S, SString T, int pos); + +/* + * 㷨4.5 + * + * + * + * posʼģʽTS״γֵλãڣ򷵻0 + * ҳɹƥλá + * + *ע + * 1.ʵֲСӼ + * 2.ʵֱȽϵЧ + */ +int Index_2(SString S, SString T, int pos); + +/* + * + * + * T뵽Sposλô + */ +Status StrInsert(SString S, int pos, SString T); + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len); + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T); + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S); + +/* + * 滻 + * + * V滻SгֵTȵҲصӴ + * + *ע + * òСӼЧʽϵ͡ + */ +Status Replace(SString S, SString T, SString V); + +/* + * 㷨4.2 + * + * + * + * S1S2洢TзءӺijֻδIJ֡ + * ֵʾӺĴǷ + * + *ע + * òСӼ + */ +Status Concat(SString T, SString S1, SString S2); + +// ӡַ +void StrPrint(SString S); + +#endif diff --git a/Dev-C++/ExerciseBook/04.21/04.21.cpp b/Dev-C++/ExerciseBook/04.21/04.21.cpp new file mode 100644 index 0000000..c9a2ab7 --- /dev/null +++ b/Dev-C++/ExerciseBook/04.21/04.21.cpp @@ -0,0 +1,336 @@ +#include +#include // ṩ mallocreallocfreeexit ԭ +#include +#include "Status.h" //**01 **// + +/* + * ԪͶ + * + *ע + * ȻַԪȻintԭǣ + * 1.Ҫͷ洢intֱchar + * 2.charintݣԽȻintҲ洢char + */ +typedef int ElemType; + +/* + * ṹ + * + * עĵͷ + */ +typedef struct SNode { + ElemType data; // ݽ + struct SNode* next; // ָһָ +} SNode; + +// ָָ룬ַ +typedef SNode* String; + + +/* + * ʼ + * + * һֵΪcharsĴT + */ +Status StrAssign_4_21(String* S, char* chars); + +/* + * + * + * SƵT + */ +Status StrCopy_4_21(String* S, String T); + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + */ +int StrCompare_4_21(String S, String T); + +/* + * + * + * شSԪصĸ + */ +int StrLength_4_21(String S); + +/* + * + * + * S1S2洢TзءӺijֻδIJ֡ + * ֵʾӺĴǷ + */ +Status Concat_4_21(String* R, String S1, String S2); + +/* + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + */ +Status SubString_4_21(String* Sub, String S, int pos, int len); + +// ַ +void StrPrint_4_21(String S); + + +int main(int argc, char* argv[]) { + char* chars = "0123456789"; + String S, T; + int i; + + printf(" StrAssign \n"); + { + printf(" Ϊ˳ S ֵ...\n"); + StrAssign_4_21(&S, chars); + printf(" S = "); + StrPrint_4_21(S); + } + PressEnterToContinue(); + + printf(" StrLength \n"); + { + i = StrLength_4_21(S); + printf(" S ijΪ %d \n", i); + } + PressEnterToContinue(); + + printf(" StrCopy \n"); + { + printf(" S T ...\n"); + StrCopy_4_21(&T, S); + printf(" T = "); + StrPrint_4_21(T); + } + PressEnterToContinue(); + + printf(" StrCompare \n"); + { + printf(" Ƚַ S T ...\n"); + i = StrCompare_4_21(S, T); + i == 0 ? printf(" S==T\n") : (i < 0 ? printf(" ST\n")); + } + PressEnterToContinue(); + + printf(" SubString \n"); + { + String Sub; + + printf(" Sub S е 6 ַ 5 ַ...\n"); + SubString_4_21(&Sub, S, 6, 5); + printf(" Sub = "); + StrPrint_4_21(Sub); + } + PressEnterToContinue(); + + + printf(" Concat \n"); + { + String Tmp, S1, S2; + + StrAssign_4_21(&S1, "+++++"); + StrAssign_4_21(&S2, "-----"); + + printf(" \"+++++\" \"-----\" γ Tmp ...\n"); + Concat_4_21(&Tmp, S1, S2); + printf(" Tmp = "); + StrPrint_4_21(Tmp); + } + PressEnterToContinue(); + + return 0; +} + + +/* + * ʼ + * + * һֵΪcharsĴT + */ +Status StrAssign_4_21(String* S, char* chars) { + int i, len; + String p; + + if(S == NULL || chars == NULL) { + return ERROR; + } + + len = (int) strlen(chars); + + *S = (SNode*) malloc(sizeof(SNode)); + (*S)->data = len; + + p = *S; + + for(i = 0; i < len; i++) { + p->next = (SNode*) malloc(sizeof(SNode)); + p->next->data = chars[i]; + p = p->next; + } + + p->next = NULL; + + return OK; +} + +/* + * + * + * SƵT + */ +Status StrCopy_4_21(String* S, String T) { + String p, r, t; + + if(S == NULL || T == NULL) { + return ERROR; + } + + for(t = T; t != NULL; t = t->next) { + r = (SNode*) malloc(sizeof(SNode)); + r->data = t->data; + + if(t == T) { + *S = r; + p = r; + } else { + p->next = r; + p = p->next; + } + } + + p->next = NULL; + + return OK; +} + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + */ +int StrCompare_4_21(String S, String T) { + String s, t; + + if(S == NULL || T == NULL) { + return StrLength_4_21(S) - StrLength_4_21(T); + } + + s = S->next; + t = T->next; + + while(s != NULL && t != NULL) { + if(s->data != t->data) { + return s->data - t->data; + } + + s = s->next; + t = t->next; + } + + if(s == NULL && t != NULL) { + return -1; + } else if(s != NULL && t == NULL) { + return 1; + } else { + return 0; + } +} + +/* + * + * + * شSԪصĸ + */ +int StrLength_4_21(String S) { + return S == NULL ? 0 : S->data; +} + +/* + * + * + * S1S2洢TзءӺijֻδIJ֡ + * ֵʾӺĴǷ + */ +Status Concat_4_21(String* R, String S1, String S2) { + String r, s, p; + + if(R == NULL || S1 == NULL || S2 == NULL) { + return ERROR; + } + + *R = (SNode*) malloc(sizeof(SNode)); + (*R)->data = S1->data + S2->data; + + r = *R; + + for(s = S1->next; s != NULL; s = s->next) { + p = (SNode*) malloc(sizeof(SNode)); + p->data = s->data; + r->next = p; + r = r->next; + } + + for(s = S2->next; s != NULL; s = s->next) { + p = (SNode*) malloc(sizeof(SNode)); + p->data = s->data; + r->next = p; + r = r->next; + } + + r->next = NULL; + + return OK; +} + +/* + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + */ +Status SubString_4_21(String* Sub, String S, int pos, int len) { + int i, slen; + String sub, s, p; + + slen = StrLength_4_21(S); + + if(Sub == NULL || S == NULL || pos < 1 || pos > slen || len < 0 || pos + len - 1 > slen) { + return ERROR; + } + + *Sub = (SNode*) malloc(sizeof(SNode)); + (*Sub)->data = len; + + for(i = 0, s = S; i < pos; i++, s = s->next) { + // ҵpos㣬sָ + } + + sub = *Sub; + + for(i = 0; i < len; i++) { + sub->next = (SNode*) malloc(sizeof(SNode)); + sub->next->data = s->data; + sub = sub->next; + + s = s->next; + } + + sub->next = NULL; + + return OK; +} + +// ַ +void StrPrint_4_21(String S) { + String p; + + if(S == NULL) { + return; + } + + for(p = S->next; p != NULL; p = p->next) { + printf("%c", p->data); + } + printf("\n"); +} diff --git a/Dev-C++/ExerciseBook/04.21/04.21.dev b/Dev-C++/ExerciseBook/04.21/04.21.dev new file mode 100644 index 0000000..1237973 --- /dev/null +++ b/Dev-C++/ExerciseBook/04.21/04.21.dev @@ -0,0 +1,62 @@ +[Project] +FileName=04.21.dev +Name=04.21 +Type=1 +Ver=2 +ObjFiles= +Includes= +Libs= +PrivateResource= +ResourceIncludes= +MakeIncludes= +Compiler= +CppCompiler= +Linker= +IsCpp=0 +Icon= +ExeOutput= +ObjectOutput= +LogOutput= +LogOutputEnabled=0 +OverrideOutput=0 +OverrideOutputName= +HostApplication= +UseCustomMakefile=0 +CustomMakefile= +CommandLine= +Folders= +IncludeVersionInfo=0 +SupportXPThemes=0 +CompilerSet=1 +CompilerSettings=0000000000000000001000000 +UnitCount=1 + +[VersionInfo] +Major=1 +Minor=0 +Release=0 +Build=0 +LanguageID=1033 +CharsetID=1252 +CompanyName= +FileVersion= +FileDescription=Developed using the Dev-C++ IDE +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion= +AutoIncBuildNr=0 +SyncProduct=1 + +[Unit1] +FileName=04.21.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Dev-C++/ExerciseBook/04.22/04.22.cpp b/Dev-C++/ExerciseBook/04.22/04.22.cpp new file mode 100644 index 0000000..e493de2 --- /dev/null +++ b/Dev-C++/ExerciseBook/04.22/04.22.cpp @@ -0,0 +1,59 @@ +#include +#include "LString.h" //**04 **// + +/* + * S뵽Tеַc֮ + * жcS뵽ұTʱ׸c֮ + * TڲcS뵽Tĩβ + */ +void Algo_4_22(LString* T, char ch, LString S); + + +int main(int argc, char* argv[]) { + char* t = "----***--*-**-**^**-*****-----"; + char* s = "12345"; + char ch = '^'; + LString T, S; + + StrAssign(&T, t); + StrAssign(&S, s); + printf("T = "); + StrPrint(T); + printf("S = "); + StrPrint(S); + + Algo_4_22(&T, ch, S); + printf("T = "); + StrPrint(T); + + return 0; +} + + +/* + * S뵽Tеַc֮ + * жcS뵽ұTʱ׸c֮ + * TڲcS뵽Tĩβ + */ +void Algo_4_22(LString* T, char c, LString S) { + int i; + char tmp[2]; + LString Tmp; + + // Ŀ괮 + tmp[0] = c; + tmp[1] = '\0'; + StrAssign(&Tmp, tmp); + + // ѰַcTеλ + i = Index((*T), Tmp, 1); + + // ҵcS뵽ַc֮ + if(i != 0) { + StrInsert(T, i + 1, S); + + // ûҵcS뵽Tĩβ + } else { + StrInsert(T, (*T).curlen + 1, S); + } +} diff --git a/Dev-C++/ExerciseBook/04.22/04.22.dev b/Dev-C++/ExerciseBook/04.22/04.22.dev new file mode 100644 index 0000000..ed5a78a --- /dev/null +++ b/Dev-C++/ExerciseBook/04.22/04.22.dev @@ -0,0 +1,82 @@ +[Project] +FileName=04.22.dev +Name=04.22 +Type=1 +Ver=2 +ObjFiles= +Includes= +Libs= +PrivateResource= +ResourceIncludes= +MakeIncludes= +Compiler= +CppCompiler= +Linker= +IsCpp=0 +Icon= +ExeOutput= +ObjectOutput= +LogOutput= +LogOutputEnabled=0 +OverrideOutput=0 +OverrideOutputName= +HostApplication= +UseCustomMakefile=0 +CustomMakefile= +CommandLine= +Folders= +IncludeVersionInfo=0 +SupportXPThemes=0 +CompilerSet=1 +CompilerSettings=0000000000000000001000000 +UnitCount=3 + +[VersionInfo] +Major=1 +Minor=0 +Release=0 +Build=0 +LanguageID=1033 +CharsetID=1252 +CompanyName= +FileVersion= +FileDescription=Developed using the Dev-C++ IDE +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion= +AutoIncBuildNr=0 +SyncProduct=1 + +[Unit2] +FileName=LString.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit1] +FileName=04.22.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=LString.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Dev-C++/ExerciseBook/04.22/LString.cpp b/Dev-C++/ExerciseBook/04.22/LString.cpp new file mode 100644 index 0000000..954ac09 --- /dev/null +++ b/Dev-C++/ExerciseBook/04.22/LString.cpp @@ -0,0 +1,747 @@ +/*============================= + * Ŀ洢ʾ + ==============================*/ + +#include "LString.h" //**04 **// + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(LString* T, const char* chars) { + int len; // charsij + int i, count; // ַcharsα + int m; // ܿ + int n; // δĿ飬洢ÿеЧԪ + Chunk* r; + + // charsij + len = (int) strlen(chars); + + // ûЧԪ + if(len == 0) { + (*T).head = NULL; + (*T).tail = NULL; + (*T).curlen = 0; + + return OK; + } + + m = len / CHUNKSIZE; // ȼҪĿ + n = len % CHUNKSIZE; // δĿ飬ÿЧԪ + if(n != 0) { + m++; // ܿ + } + + // 1.Ľṹ + for(i = 1; i <= m; i++) { + // ¿ + r = (Chunk*) malloc(sizeof(Chunk)); + if(r == NULL) { + exit(OVERFLOW); + } + r->next = NULL; + + // һ + if(i == 1) { + (*T).head = (*T).tail = r; + + // ӺĿ + } else { + (*T).tail->next = r; + (*T).tail = r; + } + } + + r = (*T).head; + i = 0; // Tα + count = 0; // ͳƱԪأ˳Ϊcharsα + + // 2.Ϊ + while(count < len) { + r->ch[i] = chars[count]; + + i = (i + 1) % CHUNKSIZE; + if(i == 0) { + r = r->next; // ָһ + } + + count++; + } + + // 3.δĿ + if(n != 0) { + // Ǵֵ('\0') + while(i < CHUNKSIZE) { + (*T).tail->ch[i] = '\0'; + i++; + } + } + + // 4.¼Ϣ + (*T).curlen = len; + + return OK; +} + +/* + * + * + *ע + * Ľṹ٣ٲ + */ +Status DestroyString(LString* S) { + return OK; +} + +/* + * + * + * Sա + */ +Status ClearString(LString* S) { + Chunk* p, * q; + + p = (*S).head; + + // ͷдռõĿռ + while(p != NULL) { + q = p->next; + free(p); + p = q; + } + + (*S).head = NULL; + (*S).tail = NULL; + (*S).curlen = 0; + + return OK; +} + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(LString S) { + return S.curlen == 0 ? TRUE : FALSE; +} + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(LString S) { + return S.curlen; +} + +/* + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(LString* Sub, LString S, int pos, int len) { + int m; // Subܿ + int n; // SubδĿ飬洢ÿеЧԪ + int i, j, count; + Chunk* r, * p; + + if(pos < 1 || pos > S.curlen || len < 0 || pos + len - 1 > S.curlen) { + return ERROR; + } + + // ǽȡ0ַҪռ + if(len == 0) { + (*Sub).head = NULL; + (*Sub).tail = NULL; + (*Sub).curlen = 0; + + return OK; + } + + m = len / CHUNKSIZE; // ȼҪĿ + n = len % CHUNKSIZE; // SubδĿ飬ÿЧԪ + if(n != 0) { + m++; // Subܿ + } + + // 1.SubĽṹ + for(i = 1; i <= m; i++) { + // ¿ + r = (Chunk*) malloc(sizeof(Chunk)); + if(r == NULL) { + exit(OVERFLOW); + } + r->next = NULL; + + // һ + if(i == 1) { + (*Sub).head = (*Sub).tail = r; + + // ӺĿ + } else { + (*Sub).tail->next = r; + (*Sub).tail = r; + } + } + + // SеposԪڵĿ飬ָpָ + for(count = 1, p = S.head; pos > count * CHUNKSIZE; count++, p = p->next) { + // ѭ + } + + r = (*Sub).head; // ָSubĿ + + i = 0; // Subα + j = (pos - 1) % CHUNKSIZE; // S α + count = 0; // ͳƱԪ + + // 2.ΪSub + while(count < len) { + r->ch[i] = p->ch[j]; + + i = (i + 1) % CHUNKSIZE; + if(i == 0) { + r = r->next; // ָSubһ + } + + j = (j + 1) % CHUNKSIZE; + if(j == 0) { + p = p->next; // ָSһ + } + + count++; + } + + // 3.δĿ + if(n != 0) { + // Ǵֵ('\0') + while(i < CHUNKSIZE) { + (*Sub).tail->ch[i] = '\0'; + i++; + } + } + + // 4.¼Ϣ + (*Sub).curlen = len; + + return OK; +} + +/* + * + * + * posʼģʽTS״γֵλãڣ򷵻0 + * ҳɹƥλá + * + *ע + * 1.ʵҪСӼ + * 2.ʵֱȽϵЧ + */ +int Index(LString S, LString T, int pos) { + int i, s, t; + LString sub; + + if(pos < 1 || pos > S.curlen || StrEmpty(T)) { + return 0; + } + + s = S.curlen; //S + t = T.curlen; //ģʽT + i = pos; + + while(i + t - 1 <= s) { + // ȡS[i, i+m-1] + SubString(&sub, S, i, t); + + // Ӵģʽƥ䣬Ҫƽ + if(StrCompare(sub, T) != 0) { + ++i; + } else { + return i; + } + } + + return 0; //Ҳƥ򷵻0 +} + +/* + * + * + * T뵽Sposλô + */ +Status StrInsert(LString* S, int pos, LString T) { + Chunk* pre, * p; // preָĿǰpָĿ + Chunk* h, * t; // ָĿͷβ + Chunk* r; + Chunk* s; + int i, j, count; + + if(pos < 1 || pos > (*S).curlen + 1) { + return ERROR; + } + + // ĴΪգǰ + if(StrEmpty(T)) { + return OK; + } + + // ¼ʼֹ + h = t = NULL; + + // TеĿ飨ֻƽṹ + for(r = T.head; r != NULL; r = r->next) { + s = (Chunk*) malloc(sizeof(Chunk)); + if(s == NULL) { + exit(OVERFLOW); + } + s->next = NULL; + + if(r == T.head) { + h = t = s; + } else { + t->next = s; + t = s; + } + } + + // SеposԪڵĿ飨עΪĿ飩ָpreָǰ + if(pos >= 1 && pos <= CHUNKSIZE) { + pre = NULL; // ˵posԪڿΪhead + p = (*S).head; + } else { + for(count = 1, pre = (*S).head; count < (pos - 1) / CHUNKSIZE; count++, pre = pre->next) { + // ѭ + } + p = pre->next; + } + + /* + * htΧĿ뵽posڵĿ֮ǰ + */ + + if(pre == NULL) { + t->next = (*S).head; + (*S).head = h; + } else { + pre->next = h; + t->next = p; + } + + if(pre == (*S).tail) { + (*S).tail = t; + } + + /* + * ƶ/Ԫ + */ + + j = 0; + + // 뵽ijġм䡱 + if((pos - 1) % CHUNKSIZE != 0) { + // ƶĿposλ֮ǰԪ + for(i = 1; i <= (pos - 1) % CHUNKSIZE; i++) { + h->ch[j++] = p->ch[i - 1]; + p->ch[i - 1] = '\0'; + } + } + + r = T.head; + i = 0; + + // TеԪصS + for(count = 1; count <= T.curlen; count++) { + h->ch[j] = r->ch[i]; + + j = (j + 1) % CHUNKSIZE; + i = (i + 1) % CHUNKSIZE; + + if(j == 0) { + h = h->next; + } + + if(i == 0) { + r = r->next; + } + } + + // Tһа'\0' + if(T.curlen % CHUNKSIZE != 0) { + r = p; // ָĿ + i = (pos - 1) % CHUNKSIZE; + + // ƶĿposλü֮Ԫ + for(count = pos; count <= (*S).curlen; count++) { + h->ch[j] = r->ch[i]; + r->ch[i] = '\0'; + + j = (j + 1) % CHUNKSIZE; + i = (i + 1) % CHUNKSIZE; + + if(j == 0) { + h = h->next; + } + + if(i == 0) { + r = r->next; + } + } + } + + (*S).curlen += T.curlen; + + return OK; +} + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(LString* S, int pos, int len) { + Chunk* pre; // ָԪS[pos]ڵĿǰ + Chunk* p; // ָԪS[pos]ڵĿ + Chunk* q; // ָԪS[pos+len]ڵĿ + Chunk* r; + int i, j, count, total; + + if(pos < 1 || pos > (*S).curlen || len < 0 || pos + len - 1 > (*S).curlen) { + return ERROR; + } + + // ɾijΪ0ǰ + if(len == 0) { + return OK; + } + + // S[pos]ڵĿ飬ָpreָǰ + if(pos >= 1 && pos <= CHUNKSIZE) { + pre = NULL; // ˵posԪڿΪhead + p = (*S).head; + } else { + for(count = 1, pre = (*S).head; count < (pos - 1) / CHUNKSIZE; count++, pre = pre->next) { + // ѭ + } + p = pre->next; + } + + // S[pos+len]ڵĿ + for(count = (pos - 1) / CHUNKSIZE, q = p; count < (pos + len - 1) / CHUNKSIZE; count++, q = q->next) { + // ѭ + } + + // ҪƶԪظ + total = (*S).curlen - (pos + len) + 1; + + // յijȶ + (*S).curlen -= len; + + i = (pos - 1) % CHUNKSIZE; + j = (pos + len - 1) % CHUNKSIZE; + + if(p != q) { + // ɾpq֮Ŀ + r = p->next; + while(r != q) { + p->next = r->next; + free(r); + r = p->next; + } + + if(q == NULL) { + (*S).tail = p; + } + + // Ҫɾpָ + if((pos - 1) % CHUNKSIZE == 0) { + // pѾָͷ + if(pre == NULL) { + (*S).head = q; + } else { + pre->next = q; + } + + free(p); + p = q; + + if(q == NULL) { + (*S).tail = pre; + } + } + } + + // Ѿλ + if(p == q && i == j) { + return OK; + } + + for(count = 1; count <= total; count++) { + // ƶԪ + p->ch[i] = q->ch[j]; + + i = (i + 1) % CHUNKSIZE; + j = (j + 1) % CHUNKSIZE; + + if(i == 0) { + pre = p; + p = p->next; + } + + if(j == 0) { + q = q->next; + } + } + + // ǡĿ + if(i == 0) { + (*S).tail = pre; + r = p; + } else { + (*S).tail = p; + + // ʣಿǴֵַ + while(i < CHUNKSIZE) { + p->ch[i++] = '\0'; + } + + r = p->next; + } + + // ͷŶĿռ + while(r != NULL) { + (*S).tail->next = r->next; + free(r); + r = (*S).tail->next; + } + + return OK; +} + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(LString S, LString T) { + int i; + Chunk* s = S.head; + Chunk* t = T.head; + + while(s != NULL && t != NULL) { + for(i = 0; i < CHUNKSIZE; i++) { + if(s->ch[i] != t->ch[i]) { + return s->ch[i] - t->ch[i]; + } + } + + s = s->next; + t = t->next; + } + + if(s != NULL) { + return 1; + } else if(t != NULL) { + return -1; + } else { + return 0; + } +} + +/* + * + * + * SƵT + */ +Status StrCopy(LString* T, LString S) { + int i; + Chunk* s, * p; + + for(p = S.head; p; p = p->next) { + s = (Chunk*) malloc(sizeof(Chunk)); + if(s == NULL) { + exit(OVERFLOW); + } + s->next = NULL; + + if(p == S.head) { + (*T).head = (*T).tail = s; + } else { + (*T).tail->next = s; + (*T).tail = s; + } + + for(i = 0; i < CHUNKSIZE; i++) { + (*s).ch[i] = (*p).ch[i]; + } + } + + (*T).curlen = S.curlen; + + return OK; +} + +/* + * 滻 + * + * V滻SгֵTȵҲصӴ + * + *ע + * 1.òСӼ + * 2.ʵֱȽϵЧ + */ +Status Replace(LString* S, LString T, LString V) { + int i; + + if(StrEmpty(*S) || StrEmpty(T)) { + return ERROR; + } + + // SѰģʽTһγֵλ + i = Index(*S, T, 1); + + // ƥַ + while(i != 0) { + StrDelete(S, i, StrLength(T)); // SɾT + StrInsert(S, i, V); // SвV + + i += StrLength(V); // iлһλ + + i = Index(*S, T, i); // һƥַ + } + + return OK; +} + +/* + * + * + * S1S2洢TзءӺijֻδIJ֡ + * ֵʾӺĴǷ + * + *ע + * òСӼ + */ +Status Concat(LString* T, LString S1, LString S2) { + Chunk* p; // S1S2 + Chunk* r; // T + Chunk* s; + int i, j, count; + + // 㳤Ϣ + (*T).curlen = S1.curlen + S2.curlen; + + // Ҫٸ + count = (*T).curlen / CHUNKSIZE + ((*T).curlen % CHUNKSIZE == 0 ? 0 : 1); + + // S1Ľṹ + for(i = 1; i <= count; i++) { + s = (Chunk*) malloc(sizeof(Chunk)); + if(s == NULL) { + exit(OVERFLOW); + } + s->next = NULL; + + if(i == 1) { + (*T).head = (*T).tail = s; + } else { + (*T).tail->next = s; + (*T).tail = s; + } + } + + i = 0; + r = (*T).head; + + // S1е + j = 0; + p = S1.head; + for(count = 0; count < S1.curlen; count++) { + r->ch[i] = p->ch[j]; + + i = (i + 1) % CHUNKSIZE; + j = (j + 1) % CHUNKSIZE; + + if(i == 0) { + r = r->next; + } + + if(j == 0) { + p = p->next; + } + } + + // S2е + j = 0; + p = S2.head; + for(count = 0; count < S2.curlen; count++) { + r->ch[i] = p->ch[j]; + + i = (i + 1) % CHUNKSIZE; + j = (j + 1) % CHUNKSIZE; + + if(i == 0) { + r = r->next; + } + + if(j == 0) { + p = p->next; + } + } + + // ĿռǴֵַ + if(i != 0) { + while(i < CHUNKSIZE) { + r->ch[i] = '\0'; + i++; + } + } + + return OK; +} + +// Ժӡַ +void StrPrint(LString S) { + int i = 0; + Chunk* p = S.head; + + if(S.curlen == 0 || S.head == NULL || S.tail == NULL) { + return; + } + + while(p != NULL) { + // Ǵֵʱ + if(p->ch[i] == '\0') { + break; + } + + printf("%c", p->ch[i]); + + i = (i + 1) % CHUNKSIZE; + + if(i == 0) { + p = p->next; + } + } + + printf("\n"); +} diff --git a/Dev-C++/ExerciseBook/04.22/LString.h b/Dev-C++/ExerciseBook/04.22/LString.h new file mode 100644 index 0000000..e6f19d1 --- /dev/null +++ b/Dev-C++/ExerciseBook/04.22/LString.h @@ -0,0 +1,169 @@ +/*============================= + * Ŀ洢ʾ + ==============================*/ + +#ifndef LSTRING_H +#define LSTRING_H + +#include +#include // ṩmallocreallocfreeexitԭ +#include // ṩstrlenԭ +#include "Status.h" //**01 **// + +/* 궨 */ +#define CHUNKSIZE 3 // СԶ壩 + +/* Ŀ洢ṹ */ +typedef struct Chunk { + char ch[CHUNKSIZE]; // ǰе + struct Chunk* next; // ָһ +} Chunk; + +/* Ŀ洢Ͷ */ +typedef struct { + Chunk* head; //ͷָ + Chunk* tail; //βָ + int curlen; //ĵǰ +} LString; + + +/* + * ʾ + * + * ѭ̲ĵдϰߣposָʾַλ()1ʼ + */ + +/* + * ע + * + * 1.̲ʾʹ#ΪǴֵַʹCе\0ΪǴֵַ + * 2.ָ̲һУĩβ÷Ǵֵַġ + * СΪ4Ϊ14ĿΪ£ã -> ţƣǣ -> ɣʣˣ -> ͣ\0\0 + */ + + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(LString* T, const char* chars); + +/* + * + * + * S١ + */ +Status DestroyString(LString* S); + +/* + * + * + * Sա + */ +Status ClearString(LString* S); + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(LString S); + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(LString S); + +/* + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(LString* Sub, LString S, int pos, int len); + +/* + * + * + * posʼģʽTS״γֵλãڣ򷵻0 + * ҳɹƥλá + * + *ע + * 1.ʵҪСӼ + * 2.ʵֱȽϵЧ + */ +int Index(LString S, LString T, int pos); + +/* + * + * + * T뵽Sposλô + */ +Status StrInsert(LString* S, int pos, LString T); + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(LString* S, int pos, int len); + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +Status StrCompare(LString S, LString T); + +/* + * + * + * SƵT + */ +Status StrCopy(LString* T, LString S); + +/* + * 滻 + * + * V滻SгֵTȵҲصӴ + * + *ע + * 1.òСӼ + * 2.ʵֱȽϵЧ + */ +Status Replace(LString* S, LString T, LString V); + +/* + * + * + * S1S2洢TзءӺijֻδIJ֡ + * ֵʾӺĴǷ + * + *ע + * òСӼ + */ +Status Concat(LString* T, LString S1, LString S2); + +// Ժӡַ +void StrPrint(LString S); + +#endif diff --git a/Dev-C++/ExerciseBook/04.23/04.23.cpp b/Dev-C++/ExerciseBook/04.23/04.23.cpp new file mode 100644 index 0000000..d310967 --- /dev/null +++ b/Dev-C++/ExerciseBook/04.23/04.23.cpp @@ -0,0 +1,107 @@ +#include +#include "LString.h" //**04 **// + +/* + * жϸĴǷԳơ + * մַĴᱻΪǶԳƵġ + */ +Status Algo_4_23(LString T); + + +int main(int argc, char* argv[]) { + char* t = "abcdefgfedcba"; + LString T; + + StrAssign(&T, t); + printf("T = "); + StrPrint(T); + + Algo_4_23(T) ? printf("TǶԳƴ\n") : printf("TǷǶԳƴ\n"); + + return 0; +} + + +/* + * жϸĴǷԳơ + * մַĴᱻΪǶԳƵġ + */ +Status Algo_4_23(LString T) { + int len; // Tij + + int a1, b1; // Tǰ벿ֱ߽ + int a2, b2; // Tĺ벿ֱ߽ + int k; // ƱTʱҪԪ + int i; // Tʱα + Chunk* t; + + char* stack; // ģջ + int top; // ջα + + char c; // Tȡַ + + len = StrLength(T); + + // մΪǶԳƵ + if(len == 0) { + return OK; + } + + // ijż + if(len % 2 == 0) { + a1 = 0; + b1 = len / 2 - 1; + a2 = len / 2; + b2 = len - 1; + // ij + } else { + a1 = 0; + b1 = len / 2 - 1; + a2 = len / 2 + 1; + b2 = len - 1; + } + + stack = (char*) malloc(len * sizeof(char)); + top = -1; + + i = 0; + t = T.head; + + // ڴǰ벿֣ջ + for(k = a1; k <= b1; k++) { + c = t->ch[i]; + i = (i + 1) % CHUNKSIZE; + if(i == 0) { + t = t->next; + } + + stack[++top] = c; + } + + // ΪҪһַ + if(len % 2 == 1) { + i = (i + 1) % CHUNKSIZE; + if(i == 0) { + t = t->next; + } + } + + for(k = a2; k <= b2; k++) { + c = t->ch[i]; + i = (i + 1) % CHUNKSIZE; + if(i == 0) { + t = t->next; + } + + // ˲ԳƵַ + if(stack[top--] != c) { + return ERROR; + } + } + + if(top == -1) { + return OK; + } else { + return ERROR; + } +} diff --git a/Dev-C++/ExerciseBook/04.23/04.23.dev b/Dev-C++/ExerciseBook/04.23/04.23.dev new file mode 100644 index 0000000..3ca19f6 --- /dev/null +++ b/Dev-C++/ExerciseBook/04.23/04.23.dev @@ -0,0 +1,82 @@ +[Project] +FileName=04.23.dev +Name=04.23 +Type=1 +Ver=2 +ObjFiles= +Includes= +Libs= +PrivateResource= +ResourceIncludes= +MakeIncludes= +Compiler= +CppCompiler= +Linker= +IsCpp=0 +Icon= +ExeOutput= +ObjectOutput= +LogOutput= +LogOutputEnabled=0 +OverrideOutput=0 +OverrideOutputName= +HostApplication= +UseCustomMakefile=0 +CustomMakefile= +CommandLine= +Folders= +IncludeVersionInfo=0 +SupportXPThemes=0 +CompilerSet=1 +CompilerSettings=0000000000000000001000000 +UnitCount=3 + +[VersionInfo] +Major=1 +Minor=0 +Release=0 +Build=0 +LanguageID=1033 +CharsetID=1252 +CompanyName= +FileVersion= +FileDescription=Developed using the Dev-C++ IDE +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion= +AutoIncBuildNr=0 +SyncProduct=1 + +[Unit2] +FileName=LString.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit1] +FileName=04.23.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=LString.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Dev-C++/ExerciseBook/04.23/LString.cpp b/Dev-C++/ExerciseBook/04.23/LString.cpp new file mode 100644 index 0000000..76b08fa --- /dev/null +++ b/Dev-C++/ExerciseBook/04.23/LString.cpp @@ -0,0 +1,748 @@ +/*============================= + * Ŀ洢ʾ + ==============================*/ + +#include "LString.h" //**04 **// + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(LString* T, const char* chars) { + int len; // charsij + int i, count; // ַcharsα + int m; // ܿ + int n; // δĿ飬洢ÿеЧԪ + Chunk* r; + + // charsij + len = (int) strlen(chars); + + // ûЧԪ + if(len == 0) { + (*T).head = NULL; + (*T).tail = NULL; + (*T).curlen = 0; + + return OK; + } + + m = len / CHUNKSIZE; // ȼҪĿ + n = len % CHUNKSIZE; // δĿ飬ÿЧԪ + if(n != 0) { + m++; // ܿ + } + + // 1.Ľṹ + for(i = 1; i <= m; i++) { + // ¿ + r = (Chunk*) malloc(sizeof(Chunk)); + if(r == NULL) { + exit(OVERFLOW); + } + r->next = NULL; + + // һ + if(i == 1) { + (*T).head = (*T).tail = r; + + // ӺĿ + } else { + (*T).tail->next = r; + (*T).tail = r; + } + } + + r = (*T).head; + i = 0; // Tα + count = 0; // ͳƱԪأ˳Ϊcharsα + + // 2.Ϊ + while(count < len) { + r->ch[i] = chars[count]; + + i = (i + 1) % CHUNKSIZE; + if(i == 0) { + r = r->next; // ָһ + } + + count++; + } + + // 3.δĿ + if(n != 0) { + // Ǵֵ('\0') + while(i < CHUNKSIZE) { + (*T).tail->ch[i] = '\0'; + i++; + } + } + + // 4.¼Ϣ + (*T).curlen = len; + + return OK; +} + +/* + * + * + *ע + * Ľṹ٣ٲ + */ +Status DestroyString(LString* S) { + return OK; +} + +/* + * + * + * Sա + */ +Status ClearString(LString* S) { + Chunk* p, * q; + + p = (*S).head; + + // ͷдռõĿռ + while(p != NULL) { + q = p->next; + free(p); + p = q; + } + + (*S).head = NULL; + (*S).tail = NULL; + (*S).curlen = 0; + + return OK; +} + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(LString S) { + return S.curlen == 0 ? TRUE : FALSE; +} + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(LString S) { + return S.curlen; +} + +/* + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(LString* Sub, LString S, int pos, int len) { + int m; // Subܿ + int n; // SubδĿ飬洢ÿеЧԪ + int i, j, count; + Chunk* r, * p; + + if(pos < 1 || pos > S.curlen || len < 0 || pos + len - 1 > S.curlen) { + return ERROR; + } + + // ǽȡ0ַҪռ + if(len == 0) { + (*Sub).head = NULL; + (*Sub).tail = NULL; + (*Sub).curlen = 0; + + return OK; + } + + m = len / CHUNKSIZE; // ȼҪĿ + n = len % CHUNKSIZE; // SubδĿ飬ÿЧԪ + if(n != 0) { + m++; // Subܿ + } + + // 1.SubĽṹ + for(i = 1; i <= m; i++) { + // ¿ + r = (Chunk*) malloc(sizeof(Chunk)); + if(r == NULL) { + exit(OVERFLOW); + } + r->next = NULL; + + // һ + if(i == 1) { + (*Sub).head = (*Sub).tail = r; + + // ӺĿ + } else { + (*Sub).tail->next = r; + (*Sub).tail = r; + } + } + + // SеposԪڵĿ飬ָpָ + for(count = 1, p = S.head; pos > count * CHUNKSIZE; count++, p = p->next) { + // ѭ + } + + r = (*Sub).head; // ָSubĿ + + i = 0; // Subα + j = (pos - 1) % CHUNKSIZE; // S α + count = 0; // ͳƱԪ + + // 2.ΪSub + while(count < len) { + r->ch[i] = p->ch[j]; + + i = (i + 1) % CHUNKSIZE; + if(i == 0) { + r = r->next; // ָSubһ + } + + j = (j + 1) % CHUNKSIZE; + if(j == 0) { + p = p->next; // ָSһ + } + + count++; + } + + // 3.δĿ + if(n != 0) { + // Ǵֵ('\0') + while(i < CHUNKSIZE) { + (*Sub).tail->ch[i] = '\0'; + i++; + } + } + + // 4.¼Ϣ + (*Sub).curlen = len; + + return OK; +} + +/* + * + * + * posʼģʽTS״γֵλãڣ򷵻0 + * ҳɹƥλá + * + *ע + * 1.ʵҪСӼ + * 2.ʵֱȽϵЧ + */ +int Index(LString S, LString T, int pos) { + int i, s, t; + LString sub; + + if(pos < 1 || pos > S.curlen || StrEmpty(T)) { + return 0; + } + + s = S.curlen; //S + t = T.curlen; //ģʽT + i = pos; + + while(i + t - 1 <= s) { + // ȡS[i, i+m-1] + SubString(&sub, S, i, t); + + // Ӵģʽƥ䣬Ҫƽ + if(StrCompare(sub, T) != 0) { + ++i; + } else { + return i; + } + } + + return 0; //Ҳƥ򷵻0 +} + +/* + * + * + * T뵽Sposλô + */ +Status StrInsert(LString* S, int pos, LString T) { + Chunk* pre, * p; // preָĿǰpָĿ + Chunk* h, * t; // ָĿͷβ + Chunk* r; + Chunk* s; + int i, j, count; + + if(pos < 1 || pos > (*S).curlen + 1) { + return ERROR; + } + + // ĴΪգǰ + if(StrEmpty(T)) { + return OK; + } + + // ¼ʼֹ + h = t = NULL; + + // TеĿ飨ֻƽṹ + for(r = T.head; r != NULL; r = r->next) { + s = (Chunk*) malloc(sizeof(Chunk)); + if(s == NULL) { + exit(OVERFLOW); + } + s->next = NULL; + + if(r == T.head) { + h = t = s; + } else { + t->next = s; + t = s; + } + } + + // SеposԪڵĿ飨עΪĿ飩ָpreָǰ + if(pos >= 1 && pos <= CHUNKSIZE) { + pre = NULL; // ˵posԪڿΪhead + p = (*S).head; + } else { + for(count = 1, pre = (*S).head; count < (pos - 1) / CHUNKSIZE; count++, pre = pre->next) { + // ѭ + } + p = pre->next; + } + + /* + * htΧĿ뵽posڵĿ֮ǰ + */ + + if(pre == NULL) { + t->next = (*S).head; + (*S).head = h; + } else { + pre->next = h; + t->next = p; + } + + if(pre == (*S).tail) { + (*S).tail = t; + } + + /* + * ƶ/Ԫ + */ + + j = 0; + + // 뵽ijġм䡱 + if((pos - 1) % CHUNKSIZE != 0) { + // ƶĿposλ֮ǰԪ + for(i = 1; i <= (pos - 1) % CHUNKSIZE; i++) { + h->ch[j++] = p->ch[i - 1]; + p->ch[i - 1] = '\0'; + } + } + + r = T.head; + i = 0; + + // TеԪصS + for(count = 1; count <= T.curlen; count++) { + h->ch[j] = r->ch[i]; + + j = (j + 1) % CHUNKSIZE; + i = (i + 1) % CHUNKSIZE; + + if(j == 0) { + h = h->next; + } + + if(i == 0) { + r = r->next; + } + } + + // Tһа'\0' + if(T.curlen % CHUNKSIZE != 0) { + r = p; // ָĿ + i = (pos - 1) % CHUNKSIZE; + + // ƶĿposλü֮Ԫ + for(count = pos; count <= (*S).curlen; count++) { + h->ch[j] = r->ch[i]; + r->ch[i] = '\0'; + + j = (j + 1) % CHUNKSIZE; + i = (i + 1) % CHUNKSIZE; + + if(j == 0) { + h = h->next; + } + + if(i == 0) { + r = r->next; + } + } + } + + (*S).curlen += T.curlen; + + return OK; +} + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(LString* S, int pos, int len) { + Chunk* pre; // ָԪS[pos]ڵĿǰ + Chunk* p; // ָԪS[pos]ڵĿ + Chunk* q; // ָԪS[pos+len]ڵĿ + Chunk* r; + int i, j, count, total; + + if(pos < 1 || pos > (*S).curlen || len < 0 || pos + len - 1 > (*S).curlen) { + return ERROR; + } + + // ɾijΪ0ǰ + if(len == 0) { + return OK; + } + + // S[pos]ڵĿ飬ָpreָǰ + if(pos >= 1 && pos <= CHUNKSIZE) { + pre = NULL; // ˵posԪڿΪhead + p = (*S).head; + } else { + for(count = 1, pre = (*S).head; count < (pos - 1) / CHUNKSIZE; count++, pre = pre->next) { + // ѭ + } + p = pre->next; + } + + // S[pos+len]ڵĿ + for(count = (pos - 1) / CHUNKSIZE, q = p; count < (pos + len - 1) / CHUNKSIZE; count++, q = q->next) { + // ѭ + } + + // ҪƶԪظ + total = (*S).curlen - (pos + len) + 1; + + // յijȶ + (*S).curlen -= len; + + i = (pos - 1) % CHUNKSIZE; + j = (pos + len - 1) % CHUNKSIZE; + + if(p != q) { + // ɾpq֮Ŀ + r = p->next; + while(r != q) { + p->next = r->next; + free(r); + r = p->next; + } + + if(q == NULL) { + (*S).tail = p; + } + + // Ҫɾpָ + if((pos - 1) % CHUNKSIZE == 0) { + // pѾָͷ + if(pre == NULL) { + (*S).head = q; + } else { + pre->next = q; + } + + free(p); + p = q; + + if(q == NULL) { + (*S).tail = pre; + } + } + } + + // Ѿλ + if(p == q && i == j) { + return OK; + } + + for(count = 1; count <= total; count++) { + // ƶԪ + p->ch[i] = q->ch[j]; + + i = (i + 1) % CHUNKSIZE; + j = (j + 1) % CHUNKSIZE; + + if(i == 0) { + pre = p; + p = p->next; + } + + if(j == 0) { + q = q->next; + } + } + + // ǡĿ + if(i == 0) { + (*S).tail = pre; + r = p; + } else { + (*S).tail = p; + + // ʣಿǴֵַ + while(i < CHUNKSIZE) { + p->ch[i++] = '\0'; + } + + r = p->next; + } + + // ͷŶĿռ + while(r != NULL) { + (*S).tail->next = r->next; + free(r); + r = (*S).tail->next; + } + + return OK; +} + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(LString S, LString T) { + int i; + Chunk* s = S.head; + Chunk* t = T.head; + + while(s != NULL && t != NULL) { + for(i = 0; i < CHUNKSIZE; i++) { + if(s->ch[i] != t->ch[i]) { + return s->ch[i] - t->ch[i]; + } + } + + s = s->next; + t = t->next; + } + + if(s != NULL) { + return 1; + } else if(t != NULL) { + return -1; + } else { + return 0; + } +} + +/* + * + * + * SƵT + */ +Status StrCopy(LString* T, LString S) { + int i; + Chunk* s, * p; + + for(p = S.head; p; p = p->next) { + s = (Chunk*) malloc(sizeof(Chunk)); + if(s == NULL) { + exit(OVERFLOW); + } + s->next = NULL; + + if(p == S.head) { + (*T).head = (*T).tail = s; + } else { + (*T).tail->next = s; + (*T).tail = s; + } + + for(i = 0; i < CHUNKSIZE; i++) { + (*s).ch[i] = (*p).ch[i]; + } + } + + (*T).curlen = S.curlen; + + return OK; +} + +/* + * 滻 + * + * V滻SгֵTȵҲصӴ + * + *ע + * 1.òСӼ + * 2.ʵֱȽϵЧ + */ +Status Replace(LString* S, LString T, LString V) { + int i; + + if(StrEmpty(*S) || StrEmpty(T)) { + return ERROR; + } + + // SѰģʽTһγֵλ + i = Index(*S, T, 1); + + // ƥַ + while(i != 0) { + StrDelete(S, i, StrLength(T)); // SɾT + StrInsert(S, i, V); // SвV + + i += StrLength(V); // iлһλ + + i = Index(*S, T, i); // һƥַ + } + + return OK; +} + +/* + * + * + * S1S2洢TзءӺijֻδIJ֡ + * ֵʾӺĴǷ + * + *ע + * òСӼ + */ +Status Concat(LString* T, LString S1, LString S2) { + Chunk* p; // S1S2 + Chunk* r; // T + Chunk* s; + int i, j, count; + + // 㳤Ϣ + (*T).curlen = S1.curlen + S2.curlen; + + // Ҫٸ + count = (*T).curlen / CHUNKSIZE + ((*T).curlen % CHUNKSIZE == 0 ? 0 : 1); + + // S1Ľṹ + for(i = 1; i <= count; i++) { + s = (Chunk*) malloc(sizeof(Chunk)); + if(s == NULL) { + exit(OVERFLOW); + } + s->next = NULL; + + if(i == 1) { + (*T).head = (*T).tail = s; + } else { + (*T).tail->next = s; + (*T).tail = s; + } + } + + i = 0; + r = (*T).head; + + // S1е + j = 0; + p = S1.head; + for(count = 0; count < S1.curlen; count++) { + r->ch[i] = p->ch[j]; + + i = (i + 1) % CHUNKSIZE; + j = (j + 1) % CHUNKSIZE; + + if(i == 0) { + r = r->next; + } + + if(j == 0) { + p = p->next; + } + } + + // S2е + j = 0; + p = S2.head; + for(count = 0; count < S2.curlen; count++) { + r->ch[i] = p->ch[j]; + + i = (i + 1) % CHUNKSIZE; + j = (j + 1) % CHUNKSIZE; + + if(i == 0) { + r = r->next; + } + + if(j == 0) { + p = p->next; + } + } + + // ĿռǴֵַ + if(i != 0) { + while(i < CHUNKSIZE) { + r->ch[i] = '\0'; + i++; + } + } + + return OK; +} + +// Ժӡַ +void StrPrint(LString S) { + int i = 0; + Chunk* p = S.head; + + if(S.curlen == 0 || S.head == NULL || S.tail == NULL) { + printf("\n"); + return; + } + + while(p != NULL) { + // Ǵֵʱ + if(p->ch[i] == '\0') { + break; + } + + printf("%c", p->ch[i]); + + i = (i + 1) % CHUNKSIZE; + + if(i == 0) { + p = p->next; + } + } + + printf("\n"); +} diff --git a/Dev-C++/ExerciseBook/04.23/LString.h b/Dev-C++/ExerciseBook/04.23/LString.h new file mode 100644 index 0000000..e6f19d1 --- /dev/null +++ b/Dev-C++/ExerciseBook/04.23/LString.h @@ -0,0 +1,169 @@ +/*============================= + * Ŀ洢ʾ + ==============================*/ + +#ifndef LSTRING_H +#define LSTRING_H + +#include +#include // ṩmallocreallocfreeexitԭ +#include // ṩstrlenԭ +#include "Status.h" //**01 **// + +/* 궨 */ +#define CHUNKSIZE 3 // СԶ壩 + +/* Ŀ洢ṹ */ +typedef struct Chunk { + char ch[CHUNKSIZE]; // ǰе + struct Chunk* next; // ָһ +} Chunk; + +/* Ŀ洢Ͷ */ +typedef struct { + Chunk* head; //ͷָ + Chunk* tail; //βָ + int curlen; //ĵǰ +} LString; + + +/* + * ʾ + * + * ѭ̲ĵдϰߣposָʾַλ()1ʼ + */ + +/* + * ע + * + * 1.̲ʾʹ#ΪǴֵַʹCе\0ΪǴֵַ + * 2.ָ̲һУĩβ÷Ǵֵַġ + * СΪ4Ϊ14ĿΪ£ã -> ţƣǣ -> ɣʣˣ -> ͣ\0\0 + */ + + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(LString* T, const char* chars); + +/* + * + * + * S١ + */ +Status DestroyString(LString* S); + +/* + * + * + * Sա + */ +Status ClearString(LString* S); + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(LString S); + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(LString S); + +/* + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(LString* Sub, LString S, int pos, int len); + +/* + * + * + * posʼģʽTS״γֵλãڣ򷵻0 + * ҳɹƥλá + * + *ע + * 1.ʵҪСӼ + * 2.ʵֱȽϵЧ + */ +int Index(LString S, LString T, int pos); + +/* + * + * + * T뵽Sposλô + */ +Status StrInsert(LString* S, int pos, LString T); + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(LString* S, int pos, int len); + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +Status StrCompare(LString S, LString T); + +/* + * + * + * SƵT + */ +Status StrCopy(LString* T, LString S); + +/* + * 滻 + * + * V滻SгֵTȵҲصӴ + * + *ע + * 1.òСӼ + * 2.ʵֱȽϵЧ + */ +Status Replace(LString* S, LString T, LString V); + +/* + * + * + * S1S2洢TзءӺijֻδIJ֡ + * ֵʾӺĴǷ + * + *ע + * òСӼ + */ +Status Concat(LString* T, LString S1, LString S2); + +// Ժӡַ +void StrPrint(LString S); + +#endif diff --git a/Dev-C++/ExerciseBook/04.24-04.26/04.24-04.26.cpp b/Dev-C++/ExerciseBook/04.24-04.26/04.24-04.26.cpp new file mode 100644 index 0000000..e464ee6 --- /dev/null +++ b/Dev-C++/ExerciseBook/04.24-04.26/04.24-04.26.cpp @@ -0,0 +1,101 @@ +#include +#include "Status.h" //**01 **// +#include "HString.h" //**04 **// + +/* + * ӣConcat + * + *ע + * úHStringļж + */ +Status Algo_4_24(HString* T, HString S1, HString S2); + +/* + * 滻Replace + * + *ע + * úHStringļж + */ +Status Algo_4_25(HString* S, HString T, HString V); + +/* + * 룺StrInsert + * + *ע + * úHStringļж + */ +Status Algo_4_26(HString* S, int pos, HString T); + + +int main(int argc, char* argv[]) { + char* s = "---*^***^*^*^*---"; + char* s1 = "*"; + char* s2 = "^*"; + char* v = "*_*"; + HString S1, S2, T, V, S; + + StrAssign(&S1, s1); + StrAssign(&S2, s2); + StrAssign(&V, v); + StrAssign(&S, s); + + printf("S1 = "); + StrPrint(S1); + printf("S2 = "); + StrPrint(S2); + printf("V = "); + StrPrint(V); + printf("S = "); + StrPrint(S); + + printf(" 4.24 ֤...\n"); + printf("S1S2ΪT...\n"); + Algo_4_24(&T, S1, S2); + printf("T = "); + StrPrint(T); + + printf(" 4.25 ֤...\n"); + printf(" V 滻 S е T...\n"); + Algo_4_25(&S, T, V); + printf("S = "); + StrPrint(S); + + printf(" 4.26 ֤...\n"); + printf(" T 뵽 S ĵ 2 λ...\n"); + Algo_4_26(&S, 2, T); + printf("S = "); + StrPrint(S); + + return 0; +} + + +/* + * ӣConcat + * + *ע + * úHStringļж + */ +Status Algo_4_24(HString* T, HString S1, HString S2) { + return Concat(T, S1, S2); +} + +/* + * 滻Replace + * + *ע + * úHStringļж + */ +Status Algo_4_25(HString* S, HString T, HString V) { + return Replace(S, T, V); +} + +/* + * 룺StrInsert + * + *ע + * úHStringļж + */ +Status Algo_4_26(HString* S, int pos, HString T) { + return StrInsert(S, pos, T); +} diff --git a/Dev-C++/ExerciseBook/04.24-04.26/04.24-04.26.dev b/Dev-C++/ExerciseBook/04.24-04.26/04.24-04.26.dev new file mode 100644 index 0000000..5839e56 --- /dev/null +++ b/Dev-C++/ExerciseBook/04.24-04.26/04.24-04.26.dev @@ -0,0 +1,82 @@ +[Project] +FileName=04.24-04.26.dev +Name=04.24-04.26 +Type=1 +Ver=2 +ObjFiles= +Includes= +Libs= +PrivateResource= +ResourceIncludes= +MakeIncludes= +Compiler= +CppCompiler= +Linker= +IsCpp=0 +Icon= +ExeOutput= +ObjectOutput= +LogOutput= +LogOutputEnabled=0 +OverrideOutput=0 +OverrideOutputName= +HostApplication= +UseCustomMakefile=0 +CustomMakefile= +CommandLine= +Folders= +IncludeVersionInfo=0 +SupportXPThemes=0 +CompilerSet=1 +CompilerSettings=0000000000000000001000000 +UnitCount=3 + +[VersionInfo] +Major=1 +Minor=0 +Release=0 +Build=0 +LanguageID=1033 +CharsetID=1252 +CompanyName= +FileVersion= +FileDescription=Developed using the Dev-C++ IDE +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion= +AutoIncBuildNr=0 +SyncProduct=1 + +[Unit1] +FileName=04.24-04.26.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit2] +FileName=HString.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=HString.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Dev-C++/ExerciseBook/04.24-04.26/HString.cpp b/Dev-C++/ExerciseBook/04.24-04.26/HString.cpp new file mode 100644 index 0000000..4ed501a --- /dev/null +++ b/Dev-C++/ExerciseBook/04.24-04.26/HString.cpp @@ -0,0 +1,381 @@ +/*========================= + * Ķѷ洢ʾѴ + * + * 㷨: 4.4 + ==========================*/ + +#include "HString.h" //**04 **// + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(HString* T, const char* chars) { + int i, j; + + // charsij + i = (int) strlen(chars); + + // ûЧԪ + if(i == 0) { + (*T).ch = NULL; + (*T).length = 0; + + return OK; + } + + // ЧԪʱҪ洢ռ + (*T).ch = (char*) malloc(i * sizeof(char)); + if(!((*T).ch)) { + exit(OVERFLOW); + } + + for(j = 0; j < i; j++) { + (*T).ch[j] = chars[j]; + } + + (*T).length = i; + + return OK; +} + +/* + * + * + * S١ + * + *ע + * ѴĽṹ٣ٲ + */ +Status DestroyString(HString* S) { + return OK; +} + +/* + * + * + * Sա + */ +Status ClearString(HString* S) { + // ûЧԪʱٶѴṹ + if((*S).ch != 0) { + free((*S).ch); + (*S).ch = NULL; + } + + (*S).length = 0; + + return OK; +} + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(HString S) { + return S.length == 0 ? TRUE : FALSE; +} + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(HString S) { + return S.length; +} + +/* + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(HString* Sub, HString S, int pos, int len) { + int i; + + if(pos < 1 || pos > S.length || len < 0 || pos + len - 1 > S.length) { + return ERROR; + } + + // ǽȡ0ַҪռ + if(len == 0) { + (*Sub).ch = NULL; + (*Sub).length = 0; + + return OK; + } + + (*Sub).ch = (char*) malloc(len * sizeof(char)); + if(!(*Sub).ch) { + exit(OVERFLOW); + } + + // Ԫ + for(i = 0; i < len; i++) { + (*Sub).ch[i] = S.ch[i + pos - 1]; + } + + // ȷ³ + (*Sub).length = len; + + return OK; +} + +/* + * + * + * posʼģʽTS״γֵλãڣ򷵻0 + * ҳɹƥλá + * + *ע + * 1.ʵҪСӼ + * 2.ʵֱȽϵЧ + */ +int Index(HString S, HString T, int pos) { + int i, s, t; + HString sub; + + if(pos < 1 || pos > S.length || StrEmpty(T)) { + return 0; + } + + s = S.length; + t = T.length; + i = pos; + + // ֤ȲԽ + while(i + t - 1 <= s) { + // ȡS[i, i+t-1] + SubString(&sub, S, i, t); + + // Ӵģʽƥ䣬Ҫƽ + if(StrCompare(sub, T) != 0) { + ++i; + } else { + return i; + } + } + + return 0; +} + +/* + * 㷨4.4 + * + * + * + * T뵽Sposλô + */ +Status StrInsert(HString* S, int pos, HString T) { + int i; + + if(pos < 1 || pos > (*S).length + 1) { + return ERROR; + } + + // ĴΪգǰ + if(StrEmpty(T)) { + return OK; + } + + // ¿ռ䣬ὫԪһƹȥ + (*S).ch = (char*) realloc((*S).ch, ((*S).length + T.length) * sizeof(char)); + if(!(*S).ch) { + exit(OVERFLOW); + } + + // SڳλãΪT׼ + for(i = (*S).length - 1; i >= pos - 1; i--) { + // ӺǰǰԪŲ + (*S).ch[i + T.length] = (*S).ch[i]; + } + + // TSڳλ + for(i = pos - 1; i <= pos + T.length - 2; i++) { + (*S).ch[i] = T.ch[i - pos + 1]; + } + + // + (*S).length += T.length; + + return OK; +} + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(HString* S, int pos, int len) { + int i; + + if(pos < 1 || pos + len - 1 > (*S).length || len < 0) { + return ERROR; + } + + // ɾijΪ0ǰ + if(len == 0) { + return OK; + } + + // ѺԪŲǰ棬ǵɾԪ + for(i = pos + len - 1; i <= (*S).length - 1; i++) { + (*S).ch[i - len] = (*S).ch[i]; + } + + // ȼ + (*S).length -= len; + + // Ŀռ䣨ȼΪ0᷵ؿָ룩 + (*S).ch = (char*) realloc((*S).ch, (*S).length * sizeof(char)); + + return OK; +} + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +Status StrCompare(HString S, HString T) { + int i; + + for(i = 0; i < S.length && i < T.length; i++) { + // ַͬʱȽС + if(S.ch[i] != T.ch[i]) { + return S.ch[i] - T.ch[i]; + } + } + + return S.length - T.length; +} + +/* + * + * + * SƵT + */ +Status StrCopy(HString* T, HString S) { + int i; + + if(StrEmpty(S)) { + (*T).ch = NULL; + (*T).length = 0; + } else { + // ռ + (*T).ch = (char*) malloc(S.length * sizeof(char)); + if(!(*T).ch) { + exit(OVERFLOW); + } + + // Ԫ + for(i = 0; i < S.length; i++) { + (*T).ch[i] = S.ch[i]; + } + + // ƳϢ + (*T).length = S.length; + } + + return OK; +} + +/* + * 滻 + * + * V滻SгֵTȵҲصӴ + * + *ע + * 1.òСӼ + * 2.ʵֱȽϵЧ + */ +Status Replace(HString* S, HString T, HString V) { + int i; + + if(StrEmpty(*S) || StrEmpty(T)) { + return ERROR; + } + + // SѰģʽTһγֵλ + i = Index(*S, T, 1); + + // ƥַ + while(i != 0) { + StrDelete(S, i, StrLength(T)); // SɾT + StrInsert(S, i, V); // SвV + + i += StrLength(V); // iлһλ + + i = Index(*S, T, i); // һƥַ + } + + return OK; +} + +/* + * + * + * S1S2洢TзءӺijֻδIJ֡ + * ֵʾӺĴǷ + * ѴĿռ䱻Ϊ޵ģǷTRUEָʾᱻü + * + *ע + * òСӼ + */ +Status Concat(HString* T, HString S1, HString S2) { + int i; + + // ȷ³ + (*T).length = S1.length + S2.length; + + // ռ + (*T).ch = (char*) malloc((*T).length * sizeof(char)); + if(!(*T).ch) { + exit(OVERFLOW); + } + + // ȰS1ݿ + for(i = 0; i < S1.length; i++) { + (*T).ch[i] = S1.ch[i]; + } + + // ٿS2 + for(i = 0; i < S2.length; i++) { + (*T).ch[S1.length + i] = S2.ch[i]; + } + + return TRUE; +} + +// ӡַ +void StrPrint(HString S) { + int i; + + if(S.length == 0) { + return; + } + + for(i = 0; i < S.length; i++) { + printf("%c", S.ch[i]); + } + printf("\n"); +} \ No newline at end of file diff --git a/Dev-C++/ExerciseBook/04.24-04.26/HString.h b/Dev-C++/ExerciseBook/04.24-04.26/HString.h new file mode 100644 index 0000000..3d13eaf --- /dev/null +++ b/Dev-C++/ExerciseBook/04.24-04.26/HString.h @@ -0,0 +1,159 @@ +/*========================= + * Ķѷ洢ʾѴ + * + * 㷨: 4.4 + ==========================*/ + +#ifndef HSTRING +#define HSTRING + +#include +#include // ṩmallocreallocfreeexitԭ +#include // ṩstrlenԭ +#include "Status.h" //**01 **// + +/* + * ĶѴ洢ʾ + * + * עЧԪشch0ŵԪʼ洢 + */ +typedef struct { + char* ch; // Ƿǿմ򰴴洢chΪNULL + int length; +} HString; + + +/* + * ʾ + * + * ѭ̲ĵдϰߣposָʾַλ()1ʼ + */ + + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(HString* T, const char* chars); + +/* + * + * + * S١ + */ +Status DestroyString(HString* S); + +/* + * + * + * Sա + */ +Status ClearString(HString* S); + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(HString S); + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(HString S); + +/* + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(HString* Sub, HString S, int pos, int len); + +/* + * + * + * posʼģʽTS״γֵλãڣ򷵻0 + * ҳɹƥλá + * + *ע + * 1.ʵҪСӼ + * 2.ʵֱȽϵЧ + */ +int Index(HString S, HString T, int pos); + +/* + * 㷨4.4 + * + * + * + * T뵽Sposλô + */ +Status StrInsert(HString* S, int pos, HString T); + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(HString* S, int pos, int len); + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +Status StrCompare(HString S, HString T); + +/* + * + * + * SƵT + */ +Status StrCopy(HString* T, HString S); + +/* + * 滻 + * + * V滻SгֵTȵҲصӴ + * + *ע + * 1.òСӼ + * 2.ʵֱȽϵЧ + */ +Status Replace(HString* S, HString T, HString V); + +/* + * + * + * S1S2洢TзءӺijֻδIJ֡ + * ֵʾӺĴǷ + * + *ע + * òСӼ + */ +Status Concat(HString* T, HString S1, HString S2); + +// ӡַ +void StrPrint(HString S); + +#endif diff --git a/Dev-C++/ExerciseBook/04.27/04.27.cpp b/Dev-C++/ExerciseBook/04.27/04.27.cpp new file mode 100644 index 0000000..89fb62d --- /dev/null +++ b/Dev-C++/ExerciseBook/04.27/04.27.cpp @@ -0,0 +1,81 @@ +#include +#include "SString.h" //**04 **// + +/* ԭ */ +int Algo_4_27(SString S, SString T, int pos); + + +/* + * ңIndex + * + * posʼģʽTS״γֵλãڣ򷵻0 + * ҳɹƥλá + * + *ע + * 봫ͳIndexĽ֮ڻȱȽ׸ַĩβַ + * ǶƥʱŻȽʣµַ + */ +int main(int argc, char* argv[]) { + char* s = "aaaaaaaaaaaaaaab"; + char* t = "aaaab"; + SString S, T; + + StrAssign(S, s); + StrAssign(T, t); + printf("S = "); + StrPrint(S); + printf("T = "); + StrPrint(T); + + printf("TS״γֵλΪ"); + printf("%d\n", Algo_4_27(S, T, 1)); + + return 0; +} + + +/* + * ңIndex + * + * posʼģʽTS״γֵλãڣ򷵻0 + * ҳɹƥλá + * + *ע + * 봫ͳIndexĽ֮ڻȱȽ׸ַĩβַ + * ǶƥʱŻȽʣµַ + */ +int Algo_4_27(SString S, SString T, int pos) { + int i, j; + + if(pos < 1 || pos > S[0] || T[0] == 0) { + return 0; + } + + i = pos; + j = 1; + + while(i <= S[0] - T[0] + 1) { + // ȳԱȽ׸ַĩβַ + if(S[i] != T[j] || S[i + T[0] - 1] != T[T[0]]) { + i++; + continue; + } + + // jҪT[0]ΪT[0]Ѿ֤ + for(i++,j++; j MAXSTRLEN) { + return ERROR; + } + + T[0] = len; + for(i = 1; i <= len; i++) { + T[i] = chars[i - 1]; + } + + return OK; +} + +/* + * + * + * S١ + * + *ע + * ˳򴮵Ľṹ޷ + */ +Status DestroyString(SString S) { + return OK; +} + +/* + * + * + * Sա + */ +Status ClearString(SString S) { + // ֻҪΪ0Ϳ + S[0] = 0; + return OK; +} + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S) { + return S[0] == 0 ? TRUE : FALSE; +} + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S) { + return S[0]; +} + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len) { + int i; + + if(pos < 1 || pos > S[0] || len < 0 || pos + len - 1 > S[0]) { + return ERROR; + } + + // Ԫ + for(i = 1; i <= len; i++) { + Sub[i] = S[pos + i - 1]; + } + + // ȷ³ + Sub[0] = len; + + return OK; +} + +/* + * 㷨4.1 + * + * + * + * posʼģʽTS״γֵλãڣ򷵻0 + * ҳɹƥλá + * + *ע + * 1.ʵҪСӼ + * 2.ʵֱȽϵЧ + */ +int Index_1(SString S, SString T, int pos) { + int i, n, m; // ¼STij + SString sub; + + /* + * ʧǰ + * ̲д΢ͬ + */ + if(pos < 1 || pos > S[0] || StrEmpty(T)) { + return 0; + } + + n = StrLength(S); + m = StrLength(T); + i = pos; + + // ֤ȲԽ + while(i <= n - m + 1) { + // ȡS[i, i+m-1] + SubString(sub, S, i, m); + + // Ӵģʽƥ䣬Ҫƽ + if(StrCompare(sub, T) != 0) { + ++i; + } else { + return i; + } + } + + return 0; +} + +/* + * 㷨4.5 + * + * + * + * posʼģʽTS״γֵλãڣ򷵻0 + * ҳɹƥλá + * + *ע + * 1.ʵֲСӼ + * 2.ʵֱȽϵЧ + */ +int Index_2(SString S, SString T, int pos) { + int i = pos; + int j = 1; + + if(pos < 1 || pos > S[0] || StrEmpty(T)) { + return 0; + } + + while(i <= S[0] && j <= T[0]) { + // ַͬȽϺַ + if(S[i] == T[j]) { + i++; + j++; + + // ַͬαҪˣ±Ƚ + } else { + i = i - (j - 1) + 1; // j-1ͽ͵ǰj-1ԪأڵjԪϹһ + j = 1; // αjصTĵһλ + } + } + + // һT[0]>0ж + if(j > T[0] && T[0] > 0) { // TΪմ + return i - T[0]; // ƥɹ + } else { + return 0; + } +} + +/* + * + * + * T뵽Sposλô + */ +Status StrInsert(SString S, int pos, SString T) { + int i; + + if(pos < 1 || pos > S[0] + 1 || S[0] + T[0] > MAXSTRLEN) { + return ERROR; + } + + // ĴΪգǰ + if(StrEmpty(T)) { + return OK; + } + + // SڳλãΪT׼ + for(i = S[0]; i >= pos; i--) { + // ӺǰǰԪŲ + S[i + T[0]] = S[i]; + } + + // TSڳλ + for(i = pos; i <= pos + T[0] - 1; i++) { + S[i] = T[i - pos + 1]; + } + + // + S[0] += T[0]; + + return OK; +} + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len) { + int i; + + if(pos < 1 || pos + len - 1 > S[0] || len < 0) { + return ERROR; + } + + // ɾijΪ0ǰ + if(len == 0) { + return OK; + } + + // ѺԪŲǰ棬ǵɾԪ + for(i = pos + len; i <= S[0]; i++) { + S[i - len] = S[i]; + } + + // ȼ + S[0] -= len; + + return OK; +} + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T) { + int i = 1; + + while(i <= S[0] && i <= T[0]) { + // ַͬʱȽС + if(S[i] != T[i]) { + return S[i] - T[i]; + } + + i++; + } + + return S[0] - T[0]; +} + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S) { + int i; + + // ͬϢһ + for(i = 0; i <= S[0]; i++) { + T[i] = S[i]; + } + + return OK; +} + +/* + * 滻 + * + * V滻SгֵTȵҲصӴ + * + *ע + * 1.òСӼ + * 2.ʵֱȽϵЧ + */ +Status Replace(SString S, SString T, SString V) { + int i; + + if(StrEmpty(S) || StrEmpty(T)) { + return ERROR; + } + + // SѰģʽTһγֵλ + i = Index_2(S, T, 1); + + // ƥַҿԱȫ滻滻 + while(i != 0 && S[0] - T[0] + V[0] <= MAXSTRLEN) { + StrDelete(S, i, StrLength(T)); // SɾT + StrInsert(S, i, V); // SвV + + i += StrLength(V); // iлһλ + + i = Index_2(S, T, i); // һƥַ + } + + if(i == 0) { // SеTȫ滻 + return OK; + } else { // STVѾ岻ȥ + return ERROR; + } +} + +/* + * 㷨4.2 + * + * + * + * S1S2洢TзءӺijֻδIJ֡ + * ֵʾӺĴǷ + * + *ע + * òСӼ + */ +Status Concat(SString T, SString S1, SString S2) { + int i; + int uncut; // ´Ƿ + + // ȫҪü + if(S1[0] + S2[0] <= MAXSTRLEN) { + // S1T + for(i = 1; i <= S1[0]; i++) { + T[i] = S1[i]; + } + + // S2T + for(i = S1[0] + 1; i <= S1[0] + S2[0]; i++) { + T[i] = S2[i - S1[0]]; + } + + // ³ + T[0] = S1[0] + S2[0]; + + // δü + uncut = TRUE; + + // ҪüS2 + } else if(S1[0] <= MAXSTRLEN) { + // S1T + for(i = 1; i <= S1[0]; i++) { + T[i] = S1[i]; + } + + // S2һָƵT + for(i = S1[0] + 1; i <= MAXSTRLEN; i++) { + T[i] = S2[i - S1[0]]; + } + + // ³ + T[0] = MAXSTRLEN; + + uncut = FALSE; + + // ֻҪS1һ + } else { + // ͬϢһ + for(i = 0; i <= MAXSTRLEN; i++) { + T[i] = S1[i]; + } + + uncut = FALSE; + } + + return uncut; +} + +// ӡַ +void StrPrint(SString S) { + int i; + + for(i = 1; i<=S[0] ; i++) { + printf("%c", S[i]); + } + + printf("\n"); +} diff --git a/Dev-C++/ExerciseBook/04.27/SString.h b/Dev-C++/ExerciseBook/04.27/SString.h new file mode 100644 index 0000000..386ffb8 --- /dev/null +++ b/Dev-C++/ExerciseBook/04.27/SString.h @@ -0,0 +1,179 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#ifndef SSTRING_H +#define SSTRING_H + +#include +#include // ṩstrlenԭ +#include "Status.h" //**01 **// + +/* 궨 */ +#define MAXSTRLEN 255 // ˳򴮵󴮳 + +/* + * ˳洢Ͷ + * + * עЧԪشSString1ŵԪʼ洢 + * SString0ŵԪ洢䳤 + */ +typedef unsigned char SString[MAXSTRLEN + 1]; // 0ŵԪŴij + + +/* + * ʾ + * + * ѭ̲ĵдϰߣposָʾַλ()1ʼ + */ + + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars); + +/* + * + * + * S١ + * + *ע + * ˳򴮵Ľṹ޷ + */ +Status DestroyString(SString S); + +/* + * + * + * Sա + */ +Status ClearString(SString S); + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S); + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S); + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len); + +/* + * 㷨4.1 + * + * + * + * posʼģʽTS״γֵλãڣ򷵻0 + * ҳɹƥλá + * + *ע + * 1.ʵҪСӼ + * 2.ʵֱȽϵЧ + */ +int Index_1(SString S, SString T, int pos); + +/* + * 㷨4.5 + * + * + * + * posʼģʽTS״γֵλãڣ򷵻0 + * ҳɹƥλá + * + *ע + * 1.ʵֲСӼ + * 2.ʵֱȽϵЧ + */ +int Index_2(SString S, SString T, int pos); + +/* + * + * + * T뵽Sposλô + */ +Status StrInsert(SString S, int pos, SString T); + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len); + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T); + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S); + +/* + * 滻 + * + * V滻SгֵTȵҲصӴ + * + *ע + * òСӼЧʽϵ͡ + */ +Status Replace(SString S, SString T, SString V); + +/* + * 㷨4.2 + * + * + * + * S1S2洢TзءӺijֻδIJ֡ + * ֵʾӺĴǷ + * + *ע + * òСӼ + */ +Status Concat(SString T, SString S1, SString S2); + +// ӡַ +void StrPrint(SString S); + +#endif diff --git a/Dev-C++/ExerciseBook/04.28-04.29/04.28-04.29.cpp b/Dev-C++/ExerciseBook/04.28-04.29/04.28-04.29.cpp new file mode 100644 index 0000000..adca0c4 --- /dev/null +++ b/Dev-C++/ExerciseBook/04.28-04.29/04.28-04.29.cpp @@ -0,0 +1,211 @@ +#include +#include +#include +#include "Status.h" //**01 **// + +/* + * ԪͶ + * + *ע + * ȻַԪȻintԭǣ + * 1.Ҫͷ洢intֱchar + * 2.charintݣԽȻintҲ洢char + */ +typedef int ElemType; + +/* ַ */ +typedef struct SNode { + ElemType chdata; // ݽ + struct SNode* succ; // ָ̽ + struct SNode* next; // nextУָǰ㣬ģʽУָý㴦ʧʱӦȽϵһ +} SNode; + +// ַ +typedef SNode* String; + + +// ʼ +Status StrAssign_4_28(String* S, char* chars); + +// 󴮳 +int StrLength_4_28(String S); + +// ַ +void StrPrint_4_28(String S); + +/* + * ģʽnextֵĽ㷨 + * + * ൱KMP㷨µget_nextval + */ +Status Algo_4_28(String T); + +/* + * KMP㷨 + * + * ൱KMP㷨µIndex_KMP + */ +int Algo_4_29(String S, String T, int pos); + + +int main(int argc, char* argv[]) { + char* s = "abaaabaababaabcaabaabcacabaabcaabaabcac"; + char* t = "abaabcac"; + String S, T; + int pos, i; + + StrAssign_4_28(&S, s); // + StrAssign_4_28(&T, t); //ģʽ + + printf("S = "); + StrPrint_4_28(S); + printf("ģʽT = "); + StrPrint_4_28(T); + + printf(" 4.28 ֤...\n"); + Algo_4_28(T); + printf("next...\n"); + + printf(" 4.29 ֤...\n"); + pos = 18; + i = Algo_4_29(S, T, pos); + printf("ģʽ T S ĵ %d ַһƥɹλΪ %d\n", pos, i); + + return 0; +} + + +// ʼ +Status StrAssign_4_28(String* S, char* chars) { + int i, len; + String p; + + if(S == NULL || chars == NULL) { + return ERROR; + } + + len = (int) strlen(chars); + + // ͷ + *S = (String) malloc(sizeof(SNode)); + (*S)->chdata = len; // ¼ij + (*S)->next = NULL; // ͷǰ + + p = *S; + + for(i = 0; i < len; i++) { + p->succ = (String) malloc(sizeof(SNode)); + p->succ->chdata = chars[i]; + p->succ->next = p; // nextĬָǰһ + p = p->succ; + } + + // һĺΪNULL + p->succ = NULL; + + return OK; +} + +// 󴮳 +int StrLength_4_28(String S) { + return S == NULL ? 0 : S->chdata; +} + +// ַ +void StrPrint_4_28(String S) { + String p; + + if(S == NULL) { + printf("\n"); + return; + } + + for(p = S->succ; p != NULL; p = p->succ) { + printf("%c", p->chdata); + } + + printf("\n"); +} + +/* + * ģʽnextֵĽ㷨 + * + * ൱KMP㷨µget_nextval + */ +Status Algo_4_28(String T) { + SNode* i, * j; + + if(StrLength_4_28(T) == 0) { + return ERROR; + } + + i = T->succ; // ൱֮ǰi=1 + j = T; // ൱֮ǰj=0 + + // ģʽһַʧʱģʽҪͷȽϣҪǰһλñȽ + i->next = T; + + // ģʽϵַ + while(i->succ != NULL) { + if(j == T || i->chdata == j->chdata) { + i = i->succ; + j = j->succ; + + if(i->chdata != j->chdata) { + i->next = j; + } else { + i->next = j->next; + } + } else { + j = j->next; + } + } + + return OK; +} + +/* + * KMP㷨 + * + * ൱KMP㷨µIndex_KMP + */ +int Algo_4_29(String S, String T, int pos) { + int count; // ¼iλ + SNode* i, * j; // iSjT + + if(pos < 1 || StrLength_4_28(S) == 0 || StrLength_4_28(T) == 0) { + return 0; + } + + for(count = 1, i = S->succ; count < pos; count++, i = i->succ) { + // iָpos + } + + j = T->succ; + + // Ƚַ + while(i != NULL && j != NULL) { + /* + * Σ + * 1.ģʽĵһַʧ + * 2.ģʽַ + */ + if(j == T || i->chdata == j->chdata) { + i = i->succ; + j = j->succ; + + count++; // ¼iλ + } else { + // ʧʱصǰһʵλ + j = j->next; + } + } + + // ƥɹƥλ + if(j == NULL) { + return count-StrLength_4_28(T); + } else { + // ƥʧ + return 0; + } +} diff --git a/Dev-C++/ExerciseBook/04.28-04.29/04.28-04.29.dev b/Dev-C++/ExerciseBook/04.28-04.29/04.28-04.29.dev new file mode 100644 index 0000000..9228e85 --- /dev/null +++ b/Dev-C++/ExerciseBook/04.28-04.29/04.28-04.29.dev @@ -0,0 +1,62 @@ +[Project] +FileName=04.28-04.29.dev +Name=04.28-04.29 +Type=1 +Ver=2 +ObjFiles= +Includes= +Libs= +PrivateResource= +ResourceIncludes= +MakeIncludes= +Compiler= +CppCompiler= +Linker= +IsCpp=0 +Icon= +ExeOutput= +ObjectOutput= +LogOutput= +LogOutputEnabled=0 +OverrideOutput=0 +OverrideOutputName= +HostApplication= +UseCustomMakefile=0 +CustomMakefile= +CommandLine= +Folders= +IncludeVersionInfo=0 +SupportXPThemes=0 +CompilerSet=1 +CompilerSettings=0000000000000000001000000 +UnitCount=1 + +[VersionInfo] +Major=1 +Minor=0 +Release=0 +Build=0 +LanguageID=1033 +CharsetID=1252 +CompanyName= +FileVersion= +FileDescription=Developed using the Dev-C++ IDE +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion= +AutoIncBuildNr=0 +SyncProduct=1 + +[Unit1] +FileName=04.28-04.29.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Dev-C++/ExerciseBook/04.30/04.30.cpp b/Dev-C++/ExerciseBook/04.30/04.30.cpp new file mode 100644 index 0000000..eb772c7 --- /dev/null +++ b/Dev-C++/ExerciseBook/04.30/04.30.cpp @@ -0,0 +1,116 @@ +#include +#include "SString.h" //**04 **// + +/* + * ڴSв״γֵظӴλ + * Sub¼ظӴ + * pos¼Sгֵλ + * + * ˴ظӴº壺 + * 1.Ӵ + * 2.ӴظӴ׸ģ + * 3.ӴصȡabcabcaĽΪabca + * 4.ӴڿظȡaaaaĽΪaaa + */ +Status Algo_4_30(SString S, SString Sub, int* pos); + + +int main(int argc, char* argv[]) { + char* s = "abcdeabcabcbcdefbcdefefghefgh"; + SString Sub, S; + int pos; + + StrAssign(S, s); + printf("...\n"); + printf("S = "); + StrPrint(S); + + printf("׸ظӴ...\n"); + printf("Sub = "); + Algo_4_30(S, Sub, &pos); + StrPrint(Sub); + printf("Sub S ״γֵλΪ %d\n", pos); + + return 0; +} + + +/* + * ڴSв״γֵظӴλ + * Sub¼ظӴ + * pos¼Sгֵλ + * + * ˴ظӴº壺 + * 1.Ӵ + * 2.ӴظӴ׸ģ + * 3.ӴصȡabcabcaĽΪabca + * 4.ӴڿظȡaaaaĽΪaaa + */ +Status Algo_4_30(SString S, SString Sub, int* pos) { + int i, j, is, js; + int k, start; + int len, maxLen; + + // Ȳ2 + if(S[0] < 2) { + return ERROR; + } + + start = 0; + maxLen = 0; + + // пܵ + for(k = 1; k < S[0]; k++) { + is = k; // + js = k + 1; // Ӵ + + // ʣַ֪ظַٱȥ + if(S[0] - js + 1 <= maxLen) { + break; + } + + // isΪĴظĴ + while(TRUE) { + // ѰDZڵظӴ + while(js <= S[0] && S[is] != S[js]) { + js++; + } + + // ˵㴦ַΨһ + if(js > S[0]) { + break; + } + + // ʣַ֪ظַٱȥ + if(S[0] - js + 1 <= maxLen) { + break; + } + + len = 0; + i = is; + j = js; + + // ظij + while(j <= S[0] && S[i] == S[j]) { + i++; + j++; + len++; + } + + if(len > maxLen) { + start = k; + maxLen = len; + } + + // 鿴ûиظ + if(j < S[0]) { + js++; + } + } + } + + *pos = start; + SubString(Sub, S, start, maxLen); + + return OK; +} diff --git a/Dev-C++/ExerciseBook/04.30/04.30.dev b/Dev-C++/ExerciseBook/04.30/04.30.dev new file mode 100644 index 0000000..db37f3d --- /dev/null +++ b/Dev-C++/ExerciseBook/04.30/04.30.dev @@ -0,0 +1,82 @@ +[Project] +FileName=04.30.dev +Name=04.30 +Type=1 +Ver=2 +ObjFiles= +Includes= +Libs= +PrivateResource= +ResourceIncludes= +MakeIncludes= +Compiler= +CppCompiler= +Linker= +IsCpp=0 +Icon= +ExeOutput= +ObjectOutput= +LogOutput= +LogOutputEnabled=0 +OverrideOutput=0 +OverrideOutputName= +HostApplication= +UseCustomMakefile=0 +CustomMakefile= +CommandLine= +Folders= +IncludeVersionInfo=0 +SupportXPThemes=0 +CompilerSet=1 +CompilerSettings=0000000000000000001000000 +UnitCount=3 + +[VersionInfo] +Major=1 +Minor=0 +Release=0 +Build=0 +LanguageID=1033 +CharsetID=1252 +CompanyName= +FileVersion= +FileDescription=Developed using the Dev-C++ IDE +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion= +AutoIncBuildNr=0 +SyncProduct=1 + +[Unit2] +FileName=SString.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit1] +FileName=04.30.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=SString.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Dev-C++/ExerciseBook/04.30/SString.cpp b/Dev-C++/ExerciseBook/04.30/SString.cpp new file mode 100644 index 0000000..fc4c757 --- /dev/null +++ b/Dev-C++/ExerciseBook/04.30/SString.cpp @@ -0,0 +1,406 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#include "SString.h" //**04 **// + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars) { + int i, len; + + len = (int) strlen(chars); + + // chars + if(len > MAXSTRLEN) { + return ERROR; + } + + T[0] = len; + for(i = 1; i <= len; i++) { + T[i] = chars[i - 1]; + } + + return OK; +} + +/* + * + * + * S١ + * + *ע + * ˳򴮵Ľṹ޷ + */ +Status DestroyString(SString S) { + return OK; +} + +/* + * + * + * Sա + */ +Status ClearString(SString S) { + // ֻҪΪ0Ϳ + S[0] = 0; + return OK; +} + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S) { + return S[0] == 0 ? TRUE : FALSE; +} + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S) { + return S[0]; +} + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len) { + int i; + + if(pos < 1 || pos > S[0] || len < 0 || pos + len - 1 > S[0]) { + return ERROR; + } + + // Ԫ + for(i = 1; i <= len; i++) { + Sub[i] = S[pos + i - 1]; + } + + // ȷ³ + Sub[0] = len; + + return OK; +} + +/* + * 㷨4.1 + * + * + * + * posʼģʽTS״γֵλãڣ򷵻0 + * ҳɹƥλá + * + *ע + * 1.ʵҪСӼ + * 2.ʵֱȽϵЧ + */ +int Index_1(SString S, SString T, int pos) { + int i, n, m; // ¼STij + SString sub; + + /* + * ʧǰ + * ̲д΢ͬ + */ + if(pos < 1 || pos > S[0] || StrEmpty(T)) { + return 0; + } + + n = StrLength(S); + m = StrLength(T); + i = pos; + + // ֤ȲԽ + while(i <= n - m + 1) { + // ȡS[i, i+m-1] + SubString(sub, S, i, m); + + // Ӵģʽƥ䣬Ҫƽ + if(StrCompare(sub, T) != 0) { + ++i; + } else { + return i; + } + } + + return 0; +} + +/* + * 㷨4.5 + * + * + * + * posʼģʽTS״γֵλãڣ򷵻0 + * ҳɹƥλá + * + *ע + * 1.ʵֲСӼ + * 2.ʵֱȽϵЧ + */ +int Index_2(SString S, SString T, int pos) { + int i = pos; + int j = 1; + + if(pos < 1 || pos > S[0] || StrEmpty(T)) { + return 0; + } + + while(i <= S[0] && j <= T[0]) { + // ַͬȽϺַ + if(S[i] == T[j]) { + i++; + j++; + + // ַͬαҪˣ±Ƚ + } else { + i = i - (j - 1) + 1; // j-1ͽ͵ǰj-1ԪأڵjԪϹһ + j = 1; // αjصTĵһλ + } + } + + // һT[0]>0ж + if(j > T[0] && T[0] > 0) { // TΪմ + return i - T[0]; // ƥɹ + } else { + return 0; + } +} + +/* + * + * + * T뵽Sposλô + */ +Status StrInsert(SString S, int pos, SString T) { + int i; + + if(pos < 1 || pos > S[0] + 1 || S[0] + T[0] > MAXSTRLEN) { + return ERROR; + } + + // ĴΪգǰ + if(StrEmpty(T)) { + return OK; + } + + // SڳλãΪT׼ + for(i = S[0]; i >= pos; i--) { + // ӺǰǰԪŲ + S[i + T[0]] = S[i]; + } + + // TSڳλ + for(i = pos; i <= pos + T[0] - 1; i++) { + S[i] = T[i - pos + 1]; + } + + // + S[0] += T[0]; + + return OK; +} + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len) { + int i; + + if(pos < 1 || pos + len - 1 > S[0] || len < 0) { + return ERROR; + } + + // ɾijΪ0ǰ + if(len == 0) { + return OK; + } + + // ѺԪŲǰ棬ǵɾԪ + for(i = pos + len; i <= S[0]; i++) { + S[i - len] = S[i]; + } + + // ȼ + S[0] -= len; + + return OK; +} + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T) { + int i = 1; + + while(i <= S[0] && i <= T[0]) { + // ַͬʱȽС + if(S[i] != T[i]) { + return S[i] - T[i]; + } + + i++; + } + + return S[0] - T[0]; +} + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S) { + int i; + + // ͬϢһ + for(i = 0; i <= S[0]; i++) { + T[i] = S[i]; + } + + return OK; +} + +/* + * 滻 + * + * V滻SгֵTȵҲصӴ + * + *ע + * 1.òСӼ + * 2.ʵֱȽϵЧ + */ +Status Replace(SString S, SString T, SString V) { + int i; + + if(StrEmpty(S) || StrEmpty(T)) { + return ERROR; + } + + // SѰģʽTһγֵλ + i = Index_2(S, T, 1); + + // ƥַҿԱȫ滻滻 + while(i != 0 && S[0] - T[0] + V[0] <= MAXSTRLEN) { + StrDelete(S, i, StrLength(T)); // SɾT + StrInsert(S, i, V); // SвV + + i += StrLength(V); // iлһλ + + i = Index_2(S, T, i); // һƥַ + } + + if(i == 0) { // SеTȫ滻 + return OK; + } else { // STVѾ岻ȥ + return ERROR; + } +} + +/* + * 㷨4.2 + * + * + * + * S1S2洢TзءӺijֻδIJ֡ + * ֵʾӺĴǷ + * + *ע + * òСӼ + */ +Status Concat(SString T, SString S1, SString S2) { + int i; + int uncut; // ´Ƿ + + // ȫҪü + if(S1[0] + S2[0] <= MAXSTRLEN) { + // S1T + for(i = 1; i <= S1[0]; i++) { + T[i] = S1[i]; + } + + // S2T + for(i = S1[0] + 1; i <= S1[0] + S2[0]; i++) { + T[i] = S2[i - S1[0]]; + } + + // ³ + T[0] = S1[0] + S2[0]; + + // δü + uncut = TRUE; + + // ҪüS2 + } else if(S1[0] <= MAXSTRLEN) { + // S1T + for(i = 1; i <= S1[0]; i++) { + T[i] = S1[i]; + } + + // S2һָƵT + for(i = S1[0] + 1; i <= MAXSTRLEN; i++) { + T[i] = S2[i - S1[0]]; + } + + // ³ + T[0] = MAXSTRLEN; + + uncut = FALSE; + + // ֻҪS1һ + } else { + // ͬϢһ + for(i = 0; i <= MAXSTRLEN; i++) { + T[i] = S1[i]; + } + + uncut = FALSE; + } + + return uncut; +} + +// ӡַ +void StrPrint(SString S) { + int i; + + for(i = 1; i<=S[0] ; i++) { + printf("%c", S[i]); + } + + printf("\n"); +} diff --git a/Dev-C++/ExerciseBook/04.30/SString.h b/Dev-C++/ExerciseBook/04.30/SString.h new file mode 100644 index 0000000..386ffb8 --- /dev/null +++ b/Dev-C++/ExerciseBook/04.30/SString.h @@ -0,0 +1,179 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#ifndef SSTRING_H +#define SSTRING_H + +#include +#include // ṩstrlenԭ +#include "Status.h" //**01 **// + +/* 궨 */ +#define MAXSTRLEN 255 // ˳򴮵󴮳 + +/* + * ˳洢Ͷ + * + * עЧԪشSString1ŵԪʼ洢 + * SString0ŵԪ洢䳤 + */ +typedef unsigned char SString[MAXSTRLEN + 1]; // 0ŵԪŴij + + +/* + * ʾ + * + * ѭ̲ĵдϰߣposָʾַλ()1ʼ + */ + + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars); + +/* + * + * + * S١ + * + *ע + * ˳򴮵Ľṹ޷ + */ +Status DestroyString(SString S); + +/* + * + * + * Sա + */ +Status ClearString(SString S); + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S); + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S); + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len); + +/* + * 㷨4.1 + * + * + * + * posʼģʽTS״γֵλãڣ򷵻0 + * ҳɹƥλá + * + *ע + * 1.ʵҪСӼ + * 2.ʵֱȽϵЧ + */ +int Index_1(SString S, SString T, int pos); + +/* + * 㷨4.5 + * + * + * + * posʼģʽTS״γֵλãڣ򷵻0 + * ҳɹƥλá + * + *ע + * 1.ʵֲСӼ + * 2.ʵֱȽϵЧ + */ +int Index_2(SString S, SString T, int pos); + +/* + * + * + * T뵽Sposλô + */ +Status StrInsert(SString S, int pos, SString T); + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len); + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T); + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S); + +/* + * 滻 + * + * V滻SгֵTȵҲصӴ + * + *ע + * òСӼЧʽϵ͡ + */ +Status Replace(SString S, SString T, SString V); + +/* + * 㷨4.2 + * + * + * + * S1S2洢TзءӺijֻδIJ֡ + * ֵʾӺĴǷ + * + *ע + * òСӼ + */ +Status Concat(SString T, SString S1, SString S2); + +// ӡַ +void StrPrint(SString S); + +#endif diff --git a/Dev-C++/ExerciseBook/04.31/04.31.cpp b/Dev-C++/ExerciseBook/04.31/04.31.cpp new file mode 100644 index 0000000..91ede0d --- /dev/null +++ b/Dev-C++/ExerciseBook/04.31/04.31.cpp @@ -0,0 +1,248 @@ +#include +#include +#include "Status.h" //**01 **// +#include "SString.h" //**04 **// + +/* + * ʾ + * + * һ̬滮⣬ϸ˼·μ㷨ۡ15.4ڡ + * + * ע㷨ۡе""ͳƲӴDZֻͳӴ + */ + + +/* Ӵ */ +typedef struct { + char dir; + int len; +} LCS; + +/* Ӵ */ +typedef struct { + int s; // ӴڴSеλ + int t; // ӴڴTеλ +} Pos; + +/* Ӵ */ +typedef struct { + int maxlen; // Ӵij + Pos* pos; // Ӵ + int count; // Ӵ +} Strs; + + +/* + * STеӴ + * + * УıΪ"һֵӴ" + */ +Status Algo_4_31(SString S, SString T); + +/* + * ȡӴϢ + */ +void LocationPos(SString S, SString T, Strs* strs); + +/* + * ӴȡӴijȡ + */ +Status BuildLCS(SString S, SString T, LCS*** lcs, int* maxLen); + +/* + * ӡӴѡ + */ +void PrintLCS(SString S, SString T, LCS** lcs); + + +int main(int argc, char* argv[]) { + char* s = "csajcu123456ewjfskhsdufasawx"; + char* t = "m123456vsadksjewjfshcdsdufassgcx"; + SString S, T; + + StrAssign(S, s); + StrAssign(T, t); + + Algo_4_31(S, T); + + return 0; +} + + +/* + * STеӴ + * + * УıΪ"һֵӴ" + */ +Status Algo_4_31(SString S, SString T) { + Strs strs; + SString sub; + int i; + + LocationPos(S, T, &strs); + + printf("ӴijΪ%d \n", strs.maxlen); + printf("Ӵ꣺\n"); + for(i=0; i=size) { + size += 10; + (*strs).pos = (Pos*) realloc((*strs).pos, size * sizeof(Pos)); + } + + (*strs).pos[(*strs).count].s = i-maxLen+1; + (*strs).pos[(*strs).count].t = j-maxLen+1; + (*strs).count++; + } + } +} + +/* + * ӴȡӴijȡ + */ +Status BuildLCS(SString S, SString T, LCS*** lcs, int* maxLen) { + int sLen, tLen; + int i, j; + int max; + LCS node; + + sLen = StrLength(S); + tLen = StrLength(T); + + if(sLen == 0 || tLen == 0) { + return ERROR; + } + + // ʼLCS + *lcs = (LCS**) malloc((sLen + 1) * sizeof(LCS*)); + for(i = 0; i <= sLen; i++) { + (*lcs)[i] = (LCS*) malloc((tLen + 1) * sizeof(LCS)); + } + + for(i = 0; i <= sLen; i++) { + (*lcs)[i][0].dir = ' '; + (*lcs)[i][0].len = 0; + } + + for(j = 0; j <= tLen; j++) { + (*lcs)[0][j].dir = ' '; + (*lcs)[0][j].len = 0; + } + + max = 0; + + for(i = 1; i <= sLen; i++) { + for(j = 1; j <= tLen; j++) { + // 롶㷨ۡеĽ΢ͬ˴ҪͳӴ + if(S[i] == T[j]) { + // ǰһַҲȣ˵ǸĹӴ + if(i > 1 && j > 1 && S[i - 1] == T[j - 1]) { + node.dir = '\\'; + node.len = (*lcs)[i - 1][j - 1].len + 1; + + // Ͽ + } else { + node.dir = ' '; + node.len = 1; + } + + if(node.len > max) { + max = node.len; + } + } else { + if((*lcs)[i - 1][j].len >= (*lcs)[i][j - 1].dir) { + node.dir = '^'; + node.len = (*lcs)[i - 1][j].len; + } else { + node.dir = '<'; + node.len = (*lcs)[i][j - 1].len; + } + } + + (*lcs)[i][j] = node; + } + } + + *maxLen = max; + + return ERROR; +} + +/* + * ӡӴѡ + */ +void PrintLCS(SString S, SString T, LCS** lcs) { + int sLen, tLen; + int i, j; + + sLen = StrLength(S); + tLen = StrLength(T); + + if(sLen == 0 || tLen == 0) { + return; + } + + // һ + printf(" "); + for(j = 1; j <= tLen; j++) { + printf(" %c ", T[j]); + } + printf("\n"); + + // ڶ + printf(" "); + for(j = 1; j <= tLen; j++) { + printf("--- "); + } + printf("\n"); + + for(i = 1; i <= sLen; i++) { + for(j = 1; j <= tLen; j++) { + // ÿһеĿʼ + if(j == 1) { + printf("%c |", S[i]); + } + + printf("%c%2d ", lcs[i][j].dir, lcs[i][j].len); + } + printf("\n"); + } + + printf("\n"); +} diff --git a/Dev-C++/ExerciseBook/04.31/04.31.dev b/Dev-C++/ExerciseBook/04.31/04.31.dev new file mode 100644 index 0000000..ba549f4 --- /dev/null +++ b/Dev-C++/ExerciseBook/04.31/04.31.dev @@ -0,0 +1,82 @@ +[Project] +FileName=04.31.dev +Name=04.31 +Type=1 +Ver=2 +ObjFiles= +Includes= +Libs= +PrivateResource= +ResourceIncludes= +MakeIncludes= +Compiler= +CppCompiler= +Linker= +IsCpp=0 +Icon= +ExeOutput= +ObjectOutput= +LogOutput= +LogOutputEnabled=0 +OverrideOutput=0 +OverrideOutputName= +HostApplication= +UseCustomMakefile=0 +CustomMakefile= +CommandLine= +Folders= +IncludeVersionInfo=0 +SupportXPThemes=0 +CompilerSet=1 +CompilerSettings=0000000000000000001000000 +UnitCount=3 + +[VersionInfo] +Major=1 +Minor=0 +Release=0 +Build=0 +LanguageID=1033 +CharsetID=1252 +CompanyName= +FileVersion= +FileDescription=Developed using the Dev-C++ IDE +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion= +AutoIncBuildNr=0 +SyncProduct=1 + +[Unit2] +FileName=SString.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit1] +FileName=04.31.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=SString.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Dev-C++/ExerciseBook/04.31/SString.cpp b/Dev-C++/ExerciseBook/04.31/SString.cpp new file mode 100644 index 0000000..fc4c757 --- /dev/null +++ b/Dev-C++/ExerciseBook/04.31/SString.cpp @@ -0,0 +1,406 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#include "SString.h" //**04 **// + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars) { + int i, len; + + len = (int) strlen(chars); + + // chars + if(len > MAXSTRLEN) { + return ERROR; + } + + T[0] = len; + for(i = 1; i <= len; i++) { + T[i] = chars[i - 1]; + } + + return OK; +} + +/* + * + * + * S١ + * + *ע + * ˳򴮵Ľṹ޷ + */ +Status DestroyString(SString S) { + return OK; +} + +/* + * + * + * Sա + */ +Status ClearString(SString S) { + // ֻҪΪ0Ϳ + S[0] = 0; + return OK; +} + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S) { + return S[0] == 0 ? TRUE : FALSE; +} + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S) { + return S[0]; +} + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len) { + int i; + + if(pos < 1 || pos > S[0] || len < 0 || pos + len - 1 > S[0]) { + return ERROR; + } + + // Ԫ + for(i = 1; i <= len; i++) { + Sub[i] = S[pos + i - 1]; + } + + // ȷ³ + Sub[0] = len; + + return OK; +} + +/* + * 㷨4.1 + * + * + * + * posʼģʽTS״γֵλãڣ򷵻0 + * ҳɹƥλá + * + *ע + * 1.ʵҪСӼ + * 2.ʵֱȽϵЧ + */ +int Index_1(SString S, SString T, int pos) { + int i, n, m; // ¼STij + SString sub; + + /* + * ʧǰ + * ̲д΢ͬ + */ + if(pos < 1 || pos > S[0] || StrEmpty(T)) { + return 0; + } + + n = StrLength(S); + m = StrLength(T); + i = pos; + + // ֤ȲԽ + while(i <= n - m + 1) { + // ȡS[i, i+m-1] + SubString(sub, S, i, m); + + // Ӵģʽƥ䣬Ҫƽ + if(StrCompare(sub, T) != 0) { + ++i; + } else { + return i; + } + } + + return 0; +} + +/* + * 㷨4.5 + * + * + * + * posʼģʽTS״γֵλãڣ򷵻0 + * ҳɹƥλá + * + *ע + * 1.ʵֲСӼ + * 2.ʵֱȽϵЧ + */ +int Index_2(SString S, SString T, int pos) { + int i = pos; + int j = 1; + + if(pos < 1 || pos > S[0] || StrEmpty(T)) { + return 0; + } + + while(i <= S[0] && j <= T[0]) { + // ַͬȽϺַ + if(S[i] == T[j]) { + i++; + j++; + + // ַͬαҪˣ±Ƚ + } else { + i = i - (j - 1) + 1; // j-1ͽ͵ǰj-1ԪأڵjԪϹһ + j = 1; // αjصTĵһλ + } + } + + // һT[0]>0ж + if(j > T[0] && T[0] > 0) { // TΪմ + return i - T[0]; // ƥɹ + } else { + return 0; + } +} + +/* + * + * + * T뵽Sposλô + */ +Status StrInsert(SString S, int pos, SString T) { + int i; + + if(pos < 1 || pos > S[0] + 1 || S[0] + T[0] > MAXSTRLEN) { + return ERROR; + } + + // ĴΪգǰ + if(StrEmpty(T)) { + return OK; + } + + // SڳλãΪT׼ + for(i = S[0]; i >= pos; i--) { + // ӺǰǰԪŲ + S[i + T[0]] = S[i]; + } + + // TSڳλ + for(i = pos; i <= pos + T[0] - 1; i++) { + S[i] = T[i - pos + 1]; + } + + // + S[0] += T[0]; + + return OK; +} + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len) { + int i; + + if(pos < 1 || pos + len - 1 > S[0] || len < 0) { + return ERROR; + } + + // ɾijΪ0ǰ + if(len == 0) { + return OK; + } + + // ѺԪŲǰ棬ǵɾԪ + for(i = pos + len; i <= S[0]; i++) { + S[i - len] = S[i]; + } + + // ȼ + S[0] -= len; + + return OK; +} + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T) { + int i = 1; + + while(i <= S[0] && i <= T[0]) { + // ַͬʱȽС + if(S[i] != T[i]) { + return S[i] - T[i]; + } + + i++; + } + + return S[0] - T[0]; +} + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S) { + int i; + + // ͬϢһ + for(i = 0; i <= S[0]; i++) { + T[i] = S[i]; + } + + return OK; +} + +/* + * 滻 + * + * V滻SгֵTȵҲصӴ + * + *ע + * 1.òСӼ + * 2.ʵֱȽϵЧ + */ +Status Replace(SString S, SString T, SString V) { + int i; + + if(StrEmpty(S) || StrEmpty(T)) { + return ERROR; + } + + // SѰģʽTһγֵλ + i = Index_2(S, T, 1); + + // ƥַҿԱȫ滻滻 + while(i != 0 && S[0] - T[0] + V[0] <= MAXSTRLEN) { + StrDelete(S, i, StrLength(T)); // SɾT + StrInsert(S, i, V); // SвV + + i += StrLength(V); // iлһλ + + i = Index_2(S, T, i); // һƥַ + } + + if(i == 0) { // SеTȫ滻 + return OK; + } else { // STVѾ岻ȥ + return ERROR; + } +} + +/* + * 㷨4.2 + * + * + * + * S1S2洢TзءӺijֻδIJ֡ + * ֵʾӺĴǷ + * + *ע + * òСӼ + */ +Status Concat(SString T, SString S1, SString S2) { + int i; + int uncut; // ´Ƿ + + // ȫҪü + if(S1[0] + S2[0] <= MAXSTRLEN) { + // S1T + for(i = 1; i <= S1[0]; i++) { + T[i] = S1[i]; + } + + // S2T + for(i = S1[0] + 1; i <= S1[0] + S2[0]; i++) { + T[i] = S2[i - S1[0]]; + } + + // ³ + T[0] = S1[0] + S2[0]; + + // δü + uncut = TRUE; + + // ҪüS2 + } else if(S1[0] <= MAXSTRLEN) { + // S1T + for(i = 1; i <= S1[0]; i++) { + T[i] = S1[i]; + } + + // S2һָƵT + for(i = S1[0] + 1; i <= MAXSTRLEN; i++) { + T[i] = S2[i - S1[0]]; + } + + // ³ + T[0] = MAXSTRLEN; + + uncut = FALSE; + + // ֻҪS1һ + } else { + // ͬϢһ + for(i = 0; i <= MAXSTRLEN; i++) { + T[i] = S1[i]; + } + + uncut = FALSE; + } + + return uncut; +} + +// ӡַ +void StrPrint(SString S) { + int i; + + for(i = 1; i<=S[0] ; i++) { + printf("%c", S[i]); + } + + printf("\n"); +} diff --git a/Dev-C++/ExerciseBook/04.31/SString.h b/Dev-C++/ExerciseBook/04.31/SString.h new file mode 100644 index 0000000..386ffb8 --- /dev/null +++ b/Dev-C++/ExerciseBook/04.31/SString.h @@ -0,0 +1,179 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#ifndef SSTRING_H +#define SSTRING_H + +#include +#include // ṩstrlenԭ +#include "Status.h" //**01 **// + +/* 궨 */ +#define MAXSTRLEN 255 // ˳򴮵󴮳 + +/* + * ˳洢Ͷ + * + * עЧԪشSString1ŵԪʼ洢 + * SString0ŵԪ洢䳤 + */ +typedef unsigned char SString[MAXSTRLEN + 1]; // 0ŵԪŴij + + +/* + * ʾ + * + * ѭ̲ĵдϰߣposָʾַλ()1ʼ + */ + + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars); + +/* + * + * + * S١ + * + *ע + * ˳򴮵Ľṹ޷ + */ +Status DestroyString(SString S); + +/* + * + * + * Sա + */ +Status ClearString(SString S); + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S); + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S); + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len); + +/* + * 㷨4.1 + * + * + * + * posʼģʽTS״γֵλãڣ򷵻0 + * ҳɹƥλá + * + *ע + * 1.ʵҪСӼ + * 2.ʵֱȽϵЧ + */ +int Index_1(SString S, SString T, int pos); + +/* + * 㷨4.5 + * + * + * + * posʼģʽTS״γֵλãڣ򷵻0 + * ҳɹƥλá + * + *ע + * 1.ʵֲСӼ + * 2.ʵֱȽϵЧ + */ +int Index_2(SString S, SString T, int pos); + +/* + * + * + * T뵽Sposλô + */ +Status StrInsert(SString S, int pos, SString T); + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len); + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T); + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S); + +/* + * 滻 + * + * V滻SгֵTȵҲصӴ + * + *ע + * òСӼЧʽϵ͡ + */ +Status Replace(SString S, SString T, SString V); + +/* + * 㷨4.2 + * + * + * + * S1S2洢TзءӺijֻδIJ֡ + * ֵʾӺĴǷ + * + *ע + * òСӼ + */ +Status Concat(SString T, SString S1, SString S2); + +// ӡַ +void StrPrint(SString S); + +#endif diff --git a/VisualC++/ExerciseBook/04.10/04.10.c b/VisualC++/ExerciseBook/04.10/04.10.c new file mode 100644 index 0000000..5a98ea3 --- /dev/null +++ b/VisualC++/ExerciseBook/04.10/04.10.c @@ -0,0 +1,35 @@ +#include +#include "String.h" //**ַ**// + +/* + * ַãTΪR + */ +StringType Algo_4_10(StringType T) { + int i; + StringType R = "", Sub; + + // Ӻǰȡַ + for(i = StrLength(T); i >= 1; i--) { + Sub = SubString(T, i, 1); + R = Concat(R, Sub); + } + + return R; +} + + +int main(int argc, char* argv[]) { + char* s = "0123456789"; + StringType T, R; + + printf("ǰT = "); + StrAssign(&T, s); + StrPrint(T); + + printf("úR = "); + R = Algo_4_10(T); + StrPrint(R); + + return 0; +} + diff --git a/VisualC++/ExerciseBook/04.10/04.10.vcxproj b/VisualC++/ExerciseBook/04.10/04.10.vcxproj new file mode 100644 index 0000000..12e09b5 --- /dev/null +++ b/VisualC++/ExerciseBook/04.10/04.10.vcxproj @@ -0,0 +1,76 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {84E5A31E-0EC6-4747-8B3D-BAFF28320A58} + My0410 + + + + Application + true + MultiByte + + + Application + false + true + MultiByte + + + + + + + + + + + + + $(SolutionDir)\..\Status;$(IncludePath) + + + + Level3 + Disabled + + + true + $(SolutionDir)\..\Status\Status.lib;%(AdditionalDependencies) + Console + + + + + Level3 + MaxSpeed + true + true + + + true + true + true + + + + + + + + + + + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/04.10/04.10.vcxproj.filters b/VisualC++/ExerciseBook/04.10/04.10.vcxproj.filters new file mode 100644 index 0000000..5e9d56e --- /dev/null +++ b/VisualC++/ExerciseBook/04.10/04.10.vcxproj.filters @@ -0,0 +1,30 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + 源文件 + + + 源文件 + + + + + 头文件 + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/04.10/04.10.vcxproj.user b/VisualC++/ExerciseBook/04.10/04.10.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/VisualC++/ExerciseBook/04.10/04.10.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/04.10/String.c b/VisualC++/ExerciseBook/04.10/String.c new file mode 100644 index 0000000..41df51c --- /dev/null +++ b/VisualC++/ExerciseBook/04.10/String.c @@ -0,0 +1,151 @@ +/*=========================== + * ϰ4.10~4.14ʹõַ + ============================*/ + +#include "String.h" + +// ʼһֵΪsĴt +void StrAssign(StringType* t, const char* s) { + if(s == NULL) { + *t = ""; + } + + *t = (char*) malloc((strlen(s) + 1) * sizeof(char)); + + strcpy(*t, s); +} + +// ȽϣstĴССһ£0 +int StrCompare(StringType s, StringType t) { + return strcmp(s, t); +} + +// ַsij +int StrLength(StringType s) { + return (int) strlen(s); +} + +// ӣstӺĴ +StringType Concat(StringType s, StringType t) { + StringType r; + + if(s == NULL) { + s = ""; + } + + if(t == NULL) { + t = ""; + } + + r = (char*) malloc((strlen(s) + strlen(t) + 1) * sizeof(char)); + r[0] = '\0'; + + strcat(r, s); + strcat(r, t); + + return r; +} + +// Ӵsstartλ𣬽ȡlenַ󷵻 +StringType SubString(StringType s, int start, int len) { + int n; + char* sub; + + n = (int) strlen(s); + + if(start < 1 || start > n || start + len - 1 > n || len < 0) { + return ""; + } + + sub = (char*) malloc((len + 1) * sizeof(char)); + strncpy(sub, s + start - 1, len); + sub[len] = '\0'; + + return sub; +} + +// ңsposλtҵλ +int Index(StringType s, StringType t, int pos) { + int m, n, i; + StringType sub; + + // ʧǰ + if(pos < 1 || pos > StrLength(s) || StrLength(t) == 0) { + return 0; + } + + n = StrLength(s); + m = StrLength(t); + i = pos; + + // ֤ȲԽ + while(i <= n - m + 1) { + // ȡS[i, i+m-1] + sub = SubString(s, i, m); + + // Ӵģʽƥ䣬Ҫƽ + if(StrCompare(sub, t) != 0) { + ++i; + } else { + return i; + } + } + + return 0; +} + +// 룺spost +Status StrInsert(StringType* s, int pos, StringType t) { + StringType r; + StringType s1, s2; + + if(pos < 1 || pos > StrLength(*s) + 1) { + return ERROR; + } + + r = (StringType) malloc((strlen(*s) + strlen(t) + 1) * sizeof(char)); + r[0] = '\0'; + + // ĴΪգǰ + if(StrLength(t) == 0) { + return OK; + } + + s1 = SubString(*s, 1, pos - 1); + s2 = SubString(*s, pos, (int) strlen(*s) - pos + 1); + + strcat(r, s1); + strcat(r, t); + strcat(r, s2); + + *s = r; + + return OK; +} + +// ɾsposλɾlenַ +Status StrDelete(StringType* s, int pos, int len) { + StringType r; + + if(pos < 1 || pos + len - 1 > StrLength(*s) || len < 0) { + return ERROR; + } + + // ɾijΪ0ǰ + if(len == 0) { + return OK; + } + + r = (StringType) malloc((StrLength(*s) - len + 1) * sizeof(char)); + strncpy(r, *s, pos - 1); + strcpy(r + pos - 1, *s + pos + len - 1); + + *s = r; + + return OK; +} + +// ַ +void StrPrint(StringType s) { + printf("%s\n", s); +} diff --git a/VisualC++/ExerciseBook/04.10/String.h b/VisualC++/ExerciseBook/04.10/String.h new file mode 100644 index 0000000..9d984af --- /dev/null +++ b/VisualC++/ExerciseBook/04.10/String.h @@ -0,0 +1,43 @@ +/*=========================== + * ϰ4.10~4.14ʹõַ + ============================*/ + +#ifndef STRING_H +#define STRING_H + +#include +#include // ṩ strlen ԭ +#include "Status.h" //**01 **// + +/* ַ */ +typedef char* StringType; + + +// ʼһֵΪsĴt +void StrAssign(StringType* t, const char* s); + +// ȽϣstĴССһ£0 +int StrCompare(StringType s, StringType t); + +// ַsij +int StrLength(StringType s); + +// ӣstӺĴ +StringType Concat(StringType s, StringType t); + +// Ӵsstartλ𣬽ȡlenַ󷵻 +StringType SubString(StringType s, int start, int len); + +// ңsposλtҵλ +int Index(StringType s, StringType t, int pos); + +// 룺spost +Status StrInsert(StringType* s, int pos, StringType t); + +// ɾsposλɾlenַ +Status StrDelete(StringType* s, int pos, int len); + +// ַ +void StrPrint(StringType s); + +#endif diff --git a/VisualC++/ExerciseBook/04.11/04.11.c b/VisualC++/ExerciseBook/04.11/04.11.c new file mode 100644 index 0000000..7dd1b18 --- /dev/null +++ b/VisualC++/ExerciseBook/04.11/04.11.c @@ -0,0 +1,69 @@ +#include +#include +#include "String.h" //**ַ**// + +/* + * R=S-STa洢RÿַSеһγֵλ + * + * עa0ŵԪ洢aԪصĸ + */ +void Algo_4_11(StringType* R, StringType S, StringType T, int** a) { + int i, p; + StringType ch; + + *a = (int*) malloc((StrLength(S) + 1) * sizeof(int)); + + StrAssign(R, ""); + + for(i = 1, (*a)[0] = 0; i <= StrLength(S); i++) { + // ȡַж + ch = SubString(S, i, 1); + + // ȡS[i]Tеλ + p = Index(T, ch, 1); + + // S[i]T + if(p == 0) { + // ȡS[i]Rеλ + p = Index(*R, ch, 1); + } + + // S[i]ȲTУûRгֹ + if(p == 0) { + (*a)[0]++; + (*a)[(*a)[0]] = i; + + // RS[i] + StrInsert(R, (*a)[0], ch); + } + } +} + + +int main(int argc, char* argv[]) { + char* s = "amdhcjgfdlpinbefcopgkqikeb"; + char* t = "mhjlpinopkqik"; + int* a; + StringType T, S, R; + int i; + + printf("ʼST...\n"); + StrAssign(&S, s); + StrAssign(&T, t); + printf("S = "); + StrPrint(S); + printf("T = "); + StrPrint(T); + + Algo_4_11(&R, S, T, &a); + printf("R = "); + StrPrint(R); + + printf("a = "); + for(i = 1; i <= a[0]; i++) { + printf("%d ", a[i]); + } + printf("\n"); + + return 0; +} diff --git a/VisualC++/ExerciseBook/04.11/04.11.vcxproj b/VisualC++/ExerciseBook/04.11/04.11.vcxproj new file mode 100644 index 0000000..e7df4b3 --- /dev/null +++ b/VisualC++/ExerciseBook/04.11/04.11.vcxproj @@ -0,0 +1,76 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {403165BF-098D-4F09-87F3-9B2599D663A5} + My0411 + + + + Application + true + MultiByte + + + Application + false + true + MultiByte + + + + + + + + + + + + + $(SolutionDir)\..\Status;$(IncludePath) + + + + Level3 + Disabled + + + true + $(SolutionDir)\..\Status\Status.lib;%(AdditionalDependencies) + Console + + + + + Level3 + MaxSpeed + true + true + + + true + true + true + + + + + + + + + + + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/04.11/04.11.vcxproj.filters b/VisualC++/ExerciseBook/04.11/04.11.vcxproj.filters new file mode 100644 index 0000000..ac9f872 --- /dev/null +++ b/VisualC++/ExerciseBook/04.11/04.11.vcxproj.filters @@ -0,0 +1,30 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + 源文件 + + + 源文件 + + + + + 头文件 + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/04.11/04.11.vcxproj.user b/VisualC++/ExerciseBook/04.11/04.11.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/VisualC++/ExerciseBook/04.11/04.11.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/04.11/String.c b/VisualC++/ExerciseBook/04.11/String.c new file mode 100644 index 0000000..41df51c --- /dev/null +++ b/VisualC++/ExerciseBook/04.11/String.c @@ -0,0 +1,151 @@ +/*=========================== + * ϰ4.10~4.14ʹõַ + ============================*/ + +#include "String.h" + +// ʼһֵΪsĴt +void StrAssign(StringType* t, const char* s) { + if(s == NULL) { + *t = ""; + } + + *t = (char*) malloc((strlen(s) + 1) * sizeof(char)); + + strcpy(*t, s); +} + +// ȽϣstĴССһ£0 +int StrCompare(StringType s, StringType t) { + return strcmp(s, t); +} + +// ַsij +int StrLength(StringType s) { + return (int) strlen(s); +} + +// ӣstӺĴ +StringType Concat(StringType s, StringType t) { + StringType r; + + if(s == NULL) { + s = ""; + } + + if(t == NULL) { + t = ""; + } + + r = (char*) malloc((strlen(s) + strlen(t) + 1) * sizeof(char)); + r[0] = '\0'; + + strcat(r, s); + strcat(r, t); + + return r; +} + +// Ӵsstartλ𣬽ȡlenַ󷵻 +StringType SubString(StringType s, int start, int len) { + int n; + char* sub; + + n = (int) strlen(s); + + if(start < 1 || start > n || start + len - 1 > n || len < 0) { + return ""; + } + + sub = (char*) malloc((len + 1) * sizeof(char)); + strncpy(sub, s + start - 1, len); + sub[len] = '\0'; + + return sub; +} + +// ңsposλtҵλ +int Index(StringType s, StringType t, int pos) { + int m, n, i; + StringType sub; + + // ʧǰ + if(pos < 1 || pos > StrLength(s) || StrLength(t) == 0) { + return 0; + } + + n = StrLength(s); + m = StrLength(t); + i = pos; + + // ֤ȲԽ + while(i <= n - m + 1) { + // ȡS[i, i+m-1] + sub = SubString(s, i, m); + + // Ӵģʽƥ䣬Ҫƽ + if(StrCompare(sub, t) != 0) { + ++i; + } else { + return i; + } + } + + return 0; +} + +// 룺spost +Status StrInsert(StringType* s, int pos, StringType t) { + StringType r; + StringType s1, s2; + + if(pos < 1 || pos > StrLength(*s) + 1) { + return ERROR; + } + + r = (StringType) malloc((strlen(*s) + strlen(t) + 1) * sizeof(char)); + r[0] = '\0'; + + // ĴΪգǰ + if(StrLength(t) == 0) { + return OK; + } + + s1 = SubString(*s, 1, pos - 1); + s2 = SubString(*s, pos, (int) strlen(*s) - pos + 1); + + strcat(r, s1); + strcat(r, t); + strcat(r, s2); + + *s = r; + + return OK; +} + +// ɾsposλɾlenַ +Status StrDelete(StringType* s, int pos, int len) { + StringType r; + + if(pos < 1 || pos + len - 1 > StrLength(*s) || len < 0) { + return ERROR; + } + + // ɾijΪ0ǰ + if(len == 0) { + return OK; + } + + r = (StringType) malloc((StrLength(*s) - len + 1) * sizeof(char)); + strncpy(r, *s, pos - 1); + strcpy(r + pos - 1, *s + pos + len - 1); + + *s = r; + + return OK; +} + +// ַ +void StrPrint(StringType s) { + printf("%s\n", s); +} diff --git a/VisualC++/ExerciseBook/04.11/String.h b/VisualC++/ExerciseBook/04.11/String.h new file mode 100644 index 0000000..9d984af --- /dev/null +++ b/VisualC++/ExerciseBook/04.11/String.h @@ -0,0 +1,43 @@ +/*=========================== + * ϰ4.10~4.14ʹõַ + ============================*/ + +#ifndef STRING_H +#define STRING_H + +#include +#include // ṩ strlen ԭ +#include "Status.h" //**01 **// + +/* ַ */ +typedef char* StringType; + + +// ʼһֵΪsĴt +void StrAssign(StringType* t, const char* s); + +// ȽϣstĴССһ£0 +int StrCompare(StringType s, StringType t); + +// ַsij +int StrLength(StringType s); + +// ӣstӺĴ +StringType Concat(StringType s, StringType t); + +// Ӵsstartλ𣬽ȡlenַ󷵻 +StringType SubString(StringType s, int start, int len); + +// ңsposλtҵλ +int Index(StringType s, StringType t, int pos); + +// 룺spost +Status StrInsert(StringType* s, int pos, StringType t); + +// ɾsposλɾlenַ +Status StrDelete(StringType* s, int pos, int len); + +// ַ +void StrPrint(StringType s); + +#endif diff --git a/VisualC++/ExerciseBook/04.12/04.12.c b/VisualC++/ExerciseBook/04.12/04.12.c new file mode 100644 index 0000000..fe34fd9 --- /dev/null +++ b/VisualC++/ExerciseBook/04.12/04.12.c @@ -0,0 +1,56 @@ +#include +#include "Status.h" //**01 **// +#include "String.h" //**ַ**// + +/* + * 滻Replace + * + * V滻SгֵTȵҲصӴ + */ +Status Algo_4_12(StringType* S, StringType T, StringType V) { + int i; + + if(StrLength(*S) == 0 || StrLength(T) == 0) { + return ERROR; + } + + i = 1; + + // SѰģʽTһγֵλ + while((i = Index(*S, T, i)) != 0) { + StrDelete(S, i, StrLength(T)); // SɾT + StrInsert(S, i, V); // SвV + + i += StrLength(V); // iлһλ + } + + return OK; +} + + +int main(int argc, char* argv[]) { + char* s = "----***--*-**-****-*****-----"; + char* t = "**"; + char* v = "^^"; + StringType T, S, V; + + printf("滻ǰ...\n"); + + StrAssign(&S, s); + StrAssign(&T, t); + StrAssign(&V, v); + + printf("S = "); + StrPrint(S); + printf("T = "); + StrPrint(T); + printf("V = "); + StrPrint(V); + + printf("滻...\n"); + printf("S = "); + Algo_4_12(&S, T, V); + StrPrint(S); + + return 0; +} diff --git a/VisualC++/ExerciseBook/04.12/04.12.vcxproj b/VisualC++/ExerciseBook/04.12/04.12.vcxproj new file mode 100644 index 0000000..055e690 --- /dev/null +++ b/VisualC++/ExerciseBook/04.12/04.12.vcxproj @@ -0,0 +1,76 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {4E3B30A1-A3C8-47B9-B2EA-0831F3F9C852} + My0412 + + + + Application + true + MultiByte + + + Application + false + true + MultiByte + + + + + + + + + + + + + $(SolutionDir)\..\Status;$(IncludePath) + + + + Level3 + Disabled + + + true + $(SolutionDir)\..\Status\Status.lib;%(AdditionalDependencies) + Console + + + + + Level3 + MaxSpeed + true + true + + + true + true + true + + + + + + + + + + + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/04.12/04.12.vcxproj.filters b/VisualC++/ExerciseBook/04.12/04.12.vcxproj.filters new file mode 100644 index 0000000..42bbc39 --- /dev/null +++ b/VisualC++/ExerciseBook/04.12/04.12.vcxproj.filters @@ -0,0 +1,30 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + 源文件 + + + 源文件 + + + + + 头文件 + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/04.12/04.12.vcxproj.user b/VisualC++/ExerciseBook/04.12/04.12.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/VisualC++/ExerciseBook/04.12/04.12.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/04.12/String.c b/VisualC++/ExerciseBook/04.12/String.c new file mode 100644 index 0000000..41df51c --- /dev/null +++ b/VisualC++/ExerciseBook/04.12/String.c @@ -0,0 +1,151 @@ +/*=========================== + * ϰ4.10~4.14ʹõַ + ============================*/ + +#include "String.h" + +// ʼһֵΪsĴt +void StrAssign(StringType* t, const char* s) { + if(s == NULL) { + *t = ""; + } + + *t = (char*) malloc((strlen(s) + 1) * sizeof(char)); + + strcpy(*t, s); +} + +// ȽϣstĴССһ£0 +int StrCompare(StringType s, StringType t) { + return strcmp(s, t); +} + +// ַsij +int StrLength(StringType s) { + return (int) strlen(s); +} + +// ӣstӺĴ +StringType Concat(StringType s, StringType t) { + StringType r; + + if(s == NULL) { + s = ""; + } + + if(t == NULL) { + t = ""; + } + + r = (char*) malloc((strlen(s) + strlen(t) + 1) * sizeof(char)); + r[0] = '\0'; + + strcat(r, s); + strcat(r, t); + + return r; +} + +// Ӵsstartλ𣬽ȡlenַ󷵻 +StringType SubString(StringType s, int start, int len) { + int n; + char* sub; + + n = (int) strlen(s); + + if(start < 1 || start > n || start + len - 1 > n || len < 0) { + return ""; + } + + sub = (char*) malloc((len + 1) * sizeof(char)); + strncpy(sub, s + start - 1, len); + sub[len] = '\0'; + + return sub; +} + +// ңsposλtҵλ +int Index(StringType s, StringType t, int pos) { + int m, n, i; + StringType sub; + + // ʧǰ + if(pos < 1 || pos > StrLength(s) || StrLength(t) == 0) { + return 0; + } + + n = StrLength(s); + m = StrLength(t); + i = pos; + + // ֤ȲԽ + while(i <= n - m + 1) { + // ȡS[i, i+m-1] + sub = SubString(s, i, m); + + // Ӵģʽƥ䣬Ҫƽ + if(StrCompare(sub, t) != 0) { + ++i; + } else { + return i; + } + } + + return 0; +} + +// 룺spost +Status StrInsert(StringType* s, int pos, StringType t) { + StringType r; + StringType s1, s2; + + if(pos < 1 || pos > StrLength(*s) + 1) { + return ERROR; + } + + r = (StringType) malloc((strlen(*s) + strlen(t) + 1) * sizeof(char)); + r[0] = '\0'; + + // ĴΪգǰ + if(StrLength(t) == 0) { + return OK; + } + + s1 = SubString(*s, 1, pos - 1); + s2 = SubString(*s, pos, (int) strlen(*s) - pos + 1); + + strcat(r, s1); + strcat(r, t); + strcat(r, s2); + + *s = r; + + return OK; +} + +// ɾsposλɾlenַ +Status StrDelete(StringType* s, int pos, int len) { + StringType r; + + if(pos < 1 || pos + len - 1 > StrLength(*s) || len < 0) { + return ERROR; + } + + // ɾijΪ0ǰ + if(len == 0) { + return OK; + } + + r = (StringType) malloc((StrLength(*s) - len + 1) * sizeof(char)); + strncpy(r, *s, pos - 1); + strcpy(r + pos - 1, *s + pos + len - 1); + + *s = r; + + return OK; +} + +// ַ +void StrPrint(StringType s) { + printf("%s\n", s); +} diff --git a/VisualC++/ExerciseBook/04.12/String.h b/VisualC++/ExerciseBook/04.12/String.h new file mode 100644 index 0000000..9d984af --- /dev/null +++ b/VisualC++/ExerciseBook/04.12/String.h @@ -0,0 +1,43 @@ +/*=========================== + * ϰ4.10~4.14ʹõַ + ============================*/ + +#ifndef STRING_H +#define STRING_H + +#include +#include // ṩ strlen ԭ +#include "Status.h" //**01 **// + +/* ַ */ +typedef char* StringType; + + +// ʼһֵΪsĴt +void StrAssign(StringType* t, const char* s); + +// ȽϣstĴССһ£0 +int StrCompare(StringType s, StringType t); + +// ַsij +int StrLength(StringType s); + +// ӣstӺĴ +StringType Concat(StringType s, StringType t); + +// Ӵsstartλ𣬽ȡlenַ󷵻 +StringType SubString(StringType s, int start, int len); + +// ңsposλtҵλ +int Index(StringType s, StringType t, int pos); + +// 룺spost +Status StrInsert(StringType* s, int pos, StringType t); + +// ɾsposλɾlenַ +Status StrDelete(StringType* s, int pos, int len); + +// ַ +void StrPrint(StringType s); + +#endif diff --git a/VisualC++/ExerciseBook/04.13/04.13.c b/VisualC++/ExerciseBook/04.13/04.13.c new file mode 100644 index 0000000..1478bf4 --- /dev/null +++ b/VisualC++/ExerciseBook/04.13/04.13.c @@ -0,0 +1,41 @@ +#include +#include "String.h" //**ַ**// + +/* + * ɾSаT + */ +Status Algo_4_13(StringType* S, StringType T) { + int i; + + // SвTҵɾ + while((i = Index(*S, T, 1)) != 0) { + if(StrDelete(S, i, StrLength(T)) == ERROR) { + return ERROR; + } + } + + return OK; +} + + +int main(int argc, char* argv[]) { + char* s = "----***--*-**-****-*****-----"; + char* t = "**"; + StringType T, S; + + printf("ɾǰ...\n"); + StrAssign(&S, s); + StrAssign(&T, t); + + printf("S = "); + StrPrint(S); + printf("T = "); + StrPrint(T); + + printf("ɾ...\n"); + printf("S = "); + Algo_4_13(&S, T); + StrPrint(S); + + return 0; +} diff --git a/VisualC++/ExerciseBook/04.13/04.13.vcxproj b/VisualC++/ExerciseBook/04.13/04.13.vcxproj new file mode 100644 index 0000000..310e314 --- /dev/null +++ b/VisualC++/ExerciseBook/04.13/04.13.vcxproj @@ -0,0 +1,76 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {63E38EBF-7C63-4D2F-BBFD-A39D28CA3C50} + My0413 + + + + Application + true + MultiByte + + + Application + false + true + MultiByte + + + + + + + + + + + + + $(SolutionDir)\..\Status;$(IncludePath) + + + + Level3 + Disabled + + + true + $(SolutionDir)\..\Status\Status.lib;%(AdditionalDependencies) + Console + + + + + Level3 + MaxSpeed + true + true + + + true + true + true + + + + + + + + + + + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/04.13/04.13.vcxproj.filters b/VisualC++/ExerciseBook/04.13/04.13.vcxproj.filters new file mode 100644 index 0000000..1c10f86 --- /dev/null +++ b/VisualC++/ExerciseBook/04.13/04.13.vcxproj.filters @@ -0,0 +1,30 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + 源文件 + + + 源文件 + + + + + 头文件 + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/04.13/04.13.vcxproj.user b/VisualC++/ExerciseBook/04.13/04.13.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/VisualC++/ExerciseBook/04.13/04.13.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/04.13/String.c b/VisualC++/ExerciseBook/04.13/String.c new file mode 100644 index 0000000..41df51c --- /dev/null +++ b/VisualC++/ExerciseBook/04.13/String.c @@ -0,0 +1,151 @@ +/*=========================== + * ϰ4.10~4.14ʹõַ + ============================*/ + +#include "String.h" + +// ʼһֵΪsĴt +void StrAssign(StringType* t, const char* s) { + if(s == NULL) { + *t = ""; + } + + *t = (char*) malloc((strlen(s) + 1) * sizeof(char)); + + strcpy(*t, s); +} + +// ȽϣstĴССһ£0 +int StrCompare(StringType s, StringType t) { + return strcmp(s, t); +} + +// ַsij +int StrLength(StringType s) { + return (int) strlen(s); +} + +// ӣstӺĴ +StringType Concat(StringType s, StringType t) { + StringType r; + + if(s == NULL) { + s = ""; + } + + if(t == NULL) { + t = ""; + } + + r = (char*) malloc((strlen(s) + strlen(t) + 1) * sizeof(char)); + r[0] = '\0'; + + strcat(r, s); + strcat(r, t); + + return r; +} + +// Ӵsstartλ𣬽ȡlenַ󷵻 +StringType SubString(StringType s, int start, int len) { + int n; + char* sub; + + n = (int) strlen(s); + + if(start < 1 || start > n || start + len - 1 > n || len < 0) { + return ""; + } + + sub = (char*) malloc((len + 1) * sizeof(char)); + strncpy(sub, s + start - 1, len); + sub[len] = '\0'; + + return sub; +} + +// ңsposλtҵλ +int Index(StringType s, StringType t, int pos) { + int m, n, i; + StringType sub; + + // ʧǰ + if(pos < 1 || pos > StrLength(s) || StrLength(t) == 0) { + return 0; + } + + n = StrLength(s); + m = StrLength(t); + i = pos; + + // ֤ȲԽ + while(i <= n - m + 1) { + // ȡS[i, i+m-1] + sub = SubString(s, i, m); + + // Ӵģʽƥ䣬Ҫƽ + if(StrCompare(sub, t) != 0) { + ++i; + } else { + return i; + } + } + + return 0; +} + +// 룺spost +Status StrInsert(StringType* s, int pos, StringType t) { + StringType r; + StringType s1, s2; + + if(pos < 1 || pos > StrLength(*s) + 1) { + return ERROR; + } + + r = (StringType) malloc((strlen(*s) + strlen(t) + 1) * sizeof(char)); + r[0] = '\0'; + + // ĴΪգǰ + if(StrLength(t) == 0) { + return OK; + } + + s1 = SubString(*s, 1, pos - 1); + s2 = SubString(*s, pos, (int) strlen(*s) - pos + 1); + + strcat(r, s1); + strcat(r, t); + strcat(r, s2); + + *s = r; + + return OK; +} + +// ɾsposλɾlenַ +Status StrDelete(StringType* s, int pos, int len) { + StringType r; + + if(pos < 1 || pos + len - 1 > StrLength(*s) || len < 0) { + return ERROR; + } + + // ɾijΪ0ǰ + if(len == 0) { + return OK; + } + + r = (StringType) malloc((StrLength(*s) - len + 1) * sizeof(char)); + strncpy(r, *s, pos - 1); + strcpy(r + pos - 1, *s + pos + len - 1); + + *s = r; + + return OK; +} + +// ַ +void StrPrint(StringType s) { + printf("%s\n", s); +} diff --git a/VisualC++/ExerciseBook/04.13/String.h b/VisualC++/ExerciseBook/04.13/String.h new file mode 100644 index 0000000..9d984af --- /dev/null +++ b/VisualC++/ExerciseBook/04.13/String.h @@ -0,0 +1,43 @@ +/*=========================== + * ϰ4.10~4.14ʹõַ + ============================*/ + +#ifndef STRING_H +#define STRING_H + +#include +#include // ṩ strlen ԭ +#include "Status.h" //**01 **// + +/* ַ */ +typedef char* StringType; + + +// ʼһֵΪsĴt +void StrAssign(StringType* t, const char* s); + +// ȽϣstĴССһ£0 +int StrCompare(StringType s, StringType t); + +// ַsij +int StrLength(StringType s); + +// ӣstӺĴ +StringType Concat(StringType s, StringType t); + +// Ӵsstartλ𣬽ȡlenַ󷵻 +StringType SubString(StringType s, int start, int len); + +// ңsposλtҵλ +int Index(StringType s, StringType t, int pos); + +// 룺spost +Status StrInsert(StringType* s, int pos, StringType t); + +// ɾsposλɾlenַ +Status StrDelete(StringType* s, int pos, int len); + +// ַ +void StrPrint(StringType s); + +#endif diff --git a/VisualC++/ExerciseBook/04.14/04.14.c b/VisualC++/ExerciseBook/04.14/04.14.c new file mode 100644 index 0000000..b996927 --- /dev/null +++ b/VisualC++/ExerciseBook/04.14/04.14.c @@ -0,0 +1,92 @@ +#include +#include +#include "SqStack.h" //**03 ջͶ**// +#include "String.h" //**ַ**// + +/* + * ǰ׺ʽprefixתΪ׺ʽ + * + *ע + * δǰ׺ʽȷԽ֤ + */ +Status Algo_4_14(const char* prefix, char** suffix) { + StringType P, S; + StringType Operator; // + SqStack stack; // ʽջ + StringType e; // ջԪ + StringType o; // ջ + int i, len; + int readStr; // ǷҪȡַ + + len = (int) strlen(prefix); + + if(len == 0) { + *suffix = NULL; + return ERROR; + } + + // Ͳ + StrAssign(&Operator, "+-*/"); + + // ǰ׺ʽ + StrAssign(&P, prefix); + + // ׺ʽջ + InitStack(&stack); + + readStr = 1; + i = 1; + + // ǰ׺ʽȡԪ + while(TRUE) { + if(readStr == 1) { + S = SubString(P, i++, 1); + } + + // ֱջ + if(Index(Operator, S, 1) != 0) { + Push(&stack, S); + readStr = 1; + + // ˲ + } else { + // ȡջԪأջѾΪգSд洢˺׺ʽ + if(GetTop(stack, &e) == ERROR) { + break; + } + + // ջԪ򽫲ֱջ + if(Index(Operator, e, 1) != 0) { + Push(&stack, S); + readStr = 1; + + // ջҲDzҪм + } else { + Pop(&stack, &e); // ջ + Pop(&stack, &o); // ջ + + S = Concat(e, S); + S = Concat(S, o); + + // ²ҪȡַҪжϸոռSub + readStr = 0; + } + } + } + + // ȡ׺ʽ + *suffix = S; + + return OK; +} + + +int main(int argc, char* argv[]) { + char* prefix = "-+a*bc/de"; // ׺ʽΪabc*+de/- + char* suffix; + + Algo_4_14(prefix, &suffix); + + printf("ǰ׺ʽ%s\n", prefix); + printf("׺ʽ%s\n", suffix); +} diff --git a/VisualC++/ExerciseBook/04.14/04.14.vcxproj b/VisualC++/ExerciseBook/04.14/04.14.vcxproj new file mode 100644 index 0000000..26aaa59 --- /dev/null +++ b/VisualC++/ExerciseBook/04.14/04.14.vcxproj @@ -0,0 +1,78 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {C6EBA21E-2309-4331-92D3-8644F769F2FC} + My0414 + + + + Application + true + MultiByte + + + Application + false + true + MultiByte + + + + + + + + + + + + + $(SolutionDir)\..\Status;$(IncludePath) + + + + Level3 + Disabled + + + true + $(SolutionDir)\..\Status\Status.lib;%(AdditionalDependencies) + Console + + + + + Level3 + MaxSpeed + true + true + + + true + true + true + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/04.14/04.14.vcxproj.filters b/VisualC++/ExerciseBook/04.14/04.14.vcxproj.filters new file mode 100644 index 0000000..c1df734 --- /dev/null +++ b/VisualC++/ExerciseBook/04.14/04.14.vcxproj.filters @@ -0,0 +1,36 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + 源文件 + + + 源文件 + + + 源文件 + + + + + 头文件 + + + 头文件 + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/04.14/04.14.vcxproj.user b/VisualC++/ExerciseBook/04.14/04.14.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/VisualC++/ExerciseBook/04.14/04.14.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/04.14/SqStack.c b/VisualC++/ExerciseBook/04.14/SqStack.c new file mode 100644 index 0000000..70e35c0 --- /dev/null +++ b/VisualC++/ExerciseBook/04.14/SqStack.c @@ -0,0 +1,89 @@ +/*========================= + * ջ˳洢ṹ˳ջ + ==========================*/ + +#include "SqStack.h" //**03 ջͶ**// + +/* + * ʼ + * + * һջʼɹ򷵻OK򷵻ERROR + */ +Status InitStack(SqStack* S) { + if(S == NULL) { + return ERROR; + } + + (*S).base = (SElemType*) malloc(STACK_INIT_SIZE * sizeof(SElemType)); + if((*S).base == NULL) { + exit(OVERFLOW); + } + + (*S).top = (*S).base; + (*S).stacksize = STACK_INIT_SIZE; + + return OK; +} + +/* + * ȡֵ + * + * ջԪأeա + */ +Status GetTop(SqStack S, SElemType* e) { + if(S.base == NULL || S.top == S.base) { + return ERROR; + } + + // ıջԪ + *e = *(S.top - 1); + + return OK; +} + +/* + * ջ + * + * Ԫeѹ뵽ջ + */ +Status Push(SqStack* S, SElemType e) { + if(S == NULL || (*S).base == NULL) { + return ERROR; + } + + // ջʱ׷Ӵ洢ռ + if((*S).top - (*S).base >= (*S).stacksize) { + (*S).base = (SElemType*) realloc((*S).base, ((*S).stacksize + STACKINCREMENT) * sizeof(SElemType)); + if((*S).base == NULL) { + exit(OVERFLOW); // 洢ʧ + } + + (*S).top = (*S).base + (*S).stacksize; + (*S).stacksize += STACKINCREMENT; + } + + // ջȸֵջָ + *(S->top++) = e; + + return OK; +} + +/* + * ջ + * + * ջԪصeա + */ +Status Pop(SqStack* S, SElemType* e) { + if(S == NULL || (*S).base == NULL) { + return ERROR; + } + + if((*S).top == (*S).base) { + return ERROR; + } + + // ջջָȵݼٸֵ + *e = *(--(*S).top); + + return OK; +} diff --git a/VisualC++/ExerciseBook/04.14/SqStack.h b/VisualC++/ExerciseBook/04.14/SqStack.h new file mode 100644 index 0000000..db29792 --- /dev/null +++ b/VisualC++/ExerciseBook/04.14/SqStack.h @@ -0,0 +1,61 @@ +/*========================= + * ջ˳洢ṹ˳ջ + ==========================*/ + +#ifndef SQSTACK_H +#define SQSTACK_H + +#include +#include // ṩmallocreallocfreeexitԭ +#include "Status.h" //**01 **// +#include "String.h" //**04 **// + +/* 궨 */ +#define STACK_INIT_SIZE 100 // ˳ջ洢ռijʼ +#define STACKINCREMENT 10 // ˳ջ洢ռķ + +/* + * ˳ջԪͶ + * + *ע + * ԪΪַ + */ +typedef StringType SElemType; + +// ˳ջԪؽṹ +typedef struct { + SElemType* base; // ջָ + SElemType* top; // ջָ + int stacksize; // ǰѷĴ洢ռ䣬ԪΪλ +} SqStack; + + +/* + * ʼ + * + * һջʼɹ򷵻OK򷵻ERROR + */ +Status InitStack(SqStack* S); + +/* + * ȡֵ + * + * ջԪأeա + */ +Status GetTop(SqStack S, SElemType* e); + +/* + * ջ + * + * Ԫeѹ뵽ջ + */ +Status Push(SqStack* S, SElemType e); + +/* + * ջ + * + * ջԪصeա + */ +Status Pop(SqStack* S, SElemType* e); + +#endif diff --git a/VisualC++/ExerciseBook/04.14/String.c b/VisualC++/ExerciseBook/04.14/String.c new file mode 100644 index 0000000..41df51c --- /dev/null +++ b/VisualC++/ExerciseBook/04.14/String.c @@ -0,0 +1,151 @@ +/*=========================== + * ϰ4.10~4.14ʹõַ + ============================*/ + +#include "String.h" + +// ʼһֵΪsĴt +void StrAssign(StringType* t, const char* s) { + if(s == NULL) { + *t = ""; + } + + *t = (char*) malloc((strlen(s) + 1) * sizeof(char)); + + strcpy(*t, s); +} + +// ȽϣstĴССһ£0 +int StrCompare(StringType s, StringType t) { + return strcmp(s, t); +} + +// ַsij +int StrLength(StringType s) { + return (int) strlen(s); +} + +// ӣstӺĴ +StringType Concat(StringType s, StringType t) { + StringType r; + + if(s == NULL) { + s = ""; + } + + if(t == NULL) { + t = ""; + } + + r = (char*) malloc((strlen(s) + strlen(t) + 1) * sizeof(char)); + r[0] = '\0'; + + strcat(r, s); + strcat(r, t); + + return r; +} + +// Ӵsstartλ𣬽ȡlenַ󷵻 +StringType SubString(StringType s, int start, int len) { + int n; + char* sub; + + n = (int) strlen(s); + + if(start < 1 || start > n || start + len - 1 > n || len < 0) { + return ""; + } + + sub = (char*) malloc((len + 1) * sizeof(char)); + strncpy(sub, s + start - 1, len); + sub[len] = '\0'; + + return sub; +} + +// ңsposλtҵλ +int Index(StringType s, StringType t, int pos) { + int m, n, i; + StringType sub; + + // ʧǰ + if(pos < 1 || pos > StrLength(s) || StrLength(t) == 0) { + return 0; + } + + n = StrLength(s); + m = StrLength(t); + i = pos; + + // ֤ȲԽ + while(i <= n - m + 1) { + // ȡS[i, i+m-1] + sub = SubString(s, i, m); + + // Ӵģʽƥ䣬Ҫƽ + if(StrCompare(sub, t) != 0) { + ++i; + } else { + return i; + } + } + + return 0; +} + +// 룺spost +Status StrInsert(StringType* s, int pos, StringType t) { + StringType r; + StringType s1, s2; + + if(pos < 1 || pos > StrLength(*s) + 1) { + return ERROR; + } + + r = (StringType) malloc((strlen(*s) + strlen(t) + 1) * sizeof(char)); + r[0] = '\0'; + + // ĴΪգǰ + if(StrLength(t) == 0) { + return OK; + } + + s1 = SubString(*s, 1, pos - 1); + s2 = SubString(*s, pos, (int) strlen(*s) - pos + 1); + + strcat(r, s1); + strcat(r, t); + strcat(r, s2); + + *s = r; + + return OK; +} + +// ɾsposλɾlenַ +Status StrDelete(StringType* s, int pos, int len) { + StringType r; + + if(pos < 1 || pos + len - 1 > StrLength(*s) || len < 0) { + return ERROR; + } + + // ɾijΪ0ǰ + if(len == 0) { + return OK; + } + + r = (StringType) malloc((StrLength(*s) - len + 1) * sizeof(char)); + strncpy(r, *s, pos - 1); + strcpy(r + pos - 1, *s + pos + len - 1); + + *s = r; + + return OK; +} + +// ַ +void StrPrint(StringType s) { + printf("%s\n", s); +} diff --git a/VisualC++/ExerciseBook/04.14/String.h b/VisualC++/ExerciseBook/04.14/String.h new file mode 100644 index 0000000..9d984af --- /dev/null +++ b/VisualC++/ExerciseBook/04.14/String.h @@ -0,0 +1,43 @@ +/*=========================== + * ϰ4.10~4.14ʹõַ + ============================*/ + +#ifndef STRING_H +#define STRING_H + +#include +#include // ṩ strlen ԭ +#include "Status.h" //**01 **// + +/* ַ */ +typedef char* StringType; + + +// ʼһֵΪsĴt +void StrAssign(StringType* t, const char* s); + +// ȽϣstĴССһ£0 +int StrCompare(StringType s, StringType t); + +// ַsij +int StrLength(StringType s); + +// ӣstӺĴ +StringType Concat(StringType s, StringType t); + +// Ӵsstartλ𣬽ȡlenַ󷵻 +StringType SubString(StringType s, int start, int len); + +// ңsposλtҵλ +int Index(StringType s, StringType t, int pos); + +// 룺spost +Status StrInsert(StringType* s, int pos, StringType t); + +// ɾsposλɾlenַ +Status StrDelete(StringType* s, int pos, int len); + +// ַ +void StrPrint(StringType s); + +#endif diff --git a/VisualC++/ExerciseBook/04.15-04.17/04.15-04.17.c b/VisualC++/ExerciseBook/04.15-04.17/04.15-04.17.c new file mode 100644 index 0000000..0e74b14 --- /dev/null +++ b/VisualC++/ExerciseBook/04.15-04.17/04.15-04.17.c @@ -0,0 +1,92 @@ +#include +#include "Status.h" //**01 **// +#include "SString.h" //**04 **// + +/* + * ʼStrAssign + * + *ע + * úSStringļж + */ +Status Algo_4_15(SString T, char* chars); + +/* + * ȽϣStrCompare + * + *ע + * úSStringļж + */ +int Algo_4_16(SString S, SString T); + +/* + * 滻Replace + * + *ע + * úSStringļж + */ +Status Algo_4_17(SString S, SString T, SString V); + + +int main(int argc, char* argv[]) { + char* t = "ab**c*de***fg"; + char* s = "ab**c*de***fh"; + SString T, S, M1, M2; + int i; + + printf(" 4.15 ֤...\n"); + Algo_4_15(T, t); + Algo_4_15(S, s); + printf("T = "); + StrPrint(T); + printf("S = "); + StrPrint(S); + + printf(" 4.16 ֤...\n"); + i = Algo_4_16(S, T); + if(i > 0) { + printf("S > T\n"); + } else if(i < 0) { + printf("S < T\n"); + } else { + printf("S == T\n"); + } + + printf(" 4.17 ֤...\n"); + Algo_4_15(M1, "**"); + Algo_4_15(M2, "^"); + Algo_4_17(S, M1, M2); + printf(" \"^\" 滻 \"**\" \nS = "); + StrPrint(S); + + return 0; +} + +/* + * ʼStrAssign + * + *ע + * úSStringļж + */ +Status Algo_4_15(SString T, char* chars) { + return StrAssign(T, chars); +} + +/* + * ȽϣStrCompare + * + *ע + * úSStringļж + */ +int Algo_4_16(SString S, SString T) { + return StrCompare(S, T); +} + +/* + * 滻Replace + * + *ע + * úSStringļж + */ +Status Algo_4_17(SString S, SString T, SString V) { + return Replace(S, T, V); +} diff --git a/VisualC++/ExerciseBook/04.15-04.17/04.15-04.17.vcxproj b/VisualC++/ExerciseBook/04.15-04.17/04.15-04.17.vcxproj new file mode 100644 index 0000000..c188984 --- /dev/null +++ b/VisualC++/ExerciseBook/04.15-04.17/04.15-04.17.vcxproj @@ -0,0 +1,76 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {DA014C3E-5124-41C7-B53F-53AE0B96AE99} + My04150417 + + + + Application + true + MultiByte + + + Application + false + true + MultiByte + + + + + + + + + + + + + $(SolutionDir)\..\Status;$(IncludePath) + + + + Level3 + Disabled + + + true + $(SolutionDir)\..\Status\Status.lib;%(AdditionalDependencies) + Console + + + + + Level3 + MaxSpeed + true + true + + + true + true + true + + + + + + + + + + + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/04.15-04.17/04.15-04.17.vcxproj.filters b/VisualC++/ExerciseBook/04.15-04.17/04.15-04.17.vcxproj.filters new file mode 100644 index 0000000..696b55c --- /dev/null +++ b/VisualC++/ExerciseBook/04.15-04.17/04.15-04.17.vcxproj.filters @@ -0,0 +1,30 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + 源文件 + + + 源文件 + + + + + 头文件 + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/04.15-04.17/04.15-04.17.vcxproj.user b/VisualC++/ExerciseBook/04.15-04.17/04.15-04.17.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/VisualC++/ExerciseBook/04.15-04.17/04.15-04.17.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/04.15-04.17/SString.c b/VisualC++/ExerciseBook/04.15-04.17/SString.c new file mode 100644 index 0000000..fc4c757 --- /dev/null +++ b/VisualC++/ExerciseBook/04.15-04.17/SString.c @@ -0,0 +1,406 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#include "SString.h" //**04 **// + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars) { + int i, len; + + len = (int) strlen(chars); + + // chars + if(len > MAXSTRLEN) { + return ERROR; + } + + T[0] = len; + for(i = 1; i <= len; i++) { + T[i] = chars[i - 1]; + } + + return OK; +} + +/* + * + * + * S١ + * + *ע + * ˳򴮵Ľṹ޷ + */ +Status DestroyString(SString S) { + return OK; +} + +/* + * + * + * Sա + */ +Status ClearString(SString S) { + // ֻҪΪ0Ϳ + S[0] = 0; + return OK; +} + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S) { + return S[0] == 0 ? TRUE : FALSE; +} + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S) { + return S[0]; +} + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len) { + int i; + + if(pos < 1 || pos > S[0] || len < 0 || pos + len - 1 > S[0]) { + return ERROR; + } + + // Ԫ + for(i = 1; i <= len; i++) { + Sub[i] = S[pos + i - 1]; + } + + // ȷ³ + Sub[0] = len; + + return OK; +} + +/* + * 㷨4.1 + * + * + * + * posʼģʽTS״γֵλãڣ򷵻0 + * ҳɹƥλá + * + *ע + * 1.ʵҪСӼ + * 2.ʵֱȽϵЧ + */ +int Index_1(SString S, SString T, int pos) { + int i, n, m; // ¼STij + SString sub; + + /* + * ʧǰ + * ̲д΢ͬ + */ + if(pos < 1 || pos > S[0] || StrEmpty(T)) { + return 0; + } + + n = StrLength(S); + m = StrLength(T); + i = pos; + + // ֤ȲԽ + while(i <= n - m + 1) { + // ȡS[i, i+m-1] + SubString(sub, S, i, m); + + // Ӵģʽƥ䣬Ҫƽ + if(StrCompare(sub, T) != 0) { + ++i; + } else { + return i; + } + } + + return 0; +} + +/* + * 㷨4.5 + * + * + * + * posʼģʽTS״γֵλãڣ򷵻0 + * ҳɹƥλá + * + *ע + * 1.ʵֲСӼ + * 2.ʵֱȽϵЧ + */ +int Index_2(SString S, SString T, int pos) { + int i = pos; + int j = 1; + + if(pos < 1 || pos > S[0] || StrEmpty(T)) { + return 0; + } + + while(i <= S[0] && j <= T[0]) { + // ַͬȽϺַ + if(S[i] == T[j]) { + i++; + j++; + + // ַͬαҪˣ±Ƚ + } else { + i = i - (j - 1) + 1; // j-1ͽ͵ǰj-1ԪأڵjԪϹһ + j = 1; // αjصTĵһλ + } + } + + // һT[0]>0ж + if(j > T[0] && T[0] > 0) { // TΪմ + return i - T[0]; // ƥɹ + } else { + return 0; + } +} + +/* + * + * + * T뵽Sposλô + */ +Status StrInsert(SString S, int pos, SString T) { + int i; + + if(pos < 1 || pos > S[0] + 1 || S[0] + T[0] > MAXSTRLEN) { + return ERROR; + } + + // ĴΪգǰ + if(StrEmpty(T)) { + return OK; + } + + // SڳλãΪT׼ + for(i = S[0]; i >= pos; i--) { + // ӺǰǰԪŲ + S[i + T[0]] = S[i]; + } + + // TSڳλ + for(i = pos; i <= pos + T[0] - 1; i++) { + S[i] = T[i - pos + 1]; + } + + // + S[0] += T[0]; + + return OK; +} + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len) { + int i; + + if(pos < 1 || pos + len - 1 > S[0] || len < 0) { + return ERROR; + } + + // ɾijΪ0ǰ + if(len == 0) { + return OK; + } + + // ѺԪŲǰ棬ǵɾԪ + for(i = pos + len; i <= S[0]; i++) { + S[i - len] = S[i]; + } + + // ȼ + S[0] -= len; + + return OK; +} + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T) { + int i = 1; + + while(i <= S[0] && i <= T[0]) { + // ַͬʱȽС + if(S[i] != T[i]) { + return S[i] - T[i]; + } + + i++; + } + + return S[0] - T[0]; +} + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S) { + int i; + + // ͬϢһ + for(i = 0; i <= S[0]; i++) { + T[i] = S[i]; + } + + return OK; +} + +/* + * 滻 + * + * V滻SгֵTȵҲصӴ + * + *ע + * 1.òСӼ + * 2.ʵֱȽϵЧ + */ +Status Replace(SString S, SString T, SString V) { + int i; + + if(StrEmpty(S) || StrEmpty(T)) { + return ERROR; + } + + // SѰģʽTһγֵλ + i = Index_2(S, T, 1); + + // ƥַҿԱȫ滻滻 + while(i != 0 && S[0] - T[0] + V[0] <= MAXSTRLEN) { + StrDelete(S, i, StrLength(T)); // SɾT + StrInsert(S, i, V); // SвV + + i += StrLength(V); // iлһλ + + i = Index_2(S, T, i); // һƥַ + } + + if(i == 0) { // SеTȫ滻 + return OK; + } else { // STVѾ岻ȥ + return ERROR; + } +} + +/* + * 㷨4.2 + * + * + * + * S1S2洢TзءӺijֻδIJ֡ + * ֵʾӺĴǷ + * + *ע + * òСӼ + */ +Status Concat(SString T, SString S1, SString S2) { + int i; + int uncut; // ´Ƿ + + // ȫҪü + if(S1[0] + S2[0] <= MAXSTRLEN) { + // S1T + for(i = 1; i <= S1[0]; i++) { + T[i] = S1[i]; + } + + // S2T + for(i = S1[0] + 1; i <= S1[0] + S2[0]; i++) { + T[i] = S2[i - S1[0]]; + } + + // ³ + T[0] = S1[0] + S2[0]; + + // δü + uncut = TRUE; + + // ҪüS2 + } else if(S1[0] <= MAXSTRLEN) { + // S1T + for(i = 1; i <= S1[0]; i++) { + T[i] = S1[i]; + } + + // S2һָƵT + for(i = S1[0] + 1; i <= MAXSTRLEN; i++) { + T[i] = S2[i - S1[0]]; + } + + // ³ + T[0] = MAXSTRLEN; + + uncut = FALSE; + + // ֻҪS1һ + } else { + // ͬϢһ + for(i = 0; i <= MAXSTRLEN; i++) { + T[i] = S1[i]; + } + + uncut = FALSE; + } + + return uncut; +} + +// ӡַ +void StrPrint(SString S) { + int i; + + for(i = 1; i<=S[0] ; i++) { + printf("%c", S[i]); + } + + printf("\n"); +} diff --git a/VisualC++/ExerciseBook/04.15-04.17/SString.h b/VisualC++/ExerciseBook/04.15-04.17/SString.h new file mode 100644 index 0000000..386ffb8 --- /dev/null +++ b/VisualC++/ExerciseBook/04.15-04.17/SString.h @@ -0,0 +1,179 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#ifndef SSTRING_H +#define SSTRING_H + +#include +#include // ṩstrlenԭ +#include "Status.h" //**01 **// + +/* 궨 */ +#define MAXSTRLEN 255 // ˳򴮵󴮳 + +/* + * ˳洢Ͷ + * + * עЧԪشSString1ŵԪʼ洢 + * SString0ŵԪ洢䳤 + */ +typedef unsigned char SString[MAXSTRLEN + 1]; // 0ŵԪŴij + + +/* + * ʾ + * + * ѭ̲ĵдϰߣposָʾַλ()1ʼ + */ + + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars); + +/* + * + * + * S١ + * + *ע + * ˳򴮵Ľṹ޷ + */ +Status DestroyString(SString S); + +/* + * + * + * Sա + */ +Status ClearString(SString S); + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S); + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S); + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len); + +/* + * 㷨4.1 + * + * + * + * posʼģʽTS״γֵλãڣ򷵻0 + * ҳɹƥλá + * + *ע + * 1.ʵҪСӼ + * 2.ʵֱȽϵЧ + */ +int Index_1(SString S, SString T, int pos); + +/* + * 㷨4.5 + * + * + * + * posʼģʽTS״γֵλãڣ򷵻0 + * ҳɹƥλá + * + *ע + * 1.ʵֲСӼ + * 2.ʵֱȽϵЧ + */ +int Index_2(SString S, SString T, int pos); + +/* + * + * + * T뵽Sposλô + */ +Status StrInsert(SString S, int pos, SString T); + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len); + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T); + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S); + +/* + * 滻 + * + * V滻SгֵTȵҲصӴ + * + *ע + * òСӼЧʽϵ͡ + */ +Status Replace(SString S, SString T, SString V); + +/* + * 㷨4.2 + * + * + * + * S1S2洢TзءӺijֻδIJ֡ + * ֵʾӺĴǷ + * + *ע + * òСӼ + */ +Status Concat(SString T, SString S1, SString S2); + +// ӡַ +void StrPrint(SString S); + +#endif diff --git a/VisualC++/ExerciseBook/04.18/04.18.c b/VisualC++/ExerciseBook/04.18/04.18.c new file mode 100644 index 0000000..3e352c7 --- /dev/null +++ b/VisualC++/ExerciseBook/04.18/04.18.c @@ -0,0 +1,62 @@ +#include +#include +#include "SString.h" //**04 **// + +/* + * ͳַSвַͬÿַĸͳƽ + */ +int* Algo_4_18(SString S); + + +int main(int argc, char* argv[]) { + char* s = "dbasydujhge638940[gptokljrsehgadcsbnmv,c.b'ng[p098437eywdghswqdecxvghju"; + SString S; + int* total; + int i; + + StrAssign(S, s); + printf("S = "); + StrPrint(S); + + total = Algo_4_18(S); + printf(" S вַͬ %d \n", total[0]); + for(i = 1; i <= 127; i++) { + if(total[i] != 0) { + printf("ַ \'%c\' %d .\n", i, total[i]); + } + } + printf("ͳ...\n"); + + return 0; +} + + +/* + * ͳַSвַͬÿַĸͳƽ + */ +int* Algo_4_18(SString S) { + int i; + int* total; + + /* + * totalΪ128 + * 0ŵԪ洢ַͬ + * Ԫ洢ֲַͬ + * + * עͳƿַ'\0' + */ + total = (int*) malloc(128 * sizeof(int)); + memset(total, 0, 128 * sizeof(int)); + + for(i = 1; i <= S[0]; i++) { + // ַͳƲַͬ + if(total[S[i]] == 0) { + total[0]++; + } + + // ͳַ + total[S[i]]++; + } + + return total; +} diff --git a/VisualC++/ExerciseBook/04.18/04.18.vcxproj b/VisualC++/ExerciseBook/04.18/04.18.vcxproj new file mode 100644 index 0000000..4dc7a49 --- /dev/null +++ b/VisualC++/ExerciseBook/04.18/04.18.vcxproj @@ -0,0 +1,76 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {19006CCD-C88C-44C5-9812-6F4276CDA60B} + My0418 + + + + Application + true + MultiByte + + + Application + false + true + MultiByte + + + + + + + + + + + + + $(SolutionDir)\..\Status;$(IncludePath) + + + + Level3 + Disabled + + + true + $(SolutionDir)\..\Status\Status.lib;%(AdditionalDependencies) + Console + + + + + Level3 + MaxSpeed + true + true + + + true + true + true + + + + + + + + + + + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/04.18/04.18.vcxproj.filters b/VisualC++/ExerciseBook/04.18/04.18.vcxproj.filters new file mode 100644 index 0000000..dc4cebf --- /dev/null +++ b/VisualC++/ExerciseBook/04.18/04.18.vcxproj.filters @@ -0,0 +1,30 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + 源文件 + + + 源文件 + + + + + 头文件 + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/04.18/04.18.vcxproj.user b/VisualC++/ExerciseBook/04.18/04.18.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/VisualC++/ExerciseBook/04.18/04.18.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/04.18/SString.c b/VisualC++/ExerciseBook/04.18/SString.c new file mode 100644 index 0000000..fc4c757 --- /dev/null +++ b/VisualC++/ExerciseBook/04.18/SString.c @@ -0,0 +1,406 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#include "SString.h" //**04 **// + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars) { + int i, len; + + len = (int) strlen(chars); + + // chars + if(len > MAXSTRLEN) { + return ERROR; + } + + T[0] = len; + for(i = 1; i <= len; i++) { + T[i] = chars[i - 1]; + } + + return OK; +} + +/* + * + * + * S١ + * + *ע + * ˳򴮵Ľṹ޷ + */ +Status DestroyString(SString S) { + return OK; +} + +/* + * + * + * Sա + */ +Status ClearString(SString S) { + // ֻҪΪ0Ϳ + S[0] = 0; + return OK; +} + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S) { + return S[0] == 0 ? TRUE : FALSE; +} + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S) { + return S[0]; +} + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len) { + int i; + + if(pos < 1 || pos > S[0] || len < 0 || pos + len - 1 > S[0]) { + return ERROR; + } + + // Ԫ + for(i = 1; i <= len; i++) { + Sub[i] = S[pos + i - 1]; + } + + // ȷ³ + Sub[0] = len; + + return OK; +} + +/* + * 㷨4.1 + * + * + * + * posʼģʽTS״γֵλãڣ򷵻0 + * ҳɹƥλá + * + *ע + * 1.ʵҪСӼ + * 2.ʵֱȽϵЧ + */ +int Index_1(SString S, SString T, int pos) { + int i, n, m; // ¼STij + SString sub; + + /* + * ʧǰ + * ̲д΢ͬ + */ + if(pos < 1 || pos > S[0] || StrEmpty(T)) { + return 0; + } + + n = StrLength(S); + m = StrLength(T); + i = pos; + + // ֤ȲԽ + while(i <= n - m + 1) { + // ȡS[i, i+m-1] + SubString(sub, S, i, m); + + // Ӵģʽƥ䣬Ҫƽ + if(StrCompare(sub, T) != 0) { + ++i; + } else { + return i; + } + } + + return 0; +} + +/* + * 㷨4.5 + * + * + * + * posʼģʽTS״γֵλãڣ򷵻0 + * ҳɹƥλá + * + *ע + * 1.ʵֲСӼ + * 2.ʵֱȽϵЧ + */ +int Index_2(SString S, SString T, int pos) { + int i = pos; + int j = 1; + + if(pos < 1 || pos > S[0] || StrEmpty(T)) { + return 0; + } + + while(i <= S[0] && j <= T[0]) { + // ַͬȽϺַ + if(S[i] == T[j]) { + i++; + j++; + + // ַͬαҪˣ±Ƚ + } else { + i = i - (j - 1) + 1; // j-1ͽ͵ǰj-1ԪأڵjԪϹһ + j = 1; // αjصTĵһλ + } + } + + // һT[0]>0ж + if(j > T[0] && T[0] > 0) { // TΪմ + return i - T[0]; // ƥɹ + } else { + return 0; + } +} + +/* + * + * + * T뵽Sposλô + */ +Status StrInsert(SString S, int pos, SString T) { + int i; + + if(pos < 1 || pos > S[0] + 1 || S[0] + T[0] > MAXSTRLEN) { + return ERROR; + } + + // ĴΪգǰ + if(StrEmpty(T)) { + return OK; + } + + // SڳλãΪT׼ + for(i = S[0]; i >= pos; i--) { + // ӺǰǰԪŲ + S[i + T[0]] = S[i]; + } + + // TSڳλ + for(i = pos; i <= pos + T[0] - 1; i++) { + S[i] = T[i - pos + 1]; + } + + // + S[0] += T[0]; + + return OK; +} + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len) { + int i; + + if(pos < 1 || pos + len - 1 > S[0] || len < 0) { + return ERROR; + } + + // ɾijΪ0ǰ + if(len == 0) { + return OK; + } + + // ѺԪŲǰ棬ǵɾԪ + for(i = pos + len; i <= S[0]; i++) { + S[i - len] = S[i]; + } + + // ȼ + S[0] -= len; + + return OK; +} + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T) { + int i = 1; + + while(i <= S[0] && i <= T[0]) { + // ַͬʱȽС + if(S[i] != T[i]) { + return S[i] - T[i]; + } + + i++; + } + + return S[0] - T[0]; +} + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S) { + int i; + + // ͬϢһ + for(i = 0; i <= S[0]; i++) { + T[i] = S[i]; + } + + return OK; +} + +/* + * 滻 + * + * V滻SгֵTȵҲصӴ + * + *ע + * 1.òСӼ + * 2.ʵֱȽϵЧ + */ +Status Replace(SString S, SString T, SString V) { + int i; + + if(StrEmpty(S) || StrEmpty(T)) { + return ERROR; + } + + // SѰģʽTһγֵλ + i = Index_2(S, T, 1); + + // ƥַҿԱȫ滻滻 + while(i != 0 && S[0] - T[0] + V[0] <= MAXSTRLEN) { + StrDelete(S, i, StrLength(T)); // SɾT + StrInsert(S, i, V); // SвV + + i += StrLength(V); // iлһλ + + i = Index_2(S, T, i); // һƥַ + } + + if(i == 0) { // SеTȫ滻 + return OK; + } else { // STVѾ岻ȥ + return ERROR; + } +} + +/* + * 㷨4.2 + * + * + * + * S1S2洢TзءӺijֻδIJ֡ + * ֵʾӺĴǷ + * + *ע + * òСӼ + */ +Status Concat(SString T, SString S1, SString S2) { + int i; + int uncut; // ´Ƿ + + // ȫҪü + if(S1[0] + S2[0] <= MAXSTRLEN) { + // S1T + for(i = 1; i <= S1[0]; i++) { + T[i] = S1[i]; + } + + // S2T + for(i = S1[0] + 1; i <= S1[0] + S2[0]; i++) { + T[i] = S2[i - S1[0]]; + } + + // ³ + T[0] = S1[0] + S2[0]; + + // δü + uncut = TRUE; + + // ҪüS2 + } else if(S1[0] <= MAXSTRLEN) { + // S1T + for(i = 1; i <= S1[0]; i++) { + T[i] = S1[i]; + } + + // S2һָƵT + for(i = S1[0] + 1; i <= MAXSTRLEN; i++) { + T[i] = S2[i - S1[0]]; + } + + // ³ + T[0] = MAXSTRLEN; + + uncut = FALSE; + + // ֻҪS1һ + } else { + // ͬϢһ + for(i = 0; i <= MAXSTRLEN; i++) { + T[i] = S1[i]; + } + + uncut = FALSE; + } + + return uncut; +} + +// ӡַ +void StrPrint(SString S) { + int i; + + for(i = 1; i<=S[0] ; i++) { + printf("%c", S[i]); + } + + printf("\n"); +} diff --git a/VisualC++/ExerciseBook/04.18/SString.h b/VisualC++/ExerciseBook/04.18/SString.h new file mode 100644 index 0000000..386ffb8 --- /dev/null +++ b/VisualC++/ExerciseBook/04.18/SString.h @@ -0,0 +1,179 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#ifndef SSTRING_H +#define SSTRING_H + +#include +#include // ṩstrlenԭ +#include "Status.h" //**01 **// + +/* 궨 */ +#define MAXSTRLEN 255 // ˳򴮵󴮳 + +/* + * ˳洢Ͷ + * + * עЧԪشSString1ŵԪʼ洢 + * SString0ŵԪ洢䳤 + */ +typedef unsigned char SString[MAXSTRLEN + 1]; // 0ŵԪŴij + + +/* + * ʾ + * + * ѭ̲ĵдϰߣposָʾַλ()1ʼ + */ + + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars); + +/* + * + * + * S١ + * + *ע + * ˳򴮵Ľṹ޷ + */ +Status DestroyString(SString S); + +/* + * + * + * Sա + */ +Status ClearString(SString S); + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S); + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S); + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len); + +/* + * 㷨4.1 + * + * + * + * posʼģʽTS״γֵλãڣ򷵻0 + * ҳɹƥλá + * + *ע + * 1.ʵҪСӼ + * 2.ʵֱȽϵЧ + */ +int Index_1(SString S, SString T, int pos); + +/* + * 㷨4.5 + * + * + * + * posʼģʽTS״γֵλãڣ򷵻0 + * ҳɹƥλá + * + *ע + * 1.ʵֲСӼ + * 2.ʵֱȽϵЧ + */ +int Index_2(SString S, SString T, int pos); + +/* + * + * + * T뵽Sposλô + */ +Status StrInsert(SString S, int pos, SString T); + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len); + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T); + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S); + +/* + * 滻 + * + * V滻SгֵTȵҲصӴ + * + *ע + * òСӼЧʽϵ͡ + */ +Status Replace(SString S, SString T, SString V); + +/* + * 㷨4.2 + * + * + * + * S1S2洢TзءӺijֻδIJ֡ + * ֵʾӺĴǷ + * + *ע + * òСӼ + */ +Status Concat(SString T, SString S1, SString S2); + +// ӡַ +void StrPrint(SString S); + +#endif diff --git a/VisualC++/ExerciseBook/04.19/04.19.c b/VisualC++/ExerciseBook/04.19/04.19.c new file mode 100644 index 0000000..9a2dbf0 --- /dev/null +++ b/VisualC++/ExerciseBook/04.19/04.19.c @@ -0,0 +1,77 @@ +#include +#include +#include "SString.h" //**04 **// + +/* + * R=S-STa洢RÿַSеһγֵλ + * + * עa0ŵԪ洢aԪصĸ + */ +void Algo_4_19(SString R, SString S, SString T, int** a); + + +int main(int argc, char* argv[]) { + char* s = "amdhcjgfdlpinbefcopgkqikeb"; + char* t = "mhjlpinopkqik"; + int* a; + SString T, S, R; + int i; + + printf("ʼST...\n"); + StrAssign(S, s); + StrAssign(T, t); + + printf("S = "); + StrPrint(S); + printf("T = "); + StrPrint(T); + + Algo_4_19(R, S, T, &a); + printf("R = "); + StrPrint(R); + printf("a = "); + for(i = 1; i <= a[0]; i++) { + printf("%d ", a[i]); + } + printf("\n"); + + return 0; +} + + +/* + * R=S-STa洢RÿַSеһγֵλ + * + * עa0ŵԪ洢aԪصĸ + */ +void Algo_4_19(SString R, SString S, SString T, int** a) { + int i, p; + SString ch; + + *a = (int*) malloc((StrLength(S) + 1) * sizeof(int)); + + StrAssign(R, ""); + + for(i = 1, (*a)[0] = 0; i <= StrLength(S); i++) { + // ȡַж + SubString(ch, S, i, 1); + + // ȡS[i]Tеλ + p = Index_2(T, ch, 1); + + // S[i]T + if(p == 0) { + // ȡS[i]Rеλ + p = Index_2(R, ch, 1); + } + + // S[i]ȲTУûRгֹ + if(p == 0) { + (*a)[0]++; + (*a)[(*a)[0]] = i; + + // RS[i] + StrInsert(R, (*a)[0], ch); + } + } +} diff --git a/VisualC++/ExerciseBook/04.19/04.19.vcxproj b/VisualC++/ExerciseBook/04.19/04.19.vcxproj new file mode 100644 index 0000000..aae0150 --- /dev/null +++ b/VisualC++/ExerciseBook/04.19/04.19.vcxproj @@ -0,0 +1,76 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {294751C9-0DB7-400C-8603-E1C194170B6C} + My0419 + + + + Application + true + MultiByte + + + Application + false + true + MultiByte + + + + + + + + + + + + + $(SolutionDir)\..\Status;$(IncludePath) + + + + Level3 + Disabled + + + true + $(SolutionDir)\..\Status\Status.lib;%(AdditionalDependencies) + Console + + + + + Level3 + MaxSpeed + true + true + + + true + true + true + + + + + + + + + + + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/04.19/04.19.vcxproj.filters b/VisualC++/ExerciseBook/04.19/04.19.vcxproj.filters new file mode 100644 index 0000000..cae42f2 --- /dev/null +++ b/VisualC++/ExerciseBook/04.19/04.19.vcxproj.filters @@ -0,0 +1,30 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + 源文件 + + + 源文件 + + + + + 头文件 + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/04.19/04.19.vcxproj.user b/VisualC++/ExerciseBook/04.19/04.19.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/VisualC++/ExerciseBook/04.19/04.19.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/04.19/SString.c b/VisualC++/ExerciseBook/04.19/SString.c new file mode 100644 index 0000000..fc4c757 --- /dev/null +++ b/VisualC++/ExerciseBook/04.19/SString.c @@ -0,0 +1,406 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#include "SString.h" //**04 **// + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars) { + int i, len; + + len = (int) strlen(chars); + + // chars + if(len > MAXSTRLEN) { + return ERROR; + } + + T[0] = len; + for(i = 1; i <= len; i++) { + T[i] = chars[i - 1]; + } + + return OK; +} + +/* + * + * + * S١ + * + *ע + * ˳򴮵Ľṹ޷ + */ +Status DestroyString(SString S) { + return OK; +} + +/* + * + * + * Sա + */ +Status ClearString(SString S) { + // ֻҪΪ0Ϳ + S[0] = 0; + return OK; +} + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S) { + return S[0] == 0 ? TRUE : FALSE; +} + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S) { + return S[0]; +} + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len) { + int i; + + if(pos < 1 || pos > S[0] || len < 0 || pos + len - 1 > S[0]) { + return ERROR; + } + + // Ԫ + for(i = 1; i <= len; i++) { + Sub[i] = S[pos + i - 1]; + } + + // ȷ³ + Sub[0] = len; + + return OK; +} + +/* + * 㷨4.1 + * + * + * + * posʼģʽTS״γֵλãڣ򷵻0 + * ҳɹƥλá + * + *ע + * 1.ʵҪСӼ + * 2.ʵֱȽϵЧ + */ +int Index_1(SString S, SString T, int pos) { + int i, n, m; // ¼STij + SString sub; + + /* + * ʧǰ + * ̲д΢ͬ + */ + if(pos < 1 || pos > S[0] || StrEmpty(T)) { + return 0; + } + + n = StrLength(S); + m = StrLength(T); + i = pos; + + // ֤ȲԽ + while(i <= n - m + 1) { + // ȡS[i, i+m-1] + SubString(sub, S, i, m); + + // Ӵģʽƥ䣬Ҫƽ + if(StrCompare(sub, T) != 0) { + ++i; + } else { + return i; + } + } + + return 0; +} + +/* + * 㷨4.5 + * + * + * + * posʼģʽTS״γֵλãڣ򷵻0 + * ҳɹƥλá + * + *ע + * 1.ʵֲСӼ + * 2.ʵֱȽϵЧ + */ +int Index_2(SString S, SString T, int pos) { + int i = pos; + int j = 1; + + if(pos < 1 || pos > S[0] || StrEmpty(T)) { + return 0; + } + + while(i <= S[0] && j <= T[0]) { + // ַͬȽϺַ + if(S[i] == T[j]) { + i++; + j++; + + // ַͬαҪˣ±Ƚ + } else { + i = i - (j - 1) + 1; // j-1ͽ͵ǰj-1ԪأڵjԪϹһ + j = 1; // αjصTĵһλ + } + } + + // һT[0]>0ж + if(j > T[0] && T[0] > 0) { // TΪմ + return i - T[0]; // ƥɹ + } else { + return 0; + } +} + +/* + * + * + * T뵽Sposλô + */ +Status StrInsert(SString S, int pos, SString T) { + int i; + + if(pos < 1 || pos > S[0] + 1 || S[0] + T[0] > MAXSTRLEN) { + return ERROR; + } + + // ĴΪգǰ + if(StrEmpty(T)) { + return OK; + } + + // SڳλãΪT׼ + for(i = S[0]; i >= pos; i--) { + // ӺǰǰԪŲ + S[i + T[0]] = S[i]; + } + + // TSڳλ + for(i = pos; i <= pos + T[0] - 1; i++) { + S[i] = T[i - pos + 1]; + } + + // + S[0] += T[0]; + + return OK; +} + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len) { + int i; + + if(pos < 1 || pos + len - 1 > S[0] || len < 0) { + return ERROR; + } + + // ɾijΪ0ǰ + if(len == 0) { + return OK; + } + + // ѺԪŲǰ棬ǵɾԪ + for(i = pos + len; i <= S[0]; i++) { + S[i - len] = S[i]; + } + + // ȼ + S[0] -= len; + + return OK; +} + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T) { + int i = 1; + + while(i <= S[0] && i <= T[0]) { + // ַͬʱȽС + if(S[i] != T[i]) { + return S[i] - T[i]; + } + + i++; + } + + return S[0] - T[0]; +} + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S) { + int i; + + // ͬϢһ + for(i = 0; i <= S[0]; i++) { + T[i] = S[i]; + } + + return OK; +} + +/* + * 滻 + * + * V滻SгֵTȵҲصӴ + * + *ע + * 1.òСӼ + * 2.ʵֱȽϵЧ + */ +Status Replace(SString S, SString T, SString V) { + int i; + + if(StrEmpty(S) || StrEmpty(T)) { + return ERROR; + } + + // SѰģʽTһγֵλ + i = Index_2(S, T, 1); + + // ƥַҿԱȫ滻滻 + while(i != 0 && S[0] - T[0] + V[0] <= MAXSTRLEN) { + StrDelete(S, i, StrLength(T)); // SɾT + StrInsert(S, i, V); // SвV + + i += StrLength(V); // iлһλ + + i = Index_2(S, T, i); // һƥַ + } + + if(i == 0) { // SеTȫ滻 + return OK; + } else { // STVѾ岻ȥ + return ERROR; + } +} + +/* + * 㷨4.2 + * + * + * + * S1S2洢TзءӺijֻδIJ֡ + * ֵʾӺĴǷ + * + *ע + * òСӼ + */ +Status Concat(SString T, SString S1, SString S2) { + int i; + int uncut; // ´Ƿ + + // ȫҪü + if(S1[0] + S2[0] <= MAXSTRLEN) { + // S1T + for(i = 1; i <= S1[0]; i++) { + T[i] = S1[i]; + } + + // S2T + for(i = S1[0] + 1; i <= S1[0] + S2[0]; i++) { + T[i] = S2[i - S1[0]]; + } + + // ³ + T[0] = S1[0] + S2[0]; + + // δü + uncut = TRUE; + + // ҪüS2 + } else if(S1[0] <= MAXSTRLEN) { + // S1T + for(i = 1; i <= S1[0]; i++) { + T[i] = S1[i]; + } + + // S2һָƵT + for(i = S1[0] + 1; i <= MAXSTRLEN; i++) { + T[i] = S2[i - S1[0]]; + } + + // ³ + T[0] = MAXSTRLEN; + + uncut = FALSE; + + // ֻҪS1һ + } else { + // ͬϢһ + for(i = 0; i <= MAXSTRLEN; i++) { + T[i] = S1[i]; + } + + uncut = FALSE; + } + + return uncut; +} + +// ӡַ +void StrPrint(SString S) { + int i; + + for(i = 1; i<=S[0] ; i++) { + printf("%c", S[i]); + } + + printf("\n"); +} diff --git a/VisualC++/ExerciseBook/04.19/SString.h b/VisualC++/ExerciseBook/04.19/SString.h new file mode 100644 index 0000000..386ffb8 --- /dev/null +++ b/VisualC++/ExerciseBook/04.19/SString.h @@ -0,0 +1,179 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#ifndef SSTRING_H +#define SSTRING_H + +#include +#include // ṩstrlenԭ +#include "Status.h" //**01 **// + +/* 궨 */ +#define MAXSTRLEN 255 // ˳򴮵󴮳 + +/* + * ˳洢Ͷ + * + * עЧԪشSString1ŵԪʼ洢 + * SString0ŵԪ洢䳤 + */ +typedef unsigned char SString[MAXSTRLEN + 1]; // 0ŵԪŴij + + +/* + * ʾ + * + * ѭ̲ĵдϰߣposָʾַλ()1ʼ + */ + + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars); + +/* + * + * + * S١ + * + *ע + * ˳򴮵Ľṹ޷ + */ +Status DestroyString(SString S); + +/* + * + * + * Sա + */ +Status ClearString(SString S); + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S); + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S); + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len); + +/* + * 㷨4.1 + * + * + * + * posʼģʽTS״γֵλãڣ򷵻0 + * ҳɹƥλá + * + *ע + * 1.ʵҪСӼ + * 2.ʵֱȽϵЧ + */ +int Index_1(SString S, SString T, int pos); + +/* + * 㷨4.5 + * + * + * + * posʼģʽTS״γֵλãڣ򷵻0 + * ҳɹƥλá + * + *ע + * 1.ʵֲСӼ + * 2.ʵֱȽϵЧ + */ +int Index_2(SString S, SString T, int pos); + +/* + * + * + * T뵽Sposλô + */ +Status StrInsert(SString S, int pos, SString T); + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len); + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T); + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S); + +/* + * 滻 + * + * V滻SгֵTȵҲصӴ + * + *ע + * òСӼЧʽϵ͡ + */ +Status Replace(SString S, SString T, SString V); + +/* + * 㷨4.2 + * + * + * + * S1S2洢TзءӺijֻδIJ֡ + * ֵʾӺĴǷ + * + *ע + * òСӼ + */ +Status Concat(SString T, SString S1, SString S2); + +// ӡַ +void StrPrint(SString S); + +#endif diff --git a/VisualC++/ExerciseBook/04.20/04.20.c b/VisualC++/ExerciseBook/04.20/04.20.c new file mode 100644 index 0000000..0a839aa --- /dev/null +++ b/VisualC++/ExerciseBook/04.20/04.20.c @@ -0,0 +1,47 @@ +#include +#include "Status.h" //**01 **// +#include "SString.h" //**04 **// + +/* + * ɾSаT + */ +Status Algo_4_20(SString S, SString T); + + +int main(int argc, char* argv[]) { + char* s = "----***--*-**-****-*****-----"; + char* t = "**"; + SString T, S; + + printf("ɾǰ...\n"); + StrAssign(S, s); + StrAssign(T, t); + printf("S = "); + StrPrint(S); + printf("T = "); + StrPrint(T); + + printf("ɾ...\n"); + printf("S = "); + Algo_4_20(S, T); + StrPrint(S); + + return 0; +} + + +/* + * ɾSаT + */ +Status Algo_4_20(SString S, SString T) { + int i; + + // SвTҵɾ + while((i = Index_2(S, T, 1)) != 0) { + if(StrDelete(S, i, StrLength(T)) == ERROR) { + return ERROR; + } + } + + return OK; +} diff --git a/VisualC++/ExerciseBook/04.20/04.20.vcxproj b/VisualC++/ExerciseBook/04.20/04.20.vcxproj new file mode 100644 index 0000000..afb395f --- /dev/null +++ b/VisualC++/ExerciseBook/04.20/04.20.vcxproj @@ -0,0 +1,76 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {96C98B39-7FA9-434A-BAB4-DCA6EBD5E0BA} + My0420 + + + + Application + true + MultiByte + + + Application + false + true + MultiByte + + + + + + + + + + + + + $(SolutionDir)\..\Status;$(IncludePath) + + + + Level3 + Disabled + + + true + $(SolutionDir)\..\Status\Status.lib;%(AdditionalDependencies) + Console + + + + + Level3 + MaxSpeed + true + true + + + true + true + true + + + + + + + + + + + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/04.20/04.20.vcxproj.filters b/VisualC++/ExerciseBook/04.20/04.20.vcxproj.filters new file mode 100644 index 0000000..327c1b0 --- /dev/null +++ b/VisualC++/ExerciseBook/04.20/04.20.vcxproj.filters @@ -0,0 +1,30 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + 源文件 + + + 源文件 + + + + + 头文件 + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/04.20/04.20.vcxproj.user b/VisualC++/ExerciseBook/04.20/04.20.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/VisualC++/ExerciseBook/04.20/04.20.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/04.20/SString.c b/VisualC++/ExerciseBook/04.20/SString.c new file mode 100644 index 0000000..fc4c757 --- /dev/null +++ b/VisualC++/ExerciseBook/04.20/SString.c @@ -0,0 +1,406 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#include "SString.h" //**04 **// + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars) { + int i, len; + + len = (int) strlen(chars); + + // chars + if(len > MAXSTRLEN) { + return ERROR; + } + + T[0] = len; + for(i = 1; i <= len; i++) { + T[i] = chars[i - 1]; + } + + return OK; +} + +/* + * + * + * S١ + * + *ע + * ˳򴮵Ľṹ޷ + */ +Status DestroyString(SString S) { + return OK; +} + +/* + * + * + * Sա + */ +Status ClearString(SString S) { + // ֻҪΪ0Ϳ + S[0] = 0; + return OK; +} + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S) { + return S[0] == 0 ? TRUE : FALSE; +} + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S) { + return S[0]; +} + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len) { + int i; + + if(pos < 1 || pos > S[0] || len < 0 || pos + len - 1 > S[0]) { + return ERROR; + } + + // Ԫ + for(i = 1; i <= len; i++) { + Sub[i] = S[pos + i - 1]; + } + + // ȷ³ + Sub[0] = len; + + return OK; +} + +/* + * 㷨4.1 + * + * + * + * posʼģʽTS״γֵλãڣ򷵻0 + * ҳɹƥλá + * + *ע + * 1.ʵҪСӼ + * 2.ʵֱȽϵЧ + */ +int Index_1(SString S, SString T, int pos) { + int i, n, m; // ¼STij + SString sub; + + /* + * ʧǰ + * ̲д΢ͬ + */ + if(pos < 1 || pos > S[0] || StrEmpty(T)) { + return 0; + } + + n = StrLength(S); + m = StrLength(T); + i = pos; + + // ֤ȲԽ + while(i <= n - m + 1) { + // ȡS[i, i+m-1] + SubString(sub, S, i, m); + + // Ӵģʽƥ䣬Ҫƽ + if(StrCompare(sub, T) != 0) { + ++i; + } else { + return i; + } + } + + return 0; +} + +/* + * 㷨4.5 + * + * + * + * posʼģʽTS״γֵλãڣ򷵻0 + * ҳɹƥλá + * + *ע + * 1.ʵֲСӼ + * 2.ʵֱȽϵЧ + */ +int Index_2(SString S, SString T, int pos) { + int i = pos; + int j = 1; + + if(pos < 1 || pos > S[0] || StrEmpty(T)) { + return 0; + } + + while(i <= S[0] && j <= T[0]) { + // ַͬȽϺַ + if(S[i] == T[j]) { + i++; + j++; + + // ַͬαҪˣ±Ƚ + } else { + i = i - (j - 1) + 1; // j-1ͽ͵ǰj-1ԪأڵjԪϹһ + j = 1; // αjصTĵһλ + } + } + + // һT[0]>0ж + if(j > T[0] && T[0] > 0) { // TΪմ + return i - T[0]; // ƥɹ + } else { + return 0; + } +} + +/* + * + * + * T뵽Sposλô + */ +Status StrInsert(SString S, int pos, SString T) { + int i; + + if(pos < 1 || pos > S[0] + 1 || S[0] + T[0] > MAXSTRLEN) { + return ERROR; + } + + // ĴΪգǰ + if(StrEmpty(T)) { + return OK; + } + + // SڳλãΪT׼ + for(i = S[0]; i >= pos; i--) { + // ӺǰǰԪŲ + S[i + T[0]] = S[i]; + } + + // TSڳλ + for(i = pos; i <= pos + T[0] - 1; i++) { + S[i] = T[i - pos + 1]; + } + + // + S[0] += T[0]; + + return OK; +} + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len) { + int i; + + if(pos < 1 || pos + len - 1 > S[0] || len < 0) { + return ERROR; + } + + // ɾijΪ0ǰ + if(len == 0) { + return OK; + } + + // ѺԪŲǰ棬ǵɾԪ + for(i = pos + len; i <= S[0]; i++) { + S[i - len] = S[i]; + } + + // ȼ + S[0] -= len; + + return OK; +} + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T) { + int i = 1; + + while(i <= S[0] && i <= T[0]) { + // ַͬʱȽС + if(S[i] != T[i]) { + return S[i] - T[i]; + } + + i++; + } + + return S[0] - T[0]; +} + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S) { + int i; + + // ͬϢһ + for(i = 0; i <= S[0]; i++) { + T[i] = S[i]; + } + + return OK; +} + +/* + * 滻 + * + * V滻SгֵTȵҲصӴ + * + *ע + * 1.òСӼ + * 2.ʵֱȽϵЧ + */ +Status Replace(SString S, SString T, SString V) { + int i; + + if(StrEmpty(S) || StrEmpty(T)) { + return ERROR; + } + + // SѰģʽTһγֵλ + i = Index_2(S, T, 1); + + // ƥַҿԱȫ滻滻 + while(i != 0 && S[0] - T[0] + V[0] <= MAXSTRLEN) { + StrDelete(S, i, StrLength(T)); // SɾT + StrInsert(S, i, V); // SвV + + i += StrLength(V); // iлһλ + + i = Index_2(S, T, i); // һƥַ + } + + if(i == 0) { // SеTȫ滻 + return OK; + } else { // STVѾ岻ȥ + return ERROR; + } +} + +/* + * 㷨4.2 + * + * + * + * S1S2洢TзءӺijֻδIJ֡ + * ֵʾӺĴǷ + * + *ע + * òСӼ + */ +Status Concat(SString T, SString S1, SString S2) { + int i; + int uncut; // ´Ƿ + + // ȫҪü + if(S1[0] + S2[0] <= MAXSTRLEN) { + // S1T + for(i = 1; i <= S1[0]; i++) { + T[i] = S1[i]; + } + + // S2T + for(i = S1[0] + 1; i <= S1[0] + S2[0]; i++) { + T[i] = S2[i - S1[0]]; + } + + // ³ + T[0] = S1[0] + S2[0]; + + // δü + uncut = TRUE; + + // ҪüS2 + } else if(S1[0] <= MAXSTRLEN) { + // S1T + for(i = 1; i <= S1[0]; i++) { + T[i] = S1[i]; + } + + // S2һָƵT + for(i = S1[0] + 1; i <= MAXSTRLEN; i++) { + T[i] = S2[i - S1[0]]; + } + + // ³ + T[0] = MAXSTRLEN; + + uncut = FALSE; + + // ֻҪS1һ + } else { + // ͬϢһ + for(i = 0; i <= MAXSTRLEN; i++) { + T[i] = S1[i]; + } + + uncut = FALSE; + } + + return uncut; +} + +// ӡַ +void StrPrint(SString S) { + int i; + + for(i = 1; i<=S[0] ; i++) { + printf("%c", S[i]); + } + + printf("\n"); +} diff --git a/VisualC++/ExerciseBook/04.20/SString.h b/VisualC++/ExerciseBook/04.20/SString.h new file mode 100644 index 0000000..386ffb8 --- /dev/null +++ b/VisualC++/ExerciseBook/04.20/SString.h @@ -0,0 +1,179 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#ifndef SSTRING_H +#define SSTRING_H + +#include +#include // ṩstrlenԭ +#include "Status.h" //**01 **// + +/* 궨 */ +#define MAXSTRLEN 255 // ˳򴮵󴮳 + +/* + * ˳洢Ͷ + * + * עЧԪشSString1ŵԪʼ洢 + * SString0ŵԪ洢䳤 + */ +typedef unsigned char SString[MAXSTRLEN + 1]; // 0ŵԪŴij + + +/* + * ʾ + * + * ѭ̲ĵдϰߣposָʾַλ()1ʼ + */ + + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars); + +/* + * + * + * S١ + * + *ע + * ˳򴮵Ľṹ޷ + */ +Status DestroyString(SString S); + +/* + * + * + * Sա + */ +Status ClearString(SString S); + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S); + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S); + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len); + +/* + * 㷨4.1 + * + * + * + * posʼģʽTS״γֵλãڣ򷵻0 + * ҳɹƥλá + * + *ע + * 1.ʵҪСӼ + * 2.ʵֱȽϵЧ + */ +int Index_1(SString S, SString T, int pos); + +/* + * 㷨4.5 + * + * + * + * posʼģʽTS״γֵλãڣ򷵻0 + * ҳɹƥλá + * + *ע + * 1.ʵֲСӼ + * 2.ʵֱȽϵЧ + */ +int Index_2(SString S, SString T, int pos); + +/* + * + * + * T뵽Sposλô + */ +Status StrInsert(SString S, int pos, SString T); + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len); + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T); + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S); + +/* + * 滻 + * + * V滻SгֵTȵҲصӴ + * + *ע + * òСӼЧʽϵ͡ + */ +Status Replace(SString S, SString T, SString V); + +/* + * 㷨4.2 + * + * + * + * S1S2洢TзءӺijֻδIJ֡ + * ֵʾӺĴǷ + * + *ע + * òСӼ + */ +Status Concat(SString T, SString S1, SString S2); + +// ӡַ +void StrPrint(SString S); + +#endif diff --git a/VisualC++/ExerciseBook/04.21/04.21.c b/VisualC++/ExerciseBook/04.21/04.21.c new file mode 100644 index 0000000..c9a2ab7 --- /dev/null +++ b/VisualC++/ExerciseBook/04.21/04.21.c @@ -0,0 +1,336 @@ +#include +#include // ṩ mallocreallocfreeexit ԭ +#include +#include "Status.h" //**01 **// + +/* + * ԪͶ + * + *ע + * ȻַԪȻintԭǣ + * 1.Ҫͷ洢intֱchar + * 2.charintݣԽȻintҲ洢char + */ +typedef int ElemType; + +/* + * ṹ + * + * עĵͷ + */ +typedef struct SNode { + ElemType data; // ݽ + struct SNode* next; // ָһָ +} SNode; + +// ָָ룬ַ +typedef SNode* String; + + +/* + * ʼ + * + * һֵΪcharsĴT + */ +Status StrAssign_4_21(String* S, char* chars); + +/* + * + * + * SƵT + */ +Status StrCopy_4_21(String* S, String T); + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + */ +int StrCompare_4_21(String S, String T); + +/* + * + * + * شSԪصĸ + */ +int StrLength_4_21(String S); + +/* + * + * + * S1S2洢TзءӺijֻδIJ֡ + * ֵʾӺĴǷ + */ +Status Concat_4_21(String* R, String S1, String S2); + +/* + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + */ +Status SubString_4_21(String* Sub, String S, int pos, int len); + +// ַ +void StrPrint_4_21(String S); + + +int main(int argc, char* argv[]) { + char* chars = "0123456789"; + String S, T; + int i; + + printf(" StrAssign \n"); + { + printf(" Ϊ˳ S ֵ...\n"); + StrAssign_4_21(&S, chars); + printf(" S = "); + StrPrint_4_21(S); + } + PressEnterToContinue(); + + printf(" StrLength \n"); + { + i = StrLength_4_21(S); + printf(" S ijΪ %d \n", i); + } + PressEnterToContinue(); + + printf(" StrCopy \n"); + { + printf(" S T ...\n"); + StrCopy_4_21(&T, S); + printf(" T = "); + StrPrint_4_21(T); + } + PressEnterToContinue(); + + printf(" StrCompare \n"); + { + printf(" Ƚַ S T ...\n"); + i = StrCompare_4_21(S, T); + i == 0 ? printf(" S==T\n") : (i < 0 ? printf(" ST\n")); + } + PressEnterToContinue(); + + printf(" SubString \n"); + { + String Sub; + + printf(" Sub S е 6 ַ 5 ַ...\n"); + SubString_4_21(&Sub, S, 6, 5); + printf(" Sub = "); + StrPrint_4_21(Sub); + } + PressEnterToContinue(); + + + printf(" Concat \n"); + { + String Tmp, S1, S2; + + StrAssign_4_21(&S1, "+++++"); + StrAssign_4_21(&S2, "-----"); + + printf(" \"+++++\" \"-----\" γ Tmp ...\n"); + Concat_4_21(&Tmp, S1, S2); + printf(" Tmp = "); + StrPrint_4_21(Tmp); + } + PressEnterToContinue(); + + return 0; +} + + +/* + * ʼ + * + * һֵΪcharsĴT + */ +Status StrAssign_4_21(String* S, char* chars) { + int i, len; + String p; + + if(S == NULL || chars == NULL) { + return ERROR; + } + + len = (int) strlen(chars); + + *S = (SNode*) malloc(sizeof(SNode)); + (*S)->data = len; + + p = *S; + + for(i = 0; i < len; i++) { + p->next = (SNode*) malloc(sizeof(SNode)); + p->next->data = chars[i]; + p = p->next; + } + + p->next = NULL; + + return OK; +} + +/* + * + * + * SƵT + */ +Status StrCopy_4_21(String* S, String T) { + String p, r, t; + + if(S == NULL || T == NULL) { + return ERROR; + } + + for(t = T; t != NULL; t = t->next) { + r = (SNode*) malloc(sizeof(SNode)); + r->data = t->data; + + if(t == T) { + *S = r; + p = r; + } else { + p->next = r; + p = p->next; + } + } + + p->next = NULL; + + return OK; +} + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + */ +int StrCompare_4_21(String S, String T) { + String s, t; + + if(S == NULL || T == NULL) { + return StrLength_4_21(S) - StrLength_4_21(T); + } + + s = S->next; + t = T->next; + + while(s != NULL && t != NULL) { + if(s->data != t->data) { + return s->data - t->data; + } + + s = s->next; + t = t->next; + } + + if(s == NULL && t != NULL) { + return -1; + } else if(s != NULL && t == NULL) { + return 1; + } else { + return 0; + } +} + +/* + * + * + * شSԪصĸ + */ +int StrLength_4_21(String S) { + return S == NULL ? 0 : S->data; +} + +/* + * + * + * S1S2洢TзءӺijֻδIJ֡ + * ֵʾӺĴǷ + */ +Status Concat_4_21(String* R, String S1, String S2) { + String r, s, p; + + if(R == NULL || S1 == NULL || S2 == NULL) { + return ERROR; + } + + *R = (SNode*) malloc(sizeof(SNode)); + (*R)->data = S1->data + S2->data; + + r = *R; + + for(s = S1->next; s != NULL; s = s->next) { + p = (SNode*) malloc(sizeof(SNode)); + p->data = s->data; + r->next = p; + r = r->next; + } + + for(s = S2->next; s != NULL; s = s->next) { + p = (SNode*) malloc(sizeof(SNode)); + p->data = s->data; + r->next = p; + r = r->next; + } + + r->next = NULL; + + return OK; +} + +/* + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + */ +Status SubString_4_21(String* Sub, String S, int pos, int len) { + int i, slen; + String sub, s, p; + + slen = StrLength_4_21(S); + + if(Sub == NULL || S == NULL || pos < 1 || pos > slen || len < 0 || pos + len - 1 > slen) { + return ERROR; + } + + *Sub = (SNode*) malloc(sizeof(SNode)); + (*Sub)->data = len; + + for(i = 0, s = S; i < pos; i++, s = s->next) { + // ҵpos㣬sָ + } + + sub = *Sub; + + for(i = 0; i < len; i++) { + sub->next = (SNode*) malloc(sizeof(SNode)); + sub->next->data = s->data; + sub = sub->next; + + s = s->next; + } + + sub->next = NULL; + + return OK; +} + +// ַ +void StrPrint_4_21(String S) { + String p; + + if(S == NULL) { + return; + } + + for(p = S->next; p != NULL; p = p->next) { + printf("%c", p->data); + } + printf("\n"); +} diff --git a/VisualC++/ExerciseBook/04.21/04.21.vcxproj b/VisualC++/ExerciseBook/04.21/04.21.vcxproj new file mode 100644 index 0000000..c644bca --- /dev/null +++ b/VisualC++/ExerciseBook/04.21/04.21.vcxproj @@ -0,0 +1,72 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {6D3C3AC9-1F42-4212-A16F-AB6A20ED95EF} + My0421 + + + + Application + true + MultiByte + + + Application + false + true + MultiByte + + + + + + + + + + + + + $(SolutionDir)\..\Status;$(IncludePath) + + + + Level3 + Disabled + + + true + $(SolutionDir)\..\Status\Status.lib;%(AdditionalDependencies) + Console + + + + + Level3 + MaxSpeed + true + true + + + true + true + true + + + + + + + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/04.21/04.21.vcxproj.filters b/VisualC++/ExerciseBook/04.21/04.21.vcxproj.filters new file mode 100644 index 0000000..f4aedd9 --- /dev/null +++ b/VisualC++/ExerciseBook/04.21/04.21.vcxproj.filters @@ -0,0 +1,22 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + 源文件 + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/04.21/04.21.vcxproj.user b/VisualC++/ExerciseBook/04.21/04.21.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/VisualC++/ExerciseBook/04.21/04.21.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/04.22/04.22.c b/VisualC++/ExerciseBook/04.22/04.22.c new file mode 100644 index 0000000..e493de2 --- /dev/null +++ b/VisualC++/ExerciseBook/04.22/04.22.c @@ -0,0 +1,59 @@ +#include +#include "LString.h" //**04 **// + +/* + * S뵽Tеַc֮ + * жcS뵽ұTʱ׸c֮ + * TڲcS뵽Tĩβ + */ +void Algo_4_22(LString* T, char ch, LString S); + + +int main(int argc, char* argv[]) { + char* t = "----***--*-**-**^**-*****-----"; + char* s = "12345"; + char ch = '^'; + LString T, S; + + StrAssign(&T, t); + StrAssign(&S, s); + printf("T = "); + StrPrint(T); + printf("S = "); + StrPrint(S); + + Algo_4_22(&T, ch, S); + printf("T = "); + StrPrint(T); + + return 0; +} + + +/* + * S뵽Tеַc֮ + * жcS뵽ұTʱ׸c֮ + * TڲcS뵽Tĩβ + */ +void Algo_4_22(LString* T, char c, LString S) { + int i; + char tmp[2]; + LString Tmp; + + // Ŀ괮 + tmp[0] = c; + tmp[1] = '\0'; + StrAssign(&Tmp, tmp); + + // ѰַcTеλ + i = Index((*T), Tmp, 1); + + // ҵcS뵽ַc֮ + if(i != 0) { + StrInsert(T, i + 1, S); + + // ûҵcS뵽Tĩβ + } else { + StrInsert(T, (*T).curlen + 1, S); + } +} diff --git a/VisualC++/ExerciseBook/04.22/04.22.vcxproj b/VisualC++/ExerciseBook/04.22/04.22.vcxproj new file mode 100644 index 0000000..431e953 --- /dev/null +++ b/VisualC++/ExerciseBook/04.22/04.22.vcxproj @@ -0,0 +1,76 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {A8758334-BC63-451B-8CA2-AA69E86B4BAC} + My0422 + + + + Application + true + MultiByte + + + Application + false + true + MultiByte + + + + + + + + + + + + + $(SolutionDir)\..\Status;$(IncludePath) + + + + Level3 + Disabled + + + true + $(SolutionDir)\..\Status\Status.lib;%(AdditionalDependencies) + Console + + + + + Level3 + MaxSpeed + true + true + + + true + true + true + + + + + + + + + + + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/04.22/04.22.vcxproj.filters b/VisualC++/ExerciseBook/04.22/04.22.vcxproj.filters new file mode 100644 index 0000000..11edce2 --- /dev/null +++ b/VisualC++/ExerciseBook/04.22/04.22.vcxproj.filters @@ -0,0 +1,30 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + 源文件 + + + 源文件 + + + + + 头文件 + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/04.22/04.22.vcxproj.user b/VisualC++/ExerciseBook/04.22/04.22.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/VisualC++/ExerciseBook/04.22/04.22.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/04.22/LString.c b/VisualC++/ExerciseBook/04.22/LString.c new file mode 100644 index 0000000..954ac09 --- /dev/null +++ b/VisualC++/ExerciseBook/04.22/LString.c @@ -0,0 +1,747 @@ +/*============================= + * Ŀ洢ʾ + ==============================*/ + +#include "LString.h" //**04 **// + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(LString* T, const char* chars) { + int len; // charsij + int i, count; // ַcharsα + int m; // ܿ + int n; // δĿ飬洢ÿеЧԪ + Chunk* r; + + // charsij + len = (int) strlen(chars); + + // ûЧԪ + if(len == 0) { + (*T).head = NULL; + (*T).tail = NULL; + (*T).curlen = 0; + + return OK; + } + + m = len / CHUNKSIZE; // ȼҪĿ + n = len % CHUNKSIZE; // δĿ飬ÿЧԪ + if(n != 0) { + m++; // ܿ + } + + // 1.Ľṹ + for(i = 1; i <= m; i++) { + // ¿ + r = (Chunk*) malloc(sizeof(Chunk)); + if(r == NULL) { + exit(OVERFLOW); + } + r->next = NULL; + + // һ + if(i == 1) { + (*T).head = (*T).tail = r; + + // ӺĿ + } else { + (*T).tail->next = r; + (*T).tail = r; + } + } + + r = (*T).head; + i = 0; // Tα + count = 0; // ͳƱԪأ˳Ϊcharsα + + // 2.Ϊ + while(count < len) { + r->ch[i] = chars[count]; + + i = (i + 1) % CHUNKSIZE; + if(i == 0) { + r = r->next; // ָһ + } + + count++; + } + + // 3.δĿ + if(n != 0) { + // Ǵֵ('\0') + while(i < CHUNKSIZE) { + (*T).tail->ch[i] = '\0'; + i++; + } + } + + // 4.¼Ϣ + (*T).curlen = len; + + return OK; +} + +/* + * + * + *ע + * Ľṹ٣ٲ + */ +Status DestroyString(LString* S) { + return OK; +} + +/* + * + * + * Sա + */ +Status ClearString(LString* S) { + Chunk* p, * q; + + p = (*S).head; + + // ͷдռõĿռ + while(p != NULL) { + q = p->next; + free(p); + p = q; + } + + (*S).head = NULL; + (*S).tail = NULL; + (*S).curlen = 0; + + return OK; +} + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(LString S) { + return S.curlen == 0 ? TRUE : FALSE; +} + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(LString S) { + return S.curlen; +} + +/* + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(LString* Sub, LString S, int pos, int len) { + int m; // Subܿ + int n; // SubδĿ飬洢ÿеЧԪ + int i, j, count; + Chunk* r, * p; + + if(pos < 1 || pos > S.curlen || len < 0 || pos + len - 1 > S.curlen) { + return ERROR; + } + + // ǽȡ0ַҪռ + if(len == 0) { + (*Sub).head = NULL; + (*Sub).tail = NULL; + (*Sub).curlen = 0; + + return OK; + } + + m = len / CHUNKSIZE; // ȼҪĿ + n = len % CHUNKSIZE; // SubδĿ飬ÿЧԪ + if(n != 0) { + m++; // Subܿ + } + + // 1.SubĽṹ + for(i = 1; i <= m; i++) { + // ¿ + r = (Chunk*) malloc(sizeof(Chunk)); + if(r == NULL) { + exit(OVERFLOW); + } + r->next = NULL; + + // һ + if(i == 1) { + (*Sub).head = (*Sub).tail = r; + + // ӺĿ + } else { + (*Sub).tail->next = r; + (*Sub).tail = r; + } + } + + // SеposԪڵĿ飬ָpָ + for(count = 1, p = S.head; pos > count * CHUNKSIZE; count++, p = p->next) { + // ѭ + } + + r = (*Sub).head; // ָSubĿ + + i = 0; // Subα + j = (pos - 1) % CHUNKSIZE; // S α + count = 0; // ͳƱԪ + + // 2.ΪSub + while(count < len) { + r->ch[i] = p->ch[j]; + + i = (i + 1) % CHUNKSIZE; + if(i == 0) { + r = r->next; // ָSubһ + } + + j = (j + 1) % CHUNKSIZE; + if(j == 0) { + p = p->next; // ָSһ + } + + count++; + } + + // 3.δĿ + if(n != 0) { + // Ǵֵ('\0') + while(i < CHUNKSIZE) { + (*Sub).tail->ch[i] = '\0'; + i++; + } + } + + // 4.¼Ϣ + (*Sub).curlen = len; + + return OK; +} + +/* + * + * + * posʼģʽTS״γֵλãڣ򷵻0 + * ҳɹƥλá + * + *ע + * 1.ʵҪСӼ + * 2.ʵֱȽϵЧ + */ +int Index(LString S, LString T, int pos) { + int i, s, t; + LString sub; + + if(pos < 1 || pos > S.curlen || StrEmpty(T)) { + return 0; + } + + s = S.curlen; //S + t = T.curlen; //ģʽT + i = pos; + + while(i + t - 1 <= s) { + // ȡS[i, i+m-1] + SubString(&sub, S, i, t); + + // Ӵģʽƥ䣬Ҫƽ + if(StrCompare(sub, T) != 0) { + ++i; + } else { + return i; + } + } + + return 0; //Ҳƥ򷵻0 +} + +/* + * + * + * T뵽Sposλô + */ +Status StrInsert(LString* S, int pos, LString T) { + Chunk* pre, * p; // preָĿǰpָĿ + Chunk* h, * t; // ָĿͷβ + Chunk* r; + Chunk* s; + int i, j, count; + + if(pos < 1 || pos > (*S).curlen + 1) { + return ERROR; + } + + // ĴΪգǰ + if(StrEmpty(T)) { + return OK; + } + + // ¼ʼֹ + h = t = NULL; + + // TеĿ飨ֻƽṹ + for(r = T.head; r != NULL; r = r->next) { + s = (Chunk*) malloc(sizeof(Chunk)); + if(s == NULL) { + exit(OVERFLOW); + } + s->next = NULL; + + if(r == T.head) { + h = t = s; + } else { + t->next = s; + t = s; + } + } + + // SеposԪڵĿ飨עΪĿ飩ָpreָǰ + if(pos >= 1 && pos <= CHUNKSIZE) { + pre = NULL; // ˵posԪڿΪhead + p = (*S).head; + } else { + for(count = 1, pre = (*S).head; count < (pos - 1) / CHUNKSIZE; count++, pre = pre->next) { + // ѭ + } + p = pre->next; + } + + /* + * htΧĿ뵽posڵĿ֮ǰ + */ + + if(pre == NULL) { + t->next = (*S).head; + (*S).head = h; + } else { + pre->next = h; + t->next = p; + } + + if(pre == (*S).tail) { + (*S).tail = t; + } + + /* + * ƶ/Ԫ + */ + + j = 0; + + // 뵽ijġм䡱 + if((pos - 1) % CHUNKSIZE != 0) { + // ƶĿposλ֮ǰԪ + for(i = 1; i <= (pos - 1) % CHUNKSIZE; i++) { + h->ch[j++] = p->ch[i - 1]; + p->ch[i - 1] = '\0'; + } + } + + r = T.head; + i = 0; + + // TеԪصS + for(count = 1; count <= T.curlen; count++) { + h->ch[j] = r->ch[i]; + + j = (j + 1) % CHUNKSIZE; + i = (i + 1) % CHUNKSIZE; + + if(j == 0) { + h = h->next; + } + + if(i == 0) { + r = r->next; + } + } + + // Tһа'\0' + if(T.curlen % CHUNKSIZE != 0) { + r = p; // ָĿ + i = (pos - 1) % CHUNKSIZE; + + // ƶĿposλü֮Ԫ + for(count = pos; count <= (*S).curlen; count++) { + h->ch[j] = r->ch[i]; + r->ch[i] = '\0'; + + j = (j + 1) % CHUNKSIZE; + i = (i + 1) % CHUNKSIZE; + + if(j == 0) { + h = h->next; + } + + if(i == 0) { + r = r->next; + } + } + } + + (*S).curlen += T.curlen; + + return OK; +} + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(LString* S, int pos, int len) { + Chunk* pre; // ָԪS[pos]ڵĿǰ + Chunk* p; // ָԪS[pos]ڵĿ + Chunk* q; // ָԪS[pos+len]ڵĿ + Chunk* r; + int i, j, count, total; + + if(pos < 1 || pos > (*S).curlen || len < 0 || pos + len - 1 > (*S).curlen) { + return ERROR; + } + + // ɾijΪ0ǰ + if(len == 0) { + return OK; + } + + // S[pos]ڵĿ飬ָpreָǰ + if(pos >= 1 && pos <= CHUNKSIZE) { + pre = NULL; // ˵posԪڿΪhead + p = (*S).head; + } else { + for(count = 1, pre = (*S).head; count < (pos - 1) / CHUNKSIZE; count++, pre = pre->next) { + // ѭ + } + p = pre->next; + } + + // S[pos+len]ڵĿ + for(count = (pos - 1) / CHUNKSIZE, q = p; count < (pos + len - 1) / CHUNKSIZE; count++, q = q->next) { + // ѭ + } + + // ҪƶԪظ + total = (*S).curlen - (pos + len) + 1; + + // յijȶ + (*S).curlen -= len; + + i = (pos - 1) % CHUNKSIZE; + j = (pos + len - 1) % CHUNKSIZE; + + if(p != q) { + // ɾpq֮Ŀ + r = p->next; + while(r != q) { + p->next = r->next; + free(r); + r = p->next; + } + + if(q == NULL) { + (*S).tail = p; + } + + // Ҫɾpָ + if((pos - 1) % CHUNKSIZE == 0) { + // pѾָͷ + if(pre == NULL) { + (*S).head = q; + } else { + pre->next = q; + } + + free(p); + p = q; + + if(q == NULL) { + (*S).tail = pre; + } + } + } + + // Ѿλ + if(p == q && i == j) { + return OK; + } + + for(count = 1; count <= total; count++) { + // ƶԪ + p->ch[i] = q->ch[j]; + + i = (i + 1) % CHUNKSIZE; + j = (j + 1) % CHUNKSIZE; + + if(i == 0) { + pre = p; + p = p->next; + } + + if(j == 0) { + q = q->next; + } + } + + // ǡĿ + if(i == 0) { + (*S).tail = pre; + r = p; + } else { + (*S).tail = p; + + // ʣಿǴֵַ + while(i < CHUNKSIZE) { + p->ch[i++] = '\0'; + } + + r = p->next; + } + + // ͷŶĿռ + while(r != NULL) { + (*S).tail->next = r->next; + free(r); + r = (*S).tail->next; + } + + return OK; +} + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(LString S, LString T) { + int i; + Chunk* s = S.head; + Chunk* t = T.head; + + while(s != NULL && t != NULL) { + for(i = 0; i < CHUNKSIZE; i++) { + if(s->ch[i] != t->ch[i]) { + return s->ch[i] - t->ch[i]; + } + } + + s = s->next; + t = t->next; + } + + if(s != NULL) { + return 1; + } else if(t != NULL) { + return -1; + } else { + return 0; + } +} + +/* + * + * + * SƵT + */ +Status StrCopy(LString* T, LString S) { + int i; + Chunk* s, * p; + + for(p = S.head; p; p = p->next) { + s = (Chunk*) malloc(sizeof(Chunk)); + if(s == NULL) { + exit(OVERFLOW); + } + s->next = NULL; + + if(p == S.head) { + (*T).head = (*T).tail = s; + } else { + (*T).tail->next = s; + (*T).tail = s; + } + + for(i = 0; i < CHUNKSIZE; i++) { + (*s).ch[i] = (*p).ch[i]; + } + } + + (*T).curlen = S.curlen; + + return OK; +} + +/* + * 滻 + * + * V滻SгֵTȵҲصӴ + * + *ע + * 1.òСӼ + * 2.ʵֱȽϵЧ + */ +Status Replace(LString* S, LString T, LString V) { + int i; + + if(StrEmpty(*S) || StrEmpty(T)) { + return ERROR; + } + + // SѰģʽTһγֵλ + i = Index(*S, T, 1); + + // ƥַ + while(i != 0) { + StrDelete(S, i, StrLength(T)); // SɾT + StrInsert(S, i, V); // SвV + + i += StrLength(V); // iлһλ + + i = Index(*S, T, i); // һƥַ + } + + return OK; +} + +/* + * + * + * S1S2洢TзءӺijֻδIJ֡ + * ֵʾӺĴǷ + * + *ע + * òСӼ + */ +Status Concat(LString* T, LString S1, LString S2) { + Chunk* p; // S1S2 + Chunk* r; // T + Chunk* s; + int i, j, count; + + // 㳤Ϣ + (*T).curlen = S1.curlen + S2.curlen; + + // Ҫٸ + count = (*T).curlen / CHUNKSIZE + ((*T).curlen % CHUNKSIZE == 0 ? 0 : 1); + + // S1Ľṹ + for(i = 1; i <= count; i++) { + s = (Chunk*) malloc(sizeof(Chunk)); + if(s == NULL) { + exit(OVERFLOW); + } + s->next = NULL; + + if(i == 1) { + (*T).head = (*T).tail = s; + } else { + (*T).tail->next = s; + (*T).tail = s; + } + } + + i = 0; + r = (*T).head; + + // S1е + j = 0; + p = S1.head; + for(count = 0; count < S1.curlen; count++) { + r->ch[i] = p->ch[j]; + + i = (i + 1) % CHUNKSIZE; + j = (j + 1) % CHUNKSIZE; + + if(i == 0) { + r = r->next; + } + + if(j == 0) { + p = p->next; + } + } + + // S2е + j = 0; + p = S2.head; + for(count = 0; count < S2.curlen; count++) { + r->ch[i] = p->ch[j]; + + i = (i + 1) % CHUNKSIZE; + j = (j + 1) % CHUNKSIZE; + + if(i == 0) { + r = r->next; + } + + if(j == 0) { + p = p->next; + } + } + + // ĿռǴֵַ + if(i != 0) { + while(i < CHUNKSIZE) { + r->ch[i] = '\0'; + i++; + } + } + + return OK; +} + +// Ժӡַ +void StrPrint(LString S) { + int i = 0; + Chunk* p = S.head; + + if(S.curlen == 0 || S.head == NULL || S.tail == NULL) { + return; + } + + while(p != NULL) { + // Ǵֵʱ + if(p->ch[i] == '\0') { + break; + } + + printf("%c", p->ch[i]); + + i = (i + 1) % CHUNKSIZE; + + if(i == 0) { + p = p->next; + } + } + + printf("\n"); +} diff --git a/VisualC++/ExerciseBook/04.22/LString.h b/VisualC++/ExerciseBook/04.22/LString.h new file mode 100644 index 0000000..e6f19d1 --- /dev/null +++ b/VisualC++/ExerciseBook/04.22/LString.h @@ -0,0 +1,169 @@ +/*============================= + * Ŀ洢ʾ + ==============================*/ + +#ifndef LSTRING_H +#define LSTRING_H + +#include +#include // ṩmallocreallocfreeexitԭ +#include // ṩstrlenԭ +#include "Status.h" //**01 **// + +/* 궨 */ +#define CHUNKSIZE 3 // СԶ壩 + +/* Ŀ洢ṹ */ +typedef struct Chunk { + char ch[CHUNKSIZE]; // ǰе + struct Chunk* next; // ָһ +} Chunk; + +/* Ŀ洢Ͷ */ +typedef struct { + Chunk* head; //ͷָ + Chunk* tail; //βָ + int curlen; //ĵǰ +} LString; + + +/* + * ʾ + * + * ѭ̲ĵдϰߣposָʾַλ()1ʼ + */ + +/* + * ע + * + * 1.̲ʾʹ#ΪǴֵַʹCе\0ΪǴֵַ + * 2.ָ̲һУĩβ÷Ǵֵַġ + * СΪ4Ϊ14ĿΪ£ã -> ţƣǣ -> ɣʣˣ -> ͣ\0\0 + */ + + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(LString* T, const char* chars); + +/* + * + * + * S١ + */ +Status DestroyString(LString* S); + +/* + * + * + * Sա + */ +Status ClearString(LString* S); + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(LString S); + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(LString S); + +/* + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(LString* Sub, LString S, int pos, int len); + +/* + * + * + * posʼģʽTS״γֵλãڣ򷵻0 + * ҳɹƥλá + * + *ע + * 1.ʵҪСӼ + * 2.ʵֱȽϵЧ + */ +int Index(LString S, LString T, int pos); + +/* + * + * + * T뵽Sposλô + */ +Status StrInsert(LString* S, int pos, LString T); + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(LString* S, int pos, int len); + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +Status StrCompare(LString S, LString T); + +/* + * + * + * SƵT + */ +Status StrCopy(LString* T, LString S); + +/* + * 滻 + * + * V滻SгֵTȵҲصӴ + * + *ע + * 1.òСӼ + * 2.ʵֱȽϵЧ + */ +Status Replace(LString* S, LString T, LString V); + +/* + * + * + * S1S2洢TзءӺijֻδIJ֡ + * ֵʾӺĴǷ + * + *ע + * òСӼ + */ +Status Concat(LString* T, LString S1, LString S2); + +// Ժӡַ +void StrPrint(LString S); + +#endif diff --git a/VisualC++/ExerciseBook/04.23/04.23.c b/VisualC++/ExerciseBook/04.23/04.23.c new file mode 100644 index 0000000..d310967 --- /dev/null +++ b/VisualC++/ExerciseBook/04.23/04.23.c @@ -0,0 +1,107 @@ +#include +#include "LString.h" //**04 **// + +/* + * жϸĴǷԳơ + * մַĴᱻΪǶԳƵġ + */ +Status Algo_4_23(LString T); + + +int main(int argc, char* argv[]) { + char* t = "abcdefgfedcba"; + LString T; + + StrAssign(&T, t); + printf("T = "); + StrPrint(T); + + Algo_4_23(T) ? printf("TǶԳƴ\n") : printf("TǷǶԳƴ\n"); + + return 0; +} + + +/* + * жϸĴǷԳơ + * մַĴᱻΪǶԳƵġ + */ +Status Algo_4_23(LString T) { + int len; // Tij + + int a1, b1; // Tǰ벿ֱ߽ + int a2, b2; // Tĺ벿ֱ߽ + int k; // ƱTʱҪԪ + int i; // Tʱα + Chunk* t; + + char* stack; // ģջ + int top; // ջα + + char c; // Tȡַ + + len = StrLength(T); + + // մΪǶԳƵ + if(len == 0) { + return OK; + } + + // ijż + if(len % 2 == 0) { + a1 = 0; + b1 = len / 2 - 1; + a2 = len / 2; + b2 = len - 1; + // ij + } else { + a1 = 0; + b1 = len / 2 - 1; + a2 = len / 2 + 1; + b2 = len - 1; + } + + stack = (char*) malloc(len * sizeof(char)); + top = -1; + + i = 0; + t = T.head; + + // ڴǰ벿֣ջ + for(k = a1; k <= b1; k++) { + c = t->ch[i]; + i = (i + 1) % CHUNKSIZE; + if(i == 0) { + t = t->next; + } + + stack[++top] = c; + } + + // ΪҪһַ + if(len % 2 == 1) { + i = (i + 1) % CHUNKSIZE; + if(i == 0) { + t = t->next; + } + } + + for(k = a2; k <= b2; k++) { + c = t->ch[i]; + i = (i + 1) % CHUNKSIZE; + if(i == 0) { + t = t->next; + } + + // ˲ԳƵַ + if(stack[top--] != c) { + return ERROR; + } + } + + if(top == -1) { + return OK; + } else { + return ERROR; + } +} diff --git a/VisualC++/ExerciseBook/04.23/04.23.vcxproj b/VisualC++/ExerciseBook/04.23/04.23.vcxproj new file mode 100644 index 0000000..6035df4 --- /dev/null +++ b/VisualC++/ExerciseBook/04.23/04.23.vcxproj @@ -0,0 +1,76 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {7AF60383-012E-4F71-98BF-8A0EA94A798D} + My0423 + + + + Application + true + MultiByte + + + Application + false + true + MultiByte + + + + + + + + + + + + + $(SolutionDir)\..\Status;$(IncludePath) + + + + Level3 + Disabled + + + true + $(SolutionDir)\..\Status\Status.lib;%(AdditionalDependencies) + Console + + + + + Level3 + MaxSpeed + true + true + + + true + true + true + + + + + + + + + + + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/04.23/04.23.vcxproj.filters b/VisualC++/ExerciseBook/04.23/04.23.vcxproj.filters new file mode 100644 index 0000000..f34db4a --- /dev/null +++ b/VisualC++/ExerciseBook/04.23/04.23.vcxproj.filters @@ -0,0 +1,30 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + 源文件 + + + 源文件 + + + + + 头文件 + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/04.23/04.23.vcxproj.user b/VisualC++/ExerciseBook/04.23/04.23.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/VisualC++/ExerciseBook/04.23/04.23.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/04.23/LString.c b/VisualC++/ExerciseBook/04.23/LString.c new file mode 100644 index 0000000..76b08fa --- /dev/null +++ b/VisualC++/ExerciseBook/04.23/LString.c @@ -0,0 +1,748 @@ +/*============================= + * Ŀ洢ʾ + ==============================*/ + +#include "LString.h" //**04 **// + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(LString* T, const char* chars) { + int len; // charsij + int i, count; // ַcharsα + int m; // ܿ + int n; // δĿ飬洢ÿеЧԪ + Chunk* r; + + // charsij + len = (int) strlen(chars); + + // ûЧԪ + if(len == 0) { + (*T).head = NULL; + (*T).tail = NULL; + (*T).curlen = 0; + + return OK; + } + + m = len / CHUNKSIZE; // ȼҪĿ + n = len % CHUNKSIZE; // δĿ飬ÿЧԪ + if(n != 0) { + m++; // ܿ + } + + // 1.Ľṹ + for(i = 1; i <= m; i++) { + // ¿ + r = (Chunk*) malloc(sizeof(Chunk)); + if(r == NULL) { + exit(OVERFLOW); + } + r->next = NULL; + + // һ + if(i == 1) { + (*T).head = (*T).tail = r; + + // ӺĿ + } else { + (*T).tail->next = r; + (*T).tail = r; + } + } + + r = (*T).head; + i = 0; // Tα + count = 0; // ͳƱԪأ˳Ϊcharsα + + // 2.Ϊ + while(count < len) { + r->ch[i] = chars[count]; + + i = (i + 1) % CHUNKSIZE; + if(i == 0) { + r = r->next; // ָһ + } + + count++; + } + + // 3.δĿ + if(n != 0) { + // Ǵֵ('\0') + while(i < CHUNKSIZE) { + (*T).tail->ch[i] = '\0'; + i++; + } + } + + // 4.¼Ϣ + (*T).curlen = len; + + return OK; +} + +/* + * + * + *ע + * Ľṹ٣ٲ + */ +Status DestroyString(LString* S) { + return OK; +} + +/* + * + * + * Sա + */ +Status ClearString(LString* S) { + Chunk* p, * q; + + p = (*S).head; + + // ͷдռõĿռ + while(p != NULL) { + q = p->next; + free(p); + p = q; + } + + (*S).head = NULL; + (*S).tail = NULL; + (*S).curlen = 0; + + return OK; +} + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(LString S) { + return S.curlen == 0 ? TRUE : FALSE; +} + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(LString S) { + return S.curlen; +} + +/* + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(LString* Sub, LString S, int pos, int len) { + int m; // Subܿ + int n; // SubδĿ飬洢ÿеЧԪ + int i, j, count; + Chunk* r, * p; + + if(pos < 1 || pos > S.curlen || len < 0 || pos + len - 1 > S.curlen) { + return ERROR; + } + + // ǽȡ0ַҪռ + if(len == 0) { + (*Sub).head = NULL; + (*Sub).tail = NULL; + (*Sub).curlen = 0; + + return OK; + } + + m = len / CHUNKSIZE; // ȼҪĿ + n = len % CHUNKSIZE; // SubδĿ飬ÿЧԪ + if(n != 0) { + m++; // Subܿ + } + + // 1.SubĽṹ + for(i = 1; i <= m; i++) { + // ¿ + r = (Chunk*) malloc(sizeof(Chunk)); + if(r == NULL) { + exit(OVERFLOW); + } + r->next = NULL; + + // һ + if(i == 1) { + (*Sub).head = (*Sub).tail = r; + + // ӺĿ + } else { + (*Sub).tail->next = r; + (*Sub).tail = r; + } + } + + // SеposԪڵĿ飬ָpָ + for(count = 1, p = S.head; pos > count * CHUNKSIZE; count++, p = p->next) { + // ѭ + } + + r = (*Sub).head; // ָSubĿ + + i = 0; // Subα + j = (pos - 1) % CHUNKSIZE; // S α + count = 0; // ͳƱԪ + + // 2.ΪSub + while(count < len) { + r->ch[i] = p->ch[j]; + + i = (i + 1) % CHUNKSIZE; + if(i == 0) { + r = r->next; // ָSubһ + } + + j = (j + 1) % CHUNKSIZE; + if(j == 0) { + p = p->next; // ָSһ + } + + count++; + } + + // 3.δĿ + if(n != 0) { + // Ǵֵ('\0') + while(i < CHUNKSIZE) { + (*Sub).tail->ch[i] = '\0'; + i++; + } + } + + // 4.¼Ϣ + (*Sub).curlen = len; + + return OK; +} + +/* + * + * + * posʼģʽTS״γֵλãڣ򷵻0 + * ҳɹƥλá + * + *ע + * 1.ʵҪСӼ + * 2.ʵֱȽϵЧ + */ +int Index(LString S, LString T, int pos) { + int i, s, t; + LString sub; + + if(pos < 1 || pos > S.curlen || StrEmpty(T)) { + return 0; + } + + s = S.curlen; //S + t = T.curlen; //ģʽT + i = pos; + + while(i + t - 1 <= s) { + // ȡS[i, i+m-1] + SubString(&sub, S, i, t); + + // Ӵģʽƥ䣬Ҫƽ + if(StrCompare(sub, T) != 0) { + ++i; + } else { + return i; + } + } + + return 0; //Ҳƥ򷵻0 +} + +/* + * + * + * T뵽Sposλô + */ +Status StrInsert(LString* S, int pos, LString T) { + Chunk* pre, * p; // preָĿǰpָĿ + Chunk* h, * t; // ָĿͷβ + Chunk* r; + Chunk* s; + int i, j, count; + + if(pos < 1 || pos > (*S).curlen + 1) { + return ERROR; + } + + // ĴΪգǰ + if(StrEmpty(T)) { + return OK; + } + + // ¼ʼֹ + h = t = NULL; + + // TеĿ飨ֻƽṹ + for(r = T.head; r != NULL; r = r->next) { + s = (Chunk*) malloc(sizeof(Chunk)); + if(s == NULL) { + exit(OVERFLOW); + } + s->next = NULL; + + if(r == T.head) { + h = t = s; + } else { + t->next = s; + t = s; + } + } + + // SеposԪڵĿ飨עΪĿ飩ָpreָǰ + if(pos >= 1 && pos <= CHUNKSIZE) { + pre = NULL; // ˵posԪڿΪhead + p = (*S).head; + } else { + for(count = 1, pre = (*S).head; count < (pos - 1) / CHUNKSIZE; count++, pre = pre->next) { + // ѭ + } + p = pre->next; + } + + /* + * htΧĿ뵽posڵĿ֮ǰ + */ + + if(pre == NULL) { + t->next = (*S).head; + (*S).head = h; + } else { + pre->next = h; + t->next = p; + } + + if(pre == (*S).tail) { + (*S).tail = t; + } + + /* + * ƶ/Ԫ + */ + + j = 0; + + // 뵽ijġм䡱 + if((pos - 1) % CHUNKSIZE != 0) { + // ƶĿposλ֮ǰԪ + for(i = 1; i <= (pos - 1) % CHUNKSIZE; i++) { + h->ch[j++] = p->ch[i - 1]; + p->ch[i - 1] = '\0'; + } + } + + r = T.head; + i = 0; + + // TеԪصS + for(count = 1; count <= T.curlen; count++) { + h->ch[j] = r->ch[i]; + + j = (j + 1) % CHUNKSIZE; + i = (i + 1) % CHUNKSIZE; + + if(j == 0) { + h = h->next; + } + + if(i == 0) { + r = r->next; + } + } + + // Tһа'\0' + if(T.curlen % CHUNKSIZE != 0) { + r = p; // ָĿ + i = (pos - 1) % CHUNKSIZE; + + // ƶĿposλü֮Ԫ + for(count = pos; count <= (*S).curlen; count++) { + h->ch[j] = r->ch[i]; + r->ch[i] = '\0'; + + j = (j + 1) % CHUNKSIZE; + i = (i + 1) % CHUNKSIZE; + + if(j == 0) { + h = h->next; + } + + if(i == 0) { + r = r->next; + } + } + } + + (*S).curlen += T.curlen; + + return OK; +} + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(LString* S, int pos, int len) { + Chunk* pre; // ָԪS[pos]ڵĿǰ + Chunk* p; // ָԪS[pos]ڵĿ + Chunk* q; // ָԪS[pos+len]ڵĿ + Chunk* r; + int i, j, count, total; + + if(pos < 1 || pos > (*S).curlen || len < 0 || pos + len - 1 > (*S).curlen) { + return ERROR; + } + + // ɾijΪ0ǰ + if(len == 0) { + return OK; + } + + // S[pos]ڵĿ飬ָpreָǰ + if(pos >= 1 && pos <= CHUNKSIZE) { + pre = NULL; // ˵posԪڿΪhead + p = (*S).head; + } else { + for(count = 1, pre = (*S).head; count < (pos - 1) / CHUNKSIZE; count++, pre = pre->next) { + // ѭ + } + p = pre->next; + } + + // S[pos+len]ڵĿ + for(count = (pos - 1) / CHUNKSIZE, q = p; count < (pos + len - 1) / CHUNKSIZE; count++, q = q->next) { + // ѭ + } + + // ҪƶԪظ + total = (*S).curlen - (pos + len) + 1; + + // յijȶ + (*S).curlen -= len; + + i = (pos - 1) % CHUNKSIZE; + j = (pos + len - 1) % CHUNKSIZE; + + if(p != q) { + // ɾpq֮Ŀ + r = p->next; + while(r != q) { + p->next = r->next; + free(r); + r = p->next; + } + + if(q == NULL) { + (*S).tail = p; + } + + // Ҫɾpָ + if((pos - 1) % CHUNKSIZE == 0) { + // pѾָͷ + if(pre == NULL) { + (*S).head = q; + } else { + pre->next = q; + } + + free(p); + p = q; + + if(q == NULL) { + (*S).tail = pre; + } + } + } + + // Ѿλ + if(p == q && i == j) { + return OK; + } + + for(count = 1; count <= total; count++) { + // ƶԪ + p->ch[i] = q->ch[j]; + + i = (i + 1) % CHUNKSIZE; + j = (j + 1) % CHUNKSIZE; + + if(i == 0) { + pre = p; + p = p->next; + } + + if(j == 0) { + q = q->next; + } + } + + // ǡĿ + if(i == 0) { + (*S).tail = pre; + r = p; + } else { + (*S).tail = p; + + // ʣಿǴֵַ + while(i < CHUNKSIZE) { + p->ch[i++] = '\0'; + } + + r = p->next; + } + + // ͷŶĿռ + while(r != NULL) { + (*S).tail->next = r->next; + free(r); + r = (*S).tail->next; + } + + return OK; +} + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(LString S, LString T) { + int i; + Chunk* s = S.head; + Chunk* t = T.head; + + while(s != NULL && t != NULL) { + for(i = 0; i < CHUNKSIZE; i++) { + if(s->ch[i] != t->ch[i]) { + return s->ch[i] - t->ch[i]; + } + } + + s = s->next; + t = t->next; + } + + if(s != NULL) { + return 1; + } else if(t != NULL) { + return -1; + } else { + return 0; + } +} + +/* + * + * + * SƵT + */ +Status StrCopy(LString* T, LString S) { + int i; + Chunk* s, * p; + + for(p = S.head; p; p = p->next) { + s = (Chunk*) malloc(sizeof(Chunk)); + if(s == NULL) { + exit(OVERFLOW); + } + s->next = NULL; + + if(p == S.head) { + (*T).head = (*T).tail = s; + } else { + (*T).tail->next = s; + (*T).tail = s; + } + + for(i = 0; i < CHUNKSIZE; i++) { + (*s).ch[i] = (*p).ch[i]; + } + } + + (*T).curlen = S.curlen; + + return OK; +} + +/* + * 滻 + * + * V滻SгֵTȵҲصӴ + * + *ע + * 1.òСӼ + * 2.ʵֱȽϵЧ + */ +Status Replace(LString* S, LString T, LString V) { + int i; + + if(StrEmpty(*S) || StrEmpty(T)) { + return ERROR; + } + + // SѰģʽTһγֵλ + i = Index(*S, T, 1); + + // ƥַ + while(i != 0) { + StrDelete(S, i, StrLength(T)); // SɾT + StrInsert(S, i, V); // SвV + + i += StrLength(V); // iлһλ + + i = Index(*S, T, i); // һƥַ + } + + return OK; +} + +/* + * + * + * S1S2洢TзءӺijֻδIJ֡ + * ֵʾӺĴǷ + * + *ע + * òСӼ + */ +Status Concat(LString* T, LString S1, LString S2) { + Chunk* p; // S1S2 + Chunk* r; // T + Chunk* s; + int i, j, count; + + // 㳤Ϣ + (*T).curlen = S1.curlen + S2.curlen; + + // Ҫٸ + count = (*T).curlen / CHUNKSIZE + ((*T).curlen % CHUNKSIZE == 0 ? 0 : 1); + + // S1Ľṹ + for(i = 1; i <= count; i++) { + s = (Chunk*) malloc(sizeof(Chunk)); + if(s == NULL) { + exit(OVERFLOW); + } + s->next = NULL; + + if(i == 1) { + (*T).head = (*T).tail = s; + } else { + (*T).tail->next = s; + (*T).tail = s; + } + } + + i = 0; + r = (*T).head; + + // S1е + j = 0; + p = S1.head; + for(count = 0; count < S1.curlen; count++) { + r->ch[i] = p->ch[j]; + + i = (i + 1) % CHUNKSIZE; + j = (j + 1) % CHUNKSIZE; + + if(i == 0) { + r = r->next; + } + + if(j == 0) { + p = p->next; + } + } + + // S2е + j = 0; + p = S2.head; + for(count = 0; count < S2.curlen; count++) { + r->ch[i] = p->ch[j]; + + i = (i + 1) % CHUNKSIZE; + j = (j + 1) % CHUNKSIZE; + + if(i == 0) { + r = r->next; + } + + if(j == 0) { + p = p->next; + } + } + + // ĿռǴֵַ + if(i != 0) { + while(i < CHUNKSIZE) { + r->ch[i] = '\0'; + i++; + } + } + + return OK; +} + +// Ժӡַ +void StrPrint(LString S) { + int i = 0; + Chunk* p = S.head; + + if(S.curlen == 0 || S.head == NULL || S.tail == NULL) { + printf("\n"); + return; + } + + while(p != NULL) { + // Ǵֵʱ + if(p->ch[i] == '\0') { + break; + } + + printf("%c", p->ch[i]); + + i = (i + 1) % CHUNKSIZE; + + if(i == 0) { + p = p->next; + } + } + + printf("\n"); +} diff --git a/VisualC++/ExerciseBook/04.23/LString.h b/VisualC++/ExerciseBook/04.23/LString.h new file mode 100644 index 0000000..e6f19d1 --- /dev/null +++ b/VisualC++/ExerciseBook/04.23/LString.h @@ -0,0 +1,169 @@ +/*============================= + * Ŀ洢ʾ + ==============================*/ + +#ifndef LSTRING_H +#define LSTRING_H + +#include +#include // ṩmallocreallocfreeexitԭ +#include // ṩstrlenԭ +#include "Status.h" //**01 **// + +/* 궨 */ +#define CHUNKSIZE 3 // СԶ壩 + +/* Ŀ洢ṹ */ +typedef struct Chunk { + char ch[CHUNKSIZE]; // ǰе + struct Chunk* next; // ָһ +} Chunk; + +/* Ŀ洢Ͷ */ +typedef struct { + Chunk* head; //ͷָ + Chunk* tail; //βָ + int curlen; //ĵǰ +} LString; + + +/* + * ʾ + * + * ѭ̲ĵдϰߣposָʾַλ()1ʼ + */ + +/* + * ע + * + * 1.̲ʾʹ#ΪǴֵַʹCе\0ΪǴֵַ + * 2.ָ̲һУĩβ÷Ǵֵַġ + * СΪ4Ϊ14ĿΪ£ã -> ţƣǣ -> ɣʣˣ -> ͣ\0\0 + */ + + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(LString* T, const char* chars); + +/* + * + * + * S١ + */ +Status DestroyString(LString* S); + +/* + * + * + * Sա + */ +Status ClearString(LString* S); + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(LString S); + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(LString S); + +/* + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(LString* Sub, LString S, int pos, int len); + +/* + * + * + * posʼģʽTS״γֵλãڣ򷵻0 + * ҳɹƥλá + * + *ע + * 1.ʵҪСӼ + * 2.ʵֱȽϵЧ + */ +int Index(LString S, LString T, int pos); + +/* + * + * + * T뵽Sposλô + */ +Status StrInsert(LString* S, int pos, LString T); + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(LString* S, int pos, int len); + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +Status StrCompare(LString S, LString T); + +/* + * + * + * SƵT + */ +Status StrCopy(LString* T, LString S); + +/* + * 滻 + * + * V滻SгֵTȵҲصӴ + * + *ע + * 1.òСӼ + * 2.ʵֱȽϵЧ + */ +Status Replace(LString* S, LString T, LString V); + +/* + * + * + * S1S2洢TзءӺijֻδIJ֡ + * ֵʾӺĴǷ + * + *ע + * òСӼ + */ +Status Concat(LString* T, LString S1, LString S2); + +// Ժӡַ +void StrPrint(LString S); + +#endif diff --git a/VisualC++/ExerciseBook/04.24-04.26/04.24-04.26.c b/VisualC++/ExerciseBook/04.24-04.26/04.24-04.26.c new file mode 100644 index 0000000..e464ee6 --- /dev/null +++ b/VisualC++/ExerciseBook/04.24-04.26/04.24-04.26.c @@ -0,0 +1,101 @@ +#include +#include "Status.h" //**01 **// +#include "HString.h" //**04 **// + +/* + * ӣConcat + * + *ע + * úHStringļж + */ +Status Algo_4_24(HString* T, HString S1, HString S2); + +/* + * 滻Replace + * + *ע + * úHStringļж + */ +Status Algo_4_25(HString* S, HString T, HString V); + +/* + * 룺StrInsert + * + *ע + * úHStringļж + */ +Status Algo_4_26(HString* S, int pos, HString T); + + +int main(int argc, char* argv[]) { + char* s = "---*^***^*^*^*---"; + char* s1 = "*"; + char* s2 = "^*"; + char* v = "*_*"; + HString S1, S2, T, V, S; + + StrAssign(&S1, s1); + StrAssign(&S2, s2); + StrAssign(&V, v); + StrAssign(&S, s); + + printf("S1 = "); + StrPrint(S1); + printf("S2 = "); + StrPrint(S2); + printf("V = "); + StrPrint(V); + printf("S = "); + StrPrint(S); + + printf(" 4.24 ֤...\n"); + printf("S1S2ΪT...\n"); + Algo_4_24(&T, S1, S2); + printf("T = "); + StrPrint(T); + + printf(" 4.25 ֤...\n"); + printf(" V 滻 S е T...\n"); + Algo_4_25(&S, T, V); + printf("S = "); + StrPrint(S); + + printf(" 4.26 ֤...\n"); + printf(" T 뵽 S ĵ 2 λ...\n"); + Algo_4_26(&S, 2, T); + printf("S = "); + StrPrint(S); + + return 0; +} + + +/* + * ӣConcat + * + *ע + * úHStringļж + */ +Status Algo_4_24(HString* T, HString S1, HString S2) { + return Concat(T, S1, S2); +} + +/* + * 滻Replace + * + *ע + * úHStringļж + */ +Status Algo_4_25(HString* S, HString T, HString V) { + return Replace(S, T, V); +} + +/* + * 룺StrInsert + * + *ע + * úHStringļж + */ +Status Algo_4_26(HString* S, int pos, HString T) { + return StrInsert(S, pos, T); +} diff --git a/VisualC++/ExerciseBook/04.24-04.26/04.24-04.26.vcxproj b/VisualC++/ExerciseBook/04.24-04.26/04.24-04.26.vcxproj new file mode 100644 index 0000000..5377719 --- /dev/null +++ b/VisualC++/ExerciseBook/04.24-04.26/04.24-04.26.vcxproj @@ -0,0 +1,76 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {2F368B7A-8594-45B4-A5EC-91D79E72F614} + My04240426 + + + + Application + true + MultiByte + + + Application + false + true + MultiByte + + + + + + + + + + + + + $(SolutionDir)\..\Status;$(IncludePath) + + + + Level3 + Disabled + + + true + $(SolutionDir)\..\Status\Status.lib;%(AdditionalDependencies) + Console + + + + + Level3 + MaxSpeed + true + true + + + true + true + true + + + + + + + + + + + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/04.24-04.26/04.24-04.26.vcxproj.filters b/VisualC++/ExerciseBook/04.24-04.26/04.24-04.26.vcxproj.filters new file mode 100644 index 0000000..6ffb651 --- /dev/null +++ b/VisualC++/ExerciseBook/04.24-04.26/04.24-04.26.vcxproj.filters @@ -0,0 +1,30 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + 源文件 + + + 源文件 + + + + + 头文件 + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/04.24-04.26/04.24-04.26.vcxproj.user b/VisualC++/ExerciseBook/04.24-04.26/04.24-04.26.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/VisualC++/ExerciseBook/04.24-04.26/04.24-04.26.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/04.24-04.26/HString.c b/VisualC++/ExerciseBook/04.24-04.26/HString.c new file mode 100644 index 0000000..4ed501a --- /dev/null +++ b/VisualC++/ExerciseBook/04.24-04.26/HString.c @@ -0,0 +1,381 @@ +/*========================= + * Ķѷ洢ʾѴ + * + * 㷨: 4.4 + ==========================*/ + +#include "HString.h" //**04 **// + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(HString* T, const char* chars) { + int i, j; + + // charsij + i = (int) strlen(chars); + + // ûЧԪ + if(i == 0) { + (*T).ch = NULL; + (*T).length = 0; + + return OK; + } + + // ЧԪʱҪ洢ռ + (*T).ch = (char*) malloc(i * sizeof(char)); + if(!((*T).ch)) { + exit(OVERFLOW); + } + + for(j = 0; j < i; j++) { + (*T).ch[j] = chars[j]; + } + + (*T).length = i; + + return OK; +} + +/* + * + * + * S١ + * + *ע + * ѴĽṹ٣ٲ + */ +Status DestroyString(HString* S) { + return OK; +} + +/* + * + * + * Sա + */ +Status ClearString(HString* S) { + // ûЧԪʱٶѴṹ + if((*S).ch != 0) { + free((*S).ch); + (*S).ch = NULL; + } + + (*S).length = 0; + + return OK; +} + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(HString S) { + return S.length == 0 ? TRUE : FALSE; +} + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(HString S) { + return S.length; +} + +/* + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(HString* Sub, HString S, int pos, int len) { + int i; + + if(pos < 1 || pos > S.length || len < 0 || pos + len - 1 > S.length) { + return ERROR; + } + + // ǽȡ0ַҪռ + if(len == 0) { + (*Sub).ch = NULL; + (*Sub).length = 0; + + return OK; + } + + (*Sub).ch = (char*) malloc(len * sizeof(char)); + if(!(*Sub).ch) { + exit(OVERFLOW); + } + + // Ԫ + for(i = 0; i < len; i++) { + (*Sub).ch[i] = S.ch[i + pos - 1]; + } + + // ȷ³ + (*Sub).length = len; + + return OK; +} + +/* + * + * + * posʼģʽTS״γֵλãڣ򷵻0 + * ҳɹƥλá + * + *ע + * 1.ʵҪСӼ + * 2.ʵֱȽϵЧ + */ +int Index(HString S, HString T, int pos) { + int i, s, t; + HString sub; + + if(pos < 1 || pos > S.length || StrEmpty(T)) { + return 0; + } + + s = S.length; + t = T.length; + i = pos; + + // ֤ȲԽ + while(i + t - 1 <= s) { + // ȡS[i, i+t-1] + SubString(&sub, S, i, t); + + // Ӵģʽƥ䣬Ҫƽ + if(StrCompare(sub, T) != 0) { + ++i; + } else { + return i; + } + } + + return 0; +} + +/* + * 㷨4.4 + * + * + * + * T뵽Sposλô + */ +Status StrInsert(HString* S, int pos, HString T) { + int i; + + if(pos < 1 || pos > (*S).length + 1) { + return ERROR; + } + + // ĴΪգǰ + if(StrEmpty(T)) { + return OK; + } + + // ¿ռ䣬ὫԪһƹȥ + (*S).ch = (char*) realloc((*S).ch, ((*S).length + T.length) * sizeof(char)); + if(!(*S).ch) { + exit(OVERFLOW); + } + + // SڳλãΪT׼ + for(i = (*S).length - 1; i >= pos - 1; i--) { + // ӺǰǰԪŲ + (*S).ch[i + T.length] = (*S).ch[i]; + } + + // TSڳλ + for(i = pos - 1; i <= pos + T.length - 2; i++) { + (*S).ch[i] = T.ch[i - pos + 1]; + } + + // + (*S).length += T.length; + + return OK; +} + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(HString* S, int pos, int len) { + int i; + + if(pos < 1 || pos + len - 1 > (*S).length || len < 0) { + return ERROR; + } + + // ɾijΪ0ǰ + if(len == 0) { + return OK; + } + + // ѺԪŲǰ棬ǵɾԪ + for(i = pos + len - 1; i <= (*S).length - 1; i++) { + (*S).ch[i - len] = (*S).ch[i]; + } + + // ȼ + (*S).length -= len; + + // Ŀռ䣨ȼΪ0᷵ؿָ룩 + (*S).ch = (char*) realloc((*S).ch, (*S).length * sizeof(char)); + + return OK; +} + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +Status StrCompare(HString S, HString T) { + int i; + + for(i = 0; i < S.length && i < T.length; i++) { + // ַͬʱȽС + if(S.ch[i] != T.ch[i]) { + return S.ch[i] - T.ch[i]; + } + } + + return S.length - T.length; +} + +/* + * + * + * SƵT + */ +Status StrCopy(HString* T, HString S) { + int i; + + if(StrEmpty(S)) { + (*T).ch = NULL; + (*T).length = 0; + } else { + // ռ + (*T).ch = (char*) malloc(S.length * sizeof(char)); + if(!(*T).ch) { + exit(OVERFLOW); + } + + // Ԫ + for(i = 0; i < S.length; i++) { + (*T).ch[i] = S.ch[i]; + } + + // ƳϢ + (*T).length = S.length; + } + + return OK; +} + +/* + * 滻 + * + * V滻SгֵTȵҲصӴ + * + *ע + * 1.òСӼ + * 2.ʵֱȽϵЧ + */ +Status Replace(HString* S, HString T, HString V) { + int i; + + if(StrEmpty(*S) || StrEmpty(T)) { + return ERROR; + } + + // SѰģʽTһγֵλ + i = Index(*S, T, 1); + + // ƥַ + while(i != 0) { + StrDelete(S, i, StrLength(T)); // SɾT + StrInsert(S, i, V); // SвV + + i += StrLength(V); // iлһλ + + i = Index(*S, T, i); // һƥַ + } + + return OK; +} + +/* + * + * + * S1S2洢TзءӺijֻδIJ֡ + * ֵʾӺĴǷ + * ѴĿռ䱻Ϊ޵ģǷTRUEָʾᱻü + * + *ע + * òСӼ + */ +Status Concat(HString* T, HString S1, HString S2) { + int i; + + // ȷ³ + (*T).length = S1.length + S2.length; + + // ռ + (*T).ch = (char*) malloc((*T).length * sizeof(char)); + if(!(*T).ch) { + exit(OVERFLOW); + } + + // ȰS1ݿ + for(i = 0; i < S1.length; i++) { + (*T).ch[i] = S1.ch[i]; + } + + // ٿS2 + for(i = 0; i < S2.length; i++) { + (*T).ch[S1.length + i] = S2.ch[i]; + } + + return TRUE; +} + +// ӡַ +void StrPrint(HString S) { + int i; + + if(S.length == 0) { + return; + } + + for(i = 0; i < S.length; i++) { + printf("%c", S.ch[i]); + } + printf("\n"); +} \ No newline at end of file diff --git a/VisualC++/ExerciseBook/04.24-04.26/HString.h b/VisualC++/ExerciseBook/04.24-04.26/HString.h new file mode 100644 index 0000000..3d13eaf --- /dev/null +++ b/VisualC++/ExerciseBook/04.24-04.26/HString.h @@ -0,0 +1,159 @@ +/*========================= + * Ķѷ洢ʾѴ + * + * 㷨: 4.4 + ==========================*/ + +#ifndef HSTRING +#define HSTRING + +#include +#include // ṩmallocreallocfreeexitԭ +#include // ṩstrlenԭ +#include "Status.h" //**01 **// + +/* + * ĶѴ洢ʾ + * + * עЧԪشch0ŵԪʼ洢 + */ +typedef struct { + char* ch; // Ƿǿմ򰴴洢chΪNULL + int length; +} HString; + + +/* + * ʾ + * + * ѭ̲ĵдϰߣposָʾַλ()1ʼ + */ + + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(HString* T, const char* chars); + +/* + * + * + * S١ + */ +Status DestroyString(HString* S); + +/* + * + * + * Sա + */ +Status ClearString(HString* S); + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(HString S); + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(HString S); + +/* + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(HString* Sub, HString S, int pos, int len); + +/* + * + * + * posʼģʽTS״γֵλãڣ򷵻0 + * ҳɹƥλá + * + *ע + * 1.ʵҪСӼ + * 2.ʵֱȽϵЧ + */ +int Index(HString S, HString T, int pos); + +/* + * 㷨4.4 + * + * + * + * T뵽Sposλô + */ +Status StrInsert(HString* S, int pos, HString T); + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(HString* S, int pos, int len); + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +Status StrCompare(HString S, HString T); + +/* + * + * + * SƵT + */ +Status StrCopy(HString* T, HString S); + +/* + * 滻 + * + * V滻SгֵTȵҲصӴ + * + *ע + * 1.òСӼ + * 2.ʵֱȽϵЧ + */ +Status Replace(HString* S, HString T, HString V); + +/* + * + * + * S1S2洢TзءӺijֻδIJ֡ + * ֵʾӺĴǷ + * + *ע + * òСӼ + */ +Status Concat(HString* T, HString S1, HString S2); + +// ӡַ +void StrPrint(HString S); + +#endif diff --git a/VisualC++/ExerciseBook/04.27/04.27.c b/VisualC++/ExerciseBook/04.27/04.27.c new file mode 100644 index 0000000..89fb62d --- /dev/null +++ b/VisualC++/ExerciseBook/04.27/04.27.c @@ -0,0 +1,81 @@ +#include +#include "SString.h" //**04 **// + +/* ԭ */ +int Algo_4_27(SString S, SString T, int pos); + + +/* + * ңIndex + * + * posʼģʽTS״γֵλãڣ򷵻0 + * ҳɹƥλá + * + *ע + * 봫ͳIndexĽ֮ڻȱȽ׸ַĩβַ + * ǶƥʱŻȽʣµַ + */ +int main(int argc, char* argv[]) { + char* s = "aaaaaaaaaaaaaaab"; + char* t = "aaaab"; + SString S, T; + + StrAssign(S, s); + StrAssign(T, t); + printf("S = "); + StrPrint(S); + printf("T = "); + StrPrint(T); + + printf("TS״γֵλΪ"); + printf("%d\n", Algo_4_27(S, T, 1)); + + return 0; +} + + +/* + * ңIndex + * + * posʼģʽTS״γֵλãڣ򷵻0 + * ҳɹƥλá + * + *ע + * 봫ͳIndexĽ֮ڻȱȽ׸ַĩβַ + * ǶƥʱŻȽʣµַ + */ +int Algo_4_27(SString S, SString T, int pos) { + int i, j; + + if(pos < 1 || pos > S[0] || T[0] == 0) { + return 0; + } + + i = pos; + j = 1; + + while(i <= S[0] - T[0] + 1) { + // ȳԱȽ׸ַĩβַ + if(S[i] != T[j] || S[i + T[0] - 1] != T[T[0]]) { + i++; + continue; + } + + // jҪT[0]ΪT[0]Ѿ֤ + for(i++,j++; j + + + + Debug + Win32 + + + Release + Win32 + + + + {00CECE39-4250-4727-B210-4B306167F129} + My0427 + + + + Application + true + MultiByte + + + Application + false + true + MultiByte + + + + + + + + + + + + + $(SolutionDir)\..\Status;$(IncludePath) + + + + Level3 + Disabled + + + true + $(SolutionDir)\..\Status\Status.lib;%(AdditionalDependencies) + Console + + + + + Level3 + MaxSpeed + true + true + + + true + true + true + + + + + + + + + + + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/04.27/04.27.vcxproj.filters b/VisualC++/ExerciseBook/04.27/04.27.vcxproj.filters new file mode 100644 index 0000000..3bba698 --- /dev/null +++ b/VisualC++/ExerciseBook/04.27/04.27.vcxproj.filters @@ -0,0 +1,30 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + 源文件 + + + 源文件 + + + + + 头文件 + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/04.27/04.27.vcxproj.user b/VisualC++/ExerciseBook/04.27/04.27.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/VisualC++/ExerciseBook/04.27/04.27.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/04.27/SString.c b/VisualC++/ExerciseBook/04.27/SString.c new file mode 100644 index 0000000..fc4c757 --- /dev/null +++ b/VisualC++/ExerciseBook/04.27/SString.c @@ -0,0 +1,406 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#include "SString.h" //**04 **// + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars) { + int i, len; + + len = (int) strlen(chars); + + // chars + if(len > MAXSTRLEN) { + return ERROR; + } + + T[0] = len; + for(i = 1; i <= len; i++) { + T[i] = chars[i - 1]; + } + + return OK; +} + +/* + * + * + * S١ + * + *ע + * ˳򴮵Ľṹ޷ + */ +Status DestroyString(SString S) { + return OK; +} + +/* + * + * + * Sա + */ +Status ClearString(SString S) { + // ֻҪΪ0Ϳ + S[0] = 0; + return OK; +} + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S) { + return S[0] == 0 ? TRUE : FALSE; +} + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S) { + return S[0]; +} + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len) { + int i; + + if(pos < 1 || pos > S[0] || len < 0 || pos + len - 1 > S[0]) { + return ERROR; + } + + // Ԫ + for(i = 1; i <= len; i++) { + Sub[i] = S[pos + i - 1]; + } + + // ȷ³ + Sub[0] = len; + + return OK; +} + +/* + * 㷨4.1 + * + * + * + * posʼģʽTS״γֵλãڣ򷵻0 + * ҳɹƥλá + * + *ע + * 1.ʵҪСӼ + * 2.ʵֱȽϵЧ + */ +int Index_1(SString S, SString T, int pos) { + int i, n, m; // ¼STij + SString sub; + + /* + * ʧǰ + * ̲д΢ͬ + */ + if(pos < 1 || pos > S[0] || StrEmpty(T)) { + return 0; + } + + n = StrLength(S); + m = StrLength(T); + i = pos; + + // ֤ȲԽ + while(i <= n - m + 1) { + // ȡS[i, i+m-1] + SubString(sub, S, i, m); + + // Ӵģʽƥ䣬Ҫƽ + if(StrCompare(sub, T) != 0) { + ++i; + } else { + return i; + } + } + + return 0; +} + +/* + * 㷨4.5 + * + * + * + * posʼģʽTS״γֵλãڣ򷵻0 + * ҳɹƥλá + * + *ע + * 1.ʵֲСӼ + * 2.ʵֱȽϵЧ + */ +int Index_2(SString S, SString T, int pos) { + int i = pos; + int j = 1; + + if(pos < 1 || pos > S[0] || StrEmpty(T)) { + return 0; + } + + while(i <= S[0] && j <= T[0]) { + // ַͬȽϺַ + if(S[i] == T[j]) { + i++; + j++; + + // ַͬαҪˣ±Ƚ + } else { + i = i - (j - 1) + 1; // j-1ͽ͵ǰj-1ԪأڵjԪϹһ + j = 1; // αjصTĵһλ + } + } + + // һT[0]>0ж + if(j > T[0] && T[0] > 0) { // TΪմ + return i - T[0]; // ƥɹ + } else { + return 0; + } +} + +/* + * + * + * T뵽Sposλô + */ +Status StrInsert(SString S, int pos, SString T) { + int i; + + if(pos < 1 || pos > S[0] + 1 || S[0] + T[0] > MAXSTRLEN) { + return ERROR; + } + + // ĴΪգǰ + if(StrEmpty(T)) { + return OK; + } + + // SڳλãΪT׼ + for(i = S[0]; i >= pos; i--) { + // ӺǰǰԪŲ + S[i + T[0]] = S[i]; + } + + // TSڳλ + for(i = pos; i <= pos + T[0] - 1; i++) { + S[i] = T[i - pos + 1]; + } + + // + S[0] += T[0]; + + return OK; +} + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len) { + int i; + + if(pos < 1 || pos + len - 1 > S[0] || len < 0) { + return ERROR; + } + + // ɾijΪ0ǰ + if(len == 0) { + return OK; + } + + // ѺԪŲǰ棬ǵɾԪ + for(i = pos + len; i <= S[0]; i++) { + S[i - len] = S[i]; + } + + // ȼ + S[0] -= len; + + return OK; +} + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T) { + int i = 1; + + while(i <= S[0] && i <= T[0]) { + // ַͬʱȽС + if(S[i] != T[i]) { + return S[i] - T[i]; + } + + i++; + } + + return S[0] - T[0]; +} + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S) { + int i; + + // ͬϢһ + for(i = 0; i <= S[0]; i++) { + T[i] = S[i]; + } + + return OK; +} + +/* + * 滻 + * + * V滻SгֵTȵҲصӴ + * + *ע + * 1.òСӼ + * 2.ʵֱȽϵЧ + */ +Status Replace(SString S, SString T, SString V) { + int i; + + if(StrEmpty(S) || StrEmpty(T)) { + return ERROR; + } + + // SѰģʽTһγֵλ + i = Index_2(S, T, 1); + + // ƥַҿԱȫ滻滻 + while(i != 0 && S[0] - T[0] + V[0] <= MAXSTRLEN) { + StrDelete(S, i, StrLength(T)); // SɾT + StrInsert(S, i, V); // SвV + + i += StrLength(V); // iлһλ + + i = Index_2(S, T, i); // һƥַ + } + + if(i == 0) { // SеTȫ滻 + return OK; + } else { // STVѾ岻ȥ + return ERROR; + } +} + +/* + * 㷨4.2 + * + * + * + * S1S2洢TзءӺijֻδIJ֡ + * ֵʾӺĴǷ + * + *ע + * òСӼ + */ +Status Concat(SString T, SString S1, SString S2) { + int i; + int uncut; // ´Ƿ + + // ȫҪü + if(S1[0] + S2[0] <= MAXSTRLEN) { + // S1T + for(i = 1; i <= S1[0]; i++) { + T[i] = S1[i]; + } + + // S2T + for(i = S1[0] + 1; i <= S1[0] + S2[0]; i++) { + T[i] = S2[i - S1[0]]; + } + + // ³ + T[0] = S1[0] + S2[0]; + + // δü + uncut = TRUE; + + // ҪüS2 + } else if(S1[0] <= MAXSTRLEN) { + // S1T + for(i = 1; i <= S1[0]; i++) { + T[i] = S1[i]; + } + + // S2һָƵT + for(i = S1[0] + 1; i <= MAXSTRLEN; i++) { + T[i] = S2[i - S1[0]]; + } + + // ³ + T[0] = MAXSTRLEN; + + uncut = FALSE; + + // ֻҪS1һ + } else { + // ͬϢһ + for(i = 0; i <= MAXSTRLEN; i++) { + T[i] = S1[i]; + } + + uncut = FALSE; + } + + return uncut; +} + +// ӡַ +void StrPrint(SString S) { + int i; + + for(i = 1; i<=S[0] ; i++) { + printf("%c", S[i]); + } + + printf("\n"); +} diff --git a/VisualC++/ExerciseBook/04.27/SString.h b/VisualC++/ExerciseBook/04.27/SString.h new file mode 100644 index 0000000..386ffb8 --- /dev/null +++ b/VisualC++/ExerciseBook/04.27/SString.h @@ -0,0 +1,179 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#ifndef SSTRING_H +#define SSTRING_H + +#include +#include // ṩstrlenԭ +#include "Status.h" //**01 **// + +/* 궨 */ +#define MAXSTRLEN 255 // ˳򴮵󴮳 + +/* + * ˳洢Ͷ + * + * עЧԪشSString1ŵԪʼ洢 + * SString0ŵԪ洢䳤 + */ +typedef unsigned char SString[MAXSTRLEN + 1]; // 0ŵԪŴij + + +/* + * ʾ + * + * ѭ̲ĵдϰߣposָʾַλ()1ʼ + */ + + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars); + +/* + * + * + * S١ + * + *ע + * ˳򴮵Ľṹ޷ + */ +Status DestroyString(SString S); + +/* + * + * + * Sա + */ +Status ClearString(SString S); + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S); + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S); + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len); + +/* + * 㷨4.1 + * + * + * + * posʼģʽTS״γֵλãڣ򷵻0 + * ҳɹƥλá + * + *ע + * 1.ʵҪСӼ + * 2.ʵֱȽϵЧ + */ +int Index_1(SString S, SString T, int pos); + +/* + * 㷨4.5 + * + * + * + * posʼģʽTS״γֵλãڣ򷵻0 + * ҳɹƥλá + * + *ע + * 1.ʵֲСӼ + * 2.ʵֱȽϵЧ + */ +int Index_2(SString S, SString T, int pos); + +/* + * + * + * T뵽Sposλô + */ +Status StrInsert(SString S, int pos, SString T); + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len); + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T); + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S); + +/* + * 滻 + * + * V滻SгֵTȵҲصӴ + * + *ע + * òСӼЧʽϵ͡ + */ +Status Replace(SString S, SString T, SString V); + +/* + * 㷨4.2 + * + * + * + * S1S2洢TзءӺijֻδIJ֡ + * ֵʾӺĴǷ + * + *ע + * òСӼ + */ +Status Concat(SString T, SString S1, SString S2); + +// ӡַ +void StrPrint(SString S); + +#endif diff --git a/VisualC++/ExerciseBook/04.28-04.29/04.28-04.29.c b/VisualC++/ExerciseBook/04.28-04.29/04.28-04.29.c new file mode 100644 index 0000000..adca0c4 --- /dev/null +++ b/VisualC++/ExerciseBook/04.28-04.29/04.28-04.29.c @@ -0,0 +1,211 @@ +#include +#include +#include +#include "Status.h" //**01 **// + +/* + * ԪͶ + * + *ע + * ȻַԪȻintԭǣ + * 1.Ҫͷ洢intֱchar + * 2.charintݣԽȻintҲ洢char + */ +typedef int ElemType; + +/* ַ */ +typedef struct SNode { + ElemType chdata; // ݽ + struct SNode* succ; // ָ̽ + struct SNode* next; // nextУָǰ㣬ģʽУָý㴦ʧʱӦȽϵһ +} SNode; + +// ַ +typedef SNode* String; + + +// ʼ +Status StrAssign_4_28(String* S, char* chars); + +// 󴮳 +int StrLength_4_28(String S); + +// ַ +void StrPrint_4_28(String S); + +/* + * ģʽnextֵĽ㷨 + * + * ൱KMP㷨µget_nextval + */ +Status Algo_4_28(String T); + +/* + * KMP㷨 + * + * ൱KMP㷨µIndex_KMP + */ +int Algo_4_29(String S, String T, int pos); + + +int main(int argc, char* argv[]) { + char* s = "abaaabaababaabcaabaabcacabaabcaabaabcac"; + char* t = "abaabcac"; + String S, T; + int pos, i; + + StrAssign_4_28(&S, s); // + StrAssign_4_28(&T, t); //ģʽ + + printf("S = "); + StrPrint_4_28(S); + printf("ģʽT = "); + StrPrint_4_28(T); + + printf(" 4.28 ֤...\n"); + Algo_4_28(T); + printf("next...\n"); + + printf(" 4.29 ֤...\n"); + pos = 18; + i = Algo_4_29(S, T, pos); + printf("ģʽ T S ĵ %d ַһƥɹλΪ %d\n", pos, i); + + return 0; +} + + +// ʼ +Status StrAssign_4_28(String* S, char* chars) { + int i, len; + String p; + + if(S == NULL || chars == NULL) { + return ERROR; + } + + len = (int) strlen(chars); + + // ͷ + *S = (String) malloc(sizeof(SNode)); + (*S)->chdata = len; // ¼ij + (*S)->next = NULL; // ͷǰ + + p = *S; + + for(i = 0; i < len; i++) { + p->succ = (String) malloc(sizeof(SNode)); + p->succ->chdata = chars[i]; + p->succ->next = p; // nextĬָǰһ + p = p->succ; + } + + // һĺΪNULL + p->succ = NULL; + + return OK; +} + +// 󴮳 +int StrLength_4_28(String S) { + return S == NULL ? 0 : S->chdata; +} + +// ַ +void StrPrint_4_28(String S) { + String p; + + if(S == NULL) { + printf("\n"); + return; + } + + for(p = S->succ; p != NULL; p = p->succ) { + printf("%c", p->chdata); + } + + printf("\n"); +} + +/* + * ģʽnextֵĽ㷨 + * + * ൱KMP㷨µget_nextval + */ +Status Algo_4_28(String T) { + SNode* i, * j; + + if(StrLength_4_28(T) == 0) { + return ERROR; + } + + i = T->succ; // ൱֮ǰi=1 + j = T; // ൱֮ǰj=0 + + // ģʽһַʧʱģʽҪͷȽϣҪǰһλñȽ + i->next = T; + + // ģʽϵַ + while(i->succ != NULL) { + if(j == T || i->chdata == j->chdata) { + i = i->succ; + j = j->succ; + + if(i->chdata != j->chdata) { + i->next = j; + } else { + i->next = j->next; + } + } else { + j = j->next; + } + } + + return OK; +} + +/* + * KMP㷨 + * + * ൱KMP㷨µIndex_KMP + */ +int Algo_4_29(String S, String T, int pos) { + int count; // ¼iλ + SNode* i, * j; // iSjT + + if(pos < 1 || StrLength_4_28(S) == 0 || StrLength_4_28(T) == 0) { + return 0; + } + + for(count = 1, i = S->succ; count < pos; count++, i = i->succ) { + // iָpos + } + + j = T->succ; + + // Ƚַ + while(i != NULL && j != NULL) { + /* + * Σ + * 1.ģʽĵһַʧ + * 2.ģʽַ + */ + if(j == T || i->chdata == j->chdata) { + i = i->succ; + j = j->succ; + + count++; // ¼iλ + } else { + // ʧʱصǰһʵλ + j = j->next; + } + } + + // ƥɹƥλ + if(j == NULL) { + return count-StrLength_4_28(T); + } else { + // ƥʧ + return 0; + } +} diff --git a/VisualC++/ExerciseBook/04.28-04.29/04.28-04.29.vcxproj b/VisualC++/ExerciseBook/04.28-04.29/04.28-04.29.vcxproj new file mode 100644 index 0000000..ca92418 --- /dev/null +++ b/VisualC++/ExerciseBook/04.28-04.29/04.28-04.29.vcxproj @@ -0,0 +1,72 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {785893C0-9DEF-49B4-9A5F-9A6B784A089E} + My04280429 + + + + Application + true + MultiByte + + + Application + false + true + MultiByte + + + + + + + + + + + + + $(SolutionDir)\..\Status;$(IncludePath) + + + + Level3 + Disabled + + + true + $(SolutionDir)\..\Status\Status.lib;%(AdditionalDependencies) + Console + + + + + Level3 + MaxSpeed + true + true + + + true + true + true + + + + + + + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/04.28-04.29/04.28-04.29.vcxproj.filters b/VisualC++/ExerciseBook/04.28-04.29/04.28-04.29.vcxproj.filters new file mode 100644 index 0000000..3ee7cea --- /dev/null +++ b/VisualC++/ExerciseBook/04.28-04.29/04.28-04.29.vcxproj.filters @@ -0,0 +1,22 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + 源文件 + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/04.28-04.29/04.28-04.29.vcxproj.user b/VisualC++/ExerciseBook/04.28-04.29/04.28-04.29.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/VisualC++/ExerciseBook/04.28-04.29/04.28-04.29.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/04.30/04.30.c b/VisualC++/ExerciseBook/04.30/04.30.c new file mode 100644 index 0000000..eb772c7 --- /dev/null +++ b/VisualC++/ExerciseBook/04.30/04.30.c @@ -0,0 +1,116 @@ +#include +#include "SString.h" //**04 **// + +/* + * ڴSв״γֵظӴλ + * Sub¼ظӴ + * pos¼Sгֵλ + * + * ˴ظӴº壺 + * 1.Ӵ + * 2.ӴظӴ׸ģ + * 3.ӴصȡabcabcaĽΪabca + * 4.ӴڿظȡaaaaĽΪaaa + */ +Status Algo_4_30(SString S, SString Sub, int* pos); + + +int main(int argc, char* argv[]) { + char* s = "abcdeabcabcbcdefbcdefefghefgh"; + SString Sub, S; + int pos; + + StrAssign(S, s); + printf("...\n"); + printf("S = "); + StrPrint(S); + + printf("׸ظӴ...\n"); + printf("Sub = "); + Algo_4_30(S, Sub, &pos); + StrPrint(Sub); + printf("Sub S ״γֵλΪ %d\n", pos); + + return 0; +} + + +/* + * ڴSв״γֵظӴλ + * Sub¼ظӴ + * pos¼Sгֵλ + * + * ˴ظӴº壺 + * 1.Ӵ + * 2.ӴظӴ׸ģ + * 3.ӴصȡabcabcaĽΪabca + * 4.ӴڿظȡaaaaĽΪaaa + */ +Status Algo_4_30(SString S, SString Sub, int* pos) { + int i, j, is, js; + int k, start; + int len, maxLen; + + // Ȳ2 + if(S[0] < 2) { + return ERROR; + } + + start = 0; + maxLen = 0; + + // пܵ + for(k = 1; k < S[0]; k++) { + is = k; // + js = k + 1; // Ӵ + + // ʣַ֪ظַٱȥ + if(S[0] - js + 1 <= maxLen) { + break; + } + + // isΪĴظĴ + while(TRUE) { + // ѰDZڵظӴ + while(js <= S[0] && S[is] != S[js]) { + js++; + } + + // ˵㴦ַΨһ + if(js > S[0]) { + break; + } + + // ʣַ֪ظַٱȥ + if(S[0] - js + 1 <= maxLen) { + break; + } + + len = 0; + i = is; + j = js; + + // ظij + while(j <= S[0] && S[i] == S[j]) { + i++; + j++; + len++; + } + + if(len > maxLen) { + start = k; + maxLen = len; + } + + // 鿴ûиظ + if(j < S[0]) { + js++; + } + } + } + + *pos = start; + SubString(Sub, S, start, maxLen); + + return OK; +} diff --git a/VisualC++/ExerciseBook/04.30/04.30.vcxproj b/VisualC++/ExerciseBook/04.30/04.30.vcxproj new file mode 100644 index 0000000..c53768a --- /dev/null +++ b/VisualC++/ExerciseBook/04.30/04.30.vcxproj @@ -0,0 +1,76 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {9374E1C4-6DD6-4BB8-9DC0-5CA8E86FEA10} + My0430 + + + + Application + true + MultiByte + + + Application + false + true + MultiByte + + + + + + + + + + + + + $(SolutionDir)\..\Status;$(IncludePath) + + + + Level3 + Disabled + + + true + $(SolutionDir)\..\Status\Status.lib;%(AdditionalDependencies) + Console + + + + + Level3 + MaxSpeed + true + true + + + true + true + true + + + + + + + + + + + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/04.30/04.30.vcxproj.filters b/VisualC++/ExerciseBook/04.30/04.30.vcxproj.filters new file mode 100644 index 0000000..29f8f06 --- /dev/null +++ b/VisualC++/ExerciseBook/04.30/04.30.vcxproj.filters @@ -0,0 +1,30 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + 源文件 + + + 源文件 + + + + + 头文件 + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/04.30/04.30.vcxproj.user b/VisualC++/ExerciseBook/04.30/04.30.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/VisualC++/ExerciseBook/04.30/04.30.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/04.30/SString.c b/VisualC++/ExerciseBook/04.30/SString.c new file mode 100644 index 0000000..fc4c757 --- /dev/null +++ b/VisualC++/ExerciseBook/04.30/SString.c @@ -0,0 +1,406 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#include "SString.h" //**04 **// + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars) { + int i, len; + + len = (int) strlen(chars); + + // chars + if(len > MAXSTRLEN) { + return ERROR; + } + + T[0] = len; + for(i = 1; i <= len; i++) { + T[i] = chars[i - 1]; + } + + return OK; +} + +/* + * + * + * S١ + * + *ע + * ˳򴮵Ľṹ޷ + */ +Status DestroyString(SString S) { + return OK; +} + +/* + * + * + * Sա + */ +Status ClearString(SString S) { + // ֻҪΪ0Ϳ + S[0] = 0; + return OK; +} + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S) { + return S[0] == 0 ? TRUE : FALSE; +} + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S) { + return S[0]; +} + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len) { + int i; + + if(pos < 1 || pos > S[0] || len < 0 || pos + len - 1 > S[0]) { + return ERROR; + } + + // Ԫ + for(i = 1; i <= len; i++) { + Sub[i] = S[pos + i - 1]; + } + + // ȷ³ + Sub[0] = len; + + return OK; +} + +/* + * 㷨4.1 + * + * + * + * posʼģʽTS״γֵλãڣ򷵻0 + * ҳɹƥλá + * + *ע + * 1.ʵҪСӼ + * 2.ʵֱȽϵЧ + */ +int Index_1(SString S, SString T, int pos) { + int i, n, m; // ¼STij + SString sub; + + /* + * ʧǰ + * ̲д΢ͬ + */ + if(pos < 1 || pos > S[0] || StrEmpty(T)) { + return 0; + } + + n = StrLength(S); + m = StrLength(T); + i = pos; + + // ֤ȲԽ + while(i <= n - m + 1) { + // ȡS[i, i+m-1] + SubString(sub, S, i, m); + + // Ӵģʽƥ䣬Ҫƽ + if(StrCompare(sub, T) != 0) { + ++i; + } else { + return i; + } + } + + return 0; +} + +/* + * 㷨4.5 + * + * + * + * posʼģʽTS״γֵλãڣ򷵻0 + * ҳɹƥλá + * + *ע + * 1.ʵֲСӼ + * 2.ʵֱȽϵЧ + */ +int Index_2(SString S, SString T, int pos) { + int i = pos; + int j = 1; + + if(pos < 1 || pos > S[0] || StrEmpty(T)) { + return 0; + } + + while(i <= S[0] && j <= T[0]) { + // ַͬȽϺַ + if(S[i] == T[j]) { + i++; + j++; + + // ַͬαҪˣ±Ƚ + } else { + i = i - (j - 1) + 1; // j-1ͽ͵ǰj-1ԪأڵjԪϹһ + j = 1; // αjصTĵһλ + } + } + + // һT[0]>0ж + if(j > T[0] && T[0] > 0) { // TΪմ + return i - T[0]; // ƥɹ + } else { + return 0; + } +} + +/* + * + * + * T뵽Sposλô + */ +Status StrInsert(SString S, int pos, SString T) { + int i; + + if(pos < 1 || pos > S[0] + 1 || S[0] + T[0] > MAXSTRLEN) { + return ERROR; + } + + // ĴΪգǰ + if(StrEmpty(T)) { + return OK; + } + + // SڳλãΪT׼ + for(i = S[0]; i >= pos; i--) { + // ӺǰǰԪŲ + S[i + T[0]] = S[i]; + } + + // TSڳλ + for(i = pos; i <= pos + T[0] - 1; i++) { + S[i] = T[i - pos + 1]; + } + + // + S[0] += T[0]; + + return OK; +} + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len) { + int i; + + if(pos < 1 || pos + len - 1 > S[0] || len < 0) { + return ERROR; + } + + // ɾijΪ0ǰ + if(len == 0) { + return OK; + } + + // ѺԪŲǰ棬ǵɾԪ + for(i = pos + len; i <= S[0]; i++) { + S[i - len] = S[i]; + } + + // ȼ + S[0] -= len; + + return OK; +} + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T) { + int i = 1; + + while(i <= S[0] && i <= T[0]) { + // ַͬʱȽС + if(S[i] != T[i]) { + return S[i] - T[i]; + } + + i++; + } + + return S[0] - T[0]; +} + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S) { + int i; + + // ͬϢһ + for(i = 0; i <= S[0]; i++) { + T[i] = S[i]; + } + + return OK; +} + +/* + * 滻 + * + * V滻SгֵTȵҲصӴ + * + *ע + * 1.òСӼ + * 2.ʵֱȽϵЧ + */ +Status Replace(SString S, SString T, SString V) { + int i; + + if(StrEmpty(S) || StrEmpty(T)) { + return ERROR; + } + + // SѰģʽTһγֵλ + i = Index_2(S, T, 1); + + // ƥַҿԱȫ滻滻 + while(i != 0 && S[0] - T[0] + V[0] <= MAXSTRLEN) { + StrDelete(S, i, StrLength(T)); // SɾT + StrInsert(S, i, V); // SвV + + i += StrLength(V); // iлһλ + + i = Index_2(S, T, i); // һƥַ + } + + if(i == 0) { // SеTȫ滻 + return OK; + } else { // STVѾ岻ȥ + return ERROR; + } +} + +/* + * 㷨4.2 + * + * + * + * S1S2洢TзءӺijֻδIJ֡ + * ֵʾӺĴǷ + * + *ע + * òСӼ + */ +Status Concat(SString T, SString S1, SString S2) { + int i; + int uncut; // ´Ƿ + + // ȫҪü + if(S1[0] + S2[0] <= MAXSTRLEN) { + // S1T + for(i = 1; i <= S1[0]; i++) { + T[i] = S1[i]; + } + + // S2T + for(i = S1[0] + 1; i <= S1[0] + S2[0]; i++) { + T[i] = S2[i - S1[0]]; + } + + // ³ + T[0] = S1[0] + S2[0]; + + // δü + uncut = TRUE; + + // ҪüS2 + } else if(S1[0] <= MAXSTRLEN) { + // S1T + for(i = 1; i <= S1[0]; i++) { + T[i] = S1[i]; + } + + // S2һָƵT + for(i = S1[0] + 1; i <= MAXSTRLEN; i++) { + T[i] = S2[i - S1[0]]; + } + + // ³ + T[0] = MAXSTRLEN; + + uncut = FALSE; + + // ֻҪS1һ + } else { + // ͬϢһ + for(i = 0; i <= MAXSTRLEN; i++) { + T[i] = S1[i]; + } + + uncut = FALSE; + } + + return uncut; +} + +// ӡַ +void StrPrint(SString S) { + int i; + + for(i = 1; i<=S[0] ; i++) { + printf("%c", S[i]); + } + + printf("\n"); +} diff --git a/VisualC++/ExerciseBook/04.30/SString.h b/VisualC++/ExerciseBook/04.30/SString.h new file mode 100644 index 0000000..386ffb8 --- /dev/null +++ b/VisualC++/ExerciseBook/04.30/SString.h @@ -0,0 +1,179 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#ifndef SSTRING_H +#define SSTRING_H + +#include +#include // ṩstrlenԭ +#include "Status.h" //**01 **// + +/* 궨 */ +#define MAXSTRLEN 255 // ˳򴮵󴮳 + +/* + * ˳洢Ͷ + * + * עЧԪشSString1ŵԪʼ洢 + * SString0ŵԪ洢䳤 + */ +typedef unsigned char SString[MAXSTRLEN + 1]; // 0ŵԪŴij + + +/* + * ʾ + * + * ѭ̲ĵдϰߣposָʾַλ()1ʼ + */ + + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars); + +/* + * + * + * S١ + * + *ע + * ˳򴮵Ľṹ޷ + */ +Status DestroyString(SString S); + +/* + * + * + * Sա + */ +Status ClearString(SString S); + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S); + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S); + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len); + +/* + * 㷨4.1 + * + * + * + * posʼģʽTS״γֵλãڣ򷵻0 + * ҳɹƥλá + * + *ע + * 1.ʵҪСӼ + * 2.ʵֱȽϵЧ + */ +int Index_1(SString S, SString T, int pos); + +/* + * 㷨4.5 + * + * + * + * posʼģʽTS״γֵλãڣ򷵻0 + * ҳɹƥλá + * + *ע + * 1.ʵֲСӼ + * 2.ʵֱȽϵЧ + */ +int Index_2(SString S, SString T, int pos); + +/* + * + * + * T뵽Sposλô + */ +Status StrInsert(SString S, int pos, SString T); + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len); + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T); + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S); + +/* + * 滻 + * + * V滻SгֵTȵҲصӴ + * + *ע + * òСӼЧʽϵ͡ + */ +Status Replace(SString S, SString T, SString V); + +/* + * 㷨4.2 + * + * + * + * S1S2洢TзءӺijֻδIJ֡ + * ֵʾӺĴǷ + * + *ע + * òСӼ + */ +Status Concat(SString T, SString S1, SString S2); + +// ӡַ +void StrPrint(SString S); + +#endif diff --git a/VisualC++/ExerciseBook/04.31/04.31.c b/VisualC++/ExerciseBook/04.31/04.31.c new file mode 100644 index 0000000..91ede0d --- /dev/null +++ b/VisualC++/ExerciseBook/04.31/04.31.c @@ -0,0 +1,248 @@ +#include +#include +#include "Status.h" //**01 **// +#include "SString.h" //**04 **// + +/* + * ʾ + * + * һ̬滮⣬ϸ˼·μ㷨ۡ15.4ڡ + * + * ע㷨ۡе""ͳƲӴDZֻͳӴ + */ + + +/* Ӵ */ +typedef struct { + char dir; + int len; +} LCS; + +/* Ӵ */ +typedef struct { + int s; // ӴڴSеλ + int t; // ӴڴTеλ +} Pos; + +/* Ӵ */ +typedef struct { + int maxlen; // Ӵij + Pos* pos; // Ӵ + int count; // Ӵ +} Strs; + + +/* + * STеӴ + * + * УıΪ"һֵӴ" + */ +Status Algo_4_31(SString S, SString T); + +/* + * ȡӴϢ + */ +void LocationPos(SString S, SString T, Strs* strs); + +/* + * ӴȡӴijȡ + */ +Status BuildLCS(SString S, SString T, LCS*** lcs, int* maxLen); + +/* + * ӡӴѡ + */ +void PrintLCS(SString S, SString T, LCS** lcs); + + +int main(int argc, char* argv[]) { + char* s = "csajcu123456ewjfskhsdufasawx"; + char* t = "m123456vsadksjewjfshcdsdufassgcx"; + SString S, T; + + StrAssign(S, s); + StrAssign(T, t); + + Algo_4_31(S, T); + + return 0; +} + + +/* + * STеӴ + * + * УıΪ"һֵӴ" + */ +Status Algo_4_31(SString S, SString T) { + Strs strs; + SString sub; + int i; + + LocationPos(S, T, &strs); + + printf("ӴijΪ%d \n", strs.maxlen); + printf("Ӵ꣺\n"); + for(i=0; i=size) { + size += 10; + (*strs).pos = (Pos*) realloc((*strs).pos, size * sizeof(Pos)); + } + + (*strs).pos[(*strs).count].s = i-maxLen+1; + (*strs).pos[(*strs).count].t = j-maxLen+1; + (*strs).count++; + } + } +} + +/* + * ӴȡӴijȡ + */ +Status BuildLCS(SString S, SString T, LCS*** lcs, int* maxLen) { + int sLen, tLen; + int i, j; + int max; + LCS node; + + sLen = StrLength(S); + tLen = StrLength(T); + + if(sLen == 0 || tLen == 0) { + return ERROR; + } + + // ʼLCS + *lcs = (LCS**) malloc((sLen + 1) * sizeof(LCS*)); + for(i = 0; i <= sLen; i++) { + (*lcs)[i] = (LCS*) malloc((tLen + 1) * sizeof(LCS)); + } + + for(i = 0; i <= sLen; i++) { + (*lcs)[i][0].dir = ' '; + (*lcs)[i][0].len = 0; + } + + for(j = 0; j <= tLen; j++) { + (*lcs)[0][j].dir = ' '; + (*lcs)[0][j].len = 0; + } + + max = 0; + + for(i = 1; i <= sLen; i++) { + for(j = 1; j <= tLen; j++) { + // 롶㷨ۡеĽ΢ͬ˴ҪͳӴ + if(S[i] == T[j]) { + // ǰһַҲȣ˵ǸĹӴ + if(i > 1 && j > 1 && S[i - 1] == T[j - 1]) { + node.dir = '\\'; + node.len = (*lcs)[i - 1][j - 1].len + 1; + + // Ͽ + } else { + node.dir = ' '; + node.len = 1; + } + + if(node.len > max) { + max = node.len; + } + } else { + if((*lcs)[i - 1][j].len >= (*lcs)[i][j - 1].dir) { + node.dir = '^'; + node.len = (*lcs)[i - 1][j].len; + } else { + node.dir = '<'; + node.len = (*lcs)[i][j - 1].len; + } + } + + (*lcs)[i][j] = node; + } + } + + *maxLen = max; + + return ERROR; +} + +/* + * ӡӴѡ + */ +void PrintLCS(SString S, SString T, LCS** lcs) { + int sLen, tLen; + int i, j; + + sLen = StrLength(S); + tLen = StrLength(T); + + if(sLen == 0 || tLen == 0) { + return; + } + + // һ + printf(" "); + for(j = 1; j <= tLen; j++) { + printf(" %c ", T[j]); + } + printf("\n"); + + // ڶ + printf(" "); + for(j = 1; j <= tLen; j++) { + printf("--- "); + } + printf("\n"); + + for(i = 1; i <= sLen; i++) { + for(j = 1; j <= tLen; j++) { + // ÿһеĿʼ + if(j == 1) { + printf("%c |", S[i]); + } + + printf("%c%2d ", lcs[i][j].dir, lcs[i][j].len); + } + printf("\n"); + } + + printf("\n"); +} diff --git a/VisualC++/ExerciseBook/04.31/04.31.vcxproj b/VisualC++/ExerciseBook/04.31/04.31.vcxproj new file mode 100644 index 0000000..68b5a75 --- /dev/null +++ b/VisualC++/ExerciseBook/04.31/04.31.vcxproj @@ -0,0 +1,76 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {2FB26990-0C5E-47FB-9D0F-E3A202D2A47F} + My0431 + + + + Application + true + MultiByte + + + Application + false + true + MultiByte + + + + + + + + + + + + + $(SolutionDir)\..\Status;$(IncludePath) + + + + Level3 + Disabled + + + true + $(SolutionDir)\..\Status\Status.lib;%(AdditionalDependencies) + Console + + + + + Level3 + MaxSpeed + true + true + + + true + true + true + + + + + + + + + + + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/04.31/04.31.vcxproj.filters b/VisualC++/ExerciseBook/04.31/04.31.vcxproj.filters new file mode 100644 index 0000000..6b32ae5 --- /dev/null +++ b/VisualC++/ExerciseBook/04.31/04.31.vcxproj.filters @@ -0,0 +1,30 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + 源文件 + + + 源文件 + + + + + 头文件 + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/04.31/04.31.vcxproj.user b/VisualC++/ExerciseBook/04.31/04.31.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/VisualC++/ExerciseBook/04.31/04.31.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/04.31/SString.c b/VisualC++/ExerciseBook/04.31/SString.c new file mode 100644 index 0000000..fc4c757 --- /dev/null +++ b/VisualC++/ExerciseBook/04.31/SString.c @@ -0,0 +1,406 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#include "SString.h" //**04 **// + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars) { + int i, len; + + len = (int) strlen(chars); + + // chars + if(len > MAXSTRLEN) { + return ERROR; + } + + T[0] = len; + for(i = 1; i <= len; i++) { + T[i] = chars[i - 1]; + } + + return OK; +} + +/* + * + * + * S١ + * + *ע + * ˳򴮵Ľṹ޷ + */ +Status DestroyString(SString S) { + return OK; +} + +/* + * + * + * Sա + */ +Status ClearString(SString S) { + // ֻҪΪ0Ϳ + S[0] = 0; + return OK; +} + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S) { + return S[0] == 0 ? TRUE : FALSE; +} + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S) { + return S[0]; +} + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len) { + int i; + + if(pos < 1 || pos > S[0] || len < 0 || pos + len - 1 > S[0]) { + return ERROR; + } + + // Ԫ + for(i = 1; i <= len; i++) { + Sub[i] = S[pos + i - 1]; + } + + // ȷ³ + Sub[0] = len; + + return OK; +} + +/* + * 㷨4.1 + * + * + * + * posʼģʽTS״γֵλãڣ򷵻0 + * ҳɹƥλá + * + *ע + * 1.ʵҪСӼ + * 2.ʵֱȽϵЧ + */ +int Index_1(SString S, SString T, int pos) { + int i, n, m; // ¼STij + SString sub; + + /* + * ʧǰ + * ̲д΢ͬ + */ + if(pos < 1 || pos > S[0] || StrEmpty(T)) { + return 0; + } + + n = StrLength(S); + m = StrLength(T); + i = pos; + + // ֤ȲԽ + while(i <= n - m + 1) { + // ȡS[i, i+m-1] + SubString(sub, S, i, m); + + // Ӵģʽƥ䣬Ҫƽ + if(StrCompare(sub, T) != 0) { + ++i; + } else { + return i; + } + } + + return 0; +} + +/* + * 㷨4.5 + * + * + * + * posʼģʽTS״γֵλãڣ򷵻0 + * ҳɹƥλá + * + *ע + * 1.ʵֲСӼ + * 2.ʵֱȽϵЧ + */ +int Index_2(SString S, SString T, int pos) { + int i = pos; + int j = 1; + + if(pos < 1 || pos > S[0] || StrEmpty(T)) { + return 0; + } + + while(i <= S[0] && j <= T[0]) { + // ַͬȽϺַ + if(S[i] == T[j]) { + i++; + j++; + + // ַͬαҪˣ±Ƚ + } else { + i = i - (j - 1) + 1; // j-1ͽ͵ǰj-1ԪأڵjԪϹһ + j = 1; // αjصTĵһλ + } + } + + // һT[0]>0ж + if(j > T[0] && T[0] > 0) { // TΪմ + return i - T[0]; // ƥɹ + } else { + return 0; + } +} + +/* + * + * + * T뵽Sposλô + */ +Status StrInsert(SString S, int pos, SString T) { + int i; + + if(pos < 1 || pos > S[0] + 1 || S[0] + T[0] > MAXSTRLEN) { + return ERROR; + } + + // ĴΪգǰ + if(StrEmpty(T)) { + return OK; + } + + // SڳλãΪT׼ + for(i = S[0]; i >= pos; i--) { + // ӺǰǰԪŲ + S[i + T[0]] = S[i]; + } + + // TSڳλ + for(i = pos; i <= pos + T[0] - 1; i++) { + S[i] = T[i - pos + 1]; + } + + // + S[0] += T[0]; + + return OK; +} + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len) { + int i; + + if(pos < 1 || pos + len - 1 > S[0] || len < 0) { + return ERROR; + } + + // ɾijΪ0ǰ + if(len == 0) { + return OK; + } + + // ѺԪŲǰ棬ǵɾԪ + for(i = pos + len; i <= S[0]; i++) { + S[i - len] = S[i]; + } + + // ȼ + S[0] -= len; + + return OK; +} + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T) { + int i = 1; + + while(i <= S[0] && i <= T[0]) { + // ַͬʱȽС + if(S[i] != T[i]) { + return S[i] - T[i]; + } + + i++; + } + + return S[0] - T[0]; +} + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S) { + int i; + + // ͬϢһ + for(i = 0; i <= S[0]; i++) { + T[i] = S[i]; + } + + return OK; +} + +/* + * 滻 + * + * V滻SгֵTȵҲصӴ + * + *ע + * 1.òСӼ + * 2.ʵֱȽϵЧ + */ +Status Replace(SString S, SString T, SString V) { + int i; + + if(StrEmpty(S) || StrEmpty(T)) { + return ERROR; + } + + // SѰģʽTһγֵλ + i = Index_2(S, T, 1); + + // ƥַҿԱȫ滻滻 + while(i != 0 && S[0] - T[0] + V[0] <= MAXSTRLEN) { + StrDelete(S, i, StrLength(T)); // SɾT + StrInsert(S, i, V); // SвV + + i += StrLength(V); // iлһλ + + i = Index_2(S, T, i); // һƥַ + } + + if(i == 0) { // SеTȫ滻 + return OK; + } else { // STVѾ岻ȥ + return ERROR; + } +} + +/* + * 㷨4.2 + * + * + * + * S1S2洢TзءӺijֻδIJ֡ + * ֵʾӺĴǷ + * + *ע + * òСӼ + */ +Status Concat(SString T, SString S1, SString S2) { + int i; + int uncut; // ´Ƿ + + // ȫҪü + if(S1[0] + S2[0] <= MAXSTRLEN) { + // S1T + for(i = 1; i <= S1[0]; i++) { + T[i] = S1[i]; + } + + // S2T + for(i = S1[0] + 1; i <= S1[0] + S2[0]; i++) { + T[i] = S2[i - S1[0]]; + } + + // ³ + T[0] = S1[0] + S2[0]; + + // δü + uncut = TRUE; + + // ҪüS2 + } else if(S1[0] <= MAXSTRLEN) { + // S1T + for(i = 1; i <= S1[0]; i++) { + T[i] = S1[i]; + } + + // S2һָƵT + for(i = S1[0] + 1; i <= MAXSTRLEN; i++) { + T[i] = S2[i - S1[0]]; + } + + // ³ + T[0] = MAXSTRLEN; + + uncut = FALSE; + + // ֻҪS1һ + } else { + // ͬϢһ + for(i = 0; i <= MAXSTRLEN; i++) { + T[i] = S1[i]; + } + + uncut = FALSE; + } + + return uncut; +} + +// ӡַ +void StrPrint(SString S) { + int i; + + for(i = 1; i<=S[0] ; i++) { + printf("%c", S[i]); + } + + printf("\n"); +} diff --git a/VisualC++/ExerciseBook/04.31/SString.h b/VisualC++/ExerciseBook/04.31/SString.h new file mode 100644 index 0000000..386ffb8 --- /dev/null +++ b/VisualC++/ExerciseBook/04.31/SString.h @@ -0,0 +1,179 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#ifndef SSTRING_H +#define SSTRING_H + +#include +#include // ṩstrlenԭ +#include "Status.h" //**01 **// + +/* 궨 */ +#define MAXSTRLEN 255 // ˳򴮵󴮳 + +/* + * ˳洢Ͷ + * + * עЧԪشSString1ŵԪʼ洢 + * SString0ŵԪ洢䳤 + */ +typedef unsigned char SString[MAXSTRLEN + 1]; // 0ŵԪŴij + + +/* + * ʾ + * + * ѭ̲ĵдϰߣposָʾַλ()1ʼ + */ + + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars); + +/* + * + * + * S١ + * + *ע + * ˳򴮵Ľṹ޷ + */ +Status DestroyString(SString S); + +/* + * + * + * Sա + */ +Status ClearString(SString S); + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S); + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S); + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len); + +/* + * 㷨4.1 + * + * + * + * posʼģʽTS״γֵλãڣ򷵻0 + * ҳɹƥλá + * + *ע + * 1.ʵҪСӼ + * 2.ʵֱȽϵЧ + */ +int Index_1(SString S, SString T, int pos); + +/* + * 㷨4.5 + * + * + * + * posʼģʽTS״γֵλãڣ򷵻0 + * ҳɹƥλá + * + *ע + * 1.ʵֲСӼ + * 2.ʵֱȽϵЧ + */ +int Index_2(SString S, SString T, int pos); + +/* + * + * + * T뵽Sposλô + */ +Status StrInsert(SString S, int pos, SString T); + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len); + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T); + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S); + +/* + * 滻 + * + * V滻SгֵTȵҲصӴ + * + *ע + * òСӼЧʽϵ͡ + */ +Status Replace(SString S, SString T, SString V); + +/* + * 㷨4.2 + * + * + * + * S1S2洢TзءӺijֻδIJ֡ + * ֵʾӺĴǷ + * + *ע + * òСӼ + */ +Status Concat(SString T, SString S1, SString S2); + +// ӡַ +void StrPrint(SString S); + +#endif diff --git a/VisualC++/ExerciseBook/ExerciseBook.sdf b/VisualC++/ExerciseBook/ExerciseBook.sdf index 94b10c30614ef2cc0008f25df0081efc1ec42ae4..67505ba73cfbd9e621e24704ee5683e4c3663bdb 100644 GIT binary patch delta 448020 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�yrO` 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�F{9$UfhU zD)W1VMLIC5$nW6sxKx^Xy~!E<@L~hE_6~|bK;HVUJkQA0(XxlU_8rq|^OE}C1f)pkwO9? zBp`?EtDTSq$YMhhAe&?e5Oy0vhAqTq2?-&IMF2zDENGz{#eSZ)Pg`iQX`yt1+H|9R z3VHAE8I3)T!409m>-YZgCYL{&bI$0@IcG-F%(>6~y;qQ8-=ANz7;bsQVkji#z89J- zd4}1f*!Q!j)v%sa`vm&C;&1VdP1dMzuvD=%8a@@zR^-H}yf#nM*pDujw;Zl`{%$Hf zT*}Xq($a3&*>-z;$`-jz>=}E~Z@bZU@Z>$T!&9Ygwsym}P2$;YZx@?GcH57C@@dmv zD#)DGS8X?{4UYS$K(1|g_?>&HFlUy&+GfLM*=GL8TeOdga%c5dco{0}oRrh1P{G;t zeHFSZc{_jSbauTi+(%{O>-F{3joa+Ed1p_aaX%GR)%Vvo*FyDu=ftFUAE1Ky`}*pO zpuQF~a9;GIVGmN_qJ8=bc>{}ITeaaKDq6a)ze1ChDqOL7ZrXk-SocO>h4s9FhL4=` zRnq749;U)8-_TbWmAA-J{JQ-IsAS_C{q@a7eHoEW*~g-|Kb zNec3lWO&ypv(7)oT4={5J^H$NV}I1P_q&f!(efU(@`07Ky}jEs%x?eI4XfK9rJd@w ziHg0^&}-&LY7=YiC!O+-|7o{9Muk^z6H$BW3UH0sBHQ-dQT;fTY~3cd+1m}T^K(CU zY{+iEZRRuW@F?N`rU6+c8pGY;#j{I-Fr zET8#z?_nwtf81YXLtmB8|MihoPg1Gr$AhX|zBK>H5h}9&SXbq5OjKp=J#CYpqLP#s5t!WD%RRyuy=o}*OS{+YhYuJN1wv9|j+-1iaLb;CF6d|sogh5Ncy3CTi%FEej) z9&k#0r8eA=DB2$ZUNH`GIiY}nl>|6GIN+w>fG2^&*G{kr6sxZ=K#=2voJNA5)|ykG zM!vYaDb`nSMwl-f?>|s>{FDsesTodMXk?~#r27FtLl z3$&y`wz&8Le0~uAu9zsK(TX?OR!3mXgscuika{gUsHgN^LJsv*Hd9aKbm}QBO7E|L zq#vl?GNXRWChE7GPyLo9>bD%Ee#=hkx13G=mJ6ugvL)4TbQ=wDizLph>$$T@`NuOA z1py(@*LhpY+aAj^tVPZueijt>jp3FU7H-i}90FgU#g}67C0AHmCGquCd<_*}EyY(y zVI34-`XupXPJC$-U&O>0EkOlS;wzH)DkQ$#h_5SxS|wj4B=MC&CK^?WQyL@kg+5ry zBk|=se8~=9oWmF6V8IPvUnB7~HCRU@@s%=sWek?UNPO7~U+TgaweUqOe0>UcB&|>R z2XF^cEx|oTDG}pC!JR|3BJLupCAe#-mN3w1CM6*PL=q(kB1%v|l!^g3UrG`H2}3Ch zC;}ihC_!RSf~KGZ^+4(nL4-7*1ie5B-is2{{-gjP^bjE5M_McdX!el|3jz9k5>)wU z@Ci`hlc2jti+Bid{F96|1S^mRWB^%!7sv;UbXiL9{gYyF`IF${C&8VMgq8?!;*;RN zC&5XNu2t2+0xo%^Gev-J9j#0vz=e($9}(ayC&5FGgk%Wth9eOeLLp!jsHgB%li;f+ z!9z`gb6SiR4k0suOaLxqw3v-h0Ki3zmaY-t4Mqwt1bB4OA~OOxYvF_t;GxymP&jGP zi6OuPOM=T4jRgTtQWE^5B)B|DWJF(3Aa9xqfZoQ34H#AtbneD z9DTyCPl#dNZcLx>>JvVFqEMeO#dQ@}c;c+oXUnE9a_AF2avm@#?ax-^dY$cLqZsX+ z!N0RI0_rG|BiLx=tsBFCYqOT6c|?a4r5MOq9_`2u>{NUs(n^%dJ>j1zliDhh(%^zU zlcOiZ6Ig2Jep;mI`Q-8X<3S4F-Eb^%wDxGzQ<0~tkJLWtelmHu{&4Vc=b?r}p+ntI zxSvQK?0h`qm3cvI(%!5cewH|!4WuD>CeMr-4O*Z0JOad#}F%v)CF_gB`})HQBu-`KMu zupzoWer4+wU6;Eq53j3R+q|Y@wV*V7ZXBz$Rs>99os!&8ey;Mb4TYIX+&MfSPEYBS zd+uabYi}lRL1Ap=*)?MtmE^|q%ZIlFy8}&uNB|<-p@ME-lP}`y&2Pz1y(6tuIxL^NBBpLg zar=0%c|x7tHF5f%6I5K9Z|J`({Wevd_s4e*9QcrY7&p_GbKgJLB|=B*&bGXsqANs8 zVH97gO7&-s4CTF_nyi*W0T*z8M%#_zgu88R3(_W74Y9h{gRe(kt4;=9?RhEiVw7Sc zBO-Fkb4|~-Khtv}a3cD2Jki?Pb=-A4e5{VHEUen>rq!BFPeh&w9SlC+`B*o()OEJR zn=21=?Qh!O{ZP|GoewrV7<#bwfl7)Gj|GsU=I9edZbtVyh{r6}^Xt7=!e zS0-x$D>|14mv=5}SeBMtTE8^7G`OUGad5Hn!_SR@SpB8JOY7$Z=X6##kYiozCCwLC zQ%L#h*};pFGdeHmIKN|h$Fz>~DyOQ^12{g>R=K7i}0aDB+pL8Q7@R%4bv0IL^Q(t(w$zsa2~@SD_DIKh8j% zRx5AZzlk$&dec?)T9v7WYKPFKt02bv^^JX34O#1%8vCx+YE`@cA2IfA*6K|4Upt02 zX@!G)ePiF2A!|JYW8c;xEBsotU75BA_eY>@{riM+cN*%T{HTK<@s`ZJ} zHul}r_l|FD?7La3D%B;eYPCyeZtUALWWA?p?7Ky)*Sdk`)(Vu z)-yHs-LBR8&5V6_Xw{^;tW~RBs%K{GyHl(6KWFT_ORF-~Q0)+EL(kOM*EnRY|Hjy7 z*N2p<_S*()q6;{KoWSq+XST#^hBO}#MD4f(J&!4Wk{TX_q+jM^a<6x8aICwBR z(Ip#h%=_uHw8vHFpZZ8>U-Pf~ea}(Rmh*LwgVQ8>(u_}x+W+v;fgiL{Y5i`sYHl7G zEu7tFV;RlO0q;5wc1;X>*EnbA{GJ{lXXfc1Afu~<-HNxlbe@IOnQ5Z9ZFh6&Ohe3O zYTPK;7=dQ#XaWO@F$Ks9075%K2HZdvVC^7CfCI<_d_WMe37e<@a0A(Z7w`erN`eG9 z01}NNW@0lN$OZBNQw>1^?0^hp0$xIYOY@NB2hv&zGLQ~r13n-Kuns~R-~uv$Y#^2k z1_2YTth7mh9gu-^pb!wk1QTEda)4Z*04M?sQGx{sbX`MlBlNe_5V)4!3P^whFxPC# z5lq%;PMfowW{YlBM?Z_Ylc~IWuykCRwT^5F)oOM&Wv5#S)*YnuQ%?Fisr_>(FI(C8 zMCtClw46ruJUR{PoAT&{r3rLi(v-&Umv}|1()#_9bCg>SmCkgfd1&XfeC#3eJ>2n~d@-IoC|!T}jV4WF{_-^0Z-^v8$(-+=c(({DfqWb_7PKpAg91_bN| zWI&Q`K!z01XV65e05!M)yFj#UKn8T!24q0_Y(NH7%LZgXWNbhNgv1791llPhrXMuc zb;>RdflsFP51RMX3^9Dl9*$Ep(&MM>QJ~M@6V17er|e>AJ|&~D^^^=p`zaYVb?&>r zskx_SWQS895$$>t;|;>f0Yf5cpAl`BJnd7YWmvjSse}pF4;)s{sTs<$Bc<2I_~$@B z*!(l0&)}aAeFp!m=rj1|WS9&dt2A7 z9ZGW2h~QLlcl8b84dV5|hDf{@s$aWWc6D=S?#PbX?TKx5*VSAby(YZ1a!c@PcYR`G z?Z(;-339=9Uy)oFTAN&*xJ+r>P?)d0w%=Lo3oh(j(6Au1pnHDP{K))X68EZ|>z?br zG&!e!PMvbe!xg@whFPIm^%phF3|`ndqv?Xk1(EZ+rv=aJoZ1ixMY_XH;Yhef*|f2I z3Qb)17L1)Dh86#N<@1#2sN&0%)>rK#$B34Qx!2TUsy2xvdtGaE8*2?MVlUmn&Asj2 zhJVrR!1ro&w*#&?E!p*khfNp>eL-_M|59i4fwVgU{KBT+B%W6s9*|V3!^0|K#q>oe zL(^48NHQ6r#z<41V4^Q95@shra8nKlFql^oAham^Ip}yYNdm%buT`!7`q4L$r|;l> zS?2hly<(2WL3vrNgR+9{gR)qFe|q|UaOsfp;H<#lEGeveV~l=!>77pXv#GDl-=*74 z-K$vW%gV*?GQH74y|*4n{j6Cr6gI%l(LVy(9%-j$m7>*sebaVx4bD<_g@3A?pXC!sg`hb9lCbFT17Lf!1Bi$m%L137R|9;z?J4npX#%qG85{(`%cnqf8gAuKvA!Ha# z0fU*2!7L6C(xL>phG4?5#{8|sj4pzpjbwk#o^WbB`m;>hNcLwrng{LW(FU@AFG0KB z`m@sF4dd_|q3?`a8@B%4iqszt{a(u1kzp@p*qT$9@D92kRd2?WKLsa#;+NaWQz>Ql z%+$Jd06LU>z?5GWPQ1@p9E~a0o;Pf|MW(nn6vN=X^M*}|3AiR57)CFyNpl^c5W^^A z7=r?hldX~vz~E)lVPsL@z0aj9vMFVp^{R)|XIbKd_HwEtsoyI*bxrE?3fl+0GZ^6g z*6(Et56Y6&Yf`^gKpk9tR-tQ)U>?nfg|wcOw+}j8d8w;vD_t`2RJEgVTTfpR%7SUb ziYzi@+GJ(q6OKHkZQ8I}n4T>ho@c>S^9F{O38l<8_X z96H>6sOeDTQ127ac~QDvaxAxml*qo&y-IY4^!|l4q~VgJuunmy@aZDmxoGC@pKM*VL|duTF9ml+INRtCZ%Q zQvM}P%W9UomnN6gF9|N`T->lYw77PWdr|E|_rm0Y`UOF*$Qhd7Juf(~b8f@j&|DY~ zJ5$EPL^OU$^y0wmo{QRNHeOgWqw)eliG5P;yQnT440ldxm=c=OJ-KOeWODtv!E-w& zHB1UkB0J(a$*TIQ#6)poVnX-$-f=DC5@Tz}y2nP&t{)Q~?Fw~`Y8@G`h?WON^bBt= zZB&AOXO7!l)D>(E#L3Vo79@PNz9!}9lo5GK>v2oA@}mQe^sHX9V0M|3^t+!l)Ek0^ zPO(7@wS7LN%INZ5wdjivuCvw%+dnj=W_0K!zC-v!o42Ow0Liw^hmaXt03|cF5F&wW z5f?OD3_UZp1d4%dDVH@{23a$<9M>gV!PU)bpl-%$A#cW3B3Kq%g=ksqGOls98W$s5 z!jGeX5WK1o zyt)Y7Tnugz>3U~dxmMaW&`M+1LM)A4htOMWn+4p?mD6_Mlfia!{j^=sPh+td6x3K8 zUr($7LTc=K=%}$95Tc9i=5lH`LQaj{R1jS%u$%ovts{E``ek9ah~TXT@HQiOJC|O& z1JY~kP78P!S72+zqCVCnfp>Euw%9%RabkP99^1WG?#K3F{UcMjEZcpMWn=f_v6wxO z4nD}`*&f20K(-(HZ0zA|@Bo)*Ylb`L)Mc%%JWsB@ZsJyY4VhC==Ugm0VuR!gMy@~~m ztR3;rSdy#0y$01c_BtN=*|#0wcewi78;FF)-b5%g?Sy<6A<@|PxGdcFGqC*wh{LfT zLK}{~l@0y~anjh^2$aS;VqUy-=7RqPxk~omTtV)~P>^Fkfp#VPDHo9YAFQloKMR6C z=Q?t~z+D7;hpWlGizS!rmsqCCe#J%Q-h-$d>%uGr>xSATd!LKT{Tk~s*>9jO$3C#d z@bV#7nfonN=CqD{goT^zcL>SGe$Pec{s7TA_D4*3u#XX?jeWw!=l+CXZL9~;+E_1E zda_TUL&yG%&~5B5T#oLqSp3QUhB$8Q?_8DcGu-^Je-!ZJ{}anX+5cjBE&CVOsQVlm zb?ggFtgw@a_eLsp5UXP%7LPIm#Ojz4G2oa9nsv+!u{vhKs#0b}Sh!S2${5$Klb~J4 zY?z~Ab_9%LXyzuZCakex*UFSZc0qyK{YzRvF#2v1*%G@$Gf@{r&g!g}q0= za+}^6ajT94>EX3nn*^sKe^7Q}l?2@w31Tp$bV+M(p(P?g??Zybg#_`4R4)W4bPxIx zL45*l`+X(wu2h(5<26qm+9DN;0${ zmNt(<^F@Ndi^N4!TA_F%akUbzO(H=KL~8)o0O?CWXM+;z*Zm6+%g~BmfIx+o;HngT zi85UYSAoz<+GpxYUWfRBR`U8HUE+-;`h*m15Hhv>zHg^gDxuWWyYt%uMb^FMSl2e! zw(xaz*EV0%u~ncMmYU6tSGQl)Qy-|0*2Oo4Hg#@n*chZ$U=6emtaCl?@{(89U+KOw zc||SFza%cNygk}I)NEKyrqE7n%l z)U0S+-oC77X<%todGC%Yv$<=bYhhSvx-)ZstYLC!a_6}X{1&c$QgBl8oO*r}S6k(# z+qhbOBUe2^oX|49n%~Yv#`TVE8XFngeRdP6uXm4W7!w-PIl5tVaCB#=J`@ZkE9)!W zmB~@HquisCBkM=HM8^1#%I(e`N0XnytV?{k!vbEWtvy(JpR2T2#=&*@q+21&zvc%9rkA)N$yKlU&lOU zE-jgQ+n~4SrgoUGV1FsEFL_5zg-6QoO9od-9_e41YBlpyZN7rq$+rXa63HpWOYL@s zm*n28Y^7&^Icuu%w9VQmJtH1$tg4iMd2M0l^JFO7y!%uOoA=`n^7D-JoqEYO-85Lu zPGMu4H(WAb^n0>tL9Zv9tTvwXz_o%WtCEmjLnr{0QBz9-F%ND$J-A=+;0MN&-n@g# z0XeW!@C2g-e;pyahfqwD10IPUXgzsCOz>nx2|>WzPOt^yf~PP{$ZRIKXqvyZ zXJt^+vs~2btbD-JNGJqw3!Q~KrY!vAX1S^1S?R(~AuAVfP#3a%)cUL}YJHZS9?Y`} zsS8<7dN9wjQa`f1)Q_xm>OxilAU6^W)R`=Apo?gwE@k{GkB*#mA z$iV|Z4sPFaaKn&;-~60>>PU{0nxEs364I#UIWjexk})C2NDa(k)U=!cH7zGV4ay0` z8?-^ zE&`;teMLZF9l_Q?$fg$f40QxQHN%%iW9KWNvGZ9g2|gM&pPO3cE22^JWyh#(K4Y9< zr@0DW1`V6f-_EBaaQ<)o(v}s_NcyZ{LYg`O@zuNfy7=tESMD%cFxA9_%v9jqd`E6y z_kEOKV!@FR>r@>Q2PI3Cf1Y2mK8D8{N40YoCTpF+zCG~3;KyyVANQYr+-&)ww(c*Y zLGwcp-Jj>$DfppR?l;h&`F+gK6HG#|5uD zOel;KEX_!^6AGwTUNiN|YwPRPY#Md6S%3KaQ#+(Dv{F}GU(%HTU_=m25UqHHDVqbEN@as#r&zJ1N zufCyo;n(KSyU>+OSN72R@C$qBU52<|zvOz=Umt;H3UYYn7q7lq`fB+_{Z)nhV(%-A zopL$zPeEVlDTVyg@l}QVQ}b1Y{L}Phg$wYd&p&2gR*J$QKSOyg`ruI4X;DX0SIXNa zabMRyms0(bGiVp@g3@&G_MTfPX3$al_+i~Udr29(cDs9fWLxib3DScOUemd?drQ+6 z_h#X$o=q*AsyBs|+LL9&m9DpPm=wIMb5(FvXk}bE`7+z-=)EX8v+~038BH@HGg_7E zU5*N+a>WFb()vlo9Hr~x2{Y`WvucM`lb%*M7+0DOoLxbImFhPcrzo#nQZn^mS5?6N z_=-1|zCd?O*X&L$JQ}#RsO{~|HgdiG<0}V$_buA%{zv=QHdU*Oj>reuJZ|=w7pe52 zM^C-$vcK~BTiafuq63fW)-}zwlUwtK2O`dwsl@c=fHh4Mv^7l$wfbK=oqzk*{8wm4 z>zjjW|DJK}fmf->_U6FGrz&ZCds-SbzWb5CO>C#Ve*5SC#&`EM{*&`tZb(w;@Bcig z`mz&wKX{FbKK`?=@w?Ng@ve zX@}ta4i)`yoUz~S=QmVk-fyo9{9Lxy2yZl`?xpb(rhAFn1|=_Aau?n7@+a;Wq9qy1 zeIJ&MQLNP^o|v>0&yHX60G@iV@@~*Qhl#H&Il#HbPwX*4fG(c zJ*Ig#Wb{9?QEffS`0A4J;yKC{)g^C;k}`1)-HA%e(4^&n5f7(Xz{vi`QeWLHePX#j zk=1`JUtOs_QKe7J&?m0YCp=NHp>5@ylD$Udiz|#zD>p7E$w;U91M4u`+UQzATF|%_ z+e+P4rPGyPFDQ91OPYh0UJ1C+(h5M?yRf9wAzehd){?SW^upS1UQ{BBBmw^L;*uFL z=25kyRi$WE7g|+;RyCg|;w@)Q11C-gr=Jg=e*t)bD(I}rH>+aJsx-4I#H^|=s~XFy zqOz)=tg0n*Y2?@~suHrQd#tJ)tD45cp+x+)s#C105~~`-DaBz`URV_qR;7bgp1gO^Cyx=3I8uG2_sJ&Zo~88FwP$Hby1C)u;KNDf zz|xXoj;4Jf(($h)b5PUXh;s5J-xOnLPba=OCn}#jCE66{hWx@9e8hUUHf;@U?c7qo z#l0o5xq5T&)lFB2xO~3*sziNteQ#Y;U8t^eQ$302w``1T?B;U^$@R7C#q}*$Mrhpz zl=G8(=AdO=WL@{#hPA=9$u+fW#5FCtd4tv~swu8p)8(PdJJ;2(bFWLRtQ`h40TR!pm=Sa z=fX6UoK!!_P4fyc4kfB;t3;YtsHS;^mI>7pddIhnkI=kA!?@76?y(JHLt_!uEqHe4 znEElnG0D;Oqury!p}NXuijOFatgNUhZyeE1i$t=ob2sI*XVau`Rx~r7(VE`nb}9Q` zwFQ;uj$3EuKKt?B3>SUf{N#Gw*Nv-Q7;jK=qg6MH3zYrQs=0Kve;loPSsC`JQC6O* zuG)Z)%v9y%Ri(@6)4t~F(sN?c0#clpmIDy6mjt@NB{Pr)KrdeM0s){H7y&?&UBV|u zn+`HfMh-qJ5Hjt!IVc6gST!jJy$GOM$N7A(6{N1PmSZm%amiE z8mCk0PoEka#3jo5KO0{Yrz^els>X?KrEM#%%aoK4x0W8DmpiX1of(rBWBiu_D}i;u z6~KCcVH9nE3&;X;03T2S3xS=IwUWTf$IVOt?$6dIsrGp ze+2y43IZbl{3b}_fC<2K-~s@@57Hc90k8d8%1I7dREs>@G5nw8SpA@MYxD;3ptO3>n_>GZ7oI0cK)R|qnM1eV7moj_w zi2^#s8y8lMG1|k^mCj_&esP5I!|O_`l&4nZC|ssRE0O$P$N zc;I|sA#erYKpS&`av%)M0agG8YLDdBHOgY7pG9W1^(eP(qie~h9NkuWjbUvMeQh}+ z#-^v*mBcKEU-{J%=MH=IJ@LC+o4OiZjbUZeL(UIiR$s3i8(9)ix_okh(zVOUl##F4 zTuS*y$0T#pdF@ksl-gsKJkg~z?UJU5jcw$m?Gu%EW2MEhU%dQ3p10|{=h0uQZm|3t zD7s6S@boo&6ZT&1!}bv7tRzhONSJ$*VDpt=@|9rmm0<9d`eS3k+AG1>E5X()!PG0k z(kt}`%1Uden0OMbyb=$V1sksf6R*SrW^sGse%KQw*bybJssbyb1S6uv<4bWv>BE>B zlDHZR4|Ih|4<7AG6=#8oRDy+6f`L?meN^ItEy4EXv9X+7)I6T zSFnom5LhHQLR(zp1r|{r221LXf(2_R4}~RhMPJ#ta z;!&o!{jmj8WD*ye;Zd+K`6I#hC~@5xSRP41gaErE$%qhQT#N=rM;;f8WJPF;hsA=y zkpxBvT&jjg#)7R;f~isJ4~qpmqXhdRH!n&&G!~4D5^ReSH}*b)*+L1nUXp1cz|bpU zPEX2@fiUxuBnkmWUR6B@CSFoVA;7>(aJJzO%dP~&uGAki%!VXv zx}>2(;2J!zW{}IBZ;6~qz6OB)WtR)Q&3 zf+aR4VRDd1CR62yV1<=ngq2`}m0*IEV1bojd6i&zB?%n@%&rowt`dx{Bv?d%$yI{I zRf54)g1uGZ8b)qxA!3=-AFwP7$?O;}5hyO!!3?652~Z?0Dgtr<1k;juEG470>BSomRbq|g#hMXrD8znB8Xj( zc`{(r2p}SwWCkpN73dF!W`-geNvLLb%woKwt%Zh1>Jt+n#Z2*jb2`~eQkttaL1|V9d zWCQF#8i5^wjYEQ^fIf$WmGsyus0l20} zi0w(g=>)EMm4PjU`joPOYydh~+Mqt=L5>&51@fXa-6tU;sN@3*2<#|KC{h4`IZG-8 ziU6*rCDzdv=IkXSU;@m51;FZ9i2)J-={3m?qyg{+keq-FkQ^7Ce>XPMfeeDy)T5cm z;aXkU*vbJs0Ne+pTp$mCsfrzgxlPIeJOEeY!qRm5nkVD~KA-^b16-yn7{g{EPy`eM zqCmP>T)+$K+9eZU2DqM=6Y%n9hXF|9x?xx$FJY0ZCI2e_hJCbqJGY#;~VDsNtF zA1ZJv&a|pZW%5JLVyn9;*;wD$to)!NtwMS2s56~z#Si$LIZDSv=3F^M zK?$37M0WIUZ`oeGJ+7Sd@rVj#nlCL~>`@{c3Vll9E0QOpcCDLcLF(58DSo|3lN+^{ zxs~cyr0L50`<;^%=da3KO8R6rOhpy&dV+DEW?maw7C+fjb67{izF z^f<%UFumZ5m|kc-IbMVs{=(Y%i=@6d)EB4vBBwF~WJ--Qr}~nvzGSE`eAPPD8Rol) zasI+xHs}aa0P9njA<)qFWM}y&HgdlCc!$)YG=6S83mR4ARXKU$H06~$Gq!FN_vFR%TzSp8mAUQS zsB+_b<=YRsCb@D(71=C%XhFxNGtGQR@=Stoea$;c?f&x2XGct;`R2f9ChMHJsqxyM zdc_OfVhHh*Cavh1`vlgh$TA(&- zf!eGEYP0AC&03%~i*`Y?7Vu`p7N#mbJm>%>t?0=?MS@mzWKdDxyPg_U)c3BV{Y6sh zLKYXQO1bG?i!a?k`mPy$~JtUTRvDs`^;}A+(Q*R&;z& zk)Rc|4k{8CsqI>%wri1kv_)$3s0__pq&AN-(Y!_K>0X?wDlw=^lUDTfpdvvlIx(n7 zT&y-^v3k}Qt1X~Rv|zD%x)-Yrp)xdNu{utR)s`>_Fv@p=iVw5oDp z=M`lSiL6|2%FD`^-+VF!^3 z*memkza+5B7_;^++6Di#TGXLS=Wi_-NOkD`O<)qsko5+6jU}AJblax{Ci$|^F0^!= z|I>ba1~#~iS2lJKPbahs(`r@+Fh++Fg}aGZxr70XePwtTNqZ}A8oeWx)5?za@(kNqEJe-kbnpULQ%RaEfo7|tH-3gS7|WMK6^zdv~|`35i~xcFr8=?u+4-KO6N_Eabt3{{U{UvwD+lJ!p3)Yb2_zc#r;6p*fE|V z-$#V@<%XbS$^sT&pT#3A4&QV&wRhFwXcaN;- zTZ8?$Qrl9o)GnO#X-!Z<-!IK0|6B(hK<4xa4)y1td4Gw;)_=~F1ao9a1$}QM;k%qX zH@$7709rVmoTnG>$gfpJ@5Vo^YV9+CTJw2*eLSsrM}Z;h_469b2Xb({qo7uas*jjS zZ5bheW=UIDu78o@R=(A6aJ$7Yh5mj=+wl6N3WN_u5c)|MnH|W-K#M6UsEtTGz+*wN97LR2%ov&G| zH?G~hZqVr(rVRlf5fbiArPb3V^AY&^;c4gjwf|=t>2k!7wVr|aZTXNDel79a3azSdBz`+mt0gsV zTCM81ovHZks3B`TQ}Nr%A#42x;>L*;d2uHz>9w-TWV?oBqip&HF!e<9{W|@}49q-g_Ul z7)Fvb?|1ID7#7j}|8J@(wj_m&OryUC0#?IF-1~PKghY+;qQ!LE-`*zGP5QgvdztX| zcih$*;hpPKy~IoNE+MLTyUNCkQgV)KxYiCSp-#24Q+!-Pc-(oGRc#V2Qp= z2=}iLwx;V7dHO_!J~3UNn5R$Fgk#11$2IGgZCbPR3FVcpvejal;_oi=h!?dj`0`+j~dWg6OajH14TeFa1JmDm+4@9*K2fPpT&Pbh)F)Q) zggTP6z(ChPTFcX?pg`*nu%6d8F+~!WFk(fq4}hJyjf6U+38_4-7C@o)If2aG-D|+`C$gve=BArNH+SFEa8rn4bv5v4UG=+zyOTH6-{8I>d428m?&}i`wGCoJ zB3>OA<1Ml3m>5g!s@^3cNR#4t%Q|Xb!N?i3PUOA)HgZc`@2~}v+u_2P+*ZHM{pHFX zO7+Fo3}f$xCgsh^WlhRcKdN#KtGu{ocH^w}i+W}TW=1cJ&uG1%>wMSw;puhLn$PQ) zDom}6)Px(AhF#J!rE8<(IbUsNV@7*=k2~Owy5e%Hv&-RfgwuNME%s`ATzU1lHFB_d zQowuR^K+kFOJDFG#L0H3{i~cVT-oN0RxCHf&IwP~E_Pp?cGb_-Hq3BaOC|b?=k*oC zwP8^4{Jvs%ISeXZ&{s?j4}Cup{k1RbD<9w&r{ylzHp~M&<+R)-+JvYyk1R_ri7ZYo zj4Vjbi_A^V301dTlDIfDJ8@BHW@1L@tP2v;L(>vdLy^Rk(B#CV_NtBvUE_Mr7RIR;iIXvdPDWK9ul9>s`~m5iHEeerdpv@rQLa>I9C|J ze|zU0KY2J+>%*u0koaWZJHGKl;t{Q?RF|}>)h?a+L*i3I)_a-{iAS|czTrdSF|D3d zC$)ODPM+CA;_)GCJ=2H8R;|`=_K=v+s!4TOt5&;I&+H-bX|2}(+(Y6Ct;$qGwL_>4 zJ=2H8XNIixOdk@T)oMMBhr~Hw@sLQ}Ons+4r`49~xmLT{^DlWwRBHB*@GGz%f2GN) zZOA%{`D11|XQ{TWR7RXWrSdhbAzi%7Bnsyx4G z(u{+3Q@XqvU%XX_6{=;YtWe$jf5!^ds=gJf^yAC8ig28X&3xIaNqsS^FHC)r)E828 z#*)_KHqwLee>~!d5`9J5r;MB|yOdc!D*x#P@lsc5b4g`M`&rSmx`x#a3l3{74i|S6 z)fDv<#tU6vZ&_7!ho)=zCY*IrHw$HB;IzZehSv@o z3%4CM4t_gqJc4?#3Gm!u6SKi8?*DWS{GZq)I6$#;;Q_@a!v%^>fe#c5BY1g?Mc@X- zros=3od-uKHVvLoYc6uTHMQS1`< zM6oEGqFA*JoCCKgtsj@dJ&MhRe^iXkL;M9cA1+dC0eqy`LhkRi2>xDdF&w_w5_o*E zrCH!I_`*B^FeF}PmnB5n}Djqv_qo8bP#>fryw>fr#yuCfrdj$92-AhsE{_@3vFqRu#J0g9h;4^Q5ZeKlAhy#D#&*Fgh{fO*#NzM^VhwN%V%Nhnh}{6! zAhw(PSKSEzDs~ebtk}))uwr}QV#RKOj}^NWPFCzTcv-RA1K=G&@XkW;t|G8e5Xc{) zNd)gU5VgDBvU`lk+iL>vHG})$cf}Mdcpp5k*!^(5Vh_Ogiam&s_3R;dU$OmgzhV!= z|B4+zAPm+F4=mOK7cBM&WYpNBa3W)m!HbMN4mUD(5PoFri5NV|*de%*vBU5sV^4BN zs3UNMVo#AL6gl3&6N(*!D-=5pUntfZ024v*=|ZA*LQWJR>zQKkSusF-&H%Oi~dl`;V>=k%Mu~*?5#oD=VR1&^X>@_$?vDe`p#l8*iDE1w= zN3l2HAI08;gB1HNJfzt7usWZ8AB*$Z53n|${SaPK>@B!Su^+)tioFd-Db|r6!%HW8 zq}YGKNlNR;f5Tad{Wt*rBnbYr5d5Da@Mp!~&&4S57Y6VhBlxZf{G}QEl?8my3U;tEKMU~V z|09URKMTSCEdu{l41O-w5x+2iCyhkw2*HGeXa)@y&}aos@U3EII9D+XysMZM?p2Jz zzlw1OD`ta-6|=*|ilvc{mB1YC7+#$4vSKpate6Y_Rm=?sE0zuqt5i=$WWdvkWx~~p zWx>~qWy9Hu<>Y}L?&{-(s}IYCuMf+Evk%LMw-58d-G>zvg8m{f0FNIQ6k^TvQYeB& z2Cx`jKWvx@Jj)E0Sin*%I2^7&tPH+CYy_NtSUJ3ZSOwgF*hu*Quu*UTVwLa!Vj;Ky zvC;4W()uw5zCi43I0Lb zMHVDxS;5(G6Ji&0hp|iGFvgHxSV2(B#z*A;=67lT&_J;WQCU<5asz)fbb&H~n3!K>g|#`{6D4kNCHiy7Mt zA2YTEPG)Q?yv*1&a5H1q!q1Fd2S+ou%>{0Us~Ot?Uo*B7&Sq>EyvedAe}wod?CpH8!v}U2fdAzuYW?`{0J44@1b2@t_#Q&z(60#CErIXbz+c@qZKqEU=96>fEF8QwSz1TlpLT9 zqObHT0;ah@hZ}UJgK`Gw$^_k6V0tz&)sgay9AssBz$`EET>2G3A}0^@Ca0Fac)30^|T5z)P4OFJkSq zodIM5SwJ>m>LHi`3t$BpkPC>>Yv@pfn9+#MY#;~l0EIviAk+}j00-a%3V|Y^7|3WQ zWCB@0Hcz%ANuVY|yx0f@U?YTcjgT=mngiDgMhF7Oj1bZ_Le|)r!BI(D(A70U<=AMh zAwVzK=msEqY|H>4A8ds5t`Qo@#7>p6A zjnHqQ_7WhnVuZ$u5z-t+NOKq=&0&O&h!G+rMre>2p+RDVii8m=5=N*<81cww#G{iD zPfj#21Uv^B@fc*pQ;-qQ5k}mQ8*x8w%#DG#(>CHp+lc#YBkrAzxZ^eAhS!MuU1}n3 zc#XL0H2R~20D!wTBkp*NxZyG4e#eL(ZXI+>p)%q#WyD9yh-;s&8Uh0#6>WsXvN0FP11yyUC@vczA5Bfn#5UBIsfmOD08weG zmf!;N0Yf{%2$*7^8Sr)ya)Cm?8i>=O0SSO2wGr~o#sClmAW&_zH4-4{Y=l%bU4jIN zI~!#H%GJh#b^^4Xsfkv4p`j;a0)ZF^X=@|opJ|6&^#wxLl(K~R3sj*gm7%^s9-2}C z^@Xcp(-owq?5(_v#G|o`SA8K>Y^3tLrqRnNw=f+?C*%mzm6yu`Ta>^%L0Regb@|nz zVc$OsSGBeMru--L)nKlnkE#vGZzKc(3qF;0z}QU40rCMK5CA;wgaW|Zg)JaEK$mbH z;Hf0|fItnd{ZYf{#R%CVIu8U$&`>!EpcwJQPM=D;fbjH0-wK3a9RWXBMmsJEpMVpF zb8M&~7y$%}GrBkeH1b)1Ax=og*(ek+7^6%9{$f^NeCi92!x|rDX-1iSl%2nh%I|7u zEB|fz1~J{3)4GK&2mxPxV_fuNRJJ|f{ENAnwE9Rr^oKdKm3SJPno+yA=brdIu6vsA zuB2FsQBsGhQ<`RFSBL@Sz(eK@%E-5@PO=p4Ra~zI&QU6smk%G_b#dLr!o`iV1G8Ia zg=ckKR71wU_)OQ#<_jw?Y@bm-BRHe;f`$u17qlxayGBkCo0ZOs9aF@(5`4QPsB|5( z7Kk;9_$pa{D@PS)Qw+q2KYI!tE;fZVcrSQkybQbFho{*6*8e}d-~W$xzdjW-aw6$B z8(!A7aZbfBdo27!;_=X9iAO>$i36dB6Ay(ROxz#3FG0b=68D7ePBez@O572;J#lO3 zmc-4Wn-aT2HzXQD@x-ps&cyc6w#2oeYZ6;Rn-f=s>Jytn8x!k8S0*kGtxK#4txk|g zZlWf%BC#yAG_g3eD6t?kKQT9WX;XDeGlTOz@5%jDJ} z?SRE&Mm3)JBU%4kEmnSW0@wUiF4aR@qMZ0i@^0nc=j8GVciSbZyX_Ly-F8XJ-F7K| zvmmskUh$&7-J}&gKd4C1ie4C0MC((yyX{i-FiTZ`J&CAr9m#H<=E~t5#>Sw%6Jph&A0LxT|=jEx2UmSD*lUDT7 zpdvvldU;ThxLj@4aeRL{Ul^{6Y=Ft`CjMtWRv~l=fp2nbQ1)$)&t|Y@$a=J5c^z z?lAA2d|`%VBmLrCdYHb5w14qk!kdb>wPJKk#`A}ahYlH!8ZsU*WIR^Lc$lD|nm`u; zj|ehihRApZka5#5<1U{9auRS0Pf(8{=pm2uZ9<6c$9y{U{lQW>|P)JOtuGG*LV%DA1B zar-Fq`^15D@|(qhSss3OI51BQGNN3SsCYdlJTTG-Z|=a@B0LM>A|y3rt}?65HY%3ewTxQXLvYY@F%296a+xwj7iGvq%8&u1 zV7k;f7^-AgeB?YA^{W6dMG1yF0;XhXBnX&olrh05V}eP>loAaG0TUrI0z=3MwIP!q zKK0Ws5OMmUlpa51vIa zKa|H$R0Lv(_9#OmlrBUXPiSM(=+IEYEGfeTN7p5dSdNR}i4rjNFJt~&#;h)V3NUOK z#T<;CNuZu*2M9%#1UH7njM2yzsBg9~dKo7a;nK0S$A~%TbrD@GeVwCdG88t!*fl6C zOWzZ9ue|6oQr_Zk@X@9m1nl8ebjHwRmEe_%_eFwJx5~N}4ieKV&>E(g~t-h$#>m7HImCB)}F-9}KcG%XpZSVS|-12SV3A4Hf1ueL4u3v6M3~>X@{kDDKp4 z%vZ?ieEj_wf6PkAcutiaI1?tE2~wM+eQ-K3*&tiO1WYmXT`1~^=EN!AkJE(71=-S0 z$iTV6T!M^8S^69k{B-J0dFzy7{h3Vt+;k1v&8RyP(D$P&=yTe&ADEG?Hf0dzF zD?^b~#^M3$00EX~+2o=Tu|^4Ij1nwYG7K>?X5VGZ7Rx3KP!6wxSELw8)rVmoXbmtsrCz)KU|=;EEDF=!XOS zC_+DSx(Ft8AwNuDjRbe|JfzzRCV?7mLl@Ek6Z+wb>-w>af2gv$24xuox=*3HmvYB5 z6{9BdISci-{Z?lae|vhf?(J%ps2?mfOL^&;im5THYo}m7;FS0qVPxz}z;=e|?=$VT z)+V*F?q=%#z$}c&l2h{d01e!Y57)pfK6nGO_)rea!uTu>wVtRw(e!jO(c2nnZ8{z~ z-g~U&SoN`%qjgV(kGP&p9E-9HJRgVxyRF}03uT$K|OLt1OnTd>edej|ITHedcQd$p~Ey^pe+NM^F7$=SD zwblslJ*_^6^IPAJt->D?s$yF{P3Ga7fuCNb;1IbjkOV0F2!H@k1UTrvk91TCZXgrz zSCZOu5GVqS^rbCX0ST}JP9O`&1-NcDR{%$ZWQj|DbG2_S@ok{bpJd@O(}-hCYMR&w z;9Ap#*y7^STvD2ANORF>t`f~vp}CYcSJCF$*<3a|NFQj4i(_*&Y%YJz^{%-}H-wc{ zNoA2f?$ig!JX^471GqRcmQ_huLq(k+ zQ!)Z(fB|WM3&;dKKt2!v3IVKukxT#)ScF2FbPpo)ufT{wr+ss=}+Ghqf#L?CGjpE3D&mp%Y-_rtu~1 zP*|oVIRH0CIplzz+lg zGyNb+cEAD1fE&mJJU~7Ws6=dvVr&|t1S=o`ZXg@T2h24D2G{{7kOg>w0w4$ojRYfL z1Drr6kOu^TB0y{<7zr`Sf=wIX1k!DAYcI)UBW3_OKpx-+f`BiuNG^ zE<#Mo#-k|%rLe?kT`b4Ha;R!d80Ydvd&esz!KzP4`h;7b$kHeB^@*6dW2az3TvK`y#j+wh){@w<^ucbRZwY&*5TmV1 zf-_2R*AOg?gdlw=>{)bm+YN!ZV9yN`ER6)YncxA8t%Tfmf1viydn&>_!|u3x_x2@G=gcj>B7V_(B{$8;3Ur=m2?Pf)$5%;mBUVgu~~x ztJjS~J%$ktF;YV??3Cw3zh$jW`E9cf+in-zVn5FwBYL7oBTw}ni5zL-zJ)D^s}Hvv zsy-whQo4><@*_=;L>_5siL~@KN1A&Nv>fPtIP!4s{+9i{54Akh`(Wh3-UlKN^xhx5 zzy7}9eG#R1U(3Gged4~vz1?IS6z)mfO>qvFO$eInZ%^LVq4fI7hX*@v5N@cvzNVou z-X81O71$Ns8Q;;my{kXwx8m3-g_MgwpH!%Hyp>bc*0aCjK2iBU?41XA8^@XVcR^sW z3le47K@cQBQjKDRdb0$mcMV#QNUwMMP?tbcbUu%k4BSP|BGw<{i1m79q`AhD>`YJK5%xk7E^`$^FupQU~v;*e=Yl7Nc z#lQr@l7z0vJPke}U@fo}*bB4+w*qn>RVpe_0ZayF0ZV|jedqH8We1%5fJ<)=)hiUG z1-R%6U<1$!><3N)ali)crNB5~3a|iJ4QvMv04IPrkc%r60hK@v^Vc+Ah3$%(Rw(ez|p?*+CThry%tweH>s6n1{YYSaDinG z7g#27fn^pKSf+7-WgZt;CUSvgCKnE|JB~{%ce%iFnF}npxxjLr3oQ4!z)FD&tTed5 zN`(uobacTgSR=@fOPhaLpGP-L>JXU~6&F~Mae);b7g!N;ffXeeSdnsp6)hK75p#hR zH5WX_+>lw>^B{H)aDm+mTwwPE7udbQ1$K{c;o5tJhp>A_7dFxKIphWpVmA>N*v-TR zc2jYIZm!XD*geKW*uAFx(?8cgD)wmoFFU4cm&^U;lA*XO-hV!J-hY1J){a~GrUCSU zzNXl#`Cb;yTGLwVz8u;gKeDRHubyf}k{|B@#kLVYN}%U=(&4 zg=6#t`$p<3;z~6x+63GHtOT|J`+&1R4xOneK!HJrZJbeTVdRr;+=Lt$>V(d4VdR5ts+80NQ{Ua307vT-8xy6aq$J zwk{M?QPaY>n~XvGDZl!ETmN2MnTe~1fK|XIU?*@8I1O|FdAM)|Fdmo+1c5a`6gUNR z040WNIVTu}X+~jwpJ()zaBeXM9j4ry`TP36H^r4{xcqzqzj@l1!)HCv0_+1$0OtXP z#Q>-Q0>FG=6%YaT12+Mz+P2Y^sgG$iF74yfLRb*mr=}$m<{E`%Mq#s2XfX;0jDjY< zOS?S`|7X2wl@s|C30W)tL;c*i{F%8FefhIXz`NIh_iO|2-3@jg1(V0X&m9LZ+yvft zGkE_k;6*c2X8|9Ozy}M!hYG=mi@--J!AE`IV}4>PTjRpxb@1z|2fG`~iqA4dC+|!521xFKz~3+5*133w&ia`05_8=P1~F41Dc4`1;LY{Eb`i z=go8ATNcVO`H}>F9xVs?ZI>Yr-|-lPcgqdJ7rX}HixUmPmnIp6FV`A`zUdHXV2%Cy zXBdLMGSeV@b)iA{i$wB5U~z0`CmRd~9PDnngJ6{RkuN>mq8 z1uF>6Zzn$Ab7}A`*IU6i+u!JV{qk$VYfZh8p3YbMUKxJb_j2<~i5Gib7<}IKd@p?k zjXaxtHt_7gGizecsL%919e#S`spM0Erv{#kJ*hs~`$YJOk?v%7pnISz)}?m!J|2EN zf!&KAjXo+q+WkoAk)ek>9`--n|4{TH@uBVqLk|u;&_SO`{o2tZIi7mg=X#Uj_Yq4qRjLE$lvVN2 zsiBh{C;cb;Pef0MC%R*y*id^%yT85vc=RLhZ>;X?-5X_l`-Jz1d%AarcaQAq-WA$4 z5=}-!(V<8(5{L}7b+iTA23k8>{jCEnv6U_Umj0cwo$Aj19nl@?j^6Fj?c(;{ZQ*U= zw(hOrts`5yw}iHgY))@ z*K1wp8`j&0X1itwXSL7lnsIr$ps7EY5Ws}bmENR3+qLK8_AMpzd7}Q+@bLM+m_nT==C9Bwy%F>1Ka}f|*~^ha)Le>!@=SR+!VdN!Fd^gOdP*U~?LzL+A0~1HbqD^itfK`vOj`6ksX%HH5|ovi|EEsR zM7oAgKaj=S=uSnBl}wKopvT?xq zU-r4IE|C&!NV7{Ds+d(X9=Vqn#;As zIj>p!{9jFXX^G!UPR;S^bV-wbIGygYVy*8-)AKafds418_?|RQ3m$TqwUxh>=&5*5 zD${yiot}Ro(PT^ZH&}j&veq%)QH;k-mVNq*P}amBPWL4vPOAy!=@PUBW*Wk# zSCd<7pE|>Jp}k$wTvKOIH$DAiEqtNDjpt6*&NxN8_GrFj)z1G`a%hR)N#@LlutK6s zm==09aRTk-NA-rReYvV!(Qf)JJ>_%Sy?Kl2ZHRY_{!4I2`pIM-L3$ClRpQqNBNae`?tNO8r41*{Ne|YQv=2IKbQa=vOcbL9?&To4C zX20o?vwqVjZ}gjvo${Nuoba21?S8uV%)$#lzx}5_v_^z|C59;)%?ZK&+tV!Ds)e+H zd+lo&xR>9;$UPYy6KRNwobO_>inzj-srV9>sZiK@6W_vm6Eqx4z~H|8{c`ZK7anXe zi68pltb*^~U=<0))J)F5PY?RbKb6RX4gJf582guhkqZyZ0FeL50jCqdWB@t-t9-Z% z089*!|E-v~L@)c=e=C7M<_gFoWpH``w*13;HSqmodiH>P#oSI|m_uNlY+|c8n6Zij zn@b>D^Wd}tm{uU?y5LmV{DyJ;lUP7n2ALb z6s(z`u*DMQVzC4TYb7WZ1bG1#Nl^T7E=V^C%FPxZw!6SXA4?cdNnjqg@1E)!#j)Tq|B2@z9ydc3T!+BAG(+0$y@OV@O zAJ2zRA)HT?fKOvp0HqAh=P;#1exU+<$p^kt1@=@El^Q^Z5KIL5%^Wz*fCTw%E1WW5 zBk*{CF*kyV8+q_|5afO*oGu_A^4ALBEQ0f!=~*K3ciiwT1IiKf123Ey@MIH6ji3(f&O+!a{4(=-CQ zPPrdWOnQ+k#X+J!hnULlx@rr&##zA$GEq?mk$xMTdGM{X!|4EAkegIE^MOLh(~96M z21+5%a>H2$VDgMS&kJWIoC|z#R>8Tj8qOL(942`w2E=K`0l_j%9Y69)JG|FB;DZS_ z^kfoww6|d9jl2z0Z{!`NU<;dpQ$|k317I$WysHAvN&wSxw3boK~8;LiqrX6E-;W;5?n4!y})i{q^YX016Ov4g>iLhSL>H?~xOg;2l1AV5$#~ z^=B~UN4^_#e&l;G=|@gV-~~4KM<%DD0C7wMk{`%}+YVqxko<@XP8Go9Ai1j$&LRNw zgyg46;dBF-GDJ@&oE31sn4UgFPbhq=0kMgKUc>wY1+xGY%q)`Mk}+>cep?}d$NOze zHdtNvz0GgOY3u^e` ztO77aN&ai0nVcd(vz5r>M`pMsg8Y;8)Ft`nHu&ZOb_D$cCQeYzNx-Zo`JXYZiAVci zOW^N@|8L6R#B?Y5w_Z4F;QTKkLQWCDBq(dWAi*uiiE@qtH>O0%QXZU`7$wt-h{&dD z(CdhN3n9}CXL1$;B>-kl$%P)UxEvl8aJnnu^ut+R1*gzS&PtKU=2fNQU0)TqAfQG< z048M6OM&ExY}!>WLqV0 zfzu7=&N4VL?MrU+!dU_MAn*3WiHRqe5k?;S z^fCEd33%QOCOqJ6UhsA{k*t!OG%N@ltO;89DKF{e7+LiemGyM0jU#^rcPlR zoBWy?d?SvTZ1g08pSOYUuo-Q6h}O{wjdkZt_*U}1h&g8biRVw~oJkq4&V$ya1JX<&_> zMS`^bT^;)cn>6?Oz{w zbLfqZHv(@Az25P9;Ps)`I$ra?HqhJA>+c=t>FDwI47?h9)&FY$E3sGnuf+S)YoPmI z>VI+gh3*%^Yz6ed^8?Re27CXr(P!0Xd!GqEGxBsd>!9y`D*V*Qlig2-o*a1svzO3C zkNHc(;vUyBNHj^p&V1T;mlMe(Q7}AnjAg&Ev?6?@XIBgzp&nboZx2pC0*C@>8Kt4bckhflm(Ip1eJ9`_Lzn zp9p+n;I@w2{I?Bs#5(-60(%_u?0e(U^b+h%w+@`^I2SlKa7)K6fm;S{?zq{1^T189 zoBTHooQ<9JpB*?8JL5kyaAWL7|BVBuW2gP62TpaI@}KHI89gbU>^^Zh7K^E|{`OeA zO5+8w116!|LJQL(xNO{7~<~=t1>h|AFWM@j&?&^(3qhho-5{-zF-nM9)*w)(`Z53O4 zTcRy$OYhF`&XFCy9sS#5+f^Dbh;CE2^=^%BRk!wTiEa_M^llDs7B}~93U3lO^==Gr z6gT#6SPt7pPtFG-|6I-LM>0cdPt*-806RlOKsjlo@5nZ9K=w2Syq78)w@%F|3#r=z7i~NiF7seL)7Y>ACAvM$+3Vl(_R z`lm;yi_^QOg{F;6O->C=9h%ZH#Xn^r&=K$l2AX0`{-*xMSfkq5-w<;(bk&FJN9wxk zLUluvlaoW5wXv`=J~XalTwvT#O-D_jW~e$@9jJ~}iB;V+-Z4Vs9Rc4Ejduhphbod4 zfr=q-hd1CIDDNl_ln;11JOR%@Sw~r*Y{1>&4!8$OJ4yqkLnW?~-r{iaNKvvVR5VoB zQ5Yy3D(EN(6b$8ef6kiglGScEJ*x0U7heOyPhDV)C+&kg2Wfb)cFAm z5;wC2iP`p%h*AlQ*ZcR4sj`u+YdoECs==Lg@8tWrDz={WpRoh_MXo57bzHHYbsu*J zbZtznA9n}z2gcO;XY7FfAXls}UA~L*LKMys$J_z^A%0dW>$ny@>puPt=ns#n_s`e? z{gE*h|2aFLKgu=h85n07_~CXye~h1+%0;e<=OT1f2pRlP+x|U1rd~hOIDv7T!Tlk2 zK<^q;aV=BU#MoePXMKvhxhg%|?q}Ji5kGJT^e6b4sa)fl^j!P6JD@+A()x_P1Nu{G zQCv|Uz*f;^<@$!t4F_;t{k3-G>GWaP)S&>qy`qp$lm)n5f>jGRmGNfU>U^penrAAU z`V2pVg7M=Tc$wq03U+duqh-FvxCME}rrz&AJEmSg(^!{D?f9AMa?R(>wfL{I0r{2Z zxK_QCiYRg-+bhE&z%2_!`c~o3^W(@9KYpH`DjPdkWpr@2zE$`OW1d*Z4z6S@WAq9| z`c~mrUQC_&yk1~0rA6AZo)uWV@^adb_O175^9Sk|<|eMZlJ<>#X@W;PetT{4b<6kF z^sy*kYaS&{6vA5j5orp_bQ&wuxjpclYz55QH)j~5=_w3#=HI8RmrZCnU+$V+8TGy|NiZtJAg_3mg^gih8Et*hZyYd=W z$O`h}Jdc#jvKZ-o@<7e?=#K9^%#lc8!y%^sZ^Ta}Sa3y0IqgU8S z#n^;(-`JCsxbkL7!wYOf6>VM7yux_Vl^oM^Ka)(sdnD7}J}Q|G(r()SG0$rHB<-YK zaZWP5^%=>uj&{@j)gj4rj&{;6yh}2@NIPjSpbhl~XfK0EsnztqXg`As`z6x^+Ex4Q zUrMI+w4vUwPfMm-X;ZyC+ElNLHq@I<8|!_CHq+itn`!@!Hq!nyZK&t@iWE2XcGEU~ zw43%&r(`;f9rc>6rg5v5*L;tfcw4`(H}Np9Mo#>Z<(Cff5QOFQPt;|>m1P(y739NT z8nR4JY7uGpNdK7}P+-C+7k;8PG~Q8(i3s)z@~8j#fqJ;Gs~iqflS#Y#cT(x@1nGna z`}x2G5G-YvgA*5S(j6%xB7$HXD>adl1SYTq5kN0A{b#}-pO$>QVZ1(nqT;MKFQ4L+ zz9<`=d z@wb9WyKBCqwizV6*0yFHIb21I3 zAE=;F^e;ymByDrZ<<#!Ai58VqL1pSJQlW`ej#6#T!woJMy!C6a;(kGkJ=##Neew5F zp*ARrPH)D#20bTlxy22(p(!-awp2KlqQF1MQ%@qY$@UuJ*IZj)?{>eNRo# z)z;*Qbr;%QlD4PLF;T02kcu^8(Oja(Qt=YfLceRvk>+qo+PdzB60P$+iH@#yNcyCq z9e$Uhbsn8iO<7>Cp?jJPNYu#=H+x0VdY*0fH58Sz zckDto9kI`FML2z$`YTgGvM=}kAA6MXsdsUD_95ii=`(`5E2#BWIV$5c@$lci=r#S# zEq>FNZ}OX-JL5McPy0n#H~( zq5CecBSEPL8h}Qi2?!A66;t4x3NQCD1!24rT_z^vVv@N2<$4MJAg6DVWhD zvs7d@Aj}|+S#B|VAZB?GhUI|*!vkjU8P_dYm<A(ztS++5QDrR}H8I~6c3@>zJ zAZF6UY*`k-F9?Kyg@m|nq`4R}Gsj}48e3qhp}j|&)*5iCxKJIY2ZfS48V-P zZi0&$oa}(Ti2`#I-Rk%}Tr3d@xHb1ns@XbNnQlp=tc_Ljg^3b+9n&?&Hdkz32*gsF?d zETk*piu*u6Pz6*2HNZGvJTQU4^R*S$F>>1^_`@7Vx3jK;s~%_o8i6JNrezAu;uM%e zDboOEI73OtFA_Hz&O~NXIKNV4mQk2(6pW^Ik-5f@c}C#|qcGnnz_3-n4&{F&n3hNg z8HI%gA-c#YEH(;DjKWf*u*@hdHwr6sft9}yU19n1yxF6M&%P8Qfte>JBHW(k_73O5weNBs!rtjz zVDEM==s?RT#qb8jOdqnv4sqM&kmj*|>lj zF1=pBPFB_NAXepZfmMB6(5pa!{q&kJ71F|LL@uzJkqfMb z&QF@$Fnq*!r1@~-P|v}^1Fi!>nuE}__wpWLPt)$muFhy*WVp@O*4&zC>Df8B!?i>E zQoXM%$G^E*8)%qSqUAqE#u>HWx8~>ctc+@*$EfdY;VafM+CxZ`?Lx43L3Dw-pnraB zzF$ioE3ec(H(xHaM5e3L`?cOztRC&Rt#xHqf8D_3j>$dR$Sc+Y&9p!+)oy#-R;ajq z{gtswf8~G{x{~A3B8@er1s%nK;z*HN)L$4Y^cN0b0A9Pdv8Kq|?IgP}Hsr24`t32h z-#(BR%k$?Atx!)4>O`1@B4+o11B^rmM?zcRIMx7@RKiJ(upDI_E|u5PYfs zh0yc;&xW4qe=783e|M;>|FO`c{SSv8>ZdiC`tJ|j*Z;XdGI($E-I31>-5I@ONSnK0 zj(1VGec)L5=)mFdp@9S8{R4Z$dj@ueqXTW>)`6Yj9Ru6KTO*s>HzwA1Hg~P3nt z^76r@bn7j0g?tN|ZV1k8o*mJiTrj7_{gdY4*4ycZy=RWzL(6VW!XGvF<+=X298RYL zpWdnk-`*-stUD{HRuPo(<*h3C^j2+Hazb_B(_D4pdtGhE2ffOc5>VMv0_sI89VxF* ztHpP?YRLs9J7~pMxGLi_Tn#Jua9169pcCKkYCAs7)wl|>RSwh+Gu#@!_*J$zf%;%E zx#bP%Ym_3$;%0~a{4eKv;;LK@fh~-oIx66HmVoUAAY0ZzWy>0vPg8DeV(B;u*8=vl~WjZL$ z0If4Yc^1eP9#L(La66`g&H&h6N94&&>tZV{sNLuwP@f19<q^ zGQR9pwzi3Cn+G>7l}>cd2is?ZY`q4Rt=FJFjcAhe?^L1k+UsBCco^*Jaf zRAmdYs5Z1sRR`LksuN99wS5D~)+kW1I00S%MKqgLwj6=_GMbfdN_%3)rkh2+Kxu1%GSqF+4>mjTj*wxM_>pn6FH*}@v?+vtOkM_=J+RH+v9Kd5mDEhp8ACKFF=`al_NCzbVEs5Ug% zR0kSesuN8#di=q6&{pDSj#dL`G+pCsLE|aY7uAr2W>ls(`C8GQy2e*V!|EDe*8Opf zuMO?4YkVCU&8+knwG&OTYYuML8;snatwW+_EI^V@@)yw(;|GpbcxaMc<7=tszDR%i zV5xz78-1;f*?eX6*j%HS_1;|LYeUD*HNFn?@1)b8j)W6^Ki3@Gj-I4zd@~kYNo&Yh zc_r=Jm(fGSRmII2oj}~%lF=K)eWeA4NJO}=HJHs;4rTLIGCHG3gWe3XWpr3^#g2?# zDDLab=)&T@?HT=K+_yiYzl{4DSDc9p>2!Q`i6O?LO`eQ?D6Ybi>X4%QL=e))N-MKz zu&&DHE3an0diqCIC`+>)Y+IJiw|!wY-;7mr(oxG;J}2$_^|kn-ArC$V!oHzSd|qUwKzHUxoMUvGPwVwzXtCxILrekVh?JrK7Zl zj3tlKzTe(w(7T6gFjJ3R`cp$lds_}=J6JlB&DVM~o3EVFlgBTo9M5uWT(IrW;w?B1 zXY+MtbU1Rw?Ypxb`<*@6d^47Mq9muDzwfCIJjv8M#Fetvf$F@p7Zm2axmbCqwZ6?By^YZb)}%_2SAthbJIA>9!XwlHZj)mGoYn^3{{(1d#qjSZ%U9&^8hh}xq1{M7?qcg>s-7|Wpho_HB zOHK<+8<-lKs!r{l5}q=miT8@`jfu(r$^EqhlVX$9Nxc)p6GtW_Cj=%8jE{|1$M=p4 zkBiobHQm*r>Y=KRDt}eKKk66#-M$dnc#JUnj?3k-a<#nI6ZVXhC7E4E%&jHv70afp z1-<#<{1G)twi^Skm`io_IKqw*X0Q>;8=}4=e{R1mY7=eUN=O-!J7mAyul=~q;)zE^ zLHL!q!SreRHqTv^`E9;E6k`QCakM)~2u~tGsRbqjbwEAP05k$kKmeEmOa-O^(}5Yl zOoF_A*5x?4XTxI-Fc+8y+yKl6763sY1S|v=0gHhpz*1ltu$;i(G3!^rXC<%-SPiTp z$Q#zexsG`@gJEDjumRWzYyvg|TY#;=Hefrj1K0_)00Q-S$Q!ls-zo{v(6#;)Y}B@X ztE9>#Z_;l0R!JQVZg=jd@njs`21I};unX7?>;d)?d#m z1?uvmwdx5bAO|o57C-{XER`t3sQ@;Dyd@XTJirb(04IPBK3eXckPj39g+LKd43q$+ zfEy?SJOp`bIhovlhfA>9;cDS%fYPy`eMB?P&(6izo#26%vSzzb9Wm4FZM z164pZPy>tu#slcZRVD(H2y$C(5SwdEhDRMx4>SOcKobxErVx0xwoQf4G+;U~1DFZS z0?-w#%mL;Sy5$&qriH-c~dO9$r!ZRC~PqbTaCgt zqp;m5>@W&D4Z^M#qtJ>QfEVnpHe*o4C`66IE~Bv9DC{u`dyT?Aqp;r~#CIJqNV^PO z{lcz8#*o7XVfPWEAdGhK3%f<5U@{6hMj<_Bfb!pMF$PIS!D?9I*v_J-#Id((4) zz45ug-uzrZ4G@=i3hcL&RRpP^ovcFO0;?Ffz$yqXu!@2Utis>|t2ns8DiAK1=-%bS z**kOMMv2ud{5V#_aDmk{Twpa07xbD(U_ZSAN`Wz-llq=rx(ZetJd5Ls*5z1y-?ffmLuMu<~!wYdV4b^a?L^Tq~>ixWFnv zF0hJ_3#>xq0;?Fgz$!>Cu!@oktit5)-&R(0@}Me1skE}1l!veyl?$w9jf;-!HbZx)9tz%nY+tAkJ*1*=GElIXaad&Fjfk9fN zIJ9wOL-z)K%>mko{04cPH@sS0-McDEOA7>7j;!cj5nds#=v^LNt}gFi7SqDV?3K>& zLUCblC`wBT^ao?XF0KEu`XcRtpLz1Md%h%=TCrNdfWD@2iT3^X=M`RTt1Gm&*ZS#u zu|r$;czw0D{>tQHZARN1nlxYOsBsRJBuhdiBgNfh%`X-=X-Vg#0_~p1EmgTN(iii3 zbECPPTEA2FYlE*&_En$nT>kub=_7AL$|6fh{SNn>V=h@ZrVV(-V^XueROo0J;xfd=h(S>YHAl^kq)?# z?dyG)V~V5QG0w_EY!s6Cq^>5HRGus|C@4!GmPbJu3IgdMJ0gA%L6-_$6$V`uXCY2hhSP7Os#- zG$@>yPM7FA&r+OChl#>?5^~6WveuxYHm$;(O+`GF9~OfSiQKVr!<_^-PmML3mXs3N zphO|J;a)1YkKRi*1f_10IJ?D1?~+`metFis$}_09L&xaNQEnf-IUHlCa2iy&pkli( zU6$qcnsmOE+cW)n>Q$V7o1-pk{PGc)D#`-idG-vm`@P&gdY8b>wH49{xQ(+FY7vyB z?#p6wpPXoj=x70#+cW*S>JmC7R$BiSaD#QZqcm-MZgYoWBp+hs&#G`H;s`xituRaEbLXSiQC1gZd?%eEPq$0 z@88kGwcl5WE-Jpxzwm#>^>+ADH?70ue?8pmeZ9RDk`E2hE(Otx zz4wV1LZ9pC?4?Z!0-x=;tN%{%j_{|FpX~ocGBFU3p6|YO=$63Ev6}|Y_-~A!Za>n0 zNIVoh(7SJhW)g*VbwvBy)YfoIa>vj%|F-Cs-c2JLLmNio>q2XjtA|zwR&*>ISfVZo zFX|2r1^o+RH}uXMnG>2Fo7p>KWLjuy$CUmiwK3d~tQ(?=GCHw$e0NRQ@2`kaCu!0> zRMJ~07KGJq=a56R2XbS!0W$GCaBNEauc#Va?Zp}bqrbx=?M&D{yjP$(D$HGV>AyEk zcvQ@%&OPfm8|KVW|IB{4we}MemuUa6Wx~U8z2A`a%CT-U)Wca8YXG?$iVXhf{G--Ejo$zBj>k73_s6}U} zeCgBMCOAd1-g|8OgynI$6dkp)8$Gph*>upux@l`>!95P$wDNfLy2`WB?J6%pzpK0y z9k22-^t{T;(d8P|WE8_U+~7ASfj^iHUS0_fpxaa)M!%`G)`6Z=*@>=G*~R)!%g}c!d(e3* zmrInz@?0ypO$N6s;0_zOCl}nC2gdiIH&gy3x-;b`(Vv;h^4h1+ugQfM(Y?uqm(b10 zg_qIY$%R+O8-zC}7=*7(GzedvlosMb?O)WUC873f=-=e(euREbF8l%gom}`|==bEp zf1&>~B}^_uHz*f8=nmyVIeI&}urAf>$v#jfC(!N5gF4Xt$%Wg{4a$Xw&>PByhtVs_ zg-6ig$%Ut=<1;P%4f;QM$lszLlnZ}{UQj+(T$hX9&{R-e9(qN&U`IzM7d-eZ=E53$ z7IR@OK8v}q4j;c<_{4sLa67(zdB`Wt_(0{-=kZO-gKoDLnG)jlP55f#LG$p{#)U)pXyd|Re6(@l2tL}la1`HM zTzIw8Rnpf=oM=zMH=z|i^F@SvgdvEd;@pJ2oH41IzP?;H9A z8?G4o1RHY=eS(d7hEBZ3(!GWb!bbPu(Wo}gF!aGS&NTGFHO?}0jWr%Nbd5DWV(1!c zeALi2*7&@kYpn4Fy=#osHI1Pc4P9f6FB$r!8h>i&muhkv`lXs&hJL9gt@n(j=u%I& zJ+BPD?0Px)Qu~WtFI;|Jc)sbm$g`c#^gTWNl<%o#8h!2Q z9_(^;1s`vJtn1Osj|h)6Jsf$c^TECchBcqod@*r<&wYazT-u*rwoPcce4B7vQ%5Ax zNi$o9Z}r{Ud@gZI&&`83xo!%cZ9mg>84YWlbt8}V#Dpe_U7Y>V?9R)kGPHm z54RucI(Yd&?0|ZpcYk>Q$iC#hz`lXKFZ)!n zevdfG-n%foa43`v1wsSCn3nufeu2GvUWhHf=bzg@C#rpUt+TRZc&cw|^OQuOr)jX! z)fjAOukWh6JXz3w^NMwMLx_eIz;cM)^T~69YnLBQ?kB`f5wQ{9N;@llqEJER~``t2n0C3Z`#TCJk#X zoyxBDiivAwX}(qUn=3ng0cEtf}YKV2%VAswst9@~HFz%@zE;cE1h3tX+9 zWGB;AmdVj1`>&JaD`u{hMb2GD${PeQk5OgZEgaXPFVz%oO-P9Xp+H!4{MhbjMskg1 zW8o@O5#^WABU->TR%CKCqSq}OX-uttrmrrOAEIomT&tdZFGYE#0Om0kGGh6qz`c`- zw8vW~N*gzv-lZ3`vAB)tm$}YV`uR2V^cORg{!EUhf5mkQ>V0KQtu;(v9pgmZtu=&b zS)rcW#+$RR+-Mt9VIxyAopGwcopsH(T&_y%HZ^#P8U-IE-NL9a9;BYSk=&A^b(Tb~ zkSnY>wrB6zYi{s7t|gUkT&tdMxlB=UCP(w_y7!HJOs#IFuO^eD_sxckn;h{CzI%K6lYnx`5%G-~hylOqoD^9Lhe?eB$C1=taV_4D&bP3hk`K9!- z7@jIgIdlhVLwDH90xo_Q9fBX%qGw$`JGH_{EwQ@3lD(NX8E?4ESH3!?RzK4>fpMI{ zebsVxgRd=!DP>g0;n*mj7Np2a8^_Qazf!a8Z68c)`YfF1XeFuJ7xOxbPR+m69`TZ%jqmC*s`HYtcWZN-v94J>w*Ud$({vh-!gPs_r<_eRB8lV<%7PS%4SP zP=nQU_A$w1t+1Ltu|_tPeo->@(kg)~>EAydrWFEdwLsT*B-0cBBAMpiESdi5Cdst# zSCZ*HS|#w#Z%U@Bvy$nJf0j&(O01@z&?3sSnYQ&yrhlVV0?!ZAg$8N0KtU90|NZaQ{tb1?{UOzY zMkWY@3E>Y-dZ(PdxdmOjdMB=p{+@TVvwqEr&Q_W(&o1cE_>_v*IRW^8GYl^gQL@v*{c(Q<8J9_Eaz5DtNrYdBLMl7I;jQ z1)hRof=F55aZna`1j+(WX&=ENBx;;xlMw!*RO5Ky!z26b)t6 zX+NDgyJlrcDcxWt9=f$kymVKUc<6>I@ih}F+6mQkmz2nqF(qX}903F~GEMF1l7}3Ejq}1$4pEQo4;x z3+Sq)Uclue)BqLDI|b)r2aQ4GvmbjLib+kSn>18<=;X=@ifE;Y66HXVQ^D&Gj!A!Z z%7)2qw8~3IS5?x{RaJC!RWTiHPtsF%m*c_oJz^oXUK<`VGaXIO20dCqZ4B*+vo zZ-LA3kReO2)=@~>z4`5gqAo(!WkOt`{PULKDJ!5`j6NagS<3ejD(M#U+UXYaii7YI z=z)?bJG~_dLM7c|Ua5~zfLn~;Vc9NQX}rg-J|K>)uQA?cS08}`RO5}7?Er_bg{Fs6 zp6M?ug=P3S%5oHrp4a76&|W{X(SvNPK{i%IXtFM)k5CDijakUlIWm=4k%bmyp@b|f zKo(XClyAAnK{Il&i0(yi4sy_i95f*Z%lZgbE863jaiuOvMys5 zW;>wBn1k64Fd1{ua6mkrKlVsmD6}r7sRfH^=&CI3Z|aN-6BOg)YB)W8{KWL}u8(l& zaErES`GnWw1ynZlra;M#-tu-TD^EU^l_!tN%2O0MCwQD)gkmZxkBe@3PdOEbr;Lij zW2KUy_amW_ZfH+lC&5f5;VBmA{b;6=@VJ@@)l?jwl0o=UNqEYG1UXJc;ZeIF_Ze>H z^QqDN(I}Y(!&@s$u(6n~4R$52b9P+6LyHEl6Rrp6_)yiP-nQ3jFQxL!PnXAN`Pr%b z#@T$?RP&>!*++{nf6OBd2Wmf^HM@FdewRUUlC=~>})haPlnifBno*j~_4MUR&QJJ30-^msY2rZ2DxwPER)M*JPvpnTXhe$%ZYMY}j_m<^%Hk2-SdjkdO=50Tn0& z$^k!617MpW8@3g)VFMvs1yBWuJ_2_Cv0?Wf8#e2)xqy5iUJSYcbAnI=lmULA8ZgnV zX|n)%fETD@eqH3U0=a+#C;`d=KVa%1Sb;pC5D@wZW+^O9*Z?aEo|Dv5X;ytGX z-QnB99npCBe8;)&TVk|FPWYz4*`YJZGhN!xSE)sFyPr=y*YRxZnU1G>pAw()KN)+X zqdU+Y?Mgo0{aEDDrbmQ_0}l;7IPgI5V$X%>g`wo|y}~`N&-(6ax+AEGk4YC1Fp=BdWyO)NSic5Q!M3<=Sot{*(0e!TywL!L#);xkG2_OKU%0 zmpV}YBfOpZi$6@$ulNCUyj-gMOIq~rR!VDs&Bg1T{$A>U7X9@9NQ>c{WVf7_?vB)# zDt}0esyfjpwou$D(k)ulGqF_pW1)VD7EO)O(mu_HC=JYwBSIzY_&`zWG)i)dp5zuS ze6Su8JBy_pQK73f*6RveSK+liEX_4}yR5_9sS%w@ z<>{1;Ha(foa4{9JK0TRjdNSMeWJ023w&}@ae^SYW7E0zTS8KUCnLptN=*j$PT4c%m zSz2Vt{CQf;NM@TMnaqtCv1ICL(UYkkrIa@4QHbalbf-mj!Lqc-F6c>%>_&^|iH~I7 zXc5EZncF9la@=SUjooNCjdCfX=Tbz!(Nbrz8x3)x%v#N_mdd2BUY%Jt@dNa@-<%fN zBX$cHuXp+bsRL-?EIgqPrbU+4hteWTYgA8bG&8MHJ*}=?^iWaf1s)?DNU4kJsbhaq z_W-U#$@(5woQl`iuTIwc`~ViO+ACbV-toDOddMzzyeY3y>&Q`xX?1G0EV|}8AmS4K-m~x|7SM|A5Klpokf443*3|R*C zAxpjY=}HyvebNVWrc&Pc1W;xyWZXl0bNIhgU7|J3Gnws+_ntg;;`mK^@0;E&R?W4f zGM#JHyTyu`l8Q{~otn*|dMUM+jImSfN)1=2cj?a|y%ho|Gv*6(w5C~h&&5~srQAhF z_C`+_V>6DQoQe%srpKm`X(-R+*s&SU73#5BLV7&{C^I^RCE6GNl?E8PR_E#i4F0dz zx&ssVS*d7nEqXLmcBQTyP3d$MF3~o{> z?9#%&%P-P8Un?}Pgi`%3Fy2Y;*Nv&Xk|~^!Nqq<&<$&RI8rsiLSU;x1TBfRrvBBWJ zY8Wfq_(a2)il;JVvl(X^-1_*$z`OH`w4N=hS#wXWE>Ie|D!oh&QN~UdKnr6oBOhSY ze5Z<~Rcw5*EpW{UV-r`EDjcp_FC075RFuil`((c0NuY zQ(-An<;&y;<>QPoRaP@)lNcu$+#ezzXL7~*y9<-hngmd0bP4e+BeYXz@v~A{#oinE5@l096HB1f8(u>Aik!@(`%3Q8i z&$drdN*e@FW^@Uky6))gJbo%2jUQLV^A1|dn3goh&bu4NROn@@su}$T_f>h9?X@?5 zOvU4wvO30EgFEZ6>;kSz&#z8O<2V7dFgk?J4>waP$o0^v_;I~@=DC=%(oBwKUbc5$ zXiSA3rm8xVqt9ygdt)J2si#$=XpR#=nb9F=dRkor<0Xk+!;6l$YazL=XzC(_ zu81cNI!c+2G_~{)=JIU!>HCYvROw;LsxvuS$7XB(E#V4T;ym3Hr6vKC86AwYW1P^g zMUPSgAh^t7j<4U_ek8hk?}k&+Q>Rb*M3X>0czP@M{iR$Vslbox=V^xOQl`|%lhhQ( zf1>SGv+3dYCDRldQT-O}y|(>Nl4;}-$#e((bN^8?y+-@4t%?(V@sMPSm03+P{q3e9 z)mgLw+c#)PHA2Iw|EWo)d+1*kZNBy{4XLibNW-W1)8=bmlT5`lr1~mtytb5vRe$`t zWI9BfuZb6Ev$kJIrrOU*rgucEDV&r{KWnm@PSgHt*n6$=Pv8B*kF615OR8~?323yG zz%juz(#D*5O|2iuxH z!oj}IECeE+q^{f6&2>&W~_#G4%suOc;aJ zdcwwvM^)cPQ0>%DmTwLU-SLj z6tOkQOw9o09d3l;JrKvGe*Ey+g{BX6;-&~RK^pp-3xe9`=c6*oYvbDn+und`# zslCIaG(F_E&nUJ*^ehLQ{~5~Mn$ghBUGc3UXAK={7hUyDv?|vPh^&QbL@st&X@{4 ztO~BqKxQ{*I++s>IJuWgOS0XPlFrT$0JrM%LP_>9mfivWzLKW~?%}PYMAouxnDu z#iCmCx($IWDSe+0kMP?rGp^&AvPQ-RgZrc~MH_1M7i*U{PqI{Qn36^F6@^Dxf4F)n zGu#3wG1`UR>&=q1@iSBT$2IZ%gOU=aB+bzq@7fk+;!18x;T!r6$$4p!c1Uhj>}ip2 zj$Ej%|E8;0Yrim==1Q_opp3n)9qAL;T*AvulG#3+MmUi)(4h@ANi>uE#!|EP^CpvJ z4Q-G-`^Mu3_n=+M;tsy=G2Ps@km$o-Q?eqv&F(#bihN>FxY0 z1zaoJ+1YBR5K)+*ZTHSwm|w`la6J7A>ahP0aHW`sXd_=${8mXo zue(F*AGUpP$(HbQ*|h|L>*6H~Ri#X!kz6jWlOjmU#$1Yj-mRV#>^jpki38l9bQdvxYQZt;d_tciBm0$;REnZY275V8j znb}~u7{{Lf>*X3!*W?=YV$Ek7$}&0nUe7-Nw_;3{UZ$*`agxD3I{(+g=Kt!ZVwGGM zyZ_mwa8bapr_7AM3K>6WG$-KWT2hJRTJ=O0GbI&9YJpJwxY4&RO_fPKkAAL+#iw8z zDHMfSEIx4O3)3)+Qxd<@YB61;k86Lc)%0q;)wGm8vj3VkHb44V$z-8_k33A%j_KdG z>AQNze@Ui)|B+<+)SZ&aOW)UT-XWP*KOmX@fxfM8rhmErDVd)9lw_Jm-`Ib%S27)? zZ|p1oD4FhmN-|BRe_x^R>W#F)`LF4_`ZoIK{+v{2dSOH|h3EtO@95+DAWc~o=M zJzi&&dow>d6%DRTk4B+@7i@VZ$7&)ASGI74dTbWa`C@968*ZntD9b4K)UEuiR5Z92 zJsPTjQ{9;yI~v=#LOmK7;TDB3@uQ7%Z|7=K@#1Rrczujc!Lrsd71lCUO^gi&_f>;| z*#>;t##B6&DVxnW)8NiJ&K=>ZSea;FSmm%eEdo}$%Vo?qG<)q3ca&>Ml?&IZmy4Zg zD$3;OEu5_xuxm_(rA(DClcT*H*;|Rb$5dI(lucrsU~pem8rg=p_i)AfZT%eOfhb_^ zm_>j)moZyDUOU9Sm#a$UBUjDy5&DXlzBI?q$9-ceEM=;Enf#!9+&`wuYNl)w;{=2I zL*(NDu2_FRN3$&3Q+sGkgA;I|L%Fow3`~{zx7&8pShI=uc%@EHjR3%`L1O8B@KApN{#YD z`uE(osr`JjWcqs=^omiVTzZ=t+%)i2M-B5YksaYCYMB3%WHp_mK`&*7)zn3e^2wX5 zrnhUXre+%S`Z*1Fo%w`ha!}*Eiw3=BJRzCB+bzXSyQxwB9@!6mmKx;M^iOCq2`9eS zS@ciVi15Za!}niPLTLD{zQ!dRgi0Vg1>v5Sq7`~ar^ zAVdga95ewrfElm=5?}>n0ESG84af!Z0GJRe4!{Yx02Rmw3V=ewk_3yV@LCakih&ZK z6o|XQGQb0r174s4fVqj{1N;Q}^(r{4ff_)d;Wb4BOh67`1~BfXNPrcP0a*GeHUQ>C zN*-X3gRp;4oCF@#*In>Yfqb969Pyc7>m4tN2WS1Of&5AXw3Ks6wA z65=9g0&)N|U;!k+3dn#0*nnI@I-)SepE8Q=lR0WVMiR02N04^#owKn)-aBmLqq zIZcFgOmpA^`zFN#NCf#UE1WQeR20AlQZWtO^woFabFL?0FRnAOThYQ;`$}umQP1JP))3 z4!{Y}Y$b|4kPj39g+LJin=hpV$Zw_%11=R1l|rBhCDh1ARmCOl2Qm10mVQGPztz#GQb0r174tl z5LaM{srU#ys-O46rwV{Av{C~I%>)rJ0XcvfumBQZ1!O=0Y(OrM2iO4z-~?bUr>HFb zrIeNO+iqki=6cbqoKOy6z81a836+2kz(_v5$_bdqMGL7AM8E{VGEy-E766u9iWQIn z1+W3RKpr8k*x_^lPQV4I0PIwi0-z8m0$?GolmMlG8z=)jKsn$ADu7DB2l#<1pc<$F z#3q6%4(0%6zyee>Q--`#NmO8PtoVT{pc<$Fga|~19-y2cf58hUEcs~18v^Ec(3_u71yln<4?zS>Kn`Fg@Th*l0v`#m z0y3ZgHUJiaN*+K4&_oBEPJqk?Df&P@PyiGHML;nCn?j`&fMMbPX7A18qbTzK|L)El z-AU%kWO7X=)02cNkdWaL5Ou<#;(-Y$DhOma6a^szD5%Ixyw=-faqaa^yl;tDyiIg> z)pb|NuKU?l_aOV(TUQfT_f~%IS5?elqzwaNv$M@GT&vbQlz2;rj$5dBW)mtkA z{6IN?afVt25Cn7}1XKc5Ks6z0s2uO1Jinq4wH&|#SOFVg2UI`KHvbHanJ?00S{0Bc!5H|2NVItKnYMvP+u*>svjsP2uoiLU`quM z1au$-R1(zJs<2uONK%4`Za$g<F&13aESAhQCf6 zW6Zs=aFTK3oz95SxM)mWPV=cAWB*aEaB=vgesTfVaN^(zohR&F*t#&hu>bh>;~R|F zr<11BXv)4_bw_A1HbZ~wbQ%@;g#8#YMt;xkwR*<&j*S_v&67fQIn<>`^){p7J-gp% z-dtX7>iW_zk@__@Xi8wZX7KH(zha_>eZ1J($%U#FRI0 z>AQq(6tesg^b>lpkR|HAB&ibC-O?wA>@Ix1NXj2ZBq1f9Ly^9WsU(^CIdoG-!2px0 zVhp9MAMhNSuJvehM&YqcY!YKl%6i)F!Yx9Il~-XNm6R-%5Umo{okXLl*ImYDRy>9E zp-n%tVoV5`r6+`W>A9I&$pJLlzh6_%2KyYB=B@jdjEa7yRdoQ3mhDw^O439_=}(WX zLX&4V$g(@0s7hFO5_xtH>@qxUn@DNqPbi7}A$bWC8KM#2U|O>&c!EK4aj6e2dxrp-XjmwX1|6e($Hbt#wv`ys~j_?-YE8?jaWoFUPQTUXAh%O ztQ(%&Y9`GQy;{D$DWgImOBG}+V+=?YyTd00omG*AqM&|okW>i+Jv)unPg#Ap6N zes+=N3fUgw!c`q?s7sodyn#c-ps^lbaj+U1tJB0_^Z}Y%(?n5>Q{omMET`*-ib1Pd zdNn-y9~gsKx9E%TRC{0)kHOPi`k2DVp<<-AL&azv2gJma#a-BQKvXg&G;pXGm5-E2 zQ``Ia_QT0hAekF3eSq(vtnoUE{`pbF6%sF@bv!E`c55K;$Bj}xUs3dv7vGBl>SBS zi)e6#|77{3@Cp6QrCcldCGY3c{*Yht*nFe@?p*3<{qDG#x=gOe<>_71qSK<}cD!Lq zd$_-TaB}D5&bp?$XsxH#aK1OGT91thjcF$zJcBf*W@9duXg`>>k z3)&jDOTnBDLJ5sD3wr5N4jO-KtF3T5YEgUN5hC>n%q$9 znbcX+RMR)Mb?jhuw8|4|3d-a`C{*4`F4kL1!X=^NzM_z?uh8S|Eog@~AxB?+G;dIA zRl{nRwU-L%n0;2~uc?rlk54J2#5vNn181{BS`s;@Ks27@Jh~vkHcG}{E_8hz_cV&I z4Q|#wP01jfp?el5gYZ%AS&|IqMHWb&Q~M>28fW=PSeZNv>5+6DX>;>uKlV^e5pDsFi7T9ak zMJLY!`+{`Q$+N(ITFO~4WL)wrus5emo;(ZeDNdD#QYX&>dy0$Vq3GmUU_X@(nc98P zPS+aQm^rpQ(5+Y5AF{+7JEC{T?i##9zQc2S=(g~!T}JOM4d3bA-S_SO_Q5u}&2v+T zevulkZ@RAUntk6IxKg^peVLx9-xb-}cyaTNmJ1Wx+O~AYx>|ZS_igGwe{iF`(X%0R zUijRG^-bqQ&yKBYUE98|)YsU5%HSe-k>}*lNnsl2*R(KteC)W^W7`+V^F8xIbHfb{k*=eAj|$J}oZU66 zcV^!a{WAvXr^qucG&MY>vwlxq&!oLI`^FE9mBzSf%pbWq3N-qgjdvz{rq>?(v;S4` z`*Pobzb`$l>@NBL|Gv=g%ZVTV>zLnC!}0bg|9vU4NKzp31uLK(>$a>pck8-2t2b}n za8~`ay6{ZSx-~3N$9|^ijRB1*dWt2WXVodcU4P!KKa;H##>cW-{$1m2mUQb@KB8$& zas_F4@~5#%%kzm7HX=D0!IE2%eDbj5>qYYQNWhangH>AIE#Lm&dAIIP{BHRSN;8XD zJBwROf3OGN|5>ckvioG$%?DYFubXw2_?C3mKF3o_Q$Af{oOi2n%-0i^4^NcN#%?pw zITtPaoDx0pXbp^0BJrT+-z zaSBT`g(spvLy2BC6WQPXZ3N$^QaJUrp`;tdX_H(TO8$zO{PO9>d?d$dV}pcw+N303 zFOsL6Hm{n=?|G&4GBUYyY9wj$RA%y2ZZiGBp8T-9W+u9+@R=CC6PL{}lc#1hxyMZY z_jl%BAWUW#i!ga8c{-DO&E%`+|KorKKN&z` zo{QH_oo!#;{3y&osiE{Nbf8P+g}Y<@Ga@OH>%~Dxt{^>^dIPJpj18Ug5TtTwofk+_ zYI+)}^+GD;fP9Y$(e30yPtL~S=g<)>TSxE=(I4!|zyJGYqOlh?@5lGE(xh$T)-&aZ zjMvEz%;Z0R=(hh1H=o~nQj({;V%{{9&u;nCsT*4^J%fPQP;}k`Em- ze!EUdo-Whx@YK@G?mxaU{M+d^0mIpCVk*B);1BlahX2S+Dt$ctt>H;|aZ}PvhX2@1 zeqDIpkLV1+t=GrCPb3oN8sXraDe)JdP?dW6JaWFO=#Q()Esv>+d!wrCxK2|(eMD8( z(&yLbs>&iwQ(jdyW$e|Oa>s+JQb3>U&sG)X0owO|Rr!3as%)gsZ|_x=GwAb^)v9v* zJ*x6*r>e}1s>%}`s!~lKDWXVsU-8lz|7&lSW^A?N3CLUqR!QD2{>UavtQ|(7W}q?7 zo#vF(WsXYT5aOpsA8$2Zx6qzt71%JAZ?I#7Gkto@XiZHl-jvvQio6+(E{N35a^RQO z@WkkMc<5O4B|9jVTxs*P=tFiuY#bA-o6+b2b3im=%XwmSemQh3`ZJ`7t>9_VnIU~F zn`^(QgEi|6&oQ~f=85G!nPSV*r!^0iHGNt$wxT1E)-LndYUvZ3v8u!xI}bG4JPlkK zWAk*8HlA{VkzZ||#R&Y4iLj&lp>n5MOL6M=`ZNx#{L#>_0GiSZsdB0f~7m zrgf*YI(UfK?z0|nep`;a^tK(6OQU8VSK$Dmm>Ol&?bMgc`%1Iq3ae;h;rs)=wfq#Sd}=3hEh5tGp|FN$`0OC znmA~$fGCEcg!X;&C1cz}&QId55DFm|h2TRWl%NpGPza?g|3Ebgp&+#o?qP*M-HwOs z=9|zlG?^8?37zQ<*o3ZYeA5Oh1il-(7#*-%b!s8-y_~5z=9~NnZz@YI1in{AN2~E_ zv9qMR@nPprWVfrbnKG+TxTUxU1pL!8<&6^xkgldE8N!)A^kyqv>U5;6%Bt>88#bn{I5qA$)^; zeb;sJbzRp+ul3NRIPx`3SIbv-eJlE{&a0ZPlCNsGa`1}IE4nU^Ufy+C^fJ$7y{&R< zS0b8-#Y6FiU4uJ&jbL5APu^oRT&kUHw0)JM%ON9pbZxOwxvR9u(Cey~+8T~-KdNtz z(Q$NMMLasgGoyEUYj`JTWn$V_eUeeN|GWu16}G%M)cCB|Sy^3MH@Z ziMW~_iM$T2$G*=hQLF8s(y8>zlJx$WkB;nXEq*Zbh(P`lb03~!39ad^=cQ~8RVy+bMQi#4Ygfl`RZyGKgur}|E(@mh6E(hB_ zf`rS#<|gDf5^`GzY6ro$mk^>HxEy3P?My(&aF>;gb`_A(E-xAFLPt;+x>&lrMflH|aq#LWHKmgDIh0Y1e3_$~m0X9O14as4{Z`c4EHl~J+pgbgHNqe0k6k2o9J!A4-PAs1|T1sg!Y#!j%o5^RJ78{xnP zBwz#r_0=THbAf!o4S0bd+ooe1z`Bi>W32+H1Y|m|HP+Xk`sUMW0O3l&(nzoYtouCc zG+&G$4HclGXeQ(XtS`0PMr*8}GkP-fKFh3cG3!RmItsHs!mLv;>k7>J<+ARxtg9?K z!%_!$BArVF*4-6dS$TI=)<>0fDP`S9S-()$C6x66Wj#NO=^E7FeMHj$cpuT=eME!v z5v>%kBnWUmqLl$~KBB?-hz92)nibx0s4q7G-bbjDH8yq->;SxvXifm$M>KdJp)-sC z?<3T?nvf5``-lebBbo)!05<^VBO08KXmCD4S2DpdK=1%X0}0A(0INZu3Xr8%99e<~ zC?+H?mkMn0>DUYe0XafYfl?pHh0c9US1M&bDPykf0ZTuxDzph=Wfx^^)KQ$1LYM9#}o+y+WRh=4OPFswgXKTv} z(BIomKlAMN;nnGWYkc@@?OVnjS4GBk+iUVmWQW$cU2^#A>Ahf)eyI_dm_N=SUn;+_ zQVpqXN4Kpezx0s%9M!>o)4T4C-rICfwA0hs+Y##sb@bgW-`#ar|DEl3cHYr-d-QhC z?Y+0fZVTPkcWdjd;aj8M^?WyE#BS*{nqG1EW;V6AwuRdoZW_F?;l@Gw-S5A?@4D9O z`mPOK8@nb%?|nm8$G+8mRl`+-S9V_6bftV{*A>w#JXb_7H+t@H7M|R-E4s_GtCxJf zgf0#5?7w92;?9ek$n#6nMe;>mJEA*0J9@XrwuiRIE(~4RcR}j~z1w2jLfc|nLtC4+ zG{mAUZJT>G4Vu-#?Kj%@=hPZMdUAZBvG*9Y zhNc&K{I#b){)@d?x-qq8Ky`xSJTX=?D2SXRUgglFMy}u2JRR58(0eCs9gs^edbIIC zJunYAjbOg~A-_ivs*fd@lH?4f2BxM4=A;JJrUo31bma&E*T8&9HTM3##wVX(^#8u5 zOqry{@L1jFv$fQCIQC-%Tlayxl@!~V^ae&Qv>r-1M5=*-p1DMPySFd zN4EOO6wMg_rX&el#K2(O)09GFzi`5FOK3;>>$-vPF?`gp5e5^jb2&+p8qClQ&P7PSN zoxDZn1$&CsFO;MNUJ0fKYEl9{;ncthDSQZKCgVO~n{{LqyW z_;FckpxaYrKh+xVp+SlIuEt9fJNI0&?_&4Gk&9Y(bZp;yp>$#W1=c% z?OWfvKD55~oaj07IbCNroh_f;xvpv5;M&f$4QpH0bgbSRm7?{=Pj8s*k@p$>=R59< zha!E)#EuCa(|dI6Xb-)diyq}Us%uVkjy$L9$fhIZBRgj|%^sZ9$+|7c%mv{-7Ot! zgk9QLv$N^ccCkCfVG+qi7e}NiV=0sTrYX3-ol!Et#KtjJrL1S@h`L({@+>uyNwTz< zXqB+;kQy^|M7>!graiF;G0_nf3dKw($;^E?zmrk0j7e1v=TINc^c_)e5t2NE%g7{I z;!Z!X?v|E`W5&9r8e(^f!y=N4V}>+k(lBPu(swfo2AI^C;T+0R`fjPWW|SPy#Oe=X zO1IRqH1mii_TL8C-K{aNv1dSCWW7BZtiN^kDb_oZ!Nvu7`Nq+GwJ8%%mhgcg!zP}* zGnrt|e79;`Mz~lfuH%(qCTcZo0lO zo?#e=O5OZ&T}DcCgvH&-FOQ7ZR3rFUtxXOZV;`%XThMX9cilbFxcIT!r3IY_Z+GW7 zmRs);Qn%bO(V2&Cx;C1>9@8sEm(2>M$xZOy1C*Eor7&}2^emedX5(qn^@YFBO#IYn z=Eu4}DU$8{SPuvVvKxy~6xV@=wvBN5zy~u*j%`g$i;=i%{j6 z{O0KcDT#T$JtCC&U1l1^q?tbO5c6X_DiXs6T7(!kBa8X59utDxnt7xtOACl9o8IaW z^J6_OQo#mVgbFt!i}|sh5Q5x{Z0E;%Qpj+#Bq7V~%3^-3JwlM5JS$08mNpR&dw#4g zpt zl!Y`f;DbE7(n5m+zM5@UZl-|&!DV*k@dee&e9UX~yh;3MJ;%q~pjKZmfhr@l ze5ITBXoE<_6H7ux9BK%ZF@Yq9ewxzFd$cj5V1P+gF@{ps4;XKn&b80^8HL9(vATo! zjbn8;30YojS5bZs*R{`Pk<=_ZAtlNVT1lrqd_8m7wPX|=g=?Q!M&S{;_Sqt&czLx^ zzOr)dvsLJrg(q}*;br04XIn zM(JJqY|ki}g-?PVLXc(d@Lc<(j?$fakq|I5DFj6(J6Xntap?3s-6>>Q*^SgE!KEU#S#Uy)7o3aD?LR`F1iLayj$+c@ct+vTOxl|e%KYNOv(aJt zBxn^W&GHjUqWmD0^hUtfhfcgS4<%n+W(vNrJG7wK&}GfyEud>$qIVUbhtZtU-2Gw= zIU+c9@xn#Ntva3}c@;Ua|8k*WH2lE2Lc1avjLo)%jgJ1hTJ6f@HX7+$Z0xBhK2Ezz zY{OUk=?$zj9`9l4n?Vob`BGHcVR(Kru5gT`CGw?{8_pmDPFk>N%Jk{9lc=PBOGp{5 z?~eC-YuWZ<#sDMF!7=v47`kPfJ_|0`wDsI`HmzH$uUQ}6qRY#Z+WJI2ydp*Y>ZCdw zb=*;1WhtI4O`ttgMmJ;TN!zax8qlRhXz~MBz!b`cbLh61emc%;GfD=SSS{m(l=Wnb zQEBR=?bit{epOE;3rFUHx3{6zH${lB97>W9<$27)1Mdw&kY6XWN%yck@YcUJZdUx+ zqwUH`RGIzx3cIq7=5zlqRbsEBQLgrrROODBY|8XYXp}2W7rFjCn$huEn_^H!cEX=& zlUj?k=!dY08(+ta7n&{m-YX#xLs1J?%YKnyf~3qX-qF z$s&6#ilkeN*zI+tITqT~KUN;2xK*R;3-ax;?@L>5Jb|_@T5!Ee?nDBA#FD_%yt(L7 z4_lLox)h<0SacGQB}G!01bQt>I(7e`=mdSttvwP|ye&FypgmI-t4;yg=o{_*E)R#$s-)$SIz-G-i~|9sU5k8}DQ zv@aGi1Bs&bGs=v-C#MJ6n;k~|-)*JsJ-M>QXxd#DB=MD3(4NQ$mJ*v_w*@q3#%QxcH>4O&sbQ9A1cL&ePJs$9&`E2P@W|)4-4(W)9@gj zF0wqv==orJzTy7Tro~k?qFN#>lDb%sc{oyR(ZS2;6Nz9gRYxIBg|_I}%=9BFKlLc6 zV_VAJg%K8Ju&|v)#wo(6T{FwR`3x3W5AxiwutGlrY|#^B1ewJx)3GffDP%y(&a}xxuPk0$y_AS338V9KTN%#DJmWgM-!%@$h%M}de2uT0R-F21iJw*ZP+k3!e;7%k>G2|zF#qG@=e$HPz$(g@<M|o}3;u+%-;%Pmj=sMAB}Q6x~_EPx^|D&CRnMM%%W4!?;ABQ)ooabLLqoo_xH2 zYL!d=@4jF4;tDO5Rii&g_8RAJoTaimkXxd|K}Co~XH+dl$5YeC7|t4Jt}#=0yNuU# zx6^3eUFU9Z4)|5NWAOy&=Y%Dh+z5Y3=jWcOZkvNe5U|Jdbo+PuaVAx;BdA2qFyg_P zbVtS9|**%J>De3M}PKt^|SUi=Du$C?*TIE^be|wVWx1@```Cm%U zS8%1UdlaSPLi5BPl8xP^lzMF7xnV2xql_(dq!W@fpC_Z#IyNQP-9a_l^W?%xHy6Zq zijELuH~U`P+37ch?n}`xZC(rROGa4n(=TPnX|EtHQ_ajxgmhXG5<60FuoG|$6|yDM zVZj~BVzds}e8xZJ!}x)yW|z59e^*`JvZ2Cfv$rJ<_<>N!x<~{z4iz@O4uvlkWTEHa z!Z%tcISZ*OLlb?uWM4e}kHA^)7AXsMhLpOCLrTfEkTUu2$0+iakmBp9kfcUg`siD) z-talqrCxt`s8Mjt@Coj26qQHQ9#NU(wb4QewaIeH!T*@d^sFT9zeygWOz@SBbA zSa(Sa(m1CGw~17y9YTfM;b8)$sWg7$oD@97TO?_JyO85Xpy|C-0!QYW;@d*Tv`WZw ztFmZ%-z^0B69nGF9%;Uf#k!lVXLL<*vrsTi5{lfU0w#c&V9>G%^7X@XP4S(K;z1@j zZa6c$rnn`eU=5S1XRJ$EKVTC7bdw7j8HJ}Zv002qq^zfPP4QhJ#gEB(RA>_=(8`#{ zn9i@l!Tu?36;hNMi;(6A$HA0*!#Q*@rEBrJEu&xwlhTKC=2jbf^N>(wk35?@X z)(HJgNA%uB3?x6fnlt3$E9%H(4JlH?Qok9wQNQ;mbGQung=opj^aJdgBgWK^q%G+A;rt9jq;e) zdzy!Zj#+p@mls|Z?`a;%D45lInn#5s&+Fm8r+G{yG&3iJMCP)1PxE+2$t>Q}JRt;G z=CXKC^P~_kGbsc`COc_+3G>UGWahi=o{WN7y{GBQC^^FSH1%=T+$~A_pAxdH><;HW zO?=)LPHG~hCeup#yg={%Px#8F^i#9x4*F>SC9gR2{{IO2y!CIJ5~Zfof77IZ?bK|l z({ZOQ|f9FRVJ-?u5}U0_pW>I?8)niz1>_iW1dx7w7I z^!bvSORs&3TwoTEOP)RCX=g6=0r&uu14{IyN`L3>cy#{XsH$JGH>IlI$lw2O-n1sl zon1dIvTGh`k$rxovwE@gOh(C3yjXfRqwr{6EIlWb`Q2ayFP6GRO0)cgk|@8CzF6A- zyeatnXnMQ7kQB+bx7&+C!OWLX9)GyY&b`ZVeh`4x_hQuSjK@Ayl{-S@d>$T?leB z@UWeYH^?`HjA@sU<#uK9$o)Mb$WNXudb@pJD3~S*MQ+k4d%OK0qj(m*-QLV7c$mH2 z(mis&l~H&^-XPx=QtX&y>kaaULd85TLX{tvEWAO!lTk1$Z;(IAC^-smkUti}{Iq_E zU2bm>NA3;sT_I(bqmUNm2<@aFNWPxA{`X!+!K}PN?#(DU3U82oLYUvSFv-thc!T_j zNM#n8P!YET$Rzzh^7Wx2OV=y%rx^tg(;H;EUXkx-6wca%$8H+wMo zACc57J0T^?4q8dyC47CT>}-6bg%RFd5RSi0HSiNF?89C3a`{pf9IS0Xi_~ zvNU+#O#Kg36L(#bQWM|%1Io)G1N+(u% zwP%IwsP3xI2^D6mBnee(=6@m=+`jDn-MtM+6R&iby}D`ZE0 zSAAV1HOo#&iL%RhS55be^hQR(QTT=WUPj>&`GxwvkYeRE3cpZ45JG0@31MD(+4zNe zGoxa5excqHnmoI3<|Ipprbq7!Po=(6(*)t6Co6n>$8l2Ldx zexZIUl=&qFUrw@gcz&VY7fH<$6jGuDp*7?Yimzw%3-#5{OvR^1(e3q7kh&Ao=SNhtUhcCipHt2HIvVR% zNq@V@tNaPn&fQNn>>c!(pZ~f|xt|>1%%QgKpHj{G92)N?wb+z$Y5A2$&WLL2l6~J52p4qj(k_rv98!a1;C+7E=6>psQ529i~1JQs%)C z(){3L(P8SZ83nWIF!gCh$x(Ee`b-G(avV*EsR1EnmZOjs~e9j5*vWO=cTq{GxdMN+fu zgp??|5qFsSS4P26beQ^gM&S{4nEH>9;^mcfhpGPx9kcL+E-$=q=rEPi{#_S;gWA7O z{o1DdmD;|qqECQo=#NqR_dM!}^2e?caZ=w(lFL zhF(pd=ijs`P1|kCU#Mo@N^Rdo&r!vjYUgvPmj3SVXr>FQoqw4_?k#B+iqfgn`Gjic zM=rK2Z-?yTm1e4)e@27$Hbkg1{~nw2#N%?|$5cDN{Z?K(pG_Uz)x>{qxnhPdhdRQO zw-C24Xl9$9t1z?xBe>Y2^FQ+Np6@anx0g>P3%t4XKMehiwvi zJSsBu2c7N{Zp9o*z=k+U2_y6?m*4m_L_<%Gx5_jG>3(y7S+^0pvrgA|avDNlG?&dR zGMrCNw;8sdPWQJryD9BTzsisAy~o>|Toe|MPjaC!SidBvM8ijF;RtD)0o0IK=oA zQKq`s3kU6jKv^Xvq7v8Xk0@XM1?)J`R?73Hd>ZofV;b|*-eX%qJ7aLf6^J5ZSoVjH zo})dIgCmBl;e)(P?Tn`g&2U1y(f^bz;=9g1161mbUw`Q>qM6*1Sz$Zth%|?uVAWix zw7=o(VMUi5h?08tjHmC=xel{Cb=@?M9hn!{c$6wSY1yC_^P9~Q;vs%QD~9K#8GN`R z#>ha=jkHA=7-e^3^hipc-9~@K%<8d+Hx%Xn8&}{sR$ecfCBzDqoyjS=w&BDxdL4ec z6z-X>(V5ppqkw6&nOs?3Y9w|B>|SxA@)Cqt!f3d6dJ(QxU)(JfVw07tN3f2?9BL-c zSR1y{E_$^tS+Aw<)Faq}g&9NNp{S7HGW>6Z!V&t%7M=fLOb&-4(<3uxsC1ziM~`#b z%W1HaD$NaGCq9NMd4y?j9Nh)H?LC_JYDpZMV7MMmNan~UG$mWSLl`i_QU-ZwpO_e)pi zWAN;Rk~Seve|5f&@x+nc&0~BPU8m7Xul>?h?4{F~zBFY~RHL=VU1Dr_mWI}D_|jHr zqk>cE<|mJH7UQ0gXMDILkiUDlliZJK}uI*UN0jp~Hbx^!dMhOe*}-VMs7vL|MJU4*&l@gqrf`7Z@%s6?^5`WY<>re*%B9;w%Gno$lvB2bl$o)RA|<@iqNi?q`4c+Z z1D(A7iVyxbcqFxBv`unA4Z-$ z86~O-h~rUgm=uD-3EohYe3miz``j}6!@lM$gT4l#ra!ZdgA2%nv$$Qf5q6zrw0~|X zD`)eAkdC;Or%0~gk}Hgc`ILGES6;!DS8!$81Si32zIUFcF{)IwTj!dirck{+qH_@waT=s z*;MX5=o>5|>h*)7BoXz-K~Zuux2u_dX*2)QX8xtk+*sNL#y0cA*vxIFIN03G4`b96 z{@y`fU=dN@KPZYOz2VCb4vLba+^i_KC(7-iPVhKkDGv5TxgoR>hD7-ZyV{g`^I*x< zTyixRp%6q?a}nAIk=6VNtmfaknwQCH{^hI9Be2F)e(Rubu!yL)4~mjR6na32g`em0 z8gADb{-ta9x2@q;QXH&Y!>y!^uyPGA^R=eVJ3^2CnwO4<`q4pAl86#M<*o{05Q>8#Yxy~_mfJ&duxBkVwY7$BmCL%x>G;V?cjT@~H_OKRPtKZD`_UVV z=MCDMCHvF-p2%#XNxTc5TFO?-n=fR3bC@3kqvE05NSvIyTu8H@13FLzI2tiCJ>UTf zfgt%d&_X~Jkkd@C0~(MAH~}9}1{C%XN`NvT00eUe z0Cpe`Z~P$do&wXa{(t%02BdbKsgWu zLO?ZO=^&^;KHvs?KqXKODEkN&zz*aAF2D;E1AZVL0Ck`ekR@^iV+Az80eAo(AiD`U zfE7@Ie83G90wq8>paYeFq7y8D9moaBfO0)f3}Uqs$Y~^40Tsvv9DoP#0i{3ykXr~j zfDKTAJirBbfnvZ9$Q^_nzzW!bTtZxPVzmG$0?L32pc1GC)V%~J;06kSLZBG%13{n) zPzDG#AQ#973W0JU2w34+M+IDQun;H%%7F?%2dV(2nP3BQ0VhxZ6agiG4%py_M+I_$ ze82^GfnvZ91c53br)?LVf7UiybpT$#4^#p2K0*#)1ymp(a07)v2~ZB`KqX)uAh>}7 zpb#hmN`U|n0%V%sQ;SHHQ?(Z6a%GzAE*E-0c9V-2IK-xzzviDRAHqO1Z;o` z8ipOd4P}uSOFEt2i!m*Py&<#I#3B%C2}650d7KEE5d33 zuyUj^!6uPVB6-seht0y=c37%$xt&I?(i#X3mS7V-{C#1Zx2!SGqt`0&8kh6zS)_YiVmQVvXV!K6ZA68~aFm{i_<(!;se%ZBktZe>a0 zh1m0<=VRTy&&8e#J=gba>$82&v_2Dl#z;7F%a7`PBKAb@kH;Q^kIB%Zu}4CW z^gSGUxbLCRL$L=#55^t{JH0H^?hfDVL! zN+%76->5|9T7 zRzM}hwLGl4059MJihyFE1n>j!%}lo~0-QQ)@Yk%tM>G9;5b^;B0GG{lKO?|Bv*rVe zfKtE@1b`qAVwE1bnO3cU1~>o@PzV$Qejo^hfJ&eWs0O4Kf($5t6|e&ukO#oQB^@S0 z5l{wHw4l;ciB-9cU;$JhA8-OLzzx8iv{nSbbu@WtA_Rd-pc+v25i9^)X;M|2-~zlr zG2jO(fDjOu28b5G2G{`=(12VZ56A~xfCumbJ^=nY>4$}&0}@@~bZ`imAD#{l!3h)q zML-Eq3Y1Ckf9S_*IS>FUfDnNB+%;JzUIV06ctC&4dsDbf6ND_7D`n z0%&_s{0^*o03T37NZxS#*b)S)0J(>t06BmKumU!~4&(v(fE(}tg+LKd0+a#eK&S@> z$omLZKm+mt7vKeofl{Ch@B;xrCnOE6#Fi>RmZ)Zv16Tn&paD*x04M^=fB>s>>R6R@ zf(5Vvc0dKFLWt9jkO$-gZomWhfFht2@B;xL2!sG7LiIIq3%5}~%LSZ3+yfQ@B|te) z0R#aZ2mzHq6`&*tIe-mNfm|RTfJa=-3lsx>AP7_f68)mm8AMP4dNLs9Vbuw^2}w%} zu%!@ygI&!J1c53br-NVvG{6CP054Do_<$my45$Dq0eKI>3TScA0XP8{;08QE0pJCS zfD)h#C?_Nhh3j8BKM6_?!3N|4PQU{c0wq8>PyqyicqLd3C<6ow05`&P*CV(9FHj8l zfeIi5NK_5cEPxHL1MnuVPrpG_(GyeVtNfFB3~ zRe+KpSOFEt2i!mb-~|eS5&-__=`(1%CC_AX-OM9Y6kR2#q9aCF%fb71~PFYE%W(F=#ST z$D&4{j8pa3ZP-adi^fRMc9yLssjY;AB)E)Os|ts9|_WR;LtzQ&FQ( zr=jIVo$do?z;&{E1S%QoOf<%*vr56)W#Eyhcc^pFKBFE5|H>jCN24yH9s_U7aW#Ub z8?^y76Ll_HaMXG5z^u-%1{a{Nq8=-Q$KeS_JsuAg>Oxds)DzIyqn?ObjCvBPG3v>v z$Eb@?kx@@UO-5}*RYq+>T}E9DkIw26CwM9~!QNdA9M~jhq2I@KLnP@mt zm!Z0&E=T*3dKPLu>Iyhm7a3WJHYIgc8QAOxqo@_BtI^D)u7T@lb!`w_hl-MVb_hJD z5?o&e#?O_cxTKyZgBuiZV-9$}1>9r>H`~A#I~YS1OWlGdD|KrwxDE9!^#b^$Rxd;= zmbx94FLehRv($^oS&yV%>;W%9eN5fy1uw;u;(|n+J!MSVg@-gXj;flPK>L^4iW-}G z8LDjRr)GJVDQ?D!suR^U&{Z<8dbr8Hp2d@o**HwboqbjG~AnC*#W$-2iY|8=L zE#SA~R{Ys*18+wAn))3TyhQ^I)cn-%qRCCYH6Ogq0p5keBiyPIjZ*+gZGz!55!CH=Rwpa)rb7x!{y*30r1fZ@UbBHxDGxM0-vk| z_f&yh)!VrUPa5H`Wh;(Y7ZI^)n3$J)z{IEsJ?+}tol7K_&O$(@OAtRE*W1RfGQ{H4=X= zgTGL~4|2c{E#OC}IIF+3fxog7MLvFw%C!0$G-|5*;NV>C&jWvp`nCGMjyV4O4s8|c z@6kM<{sDDv^^a%(RsV#lxB6$)z16><@~wW1+PC@%T1M5s7K5LnDz1K33J#QkgQ%CQ zpO=GwgA;Z23sln8FHuWZ|Bh<9`VZ98)qhqtQe9O27pm&&zpKIjNX^9m%HUTDQDo%n z9BkTeA=+ytG{~y54OHx4jtW{d(3%U{@<4k&sG_#7YECd0m3}qP4d#2|_~SsEi0br$ zu0qi513g7xK{4pX6M|Y;3i|M%pceVT;&QMg0G3vOWkJxdgXJMGP)Rg1Qd?1lO+l%R zsLOHu2`OM@4p?OYtF7P|8#vYuj>F@JI$i@OP#uzfMe@Lj`QRixm#DR9a8~Q^c%n|m z^NCuI2NX4208a6OQwzaqcxF+j7qy}MXA~oF1fF2jnWf;YGH^Cpt<@v(P@~SlQ;m95 z1yN+==pZ&7gC`v|5&|14!MRo7JZTScz6>rS+bwQZIOVA$SI!tJE`#z-7hY@)Gc@ zQg8(t*I7R3{#(1!k8P{U!R7!MtpHc!AxvGPgKIQY$d>gpQ4sKS#77dK$f?Mdhjs9%KlbgED0bbw)FLZ(1@i3?Ez|)+1Q2}_d7rX?I zcIr+acxe$)9FSeb*c2}T6Qy8l8F-l=yu2K|A^=`l0bUhk-~TNgfvZE{HI?ACRp52i z;Pvu8;tdLTV-9$e1#Gi|?Kbe+c5t@}-mHP&$pvr81C4y}yAJSHCwQ9+yxmQVt9N)1 zxU+yLGIEy}o9-?IJA7bg5qM8Acy9@KUnzKh8Tf!7e6SpRC;&cO0X`B0AJxIfLg3?- z;1gBglhwqyx<`@{^eci#SoJ9dd>T)(>N6JbSv=6H&)L9kJlCqvtKbV7_+l>j65ge# zFXw}=IEW%2uj27nea!{-xWQfz_&T15)i=Dvxca?91itSBe}JcC_03}NtrGC(gFh+BK%E3WA(5s(UfPV{uU+CbMA@J{& z;6JLse@YSJzhv;=3izKK@V^%DD=SePkgsjnwBJs&*U?=oAvLM8hHXkNn3D%u@QFSIPG{X@>>6^t*?e&?R_Qsiu_9F%MIPLu6O@Sw)dSGJJWM! zSNE(N-EYd_X)nY!d`i8=K6;QpWdtoWg=_O5lOiPY5{1;sb>7Bx(JkhzIc)r5r8)o3 zv*wN=Gt9>yWHA9S2kyS$NC}MtyYUvrWrzon~}u?bYp}dHzV5#=*9{e z(=H*)?aE>V<2WJ6$K|8**$CaOju#51NkWmEG|CC+CS(-PVgkCFjDn+>fNo+&;f&KJ z8GSF!@uf_aG)YLYW0LIzbhSdoJT5|&AD1j9psUL$nAKEClQT+=VydKiA}nkIz#Z3{j84r2nk=^~X`WI{#U z5=J~#(u|CPqnIk`h>XHnPn9%N$ns+QgcTdc8GZ8vbhAWKv+RVFC_88!ass+^QzgyL zC^(9#l8($MJff+R<_IZPUZa>Q=_ny&mYxvirI*cANk?Z?%xZ?42>~;kLQrIL=qg}tI^-@(sYqw8Z!G94VPU-pTE(>?blymQ>tjl?29y9b`ee7{zsb3 zCPANK8aDgbQ#53jrj7hb`&^r{mZpsS4^3!u9ZlR`Nq;3>k$U%kd+}#fk)L6{E@IFaU!*Ou!R~w*x60)bbLn5QB3Z%Fr)BjCU-hPDD#`bNG5kW zQ6x1>P)Laq9Qoue) zXGl6r$e30MS#DJp?F%b}AU}gJ`0wy%NW$?ta-~o(O%jUSq)|?hv?`-`7E>fOXA~U8 z6iLyH!Xug@X|<5z$K)`kNU|>6w07N&TP~bkC>~y)GmnPQ;zuKkIg!>1W6}y{H7C-# zjFO|66X|Rr%nJ_l7G>*1?i?XyW?M*$a)fr$eH>pOnrA$nGrsj11+$tH>D-KxhdC!w zPRr)4M);=Oqv9{@BKJa6yZs~8YA^Y*O)0$8raVfu+qv}lpLcA^W||a6rO(|o8O*d7 zX+m_W*)F3R?k9hu8ZXssy{cV#gr;je;t0F)F4b($TxwVTIL5B*qMEIPCWX0XzN%C_ zV^g}RX4^=gzpS* zM5Vmm%`8+9X+ih>GUwgSw}P5gr*6V3kOu?+9jF4jW5i482dImRAXPT zuEH32EzdTqRSr|r#@ty)x&LWzmTntJ=~h&Kw&dts&Pp>caX!j`O47O0$%hjdkKCX4 z%vf~1Vi7x?xlZyEOzkA-YIVRSW90*RFU0YRmqoNYZ*^YF_QlKE12*9eu!HA?^xMLgsMc#(fz*12tPYs1#TEuCAMw#Zw$ zV!bVcn>#o6ZIU;I&W~*jZS337x}p8NhV$CbZC+o0j&yd{y68I3y69TZ+TJy>HNC6b zqRq|qtNK^AuWVS^P8V9M(X?pH5t9cOcP?&P+}adwiZ*&0dryg-5;~=CQR|}cqUgz< zlN(NQpSW+~p5qh8H6E)k7?{^%Oujp}*x38-xUY8fh+NMeJr0~R8 zO{k`6f}wv_TR5Swy1!~qWg^t5>%oCQPkEcaxhz)NS`selFK#dHEs7QO`eMG2ug_@R zoZ}7lxm(>~cdM(<+2Lr(59RmewdRHM`g7ZJ8*&G=PU9VyIz6QIt*P5j7wRjal-r(k zj&ynA9Co3eW+eXZD~vBOUm;RIg~$TQb80fUYVUT*b6PTJY1=7zmL`Km2%eq{RwH;u zGB^jpGn2s+5nPrGu0U`(4^lS;Rf)tU&soXnLIhVNg8>9rCWDhHXa@4z#nx3~MLjNE zbaOKL^aG<=H??Roe)WOzD5}-TXnP}_e+gE6Ltnlo8C{$%dTla#Y1=vU##;n)*h;tS zAHK_T;+{saS*u66HzkAf5L}!LE=4eT%(SzH9W$+Y*fGqLasr23-stv!rs8Bdc0Tvs)bh6~F4e6qj1#gWnNf)0idF$EfqLU?W%^52BA={EA zZ>>ldoxEDCa|h;k&-}`lCmTB!7rDCiD*G~PeBc)O7SDIucYD6w-sZWf{Ra8^*tMceY%d*wMbd^TMtRdbjm$?cXvOlVhHi(B|-_hVz>?_MW$Q z{l2pY)=F#KQGHc-Wy6Z5v!YaqYCW_4jLy@$miC_3cWVEV!Nu}oPgAHdd`iQjrjw&5 z#ZGKJp?&Sb&f~j|>piw_LI3>0dGb8Z+)zU}(r`@E(b1z~b6SsVpWQjDYi92eeKY!} z4^ES(d8US@gu@N>O_QT_vD(&2@eW8ARFenE-6`?@5yusg8 z7A@^JK3Y{fX60|@-Q4vhwZ~rnK}yGp;VyiBZdTmIJUYXj7>(kU&o43xkLZ=p2SSQB zcjn1>vsgm3N?3Oijiz3AnbA0>z;+6C5t+C7{FdmJb?0u{rps))DAQljheC+meI-c< z^CzinUio~KQ8Bw$KED*2JiB;LbC}*SekD?x`4dVae~>DXhSP{|sPY@lZ`N2Bo@%~g z&}lbJ>yPE@UuV?J=9SNHgd)pd7O#Bv2?1uIBnd&0&5^(I>CdQ`-7BBpX4E{4S3VWu zl~3yN*#EymmX+Q}U!eR>q&ACAsPUr9?gh&4Gir|F1S^1|Ac+Q-Qtz4!1NNB7kh8jIheIW${#Pqdfw z{&02cVGO@u_kWU1fOid;!%!MWoe9vP0Hhfjjj&4_D^D}_lujs~`d6_##bFW2d4395 znzG@{+`9B>M!^7+8Z(^6=IvGG>>gB+?jE%NGa<x=|v?9r+Qf7{7vj_s*BX3aFC{qrA%_D zaHjBslX~@j{Y6H>fU#o1gkodM_NvlDmPTU#m!`&x{CxR)G8npb_Dby^$zbQE{FT~2 zlfl@l2rX4YUBoIC5epcdj2@}T=)E#` zD(b8Ier;2BF0v`^cWuhU)bux(J|FG0DHm+CDf!d{crU%&ovE@2y z{;Q- zf4?EmxI&9r0eKmVq+%m_PyQHriP0MldXM<(5a|^vFO=C(`h2$TX5QMj4UA(+w{F{V!J2J4TTeY__wP>%;dJr(NvVilTj4AKeUjhU zb*$TO=uZ{e?EIWxVl?cuc{Qn);%T8Xm2O4;Dq5|RK$X$QxK-LFZ7~|=*t|yku5mU8 zDKu=|dhR)!R!v(q#b~J3d|_GWKn#l+=9ghHlL@BMNSss~G}>O*EKQIHPU)1YJ{)!&}6+IF z@f(fp9$Ow|ao*;Zi;@|fY7wcCIa-7o&!CS<1csB}XOP8(>9c6fsHroxal^^)!vo7^ zSp%o?1DRTA`)xvz=P^u%j+a0yqgM*EJf7)F_~@))nPl~F?ODbz)t zAzaRclce^!y3lbVyQ#HQHKSON$&4M&Z^*1B6nSQ6k~IMdv@#Y*GmXe|bk=`*w9j@l z<@Ka>o6gy`K7Cemg%-;&wS1Uip4CF*pN>gkW8VcOmOz@k?avdbnI)wW5}77}Dq{iT z8fmi;eXP3B*#AU3gtlIK@2Ur10YEJ9Kk(6@bdvAo3yPq76~S!^Ep;TMb} zqe76`FphC-%KBD1C8A?${EL=^4?ds1c4pM9VLDS7!zt@qr71@L%21K9r#H`9u_Vo} z?0%OJ<|TGK<@gv0R2hAYTcr!=Wzz(odDppMHMcNXXh*t*3QCL?p~?%bn2CfKgDLAI zE73HXe=G2v;-KHtB|=vpUY?$e;?+!W;&2)R_vHuJX>v-M)8y-djEZ$kYZ~K}l=T*A zGyQ_Ms+!kWHO*m5=P%uxQTPZZb`;~0DeD`hb<(B-yQ>!pDSlC%NTnK(KpSI$bfOX6 zNq0%tRSp}@!^SOi+hEt!g`3Y^JN#kZC$w;EXc5}xIn4z9!^!R+X|J&&A;zkO-bJJ* zOE(d%64q5|k@Z452eQHU@goSM9AY&P0Kw7jr ze8Oz4RHS2u`3?F`S$dMFN?7+Xe)CW0)H0z%iLeM=aWX?J$i$Ky`h_{fkElPRW+hXb z#5g`>J;RS^xe(+>0UZZq>BmG>!n#*_F4K=_K%}N!u?RJuMIVz04Chc55Ah>fkx^4; zYU76U8-7=ULXkg!>}ht|9G{Z4R_T4BS9+gi(UYAnzw9 z+m#T#AnztWh7B9-%KINtchKvoJ1EtVZ>O5^_}O-)_ad9Jj6R=Jt@x_9s8+q+t~^M! z;-l&FKGlk&GwjO0uB5o>cBO*;K6eGxxaZrI4=*PliT9G{@ws-TjocWHy~n2PiQ41J zToz1Q`=yG zoyNx3^1gOPL^2Ga4Fa4?FF z<{=?q3?03LCtw7fh5>Y%4ul8`5fHaI8Eu(aX`7^#v|4SKEq6&S*qA0$Of$Ab??@O^jggG$n3ZTD zgn$GILq{U?5+n#A4Uj@82`N^}y_eh+`VHgPz6*25ugUB1?qq(P!Gg_1|SY3fFzIt z(m)2t0*ydUL7S?829yCVzzui+#7PtZoe-=vUr>+IM}Z-{M1!LeaimWlvgH8!9vFTg z0C2dX5K>{F5=e~F@u$C)93}k}kOne97H9<22?7UCDnp7RC~+844x{A7JPt@|Amsx% zv{D69ejosFq@@s2VW1K~;H8|w;Y%aP*8m)dsSc?qP!DiirUs2GsHs@yI^QdQGR6jF%5!KrGI;s{k7*OkLmad6iLEZ_*Q z9H=UZYzjyN86XQZ0t&Y%paEs0Iid?mH{b!hfDRad4=4vJ06!1_fA(Pz^+Y z8lV=a1EN4Z5Ca+rIU|lF;#leL6arY)pqXlcIslzkjCvpjGyriRL68UJJ4wt*0n_4L zHDaEUBB+1{lmV_(j_5|x19$-)m=+VO0`vSp00;scA}fp($H}Tfii2fEkm5+TwY;>K z>h>-oR>_jS%aN-hG{?x*fVBX+;m~iHP!DiSs|KXvKmzczk<>T6M7lT;41mLHl_P~1 zTZSJ906`!Ggn>$+3aADmKur$h_*->IMS*&PEb2F7n1e{WMjS{0NgxHJfeerZ8Udx3 zpaL3D2Dkt>-~qgV4&)5b2b2RG=gW^&06_dzIvEnefEwCL{UtP_!Liw0NVx$I;01KR z0DM3>z>(YiNCki(z=7PuIV3BADu4sKN06!kY5|V(9!07ihyfh-J&sfYNCGJ!4P<~U z&QYqxnGw|J`WwfR1ds$$KpMyZSwL+gXh0d@0^9&%p6TzUh;()*WPmKt2&jVu z4JZR#fE(}tUP8{$iE?khXJEb$CVcj_La{}2UfGBTtswHHA zEP$AAvZUWuw$mIH(10?)1-OCL9?%QufC2b`a-ah60|6iigaFH|{We**6JH$sqPfZM zOR3w;p?_ssgOg7WJ>BuN`t-qLhBsr3(X)+f*y0A`dG1c#RtIP%8Td+VKHVN!a&mnAj!RXQtEm&PJxb)Qp ziwnkhD()w8iQ#yrwSGpe- ze+FwQgEV7sAH)Q$;%3MGc0EP@`A|>YgxYvcPaYybwv8* z6L5#3_ckCI2XJ?i({D~8od&W5{kBFVwP8wrs*H&H68yL+e^=p_1a~9)J%!s5*hl)q zY#_lll7$|Gd89uE(@1|DW|96ROd|bhX%nITG=uFS{e^--R5nU$jTCGlm_hn01v>~P zkpAU@4HQKFHMW0X`skx<`@rnc-z?ZYFnRQM3N{bLB%&Gbr7-)uFn49SznjIZadm?D z16aEHk6`8M{|O6Me}9^Z3+q<@S;4%8Wvl<6f@uq*R{wRus)a$T|DG+{9GkSTX7xX_ zISWfxpG*B;KxE&0Lc)N-Y}AtKppb_ z1dzUIjFu4Db^4td3-jLdn^2u&EZD6QJ4pydcpC zBe}2&Y=$kSx8lO8ACMv*LB~Hn%?D&K?_jnl+F(rRhr*E14~G$=TgYuoW{Bt zpb`1olwL}zKp8>5!-b>=$-BHr8c5#lL$Vz3BY$rI$shoOO_utB2o^q4gZVi&cB7c_ zSUqMmAo)bW$ZbUa1$B@Xxd{4*8%Z6>S74t=(N}!-46GEn+P1EdG2B z7EC@5jnw=@*hu*$+%3PCj(j@)n|}yboc9WbS2<`*!gWad|}r)1_gFsbstzu&>Ol8b%^8!MlIt(DKf+>)6;!|cju zV1DH@u)t*Iudu}O8CYcb3>jnjj>XOY3#&{n`d?UQ`Hah!`KQ~S@z^uEEwdA*n-tgy z>&?ovs1^21E?~>KVA09-T(Io&nMzwmud-*V?U@=|rXpd>R4473bUu?)T57ZToYE5I z_m1GmP?VM!zjwsS#NCAm!!1dE35m5N>9sG>?HPVOiM3i|xot^fg~;&vx22KaTw<*^ zCum!5PRO3&cbZtMEvT|BSx{}y@Y_zT)mmz8OIqse8Sx$zYrUm0+oGj$TV^@GA;ns4 zIlm#r%B)P=R$G~|XBuspgZZ^3);0(83qxeal}qKrHn$wA;M07HxIBoAxJvX|8F8@? z8F9_9mYglF9b$>Ngjh?u_@+~4#3evAMA)>TPluBy)2zV)hzJyT=Ph^v;^NL;*ntxUabwd=*TOe_(XG;6h9 z_EgA>xWw^lxn^;xvliXVmpqxVE`3%!teD;Pcy_Q=V&iw)2_(r$?Wf zcrx{5`xCv74}Wg^W1+{|hPnp_AKmtd@<_|Woe%XtIQqcE{i*xgbNBU{!}o6gZ0NIX zpXt75@a}B`%0Nqh=Ux4Gj(&RLj?^9PpX$AR_>pD$6ZRFIBQ&sAV-*Jk1iWtf`bW+DjDi3E=PaHa- z;{^4D5gLj$*)c$avBul`+K1P5tW(#GtnFBR+Lt9KmHcSQP#cIwYRa9HbM(tn65+t{mBa z`-;95tt)mc?_1tVqbU3KYu#^rS>LksvfTL6zNP7<<4gLMq?e2@?pvH*Jl@*Znr1%0i8E@`s4mXc1>R8mfFuibWLC=Epg0cBM^V9Rk=Jm`A&l{WDH8(tWY);pl@SL%x zuBLF)*zB&^;n`!ex@LuEjWzZ(h8st+9oflDDl?w$NvG4}sh(6iHJoDB)A6x}o`!V8Sga?Oj*ZoK)rafHqFvE&bgZtcE?hTKyS=8brnP2Aq%YDM*-_nB z-CDh)s;{cGYDeWjWozYlxF;MAkA%8HYG^3f5mbXiG-^=|4Ea0!lNCc1t17z7)8%8n z9$(rwX7m_oV~iq-r}f;px5pdyj(9pelkOq+D)*#oz}4#7Q8rN4TDC(Q&|0+}Dn^#V zKXCV#-5C%02euw>^ABw6Q~oe69!A0$U|lg6k(ZNhWPI!zD2Ho6uc!w7>>&uiL!bw1 z+i?FCszWBsu7XOq3iPTNSls|d*kw?YK)N;w)}_EGp8n|d88DUw8`!N7S9>X)(7C5eI~-=?S&-huZihJ)l$I5l%RY#C0W6-+o`?nTMCc3g zKuBLy2{u=OE$otLg-b$TTmvqt1(&jGVi{Z$`hIvaq%V(wE67Db-@iY66#7a$9?}oM z^CA5}_E8*^M*83kct{p(gQr4YrSuaIWrxLKa9HSvmw`v%L6N?i9T!K!aiJfDXGO9e zN9&k%4Er&T^&!2c9R3IWICg5Rg;PUchbM=6JNq^|@a#}Oo;@5V;OU`$BKtW`!t+D@ zWcGHPQiJrV?DIGcJ`er$D0oIacqX1A>SwX@<7_xT^m7tmC!QqgU2uZr^mEAzLcxyV z1<}vTf*X`U;`wlf=oe_uSL3*_E;tt`z+S_)_#-J=n`G zl|Hys^c&$*(QitCH^a4}-;x4vg=-2hvP*b(80S6@E&%+dJUxBwr|EeGSS^#{Fy*{spkbWZ!j#h$WaQ^6DuLj?YfZwPA->L=Qt^?m;U(mZb zID=$Gz8S-kZ#97L#ldeU!0#l%@20@-rNM0(a6AiszY+X_IzjxQ2L7lF{0|rSpX@jK zFAvi1v-jx7@E+;^ZGbBX43x%HxxjzB!H+!PPA@p66TQvk+N6vM$CR#> zgJl(<%MZG9@KEWVAn0XBl^&+FRg-3RSdnWPi_5FQiU{aums5b9O~E?M2}Qv$yRs_b z%F?SEz-o3&MG{EYuy?CAg>+pSjOH?!)Mvq1BiNv%h;bE6XkfAoOu4|c8_amXtQTz5 z!C3}4+Xpt4gL5i~vL18&m^Ci|&WBq}Ul0Np=GZ;9s1liGc9OMJBi+ibvc)w>FM%hH zt|H*FD7arexI6}~XaM(*gDVr@0ZH({6nIb?JU9a$k_Fq?$+ilQ?es&-@Wf3&3{UR# z!`b6@1fJdLtJ&{%B>ZmrQFweOD{?d*J9u|KXI z{y4n@PxHt@4xYe%xf9`+(@(+^J#v=w_n*QJx>Mnx(@(==J^ge%*VE77JFzq2sMF8F zqdom>z5_c4?mE2_PxtgLzVkX4UORm~?zQyu@Pv1|Zm^EL2-GVnqdQP$%kzQelM zgZm%-5-+$Bo<03i1Ki{TFXQ{G?h2%P{NUyQczF=q5(2LXgI899S5<*m!{eu4gPSS+ zTHHnH*VTg8^G(!Nxc>ATaNDHkVr}IAB9}ZeeQ*KlH{wP~zbOgcoC0r2gSTeDPh`Q{ za9<=V@=2waX5Ee(BD#oxckuntr(H?K^{Reo!s{asPMEyr_ zAL{=BzoGu0a2V?Ug*RT&(+BX!@Du9)4F{qA6Mn+_Q#@g%#}MGp;U3ht;~}fQ1KvS; z90C3U&O!Z`ctMu_EBFR;^jrd&-@rGh{}vBhWkr4m4#kG$6L+T_;; zzSjD+@mCMHBlIKn)zF{A6YA2l>wb6OPH&qsm=gCFNf!mH@5i=^g7L%jv)i1eIZY4HWq>AXqTFINniivKlnT|D9 z7yIIl=65;DC0MADnX#osx9}Z{H4$w57>dlq12|A7QM;Y}j>1hW);xn-O!anO)NEh1 z(3Ln*me}5C15#Er8XoF4Q{)>o8W>Wxnj3GTF5+l3ooamehK(Dxn3Lxo7+G?++?3YC zM@q?-!}c*&$WSBb7vBRq^JrVv63CX@ z3aB#!%*`~CqTB4cv@&A09T{+Wj^EI|v1`59iw{WwRFXbYP}UP#QC7*55BZ~IX^Lz3 zu%lc93pEzAunX7Zo6Yun-uZ~5WD|=u&)}7|)5OWLtTx%HN2M&cT=a3O=VAranSN$| zP}IcR^So{z6lHe2=Z-8Hlv~pV_((O;Y(d_*u9$_xqdi~G;>H_t6pgW5BQtADV~AAi zxpQmpjm&ecJE65iU3Wg_DBQ$iEzD+HIzLWo+sSj?$rBcrP@ejnR2ILlr>H5S3g}__ zm8ZmboNdoUcxWfa+nFTyBZxqmNXQEeMfX7Rj@4`Y7>R=$(4PQhZ$uYko4H zrD5=~s%k~!?pSL96FgXbG zy2ybw>hAW#i}`I@=g?^LpD*)xBByb&gIsJ-3}8xM*c7?9)#EbgOfH51^L|MVO9fgJ zAE{_n#9X_dr`GJdga*yy?5)e6r`d6rKQ_?WnEU+eG@3i%)qeD88XQ9rCI8jn)$aTW z4QRQ;qrFB0Wlp5OU(|cG>uA7C;evD8b|8f-mIH5lNEtRX5Oz%xumc-6@T~N%ROqw{AiQsfO|jT_g1>)VykUj&E`2<>Q1io%$z^)(eg74 z@*48z8|LJjM!dX(GHz~9zd1JHOPYhX%`-~x1zm1weUns@djX4USt?KGyVKC`X7Xyj@d>xz59BJ$|qqw+(mZPw<_;54;4MQS4U zev|?}z-jOTzTd|yhnWGH79*Lf95<}ym6ObRW?WgqBblq^c3iHi z=jl6DL&iz!8P*qt@g)Qa0a%I%#hruf0^dUw`N zla#fUyAxHM%N1>6iu7)GXYW*<6gD}$Pc)w`#Pg}o&)ZErpIClHj^`7mGO09#9L6Kk z)l3miCNn*pOoQB(R>UXPY(BpvSr-ma6d#OR1~IhzJPzej;pq*L>iP@M>)O&~w!hI3 z%l&XC4JW3cJ}wIC^DqVU*^mCdM?rngCoAkD8nS%XA1Hti4PX8WSz#R%*ZcQ0WV!E? z9<7f4p8YKiNv5~f{DcDfTyYfz0U}H6b7YAvqrg7z{>Yu?H?QqORM0vP?fi#jeU9=>MfqPV zFZS$wsx)re!Dd^U_pFjq%B-yv^V7QF-DQl0e>#52QWjpxTwzO>jIr=9DJAZVFQWp? zr63RZoq-1PB8ts0Sza4i=k6_6$`y{;KjR$wZ>eO}K`M)ym$Oh+G4mIy(k`Np92IL= zD^X1Qm8!%o?9QEzl4%xeV$QOqcl*OrrlzE@u(bBjdrJY1_%mv?nN$&Nw%6WU)lu$a zcyBdF;eGbrmPuLBXz;l1srS|;H?>+$O39XkR^D$b(m2|7<@a_w%6$y)t;bP#ue`VP znqB^kiq?YPb`QO`y4+F-;Dx>X5skGk-dn>_ai6@mJ}D`xcPEu_&%C$gazm?jQb^Qp zAHBB~j-vbGz4c2)uHQa*Zv#@ms;3l`_1sJEZO~C}pS-srN6CHm-iD+|p`6sU%x)uf4Y))mn;g7Ty9! z9#)b!m_g=+!eu+^s&&P^%26krc>K|8k34f$oQe_Rw-Yt8ZNSGFCse#tqlN^h^c z)r`xPP!{^gjbyA!n8kDe0&o zMovXCZ}+Facj&b>omY6Ye~@W==NCL$yxOaMfy~?EE~glmKdD|tX%k6e3aMW9wu^0$$0uZt zpVC-e-NqT-fW#Cs^L5Sa`p{G5YEgRI%)WP*H4ThbRPwE^wJvPnzkkDQO@$h0AaUGf ze(8tHLT2v=o}d|cahb>T{9qaRX{*iA_m@?eclgwD^Y3b`VW6|&p6-y#Mecf+*?-4= z5jADDe(0e!!)0xX%M8z_!O5c^coJr4UcjZTt~0~)LURU2W9Ie`$sbHhylR^{k_jZu ziF80W-)#)}&9e^JFGIyUnTzz6s0!T!;nR!iSf4pc$U{}^wX!$M`Iw?rLbmov^ig7NE;bLcx#Vnr^uJ#7_^ z_srWkSfW|_T9-oGiY@XL=d37_W`@7IU#E?JqtsWS4)maCf2G0V2Qq0@T)@$MsvwO*Yd1A#pg1@1QTDBTH4I z_?qNErx$0Ug}Raw4afECwf#s_DXYqDR1yBT%=8BydhrBh+Nf%6ieh#o%Of}~g{T24 z=)9>YYq^S=x#|N~6_u*iWgc{KfXk+~zH>Evvq#yW3-i(jj-pH+dtuk9w^dVdnok>rum}&=UXuob|r- z|IT`7``w@Q45Pn~J!^k|PyVz$`JcAitMbpP&Fl&6S8ujm94J4beVtd^e`{LHT$k3$ zuSshkT$$E>x+Sf>y*aJD*qzpt37_)IuP?0d)4-vB4Ou5190d`;k2Ie)hEO2zLUC4_*?1fi<^ zD#fqS+syoaz({RX{AnOKcq#QRKb*CblnzEZ&s4lZw4wiO#h(IP^kO)_7bpje)OCu# z0tf+R^u{>92k^CAm!l<}*OM?%1$gLPa()BwGqzJI1XKfF>TBlr0RezJR8w{74Sb>y z=sb=3=VzeTbkPiSnl8-9(P<35r3-UtMpZjW*8ufExSLQ7)B)v#gb+{-)B-V}ZW|#E zq=81DYyv5I6`tSKNzj3EAP9uIbHoU}AqRWqgTYiky@?%_S2NJ!;CjJ@$=(2E~qTj*dU zVCYKGPQjR!q8S+WQ8WVsJ&I;vgh$Z~4DcwL5zS4XQ?5|I-J%0%`i#2iGm_J1pu>8R z2KuNM%|PFDo{^IWF8Zbyt%Ba@MKjPRyl4ixeizL^-|eCq=(=4rgX0m{YnS6_1NJ!_ zSHM0)-9AmkJ$(j`nzwJlL*nf-c4hS_j^-~qGmy1;?8 zhL2A=<^5OEizk7kLP1Kh=1(t~KkMboTaI_{-*)rBO{;F2ym8fy1AVLdCVN-)PUePk zlQ#_A&~bx$!^qaL>nE=px^D8?p=&#?Rj*xj&E(ZXS9e^kUOi%7`kG#Q(B$UrJ=?lR zFB{%8cxnH}-b=bK?!2h|!nO-q&QEO!(JQnjy0&+2J7@Il;j;$M>_4OT^zPF-Pi;S? z?c|n|QYVJY$=4PDWVIa0D)>EIZACLC&>kvC?$qjIAb7PA+`eJ#V`TC0< z-TdyO{srgt@j%i6b(MTbbqM>kqgawpl9}(kSt_Fa@>x;>g`tm>l;wd= z1MAr77~+1mqhylBnwYa~Y3C64O^%xLSZ6V_)t1h8-Q0DE`#DlrG+`q(o~j(mO^9?v z0e2hXey&vEHl#ZMD=%8HmPOLcq%BbQq0;xQd}P9P>iu|f#$$l^F$k#2zB2()oe+ARrJ7V$!GVmpKWVifP17FR8kD6 zM18@4VxV7Y+#J5L&Sn0*MROlbebW}tjOQ=AtA5q0s?-%#4Y63Xn7i+jy+jtSq-X=n zWteGO8lK(o?-s?5S%2Yrdc{kM8rkwuD?67uD$Zh+g)?}0zCU~EfdI>-Djzi73i>`( zNtmzyfL?L6pIm0uVcA0Sva=gcu3SEI{R8_^b>$9$Sd=C6EbNfAvKQ{O_g<`Y6m4L+^bD@QXJicx8oGaeWW~+{92FXQ+XXY| zyaRft4zyIiwii8{56W+|uRWU&mI_uAOGVMdmD74QAHRz>J;YHZp#({N5p$j`oqrEQ z)OwGR`fey{v`H;-UFo7tRqk=3D@a!}&r>#->G!g5=V>ng;TtaBviY)WL?<`VlYW&{ zvFasNMZIcRBw0*;mYqEOdTra#1VZl7wS5qt{`2hTx_n1*v1WA zo9$&eOm1wIMT&{CRI@_7m|PaGRTiroc{=wBbt6CYV6XO{uX(g{&+=*$3%uGbU-M|y z)Sdi!>cDgubtC^NbsyhMPj|}x>Cx_e-=i&}&P#9I=h4ojzYnkSXt&eToftjcdHGg) zf^$AS@u7}Oo9Vp^<@AK-aeBgYAiaBG+ne;hhV@=;@@|iI8~r8dy$jE^(t8&U>!XD& zUhTqOdhY`LJ*EEasQ`H_-ha&Iu?U^19MXlp67*^ny2GS}fHFJ2YHgp20n6bzs(nx$Z%Z1Eh9*jDtN91^T(PJlccZYmR%?Eb** zcxioL7L`xaP{j1;)k<6=Z$>-?xI3>`;#nZ)Auk1uS=g$?G5lM8ZAp=ec3R8VP0-1G z5RYslq?H?#xSu=#aSz??$7|^xKkiQDlz3$e!A1Aw@dj$JxIt|cPg5Jk1Jp+G8fv3B z;z{Jzg-wHRRSxB?Gdwc4U&!CeZ4`YOG`645?YojIl2d$>PEe+~Zne7ouWIeO1y zDqjF!fNtx|ku^;RhEvpL-Yj{k76+c>TRrnnYnsN*r&sR3H0PpyVd#J#s0QNXX)VX811w6P_EeAB(<%S0+2P%PDpb>C&6AT~(L;#G+&QW9E&uvmk zHS*v9tfqqcY6h<-kggAr1H?*LhOK!(0JT6_C&3F;098PwlbmF}D3T38 z8T~qZ)j%B(2b6w-26zAis0JE<6yV=Z2m>`h97qCLK%F4?fdr5N%9Nbq^AU2s3M4~7 z6_5lfQkVxsfCeA|WB`?ZuRa}!0&yS%xY`LGzz6t&S|AP>orDS?1E~Fk${ZL45>1NjgEhz>9U;`sOw zuE&={SRNl@?f4J^$L9hN)y9W_HB@6l4S+~AJ_MI39L4?#dk&Fb3d=as3;(q6t3eo- z!ZO5hk-40zAbg9=s$^{N8H|3D*w9y$3m4^Ti*kvg90HRRG!dGlkW1QgIYn)=FGP5a z!m0>^QOF_oMIo0d%DH;&%Mi+-WzmQ{X=5riuGoRy_n)w{Z(ah)KqgN@efEJkb@}`zU%htC%)?wYtWbZ5(_+wbW9R6hkY z+;-c8oqH`-$ZYyw}rwPc5m&!e)zg=*G^m$x~Apo_E*Wv8Brtc z$95mnfAsKC+m4)AJ+!)GwYs|Jh(UVnz3__GaSGM9W6}6RbwPUmVS4{~UVqR#A7hf8BvSkkwWm8dGW5p@OW zpmMAE+8^nymV;}`MM#SD+w-DJj*wf?D)>khVM2#_(`YdZ9l_<`+?4GudTO;)6y>;^ zL{;T8M7M&pU%6YjCcCew^BhOkyl_p<=%Ie3l%Z|#k+Py-LDs4*=57jhlvEV=KaY~A z%5F_vK{~|D`_&MH!pOhkk?(yDI9e*8K=hG{qD+-65NF10X`4?iK)2|mS@KqB=P{1z zDOQ|Q%t8!;byCx|D|R01s5qasTA9tZ^d9)s);J0;WwDja6}EIqpW1O!O6(Q7GSFVB zC%P4+4W=B^(C##*VXagWJ4cbqV(*l*P}MXFhZ=%79960T*EveouvlUm&F-tRF@DE) zA)0`Fr?fk2rdh3tIm?!wwo^)tg6xpO+>+I4ZpjCUx`K3wXy#Uj>N&njJ}Ax7n zvq>3wP-EK|D-?)kOYb5o%?XZr307)kW^8FuKgXyvCpro@u~_pA?lvmTNm5oc+hg2p zwHlfY=@8Mp^d@rZ&J0Vl^kliM)pk-#wjBgwEK{IU+nwU5mtdtvX2zDD)^??w;HNqY zH?i14=6qYaWL%olq?C1-QA?@H3Zh$~-WGI%OKWDw7#(Kq2UdF4(Fy*r%lK8%GtTg* zOChWAq_Ai_I$TMuZW?#s zQq9t{0t)tnZjo1TXP2X111mL7V_`p*j#hK7qh=GU zHP7H~qt&dJvfOsjo2jO%vW=)KNc)-j2cFZS)hsT9c2OMsspV=Y>+oYEY>w8x&%-ENSQEN{aufit&a^d+^U5t(D%u`_2pG-6fCk zpa1C5ZlQku4fHqiRq_<){^il$r*W*C$Q?ZO4{`@nNB@QN_d0d-KjmtVHbL&-TgV+; zUF+4JqmKTEUrFmzG?5D@Go#O}r0&ERqj70r z0gcfx?>%~My*X^uFYtY|DZgZVY+fwVNM{mQbYPf?r*S=r*%5R5Z)#jApK{nyC#^m9 zgriSC0^`|b*)GegU}$qx3~jEa<@TY?d8LU1Jf5QuyYPxlh@WE}6;s_(0`ur2CFLj( z^h2(thYbq3CBSkfG%*U~q$(P8BA*wYkuT#}w4(fip51&w6|V|Hi(W3SRGD3mRm?h$ zOIq|Gt#@kkF2ppt#Nskr5Ub#Hh*{JE(djL4xzsc zOI*HX^A+p2q(m{vn#u2#EqOug6)%n>Rf+K!oMX;CkH+B0Rh6kL(iyYRrn)9 zdrQ|v8%t?lwHxhvQVmk1B^=dYfVp0|!koM{Tx+J>hO2D-6`Rem3h10$!t&l303&pnfiLPXR6Tn%G5P^DLj~uEhC8*1=N`#<}M>IwPp(u zq+X+q@R5q*JXy&Cv0@gU0PpH)<#n=HLUWpEg5?%5=h@P9)X~mpy(L`qwDNkXCB_jR zNRnv<)S1=H-9D|{Dpjl!NmWtJ8Wu?w)9GpD4N^`F%R7uzlM1LaE0x0>o>u1M##ULR zm?%p%E5wWGRF+;TC(5#xRAUOLGlR<7QvRMkxs_E2sUivy=1rr;+>Kl1MyV*ufpJGs z1#~n0%Bg$g@3~3JSOt@^qF_PRsx9Vj3U;$p6i3i{5qk)SaD7lZYmg!m= zh5DQ8X%s41rQx4=w85BHTTcBHzWI9!nnK3ugh726zUUNkw3WLj!aDe#e+@`Ny#=EYbiPy1EVDqxYhr|ir) ziY8cY5p$j`UHYn-m0JAk;>cQ&G>1FVnbpkQUN#%04A+u;CRSe5vxY^I#T1vSk~N%~ zCFR5=VmYZM6;NkZD$7e>Hv10tL>9|!t)fURQIu*Hh!@kTC{0pM6y;D-jVYkc3@V3~ zxN0Wn$gQkGNEK0tu(_?Sw$}V*U;#P3$dw$Itzb9V=1K|i#cN0@s(@~$UsR&6nDm&sBEn=ci`Av3rs>xvwxoI?6KGsJYfPA-rVR-vS%C{!g2#F;T$ zdggUf7O&WwvCvUH#fo!^X}eBJP20ZMxyVs*K5Mlyn{DZ7F8ET{$!164r7X6Rxx$t% z`COz$O7U)q!d98f#(CTQpwsoQd#Vsau%ZdTUwfD;gFeKs{N+_CR-Mn zpNbyXXl}lW0<|Kf?kL>EV$CyH^xQ+1 z*!ClsS|Mdcqg_t5Z6wwIM>&edSgw(owWX&$kSS5uoku$gH?dd?v)PuO{y?UL^3*X>S)36brlyE0 zpoi&K9^Tda1CEtjqWS0}m1GM-q?SeUEZ7?*Z0FvoHJ0Mn#R!h!F}I7}8X(4Q@>ejd zTS0znfK{VK7h(zS8R?xp$K_RcOh+zK>xnF&1vy%-$>Oe1@)^NWwwo#8P*DC&>-?+Z9C$i0==Zf4;JAcXxg#O9}Cv?Zfjt z{&Pvrt#lIoO6MNk_?;qEtb#~YQIH^O)fUt7SEWpyDiy`Saw!R`%I!p5K{~{Ayze_r zDp+NbilR)FED&eLZ0S9{?>pU5J;jQ1idnD%*2!bhc4gRkhNI$q)@o%o+tSl+KuQ^! zXF3WmWwDja6}EKA`@XZJl-Mix@?IGxx)r1i<{sVmoh_BDy(5*y-YI9Hs$v$7n39I) zIgW}otd%Hc!3HQ?8|}NK(@`?bVol6hw)C`JQtFFmg zv>jAiRrv=|SC9@VI|}!Nc$Evkp>2cN@FY8N{!$;O%?ru~%##PVLX?I`XD3@TNMrOvA zp0>M7onJ0=6mDX%h0OW3bjcgpi=-6q;_5Q`F{(;{s4GZ^iK08(j62z-7t2k#trSH{ ziPoy(?PJqu>#$eqjC_fsWP-(JPh+8@SLu7%jZ#z8Fv2xlz%@iVphT=1&gigrsoc`4 zpi~kS4AF)#f{R(`jdkoU47^Q_stv5yIE}UrdnKA}>M|+GRg5j?Dz4!wA{|gbhnvHt z-BQ4+sT7no#r9EFDNuCSlf@~r@pkq&>NT)Z<1`lbW9i$&&5oK)tkyh(yS+WUT*`9W zMNg%gs>)?VT|t_jR}*)2d$@Fq+}dh5sU{kZ9#hlCb<+)H8w^__Qczj`{y1To@>+{>-aiP1M z%DT+_RO6o?2%SRCl_k+7S7H)79O|V=ObG9wL2ggFr zQFtDUEnzOUrT64m=#|RCS5QUOUc!CSblE?R-(OcoEoV+HPezvX$qlTAlLE5gpb+D2 z^W^L9E__orI?5$jXm&9Rc4_I8&rOb!b6Ko)26ub%xmn6`OS#eatJU0^$}Uxxnp5u> zwM%Z1D_AWfH;^rZEn@V~MkkBpR!6x63pFw`w)8ZMq?7^r2}j{37Hgit-5Q{`Nm)Lt zR3)gMsyaLV|t{{5DGQm#ic@sZn!X7cgMVP-(4@rtAQ2MzaH?x3BwJ4#gZ zW=Uo}Gp;1)WkF-|hDbFHP_qE$R+R0Z_FA93s%_mHHcMZLH@Wm%R+7a~kV={3!{))m&kWcvm z^bh`mM;rYg>UBZp?jOm--TGHDk?;0sx#!5t-Jkr*->0q^m(ZU==I$*&IcaBD?^H4` z2vb)y3c8tI#mV-z{EN;PJ#a*?SllHO-KW_We@D*EFMj)U+v1(M8OvQ~*p^StSp4>x zg~iR~a`Cw`;X2EiX~p1o05 zpluX+2mm3V3aA01Kn#cjNdlD);YrHWPJ$aS06!20s)1S{1|$Kko8a!gfxh31qydxz zh;mX^3Df}fKmy1BYCpjR=s*P!25NvPkOVS7BcN^PBD!c&hTth>VY_r09#k|MZ(8XyY9fH;r@5SoXIsI^hr1LS;Q00;xsKpoHkl=Tuk zfDZV83IO4K%Bp}`AO<9X450KAT!0Rg0|6ieR07pNO@EFULox|ufwDm^qlYGC2H*$6 zKn+k2B!CQ{4insf0aO7sKpjvIGyn)gMEj1QjS@V7Zxr7jKr#$e19da8h9ItWw&wLlC=0BJx`DA=|O(18jd2t2fJ!eSB; zlc<<9h)GgRvSLz}y7AT5d<#FRzM9Hs zxEr~c3w0fFPlD6EA~&|mBE>{mb{(8<7lHD=DCI<1_AtE1t8y!=5K=`HVqe00d`T*b za@@^r@)_dZh4=Wfl(7mXWktdECA`O1q@p;29_4}|81f#6_xP$*u*xJAMVUTsc#p3+ zs_#p9kJlU(KSp?u*ByoTD!j)VQcCOHbU+>(17-s2l`GppI8j6A5*v_}eoJw%#4{ksV7@s^|B#|ZE7wxjSq zhxd3#%8F)tj1Ry)4Da!-+}3J4sU_PEVuipSBJI?6-*nXb7~ws>w!O-$T}3`# zgSs>fl7F{F^J;I6cyikDtzPXn z+YVQlwTHBBL_r0-0OI8u0iY770qTJUAPyveB#;7fX)psQg9Ht50UiLccMU%f1|mQd zhyy7g3&1~Tz&mFc0923&LoTyzFpbOu~>MrK=%2p^pRA00)fCBR2# zz(;4mM`uKU8lV<{%g!K|9Vr0t*ctHH8SvN{@Yqo>SwaQi2jIXn;J`EBz%wEMym$t@ zcsT=ZJOge#18zJ6PCNrnJOfTV15P{xPCNrnJPNK$fD_Mv6VHGX&qxCqAPY1CN;g3T z;Nqh_M1Y5n0@xDZ;WOajGb(c+Tzs^j2ypSy-XOrmXTZg0z{O|4#b*S7AP@rJ@iXA@ zGvM(v5&+zO2HbuI+R=2AqBdoPGwJeg--Hs3P$E8F2bhJYE8veg>R=2AqC| z2k-(qU;sX#9DqxZb`t?ELE2XYxCCi85#SP}5W@sTq3?i8kUC%z;1Z-=LV!!q$iXLQ z)B)s%pjH54Km!m5;4!5ALV(B6P*Vgr3=KF84Y&&pxC;%q3n_##0q#Nr?m`3ZLIdtX z1MWh@1Hfl!z-MTX&yWbGp#i6%0jHq>r=bC-Aw@kVz-dUKi3xBT8gLpKa2gu$8B&m9 zLKRRAz=deQg=oNqXe59nkOI;`2FLUS%7_$InE+p-0be5>a0K`o4R{(2cp43O z8Y$2+0iH%W)(G%4(m_Iir_q3?k&X{S2!PMgfX~r@&(UZA;CM9Pc%*}bpyY;$a6B4t zJQ{F38gM)sa6B4tJQ{F3=1(|qKpJpB8gM`w>L@`2$^aMO20VZlC|>9kqlgP!GU$X~1=9z;&4~Xa;k# z0Q{In82~>fogxSZ06%7q4ns=9kx9oM0gg-qj!XlNOaqQg!vlB$9WVeNP!3c8As`Gy z0JuI4xIPWIKIu>-!1Zas^=ZKIX%&G&kT$x6o}!3P8Y_*m%( zB#@7ljt@9ljRXKss{v1|0Z*#|Pb-}X3GlQU@Uzkhj{rX_o#qJevl{TT8t}6k@Ut55 zvl<@23&7)Qz~gGb<7!k9@&&Di=asHVgeU+XEFFA=G>`$ZfGb6C1Mtuq@X*o`NPvgd zfQOcjKmz=;2E4OI9S{ZT3Hfh~*)t6(_PkoQMBKhexOS~2!oh20gqzpO2xqUA@wC~# zNcexPCBh4AWrQ!-%H)Jg*vbjVu$2++VJkyUVp}Eb8R0LsRuf)hD>F!p@U^Wo>m zp6hx}eQxC0j%O#I8F*&ZGm}pbJiY4a9Z&T=m40gM$*w2WCr6&>ctU+*=RgdnN{m8&0s~(wrcT>}?#p|Bzc-jV0B@9mc-K!TV1~)sGPe@4p;{KTaIH_ocG99Tjo#{z&&%rQ+Zf zcdPrc+|+7ADJ9#mROmZfw>o*Nrebs6sl6Zlw_KiNg2xw(c?Z=B)MPg<_pj@u9iEV?Lj2D zU+zNe<3y7CmDK$IDw5o<^MW%Y$*pfGiX`_NxvJIra#Pv*h#|M{k>q~68}%rwgL@xI z?svP`R$kO{uOrD#NIB7E_ApZ2^GI@&a$~D3QcRR( zuOrF*RmzF7tR>Ywh$Qzvax1G4QbiPEUn0qUAQeS9_BE2+hf>BWn3NR-+m}dk|0@;6 z5wxC!_cD^)-=u<7CaEaO^l>A}{oPSL#lci|8A&czbm6zkhsk#GeqR1F8ni_NyY46N z=lnl;w69YS*W)Y5F-bjKw;VtNvuOI6)4f_|o>zO7JfN$|13G%4uATg}NBjLd6r7Cy z^b5S&y|caA;??9ir9fjR(txgs!^v|>9?;YlPn-7T%Sn{}{&=oOyZJ_XiyFB>U)Vu! zT^ph>xD+vA6L~?E?H=v?@4ufcCoA;FHx;bVS@fpcu|WM?<5RLbFB?wYbyNXW=`c5a zed%J+V}ESb!hA5PF{_$#Be@%}RZJ=3?mO&%T7Gj$(FDsiF=yM-d(dJ3PDkN+EVhKX z*p}Xt4*PdWWp1ph)3~wDAnFRzA?37b9rpX>238%VfNVHy72|F5bn37_;3$`1q1naU zU5EX<9VO?oSnCY#w!{8CQdYDSe)=i}rbSC3O+h5NrDXU0&&btj89s7z*-qF-#EQ(* zsr&wC9pw^Sghpn@mfnNz`}aBuiy%zRENSO%y6^XXWLmOsi~9xDa8*@OODW_50mID8 z&5n0NwI;=)_BNCVMSY*tFzJrrEaU!swr8cMRYaVAAU}`B^VFKdiP|HL2jx6`bu38V zHirxhwz(FL0}oR?b9ua!L`ubrBoYCX%Q{%~F$7MIC!2%9;u z-=4=Id_-zMmp)Qc9%gfCUOj8(Db8aeIG0sqyCJyqQAf!*i!Ef%wWUjkp%|1};(ED+ zN|T}yLHN;t)y&<7p%{`XvuO)7#Us<K+7g1#ISS5WsTSrUTUwmx9V7QX?mkTFQ1oE*3OaAV(0i-DN@YB@q)KM&UH0xp;0%G&A62w!IPo-K0T(tkcMMT(IfhSKX|k`H2so~q7zWmfuHQ})h@rEB63kQ z+&kuYwJbfZe~BK`FFI1!-lT{FXI@E<>FM$OT^r~z{Vn1#{V7|>Hhr1ChaS~e-b0V( zpCJSF;Fmnwcj#RW>&Zy{2N|h%l93vxFki|xRk`-RmmgC>hU()(Hbb@OZEZVWbZmh- zu6t?*x6pYsWnOhvw%Q7_SnA*$c9hPt=v-!#Ej{g6Diu;=L<)-o;A%bqK(_*xGfN!+ zi)S1FFG(ru0Fcu10DxYE_3|tn0ITf>fN($WeA!X3j-^t?ELfE7Czfi*FE~nOS!^z| z$(G)Oc6>z&i<2%r>Z4G)ARdInrp%QJP4Y##6|I7gRFNk%Y>KDkHWr$!)H&x>M?pMc z$IFsHJY$#XJuoi6|OX0Zj#dA4-PNFT3B zDbZg2RL5Bg=w=3#ei73V@9Dzvv8(rVy)JcVQ+%YZXuJ@M)fKbQc%^=;Z#W9ZSSnl0 z!f!QE>bE*IDkVi-O)BOr1=N`V#oR^w$}zbiYDOO^Br6AvI@ZXuU`ZcUsw_Ld?kE{! zv1~C5#z85&^-U?rm5U8gky;c`X9k!K(LR=ZLkiF~_((xnNoduvN}kSp@GVEd7)xb~ zS=fVXO19eDj*_!kY|#uB-M^PQX}lw4x$UB#r<%4Zpw9F&cNOhp$-8oE+5jJ^CK@it z8`l=IaCEFKS!9EE4ISTl2xEj`^^R6=>`J*g~yTqD#F zQ3doc{mRI$LP368Zi&XDk5rQF2a#G9$+K|a&HO3!PJPD`e9JKsq~&4gzGpsp7}!`W z3IzGxyhtGsWSUB{=Yb% zsl?^UEhRA-mJ;bo1zfM-D%M3QdL7lzUD_jL+0Q+j+{z2R+FG*ee@Yhp6?afvF>*ma zLRS4!iYN9h3a-#aR{j6{j$TVaR(+cOzC;%N(SN6owG?3CD*Ds^=FuLd&bRx~-#Z`D zyD@TP-v5J4`hN01Cn>1d7peE{I&we%nymUOD!p1@vqyV^f-D?Jf7?bWa9KCGpZn>x zZ_mH`)Ze|G$~_ad$fGUiE1n^EPRai5y%aCpJ}S^1xIR#?(nkrv{~rzHf9zQ{}5wv)31>&IMg9S1ZAqPC~MupbrzOCNQt%Iwe>)cs*54*{TH7 z0J_}<(Wf?u{-;6ocnqS0B7H>%y|{aEpqnd-&WF=xp{L%oS?B?_V%j`(n3^^VJ*1}1 zqK-G_&wYV9^VVm||DyWM8=oydpu_kie|L2XRY85Ss0#OX9^fVDoEt<()*$+r2GOz1 z(tR=@)}W42wpm|%j#}x}aMrukqqdu?E^S!2Zs^jjj!)p-@1O)xszS1x!opZ;2{(;o5Y~c%(1V8tJMIS9eu~tHvsODo4Uy;c$2?)DudF z#)Eyq)?iN{9T=x~m-kepE5^(F%3I5K_y&Bde3QnI`Cd?8mix?5`)wc5PsN)SH^BV+ z=pwJ z@r>>9cr-J160&$9WF>(yBb?;lL!k92gUqpK^8M(3WZbASjC z1*(7;P^bnIKn+j}B!PM$1*8EB$N)Kj^%7J-1H6C_@B;>50u?|Is06Bj7*Gu)dJDuF z%+>)(pdLs87LWmQfHFeR059MNbie>iAOHk`5D)>PKqU|Zs)0CALnvsqn5_fqffSGi zEFcTyfJQ(WC8&S~c!3}g0wO>q5Ch^s4Nwcz0ZAYQGyv%Wm;tgt4p8VTt*L+pcmW^a z2WY@E9V`$4fVSG61$a9N zK0pTypaKX0As_-o2?hGn(`*c=2I4>hs0EThJ`fK^x(x zAG1Ed59ojiQ~*IB1Vn%+Pzl6`$ZKn_qWf(mGW7f1kw8n6zi2O0p2Ky}Pw zJ_oQoK>;+t19$;HpaTX_0R(^`5C$SZB~S%a192b$6l%dbAPJ-ZPm$mS{D1*e06`!O zLwLl$#s#uTt6wm-zKnBPH1=deg02S~6Uce9NfC*Fp0U!i~fe26uB!C*A7Dxj1 zKnh3$7LWmQKqEkJ&G0&E10;9=AK(XczyvCQ01yMJfdo(sB!Lu=1}q>0WPwJ24H6VU z13Z8i@DI}dH661CPyqyhAP@#31Zu`g%vS-`KpaQ_wLl$^1X6$nWPlu?j1n}!3-|#Y zFh;R|6SDyz2!wzL5CtlM7*Gwwff}F|r~~Q=RK*nL(|`qJfgI2XDD>>FselG}0s1W` znwYHsf5X*(d);vTwe{_^+Typ z44pZY^eRj^xG^85WVuiLDU!7NkE!r!R1-V%?9|$sKayLOsv)(AYD5_}tsT$u)%dYg zD5?P$Hw_FU?wO1GzoeQ{y`)-Euf1?_|3oSjoiu0jdaWkv4D%7rvM%nQN)4qdNsXdP zm0UqRXPs;QBf7Z%yR7mwS2%e*$9l0RayR{~tiq{WRV!z+YkoI(+C(mspO;lUlPjCY zImb0Wp^N)w#nuF4wE4{OI?msOeL%J$=&?3(`w?f4t1SlqT= zq+?asuZcRte1yF?k(2nhaw}Q|AE`y&60m6N{;sUT6jznw%(&)vb97D= zK=}7%6;I;In%~C{brSzUsuj)lCpun*hX&Fa<|FJ+ALu0hqui9%!$+!;ZHMjaxE6=y z+wMtUGozpmdm0p*&1%U&FPGvHWTLds&T1 zt}C}2$4=wK&frgiW7)C!v3M}DT6?~sp) zMvryT-(UabQ*Wj~FOBr~ZSpf6MXx&SAYap!ms9?An)cHuvUwEjWtjX-=h5H4=~ai% zkgI9hXX&*Gay6au4CSmLH`9&umnN6f*JuFQq2zA*X`gSlx{6+R(8%9(JM*hk$=AgC zRkr+%Z_M81?_}R{ccQcNSh08>KRGAc#lKg_3MVcuigTqOonOqNCpqG>;mcU`WJmP$ zZeY<<95D{@R7Y%tc$ypp?T9TT zmV`i`T)Iro=!Z{K-02jbx_dF~0oLV|pR;>8iqCP1{T;B_u#AoEeEHVD{=K?iD?~fw zdPXbSZiyov3h@L-JO!fD?#5Z;+TG|J*Y1WFjpekvk$~v5yU_$uv^&OF84Dph4R0I^ z(P?;N8N^b<)5;nh>{z=SafnX4Q*a1(yBn>pmU&Sgiqr1Kk$LL2D=iK<)Crgn%QYr zZxBu6w5vA*(YcOBFX)2!YV5Jj`%BzP}^>|D>@5E{~HS8wCkp~l{khu~b_ z-q{lsJMHXkpQzYrX75QSPE_u+v-jMIik)`$YGds@R=4F_r@vdBQ0&W3h=&pC^$Bmm z>TBz5zjfQE+HcwR$@ZJJ-OzUZ=IgdxyX~6oo7#&V8#_02Us=4o_tO4#Th?y7WP8t! z?wxCtHPO|Xi`!PUU$o>xcrw;wdBmMGkQ+nbXwo3n@`zt^0t$< zpSa_MolBG@(T>dVZO64AyX2UzqkE3pbY$NVn-AY|*tX8a+ZXLPbmt+;A<_0szU|=l zgO)7pTF`UgrulvIHqYHMXWQ)UvvwS?bEYygx__pvt+l;nNpshXp6Q#W^-YcLmzmNw zxqZ@-rtP^M*{;lv^v(vQA)3n6wj ze1C~>L!tv$p1`M65-5BS!2@^!A3-1VV^#+YzyvCQ01yO1Kp2PsQJ}H_Rsk`f8i)hv zB&I+dgjxU{#UdUIdW%I+7<3tn$S@Y>G6Y%E!7P^K0G1~xfC^}U2k-&~ALs|rn`{_> z2~+^+QZ|A>2nYiaAPS&!*+A#Ah&h8EX1c);5&#cDgI;C>z03xBnMFjJ6wS$s76z;O zsr|Oah^`nf35e)cHPEdpLcXAH)j;2>fxcB90meWFD}@pxpo3M!gUMkIy{sZKj5=$hp^fH)TB&`(WK zmIyh3@uLA$Km$AgI;=(D96!xD6-Dp0VF2jDHqeD_1b`rberyB%*hZwEx?zndX3?8X zKL>QoPp63!1`BFLfl?%>fChK~FW>|GfDRad2~+?9AP9sAvZhZL!dMgmq5xb9BH|GI z3Pv>$2NFOHPz%7hAmS0#V=e{2!(gNV3&;RjAO|!846UgEDnQOVq6f2H0A2^f5Ac9S za6LFRMN}UBnX#}u2FV6`kPY-88yIwApc~mhH?qOw^`I}=Kwq+fzGS0ekXrY9X`*2P z83M&H!fXy`1khzJq6cZ1^8n~P7jcBpgH93E2nK)-bP-z!z32vd(TxzmLk*!T-9T5m zfv$8Bc?kXK6l#rt{&XWz0MV;%pjX{Mueu0Kgsyc19qS@Q5qj4tCL19Gpo`te0gV8| z;h~@1KtH>Ies+V0GD2rNkI1Ay8ycV$!$1Tmg=9ke^O#KVa8S%JLL7jbLxgC8uS3LX zg2RIcYcf)pW*9tB6dW1`j}`^5h5@ez{br%GI9A8!tK34&EmR8u&r+1@KJG3` zxCM87q~~khC3S9rA}2X5^L)KqNV$auw}6;a1^oqgw5b>1Z=oMSf;;Zi3vj;3hJPX8 z7T}R_N z>J~J&;BgCHx8QRNez%~z1;Z_vMRLPAd#!L6xdVH>5OkM>+(OtbMBGBuEhv$znf{_m zG&H~icnJl=hgmz?^#5T1SI}5!V+c)mK+Pa!@U#4ax z?fu`IR%7Qkh8h)S@BH(OYP&L|ud>zE!E@}&WpnGuxtzDRZ)`r$9$X#tD1-KvhWKQ= z`Q8~dN~^8B>aVh=zdC)oGGHIv(zsCDQ5~_j?3&hQ58OI`w*9B@e!4vx)_sMjx=ra( zGRk&F?@%k&xn8oeKCwh6Y3yUPi5y)pF-qUVX7X>334T}`vcwOALkcDg4@ZFQA%!4p z5P4^54#F65ieQgOAqu<15n!JOJOpeh^4R}o`t0_4bQ}mfM;Vzz%#NV;4xVWt$19PLZKDU%~EQ`qq7taz$3IH z;8EHU@H8!jxp=B}1Uy|k0v@oXumBI*j(}%vF3_E&`CvSB%c6tv+%1Je@ciuvnp?n= zxGXsgPvnk(Cv!(|J)Acm1Y=C6^@}p}?9q)Ho6ewQd2% zyxgc*?-o*S0rtII?K;aXWZXi|CEVC31pdp`e4{!rrr~DIEucF<>b}|M5^hD$fGoLH zcMIqvkR`XHufP!kZUM#&<%Qz+x#qiJ)i?qS8!7a|wvobpFmI&rMOZjeco0U86dr=H z;|MT%90A6UBQzFV(jzd0WYHsvThLs>7T88|wJorb906966#f&|k|V%sas(JoC85y# zO;}K}=$o*l90A6Z6rO-l3 zcH(+|BjqZ2104f$wVjqrDD2F-q&IVJ0i6bNqc;`iJcBpCt-1xxEubqwZu1U0UrIs? zLnn+QpfiRGbpBgdP)a0t&@m&|^Pq1=3jU~DKwphhQsWYW4Q?S|jja}}bCpD4w9DV0 zmT1~l6oZ*8b;n>XI|7V$DI}SzB&oOs)h%dl0oJ@!kRzks`Tc3h#o1WVq?AjToNx(K zVCzc_Q(^Nv0?d9X%z))Dg%%k9QfR{?uM`d};F;HvU>4R_!LD%x*fov-3rh+s zVQITX-8(jSrEgR}x+KR3oik70QhoYrujjdK_xh^v%wOp5V z3$BicmK%9T1pQ*rr{zXhKSaxouC9lcTRg?F_PNF95^nXo1*0V3{I}d@x{7XdbuhHt z=IT>uxx>|`&~k^XPod=wS2se-oz*UF_qh7ZTJCZ6nYG+gi`5nsaX_r)zB<=N_tm?E z2V7laEe|xfOZt|aTIl$3@kawc9Qi@y2l?-Jzt+Efc$f{hzS{Xp@6h1Oqc2%6b-Y-7 zVc_|Z=OWMLpY8r$|1-l+v!`3X+qtcGaPX(!F)LEps=^IDM*6r9(ylUXekt-rsS0)+dZY%7!U)wXVSVaVFgx{FJy;E^Q;#6`b1F{)36f2N>MgE6X4hZU;NfcdF6!|v2us=!v5oq8MWO?`jZnflBGcmT{yeHQFX zeKrhBeNGab3%gRE2ZK_d4@*)%Fbyt%A*nCSfCpv4gL7aZ56e++XT8KjU^wcB!eZ1H z!Bo^2!)2o%21`*t944ZEgxfYe65bpAC|HR4(I$9I1$ZpXMEy9}hx+kw;prW)4)rAw z@B|o#`iXGk>4lSE9O@^>z*Arw>ZiuR(_k9vr^6=H&ww$gp9w2aKPw3?g%PNq4Ue9_ z3|61s37?+cWr63w+S8ZA%+puoz?H0@crMI4{X7*sUn9zghvo}BSau=oI{hLaxXKS+ z40BFj4G*8b2G*S34Kq&ff&Hdm5(L-6eACy#ZqwJpVAC&+f|tQw(=V?AuZV$HR)bf? z!3{9r^s5Usm~4c}rWfkKA}lt26HGPz8rW$1wGH5PFwyi+Sm57Vw3x55O|dtrO&ecUap-)2C#9Y&Y_8CYBTXJKaPcLYH@ z1bz-KCH?ae@J=|D^eeRBcIz7FrM@;!Na6KlqSjp`7*38{VN&pKeFJ%Iq;E2@T+W)_^1L7sNfb2e9Qwr4ueYn znh*R>KlpVRQuDyo; z>EDfkPgjG_#KG^uCeoj+0iT0Oq(ARAgQVT|5bLf>YHuS1`Fos8ay&6`E9*5bXCoHfg z1J-82x*V8tPA=T0h{0~q+bzmas@cWZ42!O zzajmKfYV?_(2oc>14ab>h=47yA?Qa0Y=a3wKO*2vm_+m=!uLO`7Q$?F#M7?`IJX|0 zhdy`u6#)-~$w9v&;KB@eP!>Em2j;okr5$b;{Seq0`k`>V=!;-x=!@Zb(GP=_p&t(O zLO;T>D_}ex3By7^3T_zvXxJ6{F|a4}V_`_>$H5h&9}hc1?|=cJFM;Ktp8$7^ej*G9 z{Ulfn`pGaA^i$xH(NBe?pq~a4K|dX)fqn+uGWwaY4D_>L66j0G`%$1@5tsz}GS~uo zCp;Z`7fb>D9M}N*ayQz7~)B`nm|X9#8xFrIp}ic-Yr3kAYX<>0ZAQ zkM;Uh32+0R>h-JfIInNSbG%-F!%;8dF<#$<=Xd=YJhwIJR0Bbemeh*`{}&! zS(pE>wduRcR%27 zu5oR2AAi~}((%wX_q!kVznFBb_JI4z|3UYY|CiiP{tpQ~h0;YMq|&t`gwiD>gwmBH zgwh2igwk~-gwo|Dgwj!b%p>#b8p>$aap>%Z$ zp>&Z7p>(YZp>)X#p>*ZKc%v$mu3#aQE@UB;u4f^XE^8r_u5KZeE^;B1u5}@lE_or8 zu6!Zj3qaq$8-!H)9tdHguY)KleJg}e`f>=N^c@kxgqGF>hL+)2T3i2eRxqP%jl2;Z zRgV4B!FOHj*YoV(=LxH5zK1cLA%Qw$Dzo^MSw+V3VwPxOu1KX=)BTCq+fQwb#qweq zCZvoNBlO#8cfIAS^0cyI-rn^5tjT?Yfl39du#PK`|I8%)|GZ}}1^@spo+OE#3YM>8Sae!ejh zw3i+@J4@9&g;(i&ymok71fL=fr}UY^B0j2pu_Rt6mt%@niMZOwDq<;p^32}6K2?{c zSyi-SgfEvn;M-t{Zm$j~HTIAdsqGu|Ev1!pJ+GH`LJ_8DzaCF%QwvjCgXQy>!>6<& zEk(se<;9emMefqVnzYp3G(8kcd$1b)ms&+3JNGoqsIB(vZ&k%lVEjrb717ETW{Wy@ z?!FRq7D4OL1m(^rFXk}eP3K$}K3o^9XlH&NPEH}MmRON?P}+q&22nYFW}d~xQk$dQ zdKhghwr~!di=s-Z9sTy~g#BRR20Fsar-GN;*Th#({;=ddq>0E#z|=H($X@m zZEv0#sZN)6%~0JBYF>?+*Ip7eJqWV+S#(hCaMe=}M+12vym;emW~;4+oPzd-T3p zVf)NX#0-ix#L-)~cQw`64^Ioxa1VP#nH^U=w{Pl>+x>R4VZZH7Rv+y&6X`CFHKk=) zdF7Khs=T}keAqqzU=Lz1Vme4dp5^V$_cSN$)&-GJ-(WDQ(8c39jM6UY9@WBTmOM|o zy*;GF`UX8UrHf8Q`YrykIB&Guu1Hne-7{xbP_=iq&91VautJ7C?MpXAw+}&KS`Iu^N_A7OEcimi{`_2=j`;0##E@!b1+7Vq@ic*W+r29Jk zxD(CLnI#&IA79b+CAF;5A?N8p_{U>s-t<-Dbv8P9T*S;?lCG%6Z7D(x5TN@eW5@AB zRPFXRJylezgvVZZVTkUX*vk3jsgdlR+h@fa6scUHW%%S>RPCLLQe{6CQoNobz6F~# zh2rLBLSFk5Pt1zl-reo9DcF~H$qRfVd5(&uBf`Ru?|Rhm7Fy!}&Ry@tkMDYD`wzeC z6_1~Hbw zwsZMxdf+q!{o5F<=TQQ;-g8;#azzQ-O;?0+A%9;fG+@eF&%*YFSA>3D2!@8OUGeEfiV(K(l#C4}>K3v^-7W0?l4fdYRf)?PRh>Jl# zPyra$RV)|)B7oLP@BwD)RRt>P+(3$fD!|uIFn}P(2+c)+7~p4A3lj(d+)k#$r687~ z65O}uUckL*?giX=<}4`CJ&F6toF%lNs)JO=fjS`CO^5+CKt(?x0>pp>kOXRm2`L~0 zGy>Wv=GaDRluiO-00t5Mj}Dj+>89v+K?L9nBJ5re5%+?Kvlm1_yC5Ri1rfI{h>&$b z#HkA+hFmZWAW~dVB?~3!0}!<>h%jwI1ZNAz0P4S>ZCeR-0OFwq5ehAc0BFH@XMq)h zhzu4)_^u%0bp;WsD~JGH!So;jp|XM$C5u)80`zMci~=#B24H!D7tnzKfPVTQy5ocB zfe)tmTrbTv0O)=WD*Xhj0HQ}Vh_1{adMxQ;B%ntU7qW9^1G_IkXWqCq`0xbxCg`^t zw+0`6;9jG)u=^_LE*rN^s3lfIOzor$vmr@K=Ak8qA*8cfL)0!S%+dA7f zuXx$^OE+EGcIl?|+t+Pc*S2oc+P1YjE@``DM^9f*d(X~prMqp-j@50ecU;_ear?!a zR<*6#aZ%qz?HBE|yDrueO>O5|D*;pVfP2@r>@%J5TF4HGfL$ z$<|2`d*>6=zhI2c8<{&iXK?m_{mAO+E!y@On{4IyxlMDoP3oDHnY6uWQ&U@0d*hN^ zS2mheGHq5@x~n1D(3Og&y6XFq?a7|HOx^a{O|_e9+G>_0l!Sd{OJl1&_-I9q{p6!Q z-G1fX;Pk>KwN2fj^eOGiPP!Lvy7sUuLv*M7&V8llE!-a?XR&OT80m=+an!zjp?m2u zQNgo`$%-tLwFq!Ih2UTbr3VP;LLR>=I-SNZi5ID>a{MCRw=r%HA-Y?7X@5MZ?I#go zHq=D>R#ogiGk7^msdR@-S%9~5154!qAKmy;j80w(9ffiq@6%C$l0XNoW_A;Fx+SHm zhY11MUaP=Tm8}F1eb-a<)EFs)jz5*5<4=X?_)~E@{uDe9DRiWN z;BK*3^u#SbvUI5Ls~Fa(>MXFBe^Jn)zxp5r94;NS-dkXkndLN{8KSG!-g3<31yPHR z*q@`Ht^Gp}@+;Z?^D&dR+Yim3cR;~I4Qc2=5QqUO`styUUM{B*;eZ8b^!r1vDG}-c z3s9(a>17i_5QqbHKpIf#hsp2*X&?u9=qwl&Km?$$jKmaXvw*jsU;-I{jbIrN0HQ!0 z&;aBBAHIndfJ*1f@BtM-C6E9b0Z%u<03tv&P)Wy7@S#m(R5vr;zkxuiOg_e>C-ix7 zG4r7$j>HFvI1(T5;YfVMha>TU9b*#h(G2$!s(>0G-A}#3W(Kp$Fu?;<0QGm(pzu89!2CZge*h=yw-2Cj+lw`KtWZ%u@+H4(Gc zM37pO^%4+})R7H4*96M5I>}@m)=XcBQHk5Si6P zI95|*bgYQAY6bvASS8m8y?t(``9cc|focHZPR#}&3n0F!iFl?aqLZ44Nopbpsp;t; z_y9y1H4$LcL@-ek(L+sy3#DTxWC29?G!d}VL~KqI5jhJc0&JRysA(d2ritL0CPHSK zh?Z$q4iXUR()5fFDgcDBq+=%_Zl#Gpl_tVdnvFn&zWZi1P!BW!SwOJ}3BZ#l7(k=| zRswOL7Vs1a)d1Y>W(LRsD&0p+F95H%37@o?<;(hM&JVz6Y=!`Mea(6x1HeUV!V_!4 z-)h2%YLai0D(o4gSvV|BxFYF@32^{EM$;nD9jo+R2#&fXK335w<32n`N{w5S4=HrY z;Fv4v#8acf_)V*{3;5c`b{HKeCB{kcijA!apVOEGuhWA!ODijm9N<<@2SOFP#W*Y&R*ykw+@^;mYxr(*}(pT0Zv zqo}nge`x0+#rFRE;K4lyXAa(O-~IaZ%VzXU>zTS~O3&oYP1_p#a_zaE?2?R<*_31`-;0Sauv^( z#mnW4XO*jXj$G;#7fjYc7g3QPXUp98m3JGi;)~u_{G#b9zUzI(o(fm--R~=Yk-DE& z^h9g6_HVEFd$3?7TWj-)j_S^;?r1UG8|<$bFb4g@-Vtq7VeI$Eo$^AZo@bA}EG_`* zJ!XwX;WQ{Ee@M0P!(g)CFf^T}w$9{ydU&%1X0^5rMm z+uG7qa~eKCXZgJLYwfO2n5jcgJZ{a3m8esxg6R)XCMy`@tAbSwjI)^Cbzh)KDOJY$ zfbC^v#W zziW7w$W$~_-G}vFQ(2u^u5CK!6xY0yCxtrPe-iL`ms66~we}W0SY=F-3PpAs^x~%| z7ds-Lft4&RQeeJuP_=Ig9py1ASD&};e14R>r?uNPdAzPH*9H0*Sjn;?Q%?B$AlKDF zi450qRhO>0V1=cqw356mr;O9Z^Tbjo?E{Uu1CYap{FLizLlUbECi8{#8%ivx~vg~{>! z;M33|mDxM*pPvdANuQ7Iho}|L(=FO^SpC?r>$?8fa0Z`PAY$lxg>u6jL$dR~NL4G+e9l6c&-vab3T5#=ok_<~VA| zWpnf|XLI{RC!{uvH)rC0nrJ2v1j0ZRr~=T5r_})sKo(F&3Et5HQO9fr5C*D%8XyTY z09im`lv&0D_<<0B>{nV95C>|3B#;8q1gahS4>hHe-~|jI2t+%PyeEd)1ds&MfZ9#) z0)D^%DgbmtYL!47r~?{+ETHrfJb(@afGB_jU6fOSkOs0qBcY(FBfO3tnrP_Wq?{du zFi-^~fF#fWWB@iw@BjfI3`Bt{pc+6YDMj@sSO8;`ro#gu?Jb4sCxi%;yalsypaIAL zIY6-p8i2l5YDN?DA)pe719dzhs}p%RD#bwCQR01P71JU|?%1(F3Y1*8FVo>Lvw zJk9$669@rOAO_R`^?+6+_y8R+fdGL1cMb2iXbB(*q=78JdI=stFMxQZL<<3UeMG~1 zBO2Zpp>GWV?}N~{hL8iaeqKc%O*8`t0#P6i)Bz1Z7ElHVUI4E^Xn2=F!|Mxl+6Z+8 z5U(m|a1_wVBdCJ}A7BC@051yA2_@73^#DfrYgwQXz$kwDQWChkp%}*iefn+^F!G+h zkpv8;*D!uw!;pE66&Pia@BkS3t_6TFfD!9-J0sKs7(1?ExVVPV;#vg|1R?}FV;Brh z6O03=NrRYV!~`R_X`vX&9LKn2k}z1ACIt*srfEn_Fglqe?hYx&F#?$+3^=9<#uw8B zqlsyPQNuLBP+^*gfx&Sx)Hg0h@5aS|+_)HG8&8TgJ;TS*1__fUT4?yVt;6PwOBKY) ze8yWnva)Yw`^udwHm_K+LRqn8dDrsj@@-r156)PsHV;n!%9%0h`*`_{vA&O{*1wg0 zvN0+8iecorShIS0m%ZdAZ}rS`$kQ zqkO7GKai73R?L6cQ|;=qD)%g*>>8%M+6V=#@L^o@tLQ$JTd2JRGb)Ki@0}|b= zlUtRlA+?BV>_wuR^-`gz#__xwONe`x=;l(Xrc^JfR@7@R65U)T6^e`JY+f&Pv3%r2 zH_-xNVX9iSFgUCYDWf^9i{Xt%#4*B5w&$+99pXi!J z-i%z~Md}zjy}_@JQm4>OSNl|prjJtR&=DJa>Mtl~#-;RUzT{Kyr<@t{@ARqLDR0Kg z7pQZHa%R}{*Gzdcp5E$HPoUfxzo(oTSN+DPR?_r7FXhspycy3@$Iw#Bo$Yp)R+h(J7X)-0r!Wd`!#juH=*&g3EwS6v69`{6Rn5awU%DR zSYx!#`0`_)JvB~UUF%Cn!dDyZX4dBO_-toq4_PjJ*7Lf3@And^^Nr5pr8ESJaw8Za zAPLL>^1w-eO6d)Z7?1-F1damE0+c+(Ew2LVfo9+^;1r+>@O98w!{u6DIoe*hT-#v( z=-EVw-eURlvx(yiMi(leVLxG@9%u&Ifs+AbCZWjOv@>KOF&Y7695Ik*#6WftL&biO zNW@41NE%`wHHd)(AjUZWa(PhX>_zmhdyq)Ms|ohNbBQ_1S@!B*O?|U~OdJ&ao75re z2G6y@6KwFb8a$bXp+Qp|K)MW`Bm=217|(aXvsxJAa#tWHg+KNVPgoIq2Pr8G9}YMR z%*OtZm%>0c3S$A1P#8!(VIbjzfix2aa!VK??4c2u4YUJD{9v35Ac=!vFZ^cnvC4sV z^2Nl>>f#PN^sVMoPcqKJZY~5&>?Q&12P^>21TFwV*vmBFaNu+x4Bbt@9N-Y(ynMla zc%@eFI|_|=!dB~r`IZN^@6(jF^GunGzUz#r-S?z%vfX@8IAS03%Jgj2mPK8Qlto(( zU2>>$Xx}02hwNx3z%BDf>>clUFSa93nbYm5Pbufy_pGTuKxwyMP0vc$ zuRrR~7GBUV`Bj3h>|ehvzN6xDK9QW&j0gMyV8h|vA z0kS|2P%MH9Xn+^MC^D@Er~~SO2EZav17V{OTdVG>X9X|eu4t1fCumben1CI07LS$08j{lVITrj0tui7 zs0EThJ&*#@fCXfL9MA}0JRen2qY3p06MO&$_VpIW zr~m>$5C{Vi0#&gR^Ho5h8jJ%8pcbeDl0XWufDDiWlu?2PAQFk@2M~dT(hU<3e}p^_ z1Po04&}_pLf`t4z1Vk0l5LAR56TFTXt+=P@hS3Ge&;<%09*7nKA^?UhYIxs4ivt+9 zNZ)!I*RIuJ77;$Q6o4^|S{m?M1VrP|5PCxk0bw9Ypk}PXJO(*xaR37xHH>T2EFcSD zV56o28sG&mx{zM;6V3Un~^?8%#b(vS?O_g(4t>84^-h zOhm*58Vt*o#>IrczELzqkOUed%gaP81XDyoFh%?W(`Y@KDpOI_eKda%+gd%i!1C|E za?6VRis9v*%SX>Co)bBzzpJ%tu(P9cWLftzwygJTi(bFTFC9Ls^Q_S`i)Tj8>_4N` z-nKMy;DezV>e-K+=HFC9Pno`dieIp_hsLzzU*W%Ar4b9CEc=|j5BVQ&E~|Kt@;}}p zRdF+7AM!tbN-E+lz?f7ljEcR<|M=;$8uu>$JsINUT1fBJ~|AA9ANrQ?&D=VXN@)LF;1HAi0}WZK3RB5Ua_Qlc03-CyZ(G=yq#R)1 zT45w+-YZw9GJNFb;t(qNHg)4U*0plX1f$;i%PLH9Rg*cJT=Pg9zpa0M!tQ-6<~iZS z_2*1*rrz6JR`pb_u8p(BHSbDY-Er4cUqknrwHO9FZjkP-`=n}q5!kQ1Gsmao>~~lD z4!q-rpuh5dSu7ff-Pd9-TUT>RjWs@HoxOTqdVksO56U%4 z8s!$U-P>q+9UI5;?f#{*3R7IwWX>kn{6}i{hsvs+%GI@Twz%eZYj-bicY8@oQ+n&b zX76gXa24gNjeN(aeu?_rW+(mX3qPg2wKO2>ZR&HomHryPNqK9jzwIa*l=Vv*jJ4rB zpIT-6)CZ`~?LZokwfzB~dOr2J{p){xY9IBvO`*T1sK2e_Z$9<6xB1kK^cViCPkoTm z)GnmIS4Jt%Z8vqf(ceE>-thlhWfnWM#x^ajp%B9FY89iA?sS8tf$J$YqF^|+Mc)|e zAZJlFiqV?%Eh{Q?VrV34uR?>&X~cG~k6pyr&8%Cc7!x#Vy3=G&Fm@^%sbEhrb|xG4 zvVYS%28^ELx@cG_>-VwQjLl`e8lzEd2Qo{eFR02+x4&#@lj{bV6~J)dVKxwCuQB$0 zW<}Txg}u(~KUi9a8d2>98SNK`HL=4KwoZ*?*gD3JQU+p-Lct!ZjKtXS3hSU(gV+fQ zJ5lNPvXd2diqc)pPE+W{*k8@gRM=U{a5Xzyp#j5PS#3Xc)Mww4)iUbu*w#mBs)YMk ze*^oY!v4&L8`yf){zXo^-b>?VzrySb8@1M{y}MLaMl-C8&^rVQ8)5ce8?|QNGNrYWeaoKIq-AS2D4mV$aFv~@ z_BOKj7&}^xgcv=V&a%6jw0Wu(vhQlrj*R`5vBhd{h@GjiV^nJ{J5FWaw*T3r?N{gz zA@}fR)tbt-E9{GE$5i&9%6gQ+S!}w>XmmpzyI*BjvSN;%%-9V|XO=D1*r957m@U)T z$*R@F{##`+mCnkWjP0)uOlDtYtWWKq%08vB4Q$ZM-ev5MYU^xvEn`osY#wV++1J!o zAJVk9PzOiU{^BHUCq+bHx3Lb@zH72JDQL}OpV!!}EMLKvEB33CwdQ%hQP@k$=sfnI z!ak$Yx&I+!?<$cB_K?axrwvxHH|X_Wb#NY=Pe-E-9>Bh+v4yJD$d=f%r)X=`JDB~Y zDcWpxP_utAMT-|sRM~S{aRED7V=rn03mAoc8qx-vna{(9wa7yDn#LYh2N$p(sq77P z-~i_L&`7D?W_F6ozNvQ4VyCHWnc6*vD^sq7DG?<{sUUFe!M zo2}5;O09D?J5OU5X#KOZ>^mBJR_mNbVR+ah>fj9ay2`ey`F3`@#-7qz+u0K;yI8T>+4CxE zR)?pvq=!X4Bhy)fhrOnD%wQQ0`!BWi5H{VznmnU3*s&TrPO}bSZ63D2r$Ap}%flYj zS`TFb51ZpD9?Ir<*bL7|o}&A+R?l!dTj*g2c_NG1$sTsNXXFreq=y~l>0HbX@vzf8 zY%!bfVJCQc7qdkkc7|tQF+0n{j`j>LV#j*eiJtsow$#JU_H-|1hkDpD4?B!?dDuCg z*2CBe54EhP^RTVaoZsWEjnmf!pY!hciASOPRVSB7-Wnar|0O*2b5|$p;9qER`4`fo z2lKTw;{P-Lg{ks+XL;!eUMx*9;Whno>8EG~_eU6Cal|E8=rzWFIAUhGQ4@VwiX|;W z_LB1{Yt#ziK3M_xiA55*O)zOsaEUukunJ$u9VaX7B^S&nty%J)VE^Pl`T6d9*uB1C zyvahJQhg(i_^HkrHAd7CQD4WCv%=o?nd-PbdiQi4J=@?XX`i%xJWKR?zhs zubukRAK+%WayK_i(+9d)3da8-Hw*bD$QiJ>$dB6dx|e$C{eixKJ>}WN?EeS6FNv|r z1^UPpW8eQ=V$uJi_oddgzZXBm6>|)^LB@PB`{IgeAa~dEFCkEFs4_Q*zxTiE=h8L_9Y z4qAzwhi^W-{qUWK^&QrJ*!IPn7Pl?lv8ZQJzkU2cdXv9zVP;{+f}*|cs}&d6-7Rw| z-1eH_6s;@QYqzIE7umg!`dgK#J(QkRE8I2T-?@A)+%@f`&MtmAb{@-a+g{+aAG>R) z*EqunSs(`}7C{9xzzZaR8sKAh4K>2Y?iy-@kKHvNyKC~~METfVL*Am2yC&GrT{$5! zi4?>%Dkha;5)+eZF^P*wLQHDKq)tqdVv-V*1~IY3BqJs{F=-SNWq|Kq6BByPhKpVy z`ou&R6GKc)F$s!ENK7JPQYj`eF^P*wjhNJmNu8J^#Uv#r4PufW;OV~1j1aS8k`og) z!mFl;i7F-@G4YCtPfT<%F~p=oOafvO5|gl)M8u?0OsZ&7pfeK_Vq8ob#3U^y88OL; ziNda-Csqpc!zW%b@rj9FOms0Z#iT+^0%8&pldzaXFe#AlScp|(5)+fSm?XrcMoj9& zBq=5-F=-GJOH49ik`b{Cy)qACN<-isBD~2!cynOVs;$;y^YSen^;QEgB zBkQ`?v30#`t+fM}+O#A z8NQF*ong8rgzNJox!pc?cTP|7D`z4%^Z)Da&WYU2#a*)d`X%Asm)+Md*_qGJKilcP zehII3w%Dyl&S)`YANEUj&y$mr_QrqCiIwyJ7k52U>XLrR-nN1=g&ch4eACX~Hg(|< z%g*~9pIAEJIrX|1<_rCHrTu82DO)wbCt zIg-dfVu=+pc`+4}JS);M2z`8c#G*-_{xbB(Zse&;`a0uILW!5{)+@Z#C%pYKis>VE zSEN12&&R10s7)-i#{ZpE3Pb!1sc#S2A19KbbMPT46&_#pzz(DEr?naN$({@i{-|S1 zDvtPN9o-|grNuo0BVna!$W~l%31aP8{IV~Nse1H7?v+U55};^ji~>J{6`ZTsO14^D zC(J%A&=j%K!zOv!sTDvebC3OTJ6y-kX$3H|H z?o%d@%xJi{j%%x1$0H4*5~U{mn$*U_MAp(s8oF6hiX6IafnH7;G9;RzV+}=&EH%Ua zcUzclQ8GYoIvNb50I*k$o4bBkf#WYCg za=Yu8NR@3pVED9)yDqo4Wph>Ywtk4Z22vEHXaHywFu;i;QcjqfIKiaFGy;kaY`2kT z-}n%{Y0?$qfgKIbAScFj_B2eYwvRW1zJ}#%)~|kFi+@up<}F@@aF~96HHse!AG7S8 z8>30nQ*307j7IW}HTg_ele1mlauh|Mn3oJs#xN)PRRkk!3Lj0V9k6Vs-QH+a&-}Jr znM(1I8_RKR*s6|i>u_vb+eB{$f2XX%6j#+Wo+9uatkZ^xtkYdjNR?uU=F zTvgL}jveg@6CLe)gJo4t;mX=Ln_crfY9@tmjJ_PLvIjzwylJ{XaFOhG`EHZid0W=v zc62ZUbS62BQd{OG=1A40vj!>ZiT=?O_yw2v^+piDKp81ko zj~3!1w-fDT@|B~UAvteH@0>bo=F4R_jPaGzoOPTjHvjgvqvjh!a=X$<Be$1#ENoTBw=I!U+m-pcy;@dXiYsaw&#}`u@!fe?suWGV zf-0o2>xn*w`3Q}r`iOVu?NSqMhL6-Nj}_|bxKf7`U9{x55)U!&y;fFXimPfGPaJJ+ z;oXg1^)nQDAV;AGzC|GimeAh_g&kP?GoM;<3xyA$A<%RG!>7JVAqUQ-zqfzyQ*WWL z0~s0u{S6udeLVgB!tYntQRsmR8UlSEg&b&$`_<=Z`13OQdxK(9UUY!2sx$=p^E3py z<$j;~O$tdlCrdFem-q_m#YQBlKqbsr%~2;W&_Loq|E%GR6y(D zBNdAC9_8EDj^{+@owh8U_aBv2SkF~8j_24_KJkyrkISl@%$2orHoN9sH>+|#D*shh z`An{GA?IAz{73&$`H9pozM`*DODXJaq7OsX=`r}VkMyJRQ>liw!AGhU=PAr}CC0P- zdHV0N3hTJ4?0A0IdHPvdl}%jP49;n;dDnURz#o<3E;)Mi<$Vd|_Ijy;FN+_5LUqDd zouS6md4FAmQ-nazoIknxjy9jipvO27`CbIQ|Ao}RPXc37qr6R`4{#4dxs8-nxo4r= zc1T^~b})@(L%ZXN@@}p{{g%{bBQ{`d?h=eOenYiksFt)A(e@0>_sTIUrU9eHiz=s;K8J9 zD7W9ptxDC9T0}MWB9z;2r9x4S<9Rif5ce#U+wY{BQoW>FQLnuS<@S52P+UA`^Lni& ze&kSYe~=nVRgxM-mG&`|+aJp+--}Rge=4hRA40kPxvb(n3gz~ORK?H9-iC7fi_}s& zFH);GFMAQnZM3Yyy$a>Fv#iQ}2<7%ysaRar5AnyK1NUTN79r0 zk0`?Y#q>1)_Q`(r`X;}cqNn+X>1lq^bw2f{^c3GiPxCtc-ATdao4-rJ$F|VZ{2BB% z~MUd5zsmae!u{tKpdzCyqyFcr~pDh zH9+|lDFYpl0a!0V1I%6|-V0$i1|)$DkOPzff(G~i69@s7Kpdz8>VZa}dXSI+YJntx zFivI`P)7&|)MT1Kh)^&in5_X+R-`5be1HyA0ATmnW+NkFA@x(0tf;KPh=t_k%>S=Cc+Py7SIS_>^dbxBp{5C zi7-MY!U&lNBV;0i5RV!}NfK!e5rRw)paUj=m_H^3`Jux`Y#(Z1lmLj!L+J+zh|5Dc z2niO@2xx-@KTrW6z>bNaI@I!n6o7y^CIaS|2$*9cV2+7cIVK|HP|`?33_u7Rvw+Aq zlsb}-1-xt%9Tn21nAS2Y14X-tHqF%gZ1$D%P2hK3?d5fEsGTA6_8GA5$S zm{9;r#Py$BeQvOB)M%+?jLjp$IQd1Hzs8)=jb+q%rvpog*CFa9sokBid){*!? zSx4gIWgUqRiFG7C7S@sYkXT3JBV!$j50LE%6-xIIK0?+hDPKb%#tJmo zN(gljC{YCq_<9K$`q~Go>FXO%ts)E51e;RIw7ZYCx?jP%90!sz$9e)GCZxRiajY)GCWw#ZfD~eiKOM z34YWH0k;CRfCsfo&KM+Ws1{-+1rTp2zy~{{7NtG&LBU+!`s81O-3s0mJ;yg~aDC7E z9hdaAEqnWM{%PLrCl8-A zY%8yXr|s8sOz+VHM-3l2dPL-i*26mv>t5WuXyDM{Lq^*p?XCHagS!vvT{y5{_`p&7 z7x&D_D3PsOR!=`xDeRzMpWDAaWm1ZMo4)S;ZKCBJokj86M3?$vG28N{7%0w{x4hNp zD*3w@J1$E8p^S`e^R^gAE=vBXxk~<3;9ruG?thCB=3>2f#5i*yyz6&u^qv@cE=qQZ z0q9(4W#-swt%?|vE=p7}GF=E-&{?fOZvuY~Ui#;gm$Cq}Ld!5?)tVy(Iu%q~g{ z3~4X5Ppc`$wTqI9YF7zeJY%Z`6GGsxyS0XDTt(qpmk_CQ3DKlWsH}GhRVkMc6NBkR z6{^LMdLhIu*J=seS!g7_D5}Z2ifYBkdr?Bs6flro2uU#*UkLT8t0cv5Kc&^^745NY z(qhQI*v1kA_l1!07hLOQ#VCGJlrvlVV*B!Og`L8OC3-5dlX^$?Xn8@A;R)M%PQXM2+RMH zYK1kkClQwaEjKN-om3^;u55(miK0`#Q&!{+`CY6N-5fa=qZlvK`1#@Zdp1$sYxE+-h`6V%Ie&kP;wrr zk)O`J2qov03QC7570ScJn-DepO^7j$h4VUGbT?bHl5fGy4a=KK@ zTW=3S$stY90fyYV)O1ptXu7?NC1;k^xeqT_RFqY`FR|nTQnR?DApV=eK3Xifpxm_7 zf>M=i!99*8_im`9acCbBe9HJGLn6Vaj9)Tjk0tn&K}=|s#T5yApdoR%QR&`wGE9dw zh5WV{X$M9*#Yns8Ym;M5%qRxfvF)dwc+v^SEIw}kS+mdv;#YlFl~nb=lHfDuXh*cX zy-V;}Ep?#Q^pQHnnX6>`(Xu^E@EI?wa?cWcCZsMgLJLDA_aeb(jnsl8q>t1p4)P-> z_{5fc`(3qCp%|EiQ8W#FWDAX@q4`Q0QS-qWk?Q2eTo+?fnW&8zEmP0+I2`jFyAndo zFKnez8H*0`tN%^?xaThQt8Y&Ct2a|WZXJ!zxZ`MDo%U^?`V95sE~USJTtI>8Zt|&< zC^+3Ws2}&Zhv7%~fc~QSQOntc*U{nT8|N6bpKc6OBxof(sAD0euVQY~etjlC% zFS|@e_Oi=lWG}l+M)tDHWMnV9Oh)!{!DTbDmrFJy-_MZCWMo4wlaUR%Ohz{3G8x&B z%VcCjE|ZZBxlBejG-fiAc{1d(8QBo;jS@%7hFm5i8*-V97!Bgs3~b0{GO{6;$w=|g z+^e}vMmAJ38M%4PhFmry8xpU4^G0BlvemUCm&wS6TqYwMa+!>5$YnCJA(zR>hFm5i z8-mFw&0{v?vKiTs%VcCjE|ZZBxlBejx(Z2V*|zp z8~l&(Cn5X^NwW?%Y)A-ywiFVQGzk%y4QXxj2O64YT{P%gZR<8^qvQk# z_?+|IltMQz2hDP*L2l|PX}Mygl&6Dee*YL!2cLPo0A+$UpH zuemL@$zw)Q{ZhzC^%{{XLJAq#rW7)=O@xf2W#4;o>Q39`UQbJeLdL#h()gyl8Q>3s zq8%|CA^dJ0|BN{O!C!$YgRQWX)Xt7r&i{g`j!km?YgE20A%CoS4bj z_1#vVvD>X_Iu>rt4Z7%w2!%|Rgrb?HN-hxMtdr6t$!3i4zg7D9YOo_8u^MdDQasEB zoAYVx{U2;H3 zWhzHVo0U_}m3;Zk-9w8Fy>7A;3~;GPKKC1a)odvl=VGm#%~JZIDhU-<$%7UlY?k9~ zUXGxHfiBKs<#?o^99xA{rW}Q|C`ah|xL%gl<#^CiFub6@7)^n*iXH-g?=eKi2F~4CWh1bdb4ol%CF4kVa1;h5O(pt<>P>YXo?i8|Sv0-#` zJ0IihHDR-6amql%0?gWe2S~u9Bs7*&VSItmjg3 z&Zv}rsO*Y0d)=18O{{n0_~|eUGAumGRte3&hY>P9h`2qY(&38>QD`a`u)zTu> zw3;~RMFE&aY9_JVx)Ge{0HZikd6vo&J}m9H&uGZ_~)9sejVQrY}Aras0IQ+2xtJp2{K~RBS=Pp7!U`PC4wE$04GoilmTv_3h)C# zAPmF+M!)ityCA^{lmafm4R{FItXD2#S2a)r1c5LR2kdEr2IxRJ;03CHYQP870ChkE z5Cd$h1P7o4<$xQg06c(qb%`waDv_)LYJdPx2ZRXOoHk%j98lH?8c+(j0WVMu1b`6G z0EB@U&W`ruB0VRMFC<7{hDnd4+)!5?$YJm_C z0ir+*hy!Yb;8+ATKnF?z7f=p(fJ&em2mrM}9S{UUKt0d^M1eSFA8o(Fvua^GS~Y=tQE6;%k%{K<)*i{j>)?G`ig5LXYdY zz6OfLrHxRlye0Q{&~0A&JL;gg_tHy;->}_#_nc>`lc`DX%z|YyXU*k z@0@%7T=d+=L~6n|v2u3&?B1D`Gs!bMK)x0+wM7NZW9=N_T*rB_&`2eNm9JpGZA#}bw| zo;rTxiF3xJG&uyZ2>mnHF)?~)TFWfVf|8d1M-$iW;B1%DAIB`HUnrXoXKQq>wG7la z%h{Tdxk(xm@h$PvTcif0BUu|LRXtt0oHlN$OPcCs|L*{v=^F(GP!;Ce`#OX;zo| zS*t4hlcf9MPjW~lf0CoJKgrlYzCX$I0P89AC+W@llk5(_pCqArPOy^?`I8K)Y$)ST zavJ_5kHMd0d5}G+vZw0R^+9$`W!Kf+K{ltdc{Os1-Bj6vI(CZPf-}j7YAt1uzkXZ) bp$g}cRHku!mOGc+KvOsE-iPFnv9A9I=iElu delta 93792 zcmeFad7M*4_BUMjW>0sv-uKS!g>JfONT8d2Nt#taNZ1vW1O!yJgk4!WaTi5$X`ld6 z5`;$fge?Ms3GREMqy9!6O~#pVX3#O2aU31D=hVGP=XN*m%=7s?e?9N}ra!r<^Q}|+ za!;K)RqgWnXqWdvTG8;gfhGi>n^;9PH6YORKGjn4GKDq<5xPTz&|TnlsGl8O5hL_v zgPm}4ZgVa|6Tv+leuu+%U%S(gEB#{CAoS6NvrfYqmF}}I3{wll24teSKuCghemakx zHVG$sQF8Glabi7=*GSG`Lx7%){YUD=nl|9Pm**x=Z1idCgNYi+c@ciRu_YUysBOt1 z^g881y&?O=Pk%8Lifw2=h0yM4ee;6)2;E<*S0>h@u`WKA{Wl=6Zo#Mm63Zqz7Jp9v zbkOE1Tp?N0t4(G?AD2qFfCW(6Ebr~XLQCU9vGmuE46m29W7AJfbMa?0=`8%G8I2{9 zvkO!&mf@(iaX$Xr%tj?%F|%=yW1oWwt>WR(ClwDu+~i{PpIZdkKG&J;SW|^8IPzb#S%m3BwYq0ZabMA=P zU-f_Werfwt@{8EVkth?fzw3KD`KIwr=j-8DsaLHpQ`f8^-__*v=F9BGc#sL&&j-#X z&lm&l)8SKoZ2pxVLB(;~H%;yiJ*8FTF1z$uHZ=R|XBDy4lzb4>=Ro+Ljcflb!n+Kk zwWN9;P!_*&?eFa>sD{IQOLabt=ZmQa=wO)5{WTl!*HCv9f9G9(vl=+hbn@^HW3bpj zeIes&gDz9yp9fLBI6_gTs+XBnB2@*xGJq--$sNlvHIQ0Gm?jNQG2yL)DJ_ouNSEOK zgQ)^8psIq@JP9Zp0D=AesX|d!I&g&wf1D0X13?X;s_-`>s4|Y5Ycnp%Q$wjz+%kx& z!&#%KiBb|3q&svFbyF9>o(59Ep>et34CELe>mK}cH}0Ag_e#Rud{b+gCK0wh7dd4* zY}n`ZXdiarQU9{A@Ax@BfYOPy?Txbe{Q4X^jIhU@LRgFEnCP=S}~onrmIILuQ^>kGI`DK>XFH7 zQCE*lUQ5wHLGj8|HJz!`Xho*nWrB8+a2}ZY7o9s;-jylSW?4dy3PGEx`OxqDi!LNJ zFv8hbSjx3Jsoo0G6;t)D;~4|ZR5AY8PAP?4nNE|>bA1ERkmyFX0C&GtjY>ka5yG&5 zQr2(@ka19=$`rjMokiXQTNY4t%>quot;pOZb*2kYzWQtwDM``?#uOIK4#==adgzZz@HHJ);l<+YmAtYaCB-drCOs>m#hWL+k zWh+hIRb(_0CNlY?Gbrimk;$OEtA`$E{ZrHc38|GZ;~!CPQ8N$+Kj-K2jdRu6$dLAc z-$E7dqvl4N8VCLKK5!Xq1w^ZO(3fx+OJ6GT?5V*?(ZYiGyF8*wRo9g7r z&E~Tt?t#d9AXz;ST@NI$2U6Grp*nMtPF>amQDu<9d=7PdrCGUmYoE?qmhvzQ@PtlK z&Vg8)r*4$y^6mrwp!1~#0(Y^%t>W{@@e~W(B0d)!t`N8p*9$PgMS1=)c*PQ`NK}}1 zl%ySMw3zoQNjWGnUbciP!AqA=m3ZY6s!$>&G2z(VRFOoHc9vB@f9fJwbQX-0r*O$q zstlXI7v*B_Qc5bKTx+oDdr=-wiMvoT0i_g#(Ft%VjxB|pbw)^u@W}5)1$=a6Xa$M9 zL`3r;N<@;hL!NeM(vF<8BR}PUXd$XHQ4z!v9xTh3!h9lv>T!NhSs+q@Bk^Hnkw^g! z>)lkDgex}=|65cc0w<3BTa-t}2h-A!FOzZY1%n3a3YWJu6jN((SxZAn*PkG~j0aI| zk&pGib$k^1Ao0HGJx@gcZsIM|o1WLvYnE4BFZr*b*&(7Em1MAuz*`|Nou{HFF_F?pZ|2~u3 z(q`N2*yy^)v);SbzdGcMtc)#BEJba1Ywy%AHr!!aV6oY5cg%C$8kysr<(LthrnS1J zCT_M()=qRyNQ|?Mjf^(6`c3*#o)KucV`yx!Wl*Ta(CqDRF`&MVKCuQ*J*som#;Pq< zA-$o}Tdpm0l_ZL6g^_$yUP9;9Xw|Olgwm#n$V^hdSTFK`q|vI=OwX?b8PGC?m(&Jh zorjv=?r_MJFH3Cm&|f6zaTyW*PhkT~O=gbtM(7}X7r~c&$QmH2MCe)g=7D=F_I;FH zK?KKusQB&_)5a9ji4@bePNv(G#g5m%(lH?TeA)`l~ zv1u%tFGXvmo+W5ASEQrZV5TP*pMc0c@I5Bt1C~RABf;4egkpar(!G+xD}?y{$__83 zuRZqg>HbE@{23@2_em_~ejqv&h3}n-G3dgs$)YOBd~iLsYoDkWHGfxFw1!%Q2U0)` z#kWzSsx~C0!CxmD>*9hVX$c|4on##$C7q;!kkU?a7$Ieyy=hKLbP1LyH8WYuv zYEXMXCcX8}*ZOR^yZxzA=7}364<8s`M!-9Q&-e~}?diR5qV()-k8gPw7qwDb@{waX z8vE#dZw$Ctd*$h8#}?i8BRhKw{-Bj=z2~LEBiWL`k~g!xY{>mAXSQ zdC8ZTb*&+^1JdHbvam zMI_Sw((LK4&fJ&-wUP(1V12I^vZkd(Vl2BystHEe+`d`Z_BrLv&bAkQp9_4wGJH1G z+u5D%(H|RsPt~YI{?+Lojs|cL_R45+CtEX*>As;F@yhE|gNml<9GD?%4NH)`H|Fpc z0mpy3P8qTGD|ifrN1CmHu=VBHc6|kG&wWMp2Tu}3=mYB}djo?e9`(69CCx${zQv3oOV<3Z})sJmrWKs=Ay0K_zGYHBjWW1 zQeIzxnVXxq1$~556Ugy}51P1D<|bu_fz}pYdd)k0oY;gGkf{Vd5^;zU`IYU3T7U3m zHg}jBL*@UyXj_b;%PbNag(!N?%kJuY$ncOlO_p{JvYN!m}EcF58W zdD@{!JCtchR?30(>U2b^w4XZd(4-yOv_qG21lKb;&2(ER5_=oHsejG%vhAAd1@H5r zi?IvnoIYSWWjpSA)_XW~Fm?bvrQc`5ww*54`$Xum*dyp6{rx7FZL{lMw86C&t#&!k z3fEF}muoS)!(~VFUGvbbuGwg&YZ|h+Zbp+_6VN!PcM8jP}&>&Yc>hJ1@np_Qt zsdv?)YL^~WxJps6s{rM>bV%dMMoO0qNn9{pci3o)?(q8~cbCE#Rmu5*B*i)hRme`8 zz=q`XBi!h`fDKM+vMv|iZaMHhn$rD^#L1hRa>*q3mIyCvRm!OhvO(DqqP5B+fB5R1 zG8l3`F;=>$!Bp?yXcu)w(-EV!*#+N}{bLyT{R5)pHGKxrPB}g}Sd`QG$PLz=P`PQ6 z#vTzCj}rY<{O#{%9<7F8ZqVj&AH!tsrzBYHm&zy!nPu+|P7O%2DIGY`d|9VJ&?^ya z&B=>V!K!moZ@XAC9gbEO9L=hU5AXJJR z6zYpm5i)3y0il}_yjbfIx&={<)Nt*vQS8lrcr1*<(H$G6q-dj^3fa$-9mZu(Oe46qayj} zb_#W1`>JuhX^*n~@o5abkUD#M8bfK8Q{D=6okCxuNCoXKplvm1JdNhko*MKELX&7iZvBO0Bf4N~-H8vT{__iaBk zD=C{ILOYN_*1mssFBP=fUJ=@kOj&3v-TvBdR62aPWsUsBL8p{rP13WeG`(3QADI2 zf!-6L6SSoXeMqCf(XJ*W6QeefrwPf$=pr3zLZ8v-bJ{T&9TcID>BM04j0h>jwxQ^V z2t6zE3`HkJ=t)rwp;IDsS`-^Xgy1V8M4??G^nwTtSE8^8fsU9)uXM`n^Q6UFVK|Y` zu6f&lSBq}qNz|Xn38U0xWIs#6RMTM+>07=m>=PLPV~_~(+{e3w`yu0)$l63Q7Q?Rw z{KvXDuj1u+s9slw=jwHA@b_9#fky16j8yQal_IgLMK%9C(*hB`pNM|wk&oRzB)?Q+7T1` zizj#VA6N&)3Z$n~4?mqU!D2mKPf20cLUtLxAGA%pL%E*vTMbC{Cs~a4;I^$*QuO;0{9cx-#|;qsQarY zVB-SisBvn*FY#S$0{CoFJGgE}hi*YXfY(Akh!q0x9tDO;==Z<;`s>nEw^VN>Uijw) z%3E8%fB-9?jW`X;UUiAOKOdKNA&P<5Og^py>Iv|-iSyFv(IljypucLQkE3IeXT3)p9j3$D zL$QN?pUZ1GKpikX9e+yqRCs^#N#@DuK5CzNZ*q@sk9Cg^CwCin$9J*2%)8i~=ACT2 zxjnhVx5K)F+F@klb38^*d^@|{ygm7Z?}_L(_cr6U_~XXMQ z2>Xcn5%yv8!^wwy4_P0g9tu2Ye~^8^{6O;l(0$JPnERq`x7+BByI7am#kSeDpy2%S zd>`H6m1=eW`16z#WU2N;s=IYA)yTl*7ilnXVUecX3>C+JF%_;)uhHIWY>{JGxIVQ; z8}OoG^R7u^6RKqRdM4et+ypO1_$bKZ7nn@AkNlQhZ4W;50hNWrs%!?krZo=iw|b3z z&Dz!T_@BND)4znD51bM~(M=EU{N#y;@W}a%HC#w69?`;_ugZQ%oS(%{nxd_#O-vtIA*U;!kkfdZoYpOu(~mwbrz!Yu zTq>vku~kklh3_BllGF3{%IOd9l+zaYzW9-x9tdCmVmV!VK~C@aKu%}Dcdj^#e&>BT zJ$|*EJ~K^0SN|RS0&+UX4)J>AG=guQ_D`=Z6?7cOQ$)rg2xRarM!piY`Qq`&0dqCQJ&EAQ4WPV zk)oeDf=svHQ#=lDYVHHxq}Ea&THj7RT8cx5TBN0NjzgdJBEK{Z(x%CUaCyJ75{Z_y z5dM5)c{OX(kTCK#6G*%uK*A@T3{WN@2~Naf^Z*j48y10(tOwM^aS;EMmy5(<%EVy; zw}}KsM8f7i`pzE?<|%}yzR{wnAlXc@xxm9Tkze-c2@^EEZ%|gz3`*f5B>(Zk51&DB z=%G`IQVS){J5@a{6PF>LPmDy6qfFHSKg1k13@pI)AEtjgr0hb%MVCkUa87;8yGpzzmo+2SR?r#1%7Kj-TaVA)?tzxs!#Ua{U9hf zQPb-@zX3|HJQCvwt_#HT@bZAF66=4{AP@HTs}56&cuL1ofptzz5%2S1K=lA6Py66N zmMRZNE~q5D?}D=`Io%nqOb~9>dDSbK7)u2{rXcvxki79yI(hX)NQ6LFE~lY=mr~Ga zr-skukzUWMGBI*_%*U3`%=+N6&l*e=4t>KI@Ukr$IX+QYU)JH08%hTZ{QmY2VVsr! zg|7te8JmiHx^=-)ujG%Kj*#4v&DL*!jI0QMOpnH5!Px6M5V77PxwG3Ce8eMpQ-X^Z z@Ir3NE~P`SFe$Dd_@#OVw86NbBBr{ZE8x5@(goZZSM|M2@YMY|&2!(EsfvE==c>A(swYGocvkCIjXqVu@TzWp<+(_PEdVlEgB4>i7rG3n@86@B?@Y$n|>7s*G{VYmBQZJ z>PjdZ_ML1k$D!qo^*FJuaVvIRZLPp>Z0XyI{inw1sSy5ri@GrQ-3pzO>ToGy1!p5) zeh?SC(7UiCB%i_56fwWW(2kGBq<2y!{33#=`c8K^l=_k}9oMfXA!nQD)EFnhyerU; zHe8aB_9_8ErWS;yz3{h5y@jH3c)e!1Z5>{fkWRO8{#NkquePcgPNK=NtRwPIEdWBe z+|V5cv7hBa4ig{>i&2XTkTaqoV+xJV{G+9V7`$e84s}$ND(<90ilcthzcQ* z>tC4(Q`m)w2z*L~L^g6{!sOm6q$rcXOD-g;V`OVPl{t|fR3m9ZDJ0ZF0$=H+?vsY*+c>QuF*NNK9BQe;V2Qf}j`DCJw!m6WF{Cgsa?B`Z_)kxnR8Zl2Uo9=?L0 z%%m9D^1ZZ>Yv>fvY2w9oM6P7H{w_goz#$F&Hx9D32d1igby&G6{Xk(uL=JRMnkfWCmfDG4WCGv8iLrvHb^W zrKmLRs7b8g5v6Ah?~wXa4qe)j6G|Z>?OL8E3kEP3PjT8&l}(^#5BLpz+C{h8N>g%XH0c z{@>bv8~C5_N6wF!kD?#AKQMj}f1iEd{J!qJaMT$!N0RUQ-euo0zmt4B{Fd`A=B?x# zzBjCIFt0~nbH8SN)%;5GW#7xrmzbBLFNUup6PNeaw24I+{G< zJ7PUz@6dIG54#T~5Bd&T53*02pAPJIJ{j2S!H!*)b_1*3o_IX6)&Gd+A;$xj`wTAa zmc+)$J^uBHHHKA=mHuUky9`UTixLYWHvjGZdH!4dbNsXXGyK#17XK9gWRZWO9~*Di zju^y_@C@?|F${_{yPJ*8@d4}r^8jamuQ6gk217qvUr$r0Poh!ZXlZcu_SeViv~{Ll zj#@A7_jz>-<;T|3vO-ucR%^{ktxucO_%u7KP zyInMVslOz@kgUEk0h)LVF`rBs(r7JQ7Z*ZRd_NUJN*mX8 zg%JKaS-p%5<43vK9`QqkCqzO*DkQRmgi1(gg+#89&-M%#McjDYXenqhN6&CNT`Ga?cr*Wk6SDxWI{qIB-BDeDpK41wyYpzaXIkAyFbE%7uh1BnYDr5-K5~6%vJBsQNZ&eh?%kq=bZ`5Z@dEs6fw0 zEr9g49#BmxHv+CA56*XMXev*{g)`7i8Q_N%{6~zl|WeHA}LPEt)AAA^%kkAQ< zJRwnO;F^LD!?X#hY9S%wi^lWGgoHv!WC;nikjNJjB|<`Kx&?{AtPScpIQ-Vpo2cL| zyZZK_G_#Q=*8>m!X~OKhJ|nQ>Gc}91{oGiLZEwj+uwirk6uhqw-M7ef++Z1jlxNVLPr@ox7M_(Vgy{#+~tY9lmE*t*DkM{=QWVRC_Q0c*F}4D-?Lk$K*^*15i0t+!IQ z>TU_oan7;N*3Ayjiq7=Ta7;IWy;N)}JJmcjIVFCxf3jk+B6Mv?ENz9mBjsBSX*-!(iJW&%jViqFLW;8Q|*gH^vNFgQ=gRueT}E z2lX*D+8R8)L-mO|eVwJ3tJYs*uL)G!t98}kDrXf_Me0# zd*z7II%gh}XU(N@13C7bfX=RSY8h=*Z!nf`~K)Y_uk-lTja2yizzL|pBI(n z9D-asT!LI19B68=*sFAigAIq3TPSW^3J*Y}Wid&JA3ito%l7p24&1W=fktspjm6*6gslqC@gtwYRz zW6Jv9VJe3ywMR^C-P2RUB-(?kJCok9;lDGP=9>k9pmzJKkESFCCB#_#|KwQ)k>1D?+fURo#s9fcTlQ+X0qH(q zJdhre#{Kap*(c3UCinUFSz-SnxyOx-IKG?RZQh;S<=bW5gaR_ zi*IGOnzuS1wm)QlzQ3E{oASxHzKRl_Pa5CK3t1=~V)R3jg$;@=6X!0U*VJ z;8M#8A0_$?c-c#}^%@Q*YM_*s=KA}}zo$WmdLYLf{OmW%FR8gHRv0uKS`_2t7c$eP zq4J&(rRQcGAy;-!2!H&ca=#?YwH#@J11w{gQ+U;%d-op!DO$O-B)s^<6LKM;77{uk z5p0__*2+z@#Oyu24_Ij9axH|EsZatgS*Qn>G}Z$WL%$_i6a*~b=f@0GM4?Jg4>q}f z15WHy7vZnYjs8ZJilc)oD*p8R=s|d>IZr)=qx1OMA~ANP)?$^JMAA^TzcUShg8gQV z9YHbEiQ}PTo}=cY$!C4fCXX18#5h^~B z5OF7pDI9<;KL1WvyJd%-O>7T6;n`+;+<>Devx@OM%gP3hPj2>Yj&5>qGH$YO)NQoi ztGm~Hk9&i0gMGbyoo8)mO=7ivwPh8R8bEf3bESI)yWG4yxy-jLy41Zidbj&-U9zR zs$EqQjO|k$qa#M|8e^)%d`SrV^|k+ggg3k8K?xf<*^DIkvS}NtPRB zWVum>T{D|P_=yRv9eCcj)&|biCfTGuMEPH0uLZ)skoyHYh&|@#lb1oclIjV@Aafyl z&V9~!&VAN+))%k_s6fDPhy7hUv_Ew!a58z^eB5}HmwlZbp=X@WFwYo$_5(U@kC%u( zy8ZEe>^}3prQH?9*6%X8&qT8s@qC7Z{3d=ABjI4e~5i3 z{GjeZ`vcDVnfu9xE!nKa^OjfW%h-F&_XO74*X!1Y*Xh>z);L!&tIUq%N@k^b1-6un zMq3qPGynFePf0=bKyiFGDUdzWJCge#FS4g8m+s*VVq zdsB02o;MYWpH)k`lB!4--`uWbnIRQ5AGWG1nU^j}D&`DH^ckokon0%D9ATM#AhjY! zu5_BCdn| z!oLGbJ&WMvTJ+zl{9Af@YGdF@66g{{tR<&yyQAedMAdrW#iM>yMnS4>h!!}O+#sJ48#FQg=EgZHc5&_Bt-v}D31a-|hB+#T+$f0thNx7_ zjk|8qmk<;mfaq^fN62-fAjJg5@t;(UqkC3s0lyj7EfqDt3D*s+A}F5v^9|FM@H>&+ zf@G0b0cLL;q=J|Jx&_gNNRan`RxQFm-&$9Uvp!Q-V%NMr>NagW95a3%|BU*~`6>H} z`QzCCxIWT<82XLvee|9;VtP0Bw(BkZo1xcjuc24HFPmP9U2}!?q0m*^74*FKlIdbB z=(?akA3AG0g96^uCfI^;9oHWVJ!?CnI}!$6N%)ZU8Rx;cH~O^WDeZpalkt6lJ@!3h z@kQ+nvy%2<+9d>|dzKq+Rr$uL1bUONtrO^lAU2FxH6n8Ksjk%1BH zaAuf!h<}iNpr=_sz;84e{C!cAqtON0FK@lSF4QYh8>>lFqiP?MsB~3m%fn@CX{^{$ zWGd7a#PZlYU#>Nm(do2djZ++@4U5#erm7QU;C{`~rvs0YQ|1uVjLBLbeSkoqigt1q?=qFl1M)6&G1o zMHL4LbW`cLx@x01uCA&jfbv0I5$cg7-U0$bI%_bMb72{Hd1~Y^QELkL*_vcB?I}-i z6Sxp6=?NkJbt~k`>IvoWuizFTTRD#jAxWmH(z(dBZNMu2 zl!1t*hO6xiL{u%^Afj371{I{UlL<(4J6*U2!X`y`j6y^M)rAfA$kGMjBEwHh)Rn~* zmb5O8t9zow(P$8CqFj)w3sc%p!p=91NSH$&D(VR#o1h##m%1lZ(-SK2b_)ploJ7H(l`R43>tf{GDuR2>*CNIWU-;t)?ja z>OJ*kI3gcB6#Ji3Dsknrt<}N)iot~xX0iv@;^cG6e0=a|>uYVG2iJ(mLys0B4bq0f zFF0RdUWi@|!xp>ydE@i(%j{+IW#=X4lJz2WQTH4Zj9zeGFkXnCXV06@C(rrLMbDCz zq4^9O2>X+#eW!_LAaKflN_WbBl09KQVLeVAw;rR85gkGN2n!klV~6{&@o@Z*@lb*L z8M6IO9Sr#FK3;3ic%28ZZChm2Z_5 zln_=Y<+P@Bc)FEZy#1->dun|T1n!UD=XbkYmNxyC#HP?j&%L&Lpj)huto5#OtTwIE zI%7Egi+Oc9b6a$td!BKgd#>eH{Vj>vp;?}pwi$-$Xj;VL#qlS`6k`1fQ9VPAHI9jo zPPS655tDb6W29+>c6e;4e~1fCwNrxv16}xZg{ThyeMMPLrL|Gtkf;yUd3xDu4K=7b z!g%$LN?(Pe+*GD5jbXM@U5K}8dgmy}E{jv=)<*G3je7b+hU^Z5%Fy=9&r{o82J^AM zf71C%LC7(WJCREeHH_7W3T+hvimZ=2 zy~vaSCZrW#HcXPB*cc=a_R$tJOM*;6LAwkeY|`oR-?lYA-qoOP9oF}wE3j#$Xdd48 z>+m9cZDobNz$x=e;pCXaAhwA-G_jvxs3;2lvQkCsi+?>@EWZvfRojOYUr6%wPeqTy z{!G?5S@8IgtbyX2io7scky9=(2vb_@(w>kwWJ3!6PynpBxT#J7P-j4Zf}b7Fl2S9l z59N7pNBSF#GU{w3;PqSm6sLR9!R1uWQ_LwQrGc|OYk-l(c9=Vohkb{whkb{vhp0ow zXW|F_cBqd+F3OaY>F^ zkFWOcT^C%LtDZ##1NrLrs9e%PviaR4C~Ku*C7gt23)MGa_u`6s@u+gO63;7F-$Zm@ zC9rmbw>&)g1t_;|gxiMno*~JGaa4uJ>6>O_=3BEN_^;}wYB=`oOtnF9NPW{t3jb8! zbnl!}SZkCiVf9c};C<2hBK2b6n*EyYS~%?>lcjPjNa>-8trL5;UOE(+IcSEE|t2`f3u3;+xsc=FQ1XzD?Fm z)TRKaE2A4gS-C#GF1*ILn#>RZXWYR$h>nU~LF7^UQr*(<-MYKOcR80ZOQMV2i;aup zi+p!j@31bU7BUN>cA~n{&9~eZo$J2Ucx(I?7BdyK#x|n0@=c9{)+##LJ=r)pt^L=5&i}4mOf?4vz^!@x?frHAtwzdh3>YXwpr5^8 zyeZJf-bdFb+~{ry_ojO5>X|xwFI_KlZB*~pvlYowT`5!IF7g%X3c~riyl}2FhsgHnc4Z~_e+LDx4M-T{~*Q?Lr zin<{Uc-vh{74|S{H`$J;1}%HqOa$jtsSQO6h($x@98GyT_$FAcTQN0ER#Genk1R4h zWtF9U!44LBCAL?ocaYvx4a|%he_N#<(2^q4TB2(H)lE3kkSN5xlZ6l-TCKhx|JX3Z zi%Vw)q8?zJ)?d-~V9to3du*O7?$f^{b&!PqW`%0<&LG+HmO< z^ExbI37m%T(%xzhSAiVJwa;7)Kw!<1Hq<%H|h5!s_X2S64G;j;pKvG6$uMxZ8vwrTp|Ggu2={b0NDL zHgiw~yrjtx7c?bU8Fz=eT8480Rf9b}*t%MSb8KDBzc~nBZ%|Ju@LjN8pe_W?+t2IH zhtD~|Xvcn5cNV)oQy0nOC)tzX6S@=l>QddcyJDQ7vGry5OU9Ro2@rKH67s&_xN5qh zeLi-{f6?`vC8)oUI2StWIb#bL{OEM#r1ym5xapYoXzYl;!*$qlNdHX27xH=z*q$~# zh4x4GdG|W@n6P$tY^T57wZp%8d%#9^x~Tbq+vB(S=ef8=M0AdOj&V+WHaj~$%RkdK!#Kk|-7-yYO-v0(GI49XBdTt6$NQ~Eyw~TX*^^b{-*20xpNi$=Pn&P9_QNEGZk@gWpT40BnhgpZ} zha}ntg$6nYG6SP6?iOQ99PFAAhzL~wfRO_Ez;4hPn10c|?!Lyp@g}w@+{f9+*Jy2| z8kq(|?|401Z>~?)nd`K@!nMv?rZ!qbafV^eDif2``}9^lr4LlvD|MAjg|R$d#+I4O zlBK>Z{QV_~_<}>-xJa?WkFP_Wh`f{u}cAZXV21{v56Htd$ z$!uS?HQSt}RpQ_DQ}^izsq_OT|GD`BIgeSz5SbpXoDe69|37dZ6G}?`xAT~UhkQp? z^?7dq$Y*_v=*|OwfX_z1BJnQ0gv}t_zj1VkPNwW~{`Li%&jd$VxmjmaK%zn6eTo zW6MgYj4>;rGS;kw%9yhfis2`|RC>HUD<{Vi&x}PYp)w||gv!{o5-MZVN~p9|YjF6z zV7Vh<^u(;dI#|{(IM330T_h&;jn#u1O6Ag&QjDiWUS40tQ$?w)aTKF~ce0E(N6!YQ zDwlspvt;4L&!-x;@6Ev{X0)!P+p0N4&Hu=?cfk6U+pcn?AdRCZ6zTz$0Hgr>qSP*9 z`nSrn5GnY3C>^O&2~0u|xDS}wLnUani!#ZkFV?&RDN|X1o#Iq3A$z)X_R^pZGT0M@ z{PY0zmOD@uZ$tDh`%szU9tkRNKf;K8Ky-o^71% zo@t!voX$*7S}CxcFy0)VWStnFz)sMOW5&cytce=Q4mS@=4q*oC2Kt)W0hBS>*VmU! z|4g4~qr1`AXl}6ecGY`fPb5~0YV|dyYFm{H6jPzfSVcan(1UKuR_ZG87Ke&rg{V+p z06Ok>`!vBZ;nN3Hy;}m(m_#cHi=ARd92N1qAS`XBiIrRV=-$g(V8*&oEI8=>#ND7A5OupjY7k<(K@~6ycZ0Mb!wR8k zP*G(tK?yN{B(@$9vBK-dMXd0;L12Z4UHjDo+ITZWEiC;~99vVCi3k>e-5_;ONY@j} z>j`B+HDr^vCcFNSB5~@uRRI2Ezq)22kEo&kiuhXI3--i)xUN9vJm4-fEkrWtf}JWb zg~fq#39|?E>Be*Mv+gq{&caIP51)3PW;iRW)9{l>cja8ZVPhnZ!!`<}3Fvp??KNIuc}36XK`amI1+vFup$*d!>Z+0jX}f0P3!uZ|vH#TZfFK$E>m$H{?A zAGWutSF+YuYptbf18^k3$zao{f_l8^h1N1UnS(tqsPk0jY^Rb@Miq8>Lh8bwuN0M* zBDAD^-++lQ!oMRMpXpC%C3*xGd)4a=FkZ+}4tO&|zv(1Og+!&02%h$;$I(P@M3hXm zDZMQI?jVejZeVUIoPe*SCsffB5_|cq2m;D_LaOc%Y&>bZV-%|4*I~lkYWTOg5X$3M zSVE|{Cq((V1(uL2D+2`=9RmFgUo~I^liFFtSJyTS1@rXdLkNnjVdWnIIUnfx8(+8s9?Q5W9MH67vRLAfwx9+C=E=Aj~C z$~?pfQ|2KhB>Wa`Eecj_XxPk|I+L?i@EYKfFVb^a6+$I^Nc|N`~jFj{r9*wSk~*;CDw#idsf+Sc|~8V&ImRo5xdvs zm~XmWds}R-AHRE&$`_euYjM0uH$-Be9GH~E(UFaH<$=+zR*PA0N{kGR@C>&NGYmyT zB7?jG9WAD2Ee=1SE~fPO^IuGxu}vedz@A@gmDqJ!rfsBj0j*uj8;dY-BFe31Rp!(( zm&y)gQCXDIps>k3GPpzH8#u3)m|v!oXMOVAM41V_9#oi2|I&0A)cWE97oYp;7ueui zuOKVF)F(0@RpMfodY_)0S|kR`NR&+;{FYt;*`*T|l1K0lF1211%z8lmF_k9^%|{{y zJjS{TvWQz1nvc!bHN%2s52?Mf;PY41W9SZ>T3aeQR{ZKhn8ZilC78thvk>;dy3*fd zsewsO|}sc-P|*XPU-{;O1}KcBZM4 z%#jY*vx2L@xH6QOI5nXVqP={ccnd*}E8D}BbW`dsyu7ZYDovJg%=ukOnzYEKl)O_Q zhTV)T96!@kv>0-dHWQVB;30v3pO8NG0i%-lC1NZWX<1LGrYA%vdIZG1&o+%ERY=Tq z_mbNwV8+2K&o)(&st|%XA+Fp)NF3_{>3TvmKb3X~2!)m$?96>BEaWsrP;^a+e#f zeKfXYc!)C$ab9JvM&bU2#O2T>&qedaQaBrymv!~F}sv(~fh8S|NB zz{edJz}`=og1KZ4H-ZhI_9%Kb(GfcwITU)vf6$&<=rX>j*WJ0;W#K{w>r-~Pl7V?r z2baS+LCR&Yb2kIWWPLjw?WP?`*2h{|t4F`x{6rEbKUErWs85Xz?Ra z**7I;Uc<8!v-GnpGhNvInX(INiALSP!;W zWar=HHd#jLM<#}cV2d;c+oQh0*1>K#@ak>xH-`pz`rC{KL%bi`&)knJa;<%-zR5mR zA6;V%ZgFtc8SCP`*j{FkbVHcwC(W-7=>3Je z*!MZu<#>J_E?yYXy0u1aT*GS28dhyn=~UrtXEu`^&2ncMv&_n*!l$q*C`CYSm+RzV zSybwkIAB?97wJS{+DQi}J9p>rjCWt6XTp3teVkyvg~`4uz7CffG_P}3&!qyZXRb5x z7SH^!c;%u}&+yjH9FXOhf}~_`o})@#GhuVpb9-=Ze~ny>|8YrK5L`G=(;_3cnJPfz zaWZ;>IblB@IF>xB#|QS0t*&Ew=*uH}&>jP}?e^>n?M$@m;ZTr^h3hj^>RYh>Bp3u} zziup%`anOx>R>h*Pr+E9%L6dwi#fu1{D;jHkL zTg%PzGHa>=<#H*#M@9!1?Tx1 zo)+_~3T_p~-OK~G^N`mdSub~8yma>^Ya(5R3SNqYmn?@$x-M-x1L%1c!72xqd}&{a zig;tsnub-_a?9YAc;sRAsalvvxkCUc(Y41~q;o0q6>j^mIWNQipH>h-SV8=iBGv># zS^0l+S#ZnT!8hTPziqA|YlBa4zj=elk4wDjd)4}?{T1CS$(M95gE z*dqt|tgsozoR6M!o;97(24Zk_-F!NE%6H1j9pAE_v~$~GrJ6Ep7%s&jVzv2D@|o~K zC#QfU^Rf;uG0+_dKkWo1q@BCAliDA6(*7i|&~w5i2GKokP)U**+6d?Rs9gcjMOaw9 zCxM-lHFIS~7ix=a_G0VLwKw6!*Tb{1_oPHB^}%U9<1(=IQ}=3P;9t4eY&x3}OkNyw znYs2`b=-9Y)SLjPYw*pq&a}>;W|-mhD;boGHEPjW!c*f@*eTJQ-8Y9PJ3+X%PclzT z!s)H}1ZF~Xd~%$R(@I3gxW|M?J4X{s7@yf{W=&?3c~o+wab$c1Ga@=%H$2=nEIyPS z8Xe*u5+3XXBN+Q2-$3g?w#D4yhTSda0A>KwKWfw&!<_XC+1m;?Ih%-L)843Sv^G!; z=HAJAV|~1isf&UYOqkPdB&&VZ?kZ!Im7y53K3Qq3j90|V+46WPTN*E6OUxz7Vk4X| zWQ$6Dh1NoDG;LK(6les>y3a7{w2zdMa>RKE+-C*kQt6jyfe9)FvMecQj+X}gl zg}9PD9A;!3UYQ${x@PZBmb6I)+mS-pMsd^$$!8_ zKNjr4U;J25I5vLSec6A>eo1#J497`z7sJolpVK`T?mSYeBeyA}wr6$c!e^alnX`d2 z)-%+Z07wi;xVXvccLhiNR1g+*STwL&@iuK;3G>L^PYC7_*Af&B7DqIH5LwctRi_=+ zv_mp90s>~LGCIAdr4fncM&8qdS3c0}p(WEzOW=a(7FW|RD^meP$I~G@)0Ea{qR4o6 zWwiYa-MzK2iqPa!my5y!!5yf5Ch$CH?Xf= zw}SzNC-sDG8}qpFF*B^*?T?W2A?$_XeKCrV3kB`F4k{n|n?J&DWdGLduYc_VcG}>b4L*DjNFsf!fO7WwQJQMTKbr_sg z9%UP6y&9_|Hmq@S*iQa?V(2FSf-Kx{e$y1jsA=Z4((g@3f1A& z7!=}fe!n9qF(GMC;nCclO|Bvq!T0+tY}9M>+n3eCWv)O|et_ z+qChEX%CVsggpR~&ror!_5Z&@nAC)xJpOOFLKw0N9R*S6w3N2$?T>y-t^{uByb{=@ z{eS6|z(jnYu5+G%lW2Tc;GtycJpjHkq38_ z7hr!vK7~&5Zo}T8RoJ$*Zxj9Zl;?` zqhG(}A=fdefY8JyY5v2&FG1vAEo5`gRcH~i5bgLv<03yxCkb;Jg1ALlGCMntN8H-MIX%=Am`}`i}v7am@8d z%~}iLKe1)+UXoWtf1fF1?p7!mg`R|`6cKkZ{IkZd-hw{+gMjI2j_DA`MBEDWG`5cH zn~(j+6jH1otCr%2-)=4#@b7MU`JqcSWFZnZmwRf{ZX9{Lxg}T?(f%ZEQ^C#r`zvI$ z@v4*#t7P=lCK>&~2^qcQD=96SETwl{m(u#VGWxl#QhLfUDgDR2QhMW2DNP-f(Ff|K zbpQX6(ywDFJ?|qa{oP_Iy?vdOu7~fnMN;~fT~hj+LsEL}AsL-pBc(gum(nBJrF7&y zDZTihl>Q+q&7(c6ly0;_Bzh@*heb*wlQj72R4wKDU+ldJoKxkwKYq?6Gn34ch3;pLKZID~?O-MaMJj(~c+Ee#bfX35SPu zJ052rb3DqPay-H!2ShJBjB^{>(3aWzid72c+_>ubJ7QW@i};oYAyOo2ii7hfw}fA;1*$0H0`q(;xa+v)cxL-%1z{A+Xfzw5)8o_F zY1~wPigvR84&x;AL~F03$2GwNonozCuL~k%Yg^l|;S{Pj`|{p;AMU~P-=*#WvlJ40 zsv`A!B~=wbd?3k%AwNcnM+JNAaHHWb7mp!I)&5hzsedm69s6BSx^|qR`1%vy*^4RQr{PQ*@TU=5WE=d&k^H*^#`XXC zbnx~!yBZ+o(r|N77x_BczpP1oCu6(iP3YrK@{5Qe`8}=6g7akWC`Qw-=eHBnL)A_2 zdc_~ow?5_T1d{%K3ujTyf2-X5Yq%XR-JouVcd5{$X!zF*ayxe7+acM7?}ubJz7Y}| z9>SH_{aLjQpGr_+YePwP_?q<^cg^S5KBRb$MH$yBhx^AKR=mpg$2d*N>e(yYzlBfi zte=qG;O}*<`Van+Sn;Gh=}zG*3pe=~-&2CdhZLhrC+KHR#CMB)f4|z5EP?cIWR_&B zz*5MlkY%<~C*7U0dCYaCkl>A}hTLxWEs2*3VYwag6BQ*$@mW(=^LF#nEnCf-w=P`{ z|49HPlizwxSJDQPGSKi1muswX$l2ySfRgs;psJv3B2rs3O zq7EV)h2?ezQVpV@T3J#pRJL;CiezQ5N>v73%;5#q$o9A5XVCPoiW|z_Je-wbempB9 z4sU7){O3>0&gkEnmC&+p8S?SR+UtGkn>uw2dDh^_LMD-^RbQsV_TlfTQhY({ zsqq4d?(58{@dC-LuQR8{3na5)ydXQz<^QBmaa@Gz0^_;dfjze)J}|y0cVJ(7L6I|1 zJ5mS6SNmTtQJ~b2N8X#aoq|*|a1aCLRJGFaUuRD3L^|i|%&Ak54#%fZ6ir@2Mx5Ng zxCJZ&d4$CrhN;BC;th}@c_4AHcoBxF47B1Y7^V^ji$`Oao2q#bK-gyz=fR3ixV7TS zbW47+h&UJ5kQ&DluQtHJ$Wzui0I3QUDMJq~$EDyx7|h`cQgAYcg#yI;7mvcYC}nO2 zNYz@LGN^DlWeQ3#EJ?u?u?Y-Unu2pNRHfi#49ikbNXJ~>0~tNZ1!%?Qij=t=!^#w7 zFsw?!Yz(VYa6G<4>J%IbRtf5^P;?~Exae<5qtTyNsQ|74yhZAsX5w_$!addeQXe%& z!Z(c{gx@#*Jp5Drd%kyqKMDUhdcznty>0!G~9+zAuY9uB)p35k3YaZ z!0qGrYVX$rFJ;&swZ(U{ySZJidp-B?cYE&gZ4Yh>Z;dAA%Xo`+ldmtZKD0KnItDXh z+zNiV*0xMU5h*meG7u~!w^3bpTo}KX7jVOcj|?PgmngPwJ;H?YRhHIh_^Z`yMfog^BoKmCu(cI_??3S|Y7Pl0Y;Fdyroeaywo+e+nNNE2L zUMZYwp?YCxfoXwaL14aRzIuKLgO4-#qc4I@9yr!$pa!55HRl5ZIK6Rbl2SVsP#n535G%KrzD z?Bj`I!5`uqj{USyu-iEHiQ}hmss1x``{nivnhOz_DRMj=PSEXZ1wxtVc^Be#=2tG| z!G(xF6Mo#0@BnoH+rHyb?W5QO)FDh%hmixKXV??I6x+TFa!gu}x?LeBjzkMGlN(62Ybw32U) zc@4J)Gx2*?8CN-0`c`PAqPpw8nSJ*_4`r@n;A6+cEX)T;rRK)q)Wj#ypVZv^70LFOY=Iq|=j^1kYz+-0 z1MPK2R!oCN8l=tdrp@M}AkPg#d7S7WB>!l%yr2zQb<&ZrNbFB^0kwTJx@SQOE*#js z=)zhWNC);Px}c;%+T?HAR4+{IqWMn@8-?bs6hUZS9hZY$tK^YCwW`xt`f9cs?^!d4A!;qsuvzxsorJ`m-hIiQQJxF!*7wdx?laG29@uA| zOEge(o=Z-H3L3Q2Ku?3&u+OPydyOZGL>rN}xL%jq@0%!ITwj@d{_@^jPVM(iF;&N# z91W^ykk$`P>vg8}G10~%(LIB4cTtMFkU|eL@vId^aUVr0^i2Mi1&1K5!HeN=*o)8g z&PA2Q@W_<+^iED5sA|Kafdf@-SVx1Lfn!r`D4{_!4Z3KskOt^-u?U*r6MCoGrW)X| z7UKo(10}M5sy39;Ku3egG$=Az2ezrF!EhQFXfQtsLRTGERa)pIxxk4u`kVsXl`Oz` z6uQD((Ofp6=nv$TC{!*Vjx?=VIlSj_qmW-i|5*IAF4@C|t4(cAX9N-Ux_Y;n31#0Q5TFS9IG%QS(V@z$1k0z0&?mu1sZ#uZQxv`fs&X~tuz$di@b%A0tJFO z@bwS;<{FlLhIs8}n|MGTamQ(u5(Ms=37%#o#m#P(?%lBET`YqL_^3!)W zsx8pZSTma)c=hTQFr0R|zueFWgGiC;eG#>4$Es&P!ih($cB-7l!c6}r@d%DdhCc}A z%z(T9pGZ8?@b4ua!AVA>C&5GBg}!w$r#c_}@k=w+E1A-7QjX9WRsQ#+9I-<%QuItb zl?8~rqxAp#QjWyM5X7<~& zF1!q{*W)hg^=dIO;GP+iw`HPfpUDmAna||4=*nmEBL5FRlV?jr-nl09Xk*4rdMG%`Z7FKC&H6L zB0MJ~!c#&b9xoXGcRrJUneBh|71>yb%c|8#|D;$xVX|1q-0zo$L?6kdzZiDouQ%04 zhww;qLsW;>Pl!NQ*z;3lyEp)!!x;pBis6lY9X%dL$d*QIeqImKTW}g*m-hhZ(c2-M+ErvD{efckLN%9L;qGM_EVlqmcV@@36r^pbd(*dD>j9juy|L zFwhG6z@^&N;HcNudun}4Q!8#VT9^&cCh`WdkA}blHi}$ArYhfYGdL4?jv2w-KI{rRqu@{wKIE_+(jMX-QXdRI z=n!~swJ=5C+OOXmy3cW+bx+X2*;$(pCJ1~&!YZRcSsA>?csF~uaR<8tCsy%nHv-XZ ze5+?`e2dF!wiq_)gzP%j4ME7P6JG0BYhA;y!2=yQv5s*CyCMvO94s(VnU@9@EA@-w zka8uyz=L@!=j-R|=eg$U=R$BurrPE*=nXC*-=GIF4u+-%rdX%&Q>>HqldwZ=Y9dOzuembN$)jv235}eKV@)|pGP02UgetQ%)-Bu;b9wrZX_svB!vCK9Jekx1S|NN9X?83%k?xd_18vnou2sbc0G=(WYv9M8D zFRa~SpbH81w46MF2oq6!7`SQr!0-#^ec#XdpM`%Kf6x4`;~ni!LN_d7MacUj!w+LW zaK5See(1ZFHx#dXUo*TK3plT9u7zHmdR^d@A^e2{9-5<6+ywo}HJ8uu$96+4n+v&O2c(3Cg?LE;Q+%|4YaI*(E=OA8N z;6S&o3$6*T@~tqh;8pN+cL{^r_C@^XAD8i zr*E2hs&VAQmi-96Pgeh?;YpXTOmhZc&uZrag4RgI64acCzjz6$W9&6S~SdH zOIx5tGe`$P*rrAcWTbZ1xof>O0p6_kR_P%Bw4>Zu<}THgKo7OZ{dGBcYX1W{dHi2i z*Jmh{r+>HlJ{Pwas{gzAhZYEN0=LrrGZZ^iy~}Dk{ss+Jy@~4ISj^1x zNM))TiEO5-He?(E$-;A&SGiG3N9Rju>&mL{i6HC?T_4`rgxU2UK~Ie69FG|;62$t# z!5cXAVAMSIp%4JXwCiFJY!Lzdbkr9x-^ zs4qu9TT^AuDFEJcc@bXtH+`m`o-x4OkFI^LKZCQ2@xq=Z&K-=D!;2!ksDeexR^p{V zISq2i0g@_YH1PL5F}{XH53Z}K!buX7WGI=5trJurdFfD|4$+J2sx&x&8@5g*J}OR? zNvR}>9aE){;{5mpV@W4eIKL7Y7?9@!H&Z4_>{lB#=*ao;2Ycv!OEo(f zU}&OMBIj)?IjC+qXyI_G{{6#2mi1L@Rx1)b$~e~xCiZao^g@tsG!;x9zvQ`OgivzJ z1^YAFXByA5Ypc(Irt=N=C}W(6-d_oLoZfs-K! zAlE{_w!5`;v5MQzgF73yS9ibVKKGuGg8}MFGcYmf(Bi(TZg9rZel=)5a!->VUcw6* zT(v?NxE_4m_0!^0JyVTS*{R$VeliXOcR{eGv)9za_2?&9$MfU$K)YlT5+S(8>cLgb zGsXz+YVpy5PN$Fp0rPy|GzjJq*5SzXw!Q|1Hj0!YzBP>E8%3&OPlK_6ZSd6x>#TKr zUAWd!tF4WqmalY`h4Bhcg|ULI@Rge(`9TnZyFHN4URk)nS8Oikii1Uj(*fsO;R^Iz zT;Wj|A?8dgkHT+6FLUIF^Bln76wI;aID|J1C(&oeA@7$fQ=b_Zd&EXDD<r11 zTl}4vFNp^BnhOi03zVF|!C%v|ONGl2m}{AiC9R{;*s&!t z^zq@MA*>TQHdY)00#XUYpnj=alFqzmS7mK~@GYEXG2;#D>P5CQns3r9CfYpk{C|^X z5wbMGL;>-0{GX9#(XZd$RP+D)Y>HLM*_*G=rszMpqiHhRi0QH9!XmX&j(Jkq6cmi# zmm$jfFw_KGCNCQHd7&Bk)D760N_7g?@egZ>evJ+YDqWDnso))T=D0@qb{b zm1JfXGbS80ZEu9A={dDivmq{AF7dxSrnD#HD%hPUDf&iOwfRaJ`(HQz*V zLM!V(9l=?VjNpVy@HI{Q2b#uWOTVchq6+-#CmTiCCZ_prYHUWah*1MIRrMSey*e_x zR0N4+QE+6oN(AX+$qFQmB`c6BHlcyMzCsyD3oERk!{KT**&gz}5|!o0t;Hn;Fl_Wwu0jSvjs~gqbEZY1|b#aB#a2HctgBN)wyoMKrZdeq- zky+oVR*H(?$b=OI9GS3E2uDUVa6rOJMRKLonb6cESJZHXxD0yko$BAB_`B65qGG5q z_HK2lh=Ur1l_IE7SgC}HgcTKRFRbveJzha$->a@heLt(-P*bj0%;fHtJ((IgRfD1= z-vC+|XTpOuXhTpx5|!O(om7k2j&d!s`V_H#jcF58A_k_@lB^gkIM}0c9b1|wQ!j>$ z9c1hW)xF#LEoAsH)D5S29gR6&jkKL|?ct4lTvD@0YOTRM? zNjuql;&+jtKkGL0R_hku=BU+W4O*-a_!otlRb!uLgKs^v&alS4Dz-wm+-Z)W;H7c1 zD_us$V3{77YM2s$bm#6~h#noU9UmR%8mAuzywyv3wxLgU%M{f-Fy8Ua;YLTJw!u>8 zt%<2M)s{+cc}%4#wJ5=J<$9JDUHhO=^muegDcXX@+^C(AEMI9s zhi=qXCW}^D7KiTgSN^#6VUeFN6CGjEuJ>vS(dqYU|2bKtK4&J>Hv7KT_iGaMH|VDf zxI{M&no0rxnEPAhtRzve2~FGEIw|SJ-&{I$pk%XZ7zN5YC{R9v0(B!PP(O+S4HGCZ zs)qtSy%gx3Xrs`?NfelL2LET2aK>wF4qUN8V`&0C(W1}J%5 zxI0a+t1$=>5aKZi6A-S!;06IVYBBgR0Y9z-V0zgJT*9$$slR1-(eC%Y5V@+js(aq@ zocr03kAakHrYp|NflINAYH*S}Uzn`@gEqG7FDxvjn}MrdcaHfzBV z%4+4TK8w*3N1iY0dpO@Rn#qI!mDJg% zF>7Yx=n|xXQmstpWV#d`l9fq?oiLg3mPWefx}gIhTB!D;(Zf?$FbmBXR987Ic^|W= zh%6?HipXNJsE90vrsHI2@=XR)ZK4kc)r~~o|2ZOIdnoFp~z-WF!mJkyS{8IvR8kuu9ldRxfRuM}w6BQs%eDQc^G@JikDXP+T(4d5Qg@xvgQvP0Raew6M^7ypU&RF+ zF}oUa*V}h{cSUw8cIpt<1~DuO^i^ehH#$4Ls0KOPvf7cmO^2s%iaNS%h50KJ_&4RL9xI1OcoU^~dslGvdX!xYL-L*;3xG7a%*D2EYp z7$@q?PeWW9QVPhH+`THzSeb^hHFTxYG?br)55(-F} zhRV_qpN7PYg?eVBX(%@h$Ll-gBrZ?9Fp`)_{MM5g89S6J^z@sJ<4}Kxax$q4az5d@N|SXZa7D7N1ZIVaAmTB1kOlSkih);llawvRdr)j;oP)$t8vhlG0^aRxz1L zFN!h%`N-YUxx@dm?qtLU0#@7pxbo&$xi~ z8JynF;XELm#|&)G;23Z^3cT{>M;s^Y$L$Z>j|oo2h0^%p*r6Ci=EsohAz68~aUZ+S zx7WOv+Z(*!dOv@^`995_s3U5R*dmZoIf4fF)tB4!JK}d~@6vCNZq;pZTXmMmMn_+8 zy>4A#O=LB*TD?lQ(zL?9+`TMdj+hve8ZtMT7TXuO7X}tYU=B?^PdC>D-be0Pfjc8J z8Azb4Gni)Br@N;GrbebP;DV%sOc3^o?%qI8WCAlm4XKk&db`fu9T*!K!;Dckb?HW% zI_>b`3yg>iXNIdGzmsXGeTZ8d&_o6^gVpW2HdCv;#f?54EBSS?KFgBn7UubVBAm*@ zoZ(^P{x7aHi7cv_Yo#JQdl&m9{IrvQFnb46hZXiSVWx$wXGdWl3L zf;mCNSJjV({*YeQ)y>9`@vy8J9o|@B|GQIOAV`ZpEI=CFQWv8*`*dmP<^x+@`l$D&Hv9i{LzC47wF`5}(0LI4c1 zjcT5inFlT`HKsnIFy6yId?WNva0*v8G1922z@`QC7k zqet5lo#2|FpWuUB1{{PO8+EMU%))gC$6CkoV{x8t9#YmgI<=iqNL!;H6&KuD*b%~LR)xr6I44r7P;hO)rPWFEo|G2*1%-9lai^Wdn^!Q@(lEsjA!2*2T)_(n72Gtk$E z)eg0*Dh`eW$2Z;3ibA zmYvLor=S+z+UTlU_B^U;95o0XTAP!PoV?6|^D)&zkPQSwkukS|8rd+Mh_x0}5PgH# z(b;9_drhNC(YhMh0sL^(3N$Y0k2SKP*dGhSoe3ANT9fdBp;e;5Z7S4RE4vTn;fU|Z8T3%1C6{!q;>Z)CiPm{o0gYcOm zKuv>UJ7viv9}rTEr$GVvln_f!h}x!#28HC)L5h{w(hz9}5mPx0@))6UK`ezdV99+U z76}b%$?YK)5xFr0l3Kvi) zNA6{LgxZv-YGRO%t3W|62vs!OaGR>)b`_Vn`qYN3b6`VTA`Y#R(j`=~#0{ag%nA)` znJ86uyQ(gBTPX=??~p4(PODT<*%DWY=p>0-L+z5kU6tb$;v?wFvS4C0b;U_t-0i9Y zn0dXWluZP_ski7vBvTt*f9dV2T=J`ggFjjlf{@hDTpDsES0!w2@3D^_*8D$8_RDVDg6(tFGw zdAqLAd)t;-f!kE*cY|cpM+?6#VZq1?HA|UH7qr^X4QPcm&kIIK72>;UP9%xppEp0p zJ%{W!Wu=nnCD)~(khEw$_o^-OhVu>G8=BW6-*JA&^O_Ob0@_!jLL0z$-G0sRiu&c) zw*%jDzG(7mUSO_2aLjqs=WquC6D$-$+*CFUi*#pcDnMdn4Wg{B3X`OLh~ z9LF5(oak)VZ2fE(c)M#L&5;&nWJ1u|v`povh9OQeJlQc>JDI2-tSJ2OEu z-Zajs$D=KtZtVQ-8lxX$>|(n(A$pQD07ApvwhqfMepq;@W2jabX^v{W8nebX*gV+R zZWhLu!>x{1ZELi})uL~)4&nzHh4|ZWV?;=0=c+f=alqIZukq9vYs|bx9j$g%>#O5c zo+@J%Tg6rK6=Cq9*QQb%c~rhqb17FEED0+E#Vy_ zzR)9t&c^2l=2?M}k}b4ZfydhivDR9n-as0194VHRcouW3v zd)4-8LzTKRT!AxG1lJ#wR*O{JsjcQ@;D-k4B- zcuSU!`4jTzXj(s%X71kc(dR!$pNwiXOV>yF?Dv68pq7vc?CfkECH>)(vlLiYM|8gg zUFO`YBUJAr^=R1Sx4+|Ru(^SlFOLRu+sD5d`9As>n_b@t>#@0snD6O=8oNIIXfoC{ z6I}#!nUf+b?|dIsje$+NUU+E{Hn$M-#WAo+S!VMptZOB@g0ZkkaNOlh??XBS*kt-U z_uqrf?ZkW&o4+c4df)q~qPz81($`cu(<5-owSK9lqb{F&E!Ob!qGRu{nb0}QhW|_y zpV=}KImdL=O4VOk<`#oZjDq=jJhB*DMj_=`FpLpDd?zu)<8AZMsj(f+(ss{{8CWMG zh3zw;@aeG~x#-VBbh)UjyMq&3$A98P#_omJi}TuFS~z0sKD${|DfIGMACD2INHehpWS8BJ(GF zw-~RY(*um@RZR&Nb;vuCShJ+^j(9)KSNGcosip7R=i4S_>zJKLs?jaU`s>nB4;3Fn z*3OPPBwVgHHM&Nr{8Z^=!qt~Tq;_wRl=t+G$>W#2SJ zSCM7TtM!A)J*OqHA22m$9sG{wcc9h%t!*I+Y|O|-j-k4;EWJhgM--Z@5t!NILwObpy#;CFG^2$!{}OIId6vFZF~%5bDhS1&CY+;<4; zlD{r|3Z-LoHPTNy_2+Ljd^!`(t$z%h+o9u6zm#@}bz|WgPB^yXT}r!1`pFxwmzF~9 znTTE7!lN(#*f9dNb?biI?;WI8J#@oxsVLjTJWbD>T6Qp6q>6QQq2Hg+8Yf!pT#bhG zXH5_-f|afPS<{g^-j#`7?a!JjS^%oNC$r{>=EKUeC!x?hSULA36f*q2D>E0<#7Wc> z@HCTu;qSY$r0Bq3yNa{)FW>xN>yk6Im%6Lc1=qwMfxdRV0l+;CTT1nrP75Z^3Wg z&{tKF>Dy`E=|u4jqDs{8#rRURD8DNQS~oLx<@0EIerJ`)vWiE(K1ls=^isAOd0%OP z=$SqdWC}VwL5(C|j#ePe#tIoykCmuT94V?o%a+vEp!V(-HRl?xA0F@UbQn9>4&N~I zFb?T)F5DZ}T1t!YoHrhlu(t3m;X$}%5^iRY{5seRme#7#kZNTGnt4Q4hb-L^H9GrY zbp`TPi^S;F>h=nBLoTU6AAi+Vqu9a1^Dboc zjjKh{wW3E+-m=a<|Gz#vZZwO&yH4~x3aRSPp@lDuJC<}sVNNsBJCJKd=hHSj{^2l; zWj?OgF03<_)ilV)J4;%MXn?&eQkDi9V4swf1v{Ih0QMV6f$1R;AhhU(ah)T{u5H*O zMv~Z@9ecz`9K_;a;h-eBcNn$yPomY~Ulh{Q?a+(R8i9POue9+OyTtI{p71;j5KtM7N1|G7ye+ufx|`b_6lhQIv&`=FL1ZcmEa}F3;&*%Q z*54i9;o70!5xvU=W5&_#j_um*;cbp>yx=dwZw+p-Zs8z))x4P##{O9F7%@YV4&Np- z(C7p=nm2OL?lbo}H|RIS*L$G#$FBFSGoufej5B9)K>Qj(ANEz;Ef4lud+~6dwTJJ4 zFTeb_mxv{1W#WuG71igACdu)GfkRqpK!!s-5Sq5f(HOldh{5MqO(J1|;u8iNv zVvd+4)2g2n2Wx<`HvOeQUA>7X0`boXbVbNi)U z(3M*s`AcLuG^{7BB@G6l4(}Z1sAnN6_qG{opsQ$<4Nr|hRguvpT7~ZQw)G)HPtgcG z5|>D!Ug2xg;q>DK@&=)sOF)K+0%97V>AfA((SyFW9e4=P0^@J}iD3#9=q*w;%Sbn# zHq_p(Ds$h3#ys0*#$z*hj%N~{4}~5J&>sX_nrY@2cw97HlXd^Yg>W$uQvBG;iTAPgFS6;uxj8&%w{ zs=Hm45xZ?e)cjmq558zS;e<~nB5%>A=h|v8#Wk%g2neT4tHhDpRNU>V42{rD5l;LC94Hp$g3xqR65Bb|_@xz3buEeNXCAoRD z3cccQ`!&9E1KI9tO~UC8C^E?<8Bi#0Rn(9xG*F_DJb(j=3^Kkkpvb2bO5u>@Fy<%8 zo*=AO!@3+rzTNgS{7~-}Mw?-d4EHn1BS5PP(^M$*Qd@mlH9Q*ffdw5rJ#; zvM{a2Uh!QvU*;|cFOkVL$3^W$Jvhs0VRS?B6!T>4eB@l{i2y|4nmwE+=(f6f;K_Di zp6p>jFooZ&`p1l?%|b?J?xg+^Dc7AjoH!nChI43q+J=-wLj*cwpDS?JS zk))D`jLp%h-YNFUhC9>{zwhZa_OiXc9y0{#Mv(c#VZ}Y+ZueNr7+sfQG~cNi6&)EL zp&g+cZs;%#vkcV@QD`HBU4!+IOv2M{goF}taEaquBF)|=J2=2ah2e^LJ$wNMXBF4` z)MhoO4pv*M`RZ_$qsmd~t%#H>%5`NHmAf=l!jx!~Cgj1b4d+)~;<+J(L!nhfsYHHmz2y4j^+?`%q**JYmOe z`QQ5kEeh$kCj1&@WgD0yeyM#FoNuJXt@_~ySI^!FGmCF_Q8Pu}h0NoAm0dYHdlaTF z?6JbQARc(k0g1z^63*@{n*j`M_#gh@$Cw9$KAFjK{`n6mH;Vj!eNg#*(H;5=#%GLA zN1u#Cj+G#UpaYwg#|6w5;m16Xzub39f71Af5%J)7t$kQ~RPWL|9fysF0tYSot@{l3 z#q8l-ihB(^*zG!$e?<9*erKyrwd%M3++%=7qgVoMMiKPWFm>Mx;{Yii4=LajHeC!^4%VFtlh$`8I$8kX}`=qf_xrt(;sy-ZQ& zRvFP=dDp#VznoRDd_L@G_-txNu)l+5f0?FU0r6b++6o3>`&*lo471lAFOgBhS`5fQ~i zC=<$nU@Im9Vljl05uzjl;xe!@Qw`rcdo6@OU;%LpSU{)-7KI6cKZ*8Q8^khT3E>-9 zWSRt_AOeC7u(E)NLLwk|0xKc(0SgH7z#`8n2#BY^2%;gdC?lerhzcSg(gNFr@HM#S zRbBxW5CPE_*a$%sSU|LhKj*wo&Z4jWEMMW@)vtR8KQDtbP54d?&LN`0DIlJREaAcr z&Lu+R#+PGo2@w@UR1%>kqBI~BsUkuZA&3a28Xw2taw1AKfOz}hN-XVz)xwz%t|y{S zIOM?)IO<>cw62eZd{IM7ywGT~50x_b0Ea4wz~qV}#8Slp_kPX(zyk&p?rJ%tWvot% z+Tz`$+Z5Vp+8FDz_bK|^8#EgN>kaE8>n!V-bvBI8@&y>hETn!K2~S1Q`7-RYHgs#P!r)TJi|NHYPGjoR~@P{RmCdp zm5NGtg{C4_TuCuqz7)Dkeghr?e}}2@>1~pcaCJ#0bqbpcjZ?c)1_*xiN{(oS_NiSd z%x&70Oh71_L4?q@hV2Q;B_f{)p_y%0mJlR#U+l^%f_Nf?-U@6UBfBRe9}62i(gYR~ zQA|V$5#>Zw5>ZWr(2Tb$g{f3H3*mjFR1hJw=Y}#84*=Ph}}Xp*+k?Jkxztz2w_UsuB;^}BOq*$Nkldg!W6GvY0D!}PK3}6 zvnz$kUb~VfN;V>FFZ9RYr$&%4`D<6^5+ox+=%2yn1o1?$!aG(eOat4Mf-?$SJff_y z5m`k9PedINLf6i&6bmn9r7%GZ_mCj$j|JCKPJ}R1jDHS-vW5tuF9pYI5|k1ma)=PR zRd!{O$tD<;M5`h~m{ErN

aKL`aFqCqm#Vf*$}u#Y9vRQB4Hv6*d;u-hTnx_L#8J>zf zX?c=)(%G->_nz0C51liei#=g~Lh*$AtmbUMWAH@W7B}N|o>8CiKCXK_^qA?f*lGJ| z1@Ieb9u1r_oQj;ZoMcWqA5lNzMLLLKHbD%t{kY<|`(X{tEE>AhEXZ|EM=J+Zs(cPs98 z@6hZB+-0~cvfZ+sfh-v6ZQiZAt)VTZEwRo11z$|)&nU}Q70+7=Uz%A9sV@yQMQ2(4 zWu}hitYlD2)0gEMd{u>3anqL-G^ic`%_5!xnY9$iW`$=&sGvDpM1dSJ4YDa9liDbx z$fZC*9t~s^D3;Tpm;x0g6sRhtfsopYoLw_tGhnebH`flJ=H@yYWH?ioq`6&80Zk?i zvMDeW)1Df%pT9oUC@$;p4ooQN{2Ox28nwHA2Wf`$7lLJVMxi>B2uw^B&tSq1`D^=Li zM=X6X+?v{^&sI*OYFus$DYvBtgY5)tX956r5U_&!cQ!6|mJ~ZHp^BZ&!ItyHay}1$P4Xl`Pv%qQp2R6NCC?DcGYZP`OaZoBB9=?# z7`#Bh3l&tc7b#>HMD#a^nx;1vR1skKq%Ua6x2j`NTNNx2~Q$4s7UP)q|H03vyV z6ng{5e@MPZ!1u7*W^$YF<RdFN2+^IMOoe}qd_Gu zM)Ger{h}I!n`E1tYO2`H8UV>#6s=8InxSM4H;;1>u8{OSOKUm76jikX1V3Zd3cuihKK z;<=I>P4-_LEm35MTnp65*WOr(6o*^ZA^Wv)Rp`y#?c<=|+`ApA2g9hAZj)&DK$nvlK!Wx|U@4bDq~#>=HXhaoF(?d(d%! z-S61P?seS9?r}h#0>>_Pr{f;>ZpU5hcE?tBi^IxV92?m_$9i_1V-367v65ZkSO#e^ zY#os6Ym|AUbws?wIxIfKs*Mk}!pN|-CEjdpiZ@u%58v(@+HY!86fHVi&27ulF{?df ztW_h{WciCC{O={$T}Jy6pKzCv{gx;0GWw5`s;b{5R4vi`gx5>^zw(bE^KbYnWVop> z!sp2%gKU(JtOa(*-4-2mu?GlHiyb$T!~Gyq7uJyD%Nv1(5M(uPj} z+>-aIdR}IcY4*fdS`5#!&-#2uAM5i8&Jw;W<}2KlpfG3R1Kv{hlINoFB74zu!H66$ zR~Dk_rxjTX!~KqazCR54IJon^bH;P=CtOeHfydN!R(m$=vBFG>&uw;dZr>TRz-nrQ zR8M${I(*uCnor~%jh=Fy(w~Z+be+_nj6UKLSWaC?>-SXjEESaxuVmDH@Fe{DEcGOW z<}oF{IjG#({+9nQ&i0?=xlF~Z8nJ`hjv)8rwPTUtuxwCz1l zk~${CN^lKOnd*n&SvoQnPyFhI0p4_#Fua?t5(anERl?A2x=I+>O;-t{y0pp$v$FyC zOwu|~!AIv7l`w>xUJCeZZYyQFO(hJ|rf(>W&JtB~k_B1#ZKf9!p8J#vnZvr*1}+zw zjur;OlSPP17zR&Q34`G2Dq#pbT_ucvr>lg~Z(0SHOBnU0b)cdz7dZ-Hs5`xsFuYDovBiuWv-!yJEQVZ|ZXmTkm?$9(x2LNJ%a2f(0&kBt{7g3!Dc9Cp z(YO6MD)bgR(j!R{{h*d7$CaURl9As--WPLnQ1w&e8u45rgT$;7iykNZB3gZz=04;^tF(H@B&b{%#cO46no53&cf4@QAMJ-9!N zJb9gk^IiAp?~4PKnbF~}`)uyr&b06|_Ff=R2L}}o1T=cUImNZz0YoN_t>GO)NMd6K52zkKX{{lKEZ5#nDx+lm{|qTj!UDmpPE<5?i>^v&6WB1&8$bBF`e@ zBF{qC0{eVCgX@~7pBJC&nQNTO&Na@#j_L7P>?|Loesay!&x{*AK!0L3SZDAv!h$=p z83<3zQ@AO?$ySJ5v);kq5uU_P3Qu%Q4EH)v_gIN)zE5w~`*e2T1z^Ye#+b)=Aj=O< z1jUXvcCwwuQR_CbcQ^gDnH*CiZr7D`iH9 zEFC3{i84*H+X~Ct>B6tjg_FcZ%pJ+C#9F%WztV;4l4VkbEo11yl~(F71}6(oPOiwh z>B7_K!d=NSQ<5vRXFv4&rEJ5rb)KY7`kvnvP`P51$!Z;YVM;8_uN)k+)EdJj4nL! zw!${-WSOe@hjii8Z!vWkCn>6-X7mMJICa}oKMM;@;f30^QCDMm@-R|`Pt&YkXfYJl zCJ$=!ZG~kN(O2`9l-VEr<%B-TB$LIm(Z0dC&b`LFDzGB7EMkg5K(k_@dcJ0^Znoi0 zlhHE6KFvABeTR2qpeHmwqK|bmV-;QMPR&Sg;u&TdV$s+kksG@4>4f(F5HvZNeX~Ye z;Y~c6eiN(jVrGFiNWGi&AJ|j>0PBz3Uw?%4cRzraFaB94X3^OP>kp!mzv+(q|Ju@W zlEppA(IObTcTCG4Q4-$C?9|+Ay2p8UU`OmO^<9STb{N_Q7tDX{szmNfnUhMQ%N5IY z%PeNMDYTSXs)5LV=c2&E7z*!_tt^R8R)c?%eUf)#q*u|a>#lv?h&naG*WbrfxGp6u);6#1DNnehiv?ecT|{g=|Oa9V)aAb#8`}n@FD={0e4+ zhj{(IRA*1xX~46ij|pVj{yIE4~d!!nF2Z5d00Ni>*AgT*vhMT5;W*i8c|bs&}! z`mijBeTkiQ;?MP5aq_6_1ypG?U#cISI^ct&sahZEp}?UT6gWJe0!Nlpz}ZIu*G38) z-9&+7cT?cudrTBMelG=1i0MPkq`)It6gXK(fm1~kc(hmmh+EdJ#6NSH80|dN+E8NM z!|m}ojE*=&UTOt5Z};xdE(ZOzLR1NJ&FbxjZT79+Es@QN%{r^a;@%WO#k!RglN-1OiyGX&oG zrkWwi2&VUAr+6kC(Za_Ssy0l}fIYgc6Zi??@i^N^aGVur8gzOKFoJ}}G7ynx>T*J^ zk=Q6T>h5ltfx6BN%PaH^iZm;lbxjtC#S7Il^_n^pYP{0Bu*F)$rvfIe1#ZsBv7AQ{ zk~4A*cqTgY0=cmqb&f%5mv~Y5O7`G$?e?7aUfl5R4)7$rxf`9CrOL}(&Abp>NR@*=9qTfx9{8E&r|x&X?*x7l`f=n&EX;&0Z`*(5{Gt0T?+?_Fluh?N!*@+@M7|S;ICV#m z4LGi`uQ*{+g{Fbs zi!O|&0p{PF|HQCSXzogp3(4xZ92|9*>Zpp}Z-CuNN8&{fUd$ZWyZHU3G++m+6~CWP zgEAVl(x96LcTxa-es0(>njJotjnqWzA2{ac$1?+6%Eq9y=hFqr9hga`NY(+CXvRsy0vzxT*~l&#h_$MP{qo(44B4QEkA?w25o1 z+CUM|sy3j@#iDAPbS8Y;rP2v_DXb=hu>N1aP=5XHP+&suRNGVo1pY3@3;ab&%qXii zl+r*)gUK`~GFb<!MRz53*?rk?nYrw|6uD@J;G^gT*99Da|%iR-t3GYQ6Dh?%Ze9V-V_IQ4_XfJ z2g3Uu`?ZizT!C8ps+MvrFm9N@S1qtLwne?gu-T5ZeWGdzMYc_oPvKaTW~ph3b8%o% zY@vFgVSyd-kGHQ^xh4fB#(LGg(DIz%9UmE|0Qxkmp4S@?*WI#Q?$QJX$H3p)&}MJ- zwnWeu?Z9@cLHyE*Dx~?UOM%8-XB#+IX`m#gR4Wa|_9Aa#q(FgOa>@E?%vj4X&zTI0 zk0Gd~|2t^WN;d?1IbIIGqhTl}|- zFT%{8va|w+c=69#eY`L1b$GSj=oRgiWN;U{n4dEhssGj`L9)NeH@9(zf)80A;vcde z4XOy4`?5V?&J0a_r~wn-yes01=k+^9tGn5wFR;rT$7$a>ccWcqxBBY zB;Q2yL?47-aXmqy-=ZCFh3gX6d32asP7B{_Eegt-r>u!v8;tdyI%Ay&cw_W6Ezvc3Nnc5z&=<4`r9k>jp!7wd2_n!^;G_@U(1iE1Bnl!glPDshU}J%!QpW_f zC@7>pZuIJm$;@26qob2JKE~_(Byn^`ozZD$z8PkmQSRF3G>2VeX8i6qe&4;n&;EXd z{P)^>pOf=gd#}CM`Y)Y#h&RSt5FYCst4FdC&lnRDjwE9$oQAKyRikEpP0ydC>@m1S2hIEu152`fv z7;hA+(xkr5nV!kSve&N@LurGoJ?&Cv&M|J~n>aL&cusNz5IY)JE(Tp?onwM$XJ%QF zf@kMU{e6;aWN0a*i67D@i2}^x9iSi)NFqOGKB80%6O`C83x^?a(6W?aC~X+ZABM&z z&{FXb`UDga8yVK=Fr*rWGKL}TFeEsdv$8AkN2Fo#Xgq&>JoOkFD+a7$lod(}91ci9 zUOvLiCzS-#=1twgqy)rwJ|Ohxt2+c^nIcorJeE8@mAS`$B6cj?rL0|k)dDjG;Ozc4Q>r@iEs99j&JgA3UBP*U_o9T|9b0sW_|xU`#SBq@EZSW zy)D}5S;enpM1Cc$(3GjnEwV2TcQ`xr9np4AyQw{nR=yP}bpm{Bp=P0Zfn&aYJ`!Yp zuXJKnKk5h5toSwFYb@6c&h*bD^H#0JZq}N^jn2mY8TJ|48T#qb2C{3Vtq<2Z>-2Sk z@7(OF%5Y`0VzAs_?k)3_`jMo7G4vxTzjuPC*i`H<>L2IS+Y7aY;R65I!F+$dUFct! zwXkoXidT1hKgML^)A{Cg^t0?^cc@c$HrtwVQ1r9wf~mgRmy?2TtgR_aQ+0lBe=`@0 zF9uco^owfsKBuxU5Ao-BUD<=mbm`Fgd=z~VR5`F}>W^l*E{;K*_XNHQ(=n>tQ%R!A zr+&0R{pQ7T%UBeReS+>KHg!j(>is3B4;7$DhhgQ|i^@4couxzkAcmA9?lV?v)bRSh zuGC{$-)nSp@-tMYYNtLt4n>a!RT0vB$!3GG2=TKR1BqC@Df5lp;}Jjq3Ek9Dy`xa& z-?JcGjG`BwR?WDmPWxow2tNT~UK%5$;h}{ruL;lJU;R;mdjFA{`zE4nY?`Qmhjc=$ z5p}|)C*zY)f~Rl9UR1qne!s(jcyCZ;My&4t)5-6ZAik+`Sj!pM(vhbqMTrOP57P4Y zO>2*rA^r$2Cuw>3?X(N!h=0A1ZYlm~cl#X^Dp2%UP}Pl9)BfB$DO8F0(LIS%*H6Y% z_auLunOPK78Bz4u9=ex->3IByd8-K}=Yy&cIsS^&S7MV9&%rB6j{nC)*Og2`+l>*cMVE@98~GB zW?EInJNjD0Ek943ct1IDk%{1^_wU?q9tFgZ~FOVqDU6(`u%jybQS0v;PIbP7eVELZ) zySnEFp3wz)Bywe*>VMLYVbP($z-C}1oXU%6Ek9r@mpVpp^qajTkcuZmn zo;bSfM3Lmncru30Im9(5DtH8wU_W6zZarq{8N?~cpjYb+clY1LAnjZHi0O#wPRkv3 z*I^SH)!swS+uR39CLYtR@dMri7Ec5jCY<~2`?ULzDRysok8@A|Zu@TSZvBn@H`rxu z#$eVF`}I~dwXM!UWQzzOOW5FM|K=#Ngqb#)HpJIQ*Lg(7*umBQ)%|w6-Gqj>eU)}q zc!h3xbeVpcCc4zKG`z&QM88D8*ttl*NEmp$O6MXgl+Fbtw%UWVV1aqQW@|IkY;Drd z3FBg9WM;$?F-IDWGvc`6Zm-wYN5v$^+Umd*-ZX%_F~*X}L`SivD4^pD__6#LKA+Fy zbNL)Tn;*?*@gsN*pUJ25sl1X`@JT$&;F$UTgN=n-&^C7;OA4kr%zse#>1u7c;f^;Z zEXLdZcoQ|O;=O+XIr~f2XQ!iU2ltT35`d(MWPHiS5>3!$EYT~2?@Uv_Aa3NOCS{PB zpYu>ZE?-y&hs}}n@n@!v-@Y+XJKX|i?cC~YZCp_Ja|$3 zHMVMPb-2nj#X8wyG8rv6(ead<%E=_hiJZ96NuEjl7-K$ItS^ot9iFquj(Xjz^A~yx zECu$l-Z9~PXTCSjgXDLF_%1w3lNGK;!n?TEtMzES>Tsqr)1P6@VAA_j{YqPkHf1nb zo9ySToKy5o04Ow>|4it--bD?gzT^KThu4U&a(D%oy;rh_>GRb(RG+^#rIYwku0meAiSG5H8vSpO=zez| z`br_0i+Da_SjJ^2Cb3_rH!lUX^np?Sw`V>eR{iGF*>BQ39eT>~l>VtGGSi!$j6X5h z?-$eA6EY3U`N4DkbJlarIpP-Dk1X|(GqFbrOT7tMA_p;@eZR;h;Caw{%H}uvfJ$et zzu$tSk+%CBNE~XyrCG0FAqnlnw?)wu3m+K3;4J=TwNmowQX)>6H5Epwf7%$SueJZlj5mZGS+z@jnR8?}uVIg@=q&PyHjW~BYT zoXK8WqpubMU0f{}E%gY4Urx*ZucWbeeRFB-(dX*5&vUpG8&q78L^0p8Oq?|o>DC2{ zB84sgEcGueMHlcAIXu_56ZiNmy%0#ST5rT0@CS&r0a zAzV}=u8&`>@U^og8qdehIUbj&Se<9}XQO94$XFA{m(7AxHt%Ua=1dHqii=*>UflQ4 ze_T28r*@OR} z^`P@s{{ia(&n+h00I_(SZjUQ6bH8W5X}^A-c5i&QcX$7d{$1XkmYvoecBJ?s`yf__ zXFD-CwO!Gzo~;&~q**pwH~DZ+#Jsi}eO`>6Zo&Ru;V8oAVJNSm2WqACwcx+&csyj!dL%9HaNa;2U7>e&HZM#HG;UU z@f6d?*J)H=EbVN#5hrs`ptXVKL=@$6F1*+<_|M!7Kb| zZZPf=RYWP}Z!ouv2IVxUpg|=Kj5IJ&plLFK#QHciO`%1!XGqgjT2f5|+LNWJmX_4f zfc61uqJ21;8(dVqX4*Tanf6C%ZltT3X+ZnWG|!|Z*U*6WJZh#qM_e#(HdSvP?GrSQ z_JWz$L|1F30qwOjuZ5P(rvdHnG%w+=A_m#D@Kn7P+7qdT_PuFoqpP*kfc6z?Swu?~ z(}4D}Y7xC;hJsvS{xYiGeA@qMKJ9umpLYM5zlv_tNdwwtX1<-4(7s*s*YK{(-eC*Y zQuP+lURMifKcfX3=xQ5jK>I~4*i1{d(17+Rb1k4t6OX% zK7RmK+HuSZl#7y;p#kl3XXR)K?F!XOyF#_nu28KhRGU_GnIlvpqMn0R+Doi8m9CdY z1KNG8HG`I9(t!2{Y}L>bEe%|>w^=LgsMSV0YPCs@TGE-eji!2N%cemN4RUFaM}vGB z6alo2kr4vgbFi&Il$_YD5WT}bR0<<5u%G3gdb0V{E*vse{zsB@LgMExSQpG4Fzn}o z2mfF=sv_=W8rH?%5xw1dD04r+-rZMWtBR#hU4#aNJ++x1j;qkd6E^rxzvl+E$ zhrXIJ1_{TllAG{PH|8_RCrjr#Q8KBNZ$ zfW}}hU;ltiUSn89bCfKmIZBpLVbq4DG-1gyny_R!6<}>xL9>^vq}fYWQK8p{PBj&6 zZLnzqvZKDiPE(nzrb4t0Ys73j0ayYBv*xg#@?-1JGq~KxS&epL#1z)N&9AdB~*CM;nnl;xFP2o%EM% z0{$w2zvd9|g#^CHCE!a5e3?hUB?(+2k*FzzhXRiPgm_8GNPrnjfV2@~U<(M47Ss(~ zApuF!yw;GUBPdyFluQVklnMzb2;rBKBs9UkQ)sp(C1XR0N|LBp0*E&xR!ijwNRvQX z5&`KFNKYmpLjoBJ8_sK$nG(t*tWHX`1k_3bG!oFL2+&GEn@Ye435-Z1V59^_rV}7} zd>XPc2pA)rJevD4Ej8R#z~@a`2^r>7yk@J zBp6*eUIODu^tG~B0>y+sR5?Kc6AB5KC;`FSQJ*z*R}JHcphOas6cJD=fzt5=lu4kh zn1FH#lr!B3DkMP3DN{#@d1dN2sN@4XhSIYR<72&GP5Y{>6ObN^+JXy+XBybJk z$x_aez^ohsu9d*GBom;TA;UuO0;UuO0;UuO0;UuO0;UuO0p_fws&`YU* z=uN19@*8@KTmkv&Krf~Kp_fws&`YU*=%v&@^it{{dMWh}y_EWgUP}E#FU20>f?i7f zLocQNp_fws&`YU*=%v&@^it{{dMWh}y_EWgUP}E#uUou@(BsNOMus8pPUs$A}`80a2tfAc_=$q^^z;O*-_Fz%imp<$6Su%7AE684yh>1ENS}AdWQ0 zrSmzCBaJLMP6nDpwc})yep(49Ltt24rR+12Qv^0ht-dfXobJKxPI*zy&AB)Ib)I zseug0%s>WYW{|i=C&t$uG9ao{21J$0fT&W{&?FE9ajcOz+~6KE)+FlPL&h2zkg-Mv zWT=q=8ERxeh8h`=p+*K|sFA^_Ze%c&5gBV_K*kywh%ak5YKr zr?3j!e$kL2DEx{=!Ykz43ctddv4!d*O?VuI8Jnr1bb&jim?`}D1FV1TDaCT3^23H} zg`b^L6bMH?#Iir0!rp#OzO_7v-r!$t{53$q`_`kho!w$S^qqB2n@3M;ShW4Y{qv0dyIW2e| zOV)Fy+iXJgHzkFf)#DZ}JeE?(IrsX6-yX@*bC#XxKyoBg&uO=t1yezVo{MkPpaUFc zX)|83Bys(#W0;(Dw4U>{SHv0!!) z6C+7j3c2VEao<|c`D-JB|C~b43<%)@b&=Lm=0GC+hyjp+$2PHhLP*dSjvgtTQ8SCO zGy07k`*DYOJV>@AiIiIv3kS2^^+oAI$Xt;^*4yW>g6}4ERq*+ONwb)~SiMfQ%iXoI z0e72!h)!?BIn}cKPY+K={L*OAb{%r%72R4}QjdK$14S?6Mm1Jd{rK1y`x+6Gj8~-T zyS0zLXhyuF<||D{K3tq>LD4RBrp2nM@9Zx>ITLYjhmh)ML|}?0YNh#BiLZ}nSATi;&b|U;p*)Q3eCb++WrtIP1!4+D zENBu+t)=-Y_mPzyBv&CPh-nj3J1}kH6V}qah^gkDG*wr`gxO_nzBq_%Qh1-LKIWaQEm z=4z!%_G+ar6?e7b)M49-iId12wr`jyRS(;BOq4o?ZDuA)j}6<^#8PR{8pg9A|Be$W z)Tzlq?n$XvD@{(jTB#!AYNaWemrGqBcdS%jF1}oOv+8NFKJAnW!wJGNt+Q z^D0+X4%^U7RK~QDm!C|zZl<)wDLutu~IRtU>)MH63@Uo zneLk+tO9ElEtyJ#%aN_YuAq$$W^co2a=E*PQU z{<5rKsji`#6C54mlY-c!FkNsjEUguuuWXprr)kh+cbuR1=wWR8(?imGQjcw!fC62N z)3c9PlrI$;Kbol|EsdFE2%W)j0R{9K8#F5O{kOR9z?NnB#<8y@;WumvtA&cD%qroR zMm9^BFqPGfB*oc4K1Yk6_+4;JW~+s}64D~Eyiokqqx3?sq(=BNN`+ZJsM2t1*mhzv zJ6+gRjlFHdesX|(W{aQrUFz-igtSO3*NdO{o%Ci93ZE{?6dG!VI;aqZrQ&B9Rg+30{b#lWS@LT@v6b^DN+#0GE;HfSCncCT<2B3w11Pg#iUD z1c-n`39keE6l?`h&cKPDk9jK#ik=4RV_B;qlnzx4Ol52%p@xB4rd!eTS8Hy|TL5o^ zISXcEoHS_kumd}00$Feq{sJbJ1sK1^GoXZ42HKc_5;_=I#5hL55(btszEQB8ffY<- z6s%&PPq1G%+rW0G_T1U3XFlvX*ZMyD?`+TAZ8Owoz*hjjX5dqZ6u=iu&xN+-tXbXD z&~8}uI7Uc=aU6_ip_p~6VIp2NwtF0uuu#f&tD&5Q&taepj4YVgkQ%12P{ktIQ8f!S ztS=3I2QZZl6hQ+E&q1sRLV(vtGafK}jbqF`KWHz`%3xv|P&4p-&}bpf!brxf?fGka zZdL&U7#}_Y^bCw+j3eM3fZy~OItp`_v9|FrhlS;A_jvdcU>@tsAk2lGJ@$?|HjvTN z+tHMD0pMB|ABE){w6MBbSir)}oW7Y*}z0N2jFFWnQ(-IeGp29 zi}*-0#%j0);5+yffR}@(Sfc_u892sqq3oWA77ec!e3LgFZYsi_h?z06SPsnhPFb;k#@o4L)N)&-$vMo`rc_s0!wD zu#?49Y3Eot%Z2LUaTb07nn}=(zn-&Ag~c2!;ku{7Dh})%^0}_&U@ga2!+H)jaNX6g znS-rdq#C+7*v>%>I61hEGuFTk?3c6Ez%CAMuDcxGW#L&iR1WX4 zaDjEy!YK~^gB_@a2RS&w+3Mjm2aj;wcpW%6$%UrDIlLiUtPaj_@Leu84UTj00tXGL z5a!_foVfvB6#Q?e7Z8QMLXmu!L&X;S;(-QEr``I&xFiO3leEDE@FS_BtpD$2ydmYm zNW;O%^uEZ9?(B=|#Xp&by7Kz3x^A1ezvq0ty^)FKU3(;SX=#cLYC7=Up#Bbjn~l;& zW)$CMqa-Fv5m|f0|DJc4;t$1cbKC~P z_KeJYLHBrOs-XF_bfYQYFgqgKZQBRB++CV3-!|j6&{lqHY>Q(HZ0W{$)xak6rpQLy z#(@oPOr`5vZxk#QnahR9%A(Ky2j!#eG%Iwu?=EY9iR2A9ensAZ^$7 zOiCOfB^)68dsh^R4g&xCc>~g@yaB?`-!kV;9_sg>o*v-0|K+3rj|+KcX7ZzSum;qZ zKcufji~JpS@sR?_3yRrW%l;(VfL7I$Hk-pgUGBB-|5Aq z0VZTsiC#xoRXon9L+`L`A9Qv3yR2PISN}HqHtn|XR_#{(mVr(FP1a4!rv8ogjoOXj z4bBao^``alb>4NBb%Se}wf$?ttDUR$tDSbeJ!aHW5x71;tU zD+ZTamYbI8mPVI&mY9$=(7V`z%z^$zgB_-hc)PdV-)3#|v{n(yRj<`z9po8aE0V2x zkY<%>Ar!0q&Gu$3I@4>L!gHN-!*iT-^mClE^|J+cW<$Hg`~e{x2F z66e>>C=mSeF0@Cow=X~RL$ap-R=#AE4z1}2v-#3BNy)w2u76Nmhc6Zq>*OWE8`jbl z^4j=4SFVDqyn%Pb6|*O$6|-zU*dne3yzzBc0y5Ch+<(K}X)GGOJ4XBiqgR8z;{aM> z^p2*DUI#;r-kh&#^yWf{xw_G-W1$kQT+`PvdeMRFJs40+Mz2OA8NE6UF?vTcJ)iJA zTD?MpbM}SV|9rcaUBf(i9?e_zHs(r`_Fxj)vIRYx+D#>~akPC}Ib@&CWn)EvCV9d> zZDVc4JwI$8uUf*Qfx3c)l|6&)l_~33(G=~O*rCt8`zwa1(U34i5ByCFwD9j+p!fDz z7UeaS$j0Wsu#&NfgjfH_*!%%8Hs59?WAh^xK4AkD#MVq%z=^hIPw(Oh8Mu~l*_7=0 z$>NHvyScAeh&?^pC50(FS-u|4z@C~VUF;vZp3_UJ*&$miIqB-QmLlouwpL1#WNRst y{-&*^O1je4@|lO*S^@JgTPr>33R^2zw6)OEQKW7V?X0;&R!>Gy>z?!5?f(hjTSRsM diff --git a/VisualC++/ExerciseBook/ExerciseBook.sln b/VisualC++/ExerciseBook/ExerciseBook.sln index e203e9d..9d20288 100644 --- a/VisualC++/ExerciseBook/ExerciseBook.sln +++ b/VisualC++/ExerciseBook/ExerciseBook.sln @@ -99,6 +99,40 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "03.33", "03.33\03.33.vcxpro EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "03.34", "03.34\03.34.vcxproj", "{0DCA5F0D-B6FB-44E8-9AA4-0806C870D386}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "04.10", "04.10\04.10.vcxproj", "{84E5A31E-0EC6-4747-8B3D-BAFF28320A58}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "04.11", "04.11\04.11.vcxproj", "{403165BF-098D-4F09-87F3-9B2599D663A5}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "04.12", "04.12\04.12.vcxproj", "{4E3B30A1-A3C8-47B9-B2EA-0831F3F9C852}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "04.13", "04.13\04.13.vcxproj", "{63E38EBF-7C63-4D2F-BBFD-A39D28CA3C50}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "04.14", "04.14\04.14.vcxproj", "{C6EBA21E-2309-4331-92D3-8644F769F2FC}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "04.15-04.17", "04.15-04.17\04.15-04.17.vcxproj", "{DA014C3E-5124-41C7-B53F-53AE0B96AE99}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "04.18", "04.18\04.18.vcxproj", "{19006CCD-C88C-44C5-9812-6F4276CDA60B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "04.19", "04.19\04.19.vcxproj", "{294751C9-0DB7-400C-8603-E1C194170B6C}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "04.20", "04.20\04.20.vcxproj", "{96C98B39-7FA9-434A-BAB4-DCA6EBD5E0BA}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "04.21", "04.21\04.21.vcxproj", "{6D3C3AC9-1F42-4212-A16F-AB6A20ED95EF}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "04.22", "04.22\04.22.vcxproj", "{A8758334-BC63-451B-8CA2-AA69E86B4BAC}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "04.23", "04.23\04.23.vcxproj", "{7AF60383-012E-4F71-98BF-8A0EA94A798D}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "04.24-04.26", "04.24-04.26\04.24-04.26.vcxproj", "{2F368B7A-8594-45B4-A5EC-91D79E72F614}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "04.27", "04.27\04.27.vcxproj", "{00CECE39-4250-4727-B210-4B306167F129}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "04.28-04.29", "04.28-04.29\04.28-04.29.vcxproj", "{785893C0-9DEF-49B4-9A5F-9A6B784A089E}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "04.30", "04.30\04.30.vcxproj", "{9374E1C4-6DD6-4BB8-9DC0-5CA8E86FEA10}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "04.31", "04.31\04.31.vcxproj", "{2FB26990-0C5E-47FB-9D0F-E3A202D2A47F}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 @@ -301,6 +335,74 @@ Global {0DCA5F0D-B6FB-44E8-9AA4-0806C870D386}.Debug|Win32.Build.0 = Debug|Win32 {0DCA5F0D-B6FB-44E8-9AA4-0806C870D386}.Release|Win32.ActiveCfg = Release|Win32 {0DCA5F0D-B6FB-44E8-9AA4-0806C870D386}.Release|Win32.Build.0 = Release|Win32 + {84E5A31E-0EC6-4747-8B3D-BAFF28320A58}.Debug|Win32.ActiveCfg = Debug|Win32 + {84E5A31E-0EC6-4747-8B3D-BAFF28320A58}.Debug|Win32.Build.0 = Debug|Win32 + {84E5A31E-0EC6-4747-8B3D-BAFF28320A58}.Release|Win32.ActiveCfg = Release|Win32 + {84E5A31E-0EC6-4747-8B3D-BAFF28320A58}.Release|Win32.Build.0 = Release|Win32 + {403165BF-098D-4F09-87F3-9B2599D663A5}.Debug|Win32.ActiveCfg = Debug|Win32 + {403165BF-098D-4F09-87F3-9B2599D663A5}.Debug|Win32.Build.0 = Debug|Win32 + {403165BF-098D-4F09-87F3-9B2599D663A5}.Release|Win32.ActiveCfg = Release|Win32 + {403165BF-098D-4F09-87F3-9B2599D663A5}.Release|Win32.Build.0 = Release|Win32 + {4E3B30A1-A3C8-47B9-B2EA-0831F3F9C852}.Debug|Win32.ActiveCfg = Debug|Win32 + {4E3B30A1-A3C8-47B9-B2EA-0831F3F9C852}.Debug|Win32.Build.0 = Debug|Win32 + {4E3B30A1-A3C8-47B9-B2EA-0831F3F9C852}.Release|Win32.ActiveCfg = Release|Win32 + {4E3B30A1-A3C8-47B9-B2EA-0831F3F9C852}.Release|Win32.Build.0 = Release|Win32 + {63E38EBF-7C63-4D2F-BBFD-A39D28CA3C50}.Debug|Win32.ActiveCfg = Debug|Win32 + {63E38EBF-7C63-4D2F-BBFD-A39D28CA3C50}.Debug|Win32.Build.0 = Debug|Win32 + {63E38EBF-7C63-4D2F-BBFD-A39D28CA3C50}.Release|Win32.ActiveCfg = Release|Win32 + {63E38EBF-7C63-4D2F-BBFD-A39D28CA3C50}.Release|Win32.Build.0 = Release|Win32 + {C6EBA21E-2309-4331-92D3-8644F769F2FC}.Debug|Win32.ActiveCfg = Debug|Win32 + {C6EBA21E-2309-4331-92D3-8644F769F2FC}.Debug|Win32.Build.0 = Debug|Win32 + {C6EBA21E-2309-4331-92D3-8644F769F2FC}.Release|Win32.ActiveCfg = Release|Win32 + {C6EBA21E-2309-4331-92D3-8644F769F2FC}.Release|Win32.Build.0 = Release|Win32 + {DA014C3E-5124-41C7-B53F-53AE0B96AE99}.Debug|Win32.ActiveCfg = Debug|Win32 + {DA014C3E-5124-41C7-B53F-53AE0B96AE99}.Debug|Win32.Build.0 = Debug|Win32 + {DA014C3E-5124-41C7-B53F-53AE0B96AE99}.Release|Win32.ActiveCfg = Release|Win32 + {DA014C3E-5124-41C7-B53F-53AE0B96AE99}.Release|Win32.Build.0 = Release|Win32 + {19006CCD-C88C-44C5-9812-6F4276CDA60B}.Debug|Win32.ActiveCfg = Debug|Win32 + {19006CCD-C88C-44C5-9812-6F4276CDA60B}.Debug|Win32.Build.0 = Debug|Win32 + {19006CCD-C88C-44C5-9812-6F4276CDA60B}.Release|Win32.ActiveCfg = Release|Win32 + {19006CCD-C88C-44C5-9812-6F4276CDA60B}.Release|Win32.Build.0 = Release|Win32 + {294751C9-0DB7-400C-8603-E1C194170B6C}.Debug|Win32.ActiveCfg = Debug|Win32 + {294751C9-0DB7-400C-8603-E1C194170B6C}.Debug|Win32.Build.0 = Debug|Win32 + {294751C9-0DB7-400C-8603-E1C194170B6C}.Release|Win32.ActiveCfg = Release|Win32 + {294751C9-0DB7-400C-8603-E1C194170B6C}.Release|Win32.Build.0 = Release|Win32 + {96C98B39-7FA9-434A-BAB4-DCA6EBD5E0BA}.Debug|Win32.ActiveCfg = Debug|Win32 + {96C98B39-7FA9-434A-BAB4-DCA6EBD5E0BA}.Debug|Win32.Build.0 = Debug|Win32 + {96C98B39-7FA9-434A-BAB4-DCA6EBD5E0BA}.Release|Win32.ActiveCfg = Release|Win32 + {96C98B39-7FA9-434A-BAB4-DCA6EBD5E0BA}.Release|Win32.Build.0 = Release|Win32 + {6D3C3AC9-1F42-4212-A16F-AB6A20ED95EF}.Debug|Win32.ActiveCfg = Debug|Win32 + {6D3C3AC9-1F42-4212-A16F-AB6A20ED95EF}.Debug|Win32.Build.0 = Debug|Win32 + {6D3C3AC9-1F42-4212-A16F-AB6A20ED95EF}.Release|Win32.ActiveCfg = Release|Win32 + {6D3C3AC9-1F42-4212-A16F-AB6A20ED95EF}.Release|Win32.Build.0 = Release|Win32 + {A8758334-BC63-451B-8CA2-AA69E86B4BAC}.Debug|Win32.ActiveCfg = Debug|Win32 + {A8758334-BC63-451B-8CA2-AA69E86B4BAC}.Debug|Win32.Build.0 = Debug|Win32 + {A8758334-BC63-451B-8CA2-AA69E86B4BAC}.Release|Win32.ActiveCfg = Release|Win32 + {A8758334-BC63-451B-8CA2-AA69E86B4BAC}.Release|Win32.Build.0 = Release|Win32 + {7AF60383-012E-4F71-98BF-8A0EA94A798D}.Debug|Win32.ActiveCfg = Debug|Win32 + {7AF60383-012E-4F71-98BF-8A0EA94A798D}.Debug|Win32.Build.0 = Debug|Win32 + {7AF60383-012E-4F71-98BF-8A0EA94A798D}.Release|Win32.ActiveCfg = Release|Win32 + {7AF60383-012E-4F71-98BF-8A0EA94A798D}.Release|Win32.Build.0 = Release|Win32 + {2F368B7A-8594-45B4-A5EC-91D79E72F614}.Debug|Win32.ActiveCfg = Debug|Win32 + {2F368B7A-8594-45B4-A5EC-91D79E72F614}.Debug|Win32.Build.0 = Debug|Win32 + {2F368B7A-8594-45B4-A5EC-91D79E72F614}.Release|Win32.ActiveCfg = Release|Win32 + {2F368B7A-8594-45B4-A5EC-91D79E72F614}.Release|Win32.Build.0 = Release|Win32 + {00CECE39-4250-4727-B210-4B306167F129}.Debug|Win32.ActiveCfg = Debug|Win32 + {00CECE39-4250-4727-B210-4B306167F129}.Debug|Win32.Build.0 = Debug|Win32 + {00CECE39-4250-4727-B210-4B306167F129}.Release|Win32.ActiveCfg = Release|Win32 + {00CECE39-4250-4727-B210-4B306167F129}.Release|Win32.Build.0 = Release|Win32 + {785893C0-9DEF-49B4-9A5F-9A6B784A089E}.Debug|Win32.ActiveCfg = Debug|Win32 + {785893C0-9DEF-49B4-9A5F-9A6B784A089E}.Debug|Win32.Build.0 = Debug|Win32 + {785893C0-9DEF-49B4-9A5F-9A6B784A089E}.Release|Win32.ActiveCfg = Release|Win32 + {785893C0-9DEF-49B4-9A5F-9A6B784A089E}.Release|Win32.Build.0 = Release|Win32 + {9374E1C4-6DD6-4BB8-9DC0-5CA8E86FEA10}.Debug|Win32.ActiveCfg = Debug|Win32 + {9374E1C4-6DD6-4BB8-9DC0-5CA8E86FEA10}.Debug|Win32.Build.0 = Debug|Win32 + {9374E1C4-6DD6-4BB8-9DC0-5CA8E86FEA10}.Release|Win32.ActiveCfg = Release|Win32 + {9374E1C4-6DD6-4BB8-9DC0-5CA8E86FEA10}.Release|Win32.Build.0 = Release|Win32 + {2FB26990-0C5E-47FB-9D0F-E3A202D2A47F}.Debug|Win32.ActiveCfg = Debug|Win32 + {2FB26990-0C5E-47FB-9D0F-E3A202D2A47F}.Debug|Win32.Build.0 = Debug|Win32 + {2FB26990-0C5E-47FB-9D0F-E3A202D2A47F}.Release|Win32.ActiveCfg = Release|Win32 + {2FB26990-0C5E-47FB-9D0F-E3A202D2A47F}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/VisualC++/ExerciseBook/ExerciseBook.suo b/VisualC++/ExerciseBook/ExerciseBook.suo index 42293d9515a8afaa55abd4826dfc85499759048a..f24f957aeeec989b1e3fe0861b3c3978f5c4e45a 100644 GIT binary patch delta 16684 zcmcgz3tUyj*53o?APOh~@)miiXoBa!;pG!JAgQF7-EQ5_>(wYTLm_+>nP8cjngXK^ z+SLFbshOErl$D}A)Y3#P(=wCNo0%D=nU?1Lui5(?HiA~y^ZSm!s(8EbZ}M_g#qNxQ&F5yF_xx!8>qD=wV178WlpyzcSLh8paZ}c;0N#r1ONg7 zL4aUDJ3t7a6Cf1OmCtaBGbfKi9+^)~ZbcSH51Hd)T@^orI1^pmKoC$-IH?nbl_NA}hW?S`cG0kL&F`Gu1 zEY(HrFEgih3NQ2?m?{DOC}OAHz&jp2npyFC;G>Lg-&he;iZUFM6*GpgJU%_OLNo+27m*#vJdHURUCvo-UPp@(0|i=?5z267 zl2V{Nq)bpAL>u*}k!Uua@!@B!F5*rD8^=x7)e;Tgkmk=Ph39rs$0y72O)-oGhV48o zY!&+D^M--`JS41uj|xo?7y7eoo}C;lwi;L1^h=bH@7 zg+CYjJip&Eho>jz^No7~A+M2OdNMy9?~nFeQ4zs>d49Yrj||I=qc_GvR?#qfwVr^t z+v-i*RSE9V$ylZIdKs_f`x6CTUs7F`5Xtzl-XY>d7AxS#`g=(d)5W>|Y`7@NVuSde zUOs$b@^X!ZbY2o$!YiT;Y&joo$?+LfgoreFHSMALY|s9SJnpeN5WN-T2QG*)@SHF865j!gsY9~KyVnqtYLdeQe$fH;m13>h?zrJE^NLB5o080R6+dnQM?Op zYxZQ`D&}#_hkHi4*rgE*^^Q=o^ya5w->H*E^T|TectZ>|u<<;*%Puk;jZi{oBQ#b+ zwE?Im^ZC)Le*X@(p5>lh4IY(1GE+%cdXYs}U$Zhdp7LBRFW#QQL$8h%3H`Nsn`IYm z%j6O!Ht_f4=jQ zLpiH#?Ukn9Lw2orGjr2vSM&MHyY95LZ=3&3PR_KRcf56V#j>am`()eNL#n?2pml`V zT6S<&`Y#Xtbj8-*FN=L1Ic#T9>TCUnZ*W_@VTtX*-drVM-mdr4%f0f_rtDqqW^3O) zEVEmUhkME_=lbmn{oE+<$zSr^-HX>24YF?8e025qpB~?0Yv0|g&-k=XUTKwiFO3WR zVbPDacFR+f*W|n%lrgVr-9x7y&KbPk_TVY!i-j@lk)h?==CoZq=&|Q)?S*p_dMox=`w-t-KF*^cQ!WV}~Di60vO#^7bOBi5YCJ53=? z{z@L&)N`c!Z<)*5eN*LhU}X_+?;0h3YR$SkPf=`c*(C0JmibrTGj|Q+u@Qa#qLX&U zyywrybjE}%;DIs0s#6$g3gnZnUszo;9>68OkxCzX|K_ycJWf{zdzCh~?lVttg<(%D6U z2*TOCxH4R zF>Ep4@|zb6(y7KvMnAvmb7gLf=O%~n<7GZlTlpFOJiE*Vrd7ZOpepdWU8yGK1ilOPT!YTiE;=FtFE7WK!8t3VVa~cN88sE z!Rmy{?c&3yJnzF#l#k=bt_1V9%f0xAOTB2h*Ke^C>)}}iddQv42aqsCA19WSx(~G% z02Kg=Txoz60J5c*0ILBn0@eW50@eXG0LWo}3;001=EO3KenoW$U@zcfz)`^afZc$d zfL(yE0UrWB0=Qs_ehTGxfO^ZvZC%CjtKfECA4e()1TCV?e(8*$8w zh1%m3Y~NEX_hvq72e~7;;EK@opGelL?8nHONFR0-q2t#f*kO2zOTJBdmcXTo3O@~> zwx985kve4S8ITR=k2olCuM24M6q}#M&QYsreY7#rMdS`)o;AMx*lD&plsWP6t79<1 zqiW`-umWekW2BGp?aH!hMs;DBD|Mq>gl{jFC9-?79ildxxn@|D3~YK+ zswALhLFgff#zr^|&(l#$L(c*D7mKzy{BOeF@k$am-`6uE3B7L_7q5RjGt(iMK-G-@ zOU<-^Mlz%X(3u9xY5$W9>WLc*{-(c(!$j2MP)kOySoBTCzjTaBKr48Z96AISKQ|_b zf4w+CYza{9qkx-^dewZK&dwOf7ADp7na$o~{CJnPqQI9;;l;mtiuFNyTUt~CJ9!)`1@nZ^PHexQj!nw4QQ<5$A^3jCfS2iwN!nGphAtcZ;gtEJ-8{ zVu2zhl(|?PAa${?gmo33^O+&_mSrx&LRn{No^jIr$kfbG5SgkK3R4XsVwI10K3EU z6p@V0h7rj$frgiscDCJKoQC&R(6CG{3Zltx=7Bj$4s?t^UzB_`44{?VY=m#@cE`gA zw=$$A?zebmkQX6Ir$T~e)S^*Rz^D0UL5x;P#$!rbSWvS{HM|*}V8Xuy471|h z(fB_}>X?wxD`@#mK7w8mjeY~r8jDxZ2qGnc5Q|6Vvd-3IJW7<*STTg`FCFhBr%BGj zgaImJraLz_A~RFp(fGLVoiiB4!=WiJu<2cVJUKYMG2A?6Xw5zMAWh9<&0|DL zDGGS^#k;X#(|=3b1Zxw>XC zX(Ag+>C&1D6WK~9rj!oz=4Y$DYPL>cPcsij!;6~qf0PaNV2`3{j;^`p!lTU8s`UQb zi~bFwmjP&D_X5fatzLz4g;rmMa z9_0nCei7v_TKzK0U#ac~?ysP7ReNv^C4KH#{Umed#RtP#A`h$R$Wsm&+^6FSZDKG& zT8Qy^^j#+|7qHuSRYfrMG0ekre*8=%HyK=w%hl&kvrJxKnI<>l&GWf3L zxfStcBU0E4lxFDbBuksNgZ4feOnwYXEm@E)sZ5Y=jM4IQVZ*O63zgG-v#ioh_gIQ=z z=s(zTqc^SpM*}7+6F~~aK_*^p!|HiSK(GvZG`nqKkLoJD`)F=zVX-mmMDt&LzJ{_L z3)F84I;MP(&DtI_lrNYU0w$)*Eld6@K4SV184&Zu@jF;x4U)SiCVBgppZcw0O-$A4 z;B80uz7~7&e4C2ms5UgSQ|I~elz`lBP4t8J+o+h_{;_wLmQTCy>4_aGH*TJn>P&-b zyZE!2JT<_UMrtX+vn8@q;cn%fvvVHLVWx}WbDU^kUA!*_ZvSjF(i~xxu)4z*r%J}B z9P9xztX!v>A?=|{0d_N7NoK|$JJ^kE^(EQKK-*5c9logRP^qGITZgta=tTWeyITK$ zK2l8P;UjxEY%8E{D=1#5vEYARmnyNetpHt)!BzkF3`gM-k923&42P_j`Hbmi2Vo)x z9khz)`=?s1j#!_X-I+PlAxmAw%FXv@I)W%ZqsZ#0HM6u(2d%$36qw-VVC-sPD!GI*ceS+Kj_efT!);<#FV>@orr|B41CA$@-b#OL%^t@q{sP88(Apw}NZ`_{A>%LLx-lx4 zMeiD~KJ;;9Q)sr9qR{271+z9yQP5#0BqK!M{%VRML`(^0xt-NL_4Q{gY*`DfT||4a z7qwJ}mU9>NjZJiDkWjxIq0gA8AH`Knv7$awPYz`e)iFQ%vQDBdfE7v>)PqpAG41;` z9iy=)uBPc(kZFPDSrH8hOoPmc*o+mG16j~wZ#G+dmoDES%w8-}N<>3PGs=cS*^BkR_&94ry&Ll-_K&|c*Pdmp4b!s!4subHJ?`un&muo0IA(?r zRUJjaV0;-Y;A}omi|C=9C~BSx%28TOJRzlw9HN1zth6Pc8udtr7bykykMnca_bnY; zZB1M8Y3tiwx+arP>OdEsvNl(HXG@==T2!F+&awlP^{jl6@=pf$iEu-dD6*%UUe;xk z!ql9Up^VZ>l8mTA*!eEy^BX2OY?f@1`?y$Zns-`l=%iGZ`YDt*v*IjX>xTg6j6rA&E002 z?Y1Fg+LOKFXCHg6UqTadYrnaV5`L7=L*jW6#AesPn|ckbCOul5-c~h`WX~gVjCdYk z(|~cCeN>W~M?7qC+krMZZi63BjfmDPs`=^Fn=>hj$Fba2s!ywzp6w5v8}d|$_pOnV}SzZ8rJfSu`G#Gp)` zVj$TjMD>wPRAD4Lj9P{fFX%>je2h_Vpn-m~$XDu_>(Ku2hfYW1v-0cSKX$ULaB^Xm ztDUu#6SP#a789jyl3;R_i@VqC@r&?sx;*-hgzj%;Pt_|MNqW2_S(V`R5%c=vcw?15 zU+mwTxYP67%deanzidjMFJyB0Y>j|2&!;C3WWH`0zEA^c|)2X&nbvuR%bg)emx6i2q8mJA%9j!7% ztBgM_QZF%m9Gh^HkvEj07w=~`hUSL}Rv($MV)c~-^PW@1D?i&>HPvXdAd|sGvvTeG zz?Z7ACfnzA71&t?unX(BT@DbI_I+Rl@oaP0-{?AM-v>PYgEsB^fNJ3yk1gNQxPien zkxok^|CDqZ*Fa{h(aDmWuR7<=j*S_bTlm1pgk=lvG3cZteT^jcMn@z6nAny_-h|k# zpWV-(0dhQW7nKk$g)+MazS9ZV7BcB@qg?}M^c}R2`J+v-Dbp3_GK`JP@M)ArQN&Y(mzjK?ie!T_lXgc z-)MgWu~MMA{`m1&CHBq1+xIU~s0dS*-tN+pH;pq zx}rna;cz2+Sud4Kda0;!&YjMKzNACp^c%!f(VfO02=|cFnU0FuMDOuC;XniZq^H(Q zqa_}4l*3z&mKdI{^HidCRJpVJ8amn}V4JH=b_v>|qPU}CC<*;y>f)^kZBe$<>g`c_X>}iz9kjY1N`I{$ zh%(4Y86;oO5r2ee4?u zrfv7a#szU#FLv*co&DM!I5_kEGcCxuaWzE8mB>8zmFIr6Z2uDrymmhDPV&ADxq3Mx zve9Q#%t1JMOco;pwTSD|vMLXU(}@iygOklvj)i-$S6~sF05(%Gw!#oZ9(BmE2m>9~ zvdvJpHuMk;)P~6?Lviz+-}T?a$117cZU}Y`c_Q|MsHq2%{*f}sQ?)34DE?zKIm#02 zz6}|3?(Oo+=zyU4_pcioWJA*!ikqXcZ6bC1P$W7?ln+*48*AQM7~(h4ul30d*DlFW zTwD=K)99<=Mh`HH@TyMBBN6U&==wE)T~wZW=^lwNRFhb2;lx}2@T=h-zWBR&C{e%p z|1W{I<&ih>&X~OaRHvYB+l@uZRq*2s|6l+Z0W=K>TA}U=Xborsa09plJOFJ0?Es#D z_5d%y?{p)!hIJsxp4(!6aN9J+XUx@~H#}i|`J~=RdGXJ=a@EviFOQhkc=n;`-k%WO zv8(feaff<_PCm7)%aFK%t=&oUDHn64A5(Y!e_n`uYgJkq&L>07Cx;sYbZV|V8R1?7 zExxH&bFfa6VJGAyGIr9nRi21&-;4pT>jt@nH>%sds%n|eo2yL5wQA8wo)S>%#_%^ru;$KO*Z-Nun_UK)jJ{+}Ug8iy=SNle-#T{j>)o9^6mpsG!{-!PneZXW;w?~+#*wOcCU z#NTkw0B3>9<&~oVybgDsf1%S)rMPySr(M@=Ix8C`(X^d3f?Fi=t~A{zv*0Y1?Q(NV zn+odvj>^rUKvB04$CDN=C=f9V<$>S=zGs$t$-0Pya1%j|1)lxa3(A}BgR@3H;ouqDAI>p!o$Ekh&wbO-)}yHV z21A$$%jJG%^{V%X=M3(KUiF3}InavX)kw3CRQ< z;U>Z@c(*bW=HX7kYR;wkQi4b@6N(5{f{lcH~dO9!R*f?7&9`{5{N| zrICh6hr9w*DjHv-AA;J5BN{o5D{AGnw214KBKRYFl?$PGGtIXUI8W__tMoxDJ-riS zA3fV9#(PP$tu%gs@D?F*e&!#AxzZVPXgYb8S{@mnT|Pt21)MeIO{6`c3e`{64ae*8vf&+kbGA7$wn#0oj6-lQ z_GgKB+OfND1ITenmY1DyfD&777TM7ZsAA{WKt5X~2Q6;8B@kZLgH=W)JGTHd7%W!d zg-jm{qziKPkq*>&b%hEB*n9=-#MH|gc3ue@NMhGAg;s1%&q48;9J294Y(w#q7RBXC z=I(=L3_9MzL&dxCqDzJH?7M!tL=Wn>iP`h^(%Za%dW#X22x8aKxKYsp5BG$X)u#z8eA8R%WIWb8W zW4fgct3qicO$7`gWFN$|yb#~4c#>r4K}g?%hdXlhc&Oip7fq=VpVamboc-)XHjPt&wXknA2soQIr#`cY- zns%SRq22FmtX~7-LruOR>ac zz!Ogxq-!n07kdvzE}$N;db|&Z`?w-}WQ!@}x;|WWMa$h6c9E)n(Dludf(+t;zp3Ou zjACCab=Ut>M+%wq)wr5$ZnvkvWpIrNmv(*0ok|K51}P_u z+fwlZs|Muk6D2T8BklM)%a+3VO;|bp0#AKaI69Ppvx5mJj%T3psUZ8^e(;egXfgOj zJ4;(mhH~|D6;HW73|$>!zGPuDmaNdTUW?LqjXb5-;HW)~tTl&>@IlVyQxnz59Z<%zt(G{73GU^2@&G%k zf(zke8SH2$7$VCDl%S?BWd=gL(2KMmNl3#}mCM6x1Cf$bUcJIZG4N{Sh@xDM zyVmOQR=I{h*~n@rjs*UCMxo;6_viM~@6Vpf4h=pZk z(z&mdgH(BuGUTjt4QOK|29{40BDb+4D%dZnvx0wr-*qOtrRptVC1_afT2R3xs|nnS z*dJXaL#nVUU3WdN3e3?*w)M(B z2y^@HkxC)&Gg|iB{Zs@SEmf@kF|bQ1coy~+``K`Upk;>-QQa6LlcwN_w1o;eD--5| zJ!)6O83krs$;M44HT(0c(9Z&iAO+feIC@3La+6456m~1Ze=|mnS~v^LR|!sbGKpLw z7MG1WR;P>Y+Q-i8;$Ktc9ap)U_1qNSpwaUUQb4ED{J4IC3@ceMb)8D~45ryjKL76P z(80W(sV~VQq_Z`w{8ci)ftAD$vAB;_t(rJIyiCb1uHw7+a$q$rYga=UWGsCI(y47~ zqQg;2wAg~h|)RIux2?tZ6JsIGe5e{cZvzJ3i!DaOHl|gkh+yln}2aN_i7)&KU z-@&!`EU$>zIgKEd=d7fU+8JKgd$$Ac2L@wZ!wXt=o`I4HMxmL4o}LZpNTI67;88Mp zA6IWTmrlo2i9%e*39Na(kP;`KBH4%-|d@UvVkwJKDrv;HKZ z2fhE))5hLdSv+x|fjjJTY)nZ}wra#JdHPzu;|XcFh?!G_1H`<07B?>5Sl^50y2|MK zS{MR$PdcPU(|X{%;$%IXnW^GUIXREiIY-BS1XXj?U9_Z_vdr4spi%(=TEc z=vW&Z6)2D_{v;ij%9YWPt?)45n{qR2-v*U)W!q@;yeTxIW7|NSnY@o!+D`})4iI_> zSNZ=Kya2skJ%pH}i`u`lIhttrA!rd;_Z*>^&Qr0|G+?1Qf{kVxY1X$JN`8350)ARe z{B25j;&<9lF9QM7<+?8S|GLWka#Fsb9AYK!M#? z2$VegsSAW-Z^3K~i_~SG)w0|aK`EIanPw{Q5V%olr5yB-R4B|&74*~x?_!}vf=b$X z(IBKw%+gB-)E&G-&jWtb@br3SPEMs5BAbS~G_OZthMlsp95M#;C2uXIbmc1cl zH%20R_@4gXd(QiP?|JWYp8I*uxu5IauIv8&e%Jj%Uss)mii3)bjEqK88MKVk)XOP8V$Cf+HVVoZK_Q3p=~>SDXA%rzH(d4Bw1{NH9i+zoaWtr0V?`4e!%Leuwmhybx*^?Vnx zc5p%+!5hA)gb*ZCrZ@HPIdr$RZ6kQ|QcB2Hv7HT#6ln08o0)AdnL=kv*4wSbus1cp zZBx)!HWAer-ZpYOPUVQctZrZNR7*0U*dIQz^qsaVlK8}G4czFG0viT8n__5OZzcv} zc%dPn;@z>}!JjCU+P}5_xhAWBIsc2Z3|EnNTvvVtaZA(iVF4`dV985X-f8{d1d0j{ z&FOWl-3E;jeJTwlXt}OD!uW2XoDGR-0!l7Mmc$nZz0~QO%^qrsw+7 zS+;4eQcqR=bnQ@zo=fHj5PUhVZF)+|xq&dWVL;sygsR3kcy+$463f&ooWi*yrgN8;NY&fUve~jy^u)%6yDp*MGOQUFZOd^>g32 zq2rHl>~APBp>h@E={h@86x-CnJOb6Ww$fc9gvHwHjAo4oAMM;?o>Dc3!@W&X^?`jY zXZdSfQCX=MqB78sn7*{shc(nsbT}HymbXt`d~Z;)gx1H6HU^*ItAl@jZ_yW$Jd(YO zPn-@bwXtsU?o%kw8|4qk2|fN@q8&R~X)R5)&}Z+3L=GlKEX^eMVe*TTyUjXHAwh@q zTi@S%+GT7&hTYxVp#0aRb#wZc16#N|z-QXF`cLN-hJT^_nN5c=$sxZI^OrJ`dn zWWIq8wdPK9H`oXYMJ4IJz6E`dOx%}EF1?N5AZ zsc9u5N}(l5pmEFq*)l_P9ilH7jk9Ib8MVQQjTa!w#^V?5vbpRye+k!!o$ysT zvBo1iU%u{N4pP*+nCUS6q<#ZoBO1$qfy!qO&8s(6v<9D~Y#ONQpHg>A{g4NI)!lt% zdRfNJ&u?=2deL*|43?KYj4vX^`n$b#ttK7JKL#C1h{=B{s_(0ov5OpFW+yJO5qdr5 z=i&Zb6V%yANhu)k^>QHL>VYlacXoE>HEgBFEXz$4bCvwIX4>1^8=tN29DVq*>-xzv zYwE4&(Wc&&#bRz8ZC5`{t`aF3}y281KP>5o8Mv_H4Dwn(JYV`8NdB3nZMh_)h# zg`?M5XrgzeiS_}NdCEd$TVRXZz{)kLXYX0gA;clO^be!!pZXN2JK*m<+R8e4W3&fg zuGo5=#a}XF-oGG9^`5$v68Bex@X_rxn=30tlO+%6SJMlo5O8>;;dj+MeUaqA-Ic+C z`b6Fs<};-BuG}rkh(}sH3W2MPxpi~-6{sc;zl6_AloF0u1>=O-st* zydj|Z#XdSZI?M8jGSfBqRRbI!fL2AUI>XAx^i^o)MT9uM7ZLlmapi zUOg}-hY^2vT4G0&^be;9MglOB&6SKnG`^6X;yRs;CNhqd|$$<`_@kx8i~n!)#{%94B+BWGxs4J9;4? zN3Pcso~I91TBt_k4p~3%H`Cj#o*eRoHxPW_ljiH`Blo#s{1^PL=IQswN)~dyI`+kl z1|0uhS33VwTU+~VGxgx$z{g4{__!{B)enRPU~$@&h5N1B^2}G_o{5RcidG<1Qwzd< zO`?*5f!}%P?l0?&Ijv|qvh1}cAlX-LM2#%i_-E_+nOP`j@l?@DB>3h^?5jnm;T(nithl&159!qY!B^M< z1#X2va=(N9eT}kCz|WV2fuS-1++EmuUwz}1V%7NgIJBU;wblLCNoHo|X~>)wuD$;0 zNeLoqQ&e5Ol6HiDcn9!Y)`#P)wI zE!AMJqps`E4J>+!vv&fY}fJV4m02fy;_`)ct%Xa4tPzx|zeWE~bs)-vFHy@_U zFMU#N_DFysQ6n-2-C^5s$2?^jF3yU9b}WDkEyY+!l`(F1CKlUO5-*244bjJ-`nR%> z%suS;HZu_n^d=J(M(g(Qu6V$eHgbJGubIXsyLE0NyZvcW&sPOsKC+HipU~pnzO70j zuJZT!W*VwzNxnK4Q8Ss~t#M4?ObZ4{yvn9M`GcQ_QUQfwMBWmq&~D7OQebbk5R`2f@-HX-!~azNNw~R zzRlCFDG+h4p7eJ|AWeq)AJoIUM#hn)c`(07t*~G3sDtBe_$khP$5f?$=SiAJQG^Wc zSk=8$W8M&l`K4K~e?|Lkno*x2>`u#(vzlM$V=9g+ZPX_Fr*uJBRn`p7Ahq-cqJDR8 z1n(z3&7;^-RR+C9818;r$CNk|6=+@h+?!z*7K++L`lE}N4{;rNs&Z@MuG|52)(T(S&godX-33GTb!PhU* z$1am#Xq*grQfP4XYsU23l$8h7tL+JFuC)d15B5YAIa}ad&+6!FBpS$#js|Sfh%K9^F=);(n z&rVP5Qyr#zUh*`TYG}ogd^r_c1|6{yWpxpH{Y#OWu|bxWmPUen{WWtzyEG=XJs0u8 z)DjgJX5Rr2$E-^v5?96{}rR zvwj{2QwvXPW4;7k;|#o|nGvF}HCAG1k8&=nl?{1`oGP>b&Ioq?k*!Ew3JyOSqp&Dmz#Kt+Z$>Rd=|d9p!|k*eW!MDE*8~h z_H59}y-aEMc52c@xh1#2(Eb0X+Y-W8Wd5z&I)f}zmitrhbXe;62$(-!i(yFx^WbTe zB2-5K@z0!Vv?Dm{#u}0vZ&7eX+hC($17nBLuJuYU5D$1K??OiuFQQ}ty~Arx(PS#IDIk|I zW1;%~x=0h;eV#TvhnF_{-0&&H)tZk|ipNIYJ5W6LTv_qtm3tebXH z=Po2G_a9AL2T;7^)RN zcE73N5mt>kBRq@L+hH8@(PQ0u91LWSSG%SDgGsW<6J!gDVgSO(!xNrAooUk(HnkuM zD$@g6o|^8op(QEjBhVkur4K@)j0dk|?4Pp+_(vhhRNrLs&hTP^pc9*}Uz}U3b z8Vr%j*>fqna29C-sY|%r#39E`_}ePiHVlTbMjh=JFPTFcqt6Jm zTEmeQs564yD&hHH?Xs6F!;4o}$golbT^v>y*O$u5!or^zBNXc~D`7RMc@O<1NxA-( zKC-J@q-xB$*`oXkV@avVA4a=zT@ATxbZobBhdDn7rkxxsN!ShmM`wIfsLKwL6NIPIY0~ZL2nfXHP z47A>tB@Y*(d3yKNd4la-A%VY(P0Cy{pyhb?w*fvr_ltL>g=@p(Snsr3Jt0-B4(C!l z0H(qnE7lL7i!6{C4Rv#@Gj{owjdMI{g_zyGuJ)@BD+t1Uo0{SUHRlVdTskl*b6Bba zvN+?O%gR+d?f1g_lwk5Cso8jV& z9XcJwZN+qT1ffF_4+RCVeQY8uoVqwP;829-Nsrgey>n#3 zqQ;x{tQ6ZcAc3ek9XGX3B%uzr665c(#3_#&ipWQaXQ`{J1L?+xzWLHc7C=Hr@V>G# z6N|p=mDb|!?oMn%lo-v6^a7kQaq-G&H+`ovWOokWSOI;}d7?nz}Zl|^$-()@;1 zgTbw>akNDS!l>_0fl?)dWa_sKhtrdrv8;K^eQ}oLemU0~+B)q@D^)sp6^LfkEmGt1 zVb-y`-q%aY-#(?EvjG2dIc_#pgaXd~xR>bpuQ10gzn?p85Ds-TP~xE)&nqky`E4x8 zJGdehhMaFf=%qLq@X|%8Y>#RcUi?|aOF8~zobA~~3Jf{JKc|GYX!&sD`t21vYf6x6 z<$N#qVGieg{)R8k`Zq(0f3>_$7IbOGCxIy)1fh7tlCk2ac?{4lJSNjlQ5-pje7kKA z|Mo_`w6^IVwTr0Sg(!KyJ6viS6~cxdujA}3N9&v=wcerG(J&@8rmp2>hYiyEni>@e z;Cd!k0d=KgXJfp~Xo2e^rLUi#x^cRVw#-0!>*0@UhxJ%Ny(H3H=y~>-uf4f%)m(pr z|5__4xz4mnac2%4`t}yxGz0_g57&2is#G2r-qKlu-pc&%Q%e7O$FSu_aUF9!t1m?@5P6=&AW@7D9T>u3Krm@)e>H~f@^T@AD zg#UfLXjjpV=M$EMLy@l+>;q-WAUlPWHq~erTY-waun9wD5;#&vz`XDUqhA%pYibkar<)n!D@^HN62^UQ^20mchVA`;BvhGRW zXr+Oi5{(OY1yK*Idmg|RzE$e;g|c`9MKi(Ou%)Ta?jj6V15x+zc-M_c;te|CnZ0?||B^4AkE%Lb8 zJYojS1z+48tOfoV><7`Nv`2m4rPx5NM$lM(bbOh5@{nD~P_uWNWh5d>`3vhpP)XTl zd)bQ`O|@QZ&0ag}i2ZGOiS|UT;>;2ICZe|HW)gVz6BezfPt^-2$B`*1DXl0@nwZ|Y zx`*+r{@F{5i}nT7l2$<{oKo@1>=D-ZY4k(2yYtOTNwQ-J=t8NO6dDpDGBPsx5{HaK zl#x|p0UL4n66o)Hzp<&I-IM3mqV}B;%FkWg{9@mI zDM8#g-Q|R+alsd^(H>2{f4L;Y!bg0)rHrfIR3Pm&81((Tg$Z`lh}?81CKi#B4Lqje za$7*G7b8HBmX?<1;>Hn)BldGU;(Z>8U|To0gzz44S`pOSyS}#eI~2Enu!R;TnG1X8 z+tOB3vr_3TaT3U4zZ@gfe)mkb&H<9>2+A4j?koX8qVtZ^uOUU<=0A5mrlAO!^vO!B zVM)l!Vpe?)at04Ip`6w|rH-pjE5A92PD3OZ;_~x3l7K;W{VonP!}|z*aCWo@2aVwp zSQYHcz^#q2wrnt{AJbquGPj}XKCQo-WE`h|^?H1m`_{z065-f0caIJEW!jJaTk@F4q*H^M3X(}n)U%ZA zwUQb%`$#*LJRr{r6)Cxaw|uM?zxn}RgISI8a^XaLxx%y(b_RZ)Nt5nC-fe7V7S_dY zV36LJ1oPaOlU4Gi8#>Thw>(F*{!Mca}h^juDnrsWE6uS%HZV*J1CCl;$1`}||Ws>3( z7^sny2=3|jAyn3RbI0G)^SaSA47)}mo9@IAK)}Q{44q(GmyCtC6Rj2~b%6KpX=P|| z<>s*w7Z|-s6oj(annZYY4y}vWNvFp@-x*Etn$YnXSkN~>*+HKq71_T?O7GHNlFJt> z;qfs^d2$L+9nue6x-_ z!Qs4;G(gmr1cHCCx6i{|I;+aCyxCkU#cr_e4t^JlHxvew*6IFXp<9g(NI_@w4c52j z@i0W_l`@h7RrX1`vEq!^qyV$mc>cvR!F`jsNUCCquPeTL_e(KB?~{ol zZ~^{!qxF=LMf$G{8_J1 zkm3$s81Q-sbFsVDdQ&8+f)=DmPdITXzDfx{K$~E;H-jxlOh8$?^fgnyh_W80QKS;I zb(sVn>b@tFO8luW>XeE;#Li^KS)3)In`N=Nx!FOKA)zm(H!mlhmo^5(IN>0gtX9L~ zm%D|?s>Dp0=ExH9s^3Q(C1)qvEN5@wufk;B% z4XqPex&I7;FQ&eJFp86{-wtJ)Hamlr&z-nG)l;N`xq2`}DSs$Q@JIllX<5@CQeHfN z6K0H3MB%`bigKnJKHW$z7g2`bv$>_qv!yE*78VM*<{4+xl!nirC6ALcwTfl3w7B4} zS#=wv>gwlqP$&adeVD5lEGTI7@j`9I7P^{pasKztTvPTI#n;HP!{+Qr`>(+|sfd-D zf{v?;Jt3?13LdpXB^c~z#@UdjH!CYEIr&bvaOmjS8=LAk7Nz?Anfc~|-LH5wk+wT_ zIN9p5vIX4|!}9kC%#rK!=Qmu{IfiQ6wqWHbU4!IVz6GW0)lNBEQYBcCsU5U&mNX3Z zOGzQs4(bpP^eEGN(>*76P$iVI&d%u#JrQ}ZB|L!>VNbQ>C}L)2*?d3 zq4fbT5mf^sgRy+Iqn^koFr_mKp7eYw_imt$nR8gT9}#5&Caq9L{hT4y1MFOc%lJ;7)jY_Ybe$N zqbO^w@acX?>h$VWn`tGWrXn$WySu*9%-r2FfS@9Q18iaI+apPzMMz6WXI-n$H$xO* zJ>M399{T`H%&Qt1=r$WVOUAFigFO-4ROl7P6CI@-3erTz_N}gwOo(dI^qN-w$Yqy! zV6bEM=S}@UuuyQNX`IG|GDO*mNPRvmB8Y@mp|>b45Q3K}BYfImXcbYAxcsg5W)=V%^`9$zEE?yQL zuFsdO%zo`fhcbJjGW&|ljkslle@ct!z@Y}2wbhyu_}Bkp-(El1&XuJ)h3n} z>bgB;p}OF{MaUy}53$lzKy3S%MP}+|x@*Yf?YtO|zf%7H==y(7hKS^}y6g!QscfS| z%36;i|XYO06nj(ZS02GDchvp(H?-Z?^4zZwJ=4TPcXd=J_T3F4E@d91-(s2JDez zgXxsklOV(iG1*_#wAI0QHj|^@NoeXJMQIUiBU)`t&FEG&G{Ho>*c&CtC?IsbUL1;-N` zYwLTdLv2u8kv^Y*kkA}!5pu(={p71zuIt?tzgX2;Mnu+6!}8<-+x`SSsyEjdWlPG` zb`sej)OU1q*)^vw?eqz^zn(Aiv1hm6-fJ($h&)pW%RUNarZ6Zm&2vhdWgUk&3}|j3 z_R!!Z6^mf(vL$R^uTQIKRRwyZu^>u0596!9FegE=dqIVN?K0cWB;txw0Lphr7p1)I zcFLGja^+S`Tu1+8#K z?pJ`QmC`Ck_AGNzlTa5%%vCkcx#)7_@oXZrOj`g4!N|ziYx8S+JN83$8DCVgH{sy| zFuIr-SMkgRqfB40a5=Y-W$V5G_gl*UZvcYCJ!E;^I#cvh?B))Nq{F4g`6or=>S6eb z!sKD+pUA?mpMP6fxhG{vV;2yR33}Nu3m_6$BoVx9m`^;ZDW4;u2?udP*l$t<3v1%O z#xb@>!3-8d1U6Ewf*dh(yEMB{3TJHnoQqS0U8Nz%)dgUDR_J(T)J+>g*|v9fpvI*5 zBt(d+rHbPR|7Uat6?Nvz&yf_upkcVRNxgxc~A9Jy`=+XIJm6dG<<8MzEs;_;1VO4MBZ@I|( zsleTQV!7tlh&}w&l`ol{ITU{~IpKHMW>)a!xs-;k0c>YhOac2wSP5AV5zcS#%4^ko z1_?eWw@O^~ZCR)u$r-UPZ3GgD$gG1;_Z5=Wpg9v%fazS3T>3-)YtywA0HP+*;9pbX z)YGgno(BlUJ{)u6**rWNyNO_l>4klb;U7BPD9!;VMGrv<^08X4IR$7)$AjwyxHht# zL>YQ*9x%kQFfnzy>C~**ijZL501`sSK9xZP3dlBkx27*ORz;3KaM1Ww{-N3F=@22@ zT$3BoJErQa&j^tIvq1E?$`0FBkKYE()}ccVR)5< zd}z+CU!H?ds2Tr?pjgVF9F?t?%hPXUT1hLLGaQmvB&EA~@%2 zb2Pl+X>84y+kbLNsJ@3_@m~a$A>%~K=LaEPZ#9a`uN;w zTm;71nX+D=Pcijg=E!5A8>wQU({+r5)lWAu$}~M*%aVgpk5lYu6KIiGtw_#wNiCiC z5^js{ht>g#smyJA3*my78kQfzR7&+p4QCDy#p#{yN3%0QU>+X702!A8l8}(NpG<0g zFML%Jl9V^W)8eTq5}h}-1VR>7pr>BTl{1DwE?Q5Y$j=($y0l0apDHT2^aiV>txL`MR zv*|Bq$%wg3^5*^9T9nC<0p{R!inoRavY?URAAiw#D>Vt!6?J=RG4Gl!vm#ZsqWU0h zHpb7-FKm<`l+9UDeUn~YU42Sqa=;dgDmRiBDhvZm0N^W}AKY7k{+k`oUUMEONC0j^ zkF>tvUlh1T5RbTrys0hy$Re#r^1oB9e^X#-U+0PX6m?0Bv2zvOf=qDN6~KGH1Odu) z0|+)ko1gZ1&Gh+st4l2aKdZk!=iH|%(k%_zO9t$W87e5n2wCqe&Il;@37$Vp_{(1w zU_Ue41>x90dDetJ6`ca_g>SgKWJOy1pUkzsIUPt*UKrwbM)}T#8Vc%hF~5hhakcv8 zsID#e?AD8bDzb;~25bqZR2{tA$~Hd^$|U_Bx2ybz4i|D`G+Lkq6G^A3M8|kHja8PU z_BW2^lcY@^E}iVTOcj?eCB!wTkSU|P%K%Nr0g;(u3t9dAhZ3vc>!*D|1rse#V0t_> zqhn(bk<=j{=`6!?0zdQv&D#Mt*boc`rS^UrAwWtPUq{p+4?i>sU3mCoEQ@D+d z(u>Bs!;_OqO$ea;XPm$EhPsrrsr1e54!C6g?qdy(Rn3=?k+F4I#o=&aVPV-FSNePn zwY8q!-uQHnU7O|_OkM2k!X<_Bcvx6j;kN|^1(y$h1KAO+SnANh-1Ln+9@5{;6qJ;u zw=aJs1ixEdI{zVY*mblN9PIA?EQ4!UcmQ{L3Ntnu4)}wzmhFM`T%~fp*>V9to@75J zHEf70a<%e(Z@==XG$dPpG}`30^aa!qF!&l~mh%J?esXMBBd1U=c~)Ai;f3VH7x>wHvgh1Jz5 zdi7>hn(rU`MJ-JVNZh}2V0288FvQ?yv-bwIRD^s9=I&o{$Ek1N^U$=DQvDC#r-3|B z+1g4O0QJ49S8BO-@SHGHe;Rn6yobr?myVI_IHsV}qSPq2cPfJev#~)xM<9`>+ z4BW+sQSE08*w$K^l*H@t>I&8oTeWP$_+?Ff{rxw- zNJck%7wRU0N--Z`!7Ks>2G)=j?YzY0>*;=1y>wRZo+Cw{*Q6CW_CU}+7CP@4C0w=L zmVxYI^4S{na%~Ntp{t=mY;Yvf{^N>v>a{}K~gu|T|&QDo5(#GFFs`v|JSmmDfz z#YPN}{%BtUr42cfqGR`y=In+y(>F4y9H*n1a%a@mL6Fe?HEMk>vr5AwsRf}&n+xlp zvC;c4uyX}kv^<{EPIn>buLEyQxmB`BEhx*SOR&)k%k8q%|s2> zb42G=ZH3W|{Ptp3d)rl3^v*6_1)6@yayIK1?C)<}jrMB(0D|a00wsb=%1$>?_v2Rq zBfyjeM0mhdgV2%^I1nYo$M*{tt*@`c;c!5hu&OCiAyOZQy!tIJM^sH8kvL%c41A9| z>iv)%_rnXNkUX9Pn1z9Xe}{i|s-1}e%D!#`qx|0ep^QP6R&hDXNiY>|mu{;1lnOtf ztp$lhmfqhp$FwO)1Fre`8-g0+*w#DulLzs<_@miBgv~pP2V?__O^_iu_`o#WhUkC$ zXg#TH(fKtTbQ*U!z?}muWZ)})2uTsW3xwFEVwMnUEvr?@UCQ9&8ya64Ogtv}LN$mT zAlw<>5|nBb>7jVEc5PWjUWsGNIkJo(RR c+c_&!32!gAaEBAHVu%M((NeB@{4Df;0Oi_cCjbBd literal 0 HcmV?d00001 diff --git a/习题解析/04 串/_v_images/20181128012817985_10766.png b/习题解析/04 串/_v_images/20181128012817985_10766.png new file mode 100644 index 0000000000000000000000000000000000000000..d8f8933d329dc1f94d92e48819c5717874acca83 GIT binary patch literal 13918 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 literal 0 HcmV?d00001 diff --git a/习题解析/04 串/_v_images/20181128013044407_30919.png b/习题解析/04 串/_v_images/20181128013044407_30919.png new file mode 100644 index 0000000000000000000000000000000000000000..93208538e90bbc19afea98721baf3cc6ca723c56 GIT binary patch literal 7837 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 K?W2lq literal 0 HcmV?d00001 diff --git a/习题解析/04 串/_v_images/20181128013157410_30749.png b/习题解析/04 串/_v_images/20181128013157410_30749.png new file mode 100644 index 0000000000000000000000000000000000000000..f80b966b63cb2088804e57d945e17872c388cd48 GIT binary patch literal 4560 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 literal 0 HcmV?d00001 diff --git a/习题解析/04 串/_v_images/20181128013251526_202.png b/习题解析/04 串/_v_images/20181128013251526_202.png new file mode 100644 index 0000000000000000000000000000000000000000..de2a418988b36b46be741e2568f96c6508466407 GIT binary patch literal 2052 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 一个空字符为:'\0' ,一个空格字符为:' ' 。空串是只包含一个空字符的字符串,其长度为0。 +> 空格串是除了在结尾包含空字符外,还包含若干空格字符的字符串,统计其长度时,要将除空字符外的字符个数都计算在内。 + +### 4.2 对于教科书4.1节中所述串的各个基本操作,讨论是否可由其他基本操作构造而得,如何构造? + +> 对于串操作中的最小操作子集,即串赋值(StrAssign)、串比较(StrCompare)、求串长(StrLength)、串联接(Conact)以及求子串(SubString)5种操作不可由其他操作来实现。 +> 其他串操作则可利用串的最小操作子集实现。 + +### 4.3 设s = 'I AM A STUDENT',t = 'GOOD',q = 'WORKER'。 +##### 求:StrLength(s),StrLength(t),SubString(s, 8, 7),SubString(t, 2, 1),Index(s, 'A'),Index(s, t),Replace(s, 'STUDENT', q),Concat(SubString(s, 6, 2), Concat(t, SubString(s, 7, 8)))。 + +> StrLength(s) = 14; +> StrLength(t) = 4; +> SubString(s, 8, 7) = 'STUDENT'; +> SubString(t, 2, 1) = 'O'; +> Index(s, 'A') = 3; +> Index(s, t) = 0; +> Replace(s, 'STUDENT', q) = 'I AM A WORKER'; +> Concat(SubString(s, 6, 2), Concat(t, SubString(s, 7, 8))) = 'A GOOD STDENT'. + +### 4.4 已知下列字符串 +###### a = 'THIS', f = 'A SAMPLE', c = 'GOOD', d = 'NE', b = ''. +###### s = Concat(a, Concat(SubString(f, 2, 7), Concat(b, SubString(a, 3, 2)))), +###### t = Replace(f, SubString(f, 3, 6), c), +###### u = Concat(SubString(c, 3, 1), d), +###### g = 'IS', +###### v = Concat(s, Concat(b, Concat(t, Concat(b, u)))), +###### 试问:s,t,v,StrLength(s),Index(v, g),Index(u, g)各是什么? + +> s = 'THIS SAMOLE IS'; +> t = 'A GOOD'; +> v = 'THIS SAMPLE IS A GOOD ONE'; +> StrLength(s) = 14; +> Index(v, g) = 3; +> Index(u, g) = 0. + +### 4.5 试问执行以下函数会产生怎样的输出结果? + +```c +void demonstrate() +{ + StrAssign(s, 'THIS IS A BOOK'); + Replace(s, SubString(s, 3, 7), 'ESE ARE'); + StrAssign(t, Concat(s, 'S')); + StrAssign(u, 'XYXYXYXYXYXY'); + StrAssign(v, SubString(u, 6, 3)); + StrAssign(w, 'W'); + printf('t=', t, 'v=', v, 'u=', Replace(u, v, w)); +}//demonstrate +``` + +> t='THESE ARE BOOKS', v='YXY', u='XWXWXW' + +### 4.6 已知:s = '(XYZ)+\*', t = '(X+Z)\*Y'。试利用联接、求子串和置换等基本运算,将s转化为t。 + +> S1 = SubString(s, 3, 1); //S1 = 'Y' +> S2 = SubString(s, 6, 1); //S2 = '+' +> Replace(s, S1, S2); //s = '(X+Z)+\*' +> Concat(S3, s, S1); //S3 = '(X+Z)+\*Y' +> Concat(t, SubString(S3, 1, 5), SubString(S3, 7, 2)); + +### 4.7 令s = 'aaab',t = 'abcabaa',u = 'abcaabbabcabaacbacba'。试分别求出它们的next函数值和nextval函数值。 + +> **s** + +![4.7.1](_v_images/20181128012650395_14443.png) + +> **t** + +![4.7.2](_v_images/20181128012749064_24270.png) + +> **u** + +![4.7.3](_v_images/20181128012817985_10766.png) + +### 4.8 已知主串s = 'ADBADABBAABADABBADADA',模式串pat = 'ADABBADADA',写出模式串的nextval函数值,并由此画出KMP算法匹配的全过程。 + +![4.8.1](_v_images/20181128013044407_30919.png) + +![4.8.2](_v_images/20181128013157410_30749.png) + +### 4.9 在以链表存储串值时,存储密度是结点大小和串长的函数。假设每个字符占一个字节,每个指针占4个字节,每个结点的大小为4的整数倍,已知串长的分布函数为f(l)且![4.9.1](_v_images/20181128013251526_202.png),求结点大小为4k,串长为l时的存储密度d(4k, l)(用公式表示)。 + +![4.9.2](_v_images/20181128013312950_14120.png) + +## 二、算法设计题 + +```c +在编写4.10至4.14题的算法时,请采用StringType数据类型: +StringType是串的一个抽象数据类型,它包含以下五种基本操作: + +void StrAssign (StringType &t, StringType s) +//将s的值赋给t。s的实际参数可以是串变量或者串常量(如:‘abcd’) + +int StrCompare (StringType s, StringType t) +//比较s和t。若s>t,返回值>0;若s=t,返回值=0;若s ###### 在编写4.15至4.20题的算法时,请采用教科书4.2.1节中所定义的定长顺序存储表示,而不允许调用串的基本操作。 + +### 4.15 编写算法,实现串的基本操作StrAssign(&T, chars)。 +### 4.16 编写算法,实现串的基本操作StrCompare(S, T)。 +### 4.17 编写算法,实现串的基本操作Replace(&S, T, V)。 + +---------- + +### 4.18 编写算法,求串s所含不同字符的总数和每种字符的个数。 + +---------- + +### 4.19 在串的定长顺序存储结构上直接实现4.11题要求的算法。 + +---------- + +### 4.20 编写算法,从串s中删除所有和串t相同的子串。 + +---------- + +### 4.21 假设以结点大小为1(且附设头结点)的链表结构表示串。试编写实现下列六种串的基本操作StrAssign,StrCopy,StrCompare,StrLength,Concat和SubString的函数。 + +---------- + +### 4.22 假设以块链结构表示串。试编写将串s插入到串t中某个字符之后的算法(若串t中不存在此字符,则将串s联接在串t的末尾)。 + +---------- + +### 4.23 假设以块链结构作串的存储结构。试编写判别给定串是否具有对称性的算法,并要求算法的时间复杂度为O(StrLength(S))。 + +---------- + +> ###### 在编写4.24至4.26题的算法时,请采用教科书4.2.2节中所定义的堆分配存储表示。 + +### 4.24 试写一算法,在串的堆存储结构上实现串基本操作Concat(&T, s1,s2)。 +### 4.25 试写一算法,实现堆存储结构的串的置换操作Replace(&S, T, V)。 +### 4.26 试写一算法,实现堆存储结构的串的插入操作 StrInsert(&S, pos, T)。 + +---------- + +### 4.27 当以教科书4.2.1节中定义的定长顺序结构表示串时,可如下所述改进定位函数的算法:先将模式串t中的第一个字符和最后一个字符与主串s中相应的字符比较,在两次比较都相等之后,再依次从t的第二个字符逐个比较。这样做可以克服算法Index(算法4.5)在求模式串'akb'(ak表示连续k个字符'a') 在主串'anb'(k≤n)中的定位函数时产生的弊病。试编写上述改进算法,并比较这两种算法在作Index('anb','akb')运算时所需进行的字符间的比较次数。 + +---------- + +### 4.28 假设以结点大小为1(带头结点)的链表结构表示串,则在利用next函数值进行串匹配时,在每个结点中需设三个域:数据域chdata、指针域succ和指针域next。其中chdata域存放一个字符;succ域存放指向同一链表中后继结点的指针;next域在主串中存放指向同一链表中前驱结点的指针;在模式串中,存放指向当该结点的字符与主串中的字符不等时,在模式串中下一个应进行比较的字符结点(即与该字符的next函数值相对应的字符结点)的指针,若该节点字符的next函数值为0,则其next域的值应指向头结点。试按上述定义的结构改写求模式串的next函数值的算法。 +### 4.29 试按4.28题定义的结构改写串匹配的改进算法(KMP算法)。 + +---------- + +### 4.30 假设以定长顺序存储结构表示串,试设计一个算法,求串s中出现的第一个最长重复子串及其(第一次出现的)位置,并分析你的算法的时间复杂度。 + +---------- + +### 4.31 假设以定长顺序存储结构表示串,试设计一个算法,求串s和串t的一个最长公共子串,并分析你的时间复杂度。若要求第一个出现的最长公共子串(即它在串s和串t的最左边的位置上出现)和所有的最长公共子串,讨论你的算法能否实现。 + +----------