제 3 강.

Slides:



Advertisements
Similar presentations
스택 스택 추상자료형 스택 스택의 구현 스택의 응용 한빛미디어(주).
Advertisements

제 2 장 : 배열과 구조 이 형 원 강릉대학교 컴퓨터공학과
배열과 ADT(1/2) 연속된 메모리 위치의 집합 <index, value>쌍의 집합
Chapter 2 배열과 구조 (Arrays and Structures)
제6장 조건문.
제 3 장 변수와 자료형.
슬라이드 1~21까지는 각자 복습! 슬라이드 22부터는 수업시간에 복습
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express.
희소 행렬(sparse matrix) mn matrix A ≡ A[MAX_ROWS][MAX_COLS] 희소행렬
Report #5 - due: 4/13 다음 10*5의 희소 행렬 A, B를 고려하라.
제2장 배열과구조.
제2장 배열과구조.
5 순차 자료구조 방식.
Chapter 7. 조건문.
C로 쉽게 풀어쓴 자료구조 © Copyright 생능출판사 2011
Report #2 - Solution 문제 #1: 다음과 같이 프로그램을 작성하라.
배열과 ADT(1/2) 연속된 메모리 위치의 집합 <index, value>쌍의 집합
C 11장. 포인터의 활용 #include <stdio.h> int main(void) { int num;
쉽게 풀어쓴 C언어 Express 제17장 동적 메모리와 연결 리스트 C Express.
자료 구조: Chapter 3 배열(1) 순천향대학교 컴퓨터공학과 하 상 호.
자료 구조: Chapter 3 배열(1) 순천향대학교 컴퓨터공학과 하 상 호.
쉽게 풀어쓴 C언어 Express 제4장 변수와 자료형 C Express.
제5장 제어명령
C언어: 배열 (Arrays).
6장. printf와 scanf 함수에 대한 고찰
누구나 즐기는 C언어 콘서트 제4장 수식과 연산자.
7. while 문의 흐름 제어.
쉽게 풀어쓴 C언어 Express 제17장 동적 메모리와 연결 리스트 C Express.
쉽게 풀어쓴 C언어 Express 제17장 동적메모리와 연결리스트 C Express.
동적메모리와 연결리스트 컴퓨터시뮬레이션학과 2016년 봄학기 담당교수 : 이형원 E304호,
제3장 스택과 큐.
P150 문제를 프로그래밍 할 것 Source file (헤더파일포함), 실행화면 (학번_이름_1.txt)
10장 포인터와 문자열 포인터 기본 배열과 포인터 매개변수 전달방법 포인터와 문자열.
8장 함수 함수의 필요성 라이브러리 함수와 사용자 정의 함수 함수의 정의, 원형, 호출 배열을 함수 인자로 전달 재귀호출.
쉽게 풀어쓴 C언어 Express 제14장 포인터 활용 C Express.
C언어 프로그래밍의 이해 Ch05. 명령문 Phylogenetic: 계통, 발생(학)의.
프로그래밍 랩 – 7주 리스트.
제 3 장 상수와 변수
쉽게 풀어쓴 C언어 Express 제7장 반복문 C Express.
쉽게 풀어쓴 C언어 Express 제4장 변수와 자료형 C Express.
4장 제어문 선택문: if 문, if – else 문, switch 문
어서와 C언어는 처음이지 제14장.
컴퓨터의 기초 제 2강 - 변수와 자료형 , 연산자 2006년 3월 27일.
Report #3 - due: 4/6 100*100의 2개의 희소 행렬 A, B를 전달 받아서 이들의 덧셈을 구하고, 그 결과의 행렬 C를 반환하는 add_sparse_matrix(A, B, C)를 다음과 같이 작성하라. 희소 행렬은 sparse_matrix 타입으로 표현된다.
자전거를 배우려면 안장에 올라가 페달을 밟아라.
컴퓨터 프로그래밍 기초 - 4th : 수식과 연산자 -
제어문 & 반복문 C스터디 2주차.
자료구조: CHAP 4 리스트 (2) 순천향대학교 컴퓨터공학과 하 상 호.
선택 정렬 #define SWAP(x, y, t) {(t) = (x); (x) = (y); (y) = (t);}
제 1 강.
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
김선균 컴퓨터 프로그래밍 기초 - 7th : 함수 - 김선균
실습과제 1(조건문, ) 표준입력으로 수축기 혈압을 입력 받아 그에 따른 적당한 표현을 화면에 출력하는 프로그램을 if-else 문을 이용하여 작성.
Fflush 사용이유 및 방법 [이유] 키보드에서 입력된 내용은 입력버퍼에 저장되었다가 Enter 키가 들어오면 프로그램으로 전달됨 이 때 입력버퍼에 있는 Enter 키도 프로그램으로 전달됨 그러므로 아래와 같은 프로그램에서 문자 하나를 입력해도 Enter키도 입력된 것으로.
6장 반복제어문 for 문 while 문 do while 문 기타 제어문.
C언어 프로그래밍의 이해 Ch05. 명령문.
-Part1- 제7장 반복문이란 무엇인가.
-Part1- 제8장 조건문이란 무엇인가 (교재 199페이지 ~ 224페이지)
쉽게 풀어쓴 C언어 Express 제6장 조건문 C Express Slide 1 (of 28)
토론을 위한 질문 배열의 이름에는 무엇이 저장되는가? C언어에서 배열 추상데이터의 store는 어떻게 구현 되는가?
쉽게 풀어쓴 C언어 Express 제6장 조건문 C Express.
반복문의 기능 반복문 반복문 특정 영역을 특정 조건이 만족하는 동안에 반복 실행하기 위한 문장 while문
9장. C 언어의 핵심! 함수. 9장. C 언어의 핵심! 함수 9-1 함수의 정의와 선언 main 함수 다시 보기 : 함수의 기본 형태 { } 그림 9-1.
어서와 C언어는 처음이지 제16장.
printf("Global Korea\n");
어서와 C언어는 처음이지 제22장.
배열, 포인터, 함수 Review & 과제 1, 2.
프로그래밍 기법 최적화 프로그래밍.
2019 2학기 9장 배열과 포인터 1. 주소, 주소연산자(&) 2. 포인터, 역참조연산자(*) 3. 배열과 포인터.
Presentation transcript:

제 3 강

두 다항식의 덧셈 알고리즘 polyAdd(p1, p2) p3←zeroP();    while (not isZeroP(p1) and not isZeroP(p2)) do {         case {            maxExp(p1) < maxExp(p2) :               p3←addTerm(p3, coef(p2, maxExp(p2)), maxExp(p2));               p2 ←delTerm(p2, maxExp(p2));            maxExp(p1) = maxExp(p2) :                sum←coef(p1, maxExp(p1))+ coef(p2, maxExp(p2));                if (sum≠0) then p3 ← addTerm(p3, sum, maxExp(p1));                p1 ← delTerm(p1, maxExp(p1));                p2 ← delTerm(p2, maxExp(p2)); maxExp(p1) > maxExp(p2) :             p3←addTerm(p3, coef(p1, maxExp(p1)), maxExp(p1));                p1 ← delTerm(p1, maxExp(p1));       } }    if (not isZeroP(p1)) then p1의 나머지 항들을 p3에 복사    else if (not isZeroP(p2)) then p2의 나머지 항들을 p3에 복사;    return p3; end polyAdd()

#include <stdio.h> #define SIZE 32 // p의 배열 개수 설정 typedef struct{ int exp; //지수 int coef; //계수 }poly; int count; //항 개수 카운트 poly p[SIZE]; // poly형 타입의 배열 } polys; void main() { polys p1; polys p2; polys p3; p1.count = 0; p2.count = 0; int a,b; exp coef count exp coef

printf("P1의 항(계수, 지수)을 입력하세요. (0 0 이면 입력종료)\n"); while (1) { scanf("%d %d",&a,&b); if (a==0 && b==0) break; addTerm(&p1,a,b); } printf("P1 다항식 : "); printPolys(&p1); printf("\n"); printf("P2의 항(계수, 지수)을 입력\n"); while (1){ addTerm(&p2,a,b);} printf("P2 다항식 : "); printPolys(&p2); printf("P3 다항식(P1+P2) : "); p3 = polyAdd(&p1,&p2); printPolys(&p3); }

int isZeroP(polys* ps) //남은 항이 있는지 확인 { int result=0; //항이 있을경우 0 (flase) if (ps->count==0) { result=1; //항이 없을경우 1 (true) } return result; int coef(polys* ps, int e) //e와 같은 계수 int result = 0; //e와 같은 계수가 없으면 "0" for (int i=0; i<ps->count; i++) // e와 같은 계수가 있으면 "해당 계수" 리턴 if (ps->p[i].exp == e){ result = ps->p[i].coef; break;

int maxExp(polys* ps) //지수가 가장 큰 항의 지수 { int result = ps->p[0].exp; //첫번째 번지에 있는 지수를 기본값으로 주고 for (int i=0; i<ps->count; i++) //각 항의 지수비교해서 "최고 지수"를 리턴 if (ps->p[i].exp > result) result = ps->p[i].exp; } return result; void addTerm(polys* ps, int coef, int exp) //항을 추가 ps->p[ps->count].exp = exp; ps->p[ps->count].coef = coef; ps->count++; p1 ps count exp coef

void delTerm(polys* ps, int e) //항을 제거 { int i; int flag = 0; if (isZeroP(ps)) return; for (i=0;i<ps->count;i++) { if (ps->p[i].exp == e) flag = 1; if (flag) ps->p[i] = ps->p[i+1]; } ps->count--; } char compare(int a, int b) // 지수 비교 // a와 b를 비교하여 =, <, > 리턴 if (a == b) return '='; else if (a < b) return '<'; else return '>'; }

polys polyAdd(polys* p1, polys* p2) { // p3다항식 = p1다항식 + p2다항식 p3.count = 0; int sum; while(!isZeroP(p1) && !isZeroP(p2)) { //p1,p2에 다항식이 있을경우 switch (compare(maxExp(p1), maxExp(p2))) { //최고지수 비교 case '<' : //p1의 지수가 p2의 지수보다 작으면 addTerm(&p3,coef(p2,maxExp(p2)),maxExp(p2)); delTerm(p2,maxExp(p2)); break; case '=' : //p1,p2의 지수가 같으면 sum = coef(p1,maxExp(p1)) + coef(p2,maxExp(p2)); if (sum != 0) addTerm(&p3,sum,maxExp(p1)); delTerm(p1,maxExp(p1)); case '>' : //p1의 지수가 p2 지수보다 크면 addTerm(&p3,coef(p1,maxExp(p1)),maxExp(p1)); break; } }

while(!isZeroP(p1)) { // p1의 나머지 항들을 p3로 복사 addTerm(&p3,coef(p1,maxExp(p1)),maxExp(p1)); delTerm(p1,maxExp(p1)); } while(!isZeroP(p2)) { // p2의 나머지 항들을 p3로 복사 addTerm(&p3,coef(p2,maxExp(p2)),maxExp(p2)); delTerm(p2,maxExp(p2)); return p3;

void printPolys(polys* ps) { //다항식 출력 int i; for (i=0;i<ps->count;i++) { if (ps->p[i].coef == 0){ printf(""); //계수 0이면 표시 안함 }else if (ps->p[i].exp == 1){ printf("%d",ps->p[i].coef); //지수가 1이면 계수만 표시 }else{ printf("%dx^%d",ps->p[i].coef,ps->p[i].exp); printf(" + "); //지수가 0이 아니면 계수x^지수 형태로 출력 } printf("\n");

제 4 강

희소 행렬 전치 알고리즘 transposeS(a[]) m ← a[0, 0]; // a의 행 수    n ← a[0, 1];           // a[]의 열수    t ← a[0, 2];           // a[]의 0이 아닌 원소 수       b[0, 0] ← n;           // b[]의 행 수 ← a[]의 열 수     b[0, 1] ← m;          // b[]의 열 수 ← a[]의 행 수    b[0, 2] ← t;           // b[]의 0이 아닌 원소 수    if (t > 0) then {      p ← 1;               // b[]에 대해 현재 행의 위치를 지시      for (p ← 0; p < n; p ← p+1) do { // a[]의 열 별로 처리         for (i ← 1; i <= t; i ← i+1) do { // 0이 아닌 원소 수에 대해            if a[i, 1] = p then {  // 열 p의 원소 발견              b[p, 0] ← a[i, 1];              b[p, 1] ← a[i, 0];              b[p, 2] ← a[i, 2];              p ← p+1;            } } } }     return b[]; end transposeS()

#include <stdio.h> #define MAX_COL 101 typedef struct triple{ int row; int col; int value; } triple; void main() { int i; triple x[MAX_COL], y[MAX_COL]; x[0].row = 5; x[0].col = 5; x[0].value = 5; x[1].row = 0; x[1].col = 0; x[1].value = 43; x[2].row = 0; x[2].col = 4; x[2].value = 11; x[3].row = 2; x[3].col = 2; x[3].value = 8; x[4].row = 3; x[4].col = 1; x[4].value = -27; x[5].row = 4; x[5].col = 0; x[5].value = 30; transpose( x, y ); for( i=0; i<6; i++) printf("x = %d %d %d \n", x[i].row, x[i].col, x[i].value); }

void transpose(triple a[], triple b[]) { int m, n, t, i, j, p; m = a[0].row; n = a[0].col; t = a[0].value; b[0].row = n; b[0].col = m; b[0].value = t; if (t > 0) { p = 1; for (i = 0; i < n; i++) for (j = 1; j <= t; j++) if (a[j].col == i) { b[p].row = a[j].col; b[p].col = a[j].row; b[p].value = a[j].value; p++; } 행 열 값 행 열 값 a[0] 5 4 5 b[0] 4 5 5 [1] 0 0 43 [1] 0 0 43 [2] 0 3 11 [2] 0 4 30 [3] 2 2 8 [3] 1 3 -27 [4] 3 1 -27 [4] 2 2 8 [5] 4 0 30 [5] 3 0 11

void transpose(triple a[], triple b[]) { if (t > 0) { for (i = 0; i < n; i++) row_triples[i] = 0; for (i = 1; i <= t; i++) row_triples[a[i].col]++; start_pos[0] = 1; for (i = 1; i < n; i++) start_pos[i] = start_pos[i-1] + row_triples[i-1]; for (i = 1; i <= t; i++) { j = start_pos[a[i].col]++; b[j].row = a[i].col; b[j].col = a[i].row; b[j].value = a[i].value; } } 행 열 값 행 열 값 a[0] 5 4 5 b[0] 4 5 5 [1] 0 0 43 [1] 0 0 43 [2] 0 3 11 [2] 0 4 30 [3] 2 2 8 [3] 1 3 -27 [4] 3 1 -27 [4] 2 2 8 [5] 4 0 30 [5] 3 0 11 row: row_triples[]= start_pos[]= [0] [1] [2] [3] 2 1 3 4 5