アルファベット

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
takasi

アルファベット

#1

投稿記事 by takasi » 8年前

以下の結果を表示するプログラムを作成する
abcdefghijklmnopqrstuvwxyz
bcdefghijklmnopqrstuvwxyza
cdefghijklmnopqrstuvwxyzab
defghijklmnopqrstuvwxyzabc
efghijklmnopqrstuvwxyzabcd
fghijklmnopqrstuvwxyzabcde
ghijklmnopqrstuvwxyzabcdef
hijklmnopqrstuvwxyzabcdefg
ijklmnopqrstuvwxyzabcdefgh
jklmnopqrstuvwxyzabcdefghi
klmnopqrstuvwxyzabcdefghij
lmnopqrstuvwxyzabcdefghijk
mnopqrstuvwxyzabcdefghijkl
nopqrstuvwxyzabcdefghijklm
opqrstuvwxyzabcdefghijklmn
pqrstuvwxyzabcdefghijklmno
qrstuvwxyzabcdefghijklmnop
rstuvwxyzabcdefghijklmnopq
stuvwxyzabcdefghijklmnopqr
tuvwxyzabcdefghijklmnopqrs
uvwxyzabcdefghijklmnopqrst
vwxyzabcdefghijklmnopqrstu
wxyzabcdefghijklmnopqrstuv
xyzabcdefghijklmnopqrstuvw
yzabcdefghijklmnopqrstuvwx
zabcdefghijklmnopqrstuvwxy
abcdefghijklmnopqrstuvwxyz

という課題があって、この結果を表示するプログラムは以下のように自作したのですが、

コード:

#include<stdio.h>
int main(void)
{
	int k,n,j;
	for(k='a';k<='z';k=k+1){
		n=k;
		for(j=1;j<=26;j=j+1){
			printf("%c",n++);
		if(n>'z')
		n='a';
			}
		printf("\n");
		}
	n='a';
	for(j=1;j<=26;j=j+1){
		printf("%c",n++);
	}
	printf("\n");
	return(0);
}

今度は同じ結果を表示するプログラムをサブ関数を使って作らなければいけないのですが、さっぱり分かりません。
力を貸してください。

hss12
記事: 40
登録日時: 8年前

Re: アルファベット

#2

投稿記事 by hss12 » 8年前

そのプログラムだと問題があり
文字コードがaからzまで連続しているとは限りません。
連続していないものもあります。
ほとんどの場合問題なく動きますが、違う表示になる場合もあります。

char a[] = "abcdefghijklmnopqrstuvwxyz";
などとする必要があるかもしれません。

まあそれは別問題ですが
そのプログラムのままでいくとして
まず関数の作り方は分かるのでしょうか?

non
記事: 1097
登録日時: 9年前

Re: アルファベット

#3

投稿記事 by non » 8年前

hss12 さんが書きました:char a[] = "abcdefghijklmnopqrstuvwxyz";
などとする必要があるかもしれません。
そうするのなら、
char a[] = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz";
こうした方がもっと簡単。

それはそうと、サブってのは関数でしょうか?
まず、仕様を決めてもらわないと、どうアドバイスしてよいかわかりません。
どの部分を関数にしたいのでしょうか?
non

takasi

Re: アルファベット

#4

投稿記事 by takasi » 8年前

正直サブ関数がなんなのかはちゃんと理解してないです。
char[]== "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz";

char a[] = "abcdefghijklmnopqrstuvwxyz";
を使ったプログラムで先ほどの結果と同じ結果を出すプログラムもあるのですがそれは先生がまだ教えていない範囲だといって受け取ってくれません。

サブ関数がなんなのか、どこをサブ関数にしたらいいのか全く分からない状態です。

beatle
記事: 1280
登録日時: 8年前
住所: 埼玉
連絡を取る:

Re: アルファベット

#5

投稿記事 by beatle » 8年前

「サブ関数」なる用語は普段使ったことがないのですが、多分ただの関数だと予想しました。
hss12 さんが書きました:まず関数の作り方は分かるのでしょうか?
という発言がありましたが、これについてはどうでしょうか?
関数の作り方自体分からなければ、関数についての学習から始める必要があります。
関数の作り方が分かって初めて、どの部分の処理を関数に分離するか、という議論ができます。

takasi

Re: アルファベット

#6

投稿記事 by takasi » 8年前

サブ関数ってもう1つの機能や作用てきな意味でいいんでしょうか?
これをmain関数の他に同じプログラムの中に作ることで処理を2つにわけて行う感じでしょうか?
例えばmain関数で何らかの形でAを使うとしてそれをサブ関数でAはなんなのかを説明する。
自分はC言語を本を読んで勉強していますが本の言葉も知らない言葉が多く理解しようと思ってやっていますが課題のレベルの上がり方と課題の量が多いために追いつけないのが現状です。
自分でできないのが悪いのですが教えてください。

beatle
記事: 1280
登録日時: 8年前
住所: 埼玉
連絡を取る:

Re: アルファベット

#7

投稿記事 by beatle » 8年前

takasi さんが書きました:サブ関数ってもう1つの機能や作用てきな意味でいいんでしょうか?
これをmain関数の他に同じプログラムの中に作ることで処理を2つにわけて行う感じでしょうか?
例えばmain関数で何らかの形でAを使うとしてそれをサブ関数でAはなんなのかを説明する。
大体の理解は合ってます。でも「サブ関数」っていう言い方は(少なくとも僕は)聞いたことがありません。「関数」で良いと思います。
それとも、その教科書または先生が「サブ関数」って言っているのでしょうか。

では基本的な関数の定義方法から行きましょうか。

コード:

#include <stdio.h>

int add(int a, int b)
{
	return a + b;
}

int main(void)
{
	int val = add(2, 3);
	printf("val = %d\n", val);
	return 0;
}
2つの引数aとbを受け取って、その和を返す関数addを定義しました。
関数の定義は

コード:

戻り値型 関数名(仮引数リスト)
{
    処理内容
}
とします。
関数を実際に呼び出す方は

コード:

変数名 = 関数名(実引数リスト);
とします。
もし、引数が何もいらないよ、というときの関数定義は

コード:

戻り値型 関数名(void)
{
    処理内容
}
と書きます。main関数がこの形ですね。
引数ではなくて戻り値がいらない場合は

コード:

void 関数名(仮引数リスト)
{
    処理内容
}
です。

関数定義の練習問題を書いておきますね。
  1. 引数で指定した1文字を画面に出力する関数 void print_char(char c) を定義せよ
  2. 'a'から'z'の26文字を画面に出力する関数 void print_alpha(void) を定義せよ
  3. 引数で指定した1文字から順番に、アルファベット26文字を画面に出力する関数 void print_alpha_from(char c) を定義せよ
この問題に回答するときは、必ず定義した関数を利用するmain関数も書いて下さい。

takasi

Re: アルファベット

#8

投稿記事 by takasi » 8年前

やろとしましたがうまくいきません。
正直おてあげです。課題提出が近くあせっています。
どなたかプログラムを作っていただける方がいたらお願いします。

qwerty

Re: アルファベット

#9

投稿記事 by qwerty » 8年前

コード:

#include <stdio.h>

void print_char();

int main(void)
{
	print_char();
	
	return 0;
}

void print_char()
{
	int i, j, k;
	
	for(i='a'; i<='z'; i++) {
		j = i;
		for(k=1; k<=26; k++) {
			printf("%c", j++);
			if(j > 'z') {
				j = 'a';
			}
		}
		printf("\n");
	}
	j = 'a';
	for(k=1; k<=26; k++) {
		printf("%c", j++);
	}
	printf("\n");
}
とりあえず関数化という要求を満たすだけなら、
働きの部分をそのまま全部関数に押し込むことでも可能です。

よく見てください。
お手上げというほど難しくもないでしょう。

ただこのプログラムだと「機能的でない」わけなんですよ。
だからbeatleさんは課題という形で「機能的な」アイディアを提示してくれているんですよ。
もうちょっと回答者さんの意図を推し量ってくださいね。

takasi

Re: アルファベット

#10

投稿記事 by takasi » 8年前

ほんとbeatleさんには申し訳ないです。beatleさんの課題ができればホントうまくいくのも分かっていますし、そのためにわざわざ課題といった形式で出して自分の力で作る機会を与えてくれる配慮にも感謝しています。
しかし、力不足で自分にはできません。qwertyさんの作っていただいたプログラムは確かにもう1つ関数を使っているのですが多分これでは先生に言いくるめられて受け取ってもらえません。わざわざ作っていただいてありがとうございます。

takasi

Re: アルファベット

#11

投稿記事 by takasi » 8年前

私的には最初のプログラムを関数を増やして

コード:

#include<stdio.h>
int sori(int k)
{	
	for(k='a';k<='z';k=k+1){
		n=k;
		for(j=1;j<=26;j=j+1){
			printf("%c",n++);
		if(n>'z')
		n='a';
			}
		printf("\n");
		}
	return(k);
}
int sori(int 'a')
{
	n='a';
	for(j=1;j<=26;j=j+1){
		printf("%c",n++);
	}
	printf("\n");
	return('a');
}
int main(void)
{
	int k,n,j;
	x=sori(int k);
	printf("%c",k++);
	y=sori
	printf("\n");
	return(0);
}
このような感じでうまく表示できるようにしたいのですがどうしたらいいのか分かりません。
なげやりですいませんがこのかたちでプログラムを完成できるようにご指摘お願いします。

qwerty

Re: アルファベット

#12

投稿記事 by qwerty » 8年前

コード:

#include <stdio.h>

void print_alpha_from(char c);

int main(void)
{
	char i;
	
	for(i='a'; i<='z'; i++) {
		print_alpha_from(i);
	}
	
	return 0;
}

void print_alpha_from(char c)
{
	int i;
	
	for(i=0; i<26; i++) {
		printf("%c", c++);
		if(c > 'z') {
			c = 'a';
		}
	}
	printf("\n");
}
>言いくるめられて受け取ってもらえない
そこまでわかってるんだったら、もう一歩だと思うんですけれどもね。
これだと受け取ってもらえますかね。

takasi

Re: アルファベット

#13

投稿記事 by takasi » 8年前

これってプロトタイプ宣言ってやつですか?
実行結果のさいごにもう一列abcdefghijklmnopqrstuvwxyz入った
abcdefghijklmnopqrstuvwxyz
bcdefghijklmnopqrstuvwxyza
cdefghijklmnopqrstuvwxyzab
defghijklmnopqrstuvwxyzabc
efghijklmnopqrstuvwxyzabcd
fghijklmnopqrstuvwxyzabcde
ghijklmnopqrstuvwxyzabcdef
hijklmnopqrstuvwxyzabcdefg
ijklmnopqrstuvwxyzabcdefgh
jklmnopqrstuvwxyzabcdefghi
klmnopqrstuvwxyzabcdefghij
lmnopqrstuvwxyzabcdefghijk
mnopqrstuvwxyzabcdefghijkl
nopqrstuvwxyzabcdefghijklm
opqrstuvwxyzabcdefghijklmn
pqrstuvwxyzabcdefghijklmno
qrstuvwxyzabcdefghijklmnop
rstuvwxyzabcdefghijklmnopq
stuvwxyzabcdefghijklmnopqr
tuvwxyzabcdefghijklmnopqrs
uvwxyzabcdefghijklmnopqrst
vwxyzabcdefghijklmnopqrstu
wxyzabcdefghijklmnopqrstuv
xyzabcdefghijklmnopqrstuvw
yzabcdefghijklmnopqrstuvwx
zabcdefghijklmnopqrstuvwxy
abcdefghijklmnopqrstuvwxyz
この形にするにはどうしたらいいんでしょうか?

beatle
記事: 1280
登録日時: 8年前
住所: 埼玉
連絡を取る:

Re: アルファベット

#14

投稿記事 by beatle » 8年前

qwertyさんのNo12の回答のmain関数で、最後に

コード:

print_alpha_from('a');
を呼び出すだけです。それとも、もっと凝ったやり方を探してらっしゃる?

takeru

Re: アルファベット

#15

投稿記事 by takeru » 8年前

これで十分なんですが、ここからは興味本位でお聞きしたいんですけど、NO.11で載せたような感じでプロトタイプ宣言でないような形でやるとどうなるのでしょうか?

beatle
記事: 1280
登録日時: 8年前
住所: 埼玉
連絡を取る:

Re: アルファベット

#16

投稿記事 by beatle » 8年前

takeru さんが書きました:NO.11で載せたような感じでプロトタイプ宣言でないような形でやるとどうなるのでしょうか?
実際にやってみれば、どうなるかは分かると思います。

閉鎖

“C言語何でも質問掲示板” へ戻る