• ベストアンサー

モールス信号をLEDで光らせるプログラムです

AsarKingChangの回答

回答No.1

>使用する関数は、void dit()、void dah()、void br()、void morse(char ch)です。 この関数の中身がわからないので、何とも言えないのですが。 void morse(char ch) こいつが恐らく受け関数でしょうね。 問題はこいつ・・・ void dit()、void dah()、void br() ditとdahのどっちが、長と短なのか、わからないですよね。。 brがブランキングの意味なら、各caseの最後に入れればOKでしょう。 なので、 void morse(char ch) { switch(ch) { case 'A':dit();dah();br(); break; case 'B':dah();dit();dit();dit();br(); break; case 'O':dah();dah();dah();br(); break; case 'S':dit();dit();dit();br(); break; case 'T':dah();br(); break; default:/*何もしない*/ break; } ditとdahが逆なら、入れ替えてください。 大雑把、こんな感じじゃないですか?

omae_sutekiyan
質問者

お礼

回答ありがとうございます。ditが短で、dahが長ですね...(説明不足でした、すみません...。) とても参考になりました。

関連するQ&A

  • 末尾にコピーするプログラム

    大学で 「main関数でキーボードからの2つの文字数を受け取り、関数を実装し仮引数に文字列s1、文字列s2をとり、s2をs1末尾にコピー(s1とs2を連結)するプログラミングを作成しなさい」 void cat(char *s1,char *s2) という問題がありました。以下、その回答を考えたのですがこれで大丈夫ですか? #include <stdio.h> void cat(char *s1, char *s2); void main(void); void cat(char *s1, char *s2) { while ((*s1++ = *s2++) != '\0') ; } void main(void) { char s1[100]; char s2[100]; printf("一つ目の文字列を入力してください。:",s1); scanf("%s",s1); printf("二つ目の文字列を入力してください。:",s2); scanf("%s",s2); cat(s1, s2); printf("コピー後: = %s\n", s2); }

  • 多桁 計算プログラム

    下のプログラムを (1)上位桁の不要な0を表示しない (2)3つの数を計算できるようにする (3)0が入力されるまでは入力を受け付けて加算を繰り返す プログラムに改造する方法を教えてください。 #include <stdio.h> #define MAXDIGIT 70 void reset(char*,int); void input(char*,int); void add(char*,char*,char*,int); void add_digit(char ,char ,char ,char* ,char* ); void display(char* ,char* ,char* ,int ); void lineprint(char ,char* ,int ); void linedraw(char ,int ); int main(void) { char a[MAXDIGIT],b[MAXDIGIT],c[MAXDIGIT]; reset(a,MAXDIGIT); reset(b,MAXDIGIT); reset(c,MAXDIGIT); input(a,MAXDIGIT); input(b,MAXDIGIT); add(a,b,c,MAXDIGIT); display(a,b,c,MAXDIGIT); return 0;} void reset(char* buf,int maxdigit) { int i; for(i=0;i<maxdigit;i++) buf[i]=0; return;} void input(char* buf,int maxdigit) { char str[MAXDIGIT]; int i,j; printf("input data:"); scanf("%s",str); i=0; while(str[i]!='\0') i++; j=0; while(i>0){ buf[j]=str[i-1]-'0'; j++; i--; } return;} void add(char* a,char* b,char* c,int maxdigit) { int i; char carry_in,carry_out; i=0; carry_in=0; while(i<maxdigit) { add_digit(a[i],b[i],carry_in,&c[i],&carry_out); carry_in=carry_out; i++;} return;} void add_digit(char a,char b,char carry_in,char* c,char* carry_out) { *c=(a+b+carry_in)%10; *carry_out=(a+b+carry_in)/10; return;} void display(char* a,char* b,char* c,int maxdigit) { lineprint(' ',a,maxdigit); lineprint('+',b,maxdigit); linedraw('-',maxdigit+1); lineprint(' ',c,maxdigit); return;} void lineprint(char c,char* line,int maxdigit) { int i,maxdigitlimit; maxdigitlimit=maxdigit-1; printf("%c",c); for(i=maxdigitlimit;i>=0;i--){ printf("%1d",line[i]); } printf("\n"); return;} void linedraw(char c,int length) { int i; for(i=0;i<length;i++) printf("%c",c); printf("\n"); return;}

  • プログラミング(配列と関数の引数)

    a : ABCDE a : ABCDEFGH Len : 8 a : FGHIJ a : FGH a : FGH, c : FGH 上記のように表示されるプログラムを作りたいのですが、なかなかできません。下記のようなプログラムを作ったのですがどこが間違っているのかよくわかりません。分かる方、指摘をお願いします。 #include <stdio.h> void my_strcpy(char s[], char t[]); int my_strlen(char s[]); void my_strcat(char s[], char t[]); int main(){ char a[10]; char b[10] = "ABCDE"; char c[] = "FGH"; int len; my_strcpy(a, b); printf("a : %s\n", a); my_strcat(a, c); printf("a : %s\n", a); len = my_strlen(a); printf("Len : %d\n", len); my_strcpy(a, "FGHIJ"); printf("a : %s\n", a); a[3] = '\0'; printf("a : %s\n", a); if(strcmp(a, c) == 0){ printf("a : %s, c : %s\n", a, c); } int i, s, t; my_strcpy(a, b + 2); printf("a : %s\n", a); void my_strcpy(char s[], char t[]){ for (i = 0; t[i] != '\0'; i++){ s[i] = t[i]; } s[i] = '\0'; } int my_strlen(char s[]){ int i; for (i = 0; s[i] != '\0'; i++); return i; } void my_strcat(char s[], char t[]){ int i, j; for (i = 0; s[i] != '\0'; i++); for (j = 0; t[j] != '\0'; i++, j++){ s[i] = t[j]; } s[i] = '\0'; } }

  • C++言語、国際符号翻訳プログラムについて

    こんにちは。現在、英文、もしくは英単語、英字を国際符号(モールス信号)に訳すプログラムを書いているのですが、もしユーザーが二つの英単語を入力し、その単語がスペースで離れている場合(例として、SOS SOSもしくはsos sos)、翻訳された単語のモールス信号の間にスペースを三つ、文字の間に一つづつスペースを入れたいのですが(sos sosであれば、... --- ...   ... --- ...)コツがつかめなくて困っています(文字の間に一つスペースを入れる事に成功はしたのですが...) C++言語で経験者の方、いらっしゃいましたら是非アドバイスを御願い致します。 これが自分が今まで書き上げたコードなのですが、 #include <iostream> #include <string> #include <cctype> using namespace std; string engtomol (string, string[]); int main () { char alpha[26] = {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'}; string morse[81] = {".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--.."}; string text, morsecode; char choice; char repeat='y'; cout << "Select 1 to decode Morse code to English text. Select 2 to decode English text to Morse code" << endl; cin >> choice; if (choice=='1') { cout << "NOTE. DO NOT INPUT A NON ENGLISH CHARACTER. THIS TRANSLATOR EXCLUSIVELY ONLY TRANSLATES ENGLISH ALPHABETS (CAPITALIZED AND NON CAPITALIZED) ONLY.\n"; cout << "Enter a text to translate, each word seperated by spaces if you want to translate more than one word:"; cin.get(); getline(cin,text); cout << "TEXT: " << text << endl; cout << "MORSE CODE: " << engtomol(text, morse) << endl; } else if (choice=='2') { cout << "lol"; } return 0; } string engtomol (string text, string morse[]) { int textlength = text.length(); string morsevalue; string spacesbtwletters= " "; string spacesbtwwords = " "; for (int k=0; k<textlength; k++) { if (text[k]!= ' ') //if the word(s) did not encounter a space { text[k]=toupper(text[k]); //upper case letters and lower case letters are the same hence have the same appropriate morse code. morsevalue=spacesbtwletters+=morse[text[k]-'A']+" ";//A is the first value of the array. by subtracting its finding the appropriate morse code for each letters } if (text[k]==' ') { morsevalue+spacesbtwwords; } } return morsevalue; } プログラムをコンパイルすると、(また例としてsos sosを入力したとします)。--- ... --- --- ... ---と、単語の間にスペースが一つしか表れません。どの様に変えたら、希望通りの結果が出ますか? よろしく御願い致します。

  • このプログラムの復元処理教えでください。助けてくだ

    #include <stdio.h> int main(void) { char a[51]; char b[101]; char c[51]; int i,k; int cnt; printf("文字例-->"); scanf("%s",a); i = 0; k = 0; while(a[i] !='\0') { cnt = 0; b[k] = a[i]; while(b[k] = a[i]) { cnt++; i++; } k++; b[k] = cnt + 48; k++; } b[k]='\0'; printf("b=%s\n",b); printf("c=%s\n",c); //-------------------------------------------------- getchar(); return 0; }

  • C言語計算プログラム

    Cの計算プログラム 下のプログラムを (1)上位桁の不要な0を表示しない (2)3つの数を計算できるようにする (3)0が入力されるまでは入力を受け付けて加算を繰り返す プログラムに改造する方法を教えてください。 #include <stdio.h> #define MAXDIGIT 70 void reset(char*,int); void input(char*,int); void add(char*,char*,char*,int); void add_digit(char ,char ,char ,char* ,char* ); void display(char* ,char* ,char* ,int ); void lineprint(char ,char* ,int ); void linedraw(char ,int ); int main(void) { char a[MAXDIGIT],b[MAXDIGIT],c[MAXDIGIT]; reset(a,MAXDIGIT); reset(b,MAXDIGIT); reset(c,MAXDIGIT); input(a,MAXDIGIT); input(b,MAXDIGIT); add(a,b,c,MAXDIGIT); display(a,b,c,MAXDIGIT); return 0;} void reset(char* buf,int maxdigit) { int i; for(i=0;i<maxdigit;i++) buf[i]=0; return;} void input(char* buf,int maxdigit) { char str[MAXDIGIT]; int i,j; printf("input data:"); scanf("%s",str); i=0; while(str[i]!='\0') i++; j=0; while(i>0){ buf[j]=str[i-1]-'0'; j++; i--; } return;} void add(char* a,char* b,char* c,int maxdigit) { int i; char carry_in,carry_out; i=0; carry_in=0; while(i<maxdigit) { add_digit(a[i],b[i],carry_in,&c[i],&carry_out); carry_in=carry_out; i++;} return;} void add_digit(char a,char b,char carry_in,char* c,char* carry_out) { *c=(a+b+carry_in)%10; *carry_out=(a+b+carry_in)/10; return;} void display(char* a,char* b,char* c,int maxdigit) { lineprint(' ',a,maxdigit); lineprint('+',b,maxdigit); linedraw('-',maxdigit+1); lineprint(' ',c,maxdigit); return;} void lineprint(char c,char* line,int maxdigit) { int i,maxdigitlimit; maxdigitlimit=maxdigit-1; printf("%c",c); for(i=maxdigitlimit;i>=0;i--){ printf("%1d",line[i]); } printf("\n"); return;} void linedraw(char c,int length) { int i; for(i=0;i<length;i++) printf("%c",c); printf("\n"); return;}

  • C言語を使ったプログラム作成

    ご教授お願い致します。 strcpy(),strcat(),strcmp() 上記3つの標準関数と同じ機能を持った関数をポインタを使用してプログラム作成 関数名 (1)*u_strcpy (2)*u_strcat (3)*u_strcmp strcpy()は char *u_strcpy(char *s,char *t) { char *p=s; while(*s++=*t++) return p; } void main(void) { char x[10],y[10]; scanf("%s %s",x,y); printf("%s\n",u_strcpy(y,x)); } で正常に動いたので大丈夫だと思いますが他2つがわかりません。

  • 文字列の連結するプログラム

    独学でプログラミングをやっているんですが2つ文字列を1つにする方法がよくわかりません。(1)のプログラムは(b+3)のところは文字の長さを指定しているからだめで(2)はstrcpyやstrcatなどのコマンドを使わずにやるそうです。While分とかでやるんでしょうか?教えてください。 (1) #include <stdio.h> int main (void){ char spelA[] = "abc"; char spelB[] = "def"; char spelC[20]; int a,b; spel[6]=0; for(a=0;spel[a]!=0;a++){ spelC[i] = spelA[i]; }; for(b=0;spelB[b]!=0;b++){ spelC[b+3] = spelB[b]; }; printf("%s\n",spelC); return(0); }; (2) #include <stdio.h> #include <string.h> int main (void){ char spelA[] = "abc"; char spelB[] = "def"; char spelC[20]; strcpy(spelC,spelA); strcat(spelC,spelB); printf("%s\n",spelC); return(0); }

  • C言語 ソートについて

    #include <stdbool.h> #include <stdio.h> void swap(char *a, char *b) { } bool is_at(char c) { } void justify(char line[], int n) { } int main(void) { char line[] = "a@b@@@c@@d@@@ef@@g"; size_t n = sizeof(line) - 1; justify(line, n); printf("%s\n", line); return 0; } 上の雛形を使って文字列lineに含まれる@以外の文字を文字列の前の方に詰めていくプログラミングを作るという問題を解いていたのですが下のプログラミングまでは出来たのですが最後のjustifyの部分がわかりません 良ければ解答をお願いします #include <stdbool.h> #include <stdio.h> void swap(char *a, char *b) { char temp = *a; *a = *b; *b = temp; } bool is_at(char c) { if(c == '@') { return true; } else { return false; } } void justify(char line[], int n) { for(int i=0;i<n-1;i++) { } } int main(void) { char line[] = "a@b@@@c@@d@@@ef@@g"; size_t n = sizeof(line) - 1; justify(line, n); printf("%s\n", line); return 0; }

  • 関数に配列を渡して値を変える

    関数に配列を渡して値を書き換えたいのですが、文字配列である char b[10]="abc"; の書き換えが綺麗にできません。 どのように書いたら綺麗にできますか? void hen(int *a, char *b,char **c){ *a=7; b[0]='d'; b[1]='e'; b[2]='f'; //こういう書き方なら渡せるけれどb[10]="def"; 見たいな書き方で一行で値を渡す方法はないものかな? *c="jkl"; } void main (void){ int a=5; char b[10]="abc"; char *c="ghi"; hen(&a,b,&c); printf("%d %s %s\n",a,b,c); }