トップページ⇒tech
1001コメント395KB

ぼるじょあがC/C++の宿題を片づけますYO! 67代目

■ このスレッドは過去ログ倉庫に格納されています
0001ぼるじょあ ◆yBEncckFOU 2006/12/10(日) 11:33:41
(・3・)エェー ぼるじょあですYO!
         わからない宿題を片づけますYO!

あなたが解けないC言語/C++言語の宿題を片付けもらうスレッドです。気に入らない質問やその他や発言はスルーの方向で。
【質問者へ】
回答者の便宜のため、質問の際は以下を行うことを推奨します。
・質問は【質問テンプレ】を利用してください。
・問題文は、出題されたまま全文を書いてください。
・計算問題は数式をあげ、どのような計算をするのか詳しく説明してください。
・エラーは、その詳細と発生した行を書きましょう。エラーメッセージはコピペしてください。
・後から問題に付け足しするのはやめましょう。付け足しは作業を無駄にしがちです。
・なりすましを防ぐため、トリップを使ってください。名前欄に、「#」に続けて任意の文字列を入力して
 投稿すると、その文字列を知らない他人に騙られることを防ぐことができます。
【質問テンプレ】
[1] 授業単元:
[2] 問題文(含コード&リンク):
[3] 環境
 [3.1] OS: (Windows/Linux/等々)
 [3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等)
 [3.3] 言語: (C/C++/どちらでも可 のいずれか)
[4] 期限: ([yyyy年mm月dd日hh:mmまで] または [無期限] のいずれか)
[5] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々)

【アップローダー==ラウンジ】(質問が長い時はココ使うと便利 回答者もコードが長ければここに)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
【C 関数検索 man on WWW】
http://www.linux.or.jp/JM/index.html

【前スレ】
ぼるじょあがC/C++の宿題を片づけますYO! 66代目
http://pc8.2ch.net/test/read.cgi/tech/1149349035/
0751デフォルトの名無しさん2007/04/27(金) 18:42:42
>>750
"%i"って辺りが素人では有り得ない。

それはそうと、定数配列如きでグローバルな名前空間を汚して欲しくないなぁ。素人っぽくていいけど。
0752デフォルトの名無しさん2007/04/27(金) 18:46:14
>>749 (2)をエラトステネスのふるいで
#include <stdio.h>
#define MAX 101 // MAX-1まで求める
int main(void)
{
int a[MAX]={0},i,j;
for(i=1; i<MAX; i+=2)
a[i]=1;
for(i=4; i<MAX; i+=2)
a[0]=0;
for(i=3; i<MAX; i+=2) {
if(a[i]==1) {
for(j=i*2; j<MAX; j+=i)
a[j]=0;
}
}
for(i=1; i<MAX; i++)
if(a[i]==1) printf("%*d ",3,i);
return 0;
}
0753デフォルトの名無しさん2007/04/27(金) 18:48:40
MAX-1まで求めるって妙な仕様の定数を使う辺りが素人っぽくていいね。
0754デフォルトの名無しさん2007/04/27(金) 18:52:22
>>753
そこは素人でも何でもなくただの補足だぞw
0755デフォルトの名無しさん2007/04/27(金) 19:07:14
if(a[i]==1) printf("%*d ",3,i);
%3dじゃなくて %*d の * の部分を後ろの引数で引用しているところは?
0756デフォルトの名無しさん2007/04/27(金) 19:19:15
>>754
いやさ、なんで#define MAX 100にしてi <= MAXにしないのかな、と。
#意味からいけば、「100までの」なのだから……

>>755
%*dを使う辺りは素人っぽくないような、定数の3を剥き身で置いている辺りが素人っぽいような……
0757デフォルトの名無しさん2007/04/27(金) 19:32:37
>>756
a[101]にしたとき、a[0]〜a[100]までなんだが?その[]の中の値100まで求めるってのが理解できなかった?
ってか、お前エラトステネスのふるいの概要について理解していないだろ?
0758デフォルトの名無しさん2007/04/27(金) 19:40:35
>>752に1が入っちゃっていることに突っ込みは無しか?w
for(i=1; i<MAX; i++) は for(i=3; i<MAX; i+=2) だなw

0759デフォルトの名無しさん2007/04/27(金) 19:41:24
ああ、あとa[2]=1;も忘れてるガナ。そういうところに突っ込まなきゃw
0760デフォルトの名無しさん2007/04/27(金) 19:48:52
>>749 (1)
#include<stdio.h>
int main(void){
double data[30];
int n,i,t;
double temp;
for(n=0;n<30;n=n+1){
printf("%d個目の数値を入力してください\n",n+1);
scanf("%lf",&data[n]);
}
for (n=0;n<30;n=n+1){
t=n;
for(i=n+1;i<30;i=i+1){
if (data[t]>data[i]){
t=i;
}
}
temp=data[n];
data[n]=data[t];
data[t]=temp;
}
for(n=0;n<30;n=n+1){
printf("%f\n",data[n]);
}
return 0;
}
0761デフォルトの名無しさん2007/04/27(金) 19:51:21
それって、どのミスも素人っぽさに関係ないからどうでもよかったw
>>757
Cの配列を1オリジンで使う辺り。
0762デフォルトの名無しさん2007/04/27(金) 19:55:05
>>761 エラトステネスのふるいについて理解してないことをカミングアウトしなくて良いから
リアル素人は黙ってろw
0763デフォルトの名無しさん2007/04/27(金) 19:57:18
>>761
だから配列の要素の値の数値が素数かどうかでその要素に1か0を入れるアルゴリズムなんだが?
0も1オリジンも無関係だぞw
0764デフォルトの名無しさん2007/04/27(金) 20:10:37
>for(i=4; i<MAX; i+=2)
>a[0]=0;
何がしたいの?
0765デフォルトの名無しさん2007/04/27(金) 20:12:46
1を素数にするし2を素数から除外するし、素数の意味を分かってない馬鹿が無理すんなw
0766デフォルトの名無しさん2007/04/27(金) 20:13:25
ちと訂正しとくか。
配列の要素の値 > 配列の要素を参照する値
0767デフォルトの名無しさん2007/04/27(金) 22:20:10
>>764
2以上の偶数は素数じゃないから素数じゃないという0を入れているじゃん
実際のところ、最初の初期化でそれも不要だけどね
0768デフォルトの名無しさん2007/04/27(金) 22:21:18
っと、失礼。2以上じゃなくて2より上の偶数ね。以上じゃ2も含むから。a[2]=1;を入れ忘れているが。
0769デフォルトの名無しさん2007/04/27(金) 22:28:25
あと素人で突っ込むってなら、100の正の平方根の値以下の値で十分な部分があるのだがw
0770デフォルトの名無しさん2007/04/27(金) 22:35:12
#include <stdio.h>
#include <math.h>
#define MAX 101
int main(void) {
int a[MAX]={0},i,j,LMT=(int)sqrt(MAX);
a[2]=1;
for(i=3; i<MAX; i+=2) a[i]=1;
for(i=3; i<=LMT; i+=2) {
if(a[i]==1) {
for(j=i*2; j<MAX; j+=i)
a[j]=0; } }
printf("%*d ",3,2);
for(i=3; i<MAX; i+=2)
if(a[i]==1) printf("%*d ",3,i);
return 0; }
0771デフォルトの名無しさん2007/04/27(金) 22:38:45
【質問テンプレ】
[1] 授業単元:C言語1
[2] 実行結果:男子学生:1394、女子学生:128、全学生数:1477、女子学生割合:8.67%
[3] 環境
 [3.1] OS: Windows XP
 [3.2] コンパイラ名とバージョン:Microsoft Visual Studio 2005
 [3.3] 言語: C言語
[4] 期限:速攻

ソース
#include <stdio.h>
int main (void)
{
int a, b;
printf("男子学生数="); scanf("%d", &a);
printf("女子学生数="); scanf("%d", &b);
printf("全体学生数=%d\n", a + b);
printf("女子学生数割合=%0.1f%\n", (b / (a + b)) * 100);

return(0);
}

女子学生割合がちゃんとでません。orz
0772デフォルトの名無しさん2007/04/27(金) 22:41:31
>767
a[0]にしか0入れてないのに偶数の除外とか盲目なの?
0773デフォルトの名無しさん2007/04/27(金) 22:46:12
>771
(b / (a + b)) * 100 → (double)b / (a + b) * 100
0774デフォルトの名無しさん2007/04/29(日) 12:46:16
>>749
(2)
---
#include <stdio.h>

int main(void)
{
int i, j;
int checklist[101];

for(i = 2; i <= 100; i++) {
checklist[i] = 0;
}
for(i = 2; i <= 100; i++) {
if(checklist[i] == 0) {
for(j = i+1; j <= 100 ; j++) {
if(j % i == 0) {
checklist[j] = 1;
}
}
}
}
for(i = 2; i <= 100; i++) {
if(checklist[i] == 0) {
printf("%d\n", i);
}
}
return 0;
}
---
0775デフォルトの名無しさん2007/04/29(日) 13:11:37
>>774 何がしたいねんて?w 無駄な部分が多すぎ。
07767742007/04/29(日) 13:11:50
ダサイことを書いてしまった。
> for(j = i+1; j <= 100 ; j++) {
修正する。
for(j = i*2; j <= 100 ; j+=i) {
0777デフォルトの名無しさん2007/04/29(日) 13:16:06
>>775
無駄のないコードを書いてくれ。
依頼主の最後のコメントを意識した上で。
0778デフォルトの名無しさん2007/04/29(日) 13:30:50
int checklist[101];

for(i = 2; i <= 100; i++) {
checklist[i] = 0;
}
       ↓
int checklist[101]={0}; で可
以下、素数かそうでないかを示す配列を使っているのに
わざわざ数値を除算して割り切れたら素数ではないと求めるよりも
前から順番に素数だと分かっている数値でそれ以上〜求める値まで
素数の倍数に該当するものを排除すれば素数かどうかをチェックする配列を有効活用できると思うのだが。
0779デフォルトの名無しさん2007/04/29(日) 13:31:57
>>777
> 依頼主の最後のコメントを意識した上で。
無駄なものを入れるのが素人とは思えんが。そういう屁理屈を言い出したらキリがない。
自分の未熟さを出題者の言葉でごまかすのは良くない。あと、素数を求めるソースは既出。
0780ぼるじょあ ◆yBEncckFOU 2007/04/29(日) 13:42:32
>>778
それやってると配列の大きさが小さいうちはいいが、大きくなると
BBS領域がふくれあがって実行ファイルが巨大になるぞ。

double d[1000000]; とかやってみれ。
0781ぼるじょあ ◆yBEncckFOU 2007/04/29(日) 13:43:11
×BBS
○BSS
0782デフォルトの名無しさん2007/04/29(日) 13:44:53
DATA領域じゃないの?
07837772007/04/29(日) 13:45:22
こういうことだな。
for(j = i*2; j <= MAX ; j+=i) {
checklist[j] = 1;
}
この辺はなんかがオカシイと思っていたのだが、惰性で書いてた。
ご指摘の通りです。

>int checklist[101]={0}; で可
これは忘れていたか、知らなかったか分からない。
10年くらい前にCの本で読んだ気もするが。

>>779
>自分の未熟さを出題者の言葉でごまかすのは良くない。
俺は未熟だが、依頼主の要望に応えられないのでは価値が無いだろ?
0784デフォルトの名無しさん2007/04/29(日) 14:03:15
>>765は配列の要素の参照について理解していない負け犬決定かw
0785デフォルトの名無しさん2007/04/29(日) 14:29:00
>>783 低学歴必死だなw
0786デフォルトの名無しさん2007/04/29(日) 16:13:20
>784
752を実行すると1 3 5……って表示されてくことを馬鹿にしてんだろ?
要素の参照とか全然関係ないじゃん。
0787デフォルトの名無しさん2007/04/29(日) 16:26:02
>>786
だからそれについてはその後に突っ込まれてんだが?w
既出事項で後でどうこう言う奴って、分かりきっていることを言っただけだから
何か言おう言おうとして結局自分では言い返せなかった負け犬の最後の悪あがきだろw
0788デフォルトの名無しさん2007/04/29(日) 16:27:47
>>765=>>761ってことね。この際、素数には0も1も含まれないから、配列の要素の参照が
0か1で始まるかについては本当にナンセンスだからw
それでもa[101]とした場合、[]の中で有効的に使えるのは100までというのは
扱っている人なら分かっているだろ。それについて理解していなかったのを露呈されて
最後に苦し紛れにすでに突っ込まれた1と2を持ち出したに過ぎないだろw
0789デフォルトの名無しさん2007/04/29(日) 18:04:09
>for(i=4; i<MAX; i+=2)
>a[0]=0;
こんなコード書く奴が何言っても負け犬の遠吠えだな、確かにw
0790デフォルトの名無しさん2007/04/30(月) 03:50:48
>>780
BSSが大きくなっても実行ファイルは大きくならんだろう。
たいていの環境では。
0791デフォルトの名無しさん2007/04/30(月) 04:10:00
>>789
それについては不要なコードだったってことで、実際に動作には影響していないw
それよか、その程度のことを敢えて突っ込んでバカにしようとする態度をとるお前がキモイ。
気持ち悪い顔してストレスためてんだよね・・・負け犬社会のクズがw
0792デフォルトの名無しさん2007/04/30(月) 11:21:27
>>791
許してあげなよ
50にもなって平社員で今日も会社で失敗して年下の主任に怒られてその腹いせに揚げ足とっていじめてやろうとしているだけなんだからさ。
責めたらかわいそうだろ?
0793デフォルトの名無しさん2007/04/30(月) 11:22:47
ハイハイ自演乙です
0794デフォルトの名無しさん2007/04/30(月) 21:10:09
[1] 授業単元:プログラミング言語
[2] 問題文(含コード&リンク):1000個までの整数あるいは少数を打ち込んで、その平均と標準偏差を表示することのできるプログラムを作成せよ。
[3] 環境
 [3.1] OS:Windows XP
 [3.2] コンパイラ名とバージョン:gcc
 [3.3] 言語:C
[4] 期限:なるべく早めにお願いします。
[5] その他の制限:素人でも作成できるレベルでお願いします。
0795デフォルトの名無しさん2007/04/30(月) 21:25:07
>>794
http://www1.cts.ne.jp/~clab/hsample/Func/Func09.html
0796デフォルトの名無しさん2007/04/30(月) 21:44:15
>>794
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3910.txt

ちょっと前にも同じ問題が出たので学校が同じ人かな?
07977942007/04/30(月) 22:51:05
>>746
45行のM_PIが定義されていない!?…となりエラーが出ます。
ど素人なので、どうしていいのかわかりません。
よろしくお願いします。
0798デフォルトの名無しさん2007/04/30(月) 23:39:22
>>797

#define N 1000 の下の行に,
#define M_PI 3.14159265358979323846
を追加すればコンパイル通るはず.

gcc だと >>796 のままでコンパイル通ったけど,Visual C++ かなんかでコンパイルしてんの?
0799デフォルトの名無しさん2007/05/01(火) 00:42:18
M_PIなんか使うのかと思ったらわざわざ乱数関数自作したのか
0800デフォルトの名無しさん2007/05/01(火) 01:02:21
>>799
じゃなくてこれは正規分布の乱数の関数だから
プログラムが正しく動作しているのを確認しただけじゃないの?
0801デフォルトの名無しさん2007/05/01(火) 01:15:27
M_PIとかはCでは標準、C++では非標準なんだっけ?
0802デフォルトの名無しさん2007/05/01(火) 01:27:40
>>800
律儀やねぇ
0803デフォルトの名無しさん2007/05/01(火) 11:18:28
質問です

コアラのマーチのファンはいませんか?
0804デフォルトの名無しさん2007/05/01(火) 11:20:53
ttp://www.uploda.net/cgi/uploader1/index.php?dlpas_id=0000211591.zip
オナしました。。
ダウンロードパス・解凍パスはonaです
0805デフォルトの名無しさん2007/05/07(月) 18:30:36
>>706
ちがうお 白ランとか黒ランとかいうぼるじょあさんだお
ランレングス符号化の問題やってくれるお
0806デフォルトの名無しさん2007/05/09(水) 17:20:44
配列で、
a[0]=8
a[1]=50
a[3]=72
a[4]=20
a[5]=10
って出力したいんですけど、a[2]がとんでるじゃないですか?if文をつかってとばすってきいたんですけど…わかりません。ソースコード教えてください。C言語です。
0807デフォルトの名無しさん2007/05/09(水) 17:22:24
配列で、
a[0]=8
a[1]=50
a[3]=72
a[4]=20
a[5]=10
って出力したいんですけど、a[2]がとんでるじゃないですか?if文をつかってとばすってきいたんですけど…わかりません。ソースコード教えてください。C言語です。
0808デフォルトの名無しさん2007/05/09(水) 19:20:49
>>806
つcontinue
#include<stdio.h>
int main(void)
{
int n;
int a[]={8,50,801,72,20,10)};
for(n=0;n<=5;n++){
if(n==2) continue;
printf("a[%d]=%d\n",n,a[n]);
return 0;
}
間違っててもオラしらねえだ。
0809依頼者2007/05/10(木) 21:02:35
[1] 授業単元:Cプログラミング演習
[2] 問題文(含コード&リンク):
(1)関数mainにおいてキーボードから2つの文字を入力し
アルファベットの順序に並べ替えてモニタに出力するプログラムの作成。
 
(2)キーボードから30個の配列に小数を代入し、それらを小さい順に
並び替え、その結果をモニタに出力するプログラムを作成せよ。このソート
の問題は、バブルソートで実施し、連続する2数の交換main以外の関数swap
で実施せよ。
プログラムの作成。
[3] 環境:
 [3.1] OS: Windows XP
 [3.2] コンパイラ名とバージョン: Visual Studio.net
 [3.3] 言語: C
[4] 期限: 5月12日まで。

簡単なプログラムでお願いします。
0810デフォルトの名無しさん2007/05/11(金) 17:11:28
>>808さん。
ありがとうございます。
0811C初心者2007/05/11(金) 21:59:24
問題文
以下の(a)~(d)の方法で、
 1/1-1/2+1/3-1/4+…+1/n
を求める関数を作成してください。これらの関数は、
 int n;
double ansa,ansb,ansc,ansd;
double suma(int),sumb(int),sumc(int),sumd(int);
:
:
ansa=suma(n);
snsb=sumb(n);
ansc=sumc(n);
ansd=sumd(n);
といった形式で使うものとします。n>0に限定してもいいですが、関数suma,sumb,sumc,sumdの中身
を書き換えることなく、任意のnについて計算できるように注意してください。作成した4つの関数
を用いて、n=10000で計算した結果を比較し、違っているならばなぜ違うかを考察してください。
  (a)suma:順次左(1/1)から加えていく方法
  (b)sumb:順次右(1/n)から加えていく方法
  (c)sumc:正負の項を別々に、順次左から加えていく方法
  (d)sumd:正負の項を別々に、順次右から加えていく方法
 環境
  OS:Linux
 コンパイラ名とバージョン:gcc
 言語: C
 期限: 2007/5/18まで

おねがいします。
0812C初心者2007/05/11(金) 22:13:06
追加です。
問題文
 配列に格納された実数を大きさの順に並べ替える関数を作成してください。この関数は以下
のように使うものとします。n=1000は例であって、データ数は1000とは限りません(ただし、
プログラムの都合上1000以下とします)。
--------------------------------------------------------------------
double a[1000];
void sort(double*,int);
:
:
n=1000;

/*(ここでa[0]からa[999]をファイルから読み込む)*/

sort(a,n);

/*(ここでa[0]からa[999]をプリントし、結果を確認する)*/
-------------------------------------------------------------------
環境
  OS:Linux
 コンパイラ名とバージョン:gcc
 言語: C
 期限: 2007/5/18まで
0813C初心者2007/05/11(金) 22:25:14
すみませんまた追加です。
問題文
 自然対数の底eを1000桁求めるプログラムを作成してください。e^xをマクローリン展開
した
   e^x=1+x/1!+x^2/2!+…+x^n/n!+…
において、x=1とおいた式を計算するとよいでしょう。

環境
  OS:Linux
 コンパイラ名とバージョン:gcc
 言語: C
 期限: 2007/5/18まで
0814デフォルトの名無しさん2007/05/12(土) 02:54:07
printf("%s/n","Hello World");

上のprintf文の%sでどのように"Hello World"を処理しているのか分かりません。
どなたかご教授して下さい。
0815デフォルトの名無しさん2007/05/12(土) 04:16:05
>811
メインは省略
double suma(int n) {
 int i;
 double sum = 0;
 for(i=1; i<=n; i++) {
  if(i%2) sum += (double)1 / i;
  else sum -= (double)1 / i; }
 return sum;
}
double sumb(int n) {
 int i;
 double sum = 0;
 for(i=n; i > 0; i--) {
  if(i%2) sum += (double)1 / i;
  else sum -= (double)1 / i; }
 return sum;
}
double sumc(int n) {
 int i;
 double sum = 0;
 for(i=1; i<=n; i+=2) sum += (double)1 / i;
 for(i=2; i<=n; i+=2) sum -= (double)1 / i;
 return sum;
}
double sumd(int n) {
 int i;
 double sum = 0;
 for(i=n; i > 0; i-=2) sum += (double)1 / i;
 for(i=n-1; i > 0; i-=2) sum -=(double)1 / i;
 return n % 2 ? sum : -sum;
}
0816C初心者2007/05/12(土) 16:18:11
>>815
 ありがとうございます。とりあえず関数sumaについてプログラムを作ってみたのですが
メインの部分はこれで良いのでしょうか?みていただけると幸いです。
#include <stdio.h>

double suma(int n) {
int i;
double sum = 0;
for(i=1; i<=n; i++) {
if(i%2) sum += (double)1 / i;
else sum -= (double)1 / i; }
return sum;
}

int main(void)
{
int n;
double ansa;
double suma(int);
printf("nを入力してください:"); scanf("%f",&n);

ansa = suma(n);
printf("計算結果は%fです。\n",ansa);

return(0);
}
0817デフォルトの名無しさん2007/05/12(土) 16:21:25
名前欄に初心者と書く奴は死んでしまえ今すぐに
0818デフォルトの名無しさん2007/05/12(土) 16:27:50
> (double)1

なんというキモさ
0819デフォルトの名無しさん2007/05/12(土) 19:28:36
1.0でいいのにね
0820依頼者2007/05/12(土) 20:13:41
[1] 授業単元:Cプログラミング演習
[2] 問題文(含コード&リンク):
(1)関数mainにおいてキーボードから2つの文字を入力し
アルファベットの順序に並べ替えてモニタに出力するプログラムの作成。
 
(2)キーボードから30個の配列に小数を代入し、それらを小さい順に
並び替え、その結果をモニタに出力するプログラムを作成せよ。このソート
の問題は、バブルソートで実施し、連続する2数の交換main以外の関数swap
で実施せよ。

[3] 環境:
 [3.1] OS: Windows XP
 [3.2] コンパイラ名とバージョン: Visual Studio.net
 [3.3] 言語: C
[4] 期限: 5月14日まで。

全然わかりません、よろしくお願いします。
0821ぼるじょあ ◆hZ8e4Wjqvw 2007/05/13(日) 11:03:52
>>820
(・3・) エェー (2)だけやっといたYO!

#include<stdio.h>
#define DATA_NUM 30
void swap(double *a, double *b){
    double c;
    c=*a;
    *a=*b;
    *b=c;
}
int main(void){
    double data[DATA_NUM];
    int i, j;
    for(i=0;i<DATA_NUM;i++){
        printf("実数を入力して下さい");
        scanf("%lf", &data[i]);
    }
    for(i=0;i+1<DATA_NUM;i++){
        for(j=i+1;j<DATA_NUM;j++){
            if(data[i]>data[j]){
                swap(&data[i], &data[j]);
            }
        }
    }
    for(i=0;i<DATA_NUM;i++)
        printf("%f\n", data[i]);
    return 0;
}
0822依頼者2007/05/13(日) 15:21:27
>>821さんありがとうございます。

あとどなたか(1)のほうもお願いします。
0823デフォルトの名無しさん2007/05/13(日) 16:08:33
>>822
簡単だから自分でやって見れ
まずはCの復習、ここがお勧め→ttp://effy.ldw.jp/c/index.html
考え方はと言うか疑似コード?は
0.骨格を作る(#includeやmain(){})。
ぼるじょあ氏のswap関数を組み込む(main関数の前にコピペ)
1.char型の変数、a,bを宣言
2.文字をscanf("%c",&a)かなにかでキーボードからを入力して変数aに文字を入れる。
3.同じ様に文字を入力して変数bに入れる。
4.もし、aがbより大きければ(アルファベット順じゃないなら)入れ替える。if(a>b) swap(&a,&b);文字も数値として扱われるから大きさを比べられる。
5.a,bを出力
6.終わり
0824デフォルトの名無しさん2007/05/14(月) 02:51:45
実はぼるじょあの中の人は、女もいるという噂
0825デフォルトの名無しさん2007/05/14(月) 08:24:30
ぼるじょあうざい
0826デフォルトの名無しさん2007/05/14(月) 22:41:50
[1] 授業単元: プログラミング基礎�T
[2] 問題文: はじめに人数を入力。その人数分、交通費を入力。
するとお金の種類ごと(一万円、五千円、千円、五百円、百円、五十円、十円、五円、一円)に何枚用意する必要があるか表示してくれるプログラムを作成せよ。
以下の三つが課題達成条件です。
・人数として0もしくは負の数を入力された場合は、「正しい人数を入力してください」と、表示し終了する。
・枚数が0枚の場合は硬貨の種類は表示しない。
・正しい硬貨と枚数が表示される。
  
[3] 環境
 [3.1] OS:Windows XP
 [3.2] コンパイラ名とバージョン: Visual C++ 2005
 [3.3] 言語: C
[4] 期限: 5月15日まで
[5] その他の制限: do,while,for文まで習いました。

よろしくお願いします。
0827homoじょあ ◆5OLf4yFnuM 2007/05/14(月) 23:06:39
>>826
#include <stdio.h>

int main(void){
int sum = 0, num, cnt, tmp;
int money[] = {10000, 5000, 1000, 500, 100, 50, 10, 5, 1};
printf("人数:");
scanf("%d", &num);
if(num <= 0){
printf("正しい人数を入力して下さい\n");
return -1;
}
for(cnt=0; cnt<num; cnt++){
printf("%d人目の交通費:", cnt+1);
scanf("%d", &tmp);
sum += tmp;
}
for(cnt=0; cnt<9; cnt++){
tmp = sum / money[cnt];
if(tmp != 0){
printf("%d円:%d枚\n", money[cnt], tmp);
sum -= tmp * money[cnt];
}
}
return 0;
}
0828デフォルトの名無しさん2007/05/14(月) 23:23:16
>>827
ありがとうございます。感謝です
0829ぼるじょあ ◆hZ8e4Wjqvw 2007/05/14(月) 23:27:11
>>826
(・3・) エェー おいらもやってみたYO!

#include<stdio.h>
void money_num_calc(const int money_kind[], int money_kind_num, int money_num[], int value){
    int i;
    if(value<0) value=0;
    for(i=0;i<money_kind_num;i++){
        money_num[i]=value/money_kind[i];
        value%=money_kind[i];
    }
}
int main(void){
    const int money_kind[]={10000,5000,1000,500,100,50,10,5,1};
    int money_num_total[sizeof(money_kind)/sizeof(money_kind[0])]={0};
    int money_num[sizeof(money_kind)/sizeof(money_kind[0])];
    int human_num, human_index, i, value;
    printf("人数を入力して下さい ");
    scanf("%d", &human_num);
    if(human_num<=0){printf("\n正しい人数を入力してください\n");return 1;}
    for(human_index=0;human_index<human_num;human_index++){
        printf("%d 人目の交通費を入力してください ", human_index+1);
        scanf("%d", &value);
        money_num_calc(money_kind, sizeof(money_kind)/sizeof(money_kind[0]), money_num, value);
        for(i=0;i<sizeof(money_kind)/sizeof(money_kind[0]);i++)
            money_num_total[i]+=money_num[i];
    }
    for(i=0;i<sizeof(money_kind)/sizeof(money_kind[0]);i++)
        if(money_num_total[i]>0)
            printf("%5d 円 : %d 枚\n", money_kind[i], money_num_total[i]);
    return 0;
}
0830ぼるじょあ ◆hZ8e4Wjqvw 2007/05/14(月) 23:31:49
>>826
(・3・) エェー 関数使うのやめてみたYO! あと交通費が負数のときは 0円換算するYO!

#include<stdio.h>
int main(void){
    const int money_kind[]={10000,5000,1000,500,100,50,10,5,1};
    int money_num[9]={0};
    int human_num, human_index, i, value;

    printf("人数を入力して下さい ");
    scanf("%d", &human_num);
    if(human_num<=0){
        printf("\n正しい人数を入力してください\n");
        return 1;
    }

    for(human_index=0;human_index<human_num;human_index++){
        printf("%d 人目の交通費を入力してください ", human_index+1);
        scanf("%d", &value);
        if(value<0) value=0;
        for(i=0;i<9;i++){
            money_num[i]+=value/money_kind[i];
            value%=money_kind[i];
        }
    }
    for(i=0;i<9;i++)
        if(money_num[i]>0)
            printf("%5d 円 : %d 枚\n", money_kind[i], money_num[i]);
    return 0;
}
0831デフォルトの名無しさん2007/05/15(火) 03:28:30
[1] 授業単元:プログラミング演習
[2] 問題文(含コード&リンク):
1.英文を入力するとその暗号文が出力されるプログラムの作成
入力:文字列(英文)
出力:文字列(数字)
2.暗号文を元の英文に戻すプログラムの作成
入力:文字列(数字)
出力:文字列(英文)
暗号は換字暗号でよい。[アルファベット(a〜z)、スペースを数字(00〜26)、スペースを対応させる]例a⇔23、b⇔09、c⇔17…
[3] 環境
 [3.1] OS: Linux
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C
[4] 期限: 火曜日の夕方、もしくは水曜日の朝まで
[5] その他の制限: ループ(forやwhile)、配列を使って作成する

ぼるじょあさん、よろしくおねがいします。
0832ぼるじょあ ◆hZ8e4Wjqvw 2007/05/15(火) 09:48:13
>>831
(・3・) エェー マルチポストすんなYO!
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void swap(int *a, int *b){
    int c; c=*a;*a=*b;*b=c;
}
int main(void){ // 1.
    char symbol[]="abcdefghijklmnopqrstuvwxyz ", *ptr;
    int i, moji, num[sizeof(symbol)-1];
    for(i=0;i<sizeof(symbol)-1;i++) num[i]=i;
    for(i=0;i<sizeof(symbol)-1;i++) swap(&num[i], &num[rand()%(sizeof(symbol)-1)]);
    while((moji=getchar())!=EOF){
        ptr=strchr(symbol, moji);
        if(ptr!=NULL)
            ; // ここにある処理を書けYO!
    }
    return 0;
}
int main(void){ // 2.
    char symbol[]="abcdefghijklmnopqrstuvwxyz ";
    int i, moji, num[sizeof(symbol)-1];
    for(i=0;i<sizeof(symbol)-1;i++) num[i]=i;
    for(i=0;i<sizeof(symbol)-1;i++) swap(&num[i], &num[rand()%(sizeof(symbol)-1)]);
    while(scanf("%02d", &moji)>0){
        for(i=0;i<sizeof(symbol)-1;i++)
            if(moji==num[i])
                ; // ここにある処理を書けYO!
    }
    return 0;
}
0833ぼるじょあ ◆hZ8e4Wjqvw 2007/05/15(火) 10:06:46
>>831
(・3・) エェー 少し短くしたYO!
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void swap(char *a, char *b){
    char c; c=*a;*a=*b;*b=c;
}
int main(void){ // 1.
    char symbol[]="abcdefghijklmnopqrstuvwxyz ", *ptr;
    int i, moji;
    for(i=0;i<sizeof(symbol)-1;i++)
        swap(&symbol[i], &symbol[rand()%(sizeof(symbol)-1)]);
    while((moji=getchar())!=EOF){
        ptr=strchr(symbol, moji);
        if(ptr!=NULL)
            ; // ここにある処理を書けYO!
    }
    return 0;
}
int main(void){ // 2.
    char symbol[]="abcdefghijklmnopqrstuvwxyz ";
    int i, moji;
    for(i=0;i<sizeof(symbol)-1;i++)
        swap(&symbol[i], &symbol[rand()%(sizeof(symbol)-1)]);
    while(scanf("%02d", &moji)>0){
        if(moji>=0 && moji<sizeof(symbol)-1)
            ; // ここにある処理を書けYO!
    }
    return 0;
}
08348312007/05/15(火) 17:42:22
ぼるじょあさん、ご返答ありがとうございます。
コンパイラがgccではなく、borlandでした。すいません。
あと一つ目のプログラムを実行したら以下のようなエラーが出てしまいます。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void swap(char *a, char *b)
{
char c; c=*a;*a=*b;*b=c;
}
int main(void){
char symbol[]="abcdefghijklmnopqrstuvwxyz ", *ptr;
int i, moji;
for(i=0;i<sizeof(symbol)-1;i++)
swap(&symbol[i], &symbol[rand()%(sizeof(symbol)-1)]);
while((moji=getchar())!=EOF){
ptr=strchr(symbol, moji);
if(ptr!=NULL);}
 return 0;
}

>bcc32 bo1.c
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
bo1.c:
警告 W8019 bo1.c 17: コードは効果を持たない(関数 main )
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland

なにか解決策は無いでしょうか?
08358312007/05/15(火) 17:44:47
もしくは
#include <stdio.h>
int main(void){
  int  i;
  char a[]={'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'};
  int  b[]={'01','10','11','02','20','22','03','30','33','04','40','44','05','50','55','06','60','66','07','70','77','08','80','88','09','90'};

   printf();
   scanf();

while(){
}
   printf();

 return 0;
}

このプログラムを改良してもらえないでしょうか?
無理を言ってすいません。
0836デフォルトの名無しさん2007/05/15(火) 17:52:25
>>834
いつから「警告」のことを「エラー」と言うようになったのでしょう。
0837デフォルトの名無しさん2007/05/15(火) 17:54:05
>>835
そのプログラムを改良したくても、間違いだらけでコンパイルの通しようもありませんが。
08388352007/05/15(火) 18:12:47
#include <stdio.h>
int main(void){
int; i;
char a[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'};
int b[26]={'01','10','11','02','20','22','03','30','33','04','40','44','05','50','55','06','60','66','07','70','77','08','80','88','09','90'};

printf("01から90までの数字を入力してください:");
scanf("%s", &a);

while(){
}
printf("%s\n", a);

return 0;
}

申し訳ありません。
自力で出来るのがこの程度なのです。
while文のなかの構造や配列の使い方がよくわかりません。
何度もすいません。

>>834
警告とエラーは違うのですね。すいません。
0839デフォルトの名無しさん2007/05/15(火) 18:15:44
>>838
試しに、bの全要素を出力して味噌。ほんとにその数値でいいの?
0840ぼるじょあ ◆hZ8e4Wjqvw 2007/05/15(火) 18:29:38
>>834
(・3・) エェー マルチは嫌いだから
          穴埋め問題にしておいただけだYO!
          でも、レス見る限り解けなさそうだからヒントやるYO!

ヒント
1 の main の穴埋め部分
printf("%02d", ???-???)

2 の main の穴埋め部分
putchar(symbol[???])

???の部分に適当な変数名を当てはめていけばいつか答えにあたるYO!
08418382007/05/15(火) 19:05:53
>>839
はい。bの要素の数値は何でもいいです。
英文字と1対1で対応していればいいです。

>>840
アドバイスありがとうございます。
自分で作ったプログラムもいろいろ考えてみます。
0842デフォルトの名無しさん2007/05/15(火) 19:10:47
>>841
御託並べずに出力してみろ。想定した(自分で書いた積もりの)数値が出力されるか?
0843デフォルトの名無しさん2007/05/15(火) 19:27:22
>暗号は換字暗号でよい。[アルファベット(a〜z)、スペースを数字(00〜26)、スペースを対応させる]例a⇔23、b⇔09、c⇔17…

これは問題文そのまま?
08448382007/05/16(水) 00:33:20
>>843
問題文は
「暗号は最も簡単な暗号:換字暗号でよい。」
です。
「アルファベット(a〜z)、スペースを数字(00〜26)、スペースを対応させる」の部分は
勝手に付け足しました…

>>842
うまくできませんね…。
配列の要素とscanf、printfのなかも変えてやってみます。
0845デフォルトの名無しさん2007/05/16(水) 01:14:47
【質問テンプレ】
[1] 授業単元:C言語実習
[2] 問題文(含コード&リンク):
パソコンに設定されている日付を読み込んで(<time.h>とかかな?)
キーボードから入力される日付と合致しているかしていないかの判断を行う

[3] 環境
 [3.1] OS:WindowsXP
 [3.2] コンパイラ名とバージョン: Borland C++ Compiler 5.5
 [3.3] 言語: C
[4] 期限: 2007年05月17日まで
[5] その他の制限  : 入力されてくる日付はYYYYMMDD方式でも
年月日個別でもどちらのパターンでも構いません
0846デフォルトの名無しさん2007/05/16(水) 01:34:33
>>845 不要なものも入っているから不要なら消しておいて
#include <time.h>
#include <stdio.h>
#include <stdlib.h>

int main(void) {
struct tm *date;
time_t now;
int year, month, day;
int hour, minute, second;

int iy,im,id; // 入力で受け付ける年月日
char buf[10];

printf("年月日を入力\n");
printf("年 > ");
scanf("%s",buf);
iy=atoi(buf);
printf("月 > ");
scanf("%s",buf);
im=atoi(buf);
printf("年 > ");
scanf("%s",buf);
id=atoi(buf);
0847846の続き2007/05/16(水) 01:35:15


/* 現在の日時を取得 */
time(&now);
date = localtime(&now);

year = date->tm_year + 1900;
month = date->tm_mon + 1;
day = date->tm_mday;

hour = date->tm_hour;
minute = date->tm_min;
second = date->tm_sec;

printf("入力された年月日 : %d / %d / %d \n",iy,im,id);
printf("現在 : %d / %d / %d \n",year,month,day);
printf("%2d : %2d : %2d \n",hour,minute,second);

if(iy==year && im==month && id==day)
printf("一致\n");
else printf("不一致\n");
return 0;
}
08488442007/05/16(水) 01:44:39
#include <stdio.h>
int main(void){

int a,b;
char eigo[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'};
int suuji[26]={1,10,11,2,20,22,3,30,33,4,40,44,5,50,55,6,60,66,7,70,77,8,80,88,9,90};

for( a=0; a<26; a++ )
{
printf("test0[%d] = %c\n", a, eigo[a]);
}

for( b=0; b<26; b++ )
{
printf("test1[%d] = %d\n", b, suuji[b]);
}

return 0;
}
--------------------------
これで思うような出力が出来たのですが、
これを1対1で対応させて暗号とするにはどうしたらよいのでしょうか?
アドバイスください。ぼるじょあさんのは難しくて理解できませんでした。
せっかく答えていただいたのに申し訳ありません。
0849デフォルトの名無しさん2007/05/16(水) 03:18:41
換字式暗号だと、配列は1つでいいだろ。
0850デフォルトの名無しさん2007/05/16(水) 03:26:46
>>848
向こうのスレに答えがあるようだけど。
■ このスレッドは過去ログ倉庫に格納されています