c언어로 희소행렬의 행 바꾸기 및 출력 구현

c언어로 희소행렬의 행 바꾸기 및 출력 구현



안녕하세요
이번에 작성한 코드는 희소행렬에 관한 것인데요
우선 희소행렬이란 기존의 우리가 표현 했던 것처럼
[1, 0 ,0,
 0, 3, 0,
 0, 6, 0]
과 같이 행렬이 존재한다면

{1, 0, 0, 0, 3, 0, 0, 6, 0}과 같이 행렬을 표현하지 않고
{{1,1},1, {2,2},3, {3,2},6}과 같이 원소가 0이 아닌 원소만 표현하는 행렬을 뜻합니다.
(각 항목은 {row, column}, value를 뜻함)

행렬의 크기가 매우 커져 원소의 양보다 0의 양이 더 많아지게 된다면
0이 아닌 수만 표현함으로써 공간 절약을 할수있겠죠?
단점으로는 기본적인 덧셈만 하더라도 구현이 기존의 행렬보다 복잡해진다는
단점이있습니다.

우선 아래의 코드는 간단히 행 바꾸기와 출력을 구현한 코드입니다.
피드백 부탁드립니다.


#include<stdio.h>

#define MAX_TERMS 10

typedef struct {
int row;
int col;
int value;
}element;

typedef struct SparseMatrix {
element data[MAX_TERMS];
int rows;
int cols;
int terms;
}SparseMatrix;

SparseMatrix SMchange(SparseMatrix m, int i, int j);
void SMprint(SparseMatrix m);

int main() {
SparseMatrix m = { {{1,1,3}, {1,2,9}, {2,2,4}}, 3,3,3 };
printf("변경 전\n");
SMprint(m);
m = SMchange(m, 0, 2);
printf("변경 후\n");
SMprint(m);

}

SparseMatrix SMchange(SparseMatrix m, int i, int j) {
for (int cur = 0; cur < m.terms; cur++) {
if (m.data[cur].row == i) m.data[cur].row = j;
else if (m.data[cur].row == j) m.data[cur].row = i;
}

element e_tmp;
char sortFlag = 0;
while(true) {
if (sortFlag == 1) sortFlag = 0;

for (int j = 0; j < m.terms - 1; j++) {
if (m.data[j].row > m.data[j + 1].row) {
e_tmp = m.data[j];
m.data[j] = m.data[j + 1];
m.data[j + 1] = e_tmp;
sortFlag = 1;
break;
}
}

if (sortFlag == 0) break;
}

return m;
}

void SMprint(SparseMatrix m) {
printf("{ ");
for (int cur = 0; cur < m.terms; cur++) {
printf("( (%d, %d), %d )", m.data[cur].row, m.data[cur].col, m.data[cur].value);
if (cur != m.terms - 1) printf(", ");
}
printf(" }\n");

}

c언어로 다항식 eval, 가장 큰 차수 제거 구현

c언어로 다항식 eval, 가장 큰 차수 제거 구현



안녕하세요
이번 코드 역시 학교 과제로 나왔던 문제인데요
피드백 부탁드립니다

#include <stdio.h>
#include <math.h>
#define MAX_DEGREE 20
#define MAX(a,b) (((a)>(b))?(a):(b))


typedef struct {
 int degree;
 float coef[MAX_DEGREE];
}polynomial;

void Eval(polynomial, double);
polynomial SubtractLO(polynomial A);

int main() {
 //문제 2-1
 polynomial p = { 5, {10, 0, 0, 0, 6, 1} };
 Eval(p, 2);

 //문제 2-2
 p = SubtractLO(p);
 Eval(p, 2);

 polynomial p2 = { 5, {5, 0, 0, 4, 0, 2} };
 p2 = SubtractLO(p2);
 Eval(p2, 2);

 polynomial p3 = { 4, {4, 0, 0, 0, 0} };
 p3 = SubtractLO(p3);
 Eval(p3, 3);
}

void Eval(polynomial A, double num) {
 //문제 2-1
 double result;

 result = 0.0;

 for (int i = 0; i <= A.degree; i++)
  result += A.coef[i] * pow(num, A.degree-i);

 printf("result = %lf\n", result);
}

polynomial SubtractLO(polynomial A) {
 //가장 큰 차수를 제거한다.
 for(int i = 0; i<=A.degree; i++)
  if (A.coef[i] != 0) {
   A.coef[i] = 0;
   break;
  }

 //다항식에서 최고차항 계수가 0이 아니게끔 조정하고
 //변동이 있을 시에는 degree 값을 바꿔준다.
 int notZeroIdx = 0;
 char flag = 0;

 for (int i = 0; i <= A.degree; i++) {
  if (A.coef[i] == 0 && flag == 0) notZeroIdx++;
  else {
   flag = 1;
   A.coef[i - notZeroIdx] = A.coef[i];
  }
 }
 A.degree -= notZeroIdx;

 return A;
}

구조체를 이용하여 학번 및 성적 저장

구조체를 이용하여 학번 및 성적 저장




안녕하세요
본 예시는 학교에서 과제로 나온 것인데요.
간단히 작성해보았습니다.
코드 중에 이해가 안가거나,
더 나은 방법으로 구현이 가능하다면 마음껏 적어주시기 바랍니다.

#include <iostream>
#include <stdio.h>
#define square(x) (x)*(x)

using namespace std;

typedef struct student {
int id;
double eng;
double math;
}student;

double avgScore(student *p_tempStudent, int length)
{
double result;
double allSum = 0;
int i;

for (i = 0; i < length; i++)
allSum += (p_tempStudent + i) -> eng;


result = allSum / length;
return result;
}

double myPb(student *p_tempStudent, int length)
{
double inner, result, avg;

avg = avgScore(p_tempStudent, length);

for(int i = 0; i < length; i++)
inner = square(((p_tempStudent + i)->eng) - avg);

result = sqrt(inner / (length - 1));

return result;
}

void getRank(int myId, student *myStud)
{
int engRank = 1, mathRank = 1, cur = 0;
double myEng, myMath;

//학번에 해당하는 위치를 찾아낸다.
//본인의 영어 수학, 수학 점수를 저장한다.
while (cur != 10)
{
if (myStud[cur].id == myId)
{
myEng = myStud[cur].eng;
myMath = myStud[cur].math;
break;
}
cur++;
}

if (cur == 10)
{
printf("해당 학번에 존재하는 자료가 없습니다.\n");
return;
}
//학생 구조체 배열의 처음부터 끝까지 돌며, 자신보다 입력된 점수보다 높을 경우
//1씩 더해준다.
for (cur = 0; cur < 10; cur++)
{
if (myStud[cur].eng > myEng)
engRank++;
if (myStud[cur].math > myMath)
mathRank++;
}

printf("영어 성적 : %d\n수학 성적 : %d\n", engRank, mathRank);
}

int main() {
student myStudent[10] =
{
1234, 78, 87,
1235, 65, 55,
1365, 88, 95,
2546, 45, 56,
3124, 58, 88,
1976, 71, 54,
1657, 32, 55,
2547, 90, 43,
2456, 66, 78,
1765, 54, 99
};

cout << avgScore(myStudent, sizeof(myStudent) / sizeof(myStudent[0])) << endl;
cout << myPb(myStudent, 10) << endl;
getRank(1234, myStudent);
getRank(9999, myStudent);
}

Hello My Blog!

이 블로그는 제가 공부하는 내용들을 요약해서 올리는 목적으로 제작되었습니다.

오로지 제 지식을 정리하기 위한 공간이지만

다른 사람들에게도 도움이 된다면 더 좋을 것 같습니다.

감사합니다.

c언어로 희소행렬의 행 바꾸기 및 출력 구현

c언어로 희소행렬의 행 바꾸기 및 출력 구현 안녕하세요 이번에 작성한 코드는 희소행렬에 관한 것인데요 우선 희소행렬이란 기존의 우리가 표현 했던 것처럼 [1, 0 ,0,  0, 3, 0,  0, 6, 0] 과 같이 행렬이 존재한다...