열혈강의C 16장 도전4 회문Palindrome 확인

lel

bob
noon
앞으로 읽으니 뒤로 읽으니 똑같은 문자들을
회문Palindrome라고 한다.
main에 포함시킨걸로 한개 자고
함수로 한개 짜봤는데
main으로 한거에는 잡스러운걸 많이 넣었다.
--------------------------------------------------------------------------------
#include
<stdio.h>
int palindrome(int*pArr);
int
main(void)
{
char carr[100];
int i, n, result;
printf("문자열을
입력");

scanf("%s", carr);

i=0;
n=0;

printf("n");
printf("-------------");
printf("n");

while
(carr[i]!=0)
{
n++;
i++;
}
for(i=0;i<100;i++)
{
printf("
| %c | ", carr[i]);
}

printf("n");
printf("-------------");
printf("n");

result=1;
for
(i=0; i<n; i++)
{
if (carr[i]==carr[n-i-1])
continue;
else
if (carr[i]!=carr[n-i-1])
{
result=0;
break;
}
}

if
(result==1)
printf("회문이다.n");
else
printf("n회문이아니다.n");

return
0;
}
----------------------------------------------------------------------
#include
<stdio.h>
int palindrome(char*pArr);
int main(void)
{
char
carr[100];
printf("문자열을 입력");

scanf("%s", carr);

if
(palindrome(carr)==1)
printf("회문이다.n");
else
printf("n회문이아니
다.n");
return 0;
}
int palindrome(char*pArr)
{
int
i, n;
i=0;
n=0;
while (pArr[i]!=0)
{
n++;
i++;
}

for
(i=0; i<n; i++)
{
if (pArr[i]==pArr[n-i-1])
continue;
else
if (pArr[i]!=pArr[n-i-1])
{
return 0;
}

}
return
1;

}

열혈강의C 16 도전5 배열 내림차순 정리함수

#include <stdio.h>

void DesSort(int*pArr);
int main(void)
{
int arr[7]={1, 2, 3, 5, 6, 7, 8};
int i;
printf("n1-%d", *arr);
printf("n2-%dn", arr);
printf("3-%dn", arr[0]);
for(i=0; i<7; i++)
{
scanf("%d", &arr[i]);
}
printf("n1-%d", *arr);
printf("n2-%dn", arr);
printf("3-%dn", arr[0]);

DesSort(arr);

for(i=0; i<7; i++)
{
printf(" %d ", arr[i]);
}
return 0;
}
void DesSort(int*pArr)
{
int i,j, temp;
for(j=0; j<6; j++)
{
for(i=0; i<6-j; i++)
{
if (pArr[i]<=pArr[i+1])
{
temp=pArr[i];
pArr[i]=pArr[i+1];
pArr[i+1]=temp;
}
}
}
}

c언어 변수variable 연산자 비트단위 연산자

변수선언
int a;
char b;
처럼 선언

1. c언어 변수의 이름은 알파벳,숫자,언더바 .... 곧 c언어도 한글변수명이 지원되지 않을까
2. 변수명이 대소문자 구분
3. 숫자로 시작할 수 없고 키워드 사용불가 키워드는 미리 정해진 함수 몇가지가 있다
4. 공백포함불가

연산자
= 대입
+ 더하기
- 빼기
* 곱하기
/ 나누기
% 나머지 출력

+=
-=
*=
/=
%=
이거 예
a=a+b; 이거랑 같은 뜻 a+=b;
나머지도 마찬가지

a++; //a를 보고나서 1 더하기
++a; //a에 1 더하고나서 보기
a--;
--a;

관계연산자
<
>
== 같다
!= 다르다
<=
>=

논리연산자
&& - and
|| - or
! - not

비트단위연산자
~  NOT 키보드 왼쪽위 1왼쪽에 있는넘
&  AND
^  XOR
|  OR 백스페이스 옆의 '\'와 함께 있는넘OR
<<  shift 연산 왼쪽으로 shift ( 0001101 을 <<하면 0011010 이 된다. 새로 생기는 칸은 0으로 채운다.
>>  shift 연산 오른쪽으로 shift

,(콤마)도 연산자라는듯... 별필요없을래나
연산자 우선순위도 있지만... 쓰다보면 알 수 있을래나

연산자의 우선순위 (특히 sizeof 주의), 결합성

1 (), [], ->, . (쩜,마침표다)
2
sizeof, &, ++, ==,
~, !, *(간접 지정 연산자), +(단항 연산자), -(단항 연산자)

3 *(곱셈 연산자, /, %
4
+(이항 연산자), -(이항 연산자)
5 <<, >>
6 <, <=, >=,
>
7 ==, !=
8 &
9 ^
10 |
11&&
12||
13?:
(삼항 연산자)
14=, +=, *=, /=, %=, &=, ^=, !=, <<=, >>=
15,
(콤마 연산자)


1. 최상위 연산자

::
=> C++의 영역접근 및 클래스 분해(resolution)

[] =>
배열첨자(subscripting)

-> => C++의 간접 멤버 연산자

() => 함수 호출 연산자

. => C++의 직접 멤버
연산자

2. 단항 연산자 (Unery)

! => 논리부정(NOT)

~ => 보수('s) 연산자

+ => 양수(Unary plus)

- =>
음수(Unary minus)

++ => 전치 및 후치 증가 연산자

-- => 전치 및 후치 감소 연산자

& =>
주소(Address)

* => 간접(Indirection) 연산자

sizeof => (return size of operand, in byte)

new => C++의 동적(dynamically) 메모리 할당

delete
=> C++의 동적(dynamically) 메모리 제거

3.
산술연산자

* => 곱셈(Multiply)

/ => 나눗셈(Divide)

% =>
나머지(Remainder)


4. 멤버 접근

.* => C++의
클래스 멤버 비 참조 연산자

->* => C++의 클래스 멤버 비 참조 연산자

5. 산술 연산자 (Additive)

+ =>
가산(Binary plus)

- => 감산(Binary minus)

6.
이동(Shirt)

<< => 좌측이동(Shift left)

>> => 우측이동(Shift right)

7. 관계
연산자 (Relational)

< => 적음(Less than)

<= => 적거나 같음(Less than or equal to)

> => 크다(Greater than)

>= =>
크거나 같음(Greater than or equal to)


8. 등가 연산자 (Equality)

==
=> 같음(Equal to)

!= => 같지 않음((Not equal to)

9.
비트 연산자

& => 비트곱(Bitwise AND)

10. 비트 연산자

^ => 비트차(Bitwise XOR)


11.
논리연산자

| => 비트합(Bitwise OR)


12. 논리연산자

&& =>
논리곱(Logical AND)


13. 논리연산자

|| => 논리합(Logical OR)


14. 삼항
연산자 (Conditional)

?: => (a ? x:y , means "if a then x,
else y" )


15.
치환 연산자 (Assignment)
= *= /= %= +==

(Assignment) |
-== &= ^= |= <<= >==


16. 콤마연산자

,(Comma) => 선택
연산자(Evaluate)

sizeof는 연산자이다.
sizeof는 2순위다.

합성 : 덧셈은 왼쪽에서 오른쪽으로 계산을 한다. 예를들어.... 3+5+6 이면 왼쪽에서 오른쪽으로...
sizeof나
&, ++는 오른쪽에서 왼쪽으로 계산한다.

괄호가 가장 연산순위가 높기 때문에 괄호로 묶어서 처리하면 다 된다.

[지
식인서 일부 펌..]

c언어 기본 자료형, 접미사, 상수const

































 



Bit


Byte


범위


문자형


char


unsigned char


8


8


1


1


-128 ~ 127


0 ~ 255


열거형


enum


16


2


-32768 ~ 32767


정수형


short


unsigned short


long


unsigned long


16


16


32


32


2


2


4


4


-32768 ~ 32767


0 ~ 65535


-2147483648 ∼ 2147483647


0 ∼ 4294967295


부동형


float


double


long double


32


64


80


4


8


10


±3.4e-38∼±3.4e+38


±1.7e-308∼±1.7e+308


±3.4e-4916∼±1.1e+4932


이 값이 절대적이지는 않다.

자료형을 선택 할 때는 숫자가 범위를 초과하지 않도록 선택


























 접미사 자료형 사용예
u, U  unsigned int  111U
l,  L long 111L
ul,  UL unsigned long 111UL
f,  F float 1.115F
l,  L long double 1.11L

float f = 3.14; //에러 3.14는 double형이라 데이터가 손실된다.
float = 3.14f; //통과

상수형 선언
const
const double PI = 3.14;
상수형선언은 이런식으로 표현한다.
상수는 대문자 이름을 짓는게 전통이라고 한다. 변수하고 안헷갈리게

자료형 변환 , 자동 형 변환, 강제 형 변환(명시적 형 변환)

대입연산시 발생하는 자동 형 변환

char a = 323223
int b = 2.34234
double c
= 5

자료형 자신보다 큰 용량을 이렇게 집어넣으면 소수부 손실이 발생한다.
char에서는 상위 비트를
잃게된다.

int a = 1;
int b = 2;
float f = a/b;

인 경우 나눗셈
결과는 0.00000
0.5인 경우 소수부 손실이 발생하기 때문에 '='연산을 하기 전에 이미 .5를 잃게된다.


럴 때
float f = (float) a/b;
로 고쳐쓰면... .5를 잃지 않게된다.


이렇게 되냐... 논리적으로 설명해라.. 이렇게 하는게 더 낫지 않냐 라고 다른 방법을 제시해도.... 별수없다.
만든사람이
이런 논리로 만든거니까 그 사람의 논리를 받아들이던지... 외우자.

printf, scanf 서식문자.

쓰다보면 외워진다. 모르는 부분은 검색

printf 특수문자

/a 경고음
/b 백스페이스
/f
폼 피드
/n 개행
/r 캐리지 리턴
/t 수평 탭
/v 수직 탭
// 백슬래시
/' 작은
따옴표
/" 큰 따옴표

printf 서식문자

%c  단일문자
%d  부호있는 10진정수
%i  %d
와같음
%d  부호있는 10진실수
%s  문자열
%o  부호없는 8진정수
%u  부호없는 10진정수
%x  부
호없는 16진정수, 소문자
%X  부호없는 16진정소, 대문자
%e  e 표기법에 의한 실수 // 3.1215e+2
> 312.45
%E  E 표기법에 의한 실수  // 3.1215E+2 > 312.45
%g  값에 따라서
%f, %e 둘중 선택
%G  값에 따라서 %f, %e 둘중 선택
%%  %기호 출력

d1 =
1.23e-3  %g로 출력하면 0.00123  //원래 숫자 0.00123
d2 = 1.23e-4  %G로 출력하면
0.000123  //원래 숫자 0.000123
d3 = 1.23e-5  %g로 출력하면 1.23e-005  //원래 숫자
0.0000123
d4 = 1.23e-6  %G로 출력하면 1.23E-006  //원래 숫자 0.00000123

printf
필드폭 정렬

%8f  필드 폭을 8칸 확보하고 오른쪽 정렬
%-8d  필드 폭을 8칸 확보하고 왼쪽 정렬
%+8d  필
드 폭을 8칸 확보하고 오른쪽 정렬상태에서 양수는 + 음수는 - 붙여서 출력

scanf 서식문자

%d  정
수입력
%o  8진수정수입력
%x  16진수정수입력
%f  float형 변수저장시 사용
%le  double
형 변수저장시 사용

반복문 for, while, do ~ while

while ( i<10 ) //i가 10보다 작은동안은 반복
{

}

while(1)
//무한반복- 보통 break; 를 사용해서 탈출
{
}

do
{
  먼저 이걸 하고
}while(i<10)
//i가 10보다 작으면 다시 반복

for (i=0 ; i<10 ; i++)
{

}

본적인 for의 형태... (i를 초기화하고 ; i가 10보다 작으면 반복 ; 반복이한번 끝날 때마다 i에 1을더함)


든 반복은 중첩이 가능... 적절히 사용~

for( ; i<10 ; )
로 사용하면 while과 똑같이
사용가능

조건문, 흐름의 분기, if else, switch, goto

if ~ else
만약 ~ 아니면

if (i<10) //만약 i가 10보다 작으면 괄호안에 있는걸 한다
{

}
else
//아니면 이걸한다.
{

}

if (i<10)
{
}
else if
(10=<i, i<20)
{
}
else
{
}

if else도 중첩 가능

if
(opt==1)
{}
if (opt==2)
{}
if (opt==3)
{}
opt의 값을
1,2,3으로 선택하게 해놓고 선택하면 if사이의 값을 실행하는식으로.....
int n;
scanf ("%d",
&n);
switch(n) //n값에 따라 1,2가 들어오면 그 case가, 그 이외의 숫자가 들어오면
default가 선택...
{
case 1:
    printf("ddddddddd");
   
break;
case2:
   printf("sfassdaffsfsd");
   break;
default:
  
printf("다시선택하세요\n");
}

goto..잘 안쓴다.

rabbit; //라벨...
........
.......
....
goto
rabbit;
///rabbit이라고 써 있는 라인으로 이동