トップページ⇒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/
0730デフォルトの名無しさん2007/04/26(木) 10:36:49
>>729
ぼるじょあはゆとり世代中卒ニート旋盤工
0731デフォルトの名無しさん2007/04/26(木) 11:23:16
こんにちは、はじめまして!
C初心者です。

最近、授業の課題で
「適当なソースファイルを読み込んでステップ数を数えて表示」
という宿題が出されたのですが、
C言語にステップ数を数える関数とかあるんですか?
それか、実行ステップ数だけ何か計算で数えるものなのでしょうか?

教えていただけたら助かります。よろしくお願いいたします。
0732デフォルトの名無しさん2007/04/26(木) 12:06:41
改行文字を数える
0733デフォルトの名無しさん2007/04/26(木) 14:15:20
[1] 授業単元:プログラミング演習
[2] 問題文(含コード&リンク):fftを作成することです。
[3] 環境
 [3.1] OS:Linux
 [3.2] gcc
 [3.3] 言語:C
[4] 期限: 5月1日くらいまでに教えていただけたら幸いです。
[5] その他の制限:以下のソースを使って作るように指示されました。
#include<stdio.h>
#include<stdlib.h>
#include <math.h>
#include "fft.h"
07347332007/04/26(木) 14:16:34
static int ibitr(int, int);

int fft(double *xreal, double *ximag, int n, int nu)
{
int n2, nu1;
int l, i, p;
int k, k1, k1n2;

double arg, c, s;
double treal, timag;

xreal--; /* 配列の添え字を1からにする */
ximag--;

n2 = n / 2;
nu1 = nu - 1;
k = 0;

for(l = 1; l <= nu; l++) {
loop: ;
07357332007/04/26(木) 14:18:09
for(i = 1; i <= n2; i++) {
p = ibitr((int)(k / pow(2, nu1)), nu);
/* printf("%d, %d\n", p, k); */
arg = 2 * PAI * p / (double) n;
c = cos(arg);
s = sin(arg);
k1 = k + 1;
k1n2 = k1 + n2;
treal = xreal[k1n2] * c + ximag[k1n2] * s;
timag = ximag[k1n2] * c - xreal[k1n2] * s;
xreal[k1n2] = xreal[k1] - treal;
ximag[k1n2] = ximag[k1] - timag;
xreal[k1] += treal;
ximag[k1] += timag;
k++;
}
07367332007/04/26(木) 14:19:04

k += n2;
if (k < n) goto loop;
k = 0;
nu1--;
n2 /= 2;
}
for(k = 1; k <= n; k++) {
i = ibitr(k-1, nu) + 1;
if ( i <= k) continue;
treal = xreal[k];
timag = ximag[k];
xreal[k] = xreal[i];
ximag[k] = ximag[i];
xreal[i] = treal;
ximag[i] = timag;
}
return 0;
}

07377332007/04/26(木) 14:19:40
static int ibitr(int j, int nu)
{
int i;
int j1, j2, r;

j1 = j;
r = 0;

for ( i = 1; i <= nu; i++) {
j2 = j1 / 2;
r *= 2;
r += j1 - 2 * j2;
j1 = j2;
}
return r;
}
すみませんが、お願いします。
0738デフォルトの名無しさん2007/04/26(木) 19:11:52
>>726
> >>724
> これでどう?
> g++ -Wall -g -o TEST test.cpp hoge.cpp

遅レスですいません
ありがとうございました
g++ではなくgccでコンパイル通って実行出来ました
0739デフォルトの名無しさん2007/04/27(金) 11:30:29
>>732様
ありがとうございます、やはり改行文字を数えるんですね。
でも、それがちょっとわからなくて…\nを数えるということでしょうか?
改行文字が他にあるのですか?
0740デフォルトの名無しさん2007/04/27(金) 11:34:37
>>739
バッファを長めにとって、fgets()を何回呼べるかで代用するのが簡単だよ。
0741デフォルトの名無しさんNGNG?2BP(222)
>>740
char buf[1024];
int count=0;
while(fgets(buf,1024,stdin)!=EOF){if(buf[1023]=='\n'){count++;}}
結局改行を数えることになる。
07427402007/04/27(金) 14:54:50
>>741
それだと、最終行に改行が無いときに困る。
#その涛_では単純にfgetc()で改行文字を数えても同様。
1行が1023文字以内ならば、>741のif文を省略できるという魂胆。
つーか、エディタでラップアラウンドした表示行を数えるイメージだがね。
0743デフォルトの名無しさんNGNG?2BP(222)
訂正
fgetsを使う場合
#include<stdio.h>
#include<string.h>
int main(){char buf[1024];int len,count=0;
while(fgets(buf,1024,stdin)!=NULL){if(buf[strlen(buf)-1]=='\n'){count++;}}return 0;}

使わない場合
#include<stdio.h>
int main(){int c,count=0;while((c=fgetc(stdin))!=EOF){if(c=='\n'){count++;}}return 0;}

どう見てもfgets使わない方が簡単です。
0744デフォルトの名無しさんNGNG?2BP(222)
>>742
fgetsを使う場合
#include<stdio.h>
#include<string.h>
int main(){char buf[1024];int len,count=0;
while(fgets(buf,1024,stdin)!=NULL){if((len=strlen(buf))<1023){count++}else{
if(buf[strlen(buf)-1]=='\n'){count++;}}}return 0;}

使わない場合
#include<stdio.h>
int main(){int c,count=0,l=0;while((c=fgetc(stdin))!=EOF){l++;if(c=='\n'){count++;l=0;}}
if(l){count++;}return 0;}

やっぱりfgets使わない方が簡単です。
07457402007/04/27(金) 15:24:54
>>744
自説に固執して本質を見失っている。
fgets()版は最低限これだけ。
char buf[1024];
int count = 0;
while (fgets(buf, sizeof(buf), stdin) != NULL) ++count;
fgetc()版だとこうなる。
int ch;
int count = 0;
while ((ch = fgetc(stdin)) != EOF) if (ch == '\n') ++count;
この状態で、fgets()版は長い行の扱いの問題があり、fgetc()版は最終行の問題がある。
どちらの方がましかということで、後はもう、ケースバイケースでしょう。
0746デフォルトの名無しさんNGNG?2BP(222)
>>745
>fgets()版は最低限これだけ。

仕様を満たしていないので論外。

>この状態で、fgets()版は長い行の扱いの問題があり、fgetc()版は最終行の問題がある。

等価でないコードを比べて何をしようってんだ?
>>744で挙げたコードにはどちらの問題も存在しない。もちろん完全に等価なコードだ。
07477402007/04/27(金) 15:52:35
仕様をでっち上げておいて満たすも何も無いもんだが……
まぁいいや、宿題スレ常駐のあんたに反論した私が悪かった。
少なくともfgets()版はfgetc()版ほど簡単じゃないと言うことで。
0748デフォルトの名無しさんNGNG?2BP(222)
仕様は何でもいいんだけどさ。比較対象同士で一致していれば。
同じ入力に対して出力が違うものをふたつ並べて、どっちが簡単かなんて言っても
全然意味無いだろ。
0749依頼者2007/04/27(金) 18:19:42
[1] 授業単元:Cプログラミング演習
[2] 問題文(含コード&リンク):
(1)30個の要素を持つ配列に小数をキーボードから代入し
それらを小さい順にソートし、その結果をモニターに
出力するプログラムの作成。 
(2)1から100までの整数のうち素数を求めるプログラムの作成。
[3] 環境:
 [3.1] OS: Windows XP
 [3.2] コンパイラ名とバージョン: Visual Studio.net
 [3.3] 言語: C
[4] 期限: 4月30日まで。

素人でも書けそうなプログラムでよろしくお願いします。
0750デフォルトの名無しさんNGNG?2BP(222)
>>749
(2)
#include<stdio.h>
int prime[]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,};
int main(){for(int i=0;i<(sizeof(prime)/sizeof(int));i++){printf("%i\n",prime[i]);}return 0;}
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;
}
■ このスレッドは過去ログ倉庫に格納されています