int main() { int num1 , num2 = 1, num3, num4 = 2; printf("별을 위해서 숫자를 입력해주세요\n"); scanf("%d", &num1); num3 = num1 - 1; while(num2 <= num1){ while(num3 < num1){ printf("*"); num3++; } printf("\n"); num3 = num3 - num4; num2 = num2 + 1; num4++; } return 0; }
// 함수 선언 void reverseArr(int **arr, int arrLen); // 함수 사용시 int arr[10]; reverseArr(&arr, 10);
// 정수를 인자로 주면 숫자를 뒤집어서 돌려준다. // 123을 넣으면 321을 리턴. 100을 넣으면 1을 리턴. 120을 넣으면 21을 리턴. int reverse(int number);
// 한 달의 달력을 출력하는 함수입니다. void printCalender(int nameOfDay, int year, int month); // 달의 첫 날의 요일(nameOfDay)과 마지막 날의 수를 받아서 1~endDayOfMonth까지 출력합니다. void printDate(int nameOfDay, int endDayOfMonth); // 달의 1일 앞의 부분에 빈 요일 수만큼 탭('\t')을 넣습니다. void printFirstTab(int nameOfDay); // 달력 첫 머리 부분(월, 년도, 한 줄, 요일 표시)을 출력합니다. void printHeader(int year, int month); // 다음 달의 첫 날의 요일을 반환합니다. int calculateNameOfNextMonthFirstDay(int nameOfDay, int year, int month); // 해당 달의 마지막 날의 요일을 반환합니다. int calculateNameOfLastDay(int nameOfDay, int year, int month); // 윤달 체크. bool isLeapYear(int year); // 각 달의 마지막 날 수를 반환합니다. // 단순한 switch-case문으로 이루어져 있으며, 2월에 대해서는 윤달 체크를 합니다. int endDayOfMonth(int year, int month); // 각 요일의 숫자를 받아서 문자열 값을 반환합니다. (ex. 0-"Sun", 1-"Mon" ...) // 단순한 switch-case문으로 이루어져 있습니다. char *printMonthName(int i);
#include <stdio.h> #include "Calender.h" int main(int argc, char *args[]) { // year와 요일(nameOfDay)을 입력받는 부분. int year = 0, nameOfDay = 0; printf("Enter the year : "); scanf("%d", &year); printf("Enter the name of day(0:sun ~ 6:sat) : "); scanf("%d", &nameOfDay); // 1~12월을 출력하는 부분. for ( int month = 1; month <= 12; month++ ) { printCalender(nameOfDay, year, month); nameOfDay = calculateNameOfNextMonthFirstDay(nameOfDay, year, month); } return 0; }
January, 2012 ------------------------------------------------- Sun Mon Tue Wed Thu Fri Sat 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
#include <stdio.h> #include <string.h> typedef struct People{ char gender; int age; char name[100]; char real_name[100]; } People; int main() { char str1[100] = "abc"; char str2[100] = "aaa"; People p; strcat(p.name, "홍길동"); strcat(str1, str2); printf("%s", str1); getchar(); return 0; }
#include <stdio.h> typedef struct Account { char *name; int money; } Account; typedef struct AccountArray { struct Account **accounts; int currentAccountNumber; int maxLength; // 배열을 사용할 때는 길이를 관리하는 구조체를 만들어서 쓰면 편하다. } AccountArray; Account *createAccount(char *name); // Account에 깔끔하게 이름을 할당하기 위해서는 문자열 함수가 필요할 것이다. AccountArray *createAccountArray(int maxLength); void addAccount(AccountArray *accountArray, char *name); bool isFull(AccountArray *accountArray); // 배열이 다 차면 어떻게 하면 좋을까?????? AccountArray *extendArray(AccountArray *before); // 다 찬 배열은 새로 확장을 해 주어야 합니다. void deleteAccount(AccountArray *accountArray, char *name); // 배열의 중간 원소 삭제? 중간에 구멍만 뻥 뚫어두면 되나? void deposit(AccountArray *accountArray, char *name, int money); // accountArray 내부에서 이름으로 비교할 필요가 있겠지. void withdraw(AccountArray *accountArray, char *name, int money); void addAccountMenu(); void deleteAccountMenu(); void depositMenu(); void withdrawMenu();
#include <stdio.h> #include "Account.h" int main(int argc, char *argv[]) { int select = 0; // 추가적인 변수들이 필요할 것으로 예상. while ( true ) { printf("select menu : "); printf("1: 계좌 추가\n"); printf("2: 계좌 삭제\n"); printf("3: 입금\n"); printf("4: 출금\n"); scanf("%d", &select); switch ( select ) { case 1: addAccountMenu(); break; case 2: deleteAccountMenu(); break; case 3: depositMenu(); break; case 4: withdrawMenu(); break; default: break; } } return 0; }
////////////////////////////////////// 기본 타입, 기본 타입 + 포인터 char a; // a의 타입? 1. 메모리에 a 그려보기. a = ?? // 적절한 값으로 초기화 해 보기. int b; // b의 타입? 1. 메모리에 b 그려보기. b = ?? // 적절한 값으로 초기화 해 보기. char c[10]; // c의 타입?, 1. 선언과 동시에 0으로 초기화 해 보기., 2. 반복문을 이용해서 원소마다 초기화 해 보기., 3. c[0]의 타입? char *d; // d의 타입? char 10개 분량의 배열로 선언과 동시에 초기화 해 보기. // c와 d를 각각 메모리에 그려보기. 중요. ??? // []를 이용해서 c의 세 번째 원소에 접근해 보기. ??? // 가능한 방법으로 d의 세 번째 원소에 접근해 보기. ??? // 가능한 방법으로 c의 세 번째 원소에 접근해 보기. // array[0] == *(array + 0) 배열이나 포인터나 해당 주소에 대한 접근이라는 점에서는 동일하게 접근할 수 있다. //////////////////////////////////////// 사용자 정의 타입, 사용자 정의 타입 + 포인터 Person p; // p의 타입? 1. 메모리에 p의 모양 그려보기. ??? // p의 내용물에 접근해보기. Person pArr[10]; // pArr의 타입? 1. 메모리에 pArr의 모양 그려보기. ??? // pArr의 0번째 내용물에 접근해보기 Person *p2; // p2의 타입? 1. 메모리에 p2의 모양 그려보기. ??? // p2 초기화 해 보기. ??? // p2의 내용물에 접근해보기. Person *ppa[10] // ppa의 타입? 1. 메모리에 ppa의 모양 그려보기., 2. ppa[0]의 타입? 3. ppa[0] 초기화 해 보기. 4. ppa[0]의 내용물에 접근해 보기. Person **ppb // ppb의 타입? 1. 메모리에 ppb의 모양 그려보기., 2. ppb[0]의 타입? 3. ppb[0] 초기화 해 보기., 4. ppb[0]의 내용물에 접근해 보기.
Account makeAccount(char *name) { Account account; account.money = 0; account.name = (char *)malloc(sizeof(char) * (strlen(name)+1)); strcpy(account.name, name); return account; } void addMoney(Account account, int money) { account.money += money; }그냥 Account를 반환하게 만든 다음 함수들을 써 보면 차이를 알 수 있습니다.
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef int Data; typedef struct Node { Data data; Node *nextNode; } Node; typedef struct LinkedList { int length; Node *headNode; } LinkedList; LinkedList *createList(); Node *createNode(Data data); void deleteList(LinkedList *linkedList); // LinkedList까지 삭제. void addData(LinkedList *linkedList, Data data); // LinkedList의 맨 뒤에 Data를 가진 Node 추가. void removeData(LinkedList *linkedList, Data data); // 해당하는 Data를 가진 Node 삭제. Node *getData(LinkedList *linkedList, int position); // 해당하는 index를 가진 Node를 반환. void clearList(LinkedList *linkedList); // LinkedList의 Node들 삭제. void printList(LinkedLIst *linkedList);
#include "LL.h" LinkedList *createList(){ LinkedList *res; res = (LinkedList *)malloc( sizeof(LinkedList) ); (*res).headNode = NULL; (*res).length = 0; return res; } Node *createNode(Data data){ Node *res; res = (Node *)malloc( sizeof(Node) ); (*res).data = 0; (*res).nextNode = NULL; return res; } void deleteList(LinkedList *linkedList){ clearList(linkedList); free(linkedList); } void addData(LinkedList *linkedList, Data data){ Node *node = createNode( data ); Node *temp = linkedList->headNode; for(;temp->nextNode != NULL;){ temp = temp->nextNode; } temp->nextNode = node; } void removeData(LinkedList *linkedList, Data data){ int onoff = 0; //for duty of switch Node *remove = linkedList->headNode; if( remove->data == data ){ free( remove ); //If the object is headNode onoff = 1; } if( onoff == 0 && remove->nextNode->data == data ){ free( remove->nextNode ); //If the object is the nextNode of headNode onoff = 1; } for(; onoff == 0 && remove->nextNode->data != data;){ //... remove = remove->nextNode; } remove->nextNode = remove->nextNode->nextNode; // remove remove-n remove-n-n free(remove->nextNode); // remove ~ remove-n-n , free remove-n } Node *getData(LinkedList *linkedList, int position){ Node *get = linkedList->headNode; for( int i = 0 ; i < position ; i++ ){ get = get->nextNode; } return get; } void clearList(LinkedList *linkedList) { Node *now = (*linkedList).headNode; Node *next; for( ; (*now).nextNode != NULL ; ){ //now의 다음이 있는동안 반복 next = (*now).nextNode; //next는 now의 다음 free( now ); //now를 free now = next; //next를 now로 당김 } free( now ); //now를 free } int lengthOf(LinkedList *linkedList){ int length = 0; Node *temp = linkedList->headNode; for( ; temp->nextNode != NULL ; length++ ){ temp = temp->nextNode; } return length; } void printList(LinkedList *linkedList){ Node *temp = linkedList->headNode; for( ; temp->nextNode != NULL ; ){ printf("%d\t", temp->data); temp = temp->nextNode; } printf("\n"); }
int main() { Stack *stack = createStack(); assert(stack->elementNumber == 0); assert(stack->head == NULL); push(stack, 10); assert(stack->elementNumber == 1); assert(peek(stack)->data == 10); push(stack, 20); assert(stack->elementNumber == 2); assert(peek(stack)->data == 20); assert(pop(stack)->data == 20); assert(stack->elementNumber == 1); Node *result = pop(stack); assert(result->data == 10); assert(isEmpty(stack)); return 0; }