From 1fdf60275452094b6ae9fb3e5696e7935c9f98ab Mon Sep 17 00:00:00 2001 From: Kenryu Shibata Date: Thu, 2 Jul 2026 10:29:57 +0900 Subject: [PATCH] added cls11 --- report-cls11.tex | 27 ++++++++++++++++ src/cls11/Makefile | 14 ++++++++ src/cls11/main.c | 80 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 121 insertions(+) create mode 100644 report-cls11.tex create mode 100644 src/cls11/Makefile create mode 100644 src/cls11/main.c diff --git a/report-cls11.tex b/report-cls11.tex new file mode 100644 index 0000000..cc172bf --- /dev/null +++ b/report-cls11.tex @@ -0,0 +1,27 @@ +\documentclass[xelatex,a4paper,11pt,ja=standard]{bxjsarticle} + +\usepackage{tex/preamble} +\usepackage{tex/simple-title} + +\reportauthor{柴田健琉} +\reporttitle{情報処理2 - 前期第11回課題} +\reportdate{2026年}{07月}{02日} +\turnindate{2026年}{07月}{06日} + +\begin{document} + \simpletitle + + \section{はじめに} + + この課題のプログラムは以下の環境での動作が確認されている: + + \begin{itemize} + \item{OS: Arch Linux, Linux 6.18.37-1-lts x86\_64} + \item{CC: GCC 15.2.0} + \item{CFLAGS: \texttt{-g -O1 -Wall -Wpedantic}} + \end{itemize} + + \section{課題 - 回文判定} + + +\end{document} diff --git a/src/cls11/Makefile b/src/cls11/Makefile new file mode 100644 index 0000000..55e2aec --- /dev/null +++ b/src/cls11/Makefile @@ -0,0 +1,14 @@ +include ../common.mk + +PROJECT_NAME:=cls11 + +TGTS:=$(patsubst %.c,%,$(wildcard *.c)) + +all: $(TGTS) + +%: %.c + @mkdir -p $(BUILD_PATH)/$(PROJECT_NAME) + $(CC) $(CFLAGS) $^ -o $(BUILD_PATH)/$(PROJECT_NAME)/$@ + +clean: + $(RM) -drf $(BUILD_PATH)/$(PROJECT_NAME) diff --git a/src/cls11/main.c b/src/cls11/main.c new file mode 100644 index 0000000..38b79c8 --- /dev/null +++ b/src/cls11/main.c @@ -0,0 +1,80 @@ +#include +#include + +#define BUFF_SZ 128 + +// Lenght of string including null terminator +int my_strlen(char *str, int max_len) { + int i = 0; + while (*(str + i) != '\0' && i < max_len) + i++; + + return i; +} + +// convert ASCII CAPITAL CASE ALPHABETS into lower case alphabets +void to_lower(char *str, int sz) { + for (int i = 0; i < sz; i++) { + if (*(str + i) >= 'A' && *(str + i) <= 'Z') { + *(str + i) = *(str + i) + 0x20; + } + } +} + +// remove every non-alphabet letters from string +int strip(char *str, char *dest, int sz) { + int ret_sz = 0; + + if (str == NULL || dest == NULL) { + return -1; + } + + for (int i = 0; i < sz; i++) { + if (*(str + i) >= 'a' && *(str + i) <= 'z') { + *(dest + ret_sz) = *(str + i); + ret_sz++; + } + } + + *(dest + ret_sz) = '\0'; + + return ret_sz; +} + +// check if string is a palindrome +bool kaibun(char *str, int sz) { + for (int i = 0; i < (sz - 1)/2; i++) { + if (*(str + i) != *(str + sz - i - 2)) { + return false; + } + } + + return true; +} + +int main(void) { + char *b = (char*)malloc(sizeof(char) * (BUFF_SZ + 1)); // BUFF_SZ letters + null terminator + char *t = (char*)malloc(sizeof(char) * (BUFF_SZ + 1)); + + printf("Input string: "); + char* res = fgets(b, BUFF_SZ, stdin); + if (res == NULL) { + printf("Error while reading from stdin\n"); + return 0; + } + + int len = my_strlen(b, BUFF_SZ); + + printf("len: %d\n", len); + + to_lower(b, len); + len = strip(b, t, len); + + printf("len: %d\n", len); + + bool isPalindrome = kaibun(t, len + 1); + + printf("isPalindrome: %d\n", isPalindrome); + + return 0; +}