FC2ブログ
07«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.»09

プロフィール

演奏会告知

最近の記事

最近のコメント

最近のトラックバック

月別アーカイブ

カテゴリー

FC2カウンター

もりログ

名古屋から送る、大学生の生活記録

プログラミング特別課題2

2008.11.06/Thu/23:44:38

プログラミング特別課題の続きです。

2日かかって、ついに今日完成しました顔13
昨日のプログラミングの授業で、8割くらい完成してたんですが、ちょっとてこずったので、残りの2割を今日やりました。
結局if文はほとんど使わず、配列でなんとかしました。
配列に頼りすぎたかもしれないです。それと関数の使い方がちょっとおかしい。
詳しくは追記のソースコードで。

プログラミングメモ

メモ。すごく汚いです汗

プログラミングだけじゃなく、音楽の勉強にもなりました。よかったよかった。
特別課題の担当教官こと竹田先生から、かわいい応援メールを貰ったり、感心されたりで嬉しかったです喜
笑
/* 調号の数から調を求め、出力するプログラム */

#include <stdio.h>

void get_sign(void);
void get_scale(int key, int scale, int dm);
void get_key(int key, int scale);

//音名の配列。1つ目が#用、2つ目が♭用
char sign[2][12][10] = {
{"C ", "G ", "D ", "A ", "E ", "B ", "F#", "C#", "G#", "D#", "A#", "F "},
{"C ", "G ", "D ", "A ", "E ", "B ", "G♭", "D♭", "A♭", "E♭", "B♭", "F "}
};

int main(void){

//タイトル表示
printf("\n+----------------------------------\n");
printf("| 調号の種類と数から調を求めます\n");
printf("+----------------------------------\n\n");

//get_sign関数に任せる
get_sign();

return 0;
}

//調号の種類と数から、調と音階を出力する関数
void get_sign(void){

int key = 0, num = -1, scale_d, scale_m, i;

//調号の種類と数を入力
do{
printf("#:1 ♭:2\n");
printf("調号の種類を数字で入力してください: ");
scanf("%d", &key);
}while((key != 1) && (key != 2));

do{
printf("調号の数を入力してください: ");
scanf("%d", &num);
}while((num < 0) || (num > 8));

//#を0に、♭を1に対応させる
key = key - 1;

//長調 #なら調号の数を正、♭なら負にして、12の剰余を求める
scale_d = (num * (1 - key * 2) + 12) % 12;
//短調 長調の値に3を加えて、改めて剰余を求める
scale_m = (scale_d + 3) % 12;

//結果を表示
printf("\n------");
if(key == 0)
printf("#");
if(key == 1)
printf("♭");
printf("が%d個の調-------------------------------\n\n", num);

printf("長調: ");
//get_keyで音名出力
get_key(key, scale_d);
printf("dur\n");
printf("音階    : ");
//get_scaleで音階出力
get_scale(key, scale_d, 0);
printf("\n\n");

printf("短調: ");
//get_keyで音名出力
get_key(key,scale_m);
printf("moll\n");
printf("音階");
//自然、和声、旋律をそれぞれ出力
printf("\n自然的短音階: ");
get_scale(key, scale_m, 1);
printf("\n和声的短音階: ");
get_scale(key, scale_m, 2);
printf("\n旋律的短音階: ");
get_scale(key, scale_m, 3);
printf("\n\n------------------------------------------------\n");
}

//基本音階を出力する関数
//keyで調号#:0、♭:1を区別 scaleで基準の音を取得
//dmで長調:0、自然:1、和声:2、旋律:3を区別
void get_scale(int key, int scale, int dm){

int i;

//signの配列を飛ぶ数 dmの値と対応
int jump[4][7] = {
{2,2,7,2,2,2,7}, //長調
{2,7,2,2,7,2,2}, //自然的短音階
{2,7,2,2,7,9,7}, //和声的短音階
{2,7,2,2,2,2,7} //旋律的短音階
};

for(i = 0; i < 7; i++){
//get_keyで音名を出力
get_key(key, scale);
printf(" ");
scale = (scale + jump[dm][i % 7]) % 12;
}

}

//音名を出力する関数
//keyで調合#:0、♭:1を区別 scaleで出力する音を取得
void get_key(int key, int scale){

int i;

for(i = 0; sign[key][scale][i]; i++)
printf("%c", sign[key][scale][i]);

}
スポンサーサイト



カテゴリ: オーケストラ
tb: 0 |  cm: 2
go page top

 

この記事に対するコメント

プログラミングすごいよ!!!!
まだC言語勉強し始めたばかりとは思えないよ☆
配列の使い方がよく考え付いたなーと!驚きました!
やーるっ!!電情!!
URL | risa #-
2008/11/12 00:20 * 編集 *

いや、なんかところどころ汚い気がします。
でもありがとうございます笑
URL | MORIZO #-
2008/11/13 20:49 * 編集 *
go page top

 

コメントの投稿















管理者にだけ表示を許可する

go page top

 

トラックバック

トラックバックURL
→http://waldzo.blog19.fc2.com/tb.php/267-24c756bf
この記事にトラックバックする(FC2ブログユーザー)
go page top