1. 배열 arr에 {1,3,5,7,9}를 대입하고, 배열요소의 총합을 구하는 프로그램을 포인터를 이용해서 작성하라.
#include <stdio.h> int main() { int arr[5] = { 1,3,5,7,9 }; int* iptr = arr; int num = sizeof(arr) / sizeof(arr[0]); int sum = 0; for (int i = 0; i < num; i++) { printf("%d", *iptr); sum += *iptr++; if (i != num) { printf(" + "); } else { printf(" = "); } } printf("%d\n", sum); }
2. 2차원 배열 matrix[5][5]를 선언하고 포인터변수를 이용하여 모든 요소를 0으로 초기화하고... (하략)
#include <stdio.h> #include <stdlib.h> // system("cls"); 사용 const int C = 5; const int L = 5; void init_mat(int *mat); void print_mat(int *mat); void sp1_mat(int *mat); void sp2_mat(int *mat); int main() { int matrix[C][L]; int select; init_mat(&matrix[0][0]); print_mat(&matrix[0][0]); do { printf("1. 예제1 출력 \n"); printf("2. 예제2 출력 \n"); printf("3. 초기화 \n"); printf("4. 작업종료 \n"); printf("원하는 작업을 선택하세요. \n"); scanf_s("%d", &select); switch (select) { case 1: system("cls"); init_mat(&matrix[0][0]); sp1_mat(&matrix[0][0]); print_mat(&matrix[0][0]); break; case 2: system("cls"); init_mat(&matrix[0][0]); sp2_mat(&matrix[0][0]); print_mat(&matrix[0][0]); break; case 3: system("cls"); init_mat(&matrix[0][0]); print_mat(&matrix[0][0]); break; case 4: break; default: printf("잘못 입력하셨습니다. 다시 입력하세요. \n"); break; } } while (select != 4); } //int* m_pt = &matrix[0][0]; //int* m_pt = matrix; 가 안되는 이유는 무엇인가? void init_mat(int *mat) { for (int i = 0; i < C*L; i++) { *mat++ = 0; } } void print_mat(int *mat) { printf("\n"); int k = 0; for (int i = 0; i < C*L; i++) { printf("%2d ", *mat++); k++; if (k == C) { printf("\n"); k = 0; } } printf("\n"); } void sp1_mat(int *mat) { int k = 0; int l = 4; int n = 1; for (int i = 0; i < C*L; i++) { if (i % 5 >= l) { *mat = n; n++; } mat++; k++; if (k == 5) { k = 0; l--; } } } void sp2_mat(int *mat) { int k = 0; int l = 4; int n = 1; for (int i = 0; i < C*L; i++) { if (i % 5 <= l) { *mat = n; n++; } mat++; k++; if (k == 5) { k = 0; l--; } } } // 코드가 너저분... 나중에 정리하자...
3. 다음 코드를 컴파일하고 어떻게 출력되는지 알아보라.
#include <stdio.h> int main() { char c; const char *p; p = "WELCOME TO"; c = 'C'; printf("%s %s %c %s \n", p, "Visual-", c, "!!!"); }
4. 변수 c에 문자 'A'를 입력한 후 변수 c의 내용과 포인터값(주소)을 출력하는 프로그램을 작성하라.
#include <stdio.h> int main() { char c = 'A'; printf("vlaue of c : %c , adress of c : %x \n", c, (unsigned)&c); }
5. 아래와 같이 변수가 선언되었다고 가정할 때 a) 부터 d)까지 기술된 각 공간의 내용은 무엇인가?
int a[2][3] = { {-3,14,5}, {1,-10,8} };
int *b[] = { a[0], a[1] };
int *p = b[1];
a) *b[1] : 1
b) *(++p) : -10
c) *(*(a+1)+1) : -10
d) *(--p-2) : 14
#include <stdio.h> int main() { int a[2][3] = { {-3,14,5}, {1,-10,8} }; int *b[] = { a[0], a[1] }; int *p = b[1]; printf("*b[1] : %d \n", *b[1]); printf("*(++p) : %d \n", *(++p)); printf("*(*(a + 1) + 1)) : %d \n", *(*(a + 1) + 1)); printf("*(--p - 2) : %d \n", *(--p - 2)); }
6. 아래와 같이 변수가 선언되었다고 가정할 때 a) 부터 e)까지 기술된 각 공간의 내용은 무엇인가?
int ar[] = { 10, 15, 4, 25, 3, -4 };
int *p;
p = &ar[2];
a) *(p+1) : 25
b) p[-1] : 15
c) (ar-p) : -2
d) ar[*p++] : 3
e) *(ar+ar[2]) : 3
#include <stdio.h> int main() { int ar[] = { 10, 15, 4, 25, 3, -4 }; int *p; p = &ar[2]; printf("*(p+1) = %d \n", *(p + 1)); printf("p[-1] = %d \n", p[-1]); printf("(ar-p) = %d \n", (ar - p)); printf("ar[*p++] = %d \n", ar[*p++]); printf("*(ar+ar[2]) = %d \n", *(ar + ar[2])); }
7. 정수 데이터 x와 y를 서로 바꾸어 넣는 함수 Swap(px,py)를 작성하라. (하략)
#include <stdio.h> void Swap(int* px, int* py); int main() { int n, m; printf("Input n : "); scanf_s("%d", &n); printf("Input m : "); scanf_s("%d", &m); printf("Input Value -> n = %d, m = %d \n", n, m); Swap(&n, &m); printf("After Value -> n = %d, m = %d \n", n, m); } void Swap(int* px, int* py) { *px ^= *py; *py ^= *px; *px ^= *py; }
8. 문자열 Str에 저장된 메모리 주소와 내용을 화면에 출력하는 함수 StrAddress()를 작성하라.
#include <stdio.h> void StrAddress(char* str); int main() { char str[] = "Funny"; StrAddress(str); } void StrAddress(char* str) { while (*str != '\0') { printf("Address : %x => %c \n", str, *str); str++; } }
9. printf("words = %s", words);와 같은 동작을 하는 함수 output을 작성하라.
#include <stdio.h> #include <stdarg.h> void output(const char* types, ...); int main() { char words[] = "intranet"; output("words = %s", words); } void output(const char* types, ...) { va_list ap; const char *pch = types; const char *spch; va_start(ap, types); while (*pch) { if (*pch == '%') { switch (*(++pch)) { case 's': spch = va_arg(ap, char*); while (*spch) { putchar(*spch); *spch++; } pch++; } } putchar(*pch); ++pch; } va_end(ap); }
// 정리한 내용에 없던 가변인수 함수를 사용했다.
10. 문자열 String의 뒤에 있는 공백 문자를 없애는 프로그램을 작성하라.
#include <stdio.h> #include <string.h> void DeleteBlank(char* str); int main() { char str[] = "De le te! "; printf("Before String : %s, String length : %d\n", str, strlen(str)); DeleteBlank(str); printf("After String : %s, String length : %d\n", str, strlen(str)); } void DeleteBlank(char* str) { int temp = 0; while (*str != '\0') { str++; } while (*--str == ' ') { *str = '\0'; str--; } }
//*str을 '\0'까지 보냈으면 한칸 당겨서 계산해야지 뭘 했던 것인가...
11. 입력받은 문자열이 회문인지 아닌지 확인하는 프로그램을 작성하라.
#include <stdio.h> #include <string.h> int palindrome(char* str); int main() { char str[200]; printf("문자열을 입력하세요 : "); scanf_s("%s", str, 200); printf("%s \n", palindrome(str) ? "회문입니다." : "회문이 아닙니다."); } int palindrome(char* str) { char buff[100]; int Num = (strlen(str) / 2); //strlen()은 unsigned를 리턴한다. 그래서 반복문의 조건으로 달 때 signed와 결과가 다르다. if (strlen(str) % 2 == 0) { int i = 0; for (i; i < Num; i++) { buff[i] = *str++; } i--; for (i; i > 0; i--) { if (buff[i] != *str++) { return 0; } } return 1; } else { int i = 0; for (i; i < Num; i++) { buff[i] = *str++; } i--; str++; for (i; i > 0; i--) { if (buff[i] != *str++) { return 0; } } return 1; } }