
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;
}