C/C++の宿題を片付けます 44代目

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
――【注意点】―――――――――――――――――――――――――
・質問は必ず【質問テンプレ】に従ってください。
・問題文は、解いてもらう方にわかりやすいように全文を書きましょう。
・計算問題は必ず数式をあげ、どのような計算をするのか詳しく説明してください。
・エラーは、その詳細と発生した行を書きましょう。エラーメッセージはコピペしてください。
・後から問題に付け足しするのはやめましょう。解いてもらっている方に失礼です。
・複雑なAAはスレが荒れたり問題が埋もれる原因になりますので使用を控えてください。
―――――――――――――――――――――――――――――――

【質問テンプレ】
[1] 授業単元:
[2] 問題文(含コード&リンク):
[3] 環境
 [3.1] OS:Windows/Linux/等々
 [3.2] コンパイラ(バージョン):
 [3.3] 言語:C/C++/どちらでも可 のいずれか
[4] 期限:yyyy年mm月dd日hh:mmまで または 無期限 のいずれか
[5] その他の制限:どこまで習っているか、等々

【アップローダー==ラウンジ】(質問が長い時はココ使うと便利 回答者もコードが長ければここに)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm

【前スレ】
C/C++の宿題を片付けます 43代目
http://pc8.2ch.net/test/read.cgi/tech/1115794784/

【歴代スレは>>2-13
2デフォルトの名無しさん:2005/05/24(火) 14:55:55
3デフォルトの名無しさん:2005/05/24(火) 14:56:19
4デフォルトの名無しさん:2005/05/24(火) 14:56:40
5デフォルトの名無しさん:2005/05/24(火) 14:58:29

でも、どこまで習ってるかなんて必要かなぁ
6デフォルトの名無しさん:2005/05/24(火) 15:05:28
後ヅケで「while文じゃなくてfor文で〜」とか言われるのイヤだからな。
ま、もっともそういう奴はテンプレなんか読んじゃいないし、
自分の使っている環境もろくに判ってないワケだが・・・。
7↓どこがおかしい?:2005/05/24(火) 16:24:45
#include <stdio.h>

void main(void)
{
int kazu;

kazu=1;
scanf("%d\n",&kazu);
while(kazu<50)
{

printf("%d\n",&kazu);
kazu=kazu+1;

}
を実行して、1と2を入力したら、
1
2
1245052
1245052
1245052
1245052
.
.
.
と出てきた。

ちなみにMicrosoft Visual C++(Win32?)使用。
  


8デフォルトの名無しさん:2005/05/24(火) 16:28:17
>>7
mainの"}"が(ry

printf("%d\n",&kazu);
9デフォルトの名無しさん:2005/05/24(火) 16:29:02
>>7
void main(void)
printf("%d\n",&kazu);
ここ。
10↓どこがおかしい?:2005/05/24(火) 16:29:53
ありがとうございました。
11デフォルトの名無しさん:2005/05/24(火) 16:32:13
>>7
・void main(void)は間違い。
・scanf("%d\n",&kazu);の\nは冗長。
・printf("%d\n",&kazu);の&kazuは間違い。
・中括弧の対応があっていない。
12デフォルトの名無しさん:2005/05/24(火) 16:34:50
void main(void)ってなんでだめなの?
137:2005/05/24(火) 16:35:26
なんでだろう・・
14デフォルトの名無しさん:2005/05/24(火) 16:38:24
mainはintと仕様で決まっている。
15デフォルトの名無しさん:2005/05/24(火) 16:38:53
>>12
規格に則ってないから。
16デフォルトの名無しさん:2005/05/24(火) 16:40:57
>>6
テンプレ読めといえば一旦は片付くのかも。

情報の後だし禁止は入れてほしい。
あと、その後どうなったかもできれば報告してほしいなー。
17デフォルトの名無しさん:2005/05/24(火) 16:44:05
Q 【void main(void)】
 main の型を void で定義したら先輩に怒られた。

 ANSI Cでは main 関数の型は int と決められています。 void とするのは間違いです。
 にも関らず、ある種の参考書には main の型を void として説明しているようです。
 また、初心者に限らず熟練したプログラマーがこのように書くことが珍しくありません。
 このため、特に初心者のプログラマーは何も考えずに(あるいは特に決まった値を戻す必要がないと思って)
 main の型を void にしてしまうことがありますが、ネットではこれは非難の対象になりがちです。

ttp://www.st.rim.or.jp/~phinloda/cqa/cqa6.html
18デフォルトの名無しさん:2005/05/24(火) 16:45:22
>>16
後だし禁止って、全文書けって事じゃないのか?
197:2005/05/24(火) 16:46:17
↑超初心者には分かりません(T_T)
20デフォルトの名無しさん:2005/05/24(火) 16:51:57
>>19
日本語も読めないのか?どこの国の人間だよ
21デフォルトの名無しさん:2005/05/24(火) 16:52:44
>>7
Cを勉強したいならコッチへ
【初心者歓迎】C/C++室 Ver.17【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1115958601/
227:2005/05/24(火) 16:53:15
>>19>>17に対してです
23デフォルトの名無しさん:2005/05/24(火) 16:53:52
>>20
「関数の型」ってのが分からないんだと思うぞ
24デフォルトの名無しさん:2005/05/24(火) 16:54:14
>>22
だから、日本語も読めないのかと聞いている。
2516:2005/05/24(火) 16:56:06
>>後から問題に付け足しするのはやめましょう。解いてもらっている方に失礼です
書いてあったな。すまん。
26デフォルトの名無しさん:2005/05/24(火) 17:16:49
【質問テンプレ】
[1] 授業単元: プログラミング1
[2] 問題文:
■■ネットワークプログラミング■■

2台のマシン(tokiとken)でソケットを用いた通信を行ってもらいます.
以下に送信側と受信側の動作を説明します.

・送信側
アルファベットのみで構成された文字列を1文字ずつ読み込みます(任意のファ
イルから文字列を読み込んでもよい).
そして,シーケンス番号と共に構造体に格納し,ソケットを用いて受信側に
送信する.
 
・受信側
  受信したデータををAckとして,シーケンス番号と受信した文字を変換した
  小文字なら大文字に,大文字なら小文字に)文字を構造体に格納し,送信側へ
  送信する.

送信側では,受信用プロセスと,送信用プロセスを用意してください.
通信には,UDPを用い,ポート番号は1万+学籍番号の下3桁(10111など)と
 2万+学籍番号の下3桁(20111など)を使ってください.


[3] 環境
 [3.1] OS: Linux
 [3.2] コンパイラ(バージョン):gcc
 [3.3] 言語:C
[4] 期限:5月26日まで

よろしくお願いします。
27デフォルトの名無しさん:2005/05/24(火) 17:18:23
>>26
前スレをちゃんと読め。それとも回答者はシカトか?
28デフォルトの名無しさん:2005/05/24(火) 17:19:07
>>26
最低だな
29前スレ193:2005/05/24(火) 17:25:57
できん。困った。
30デフォルトの名無しさん:2005/05/24(火) 17:38:21
[1] 授業単元:C言語
[2] 問題文: 自然数nを入力して受け付けて、さらにn個の整数を入力として
受け付ける。入力として受け付けたn個の整数を、受け付けた順とは逆順に
出力せよ。ただし、n>=0、n<=256であることを仮定してよい。
[3] 環境
 [3.1] OS:WinXP
 [3.2] コンパイラ(バージョン):VC++
 [3.3] 言語:C++
[4] 期限:今日中にどうかよろしくおねがいします。

初歩的な問題で申し訳ありません。
31デフォルトの名無しさん:2005/05/24(火) 17:43:42
>>30
#include <stdio.h>

int main(void)
{
int a[255],i=0,n=0;
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
for(i=n-1;i>=0;i--){
printf("%d",a[i]);
}
return 0;
}
3231:2005/05/24(火) 17:45:10
ごめん。訂正
×:int a[255],i=0,n=0;
○:int a[256],i=0,n=0;

>>30
あと、細かい部分は自分でやってね
33デフォルトの名無しさん:2005/05/24(火) 17:46:17
>>31
オチツケ。
a[256]じゃないとマズかろう。
34デフォルトの名無しさん:2005/05/24(火) 17:50:03
>>32
すばやい回答をありがとうございました。
すごく助かりました。
35デフォルトの名無しさん:2005/05/24(火) 17:55:26
>>30
#include <stdio.h>
#include <stdlib.h>

void print(int n)
{
if (n) {
int val;
scanf("%d", & val);
print(n - 1);
printf("%d\n", val);
}
}

int main()
{
int n = 0;
scanf("%d", & n);
print(n);
return 0;
}
36デフォルトの名無しさん:2005/05/24(火) 18:01:17
>>35
とりあえずもちつけ
37デフォルトの名無しさん:2005/05/24(火) 18:10:27
>>36
再起が使いたい年頃なのさ。目を瞑ってやれ。
38デフォルトの名無しさん:2005/05/24(火) 18:23:26
再帰を使わなくていい所に無理矢理再帰を使う香具師は、
自分の精液でも飲んでろってこった。
39デフォルトの名無しさん:2005/05/24(火) 18:24:11
>>38
再帰的なオナニー?
40デフォルトの名無しさん:2005/05/24(火) 18:41:13
再帰より普通のループにした方が早いんじゃないか?
while(1)
{
semen = onane(side_dish);
drink(semen);
}
41デフォルトの名無しさん:2005/05/24(火) 18:48:31
>>38
再帰版の一つのメリットはサイズの制限がスタックにのみ依存することだがね。
>35は別に無理矢理とは思わないけどなぁ。
#再帰的発想方法ができない人には辛かろうが、そうでない人には自然な発想だと思うし。
42デフォルトの名無しさん:2005/05/24(火) 18:48:42
void my_life(void)
{
   while(1){
      if(rand()%3==1)
         ona(2D_onechan);
      else if(rand()%3==2)
         ona(2D_imouto);
      else
         ona(3D_youjo);
   }
}
43デフォルトの名無しさん:2005/05/24(火) 18:49:21
[1] 授業単元: プログラミング実習
[2] 問題文(含コード&リンク): 1以上100以下の整数のうち2または7の倍数であるが、
               3の倍数ではない数を出力し、いくつあるか数える
               プログラムを作成しなさい。また出力は5個ごとに
               改行すること。
[3] 環境
 [3.1] OS:Linux
 [3.2] コンパイラ(バージョン):gcc
 [3.3] 言語:C
[4] 期限:2005年5月29日
[5] その他の制限: for を使うところまで一応習いました

まだまだド素人ですが教えていただけるとうれしいです。
44デフォルトの名無しさん:2005/05/24(火) 18:51:15
>>41
テラワロスwww
45デフォルトの名無しさん:2005/05/24(火) 19:02:07
>>43
#include<stdio.h>
int main(){
    int i,j=0;
    for(i=0;i<100;i+=7){
        if(i%3 != 0){
            printf("%d",i);
            if(++j%5==0)printf("\n");
            else printf(" ");
        }
    }
    return 0;
}
46デフォルトの名無しさん:2005/05/24(火) 19:06:30
>>45
なんか違うような希ガス
47デフォルトの名無しさん:2005/05/24(火) 19:07:15
>>43
数えた結果は出力しろとはかかれていないが一応出力してみた。
#include <stdio.h>
#include <stdlib.h>

int main()
{
int ic;
int cnt = 0;
for (ic = 1; ic <= 100; ++ic) {
if ((ic % 2 == 0 || ic % 7 == 0) && ic % 3 != 0) {
++cnt;
printf("%d", ic);
putchar(cnt % 5 == 0 ? '\n' : ' ');
}
}
printf("\n%d\n", cnt);
return 0;
}
これは再帰で書きようがないだろうなぁ。
4845:2005/05/24(火) 19:07:17
問題文思いっきり読み違えた

#include<stdio.h>
int main(){
    int i,j=0;
    for(i=1;i<=100;++i){
        if((i%2==0 || i%7==0) && i%3!=0){
            printf("%d",i);
            if(++j%5==0)printf("\n");
            else printf(" ");
        }
    }
    return 0;
}
4945:2005/05/24(火) 19:08:46
ていうか一番肝心なカウントするのを忘れてた。orz
50デフォルトの名無しさん:2005/05/24(火) 19:09:58
>>49
カウントはしてるじゃん。カウントはw
51デフォルトの名無しさん:2005/05/24(火) 19:15:22
>>41
スタックって小さいよ。ヒープとかの方がずっと大きい。
出題者もたぶん再帰を使って書くのは意図していないと思う。最大入力数に制限をつけているあたり。

それにC/C++では再帰はあまり使われないから、いざ使うとなるとみんな珍しがる。(んで異質だから叩くと)
52デフォルトの名無しさん:2005/05/24(火) 19:21:45
たたきはせんが。
スタックサイズが環境依存だからなぁ。
でかい配列も関数内ではとりずらい。
(いや、マニュアル読めってのは当然だが)
53デフォルトの名無しさん:2005/05/24(火) 19:23:51
別に珍しくはないと思うが...
簡単にクイックソートを実装したいときに使うし。
54デフォルトの名無しさん:2005/05/24(火) 19:34:35
今回の場合、問題文からして配列を使う様に示唆されているのだから再起を使う必要性はない。
再起を使用して然るべき問題ならば誰も何も言いはせぬ。
55デフォルトの名無しさん:2005/05/24(火) 21:24:20
>>47
#include <stdio.h>

void f(int i, int n) {
 if (i == 300)
  printf("\n%d\n", n);
 else {
  int j = i % 100;
  if ((j % 2 || j % 7 == 6) && j % 3 != 2)
   printf("%d%c", j + 1, ++n % 5 ? ' ' : '\n');
  f(i + 3, n);
 }
}

int main() {
 f(0, 0);
 return 0;
}
56デフォルトの名無しさん:2005/05/24(火) 23:10:41
>>43
もう回答はでてるのでわかり易さを重視してみた。
#include <stdio.h>
#define NumMax (100)
#define LFN (5)
int main(){
    char Num[NumMax+1];
    int i,j=0; 
    for(i=0;i<=NumMax;i++){
        Num[i]=0;
    }
    for(i=0;i<=NumMax;i +=2){
        Num[i]=1;
    }
    for(i=0;i<=NumMax;i +=7){
        Num[i]=1;
    }
    for(i=0;i<=NumMax;i +=3){
        Num[i]=-1;
    }
    for(i=0;i<=NumMax;i++){
        if(Num[i]==1){
            printf("%3d ",i);
            if(j % LFN == LFN-1){
                printf("\n");
            }
            j++;
        }
    }
    printf("\n");
    return 0;
}
57デフォルトの名無しさん:2005/05/25(水) 01:49:58
〔1〕授業単元
情報処理概論T
〔2〕問題文(含コード&リンク)
秒単位で表現された時間をよみこみ、時間、分、秒の単位に変換して
結果を出力するプログラムを作りなさい
3] 環境
 [3.1] OS:Windows
 [3.2] コンパイラ(バージョン):gcc
 [3.3] 言語:C
[4] 期限:2005年5月30日まで
[5] その他の制限:whileを途中まで習いました

初歩的ですみません;どうぞよろしくお願いします。
58デフォルトの名無しさん:2005/05/25(水) 01:54:02
>>57
その秒とは1970年1月1日00:00:00からの経過時間か?
よみこむってどこから?
59デフォルトの名無しさん:2005/05/25(水) 02:03:40
>>57
こういうことかい?
6059:2005/05/25(水) 02:04:00
間違って書き込みを…
#include <stdio.h>
int main(void) {
    int t, h, m, s;
    printf("input time:"); scanf("%d", &t);
    h = t / 3600; t -= h * 3600;
    m = t / 60; t -= m * 60;
    s = t;
    printf("%dh %dmin %dsec", h, m, s);
    return 0;
}
61デフォルトの名無しさん:2005/05/25(水) 09:00:42
[1] 授業単元: プログラミング言語
[2] 問題文:

適当な英単語がいくつか入っているchar型の2次元配列を作って、
それがローマ字であればそのままで、ローマ字以外であればNULLで埋めて別の配列に入れる。例えば…
word[0]="nagoya"→そのままout[0]へ
word[1]="this"→thiまではいいがsが適合しないので消してout[1]へ
word[2]="pen"→そのままout[2]へ
という具合です。よろしくお願いします。

[3] 環境
 [3.1] OS:Linux
 [3.2] コンパイラ:gcc
 [3.3] 言語:C
[4] 期限:今週中
[5] その他の制限:ポインタ習ってません。
6261:2005/05/25(水) 09:11:42
× word[1]="this"→thiまではいいがsが適合しないので消してout[1]へ
○ word[1]="this"→thiまではいいがsが適合しないので全て消してout[1]へ

の間違いでした。なおローマ字表は
http://www.tax-pro.co.jp/u-mas/roman.htm
です。ただ数が多いので一部を示していただけるだけでもちろん充分です。
6361:2005/05/25(水) 09:22:24
続けて申し訳ありません。
格納する際、英文字のままでなくローマ字規則に従って日本語化ってできますか?
できるならその方がありがたいです。
64デフォルトの名無しさん:2005/05/25(水) 09:28:40
>>61
それ、真面目に考えるとかなりめんどいぞ。
・word[1]を消すのではなく、out[1]をナル文字で埋めればいいのかな?
・'の扱いはどうする?
・促音はどこまで許容?
・ポインタを習っていないと言うが、ポインタの概念なしに配列操作はできないのだが。
・例えばsprintf(), strcpy()などは使っていいのか悪いのか。

まぁ、真面目に解析するとかなに置き換える一歩手前まで作らなきゃならんからカナ化はできるだろうけど。

いずれにしても、ただの宿題じゃないだろ、それ。
6561:2005/05/25(水) 09:40:44
・word[1]を消すのではなく、out[1]をナル文字で埋めればいいのかな?
そうです。wordを元にoutをいじっていくことになります。分かり辛く申し訳ないです。

・'の扱いはどうする?
う〜ん…ややこしいのでないことにしてください。>>61の例文の範囲でお願いします。

・促音はどこまで許容?
ぎゃ(gya)は使っても、ゃ(xya)を単独でローマ字として使うことは一般的にありませんので、
ぁぃぅぇぉ等は省けます。

・ポインタを習っていないと言うが、ポインタの概念なしに配列操作はできないのだが。
関数を使うとして、入力配列も出力配列も関数に読み込むことで操作できませんか?
word[0][0]=out[0][0]で一文字ずつ読み込むとかで…

・例えばsprintf(), strcpy()などは使っていいのか悪いのか。
現知識では分かりませんが、stdio.h等に初めから入っている関数でしょうか?
それでしたらOKです。

宿題というか、実験の一部になります。とりあえず大学行ってきます。
もしお時間がありましたらどうぞよろしくお願いします。
66デフォルトの名無しさん:2005/05/25(水) 10:33:42
いや、拗音じゃなくて促音をね……
元々余りなかったやる気がさっぱり失せた…
67デフォルトの名無しさん:2005/05/25(水) 10:49:11
>>47
>>56
丁寧な解答ありがとうございました。
これからがんばって勉強します。
68デフォルトの名無しさん:2005/05/25(水) 11:22:19
>>61
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.cgi?mode=thr&no=31
の123
こんなもんでいけるだろ。後は自分で理解しろ。
69デフォルトの名無しさん:2005/05/25(水) 11:44:46
うーん。ポインタ使うなっちゅーのはツライのぉ。
/* ローマ字→カナ変換テーブル */
/* char *roma2kana_tb[][2]とかやりたいが・・・ */
char roma2kana_tab[][2][10] = {
/* ローマ字のつづりの長い順で書く */
{ { "gya", "ぎゃ" } },
{ { "ka", "か" } },
{ { "a", "あ" } },
};

/* ローマ→かな変換 ローマ字(in)からかな(out)へ。
文字列全部を変換できればゼロを、つづりがヘンなら非ゼロを返す。
outは十分な大きさを持っていること。効率は重視していない。
バグ:inが長さ0のとき、引数がNULLのときの対処はしていない。
*/
int roma2kana(char *in, char *out)
{
  while (*in) {
    int i;
    for (i = 0; i < sizeof(roma2kana_tab) /sizeof(roma2kana_tab[0]); i++)
      if (strncmp(in, roma2kana_tab[i][0], strlen(roma2kana_tab[i][0])) == 0)
        goto FOUND;
    return -1; /* 見つからなかった */
  FOUND:
    strcpy(out, roma2kana_tab[i][1]);
    in += strlen(roma2kana_tab[i][0]); /* ここ、ポインタ使ってるよねぇ・・・えらい人たすけて */
    out += strlen(roma2kana_tab[i][1]);
  }
  return 0;
}
70デフォルトの名無しさん:2005/05/25(水) 11:54:08
大学の単位でポインタが分らないとか、もうネタの領域だろ。
教授が教えてくれるまで待っているつもりか?
自分で調べようとはしないのか?
高校生じゃねぇんだから、甘ったれるなと。
71デフォルトの名無しさん:2005/05/25(水) 12:01:54
>>981
>>984
>>986
ありがとうございます。しかっり見ないでまた書き込みました。
すいません。

72デフォルトの名無しさん:2005/05/25(水) 12:03:44
【質問テンプレ】
[1] 授業単元:シミュレーション
[2] 問題文(含コード&リンク):
二人のプレイヤーABが交互に四個ずつ将棋の駒を転がし、1000点を目指し競う。
表裏になれば1点、横になれば5点、縦になれば10点、逆立ちすれば20点の得点で
それぞれの確率は表40%、裏40%、横10%、縦6%、逆立ち4%である。
一回の勝負毎にどちらが勝ったかを表示させ何回で勝負がついたか、その時ABの得点はそれぞれいくらかも表示させる

[3] 環境
 [3.1] OS:xp
 [3.2] コンパイラ(バージョン):gcc
 [3.3] 言語:C
[4] 期限:明日
お願いします。
73デフォルトの名無しさん:2005/05/25(水) 12:09:42
[1] 授業単元:プログラミング基礎
[2] 問題文(含コード&リンク):
型tの二つの引数を交換するマクロswap(t,x,y)を定義しなさい。
このマクロはブロック構造を使い、swap(double,one,two)に対して,
以下のような出力が得られるものとする。
Cのコンパイラgccは-Eオプションを付けてソースファイルをコンパイルすると
プリプロセッサの処理までを行い、
結果を標準出力に出力する。
これを利用して正しく展開されることを確かめなさい。
{
double temp;
temp = one;
one = two;
two = temp;
}
[3] 環境
 [3.1] OS:Linux
 [3.2] コンパイラ(バージョン):gcc なのか。。。?
 [3.3] 言語:C
[4] 期限:5月27日10時まで
74デフォルトの名無しさん:2005/05/25(水) 12:21:00
#if 0
>>73
#endif
75デフォルトの名無しさん:2005/05/25(水) 12:21:58
>>73
#define swap(t, x, y) \
{\
t temp;\
temp = x;\
x = y;\
y = temp;\
}

/* 別にプリプロセッサの確認だけならmain作らんでもよかろ */
swap(double, one, two)
76デフォルトの名無しさん:2005/05/25(水) 12:49:02
>>61
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/461.c

面白かったから、kan'inやthimpoにも対応してみた。
77デフォルトの名無しさん:2005/05/25(水) 12:50:22
>>70
俺は61じゃないけど…大卒にコンプレックスでもあるのか?お前
7876:2005/05/25(水) 12:54:51
ちょっとミスってた。
・#include <string.h>を追加
・mainの定義をint main(void)...に変更
でよろしく。
79デフォルトの名無しさん:2005/05/25(水) 13:03:19
あー・・・大学出ても、できんやつは出来ん。>>70
学ぶ気力などないわ。
80デフォルトの名無しさん:2005/05/25(水) 13:05:57
【質問テンプレ】
[1] 授業単元:プログラミングT
[2] 問題文(含コード&リンク):逐次検索のプログラムを作りなさい。
[3] 環境
 [3.1] OS:Windows XP
 [3.2] コンパイラ(バージョン):Microsoft Visual C++ 6.0
 [3.3] 言語:C
[4] 期限:2005年5月25日20:00まで
[5] その他の制限:下に自分が考えたプログラムとエラーメッセージを
載せますので、どこを直せばよいかお教えください。お願いします。

8170:2005/05/25(水) 13:07:18
>>77
コンプレックスか・・・そうだな。あるな。
ちゃんと大学卒業してきてプログラムの単位まで取っている奴に
なんで typedef から教えなくちゃならんのかと・・・。
82デフォルトの名無しさん:2005/05/25(水) 13:09:26
>>70なんて当たり前のことなのに
どうしてコンプレックスなんて単語が
でてくるんだろう…
8344代26前スレ958、:2005/05/25(水) 13:10:57
>>981
>>984
>>986

>>実行形式をsender, receiver, reflectorにlnして実行。
>>sender, seceiverがtoki, reflectorがkenな。

実行形式をlnしてっどうゆうことですか?
プログラム2つ必要ではないのですか?
8480:2005/05/25(水) 13:11:03
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define rnd() (1.0 / (RAND_MAX + 1.0)) * rand() * 10
#define X 7
#define DATA 100
#define NOT_FOUND -1
typedef int keytype;

int seqsrch2(keytype X, keytype a[ ], int m, int n);
void showdata(int a[ ], int size);
8580:2005/05/25(水) 13:11:38
int main(void)
{
int i;
int d[DATA];

int y;

srand((unsigned) time(NULL));

for (i = 0; i < 5; i++)
{
d[i] = rnd();
}

printf("配列の中身:");
showdata(d, 5);

printf("探索対象:%d\n", X);

printf("探索結果:");
y = seqsrch2(X, d, 0, 6);
if (y != -1)
printf("%d は %d 番目にあります。\n", X, y + 1);
printf("%d はありません。\n", X);
}
8680:2005/05/25(水) 13:12:10
int seqsrch2(keytype X, keytype a[ ], int m, int n)
{
if (m > n)
return NOT_FOUND;
a[n + 1] = X;
while (a[m] != X)
m++;
if (m <= n)
return m;
return NOT_FOUND;
}

void showdata(int a[ ], int size)
{
int i;

for (i = 0; i < size; i++)
{
printf("%d " , a[i]);
}
printf("\n\n");
}
8780:2005/05/25(水) 13:12:47
D:\tikuji.c(11) : error C2143: 構文エラー : ')' が 'constant' の前に必要です。
D:\tikuji.c(11) : error C2143: 構文エラー : '{' が 'constant' の前に必要です。
D:\tikuji.c(11) : error C2059: 構文エラー : ''
D:\tikuji.c(11) : error C2059: 構文エラー : ')'
D:\tikuji.c(25) : warning C4244: '=' : 'double ' から 'int ' に変換しました。データが失われているかもしれません。
D:\tikuji.c(34) : warning C4013: 関数 'seqsrch2' は定義されていません。int 型の値を返す外部関数と見なします。
D:\tikuji.c(40) : error C2143: 構文エラー : ')' が 'constant' の前に必要です。
D:\tikuji.c(40) : error C2143: 構文エラー : '{' が 'constant' の前に必要です。
D:\tikuji.c(40) : error C2059: 構文エラー : ''
D:\tikuji.c(40) : error C2059: 構文エラー : ')'

どうかお願いします。
88デフォルトの名無しさん:2005/05/25(水) 13:19:58
>>82
宿題丸投げスレのここで説教垂れてる>>70が滑稽だからだろ。
89デフォルトの名無しさん:2005/05/25(水) 13:20:34
>>80
int seqsrch2(keytype X, keytype a[ ], int m, int n);
のXはマクロで既に定義されてあるので、変数としては使えない。
90デフォルトの名無しさん:2005/05/25(水) 13:22:56
[1] 授業単元:プログラミング基礎
[2] 問題文(含コード&リンク):
>>73
上記の問題で定義したマクロは、引数にtempswap(double,temp,temp1)
に対しては正しいプログラムとはならない。
このような場合でも正しいプログラムに展開されるようにマクロの定義を
変更しなさい。(##を使用する。)
[3] 環境
 [3.1] OS:Linux
 [3.2] コンパイラ(バージョン):gcc ?
 [3.3] 言語:C
[4] 期限:5月27日10時まで
91デフォルトの名無しさん:2005/05/25(水) 13:24:47
/* >>72 */
#include <stdio.h>
#include <stdlib.h>

/* [0,1)の乱数 */
double random(void) { return rand() / (MAX_RAND + 1.0); }
/* 確率に従い得点を求める */
int point(void) {double r = random(); return (r < 0.8) ? 1 : (r < 0.9) ? 5 : (r < 0.96) ? 10 : 20; }

/* なんか疲れてきた */
int main(void)
{
  int score[2] = {0};
  int player = 1;
  do {
    player ^= 1;
    score[player] += point() + point() + point() + point();
  } while (score[player] < 1000);
  printf("%c の勝ち(A %d, B %d)\n", "AB"[player], score[0], score[1]);
  return 0;
}
92デフォルトの名無しさん:2005/05/25(水) 13:24:53
>>90 訂正

[1] 授業単元:プログラミング基礎
[2] 問題文(含コード&リンク):
>>73
上記の問題で定義したマクロは、引数にtempと言う変数が渡される
swap(double,temp,temp1)に対しては正しいプログラムとはならない。
このような場合でも正しいプログラムに展開されるようにマクロの定義を
変更しなさい。(##を使用する。)
[3] 環境
 [3.1] OS:Linux
 [3.2] コンパイラ(バージョン):gcc ?
 [3.3] 言語:C
[4] 期限:5月27日10時まで
93デフォルトの名無しさん:2005/05/25(水) 13:32:10
#define swap(t, x, y) do {t x##y; x##y = x; x = y; y = x##y} while (0)

94 ◆3t8QJxJClA :2005/05/25(水) 13:34:05
[1] 授業単元:プログラミング1
[2] 問題文

クラスN人の試験の点数を配列grade〔 〕に
格納し、総和平均を求めよ。
さらに最高点、最低点を求められるようにせよ、
最高点の人の番号も出るようにせよ、
[3] 環境
 [3.1] OS:UNIX FreeBSD
 [3.2] コンパイラ(バージョン):gcc なのか。。。?
 [3.3] 言語:C
[4] 期限:6月1日午後6時

配列を習ったときに出た問題なのですが・・・・
いまいちわかりません、よろしくお願いします。m(  )m
95デフォルトの名無しさん:2005/05/25(水) 13:36:02
>>93
複数行で書くとどうなりますか?
9680:2005/05/25(水) 13:39:26
>>89

ありがとうございます。
2つの「keytype X」を削除してコンパイルしましたら、
実行ファイルまで作れました。
しかし、すぐに「問題が発生したためtikuji.exeを終了します。」
と表示されるのですが、どういうことでしょうか?
なにかまずいことでもしてしまったのでしょうか?
教えてください。
97デフォルトの名無しさん:2005/05/25(水) 13:39:32
>>93
あー。これではエラーがでるかswap(int, i, f)とかで。
まあいいか、だれか、直しておいて。
複数行でどう書くかは前に書いた方法参照。(めんどいのよ)

>>94 配列って、最初からデータ入ってます?
(個人的興味からだけれど・・・教科書おしえてください)
98デフォルトの名無しさん:2005/05/25(水) 13:39:43
>>75
b.c:3: 文法エラー が '{' トークンの前にあります
b.c:5: `x' がここでは定義されていません (関数の中ではない)
b.c:5: 警告: データ定義が型や記憶クラスを持っていません
b.c:6: `y' がここでは定義されていません (関数の中ではない)
b.c:6: 警告: データ定義が型や記憶クラスを持っていません
b.c:7: 初期化子の要素が定数ではありません
b.c:7: 警告: データ定義が型や記憶クラスを持っていません
b.c:8: 文法エラー が '}' トークンの前にあります
99デフォルトの名無しさん:2005/05/25(水) 13:41:33
?プリプロセッサ通すだけで、んなエラーでる?>>98
100デフォルトの名無しさん:2005/05/25(水) 13:44:09
いいえ
101デフォルトの名無しさん:2005/05/25(水) 13:45:00
>>80
ドアホウ!keytype Xは関数の中で使ってるじゃないか。
マクロのXか変数のXとどっちか名前を変えろって
いってんだよ。
102デフォルトの名無しさん:2005/05/25(水) 13:47:17
[1] 授業単元:プログラミング言語
[2] 問題文(含コード&リンク):
3] 環境
 [3.1] OS:Win2000
 [3.2] コンパイラ(バージョン):VC++
 [3.3] 言語:C++


まず自分で以下のような入力ファイルを作成。
004 東京 20050524 00001 東京商店   15000
003 横浜 20050321 00002 横浜商店 20000
002 千葉 20050103 00001 東京商店 30000
004 東京 20050603 00003 関東商事 50000
.
.   
.
.
左から、支点コード、支店名、販売日、販売先コード、販売先名、売上金額
   ファイルの中身はソートされていない。
    販売日と売上金額はint型、その他はchar型。
   このファイルを読み込み、バブルソートを行い、新たに出力ファイルを
   作成し、そのファイルにソートしたものを出力。
   その際、mallocでメモリを確保すること。
       
入力ファイルを構造体と考えて、mallocでメモリを確保するらしいのですが
ポインタが良く分かっていないので、まったくできません。
どなたかお願いします。
103 ◆3t8QJxJClA :2005/05/25(水) 13:48:01
>>97 自分でクラスの人数とそれぞれの点数を入力する形式みたいです。

教科書はないですね、講師が黒板に説明を延々と書いていく授業です。
104デフォルトの名無しさん:2005/05/25(水) 13:50:03
>>99
結果を標準出力に出力しないといけないんですけど?
105デフォルトの名無しさん:2005/05/25(水) 13:50:12
>>92
>>97
ほらよ

# define swap(type, x, y) \
  do{ \
    type temp ## x ## y = x; \
    x = y; \
    y = temp ## x ## y; \
  }while(0) \
  /**/
106デフォルトの名無しさん:2005/05/25(水) 13:57:09
>>104
gcc -E でプリプロセッサ出力を得れば、後はコンパイルする必要ないんだろ?
107デフォルトの名無しさん:2005/05/25(水) 14:06:31
[1] 授業単元:プログラミング基礎
[2] 問題文(含コード&リンク):
void itoa(int n, char s[])
{
int i, sign;
if ((sign = n) < 0)
n = -n;
i = 0;
do {
s[i++] = n % 10 + '\0';
} while ((n /= 10) > 0);
if (sign < 0)
s[i++] = '-';
s[i] = '\0';
reverse(s);
}
void reverse(char s[])
{int c, i, j;
for (i = 0, j = strlen(s) - 1; i < j; i++, j--) {
c = s[i];
s[i] = s[j];
s[j] = c;
}}
上記のitoaに変更を加え、符号無し整数nをb進数の文字表現に変更し、
sに格納する関数itob(n,s,b)を記述しなさい。bの値の範囲は2から36
までとし、10以上の数にはアルファベットを使用しなさい。
(数字とアルファベット26文字で36進数まで扱える)
[3] 環境
 [3.1] OS:Linux
 [3.2] コンパイラ(バージョン):gcc ?
 [3.3] 言語:C
[4] 期限:5月27日10時まで
10880:2005/05/25(水) 14:08:37
>>101

すみません。本当にドアホウです。
変数のほうのXをzに変えましたが、それでも出てきます。
どうしたらいいでしょうか?
int seqsrch2(keytype x, keytype a[ ], int m, int n)
{
・・・
}
は「C言語による最新アルゴリズム事典」に載っていたものを
使いました。
それで、探す数字を7にしたくてマクロで定義したのです。
訳も分からずプログラムを書いているドアホですみません。
109デフォルトの名無しさん:2005/05/25(水) 14:09:20
[1] 授業単元:プログラミング演習
[2] 問題文:

ユーザーに 正の整数 n を入力してもらい、その階乗 n! を求めるプログラムを作成せよ。
階乗は、

n! = n * (n-1) * (n-2) * .... * 3 * 2 * 1
= 1 * 2 * 3 * 4 * ... * (n-1) * n

で定義される。 たとえば、n = 5 のときは 5 * 4 * 3 * 2 * 1 = 120 となる

[3] 環境
 [3.1] OS:Linux
 [3.2] コンパイラ(バージョン):cc
 [3.3] 言語:C
[4] 期限:明日まで
[5] その他の制限:制御構造(繰り返し)まで習いました。

どなたかご教授お願いします。
110デフォルトの名無しさん:2005/05/25(水) 14:10:55
>>107
> s[i++] = n % 10 + '\0';

> s[i++] = n % 10 + '0';
の間違いか?
111デフォルトの名無しさん:2005/05/25(水) 14:10:56
>>109 再帰は、ならいましたか?
112デフォルトの名無しさん:2005/05/25(水) 14:11:58
>>75
>>106
{
t temp;
temp = x;
x = y;
y = temp;
}

としか出力されませんが?

{
double temp;
temp = one;
one = two;
two = temp;
}

と出力されて欲しいのですが
113デフォルトの名無しさん:2005/05/25(水) 14:15:09
>>107

s[i] = '\0';

\はバックスラッシュです。
114デフォルトの名無しさん:2005/05/25(水) 14:23:09
>>107

static const char scpcCaraTable[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

void itoa( int n, int b, char s[] )
{
int i, sign;
if ( ( sign = n ) < 0 ) n = -n;
i = 0;
do {
s[ i++ ] = scpcCaraTable[ n % b ];
} while ( ( n /= b ) > 0);
if ( sign < 0 ) s[ i++ ] = '-';
s[ i ] = '\0';
reverse( s );
}
115デフォルトの名無しさん:2005/05/25(水) 14:23:25
>>91
どもです。でも
syogi-k.c:5: error: conflicting types for `random'
c:/language/djgpp/include/stdlib.h:121: error: previous declaration of `random
syogi-k.c: In function `random':
syogi-k.c:5: error: `MAX_RAND' undeclared (first use in this function)
syogi-k.c:5: error: (Each undeclared identifier is reported only once
syogi-k.c:5: error: for each function it appears in.)
なんかこんなエラーが出ました_no
116デフォルトの名無しさん:2005/05/25(水) 14:27:29
>>114
ありがとうございます。
できればmainの書き方も教えてください。
117デフォルトの名無しさん:2005/05/25(水) 14:27:50
>>115
関数名がrandomじゃねー。
118デフォルトの名無しさん:2005/05/25(水) 14:40:28
>>91訂正。しかし、compileもせんと書くとボロボロですな。
/* [0,1)の乱数 */
double my_random(void) { return rand() / (RAND_MAX + 1.0); }
/* 確率に従い得点を求める */
int point(void) {double r = my_random(); return (r < 0.8) ? 1 : (r < 0.9) ? 5 : (r < 0.96) ? 10 : 20; }
119デフォルトの名無しさん:2005/05/25(水) 14:48:40
>>116

#include <stdio.h>
#include <string.h>
void itoa( int n, int b, char s[] );
void reverse( char s[] );
static const char scpcCaraTable[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int main( void ) {
char iScore[ 40 ];
itoa( 10000000, 2, iScore );
printf( "%s\n", iScore );
return ( 0 );
}
void itoa( int n, int b, char s[] ) {
int i, sign;
if ( ( sign = n ) < 0 ) n = -n;
i = 0; do { s[ i++ ] = scpcCaraTable[ n % b ]; } while ( ( n /= b ) > 0);
if ( sign < 0 ) s[ i++ ] = '-';
s[ i ] = '\0'; reverse( s );
}
void reverse( char s[] ) {
int c, i, j;
for ( i = 0, j = strlen( s ) - 1; i < j; i++, j-- ) { c = s[ i ]; s[ i] = s[ j ]; s[ j ] = c; }
}
120デフォルトの名無しさん:2005/05/25(水) 15:09:49
121デフォルトの名無しさん:2005/05/25(水) 15:10:27
>>80
>84-86のソースで、>86の文だけ'X'を'x'とでもしてみろ。

>>73
>75を適当なファイル(仮にfoo.c)に保存し、gcc -Eを実行(先の例ではgcc -E foo.c)してみたか?
それでも>112のように出力されるのか?

>>107
直接宿題には関係ないが、>113は>110の質問の回答になってないぞ。
122デフォルトの名無しさん:2005/05/25(水) 15:13:17
変なswapマクロだと思ったら、swap(int, a[0], a[1])とかはダメなのね。
出題者に減点。
123デフォルトの名無しさん:2005/05/25(水) 15:20:39
>>118
あぁエラーなくいけました。ついでに
>>一回の勝負毎にどちらが勝ったかを表示させ何回で勝負がついたか
の部分はどこに何を追加すればいいんでしょうか…。
124デフォルトの名無しさん:2005/05/25(水) 15:23:57
>>83
lnコマンドしらんのか? man lnして味噌。
125デフォルトの名無しさん:2005/05/25(水) 15:26:14
あはは。
126デフォルトの名無しさん:2005/05/25(水) 15:28:21
力つきたので、あとはまかす。>>123
127デフォルトの名無しさん:2005/05/25(水) 15:31:48
score[player] = ...;
の続きに、
if (player == 1) {
print1Turn(score);
}
とでもしておき、
void print1Turn(int * score)
{
printf("現時点で");
if (score[0] < score[1]) {
printf("Bがリード\n");
} else if (score[0] > score[1]) {
printf("Aがリード\n");
} else {
printf("両者タイ\n");
}
を追加すれば経過表示はできるだろ。
あーでも、最終ターンで同時に1000超えたらどうするんだろ。
まぁ頑張れw>>123
128デフォルトの名無しさん:2005/05/25(水) 16:07:08
>>127
thxです。少しだけ変えて何とか提出できる形になりました。
129デフォルトの名無しさん:2005/05/25(水) 17:03:11
誰かRASP知ってる人いませんかぁ??
130デフォルトの名無しさん:2005/05/25(水) 17:28:30
>>109
再帰をならってないなら、Fact2をだすとよいと思う。
#include <stdio.h>

unsigned int Fact(unsigned int n){
    if(n==1) return 1;
    return Fact(n-1)*n;
}

unsigned int Fact2(unsigned int n){
    unsigned int i=0;
    unsigned int val=1;
    for(i=1;i<=n;i++){
        val *= i;
    }
    return val;

}
int main(){
    unsigned int val;

    val=Fact2(5);

    printf("%d",val);
    return 0;
}
131デフォルトの名無しさん:2005/05/25(水) 17:46:35
STLのlistは処理が重たいのでSTLのリストの簡易版のようなテンプレートリストクラスを作りました。
使用すると、
「外部参照3が未解決です」やメンバ関数に対して、未解決のシンボルが参照されました、というような
エラーが消えません。

ちなみに、
template <class data_t> class TList

/*template <class data_t>*/ class TList
にして、
data_t型のメンバを全部int型にして、テンプレートクラスではなく、int型にしか使えない
リストクラスとして使用すると期待通りの動きをします。
一体何が原因でリンクエラーが起こるのでしょうか?
132デフォルトの名無しさん:2005/05/25(水) 18:08:06
>>94
#include <stdio.h>

#define N (10)
#define Max(a,b) ((a>b)? a:b)/*aとbのうち大きい方を返すマクロ。3項演算子*/
#define Min(a,b) ((a>b)? b:a)/*aとbのうち小さい方を返すマクロ*/
int main(){
    int grade[N];
    int i=0,top=0,min,max,ave,all;
    printf("input... grade[%d]\n",N);
    for(i=0;i<N;i++){
        scanf("%d",&grade[i]);
    }
    puts("input end");
    min= grade[0];/*最初の値を閾値とする。*/
    max= grade[0];/*同上*/
    all=0;
    for(i=0;i<N;i++){
        if(grade[top]<grade[i]){/*topの位置とiの位置とで中身の大きい方の位置をtopに記録*/
            top=i;
        }
        min=Min(min,grade[i]);/*最小を記録*/
        max=Max(max,grade[i]);/*最大を記録*/
        all+=grade[i];/*総和を出す。*/
    }
    ave = all / N;/*平均値を出す。*/
    printf("最大:%d\n最小:%d\n合計:%d\n平均%d\n最高値は%d番目でした。\n",max,min,all,ave,top+1);
    return 0;
}
133デフォルトの名無しさん:2005/05/25(水) 18:10:44
>>131
VCしか知らないが、
ヘッダとソースを分けるとそういうエラーに悩まされることがある。
ヘッダにじか書きすると消えると思う。
134デフォルトの名無しさん:2005/05/25(水) 18:15:50
STLのlistって重たいの?
135デフォルトの名無しさん:2005/05/25(水) 18:16:22
>>132
ありがとう!
既に解決してたけど、感謝するよ!
136デフォルトの名無しさん:2005/05/25(水) 18:17:55
>>134
重たいと思う。VCとかでステップ実行すればわかるけど、すっごい深いところまで潜らないとデータにアクセスできなかったりする。
137デフォルトの名無しさん:2005/05/25(水) 18:21:26
>>135
そりゃ良かった。;)
138デフォルトの名無しさん:2005/05/25(水) 18:30:16
[1] 授業単元:コンピュータ演習
[2] 問題文(含コード&リンク):浮動小数点型データを5個入力して、最大値、最小値、平均を求めよ。
[3] 環境
 [3.1] OS:Windows XP
 [3.2] コンパイラ(バージョン):
 [3.3] 言語:C
[4] 期限:2005年05月26日1:30まで
139デフォルトの名無しさん:2005/05/25(水) 18:31:43
↑マルチはスルーで。
140デフォルトの名無しさん:2005/05/25(水) 18:35:06
[1] 授業単元: 演習
[2] 問題文(含コード&リンク):
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/463.txt
[3] 環境
 [3.1] OS:Linux
 [3.2] コンパイラ(バージョン):
 [3.3] 言語:C
[4] 期限:5月30日まで
[5] その他の制限:特に無し

頭を抱えてもう十数時間・・・自分の貧弱頭ではもう限界ですorz
ご指南よろしくおねがいします。
141デフォルトの名無しさん:2005/05/25(水) 19:08:24
げ、多桁演算するのに一桁ずつリストに入れているのかよ。
ぜってぇメンテナンスしたくないコードだな。
142デフォルトの名無しさん:2005/05/25(水) 19:10:02
>>140
コンパイルは通していない。
筋はあってると思うのであとは旨くやってくれ。
/*グローバル変数。*/
static Digit *NotUse;
void freenum(Digit *in){/*渡されるデータの構造はリングリストを前提にしている。*/
    if(NotUse == NULL){
        NotUse=in;
        return;
    }
    NotUse->prev->next = in->next;
    in->next->prev = NotUse->prev;
    NotUse->prev=in;
    in->next = Notuse;
    return;
}
Digit *newdigit(void){
    Digit *a;
    if(NotUse != NULL){
        a=NotUse;
        if(NotUse->next != NotUse){
            NotUse->next=NotUse->prev->next;
            NotUse->prev=NotUse->next->prev;
        }
    }else{ a=(Digit *)malloc(sizeof(Digit)); }
    if(a==NULL)
    {
        fprintf(stderr, "メモリ不足\n");
        exit(1);
    }
    return a;
}
143デフォルトの名無しさん:2005/05/25(水) 19:14:29
>>138
>>132と流れは同じだから改造汁。
144デフォルトの名無しさん:2005/05/25(水) 19:22:37
145デフォルトの名無しさん:2005/05/25(水) 19:26:14
[1] 授業単元: プログラミング基礎
[2] 問題文(含コード&リンク):自分の姓名(例”Tarou Koudai”)を表示せよ。
ただし、配列a[]を用いて、これを文字列で初期化し、
1文字づつ出力せよ。さらにポインタpを用いて、同様に1文字づつ出力せよ。
[3] 環境
 [3.1] OS:Windows XP
 [3.2] コンパイラ(バージョン):
 [3.3] 言語:C
[4] 期限:5月26日 A.M3:00まで できれば早めにお願いします。

レベルは低いと思いますがお願いします。
146デフォルトの名無しさん:2005/05/25(水) 19:30:47
>>145
#include <stdio.h>
#include <string.h>
int main()
{
    const char a[] = "hoge";
    const char *p = a;
    int i, length = strlen(a);
    for (int i = 0; i < length; i++)
        putchar(a[i]);
    putchar('\n');
    while (*p++)
        putchar(*p);
    return 0;
}
147デフォルトの名無しさん:2005/05/25(水) 19:32:47
>>145
http://pc8.2ch.net/test/read.cgi/tech/1115794784/919-926
同じ学校の生徒?
その学校やばくない?
148デフォルトの名無しさん:2005/05/25(水) 19:37:02
>>147 やばい。
      課題2問出た?
149デフォルトの名無しさん:2005/05/25(水) 19:46:23
>>146
>while (*p++)
なのに
>for (int i = 0; i < length; i++)
150デフォルトの名無しさん:2005/05/25(水) 19:49:28
[1] 授業単元:情報処理実習1
[2] 問題文(含コード&リンク):
double型の変数をchar型の変数[文字列]に変更する関数について考察し、
可能ならば関数[void dtostr(double d,char str[])]を作成せよ
[3] 環境
 [3.1] OS:WindowsXP
 [3.2] コンパイラ(バージョン):VC++
 [3.3] 言語:C
[4] 期限:2005年5月31日まで
[5] その他の制限:ポインタ、標準関数使用不可。

可能不可能だけでも、お願いします。
151デフォルトの名無しさん:2005/05/25(水) 19:51:15
>>150
>[2] 問題文(含コード&リンク):
>double型の変数をchar型の変数[文字列]に変更する関数について考察し、
>可能ならば関数[void dtostr(double d,char str[])]を作成せよ
不可能
152デフォルトの名無しさん:2005/05/25(水) 19:59:55
そこは問題じゃないだろ
153デフォルトの名無しさん:2005/05/25(水) 20:00:47
考察
たとえば
double var;
ならば「double型の変数」とはvarを指す。
この場合「char型の変数[文字列]に変更」では"var"に変更することを指し、
「void dtostr(double d,char str[])」という関数の作成は不可能と判断する。
154長いんで分割します:2005/05/25(水) 20:14:04
[1] 授業単元:プログラム演習
[2] 問題文(含コード&リンク):
整数値を扱うための線形連結リストにおいて、セルの挿入、削除を行う関数を定義し
それを利用して標準入力から入力されたデータが小さい順に並ぶようにリストにセルを挿入し、
完成したリストの内容を標準出力に出力せよ。実行結果として、以下のデータを入力した結果を示すこと。

4 1 7 9 0 6 3 5 8 2
[3] 環境
 [3.1] OS:WindowsXP
 [3.2] コンパイラ(バージョン):gcc
 [3.3] 言語:C
[4] 期限:2005年5月27日まで
[5] その他の制限:セルの定義、挿入、削除の関数は以下のものを利用すること。
/*セルの定義*/
struct cell {
int value;
struct cell *next;
};

155150:2005/05/25(水) 20:14:56
問題の意図するところは、
double型の変数dとcharの文字列strを引数とし、
dの値を文字列に変換して、strに代入する関数を作りなさい。
です。
授業中にunsigned int版をやったとき、
そういう関数が正解だったので。
わかりにくく書いてすいません。

156& ◆D71jwTqGtw :2005/05/25(水) 20:15:59
/*挿入関数*/
void insert_cell(struct cell **pointer, int new_value)
{
struct cell *new_cell;

new_cell = (struct cell *)malloc(sizeof(struct cell));
new_cell->value = new_value;

new_cell->next = *pointer;

*pointer = new_cell;
}

/*削除関数*/
void delete_cell(struct cell **pointer)
{
struct cell *target;

target = *pointer;
*pointer = target->next;

free((void *)target);
}

入力する度に昇順になるよう挿入するらしいですがポインタで混乱しまくってます。
よろしくお願いします。
157デフォルトの名無しさん:2005/05/25(水) 20:18:22
void dtostr(double d,char str[]){ sprintf( str, "%f", d ); }
158デフォルトの名無しさん:2005/05/25(水) 20:23:54
>>157
[5] その他の制限:ポインタ、標準関数使用不可。
159デフォルトの名無しさん:2005/05/25(水) 20:26:52
>>155
考察
俺には不可能と判断する。
でいいじゃん。
160デフォルトの名無しさん:2005/05/25(水) 20:29:21
>>150
関数の引数の char str[] はポインタなので制限によりこの関数は作成不可能。
161デフォルトの名無しさん:2005/05/25(水) 20:48:35
ただ単に作成せよではなく、可能ならば作成せよって、ずいぶん親切な
問題だね。
162デフォルトの名無しさん:2005/05/25(水) 21:37:51
>>142
アドバイスありがとうございます。
とりあえず自力で書き加えてみましたがやっぱりうまく動いてくれない・・・OTZ
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/465.txt
16380:2005/05/25(水) 22:04:14
>>121

ありがとうございます。
ご指摘通り直したら、ちゃんと問題なくできました。
どうもありがとうございました。
ドアホなので、今から樹海に行きます。
164150:2005/05/25(水) 22:05:17
>>160
ポインタは習ってないから使えないけど
この使い方はありということでお願いします。
>>161
宿題では、int型からchar型も出されて、こっちは必須で、自力でといたんですが、
double型は点数欲しければ解けという感じです。
165デフォルトの名無しさん:2005/05/25(水) 22:08:44
>>136
重たいと言い切る根拠が勘かよ。
キミが思ってるより、コンパイラは頭いいよ。
166デフォルトの名無しさん:2005/05/25(水) 22:09:48
人に聞いてまで点数ほしいのか。
点数が何だ、そんなことのために君は自分の倫理を貶めたいのか。
必須問題が自力で解けたんなら十分じゃないか。
それは学校の点数なんかよりはるかに価値のあることだぞ。
とか言ってみる。
167デフォルトの名無しさん:2005/05/25(水) 22:14:13
倍精度浮動小数点で検索してがんばれ。
168デフォルトの名無しさん:2005/05/25(水) 22:22:04
>>162
こんな感じ。

void freenum(Digit *in) {
 Digit *p, *next;
 for (p = in; p; p = next) {
  next = p->next;
  p->next = NotUse;
  NotUse = p;
 }
}

Digit *newdigit(void) {
 Digit *a = NotUse;
 if (a) {
  NotUse = a->next;
 }
 else {
  a = (Digit *)malloc(sizeof(Digit));
  if (a == NULL) {
   fprintf(stderr, "メモリ不足\n");
   exit(1);
  }
 }
 return a;
}
169デフォルトの名無しさん:2005/05/25(水) 22:23:40
>>166
だがそれは建前だからなぁ。
いくらそんなこと言ったところで、評価は点数で決まる。
170デフォルトの名無しさん:2005/05/25(水) 22:29:52
【質問テンプレ】
[1] 授業単元:C言語
[2] 問題文
[3] 環境
 [3.1] OS:Windows XP
 [3.2] コンパイラ(バージョン):Microsoft Visual C++
 [3.3] 言語:C
[4] 期限:2005年5月26日まで
[5] 問題文は下に書きます
171デフォルトの名無しさん:2005/05/25(水) 22:34:11
>>169 気張るなぁ・・・漏れは単位もらえるだけでいいや。
172170:2005/05/25(水) 22:35:40
#include <stdio.h>
#define NONBLANK 'a'
int main()
{
int c, lastc;
lastc = NONBLANK;
while ((c = getchar()) != EOF){
if(c != ' ')
putchar(c);
else if(lastc != ' ')
putchar(c);
lastc = c;
}
return 0;
}
問題 連続で入力されたブランクが何故1つに置き換えられたか説明してください?
173デフォルトの名無しさん:2005/05/25(水) 22:38:03
説明してください?
174デフォルトの名無しさん:2005/05/25(水) 22:40:59
>>172
回答 連続で入力されたブランクを1つに置き換えるプログラムだから?
175デフォルトの名無しさん:2005/05/25(水) 22:46:50
c    □■■■□□□□■■■■
lastc  a □■■■□□□□■■■
176デフォルトの名無しさん:2005/05/25(水) 22:53:52
>>162
デバッグめんどかった。
一応動くよ。細かいところはしっかりチェックしてクレイ。
やっぱね、リストの付け替え関数くらいないとバグの元だと思う。
なんかあるたびに付け替え処理書いてるんじゃ自信なくなっちゃう。

http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/466.txt
177デフォルトの名無しさん:2005/05/25(水) 22:59:32
>176,168
ご回答ありがとうございます。
頂いたアドバイスを元に理解に勤めたいと思います。
178デフォルトの名無しさん:2005/05/25(水) 23:05:46
>>173
フラグ変数であるlastcに空白文字が入っていない時に限り一文字空白を表示するから。
cに空白文字が代入されたとき、されないとき等しくlastcにバックアップを書き込んでいるため。
あと、cに空白文字が入ったときは描画をスキップしているので空白を描画できるソース中のポジションは1個しかない。

まとまりないな。
179170:2005/05/25(水) 23:08:49
>>175>>178
わかりました。ありがとううございます。
180工大花子:2005/05/25(水) 23:36:58
1] 授業単元: コンピュータ演習
[2] 問題文(含コード&リンク): 不動小数点型データを5個入力して、最大値、平均、最小値を求めよ。
[3] 環境
 [3.1] OS:Windowsxp
 [3.2] コンパイラ(バージョン):
 [3.3] 言語:C
[4] 期限:2005年5月26日7:00まで
[5] その他の制限:ヨロシクお願いします。
        
181デフォルトの名無しさん:2005/05/25(水) 23:38:54
>>180
残念ながら私の環境では小数点が浮き動く型しか御座いませんのでお力にはなれません
182工大花子:2005/05/25(水) 23:48:45
>>181
それでもいいのでお願いします。
183デフォルトの名無しさん:2005/05/25(水) 23:50:33
>>150
ちょっとやってみたけど思いのほかめんどい。
浮動小数点数の特定の桁だけ抜き出すのがなかなかうまくいかない。
しばし待たれよ。
184デフォルトの名無しさん:2005/05/25(水) 23:51:07
>180
不動小数点は固定小数点と意訳せずに不動小数点と解釈しましたw
まあ、つっこみはエロイ人よろしく
#include <stdio.h>
int main()
{
int i ;
double v ;
double sum, max, min ;
sum = 0.0 ;
scanf( "%lf", &v ) ;
sum += v ;
max = min = v ;
for( i = 1 ; i < 5 ; i++ ){
scanf( "%lf", &v ) ;
sum += v ;
if( max < v ) max = v ;
if( min > v ) min = v ;
}
printf( "max=%lf,avr=%lf,min=%lf\n", max, sum / 5, min ) ;
return 0;
}
185デフォルトの名無しさん:2005/05/25(水) 23:52:46
>>184
X 不動小数点は固定小数点と意訳せずに不動小数点と解釈しましたw
○ 不動小数点は固定小数点と意訳せずに浮動小数点と解釈しましたw
orz...
186工大花子:2005/05/25(水) 23:53:01
>>184
本当に助かりました。ありがとうございます。
187デフォルトの名無しさん:2005/05/26(木) 00:11:06
>150
過去レスで似たようなのがあったよ。
convSyouで出力先をchar[]に変えればいいんじゃない
#include <stdio.h>
#include <string.h>
void convSei( int i ){
int mask = 0x40000000 ;
for( ; mask > 0 ; mask /= 2 ){
if( ( mask <= i ) ) putchar( ( mask & i ) ? '1' : '0' ) ;
}
}
void convSyou( double d ){
putchar( '.' ) ;
int i ;
d -= (int)d;
for( i = 0 ; i < 5 ; i++ ){
d *= 2 ;
putchar( ( (int)d & 1 ) ? '1' : '0' ) ;
if( d - (int)d <= 0.0 ) break ;
}
}

int main( int argc, char* argv[] ){
double d ;
sscanf( argv[1], "%lf", &d ) ;
convSei( (int)d ) ;
convSyou( d ) ;
return 0 ;
}
188デフォルトの名無しさん:2005/05/26(木) 00:41:07
>>187
ポインタを使わずに、どうやってchar str[]に入れるかが問題
char str[]だけは許されるらしいので
それを、どう上手く解釈してやるかが問題を解くポイントだと思う
189デフォルトの名無しさん:2005/05/26(木) 00:47:33
>>187
元の問題には書かれていないが、10進数にするんじゃなかろうか?
そのコードはパッと見2進表示っぽいし、正の小数部分にしか対応してない。
いきなりintへのキャストが入っているのでintに入りきらない値を渡したら変な結果になりそう。
190デフォルトの名無しさん:2005/05/26(木) 00:57:41
どうしても誤差が出るなぁ・・・。
191デフォルトの名無しさん:2005/05/26(木) 01:04:05
intにキャストして整数部分を取って出力して...
後は10掛けながらintにキャストして整数部分を取って出力して...の繰り返し

これでできると思うけど、すんげえダセえし効率悪そうだな。

でも実数の二進表現って(まあ大抵IEEEだろうが)環境依存だしなあ
192前スレ922:2005/05/26(木) 01:20:29
dat落ちして質問した分が見れなくなってしまったので
2と3の回答をしてくださった分を教えてください。
193デフォルトの名無しさん:2005/05/26(木) 01:26:29
194192:2005/05/26(木) 01:34:58
>>193
助かりました。ありがとうございました。
195デフォルトの名無しさん:2005/05/26(木) 01:37:06
>>191
二進表現ってことは規定されてるんだっけ?
196デフォルトの名無しさん:2005/05/26(木) 01:38:45
>>194
おいおい、真剣みが無い奴だな
197デフォルトの名無しさん:2005/05/26(木) 01:51:38
>>26
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/467.zip
この手の問題はコンピュータ専門のとこだろ。
この程度で行き詰るようなら、進路変更したほうがいいよ。
たぶんまだ若いんだから十分間に合うよ。
198デフォルトの名無しさん:2005/05/26(木) 02:30:03
まー。専門教育を受けても、その道に進むとは限らんし。
199デフォルトの名無しさん:2005/05/26(木) 04:13:26
>>191
その線で逝ってみた。
bcc+bcpadでやってみた。

どこかがまずいらしく、
ときどき
ごごごーとデバガが
あがってくる。

これの129番に貼った。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.cgi?mode=thr&no=31
200150:2005/05/26(木) 06:47:12
考えてくれた方、ありがとうございます。
>188
str[i]='0'とかで入れることはできます。
>189,191
一応、10進表示です。
>199
ありがとうございます。、これを元に自分も頑張ってみます。
201デフォルトの名無しさん:2005/05/26(木) 08:14:05
標準出力に出力って何のことですか?
202デフォルトの名無しさん:2005/05/26(木) 08:56:28
>>201
stdout に 出力すること
203デフォルトの名無しさん:2005/05/26(木) 11:18:02
>>144さん
ありがとうございます。
memcpyを使わないで解く方法はありませんでしょうか?
204デフォルトの名無しさん:2005/05/26(木) 12:59:35
>>203
贅沢言うなヴォケ。
後は自分で解け。
205デフォルトの名無しさん:2005/05/26(木) 13:59:04
>>165
>>136の説明のどこら辺が勘なのか、頭の悪い俺に教えてくれるかな?
ちなみに、増減する敵キャラlistで管理してループさせたりすると、確実に重いぞ。
それは経験済みだ。
206デフォルトの名無しさん:2005/05/26(木) 14:06:53
>>205
じゃあ聞くが、list以外にどんなコンテナを使ったら軽かったんだ?
この問いに答えられないようじゃ、お前さんの妄想と言われても仕方ないな。
207デフォルトの名無しさん:2005/05/26(木) 14:11:46
>>205
自作リストだ。最初の質問の流れから言って、自作を引き合いに出すのはナシじゃないだろう?
208デフォルトの名無しさん:2005/05/26(木) 14:36:47
>>207
ケッ。脳内自作かよ。せいぜいヲナニーしてろってこった。
209デフォルトの名無しさん:2005/05/26(木) 14:42:39
文字を入力し、入力された文字が数字ならば、
それまでに入力された数値を総和を出力するプログラム

main()は1文字を入力させて関数count()に渡す
count()は"?"が渡された場合には0、それ以外には1を返し
main()ではその返り値が0の場合に処理を終了させる
数字のカウントと出力はcountで行う

yorosiku
210デフォルトの名無しさん:2005/05/26(木) 14:57:02
>>205
減らすときは線形検索しなきゃいけないからちょっと重いが、
追加は先頭または末尾につけるだけなのでそんなに重くないはず。(末尾はそこまで移動させのがちょっとおもいかな。
独自実装なら現在指している場所に挿入とかも可能だし。
これはSTLに限らずそうだとおもうんだが。

コンテナの選択を誤ったってことじゃないだろうか。
211デフォルトの名無しさん:2005/05/26(木) 14:59:16
>>209
>yorosiku 
イヤダ。
テンプレよんでくれ。
212デフォルトの名無しさん:2005/05/26(木) 15:26:04
>>209
#include <iostream>
#include <iterator>
#include <algorithm>
#include <functional>
#include <cctype>

using namespace std;
namespace kadai {
int count(char ch)
{ static int p;return ch=='?'?0:isdigit(ch)?!!(cout<<(p+=ch-'0')<<endl):1;}
};

int main()
{
find_if(istream_iterator<char>(cin), istream_iterator<char>(),
not1(ptr_fun(kadai::count)));
}

俺って優しいよな。
213209:2005/05/26(木) 15:32:08
>>212
C de yorosiku
214109:2005/05/26(木) 15:47:40
>>111
>>130
レス遅くなってすいません。
ってか教えてもらうまでもなく、自分でよく考えたら作れました。
どうもありがとうございました。


215デフォルトの名無しさん:2005/05/26(木) 16:11:05
[1]授業単元
   プログラミング言語
[2]問題文(含コード&リンク)
     5次式の任意の係数をキーボードより入力し,
     F(x)= 0.0 となる x の値を求めよ。
     入力した任意の係数及び処理した結果は,
     保存ファイルへ出力のこと。A=0 のとき終了,
     それ以外は,繰り返しとする。
[3] 環境
 [3.1] OS:Windows
 [3.2] コンパイラ(バージョン):gcc
 [3.3] 言語:C
[4] 期限:2005年5月30日まで
[5] その他の制限:while,for,ifまでは一応なりました。

どうかよろしくお願いします。
216デフォルトの名無しさん:2005/05/26(木) 16:23:56
>一応なりました。
217デフォルトの名無しさん:2005/05/26(木) 17:15:32
〔1〕授業単元  C言語
〔2〕問題文(含コード&リンク)
入力した文字列(最大20文字)を一度別の関数にうつし、そこで表示せよ。
そして、その文字のa〜z、0〜9の数字の個数を表示せよ。
例 abd2 と打ったら
   abd2  ←この表示は別の関数にうつし、そこでpurintfした物
   a=1
   b=1
   c=0
   e=0
    ・
    ・ 
    ・
   l=0
   2=1
     ・
     ・


  3] 環境
 [3.1] OS:Windows
 [3.2] コンパイラ(バージョン):gcc
 [3.3] 言語:C
[4] 期限:5月27日
[5] その他の制限:main以外の関数を自分で作れるという事まで習いました。どのような手を使って解いてもいいと言われました。

情報科に入ったのはいいですけど、女子一人のため周りに相談できずC言語厳しいです(´・ω・`)ショボーン
一番最初の形式はわかるのですが、カウントしていく&表示するプログラムがわからないです。
218デフォルトの名無しさん:2005/05/26(木) 17:46:46
>>217
要カスタマイズ。
ここでは女子とか言われても対応できないので、早く知人ができるといいね。
#include <stdio.h>
#define DATAMAX (20)
void output(char *data){/*for 7BitAscii*/
    char character[128];
    int i;
    for(i=0;i<128;i++){
        character[i]=0;
    }
    while(* data ) character[* data++]++;/* 添え字の*の横の空白は消しちゃだめ。*/
    for(i=0;i<128;i++){
        if(i% 5==4){
            printf("\n");
        }
        printf("%d:[%c]:%d ",i,i,character[i]);/*表示部*/
    }
    printf("\n");
}
int main(){

    char buf[DATAMAX+1];

    fgets(buf,DATAMAX+1,stdin);
    buf[DATAMAX]='\0';

    output(buf);
}
219デフォルトの名無しさん:2005/05/26(木) 17:54:51
なるほど。
その手(女性と称する)があるのか!
220デフォルトの名無しさん:2005/05/26(木) 17:55:37
テンプレ追加案。
・ここにいる回答者はプログラムが得意であって他の分野に精通しているかはランダムです。
この一文入れてほしいね。

221デフォルトの名無しさん:2005/05/26(木) 17:58:48
>>215
数学がわからない者に5次式と漠然といわれても理解できないです。
さらにぐぐるさんが教えてくれないようなのは絶望的。
式プリーズ。式プリーズ。
もしくは参考になるページを・・・。
以上広告の裏でした。
222デフォルトの名無しさん:2005/05/26(木) 18:00:30
>>219
人によっては優先順位上がるかもね。
でもここで自称女性がいてもなんもしてやれないし。
あまり意味があるようには思えないが。
223デフォルトの名無しさん:2005/05/26(木) 18:03:15
Yes!ただ書くのみ。
224デフォルトの名無しさん:2005/05/26(木) 18:07:49
>>218さん
すいません、ありがとうございました。
自宅にはC言語のプログラムがないので、明日早朝に学校に行って試してみます。
正直、後半部のプログラムがさっぱりわからないので今日参考書片手に勉強しようと思います。

教科書も先生もvoid main(void)とやっていたのですが、ここのテンプレ見て勉強になりました。
これから色々と勉強していきます(`・ω・´)シャキーン
225デフォルトの名無しさん:2005/05/26(木) 18:11:42
>>221
5次以上の方程式には代数的な解の公式が存在しないとのこと
近似解を出せってことなのだろうか…?
226デフォルトの名無しさん:2005/05/26(木) 18:12:06
>>224
タダで使えるBorland C++ Part4
http://pc8.2ch.net/test/read.cgi/tech/1091066805/
Microsoft Visual C++ Toolkit 2003 質問箱
http://pc8.2ch.net/test/read.cgi/tech/1109618655/
227デフォルトの名無しさん:2005/05/26(木) 18:23:00
>>218
>fgets(buf,DATAMAX+1,stdin);
>buf[DATAMAX]='\0';
常套句なんだからもっと自然に書こうよ。つーか、buf[DATAMAX]はないだろ。
--
char * p;
fgets(buf, sizeof(buf), stdin);
/* 末尾の改行を取り除く処理 */
p = strchr(buf, '\n');
if (p) {
* p = '\0';
}
--
それにしても、なんで空白を消しちゃいけないんだろ。
228デフォルトの名無しさん:2005/05/26(木) 18:24:16
>>225
y=(x^5*a)+(x^4*b)+(x^3*c)+(x^2*d)+(x*e)+f;
こんな式でいいのか?
もう数学なんて数年やってないんでな、不備はゆるしてくれ。
( ^記号は察してくれ。汗。)
229デフォルトの名無しさん:2005/05/26(木) 18:25:37
>>224
わかり難いのは小手先のテクニックだけで、
それほど難度があるソースではないので、
がんばって解析してください。
230デフォルトの名無しさん:2005/05/26(木) 18:27:15
>>227
いやね演算の優先順位にじしんがなかったんだよ。
それだけだ。汗。
231デフォルトの名無しさん:2005/05/26(木) 18:32:54
>>230
空白で優先順位は制御できない。
232デフォルトの名無しさん:2005/05/26(木) 18:40:18
>>231
うへ。勉強になった。
ドンドン怪しくなってきたな。
233デフォルトの名無しさん:2005/05/26(木) 18:47:37
>>215
こんな感じか?
#include <float.h>
#include <math.h>
#include <stdio.h>

double solve(double a[], double initial_x = 0) {
    double old_x = initial_x, x = old_x;
    do {
        old_x = x;
        x = (-a[0] + old_x * old_x * (a[2] + old_x * (2 * a[3] + old_x * (3 * a[4] + 4 * old_x * a[5])))) / (a[1] + old_x * (2 * a[2] + old_x * (3 * a[3] + old_x * (4 * a[4] + 5 * old_x * a[5]))));
    } while (abs(x - old_x) > DBL_EPSILON);
    return x;
}

int main(void) {
    FILE* fp = fopen("result", "w");
    double initial_x, a[6];
    int i;
    for (; ; ) {
        for (i = 0; i <= 5; i++) {
            printf("input coefficient of x^%d:", i);
            scanf("%lf", a + i);
        }
        if (a[5] == 0) break;
        printf("input initial value:");
        scanf("%lf", &initial_x);
        fprintf(fp, "coefficient list:%f %f %f %f %f %f\nresult:%f\n", a[0], a[1], a[2], a[3], a[4], a[5], solve(a, initial_x));
    }
    fclose(fp);
    return 0;
}
234grass:2005/05/26(木) 18:48:13
>>225
五次式ですがこんな関数で答えだせます。

double proossess()
{
double x = 0.0; double y;

while( (y=calc(x))==0 ){ x += y/delta(x); }
return(y);
}

calc(x) は 与えられた 関数f のf(x)を求めます。
delta(x) は 与えられた 関数fの導関数で f'(x)を求めます。

たしかニュートン法っていうアルゴリズムだったと思います。

注意)
発散するような関数には使えません
 f=tan(x)とか
235デフォルトの名無しさん:2005/05/26(木) 18:50:41
>>226
ありがとうございます。お店で買わない限り無理かと思ってた・・・。
これで自宅学習できます(`・ω・´)シャキーン

>>227
>の部分のをーー からーーに置き換えた方がいいって事なのかな?
それにしても、配列やって関数やってなんでこんな課題出されたんだろ・・・。
知らない書き方ばっかりだし、今日は徹夜の予感ヽ(´Д`;)ノ
236デフォルトの名無しさん:2005/05/26(木) 18:53:51
>>235
修正版。
#include <stdio.h>
#include <string.h>
#define DATAMAX (20)
void output(char *data){/*for 7BitAscii*/
    char character[128];
    int i;
    printf("Input:[%s]\n",data);
    for(i=0;i<128;i++){
        character[i]=0;
    }
    while(*data ) character[*data++]++;
    for(i=0;i<128;i++){
        if(i% 5==4){
            printf("\n");
        }
        printf("%d:[%c]:%d ",i,i,character[i]);/*表示部*/
    }
    printf("\n");
}
int main(){
    char buf[DATAMAX+1];
    char *p;
    fgets(buf,DATAMAX+1,stdin);
    /*buf[DATAMAX]='\0';*/
    p=strchr(buf,'\n');
    if(p) *p='\0';

    output(buf);
    return 0;
}
237デフォルトの名無しさん:2005/05/26(木) 18:59:04
[1] 授業単元:プログラミング
[2] 問題文:
人数nを読み込んだあと、配列に身長のデータを読み込んでいき、
入力された身長を10cmごとにわけたヒストグラムを作成するプログラム。
<実行例>

150<=x<160 : *** 3名
160<=x<170 : ***** 5名
.
.
.
190<=x<200 : * 1名

[3] 環境
 [3.1] OS:Linux
 [3.2] コンパイラ(バージョン):cc
 [3.3] 言語:C
[4] 期限:今日からだいたい1週間。

配列がいまいちわからないのでお願いします。
238デフォルトの名無しさん:2005/05/26(木) 18:59:10
[1] 授業単元:プログラミング
[2] 問題文:
人数nを読み込んだあと、配列に身長のデータを読み込んでいき、
入力された身長を10cmごとにわけたヒストグラムを作成するプログラム。
<実行例>

150<=x<160 : *** 3名
160<=x<170 : ***** 5名
.
.
.
190<=x<200 : * 1名

[3] 環境
 [3.1] OS:Linux
 [3.2] コンパイラ(バージョン):cc
 [3.3] 言語:C
[4] 期限:今日からだいたい1週間。

配列がいまいちわからないのでお願いします。
239grass:234:2005/05/26(木) 18:59:18
すいません。挨拶忘れてました。
初めて書き込む grass と申すものです。
以後お見知りおきを
240grass:234:2005/05/26(木) 19:04:49
>>238
具体的な答えでなくてすいません

10cmごとに区分けするのなら身長のデータを読み込む度に
身長/10 を添え字にした配列の中身をインクリメントすればカウントできます。

表示部の*は

void print_bar(int i)
{
while(i){
printf("*");
i--;
}
}

で大丈夫だと思います。
バー表示後の改行を忘れずに。
241デフォルトの名無しさん:2005/05/26(木) 19:06:39
>>215
”任意の係数をキーボードより入力”
ってどんな入力方法なんだ?
242デフォルトの名無しさん:2005/05/26(木) 19:07:57
>>239
挨拶なんて別にいいから流れを読もうね。
243grass:234:2005/05/26(木) 19:16:52
>>238

キーボードからデータを取り込むとしてデータ読み込み部を書きます。

double counter[20];

char buffer[16];

void read_and_prossess(int n)
{
int i;
double tall;

/* counter 初期化 */
for(i = 0;i < 20;i++){ counter[i] = 0; }

for(i = 0;i < n;i++){
gets(buffer);
tall = atof(buffer);
counter[(int)tall /10] ++;
}
}

これで配列counterにそれぞれの範囲内にいる人数が格納されます。
counter[i]には i*10<=身長<(i+1)*10 の人数が入ります。

ただしこの関数は身長200以上を入れると暴走する可能性のある不完全な物です。

>>242
はい、すみません。
244デフォルトの名無しさん:2005/05/26(木) 19:35:05
>>237-238
#include <stdio.h>
PutSter(int n){
    while(n){
        printf("*");
        n--;
    }
}
int main(){
    int N,i,k;
    int data[30];
    puts("Input N...");
    scanf("%d",&N);
    for(i=0;i<30;i++)data[i]=0;
    for(i=0;i<N;i++){
        puts("Input height...");
        scanf("%d",&k);
        k= k/10;
        if(k<0 || k>=30){
            puts("invalid data");
            i--;
            continue;
        }
        data[k]++;
    }
    for(i = 0;i<30;i++){
        printf("%d-%d:",i*10,(i+1)*10-1);
        PutSter(data[i]);
        printf("\n");
    }
    return 0;   
}
245デフォルトの名無しさん:2005/05/26(木) 19:39:22
>>238
#include <stdio.h>
#include <stdlib.h>

int main(){
int i, j, c, n, imin, imax;
double *height, tmp, max, min;
scanf("%d", &n);
height = (double *)malloc(sizeof(double)*n);
for(i = 0; i < n; i++) scanf("%lf", &height[i]);
/* ぶくぶくソート */
for(i = 0; i < n-1; i++){
for(j = n-1; j > i ;j--){
if(height[j] < height[j-1]){
tmp = height[j]; height[j] = height[j-1]; height[j-1] = tmp;
}
}
}
min = height[0]; max = height[n-1]; imin = (int)min / 10 * 10; imax = (int)max / 10 * 10;
j = 0;
for(i = imin; i <= imax; i+=10){
printf("%d <=x< %d : ", i, i+10); c = 0;
while(j < n && height[j] < i+10){
printf("*"); j++; c++;
}
printf(" %d名\n", c);
}
return 0;
}
246デフォルトの名無しさん:2005/05/26(木) 20:14:04
[1] 授業単元: プログラミング
[2] 問題文(含コード&リンク):文字列strと一致するファイルあるいは
ディレクトリがカレントディレクトリにあれば1を返し、なければ0を返す関数
int schfile(char *str)を作成せよ。
[3] 環境
 [3.1] OS:Free BSD
 [3.2] コンパイラ(バージョン): cc
 [3.3] 言語:C
[4] 期限:できれば今すぐに
[5] その他の制限:
    #include<stdio.h>
#include<stdlib.h>
#include<string.h>

int schfile(char *str){


から書き出してください。
お願いします。
247デフォルトの名無しさん:2005/05/26(木) 20:40:37
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int schfile(char *str){return rand()%2;}
248デフォルトの名無しさん:2005/05/26(木) 20:54:07
>>246
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>

int schfile(char *str){
DIR *fp;
struct dirent *p;
int result = 0;
fp = opendir( "." );
while( ( p=readdir(fp) )!=NULL ){
if( strcmp( str, p->d_name ) ) continue;
result = 1;
break;
}
closedir(fp );
return result;
}

int main( int argc, char *argv[] )
{

printf( "result = %d\n", schfile( argv[1] ) );

return 0;
}
249デフォルトの名無しさん:2005/05/26(木) 20:55:04
>>246
OSの違いを吸収できなかった。
ファイルあるかどうかだけなら簡単なんだけどね。

250249:2005/05/26(木) 20:56:34
あれ?できてる??
251デフォルトの名無しさん:2005/05/26(木) 21:01:30
>>248
POSIXか。
ANSI-Cのほうしかしらなかった。
252246:2005/05/26(木) 21:55:39
>>249
dirent.hを使わずに出来ませんか?
253デフォルトの名無しさん:2005/05/26(木) 22:17:50
>>252
リードオンリでfopenできればファイルかディレクトリがある。
254デフォルトの名無しさん:2005/05/26(木) 22:23:14
>>252
じゃ、こうしろ

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int schfile(char *str){
#include <dirent.h>
DIR *fp;
255デフォルトの名無しさん:2005/05/26(木) 22:26:53
>>246
ヘッダから推測すると、system(3)を使うような気がする。
256デフォルトの名無しさん:2005/05/26(木) 22:28:33
>>205
最適化って知ってる?
257初心者:2005/05/26(木) 22:56:52
学校の数値解析という授業でy=sin(x)を微分するプログラムをc言語で作れという宿題が出ました。はっきりいってまったくわからなくてこまってます。ぜひお教えください。
258デフォルトの名無しさん:2005/05/26(木) 23:04:56
>>257
y'=cos(x) とかそういうことではないよな?
259初心者:2005/05/26(木) 23:07:55
微分方程式y'=cos(x)を離散化して逐次計算式を用いてプログラムを作れというものでした。
説明不足で申し訳ありません。
260デフォルトの名無しさん:2005/05/26(木) 23:39:22
y''=-sin(x)
261デフォルトの名無しさん:2005/05/26(木) 23:41:35
書き込みの時間見るとマルチです。
262デフォルトの名無しさん:2005/05/26(木) 23:43:05
527 名前:初心者 :2005/05/26(木) 22:52:39
学校の数値解析という授業でy=sin(x)を微分するプログラムを作れという宿題が出ました。はっきりいってまったくわからなくてこまってます。ぜひお教えください。


528 名前:デフォルトの名無しさん :2005/05/26(木) 23:01:19
>>527
数値的な微分でいいのか解析的な微分が必要なのかくらいは書いてくれ。
そんだけの情報じゃ私たちも全くわからなくて困ります。


529 名前:初心者 :2005/05/26(木) 23:05:06
申し訳ありませんでした。
問題は数値的な微分です。
逐次計算式を作って計算するプログラムを作れといわれました。


530 名前:デフォルトの名無しさん :2005/05/26(木) 23:05:55
>>527
宿題スレに逝け
263デフォルトの名無しさん:2005/05/26(木) 23:49:45
>>259
こういうことかね?

#include <stdio.h>
#include <math.h>

#define DELTA 0.001

int main() {
 double x;
 for (x = -1.0; x < 1.0; x += DELTA)
  printf("sin'(%f)=%f\n", x, (sin(x + DELTA) - sin(x)) / DELTA);
 return 0;
}
264デフォルトの名無しさん:2005/05/27(金) 01:44:50
>>253
権限がないとファイルがあっても開けない
265デフォルトの名無しさん:2005/05/27(金) 07:09:43
【質問テンプレ】
[1] 授業単元: プログラミング実習
[2] 問題文(含コード&リンク):
仲の悪いaとbが映画館で出会ってしまい、空席が5席ある。
それぞれの関の番号とx,y座標は下の表のとおりである。
このなかからaとbの二人が座るべきもっとも離れた2つの座席a,bを見つけなさい
座席番号 x座標 y座標
1    1,1   5,2
5    3,4   1,6
10   2,3   2,6
15   6,4   5,7
16   7,6   7,8


[3] 環境
 [3.1] OS:Unix
 [3.2] コンパイラ(バージョン):知らない(´・ω・`)
 [3.3] 言語:C
[4] 期限:今日のお昼過ぎOTL
[5] その他の制限:まだ5,6回の授業しかやってませんので初歩的なことしかやってません。けど漏れはぜんぜんわからない・・・

いざやろうと思ったらぜんぜんわからないです。時間ないけど、誰かお願い・・・
266デフォルトの名無しさん:2005/05/27(金) 08:35:15
>>265
丸投げならいいけど、やる気があるなら「ぜんぜんわからない」ではなくちっとは考えてみよう。
例えば、二点間の距離の求め方は知ってるよな?
5点から2点の組み合わせを全部生成して、その距離を求めて最大のものを探せばいい。
#オプションでaとbが最も近い座席を考えてもいいね。
267デフォルトの名無しさん:2005/05/27(金) 08:35:18
>>265
空席番号1にX座標が1,1で、Y座標が5,2ってどういうこと?
小数点?座標に小数点使うのもアレげなんだが。
よくわかんないんだが、
(ax-bx)*(ax-bx)+(ay-by)*(ay-by)の一番大きいのを求めて
その座標番号の組を表示すればいいんじゃね?
ルートがついてないのは、ルートあるなしで大小関係がかわんないため。
268デフォルトの名無しさん:2005/05/27(金) 08:35:59
269初心者B:2005/05/27(金) 11:04:08
この問題解ける方いますか?

点数(0〜100点)を複数入力して、合計点、平均点、最高点、最低点、60点未満の件数を求め出力するプログラムを作成しなさい。なお-1が入力されたら入力終了すること。

出力結果例
30 (入力)
85 (入力)
45 (入力)
70 (入力)
-1 (入力)
合計:200点 平均:57.5点 (出力)
最高:85点 最低:30点 (出力)
60点未満:2名 (出力)
270デフォルトの名無しさん:2005/05/27(金) 11:12:13
int sum = 0, count = 0, max = 0, min = 100, under60 = 0, a;
double avg;
while (scanf("%d", &a) == 1 && a > 0) {
count++;
sum += a;
if (a > max) max = a;
if (a < min) min = a;
if (a < 60) under60++;
}
avg = (double) sum / count;
printf("%d %f %d %d %d\n", sum, avg, max, min under60);
271デフォルトの名無しさん:2005/05/27(金) 11:29:39
すごくやっつけ
#include<stdio.h>
int main(int argc,char **argv){
    int total=0,min=100,max=0,n=0,u60=0,tmp;
    do{
        scanf("%d",&tmp);
        if(tmp!=-1){
            total+=tmp;
            n++;
            if(min>tmp)min=tmp;
            if(max<tmp)max=tmp;
            if(tmp<60) u60++;
        }
    }while(tmp!=-1);
    if(n!=0){
        printf("合計:%d点 平均:%f点\n",total,(double)total/n); 
        printf("最高:%d点 最低:%d点\n",max,min); 
        printf("60点未満:%d名\n",u60);
    }else{
        /* なにも入力されてません */
    }
    return 0;
}

>>270 だと0点が勘定に入らない a>0を どうにか変えればなんとか
272デフォルトの名無しさん:2005/05/27(金) 11:46:13
ああ、ほんまや。入力数が0のときは、ゼロ除算とかやってるな。>>270
273デフォルトの名無しさん:2005/05/27(金) 12:30:45
>>270
>>271
レスサンクス
参考にさせてもらいますた
274デフォルトの名無しさん:2005/05/27(金) 16:31:38
[1] 授業単元:
[2] 問題文(含コード&リンク):標準入力から得た文字列中の数字をすべて"0"に変換するプログラムを書け
[3] 環境
 [3.1] OS:Linux
 [3.2] コンパイラ(バージョン):GCC
 [3.3] 言語:C
[4] 期限:2005年5月29日24:59まで または 無期限 のいずれか
[5] その他の制限:特に制限なしだけど、出来るだけ短いプログラムでお願いします
275デフォルトの名無しさん:2005/05/27(金) 16:36:22
>>274
int main(void)
{
    int ch;
    while ((ch = getchar()) != EOF)
        putchar(isdigit(ch) ? '0' : ch);
    return 0;
}
276デフォルトの名無しさん:2005/05/27(金) 16:38:51
123hoge456->000hoge000?
123hoge456->0hoge0??
277217後日談:2005/05/27(金) 16:39:10
プログラム見せたらなんでvoid main(void)じゃないんだと激しく怒られました。
今、勉強してるのは組み込みマイコン系だからvoid〜でやれ、
int mainはc++の書き方とか言われました。

結局>>236のプログラムのint mainをvoid main(void)にしてcharでDATAMAXを設定し
output(指定した変数)にして、outputをプロトコル関数に指定した最後にreturnをつけてみました。
278デフォルトの名無しさん:2005/05/27(金) 16:41:16
1] 授業単元: アルゴリズム論
[2]問題文:配列に先頭から順にアルファベットの小文字を乱数発生関数を使用してランダムに20個詰め,
配列要素の値(文字)を添え字とともに表示するプログラムを作成しなさい。
ただし,同じ文字が複数回現れてもかまわない。
ヒント: 文字'a'はASCIIコードで97(十進数)で,a〜zのASCIIコードは連続していることを利用する。
つまり,'a'は97+0,'b'は97+1, ... , 'z'は97+25となる。すなわち,アルファベットは26文字
なので,乱数は0から25までを発生させ,それを利用する。

[3] 環境
 [3.1] OS:WindowsXP
 [3.2] コンパイラ(バージョン):
 [3.3] 言語:C言語
[4] 期限:2005年5月27日18時まで

期限ぎりぎりまで考えたのですがさっぱり、、先輩方助けて下さい
279278:2005/05/27(金) 16:44:32
[1] 授業単元: アルゴリズム論
[2]問題文:配列に先頭から順に0から15までの数字を乱数発生関数を使ってランダムに20個詰め,添え字と
ともに表示する。その後,キーボードから数字を入力し,線形探索を使って,その数値と一致
する要素があれば添え字を表示し(複数あれば全て表示)無ければ,No Dataと表示するプロ
グラムを作成しなさい。


[3] 環境
 [3.1] OS:WindowsXP
 [3.2] コンパイラ(バージョン):
 [3.3] 言語:C言語
[4] 期限:2005年5月27日18時まで

2つあるのですがこちらのほうもさっぱり、、、
280デフォルトの名無しさん:2005/05/27(金) 16:53:49
>>278
テスト環境はLinux。乱数初期化のとこ動かなかったら適当に替えてくれ。

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>

#define NUM 20

int main( void )
{
char buff[NUM+1];
int count;

srand( getpid() );

for( count=0; count<NUM; count++ )
buff[count] = 'a' + rand() % 26;

buff[NUM] = '\0';

for( count=0; count<NUM; count++ )
printf( "%2d:%c\n", count, buff[count] );

puts("");

return 0;
}
281 ◆3t8QJxJClA :2005/05/27(金) 16:56:36
>>132 レスありがとうございました!

大変参考になりました!
282278:2005/05/27(金) 16:57:42
>>280
迅速な解答、ありがとうございます。
本当にたすかります。もしよろしかったら2問目も教えて下さい。
よろしくおねがいいたします。
283デフォルトの名無しさん:2005/05/27(金) 16:59:20
>>280
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>

#define NUM 20

int main( void )
{
int buff[NUM];
int count, val;

srand( getpid() );

for( count=0; count<NUM; count++ )
buff[count] = rand() % 16;

printf( "input number(0-15):" ); fflush(stdout);
scanf( "%d", &val );

for( count=0; count<NUM; count++ )
if( buff[count] == val ){
printf( "%d:%d\n", count, buff[count] );
return 0;
}
puts("No Data\n");

return 0;
}
284デフォルトの名無しさん:2005/05/27(金) 17:03:37
>>279
複数対応だったな。スマソ

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#define NUM 20
int main( void )
{
int buff[NUM];
int count, val, flg;
srand( getpid() );
for( count=0; count<NUM; count++ )
buff[count] = rand() % 16;
printf( "input number(0-15):" ); fflush(stdout);
scanf( "%d", &val );
flg = 0;
for( count=0; count<NUM; count++ )
if( buff[count] == val ){
printf( "%d:%d\n", count, buff[count] );
flg = 1;
}
if( ! flg )
puts("No Data\n");

return 0;
}
285デフォルトの名無しさん:2005/05/27(金) 17:10:53
>>277
自分で何とかできるならそれはそれで良し。
そういう能力はどこでも必要だし、旨いことやってくださいな。
286デフォルトの名無しさん:2005/05/27(金) 17:16:53
[1] 授業単元: アルゴリズム論
[2]問題文:配列に先頭から順に150から199までの50個の整数値を入れる。その後,キーボードから入力された
整数値が入っている配列を2分探索法で探し,その添え字の番号を表示するプログラムを作成しなさい。


[3] 環境
 [3.1] OS:WindowsXP
 [3.2] コンパイラ(バージョン):
 [3.3] 言語:C言語
[4] 期限:2005年5月27日17時50分まで

これできないと単位が、、、どなたか助けてください。
287デフォルトの名無しさん:2005/05/27(金) 17:20:23
>>277
一応 int main(void)はCでも規格に採用されている正式なもの。
だから頭の片隅にでも入れておいても損は無い。
288デフォルトの名無しさん:2005/05/27(金) 17:37:49
>>286
#include <stdio.h>
#define NUM 50
int main( void )
{
int data[NUM];
int count,val,start,end,pos;

for( count=0; count<NUM; count++ )
data[count]=150+count;

printf( "input number(150-199): "); fflush(stdout);
scanf( "%d", &val );

start=0; end = NUM-1;
while(1){
pos = ( end + start ) / 2;
if( data[pos] == val ){
break;
}
else if( data[pos] > val ){
end = pos - 1;
}
else {
start = pos + 1;
}
}
printf( "%d\n", pos );
return 0;
}
289デフォルトの名無しさん:2005/05/27(金) 17:50:49
>>286
折角作ったからage。
#include <stdio.h>
#define NUMBASE (150)
#define NUMMAX  (199)
#define ARRAYMAX (50)
int main(){
    int i,in,pos,len;
    int data[ARRAYMAX];
    for(i=0;i<ARRAYMAX;i++){
        data[i]=i+NUMBASE;
    }
    printf("Input Num(%d-%d)",NUMBASE,NUMMAX);
    scanf("%d",&in);
    if(in>NUMMAX || in<NUMBASE){
        puts("invalid value");
        return 0;
    }
    in-= NUMBASE;
    pos= ARRAYMAX/2;
    len=ARRAYMAX /2;
    while(1){
        if(pos==in) break;
        len /= 2;
        if(len == 0) len=1;
        if(pos<in)  pos+= len;
            else    pos -= len;
    }
    printf("Array[%d]=%d\n",pos,data[pos]);
    return 0;
}
290デフォルトの名無しさん:2005/05/27(金) 18:00:36
>>278,279,286の締め切りが微妙に違っている件について
291デフォルトの名無しさん:2005/05/27(金) 19:00:18
[1] コンピューター物理学
[2]while、for、do-whileの3種類のループを用いて、
  読み込んだ整数の段数を持つピラミッドを表示するプログラムを作れ。
  例: inuput number of lines: 3
| * |
| *** |
| ***** |
[3]環境
 [3.1]UNIX
 [3.2]cc,gcc,Fortran(バージョンは分かりませんが、数年前のものです)
 [3.3] 言語:C
[4] 期限:5月31日
[5] 初習者用問題なので、単純に書けると思うのですが…。
空白の空け方が分かりません。多重ループを使うと思うのですが。
292デフォルトの名無しさん:2005/05/27(金) 19:01:35
|   * |
|  *** |
| ***** |
293デフォルトの名無しさん:2005/05/27(金) 19:11:24
[1] 授業単元:プログラミング
[2]問題文:
整数nを与えると、0〜n-1の整数の中からn個を選択するという操作をし、その全ての組み合わせを画面にプリントアウトする関数を作成せよ。
数の選択では重複を認める。

[3] 環境
 [3.1] OS:Linux
 [3.2] コンパイラ(バージョン): gcc
 [3.3] 言語: C
[4] 期限:5/30
294デフォルトの名無しさん:2005/05/27(金) 19:13:20
>>291
#include <stdio.h>

int main(void){

int n, i, j;
printf("inuput number of lines:");
scanf("%d", &n);
if(n < 1) return 0;
for(i = 0; i < n; i++){
printf("|");
j = 0;
while(j++ < n - i){
printf(" ");
};
j = 0;
do{
printf("*");
}while(j++ < 2*i);
j = 0;
while(j++ < n - i){
printf(" ");
};
printf("|\n");
}
return 0;
}
295デフォルトの名無しさん:2005/05/27(金) 19:23:37
[1] 授業単元: オペレーティングシステム
[2] 問題文(含コード&リンク):

(1)shellコマンド‘echo’と同じ機能を持つ、
新コマンド‘myecho’を作成せよ
(2)設定されている全環境変数を表示するプログラムを作成せよ
(3)‘pwd’と同じ機能を持つ‘mypwd’を作成せよ

[3] 環境
[3.1] OS:Linux
[3.2] コンパイラ(バージョン):gcc
[3.3] 言語:C言語
[4] 期限:5月30日まで

よろしくおねがいします。


(1)shellコマンド‘echo’と同じ機能を持つ、新コマンド
‘myecho’を作成せよ
(2)設定されている全環境変数を表示するプログラムを作成せよ
(3)‘pwd’と同じ機能を持つ‘mypwd’を作成せよ
296295:2005/05/27(金) 19:25:05
すいません 問題文2回も書いてしまいました・・・。
297291:2005/05/27(金) 19:33:45
>>294
うわー、すいません。
do,while,for それぞれを使い、三つのプログラムを書け、という課題です。
それと、|、はいりません。
298デフォルトの名無しさん:2005/05/27(金) 19:37:57
>>297
forのみ。do whileやwhileへの書き換えは機械的にできる。
出来なければ勉強しなさい。
#include <stdio.h>

int main(void) {
    int n, i, j;
    printf("input number of lines:"); scanf("%d", &n);
    for (i = 0; i < n; i++) {
        for (j = 0; j < n - i - 1; j++)
            printf(" ");
        for (j = 0; j < 2 * i + 1; j++)
            printf("*");
        printf("\n");
    }
    return 0;
}
299291:2005/05/27(金) 19:40:45
>>298
ありがとうございます。
分かりました。それを参考にやってみます。
300デフォルトの名無しさん:2005/05/27(金) 20:00:15
>>293
#include <stdio.h>

int main( void )
{
unsigned int num, val, max, count1, count2, div;

printf( "inuput number of lines(1-100): " ); fflush(stdout);
scanf( "%d", &num );

max=1;
for( count1=0; count1<num; count1++ )
max *= num;

for( count1=0; count1<max; count1++ ) {
printf( "%d: ", count1 );
div = max;
val = count1;
for( count2=0; count2<num-1; count2++ ){
div /= num;
printf( "%d ", val/div );
val %= div;
}
printf( "%d\n", val );
}
return 0;
}
301デフォルトの名無しさん:2005/05/27(金) 20:07:04
>>300
> 関数を作成せよ。
302デフォルトの名無しさん:2005/05/27(金) 20:08:01
>>301
main関数だろうが、文句あっか
303デフォルトの名無しさん:2005/05/27(金) 23:34:47
C言語で

if((num1==1&&num2==2&&num3==3)||(num1==2&&num2==3&&num3==1)||(num1==3&&num2==1&&num3==2))
これもっと簡略できませんか?馬鹿ですみません;
304デフォルトの名無しさん:2005/05/27(金) 23:40:36
>>303
ここは質問スレじゃありませんよ
305デフォルトの名無しさん:2005/05/27(金) 23:54:18
>>293
順列…じゃないよね?
#include <stdio.h>
#include <stdlib.h>

void hoge2(int n, int m, int depth, int *p){
int i;
if(n == depth){
for(i = 0; i < n; i++) printf("%d ", p[i]);
printf("\n");
return;
}
for(i = m; i < n; i++){
p[depth] = i;
hoge2(n, i, depth+1, p);
}
}

void hoge(int n){
int *p;
p = (int *)malloc(sizeof(int)*n);
hoge2(n, 0, 0, p);
free(p);
}

int main(void){
int n;
scanf("%d", &n);
if(n < 1) return 0;
hoge(n);
return 0;
}
306デフォルトの名無しさん:2005/05/28(土) 00:52:12
>>303
if((1<<num1)|(1<<num2)|(1<<num3) == 0x0e)
307306:2005/05/28(土) 00:54:02
投げてから気づいた。間違い。
num1〜3が1〜3の値しか取らないとかの制限があれば簡単にできるかも。
308デフォルトの名無しさん:2005/05/28(土) 03:13:51
>303

int list[3+1]={0};
++list[num1];
++list[num2];
++list[num3];
if(list[1] && list[2] && list[3])

...マンドクセーカ orz
309デフォルトの名無しさん:2005/05/28(土) 05:35:14
部分のコードだけではどーしよーもねぇな。
C言語なら俺に聞けあたりのネタだしな。
310デフォルトの名無しさん:2005/05/28(土) 05:58:13
かきこしようとしたら山田警報?
とりあえずretry

tmp = ((num3 & 3) | ((num2 & 3) << 2) | ((num1 & 3) << 4));
tmp |= (tmp << 6);
if ((tmp & 63) == 27 || ((tmp >> 2 ) & 63) == 27 ||
((tmp >> 4) & 63) == 27) {

意味なし
311デフォルトの名無しさん:2005/05/28(土) 11:24:20
行列A、Bを
  1 3 5 9 3
A=2 5 8 B=8 4
4 6 9 7 5
とするとき、AとBの積Cを求めて表示するプログラムを制作せよ

どなたかこの問題をやってもらえませんか?よろしくお願いします
312311:2005/05/28(土) 11:30:55
あ、ずれた・・・

1 3 5
2 5 8=A
4 6 9

9 3
8 4=B
7 5

正しくは↑です
313デフォルトの名無しさん:2005/05/28(土) 11:56:56
>>311
テンプレ読もうね
#include <stdio.h>

int main( void )
{
int A[3][3]={{1,3,5},{2,5,8},{4,6,9}},
B[3][2]={{9,3},{8,4},{7,5}},
C[3][2], sum, row, col, count;

for( row=0;row<3;row++ )
for( col=0;col<2;col++ ){
C[row][col]=0;
for(count=0;count<3;count++)
C[row][col]+= A[row][count]*B[count][col];
}

for( row=0;row<3;row++ ){
for( col=0;col<2;col++ )
printf( "%d ", C[row][col] );
puts("");
}

return 0;
}
314デフォルトの名無しさん:2005/05/28(土) 11:59:44
>>303
if(num1+num2+num3==6)
315311:2005/05/28(土) 12:35:12
>>313
ありがとうございました!
これからは気をつけます
316デフォルトの名無しさん:2005/05/28(土) 13:49:18
>314

2+2+2 とかだめじゃん
317デフォルトの名無しさん:2005/05/28(土) 14:17:13
値域が限定しているなら、 if (num1 * num2 * num3 == 6)で。
318293:2005/05/28(土) 15:04:06
>>305さんの答えが私が求めていたものです。どうもありがとうございました。
>>300さんもお答えいただいて、ありがとうございました。
319デフォルトの名無しさん:2005/05/28(土) 15:26:03
>>317

3*2*1 とかだめじゃん
320デフォルトの名無しさん:2005/05/28(土) 15:57:50
>319
つまり
1,2,3
2,3,1
3,1,2
だけ判定しろってことか...orz
321デフォルトの名無しさん:2005/05/28(土) 16:15:30
#define P(x) ((x) == 1 || (x) == -2)
P(num2-num1) && P(num3-num2) && P(num
322デフォルトの名無しさん:2005/05/28(土) 20:40:10
#include<stdio.h>

int main(int argc,char **argv){
    int num1,num2,num3;
    for(num1=1;num1<10;num1++)
        for(num2=1;num2<10;num2++)
            for(num3=1;num3<10;num3++)
                if((num3-num1+3)%3==2 && num1*num2*num3==6)
                    printf("num1=%d num2=%d num3=%d\n",num1,num2,num3); 
    return 0;
}

123
231
321
と116がおまけで付いてきてもいいなら
323デフォルトの名無しさん:2005/05/28(土) 20:49:38
俺の部屋も片付けてください・・・。
324デフォルトの名無しさん :2005/05/28(土) 21:25:05
大学で出された初の課題なんですが、俺はバカなのでわかりません。

問3
char型変数aにscanfを用いて一文字読み込み、文字型 2進、8進、10進、
16進に変換して出力しなさい。

出力例
a?A

文字 = A
8進 = 101
10進 = 65
16進 = 41
2進  = 1000001

b?abcdefg

文字列 = abcdefg
アルゴリズムは自力で何とかしますんで、よろしくです。。。
325デフォルトの名無しさん:2005/05/28(土) 21:49:42
>>324
2進以外

#include<stdio.h>

int main(int argc,char **argv){
    char a;
    printf("a?");
    scanf("%c",&a);
    printf("文字 = %c\n",a); 
    printf("8進 = %o\n",a); 
    printf("10進 = %d\n",a); 
    printf("16進 = %x\n",a); 
    
    return 0;
}
326デフォルトの名無しさん:2005/05/28(土) 22:11:24
>>324
2進
#include<stdio.h>

int main(void){

int flag = 0, i;
char a, tmp;
printf("a?");
scanf("%c",&a);

printf("2進 = ");
tmp = a;
for(i = sizeof(char)*8; i > 0; i--){
if(tmp&(1<<(sizeof(char)*8-1))){
printf("1");
flag = 1;
}
else if(flag) printf("0");
tmp<<=1;
}
printf("\n");

return 0;
}
327デフォルトの名無しさん:2005/05/28(土) 22:12:28
>322
激しく無駄ぢゃん
元の>303見れ
328デフォルトの名無しさん:2005/05/28(土) 22:18:01
>>324
全部
#include<stdio.h>
int main(void) {
    int index = 0, left = 0;
    char a, x, s[16], temp;
    printf("a?"); scanf("%c", &a);
    printf("文字=%c\n", a);
    x = a;
    do {
        s[index++] = x % 2 + '0';
        x >>= 1;
    } while (x);
    s[index--] = '\0';
    while (left < index) {
        temp = s[left];
        s[left] = s[index];
        s[index] = temp;
        ++left;
        --index;
    }
    printf(" 2進=%s\n", s);
    printf(" 8進=%o\n", a);
    printf("10進=%d\n", a);
    printf("16進=%x\n", a);
    return 0;
}
329324:2005/05/28(土) 22:23:52
>>325-326 >>328さんありがd。
あとは自分でやってみます。
330デフォルトの名無しさん:2005/05/28(土) 23:29:40
[1] 授業単元:ポインタ
[2] 問題文(含コード&リンク):
1.main()において一次元配列data[10]に数値を入力し、配列の先頭アドレスと要素数の個数が入っている変数のアドレスを
 因数にして配列中で最大値の格納されているアドレスを返す関数int *max_data(int *tbl,int *kosu)
2.a[]="What You See Is What You Get",b[]="=WYSIWYG"の文字列を連結してc[40]に格納する
 処理は書く配列の線t脳アドレスを引数として関数void renketu(char *moji1,char *moji2,char *kekka)で文字列の連結を行い
 結果はmain関数にて出力
[3] 環境
 [3.1] OS:WindowsNT
 [3.2] コンパイラ(バージョン):
 [3.3] 言語:C/
[4] 期限:月曜
[5] その他の制限:ポインタを習い終わったばかり
331デフォルトの名無しさん:2005/05/28(土) 23:36:09
線t脳アドレス
332デフォルトの名無しさん:2005/05/28(土) 23:44:40
>>330
1.
int *max_data(int *tbl, int *kosu) {
    int *max = tbl, i;
    for (i = 1; i < *kosu; i++)
        if (*max < tbl[i])
            max = tbl + i;
    return max;
}

2.
#include <stdio.h>
#include <string.h>

void renketu(char *moji1, char *moji2, char *kekka) {
    while(*kekka++ = *moji1++){}
    kekka--;
    while(*kekka++ = *moji2++){}
}

int main(void) {
    char a[]="What You See Is What You Get", b[]="=WYSIWYG", s[128];
    renketu(a, b, s);
    printf("%s", s);
}
333332:2005/05/28(土) 23:45:01
#include <string.h>が余計だった。削ってくれ。
334デフォルトの名無しさん:2005/05/28(土) 23:57:11
int *max_data(int *tbl,int *kosu)
{ int i,*maxPos=tbl;
for(i=1; i<*kosu; ++i) if(*(tbl+i)>*maxPos) maxPos=tbl+i;
return maxPos;
}
void renketu(char *moji1,char *moji2,char *kekka)
{ int i=0;
while(*moji1) *(kekka+(i++))=*moji1++;
while(*moji2) *(kekka+(i++))=*moji2++;
*(kekka+i)='\0';
}
335デフォルトの名無しさん:2005/05/29(日) 00:08:30
>>328
入力するのはaだけじゃまいか?
336デフォルトの名無しさん:2005/05/29(日) 00:10:21
>>332,334
i=1からでよかったっけ?先頭要素って*tblで参照するような気がするのだが、私の記憶違いかな。
337デフォルトの名無しさん:2005/05/29(日) 00:19:38
>336
もまえはコードの意味がわかっていないだけだ
338デフォルトの名無しさん:2005/05/29(日) 00:57:03
>>335
おっと、bを忘れていた。
339デフォルトの名無しさん:2005/05/29(日) 01:12:57
[1] 授業単元:情報システム工学実験
[2] 問題文(含コード&リンク):
2*((d^2y)/(dx^2))+0.5*(dy/dx)+2.5y=1
y(x=0)=0,dy/dx(x=0)=0.1の時、この微分方程式をルンゲッタ法によって
数値計算し、x軸=0.01刻みでyの値を表示するプログラム書け。
[3] 環境
 [3.1] OS:Windows
 [3.2] コンパイラ(バージョン): Visual studio .NET 2003
 [3.3] 言語:C
[4] 期限:2005年5月29日23:59
[5] その他の制限:
使用できるヘッダーファイルは"stdio.h","string.h","stdlib.h","math.h"
位だと思います。

よろしくお願いします。
340デフォルトの名無しさん:2005/05/29(日) 01:21:12
>>339
ルンゲッタ法に該当するページが見つかりませんでした。 by Google
341デフォルトの名無しさん:2005/05/29(日) 01:34:15
>>340
多分ルンゲクッタ法の間違いだと思われる
342デフォルトの名無しさん:2005/05/29(日) 01:38:53
xをどこまで動かして表示するの?
343デフォルトの名無しさん:2005/05/29(日) 03:44:33
[1] 授業単元:ファイル入出力
[2] 問題文:
正方行列(2×2行列)の和、差を求める(入力、出力をファイルで行う)プログラムを作成せよ。
なお、和と差は関数にして、1つのソースプログラムで作ること。
[3] 環境
 [3.1] OS:Windows
 [3.2] コンパイラ(バージョン):
 [3.3] 言語:C
[4] 期限:2005年5月30日まで
[5] その他の制限:

行列の要素の入出力をファイルで行うところがよくわかりません。
よろしくお願いしますm(_)m
344デフォルトの名無しさん:2005/05/29(日) 04:29:55
>>343
入出力ファイルのフォーマットが分からないとどうしようもない
好きなように仮定して良いの?
345856:2005/05/29(日) 04:43:09
[1] 授業単元:プログラミングU
[2] 問題文:
与えられたプログラムを以下のように直せ
・円を右から2個半円にする
・円の上に赤、下に黄の接線を引く
・一番右の半円に緑、右から2番目に青の色をつける


[3] 環境
 [3.1] OS:WindowsXP
 [3.2] コンパイラ(バージョン):Visual Studio .net 2003
 [3.3] 言語:C
[4] 期限:2005年5月30日5:30まで
346856:2005/05/29(日) 04:45:00
これがソースです

#include <windows.h>

#define APP_NAME TEXT("Sample_MainWindow")

LRESULT CALLBACK WindowProc (
HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
) {
HDC hdc;
PAINTSTRUCT ps;

switch(uMsg) {
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_PAINT:
hdc = BeginPaint(hWnd , &ps);
LineTo(hdc , 400 , 100);

347856:2005/05/29(日) 04:45:27
Ellipse(hdc , 10 , 10 , 100 , 100);
Arc(hdc , 110 , 10 , 200 , 100 , 100 , 0 , 210 , 0);
Pie(hdc , 210 , 10 , 300 , 100 , 200 , 0 , 310 , 0);
Chord(hdc , 310 , 10 , 400 , 100 , 300 , 0 , 410 , 0);

EndPaint(hWnd , &ps);
return 0;
}
return DefWindowProc(hWnd , uMsg , wParam , lParam);
}

int WINAPI WinMain(
HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR lpCmdLine, int nCmdShow
) {
WNDCLASS wc;
MSG msg;

348856:2005/05/29(日) 04:45:41
wc.style= CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc= WindowProc;
wc.cbClsExtra= 0;
wc.cbWndExtra= 0;
wc.hInstance= hInstance;
wc.hIcon= LoadIcon(NULL , IDI_APPLICATION);
wc.hCursor= LoadCursor(NULL , IDC_ARROW);
wc.hbrBackground= (HBRUSH)COLOR_BACKGROUND + 1;
wc.lpszMenuName= NULL;
wc.lpszClassName= APP_NAME;

if (!RegisterClass(&wc)) return 0;

if (CreateWindow(
APP_NAME , TEXT(__FILE__) ,
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
CW_USEDEFAULT , CW_USEDEFAULT,
CW_USEDEFAULT , CW_USEDEFAULT,
NULL , NULL , hInstance , NULL
) == NULL) return 0;

while(GetMessage(&msg , NULL , 0 , 0) > 0) {
DispatchMessage(&msg);
}

return msg.wParam;
}
349デフォルトの名無しさん:2005/05/29(日) 07:30:52
350339:2005/05/29(日) 09:42:27
>>349
すいません。エラーがたくさん出てコンパイルできないです。。。
351≠349:2005/05/29(日) 10:17:37
問題なくコンパイルできるよ。コンパイラは何を使ってる?
それと、どんなエラーが出た?
352339:2005/05/29(日) 10:38:22
VisualStudio.NET 2003です。
今PCがネットに繋がってないので詳しくは書けないのですが、
31〜37行目にかけて、関数へのポインタを通して実行される
呼び出しに対する引数が多すぎます。
60行目が6番目の引数をdouble(double,double,double)から
(_cdel*)(void)に変換できません。
みたいな感じで出ます。
353339:2005/05/29(日) 10:42:39
すいません。
拡張子がcppになっていました。
拡張子をcに変えたら無事コンパイル出来ました。
ありがとうございました。
354デフォルトの名無しさん:2005/05/29(日) 11:53:13
VCでエディットボックスを作成した時、その中に書き込まれる文字列が
同じ半角英数なのに幅が違ってしまいます。
下の例だと全て幅は同じですが。
同じ10文字なのに半角数字とアルファベットでは幅が違ってしまうのです。
これを解消するにはどうしたらいいでしょう。

例:
1234567890
ABCDEFGHIJ
abcdefghij
(ここだと横幅は全て同じ)
355デフォルトの名無しさん:2005/05/29(日) 12:13:21
>>354
スレ違い。プロポーショナルフォント(MS Pとか)使うからだろ。
356デフォルトの名無しさん:2005/05/29(日) 12:18:11
c言語の宿題なんですがうまくいきません。
文字列strの中に,文字cが含まれていれば(複数ある場合には,最も先頭側と する),その文字へのポインタを返し,含まれていなければ,NULLを返す関数 char *str_char(const char *str, int c) を作成せよ.

#include<stdio.h>
char *str_char(const char *str, int c){
while(*str){
if(*str== c){
return *str;
}
str++;
}
return NULL;
}

main(){
char *str;
scanf("%s", str);
printf("%s\n", *str_char(str, 'c'));
}

どこをなおせばいいですかね?
357デフォルトの名無しさん:2005/05/29(日) 12:21:46
>>356
char *str; を char str[100]; とかに直してみ。
358デフォルトの名無しさん:2005/05/29(日) 12:27:13
>>357
ありがとうございます。
359デフォルトの名無しさん:2005/05/29(日) 12:33:22
>>345
CreatePen,SelectObject,DeleteObject,
LineTo,Arcとかでできるはず

MSDNライブラリを少しは見ようよ
360デフォルトの名無しさん:2005/05/29(日) 12:41:33
>>356
char *str_char(const char *str, int c)
{
  while (*str)
  {
    if (*str== c)
    {
      return *str; ← これあかんでー
    }
    str++;
  }
  return NULL;
}
361デフォルトの名無しさん:2005/05/29(日) 12:47:11
>>344
ファイルのフォーマットについては特に指定はありませんでした。
自分で仮定して良いのだと思います。キーボードからの入出力なら出来た
のですが、ファイル入出力がどうもうまくいかないです・・・。
よろしくお願いします。
362デフォルトの名無しさん:2005/05/29(日) 13:23:53
C言語でfor文を使って例えば
for (a=0; a<10000; a=a+1){
cout << a << "\n";}
と入力したものをワードパッドなどに
格納する方法があったと思うのですが
検索にかけてもなかなか見つかりません。
本当にやろうとしているプログラムはaの範囲が
非常に大きくdatファイルでは表示しきれないんです…
もしご存知の方がいらっしゃいましたら
やり方を教えていただけませんでしょうか?
363デフォルトの名無しさん:2005/05/29(日) 13:26:16
>>362
コンパイルして出来たプログラムのファイル名がhoge.exeならhoge > foo.txtとすることで
coutの出力先がコンソールからfoo.txtへ変わる。
後はそれをワードパッドで開けばいい。
364339:2005/05/29(日) 13:26:25
たびたびすいませんが、コードを読んでみたのですが、内容がよく分かりません。
このfuncはdy/dxで、func2はd^2y/dx^2を表しているのでしょうか?
あと、それぞれの変数が何を表しているのかを教えていただけるとありがたいのですが。
よろしくお願いします。
365デフォルトの名無しさん:2005/05/29(日) 13:37:57
>>362
2×2の正方行列の演算なら、入力に四個のA行列要素と四個のB行列要素
をファイルから読みこみ、出力にC行列の四つの要素をファイルに書き込めれば
いいわけですよね?つまりファイルにあらかじめ記入したデータを行列の配列に
格納して、計算結果の要素を見やすくファイルに出力してあげる感じですよね・・・
ソースについてはよくわからないので、教えていただけますか?
366デフォルトの名無しさん:2005/05/29(日) 13:43:46
>>364
すまん
double func2( double x, double y, double dy )
{
return -0.25 *dy -1.25 * y + 0.5;
}
だったな。
テスト用のままだった。
367デフォルトの名無しさん:2005/05/29(日) 14:11:54
>>364
ついでに <math.h>はいらんかったな
368362:2005/05/29(日) 14:27:22
>>363さん
さっそくの解答ありがとうございます。
しかし僕が馬鹿で何をしていいのか分かりません。
保存名をfoo.txtとしてみたんですが・・・
もう少しだけ教えてくれませんでしょうか?
369デフォルトの名無しさん:2005/05/29(日) 14:42:34
>>368
DOS窓とかコマンドプロンプトでぐぐれ。

370デフォルトの名無しさん:2005/05/29(日) 14:49:50
もしかして、>>362はファイルをダブルクリックして開く開き方しか
知らないのではないだろうか
371デフォルトの名無しさん:2005/05/29(日) 14:55:33
foo.txtならば、
notepad foo.txtとか
start foo.txtとか(普通は関連付けで開けるはず)
ちなみに、エクスプローラー立ち上げるには
start .
な。
・・・エクスプローラーのフォルダとDOS窓のディレクトリは同一という認識がねぇかもな。
372デフォルトの名無しさん:2005/05/29(日) 14:58:40
>>360
どうなおせばいいんですか?
373デフォルトの名無しさん:2005/05/29(日) 15:03:23
>>372
ポインタを返さんと。
374デフォルトの名無しさん:2005/05/29(日) 15:05:00
>>373
そんなことはもう試しました
そこまで初心者じゃありません
375デフォルトの名無しさん:2005/05/29(日) 15:07:20
>>374
はあ?
そこ、間違ってるのは事実なんだから

だったら、間違ったままのソースのせるなよ
376デフォルトの名無しさん:2005/05/29(日) 15:08:16
>>375
もういいです。私より初心者みたいですね。
377デフォルトの名無しさん:2005/05/29(日) 15:08:47
>>374
まあまあ、もちつけ。
試したのか。
じゃあ、今できてる分をもいちど、さらしてみ?

と釣られてみよう。
378デフォルトの名無しさん:2005/05/29(日) 15:09:40
>>377
あなたじゃ話になりません
他の方よろしくお願いしますね
379デフォルトの名無しさん:2005/05/29(日) 15:11:07
なんだこりゃ。新手のツンデレ詐欺か何か?
380372:2005/05/29(日) 15:12:59
>>375
質問したのは自分なのですが、374は自分じゃありません。
return str;
こうしろってことですか?ポインタを返すってよくわからないんですよね。
381デフォルトの名無しさん:2005/05/29(日) 15:15:49
>>380
return *strではstrというポインタの指す値を返してしまう。
382372:2005/05/29(日) 15:18:21
なるほど〜。ありがとです。
383デフォルトの名無しさん:2005/05/29(日) 15:20:35
>>382
あと>>357も忘れんといてな。
要するに、char型のポインタの指す先がまだ確保されてないので、
実行結果が不定となるため、例としてchar型の配列を使っただけ。
malloc/freeを使うのが正攻法だが、ちと初心者には面倒かも。
384デフォルトの名無しさん:2005/05/29(日) 15:21:26
                    , -=- -─‐-、
                   _ ´-─ ¬く  ̄  ̄ミ- 、
                ,,,,/    _==-ミァ-─‐-、 \''''''''''''ー--、,,,,,_
            _,,,,-''"/  , ‐''"         \ \、_,,,ー''ゞ" `ゞ、
            -' "  /  /     /   |      \ ヽ     /"`
       _,,-''''''"""''''' / /  /   / /    ||  |  i  ヽ i    /
       ´"''、.    i /  / /  / / /    ||  ||  |│ |ノス  /
          '、   |//  / /___, -一ァ|  /! |ト、|│ | | く」/
            '、  |,-‐¬  ---┘'7 |!  ハ! |,、-┼十|!/\/\
          , -‐ ''"  し' '´_ /,ィ二l |ト、/!ヽト、\_ヽ!|!l\:..  /
       ,r/      __   ,イ|リ ヾハ! ヽ!  ,ィ⌒ヾミリノ/:::... \
      / ||ヽ  -'     / ̄ )` __      |ヒノ:} '` ,;\/\/
    ,r '   ヾ、  ,-、____ , イ ̄,r==-      ==-'  レ' /|  |
  / ヽ    `ーソ  ' | |ト、,ヘ ′""          "" / / || |
. /    \_  /  | ハ ヽ`゙'ヘ       ' '     / / | |  |       1000GET
           /   / / |  ヽ 川\      0     //! |  | |  |
        /    / / 八  \川| |`ト- .. __ , イ‐ァヘ |  | ||  |!
      /    / / /  \  \ 「`ー- 、    /  .〉  ト、|  ヽ、
     ,イ    /-─=¬ニヘ、_  \   厂\ 厂ヽ /!|   | `ー=ヘ
 -‐  ̄ /─ '  ̄     ├- ヽ\  \ノ\ \ 人 ハ!ヽ ||  |-┤ ヽ
      /          /!‐-- | |\   ト、_`ヽ oヽ  ト、!  ||  |‐┤- ヽ
  // 〉      __ /  ├‐-  ||  | 川-‐  | |  厂7! ハ!  ├:┤  ̄ヽ
  / / ー ─    ̄       ├‐- リ  || ハ!ヘ   | |  ト┤|/′ ヾ,┤   ゙i_
  ‐ '              〉‐-    | / /\ .|o | /ヽ/(′    ∨     \
385372:2005/05/29(日) 15:24:28
>>383
ふむふむ。指摘していただきどうも。2点治しました
386856:2005/05/29(日) 15:33:47
>>359
ありがとうございます!しかし・・・
MSDNライブラリ?さっぱり・・・orz
387デフォルトの名無しさん:2005/05/29(日) 15:47:52
ネタなのかのぉ・・・

一発ネタなら
ttp://pc5.2ch.net/tech/kako/1070/10704/1070469896.html#R365

流れで好きなのは
ttp://pc5.2ch.net/tech/kako/1069/10698/1069837000.html#R214
かな。

楽しめるネタで一つよろしく。
#スレの意義を忘れてるなワシ。
388856:2005/05/29(日) 16:11:52
>>345の問題やっぱりわからんです・・・
LineTo?を使うとこまでわかったんですが・・・
389デフォルトの名無しさん:2005/05/29(日) 16:15:51
390デフォルトの名無しさん:2005/05/29(日) 16:17:02
>>389
一行目激しく同意。
ぶん殴りたくなってくる。
391デフォルトの名無しさん:2005/05/29(日) 16:17:39
>>384
のキャラの名前教えてください。
392デフォルトの名無しさん:2005/05/29(日) 16:24:06
>>372-378
禿藁
393デフォルトの名無しさん:2005/05/29(日) 16:36:04
>>378
それで、どこがわからないんだい?
394デフォルトの名無しさん:2005/05/29(日) 18:02:38
どうすればぬるぽできるか分からないんです。
395デフォルトの名無しさん:2005/05/29(日) 18:15:10
>>388
VS2003のヘルプにMSDNライブラリってないか
キーワード検索が便利だよ
396デフォルトの名無しさん:2005/05/29(日) 18:50:46
どなたかこのシリーズのスレの39〜43代目のログをお持ちの方はおられないでしょうか?
この前、PCがクラッシュしたときにJaneのログも巻き込んでなくなったので…。
397デフォルトの名無しさん:2005/05/29(日) 20:14:34
39と43は持ってる(datだが)
398デフォルトの名無しさん:2005/05/29(日) 21:49:39
>>390
…一行目?
399デフォルトの名無しさん:2005/05/29(日) 21:50:57
18,19,20以外のdatなら
400デフォルトの名無しさん:2005/05/29(日) 21:53:50
20代目から全部ある…と思ったら
20代目…〜795
21代目…〜815
24代目…〜984
26棹  …〜984
39代目…〜964
43代目…〜945
が半端だった…orz(ちなみにこちらも全部dat)
401デフォルトの名無しさん:2005/05/29(日) 21:57:32
まとめサイトお願いしたいなぁ。
402デフォルトの名無しさん:2005/05/29(日) 22:03:09
VC6.0でエディットボックスを作成する際、キー入力を半角英数に固定することってできるんですか。
大文字固定にはできるんですが。
403デフォルトの名無しさん:2005/05/29(日) 22:06:34
>>402
APIかMFCかはっきりさせて、当該スレへ。
404デフォルトの名無しさん:2005/05/29(日) 22:06:50
21      〜992
22〜24  〜1001
25      〜961
26,27.    紛失
28〜44  〜1001

OK?
405デフォルトの名無しさん:2005/05/29(日) 22:33:47
C++は役に立たないなw
406デフォルトの名無しさん:2005/05/29(日) 22:42:44
>>404
44の410〜1000うpキボンヌ
407404:2005/05/29(日) 23:20:25
>>406
本気で間違って吹き出した。28〜43な。
408デフォルトの名無しさん:2005/05/29(日) 23:41:26
>>396
にくちゃんねるのdatじゃいかんのかい。
409デフォルトの名無しさん:2005/05/30(月) 01:43:07
やはり二次元配列も変数ですよね?
グローバル変数を使うなって問題で

#include<stdio.h>
#define x 50       ←もしやこれもアウト?
int se[x][1];       ←これはやはりグローバル変数と見なされるのでしょうか

main(){
int y,z;

〜略〜

}
410デフォルトの名無しさん:2005/05/30(月) 01:51:52

【質問テンプレ】
[1] 授業単元: プログラミング入門
[2] 問題文(含コード&リンク): コンピュータとジャンケンで対戦するプログラムを作成せよ。
条件:@ユーザーが糸冬 了を宣言するまで繰り返し対戦を行う。
A終了後、対戦成績を表示する。(何勝何敗何分)
Bコンピュータの手は適宜決定する。完全にランダムでもいいし、戦略的な要素を持たせてみるのも面白い。
Cユーザーの手を見てから、コンピュータが決定しないこと。(後だし禁止)
[3] 環境
 [3.1] OS:Linux
 [3.2] コンパイラ(バージョン): gcc
 [3.3] 言語:C
[4] 期限:来週まで
[5] その他の制限:初歩的な授業で、制御構造、配列、関数まで習いました。 その程度の知識でお願いします。


よろしくお願いします…(´・ω:;.:...
411デフォルトの名無しさん:2005/05/30(月) 01:57:32
>>409
#define x 50       ←セーフ
int se[x][1];       ←アウト(sexって…)
412デフォルトの名無しさん:2005/05/30(月) 02:09:39
関数がわかりません。どこか練習問題と答えのってるページないですか?
413デフォルトの名無しさん:2005/05/30(月) 02:13:51
>>410
前回の結果と次にプレイヤーが出した手の統計を取って、一番勝つ確率が高い手を選ぶ。
ただしそれだと逆読みされるので多少ランダムな要素も混ぜる。
相手が次に出す手が40%の精度でしかわからないときはランダム要素が強くて良いが、
相手の手が90%わかっているのならその手に偏らせたほうが勝てる確率が高い。

プレイヤーがチョキを出す確率が50%で、パーを出す確率が40%だと、
CPUはグーを出せば50%の確率で勝てるが、40%の確率で負ける。
CPUがチョキを出せば40%の確率で勝て、負ける確率はわずか10%など、
その辺も考慮してみると面白い。
414デフォルトの名無しさん:2005/05/30(月) 02:36:22
>>411
どもー もう泣きそう
計算する関数を使うこと+グローバル関数使うなで集計のしようがなくて(´・ω・`)ショボーン
for(){関数}
で関数を複数回使っても一回一回その中で使った変数は破棄されるヨネ・・・戻り値で戻してまた引数として取り組む。。か
415デフォルトの名無しさん:2005/05/30(月) 02:42:46
>>414
グローバル変数使うなってのはごくごく当たり前の制限だぞ。
たとえそう制限されてなくても使わないのが当然。
416デフォルトの名無しさん:2005/05/30(月) 02:49:28
>>414
それ出題者はポインタの仕組みを理解して欲しいだけだと思うぞ。
417デフォルトの名無しさん:2005/05/30(月) 02:50:46
>>415-416
なるほど、もう少し頑張ってみます(`・ω・´)
418デフォルトの名無しさん:2005/05/30(月) 03:02:05
main(){
int se[50][1];
int i,j;
printf();
scanf("%d",&n);
for(i=0;i<n;i++){
for(j=0;j<2;j++){
se[i][j] = input();
}
}
}
float input(void){
int a;
scanf("%f",&a);
return(a);
}

かなり省略してしまいましたがこのように二次配列に読み込むようなのを作ったとき
例えばn = 2で入力して次に 100 2 100 2と入れた時
[0][0] = 100
[0][1] = 2
まではいいのですが
[1][0] = 100
[1][1] = 2
と読み込んだ瞬間[1][0]地点で[0][1]が勝手に100になってしまい苦戦してるのですがどこか間違ったやり方してるところありますか?
かれこれこれだけに1時間以上(´;ω;`) 説明下手でスンマソン
マシーンがLinuxなんで今覚えてる限り打ち込んだので全てが一緒じゃないのですが
419418:2005/05/30(月) 03:04:47
int a; → float a; printf();
420デフォルトの名無しさん:2005/05/30(月) 03:56:39
>>418
int se[50][1];と書いておいてse[0][1]に代入を試みるとは何事。
    ↑ ↑この数字は「要素数」
421デフォルトの名無しさん:2005/05/30(月) 03:59:26
>>410
以前貼ったやつ。ま、参考に。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void){
    int i,m,e,w[3]={0},j;
    char h[][9] = {"グー","チョキ","パー","勝ち","負け","引き分け"};
    srand((unsigned)time(0));
    for(i=0;i<5;i++){
        printf("%s:0 %s:1 %s:2\n",h,h+1,h+2);scanf("%d",&m);
        ++w[j=(m==(e=(double)rand()/RAND_MAX*3)?2:(m+1)%3==e?0:1)];
        printf("YOU:%s,PC:%s,%s\n\n",h+m,h+e,h+j+3);
    }
    printf("%s:%d,%s:%d,%s:%d,勝率:%d%%",h+3,*w,h+4,w[1],h+5,w[2],*w*100/5);
    return 0;
}
422デフォルトの名無しさん:2005/05/30(月) 06:16:39
>>418 >>420の言いたいことは、
int se[50][1]で使える配列ってのse[0][0]、se[1][0]、se[2][0], ... , se[49][0]の50個しかないゾということ。
int se[50][2]とすれば、se[0][0], se[0][1], se[1][0], se[1][1], ... , se[49][0], se[49][1]の100個使える。
423デフォルトの名無しさん:2005/05/30(月) 09:02:25
リスト構造の「番兵」ってヤツを説明しろって言われました
なぁんかググっても説明が無いんすよ
なんすか番兵って?
424デフォルトの名無しさん:2005/05/30(月) 09:09:54
[1] 授業単元:C言語
[2] 問題文(含コード&リンク):
@文字列strの中に,文字cが含まれていれば(複数ある場合には,最も先頭側と する),その添字を返し,含まれていなければ,-1を返す関数 int
str_char(const char str[], int c) を作成せよ.
A文字列str内のすべての数字文字を削除する関数 void del_digit(char str[])
を作成せよ.例えば,「AB1C9」を受け取ったら,「ABC」を返す.
[3] 環境
 [3.1] OS:iMac
 [3.2] コンパイラ(バージョン):gcc
 [3.3] 言語:C
[4] 期限 :無期限
どうかよろしくお願いします(´・ω・`)
425デフォルトの名無しさん:2005/05/30(月) 09:13:35
>>424
isalpha使えばいいわ
426デフォルトの名無しさん:2005/05/30(月) 09:16:56
>>423
線形 番兵
でググればいいのでないのかな
なんかここ面白い
http://www.akita-pu.ac.jp/system/elect/comp1/kusakari/japanese/teaching/SoftTech/2004/note/8/Slide18.html
427デフォルトの名無しさん:2005/05/30(月) 09:17:39
>>423
Sentinel
428デフォルトの名無しさん:2005/05/30(月) 09:24:22
>>424 テストしてないケド
int str_char(const char str[], int c)
{ int i; for (i = 0; str[i]; i++) if (str[i] == c) return i; return -1; }
int is_digit(int c) {return c >= '0' && c <= '9'; }
void del_digit(char str[])
{ int i, j; for (i = j = 0; str[i]; i++) if (!is_digit(str[i])) str[j++] = str[i]; str[j] = '\0';}
429423:2005/05/30(月) 09:25:28
>>426
スマソ 文章での説明が不可欠なんだがよく理解できねぇです
430デフォルトの名無しさん:2005/05/30(月) 09:41:32
要点:ぐぐれ。
431C言語初心者:2005/05/30(月) 10:13:58
皆さんには、とても簡単な問題かもしれませんけどよろしくお願いします。

変数aとbにそれぞれ整数を入力し、絶対値の大きい値を表示するプログラムを作成しなさい。

出力結果
a?5
b?-15
大きい値は-15
432デフォルトの名無しさん:2005/05/30(月) 10:25:49
>>431
#include <stdio.h>
#include <stdlib.h>

int
main(void)
{
int a, b;
printf("a?");
scanf("%d", &a);
printf("b?");
scanf("%d", &b);
printf("大きい値は%d\n", abs(a) > abs(b) ? a : b);

return 0;
}
433431:2005/05/30(月) 10:42:36
>>432
サンクス。
何とか自分でできますた。よろしければこの問題もお願いします。

入力された値が2の倍数かつ5の倍数であればokを表示させ、それ以外であれば、errorを表示させる。

出力結果1
Input=>12
error

出力結果2
Input=>15
error

出力結果3
Input=>20
ok
434デフォルトの名無しさん:2005/05/30(月) 10:49:46
>>433
#include <stdio.h>

int
main(void)
{
int a;
printf("Input=>");
scanf("%d", &a);
printf("%s\n", a % 2 == 0 && a % 5 == 0 ? "ok" : "error");
return 0;
}
435デフォルトの名無しさん:2005/05/30(月) 10:54:19
0でもokになる
436デフォルトの名無しさん:2005/05/30(月) 10:57:17
okになっちゃまずいのか?
437デフォルトの名無しさん:2005/05/30(月) 11:01:16
0は全ての倍数だったのか
リアルで勘違いしてた
スマン
438デフォルトの名無しさん:2005/05/30(月) 12:18:16
[1] 授業単元:プログラミング基礎(C)
[2] 問題文(含コード&リンク):
シーザ暗号を作ってテストしなさい
(例えばABCと入力するとBCDと変換されるように)
[3] 環境
 [3.1] OS:Windows
 [3.2] コンパイラ(バージョン):Visual C++
 [3.3] 言語:C
[4] 期限:6/3まで
[5] その他の制限:
void angou(char *ps)⇔void kaidoku(char *ps)
こういうヒント(?)みたいなものはあるんですが…

お願いします。
439438:2005/05/30(月) 13:00:05
補足です。
void angou(char *ps);
void kaidoku(char *ps);
上記ののメソッドを定義し、シーザ暗号を実装せよ。
例:IBM→HAL
対象:半角データのみ
ただしA→Z、a→z、0→9、その他の記号は処理なし
お願いします。
440デフォルトの名無しさん:2005/05/30(月) 13:13:26
暗号化した文字にアルファベットとか数字以外が入っていいの?
441デフォルトの名無しさん:2005/05/30(月) 13:48:56
>>438
# include <string.h>
# include <stdio.h>

const char lower[] = "abcdefghijklmnopqrstuvwxyza";
const char upper[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZA";
const char digits[] = "01234567890";

char angou_char(char x)
{
    char *p;
    if(p = strchr(lower, x)) return p[1];
    if(p = strchr(upper, x)) return p[1];
    if(p = strchr(digits, x)) return p[1];
    return x;
}
char kaidoku_char(char x)
{
    char *p;
    if(p = strchr(lower + 1, x)) return p[-1];
    if(p = strchr(upper + 1, x)) return p[-1];
    if(p = strchr(digits + 1, x)) return p[-1];
    return x;
}

void angou(char *ps){while(*ps){*ps = angou_char(*ps); ps++;}}
void kaidoku(char *ps){while(*ps){*ps = kaidoku_char(*ps); ps++;}}
442デフォルトの名無しさん:2005/05/30(月) 15:34:47
以下のアルゴリズムを使ってxlogx-1=0の解を求めたいのですが、
自分の知識では書ききれません。誰か助けてください。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define samesign(x, y) (((x) > 0) == ((y) > 0)) /* 同符号なら真 */
double bisect(double a, double b, double tolerance, double (*f)(double), char **error){ double c, fa, fb, fc;
*error = NULL;
if (tolerance < 0) tolerance = 0;
if (b < a) { c = a; a = b; b = c; }
443続き:2005/05/30(月) 15:35:12
fa = f(a);
if (fa == 0) return a;
fb = f(b);
if (fb == 0) return b;
if (samesign(fa, fb)) {
*error = "区間の両端で関数値が同符号です.";
return 0;
}
for ( ; ; ) {
c = (a + b) / 2;
if (c - a <= tolerance || b - c <= tolerance)
break;
fc = f(c);
if (fc == 0)
return c;
if (samesign(fc, fa)) {
a = c;
fa = fc;
} else {
b = c;
fb = fc;
}
}
444続き:2005/05/30(月) 15:35:47
/* ゼロ点を求める関数の例 */
double func(double x){
return x * double log(double x) - 1;
}
/* テスト */
int main(){
char *error;
double x;
x = bisect(1, 2, 0, func, &error); /* $1 \le x \le 2$ の間で解を求める */
if (error){
printf("%s\n", error);
}else{
printf("x = % -24.16g\n", x);
}
return EXIT_SUCCESS;
警告文が下です。
In function func':
32:parse error before double'
In function main'
37:Parse error before double'
39:x undeclared
39:(eaxh undeclared identifier
is reported only once for each function it appears in.)
ちなみに、元はx^2-2=0の求根プログラムでした。
他人のソースを変えただけなんですが、このプログラム自体が読めません。
よかったら誰か助けてください。
445続き:2005/05/30(月) 15:39:37
[1] 授業単元:アルゴリズム
[2] 問題文(含コード&リンク): 二分法を使って方程式の解を求める
[3] 環境
 [3.1] OS:WindowsXP [3.2] コンパイラ(バージョン):XP5.1 コマンドプロンプト
 [3.3] 言語:C[4] 期限:2005年5月30日:17時まで
[5] その他の制限:C言語を使う、二分法もしくはニュートン法を使う

以上です。
446デフォルトの名無しさん:2005/05/30(月) 17:38:52
>>442
「bisect()の後に次を追加」
return c;
}

「func()のreturnを変更」
return x * log(x) - 1;
447デフォルトの名無しさん:2005/05/30(月) 18:16:22
以下のプログラムは、宣言(int ai[2][3][4];)の代わりに必要
なメモリ領域だけをmallocにより確保し、
その中を配列と同様に利用しているものである。
なお、メモリ内での配列の要素の配列順序は宣言による場合と
同じにする。

(1)下線部を埋めてプログラムを完成せよ。
(2)こうした手法の利点と欠点を述べよ。(箇条書で良い)

#include<stdlib.h>
#include<stdio.h>

int *hairetu(int *ai,int i,int j,int k,int l,int m,int n)
{ return _________________________________; }

int main(void)
{
int l=2, m=3, n=4;
int *ai;
ai = __________________________________________;
*hairetu(ai,1,2,3,l,m,n)=12345;
printf("ai[1][2][3]=%d\n", *hairetu(ai,1,2,3,l,m,n));
free(ai);
return 0;
}
448447:2005/05/30(月) 18:19:59
[1] 授業単元:C言語
[2] 問題文(含コード&リンク):上記
[3] 環境
 [3.1] OS:Windows/Linux
 [3.2] コンパイラ(バージョン):gcc
 [3.3] 言語:C
[4] 期限:2005年5月31日10:00まで
449デフォルトの名無しさん:2005/05/30(月) 18:30:27
>>447

#include<stdlib.h>
#include<stdio.h>

int *hairetu(int *ai,int i,int j,int k,int l,int m,int n)
{ return ( 0 <= i && i < l && 0 <= j && j < m && 0 <= k && k < n ) ? ai[ ( i * m + j ) * n + k ] : 0; }

int main(void)
{
int l=2, m=3, n=4;
int *ai;
ai = ( int * )malloc( sizeof( int ) * l * m * n ); if ( ai == NULL ) return 1;
*hairetu(ai,1,2,3,l,m,n)=12345;
printf("ai[1][2][3]=%d\n", *hairetu(ai,1,2,3,l,m,n));
free(ai);
return 0;
}
450デフォルトの名無しさん:2005/05/30(月) 18:32:26
>>324のプログラムをbを足して、
簡易化してくれる方はいませんか?
451449:2005/05/30(月) 18:37:52
>>447
ゴメン、間違った。

{ return ( 0 <= i && i < l && 0 <= j && j < m && 0 <= k && k < n ) ? ai[ ( i * m + j ) * n + k ] : 0; }

{ return ( ai + ( 0 <= i && i < l && 0 <= j && j < m && 0 <= k && k < n ) ? ( i * m + j ) * n + k : 0 ); }

利点:
なし

欠点:
変数の無駄遣い。
関数の無駄遣い。
異常発生の可能性に対する処理が甘い。
コードを第三者が見たときに理解されるまで時間とコストの無駄である。
452デフォルトの名無しさん:2005/05/30(月) 18:38:34
>>450
+b
453デフォルトの名無しさん:2005/05/30(月) 18:38:49
>>450
#include<stdio.h>
int main(void) {
    int index = 0, left = 0;
    char a, x, s[16], b[256], temp;
    printf("a?"); scanf("%c", &a);
    printf("\n文字 = %c\n", a);
    printf("8進 = %o\n", a);
    printf("10進 = %d\n", a);
    printf("16進 = %x\n", a);
    x = a;
    do {
        s[index++] = x % 2 + '0';
        x >>= 1;
    } while (x);
    s[index--] = '\0';
    while (left < index) {
        temp = s[left];
        s[left] = s[index];
        s[index] = temp;
        ++left;
        --index;
    }
    printf("2進  = %s\n\n", s);
    printf("b?"); scanf("%s", &b);
    printf("\n文字列 = %s", b);
    return 0;
}
454デフォルトの名無しさん:2005/05/30(月) 18:42:45
>>447
利点
・可変長配列を扱える
・動的確保のメリットを享受できる
・配列インデックスのオーバーレンジを常に検出する手法を提供できる
欠点
・直感的でない
・動的確保のデメリットを引き摺ってしまう
・オーバーヘッドが少なからず存在する
・一文字変数が混乱に拍車を掛けている
・内部構造が露呈されてしまう
結論
・こったことした割りには使えねぇなぁ
改善提案
・メモリアロケート、解放、セッター、ゲッターを一つのソースに押し込めてI/Fだけを公開することでいくつかの欠点は改善できる
(その場合、事実上C++のクラスの設計手法を流用することが検討できる)
455デフォルトの名無しさん:2005/05/30(月) 18:43:53
[1] 授業単元:パソコン演習
[2] 問題文(含コード&リンク):2つの整数データのうち大きい方を選ぶ関数を作り、
               これを利用して5つのデータの最大値を求めよ。
[3] 環境
 [3.1] OS:Windos XP
 [3.2] コンパイラ(バージョン):
 [3.3] 言語:C
[4] 期限:2005年06月01日1:00まで できれば早めにお願いします。
[5] その他の制限:関数を使うということしか、わかりません。

簡単な問題だと思いますが、どうぞよろしくお願いします。
456450:2005/05/30(月) 18:45:18
>>453
dくすです。。。
457418:2005/05/30(月) 18:50:29
>>422  >>420
なるほど!よく理解できましたアリガd!
458デフォルトの名無しさん:2005/05/30(月) 18:51:11
>>455
#include <stdio.h>
int max(int a, int b)
{
return a > b ? a : b;
}
int main()
{
int a, b, c, d, e;
scanf("%d%d%d%d%d", &a, &b, &c, &d, &e);
printf("%d\n", max(max(max(a, b), max(c, d)), e));
return 0;
}
459291:2005/05/30(月) 19:05:49
すいません。291で書き込みしたものですが、
whileはできましたがdo-whileができません。
回答お願いします。一応自分でやってみたのも載せてみます…。
whileの中に式が3つも入っているのが間違いの原因なんだと思うんですが。

include <stdio.h>
int main(void)
{
int n, i, j;

printf("input number of lines:");
scanf("%d",&n);

do{
do{
printf(" ");
}while(j=0; j<n-i-1; j++);
do{
printf("*");
printf("\n");
}while(j=0; j<2*i+1; j++);
}while(i=0; i<n; i++);
return 0;
}
460デフォルトの名無しさん:2005/05/30(月) 19:07:23
>>458
ありがとうございます。できました。関数の使い方がまったく、
わからなかったので感謝しています。
461デフォルトの名無しさん:2005/05/30(月) 19:16:36
>>459
while(j=0; j<n-i-1; j++);
while(j=0; j<2*i+1; j++);
while(i=0; i<n; i++);

for文?
462デフォルトの名無しさん:2005/05/30(月) 19:24:49
>>459
#include <stdio.h>

int main(void)
{
int n, i, j;

printf("input number of lines:");
scanf("%d",&n);

i=0;
do{
j=0;
do{
printf(" ");
}while(j++ < n-i);

j=0;
do{
printf("*");
}while(j++ < 2*i);

printf("\n");
}while(i++ < n);
return 0;
}
463デフォルトの名無しさん:2005/05/30(月) 19:38:24
>>462
ありがとうございます。ありがとうございまず。
さて、できなかった理由を考察してみます。
464デフォルトの名無しさん:2005/05/30(月) 19:45:28
[1] 授業単元:プログラミング基礎

[2] 問題文(含コード&リンク):
 キーボードから入力した値の逆数を求め、答えを表示させるプログラムを作成せよ。
 割り切れない場合は循環部も表示させよ。
 ただし、入力する値は正の整数で、小数点以下の桁数は50桁までとする。
 
[3] 環境
 [3.1] OS:WindowsXP
 [3.2] コンパイラ(バージョン):gcc
 [3.3] 言語:C

[4] 期限:2005年6月5日16:00まで

[5] その他の制限:
 繰り返しにはfor文を使うこと
 条件分岐はif文を使うこと

いろいろ調べてみたのですがわかりませんでした・・・。
よろしくお願いします。

465424:2005/05/30(月) 19:48:58
>>425,427
ありがとうございました。無事解決することができました。
Aのほうですが、添字演算子を用いずに行うことは可能でしょうか?
466デフォルトの名無しさん:2005/05/30(月) 19:59:00
〔1〕授業単元
情報処理概論T
〔2〕問題文(含コード&リンク)
秒単位で表現された時間をよみこみ、時間、分、秒の単位に変換して
結果を出力するプログラムを作りなさい
3] 環境
 [3.1] OS:Windows
 [3.2] コンパイラ(バージョン):gcc
 [3.3] 言語:C
[4] 期限:2005年6月1日まで
[5] その他の制限:whileを途中まで習いました

#include <stdio.h>
int main(void) {
int t, h, m, s;
printf("input time:"); scanf("%d", &t);
h = t / 3600; t -= h * 3600;
m = t / 60; t -= m * 60;
s = t;
printf("%dh %dmin %dsec", h, m, s);
return 0;
}

上のプログラムのt -= h * 3600やt -= m * 60;についている
「-」と「return 0;」の意味がわからないのですが、
どういうことですか?
書いたプログラムについて説明しなければならないので未知のことは
避けたいのですが、上記のものを使わない回答もできますか?
あれば教えてください。

大変遅くなりましたが前回答えてくださった方本当にありがとうございました!!
467デフォルトの名無しさん:2005/05/30(月) 20:04:42
468デフォルトの名無しさん:2005/05/30(月) 20:47:15
>>466
(Value -= data ) => Value = Value - data
つまり、Valueからdata分を引いてまたValueに格納する意味を持つ。
469デフォルトの名無しさん:2005/05/30(月) 20:55:11
おっと>>467に書いてあったか。
return 0;
というのは関数からの返り値を設定している。(この場合はmainの。
void以外の返り値を設定した場合必ず関数の末尾につけなければいけない。
返り値の設定は関数の宣言したときに決定して、その後はそれに従わなければならない。
470デフォルトの名無しさん:2005/05/30(月) 20:56:44
>>469
補足。
自作関数の場合は別に返り値の値は0でなくとも良い。
471デフォルトの名無しさん:2005/05/30(月) 21:07:48
[1] 授業単元:C言語
[2] 問題文:テキストデータを読み込み、その内容を表示をさせる。
その際、一部の項目を昇順にソートさせて表示させる。
テキストの内容は以下の通り。ソートさせるのは「tanka」の数値。

no namae tanka
01 缶ビール 500
02 赤ワイン 1200
03 白ワイン 1000

[3] 環境
 [3.1] OS:Windows XP
 [3.2] コンパイラ(バージョン):bcc
 [3.3] 言語:C
[4] 期限:2005年5月31日:12時まで

構造体・共用体まで習ったのですが、いまいち理解が出来てません。
よろしくお願いします。
472デフォルトの名無しさん:2005/05/30(月) 21:42:33
#include <stdio.h>
#include <stdlib.h>
typedef struct { int no; char namae[100]; int tanka; } Recode;
int read_recode(FILE *fp, Recode *r, int n)
{int i;char fmt[20];sprintf(fmt, "%%d %%%ds %%d", (int) (sizeof(r->namae) - 1));
for (i = 0; i < n && fscanf(fmt, &r->no, &r->namae, &r->tanka) ; i++, r++) ;
return i;
}
void write_recode(FILE *fp, Recode *r, int n)
{
int i;
for (i = 0; i < n; i++, r++) printf("%02d %s %d\n", r->no, r->namae, r->tanka);
}
int compare_recode(const void *va, const void *vb)
{
Recode *a = (Recode *) va; Recode *b = (Recode *) vb
return a->tanka - b->tanka; /* オーバーフローするかも */
}
void sort_recode(Recode *r, int n)
{
qsort(r, n, sizeof(*r), compare_recode);
}
int main(void)
{
Recode r[100];
int n = read_recode(stdio, r, sizeof(r)/sizeof(r[0));
sort_recode(r, n);
write_recode(stdout, r, n);
return 0;
}
473デフォルトの名無しさん:2005/05/30(月) 21:56:25
[1] 授業単元:C言語
[2] 問題文:
class Score {
// デフォルト属性は非公開
int scores[4];
int average;
void calc_average(){
int tmp=0;
for( int i=0; i < 4 ; i ++ )tmp+=scores[i];
average = tmp/4;
}
public: // 必要なものだけ「公開」する.
void set_score(int index, int value){
scores[index] = value;
calc_average();
}
int get_score(int index){
return scores[index];
}
int get_average(){
return average;
}
};
上記について, 領域外アクセスの危険性がなくなるよう, Scoreを改良して下さい.
[3] 環境
[3.1] OS:WinXP
[3.2] コンパイラ(バージョン):VC++
[3.3] 言語:C++
[4] 期限:一週間
領域外のアクセスが来た場合にどういう処理をして
どういう値を返せばいいのかよくわかりません。
どうぞよろしくお願いします。
474デフォルトの名無しさん:2005/05/30(月) 22:09:28
>>473
BOOST::optionalを返すという手がある。
冗長な方法だと、
SetはintにしてGetをポインタにする。(Getは異常値としてNULLを返す。
ポインタにした場合、返ってきた変数の寿命を明確にするべきだと思う。(次、Setするまで有効とか。

ただ、識者はもっといい方法を知ってるかもしれないな。
475デフォルトの名無しさん:2005/05/30(月) 22:12:04
>>473
例外を投げれば良いんじゃないか?
476デフォルトの名無しさん:2005/05/30(月) 22:12:31
>>473
マジックナンバーをconst定数にしたほうがよくないか?
477デフォルトの名無しさん:2005/05/30(月) 22:24:01
[1] 授業単元: C言語
[2] 問題文(含コード&リンク):
A.宣言による場合 short d[L][M][N]
B.動的確保による場合(Aと同じサイズとする)
・short型の3次元配列を生成した場合について、以下の説明をせよ。
(AとBの両方について。short型とポインタ型のサイズはそれぞれ2バイトと4バイトとする)
(1)メモリ使用量(L,M,Nを用いて表せ)
(2)関数への渡し方
(3)関数での受け方
[3] 環境
 [3.1] OS:WindowsXP/Linux
 [3.2] コンパイラ(バージョン):gcc
 [3.3] 言語:C
[4] 期限:明日の10時まで
[5] その他の制限:なし

プログラムではないのですが、どなたかよろしくお願いいたします。
478デフォルトの名無しさん:2005/05/30(月) 22:40:24
>>477
A.宣言による場合 short d[L][M][N]
B.動的確保による場合 short (*p)[M][N}
(1)メモリ使用量(L,M,Nを用いて表せ)
  A.2*L*M*N
  B.2*L*M*N+4+α
(2)関数への渡し方
  A.f(d);
  B.f(p);
(3)関数での受け方
  A.f(short (*d)[M][N])
  B.f(short (*p)[M][N])
479デフォルトの名無しさん:2005/05/30(月) 22:41:30
>>464
#include <stdio.h>

int main(void){
int n, i, tmp;

printf("正の整数を入力して下さい->");
scanf("%d", &n);
if(n < 1) return 0;
printf("%dの逆数は ", n);
if(n == 1){
printf("1\n");
return 0;
}

tmp = 1;
printf("0.");
for(i = 0; i < 50; i++){
tmp *= 10;
printf("%d", tmp / n);
tmp %= n;
if(tmp == 0) break;
}
printf("\n");

return 0;
}
480477:2005/05/30(月) 23:02:09
>>478
動的確保による場合は、おそらくポインタのポインタのポインタを使うことを
期待されているような気がするのですが、その場合は、
メモリ使用量=L*M*N*sizeof(X)+L*M*sizeof(X *)+L*sizeof(X **)+sizeof(X ***)バイト
X:配列の型
でいいでしょうか?
もしよかったら、Xにはそれぞれ何が入るのか教えてください。
あと、その場合の関数での受け方は
f(X型 ***p)ですか?
481デフォルトの名無しさん:2005/05/30(月) 23:10:28
>>480
> おそらくポインタのポインタのポインタを使うことを
> 期待されているような気がするのですが

んなこたー無いだろ。
482477:2005/05/30(月) 23:18:31
授業で、動的確保による2次元配列というので
int m=2,n=3;
int **aai;
int *tmp;
aai=(int **)malloc(sizeof(int *)*m;
tmp=(int *)malloc(sizeof(int)*m*n;
というのを使っていたので、これの3次元配列を期待していると思っているのですが、
どうでしょうか?
483デフォルトの名無しさん:2005/05/30(月) 23:36:17
>>480
可変配列を作るならそうだが、配列の大きさが確定なら
リニアに一度に確保する方が効率的と思わんかね。
484デフォルトの名無しさん:2005/05/30(月) 23:42:04
>>482
おそらく出題者はその解答を期待しているだろうが、
「動的に確保する」という条件しか与えられていない以上、
>>478 は間違いではない。
485471:2005/05/30(月) 23:45:22
>>472
早速上げていただきありがとうございました。

ところで同じ結果を求めるにあたって
構造体と共用体を両方使って書くことは可能でしょうか?
486477:2005/05/30(月) 23:46:23
なるほど、確かにそうですね。
説明しろとあるのですが、
関数の渡し方と受け方はどのように説明したらよいのでしょうか?
487デフォルトの名無しさん:2005/05/30(月) 23:54:55
>>485
どうしても両方使って書けと言うのなら不可能ではないが、
この問題で共用体を使うのは全く意味がない。
488デフォルトの名無しさん:2005/05/30(月) 23:58:04
>>486
>>478では説明になっていないか?
仮に動的確保の方法を short ***p としたら、
渡し方: f(p)、受け方: f(short ***p)
より的確な説明があると思うか?
489477:2005/05/31(火) 00:14:44
説明というと、なんでそうなるのか、などを長々と説明しなくてはいけないものだと
思っていましたが、確かにそれ以上何を説明するのかがわからないので、このまま
出そうと思います。何回もありがとうございました。
490485:2005/05/31(火) 00:28:09
>>487
授業の時にこの問題の説明で、共用体に関数fopenとfputsを使ったやり方でも
出来たら解いてみよと言われたので、もしよろしかったらご教授願えないでしょうか。
491442:2005/05/31(火) 01:13:21
>>446
有難う御座いました。
492デフォルトの名無しさん:2005/05/31(火) 03:01:18
誰か18、27代目のdatをくれまいか。
493デフォルトの名無しさん:2005/05/31(火) 06:05:06
>>471 >>490
・後から問題に付け足しするのはやめましょう。解いてもらっている方に失礼です。
(>>1より)

ヒントだけでもあげやう。
>>472 を元にするなら、
・微妙にバグってるんでバグを取る。
・fopen()はmain()の中でやる。(サブルーチンは対応してる)
・fputs()を使うには邪道だが、write_recode()でsprintf()→fputs()を使う。
・共用体については、「この問題では使いどころがない」と注釈を入れる。

出来たのを、あげてくれると、他の人にもわかりやすいので、よろしく。
494デフォルトの名無しさん:2005/05/31(火) 09:42:48
>467,468,469,470
あぁ〜なるほど。有難うございました!
495デフォルトの名無しさん:2005/05/31(火) 10:01:24
[1] 授業単元: アルゴリズム論
[2] 問題文(含コード&リンク):配列に大きさの異なる10個の整数を先頭から順に詰める。この10個のデータの最小値をくり返し文をつかってさがす。
最小値とそれがはいっている配列要素の添字を表示する。しかしキーボードから入力するかわりに0~99の乱数を10個発生させるものとする。
[3] 環境
 [3.1] OS:WindowsXP
 [3.2] コンパイラ(バージョン):
 [3.3] 言語:C言語
[4] 期限:2005年5月31日18時まで

期限ぎりぎりまで考えたのですがさっぱり、、先輩方よろしくおねがいします。
496デフォルトの名無しさん:2005/05/31(火) 10:22:55
[1] 授業単元: アルゴリズム論II
[2] 問題文(含コード&リンク): 配列に0から99の乱数を10個つめなさい。
この配列をバブルソートを用いて昇順に並べ替えなさい。
[3] 環境
 [3.1] OS:WindowsXP
 [3.2] コンパイラ(バージョン):
 [3.3] 言語:C言語
[4] 期限:2005年6月1日朝9時まで

明日までの課題なのですがさっぱり,よろしくおねがいします。
497デフォルトの名無しさん:2005/05/31(火) 10:24:04
>>495
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
int main( void )
{
int num[10], min_idx, count1, count2, flg;
srand( getpid() );
for( count1=0; count1<10; count1++ ) {
do {
flg = 0;
num[count1] = rand() % 100;
for( count2=0; count2<count1; count2++ ){
if( num[count2] == num[count1] ) {
flg = 1;
break;
}
}
} while( flg );
}
min_idx=0;
for( count1=1; count1<10; count1++ ){
if ( num[count1] < num[min_idx] )
min_idx = count1;
}
printf( "%d %d\n", num[min_idx], min_idx );
return 0;
}
498デフォルトの名無しさん:2005/05/31(火) 10:31:59
アルゴリズム論II でバブルソート・・・(あきれている)
499デフォルトの名無しさん:2005/05/31(火) 10:35:08
>>496
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
int main( void )
{
int num[10], count1, count2, val;
srand( getpid() );
for( count1=0; count1<10; count1++ )
num[count1] = rand() % 100;
for( count1=1; count1<10; count1++ ){
printf( "%d ", num[count1] );
}
puts("");
for( count1=0; count1<10-1; count1++ )
for( count2=10-1; count2>count1; count2-- )
if( num[count2]<num[count2-1] ){
val = num[count2];
num[count2]=num[count2-1];
num[count2-1]= val;
}
for( count1=1; count1<10; count1++ ){
printf( "%d ", num[count1] );
}
puts("");
return 0;
}
500デフォルトの名無しさん:2005/05/31(火) 11:05:33
キーボ ードから実数 x を入力し、ニュートン法と呼ばれる次のような反
復の式を用いて、近似的に x の平方根を求めるプログラムを作成。
--
 xの平方根は、次の計算を| s(i+1)-s(i) | < ε, i=1,2,...となるまで繰
り返すことによって求めることができる。εは収束判定数である。

  s(i+1) = ( s(i) + x / s(i)) / 2
ただし、s(1) = 1 。

 なお、ε=0.00001として計算する。


明日の昼までにお願いします...



501デフォルトの名無しさん:2005/05/31(火) 11:29:38
>>493
授業までに完成させれませんでした・・・無念。
502デフォルトの名無しさん:2005/05/31(火) 11:30:22
http://pc8.2ch.net/test/read.cgi/tech/1116340323/905
マルチウザス
>905 :デフォルトの名無しさん :2005/05/31(火) 11:03:06
>これどーやるの?
>キーボ ードから実数 x を入力し、ニュートン法と呼ばれる次のような反
>復の式を用いて、近似的に x の平方根を求めるプログラムを作成せよ。
>--
> xの平方根は、次の計算を| s(i+1)-s(i) | < ε, i=1,2,...となるまで繰
>り返すことによって求めることができる。εは収束判定数である。
>
>  s(i+1) = ( s(i) + x / s(i)) / 2
>ただし、s(1) = 1 とする。
>
> なお、ε=0.00001として計算すること。
503デフォルトの名無しさん:2005/05/31(火) 11:44:24
なんだよマルチだったかよ
答えちゃったじゃん
ていうかこっちが宿題スレじゃん
まちがえた
504デフォルトの名無しさん:2005/05/31(火) 12:02:57
プログラムとその説明とか感想は書けたけど、
プログラミングのレポートで「検討と考察」って
どういうこと書けばいいでしょう…orz
505デフォルトの名無しさん:2005/05/31(火) 12:05:01
>>504
こぶしでなぐりつけたあと、くびをしめてころす
506505:2005/05/31(火) 12:08:18
>>504
自分の作ったプログラムの 問題点と成りえそうな点や 問題点を
書いて、それに対する対策あん♥を書いたりしてもいいな。
507デフォルトの名無しさん:2005/05/31(火) 12:55:02
[1] 授業単元:C言語
[2] 問題文:文字列str内のすべての数字文字を削除する関数 void del_digit(char str[])
を添字演算子を用いずに作成せよ.例えば,「AB1C9」を受け取ったら,「ABC」を 返す.
[3] 環境
 [3.1] OS:Windows XP
 [3.2] コンパイラ(バージョン):bcc
 [3.3] 言語:C
[4] 期限:2005年6月1日

添字演算子を用いずにというところでつまづいています…
508デフォルトの名無しさん:2005/05/31(火) 12:59:23
int is_digit(int c)
{
return c >= '0' && c <= '9';
}

void del_digit(char str[])
{
char *s, *t;
for (s = t = str; *s; s++)
if (!is_digit(*s))
*t++ = *s;
*t = '\0';
}
509デフォルトの名無しさん:2005/05/31(火) 13:33:02
>>504
他の手法と比較し、今の手法を使っている理由を示す。
現在の手法の限界を書く。
同種の手法で解ける問題を書く・・・など。
510太郎:2005/05/31(火) 13:36:01
[1] 授業単元:アドバンスプログラム
[2] 問題文(含コード&リンク):
3種類の括弧 (), {}, [] を含む文字列において,括弧の対応に
整合性がとれているかを判断する関数 int parenthesisCheck(char str[]) を作れ。
この関数は文字列 str 内の括弧の整合性がとれていれば 1 を,とれていなければ 0 を
関数値として返す。ただし,str 内の括弧以外の文字は無視する。
もちろん,文字列 str はヌル文字 '\0' で終了しているものとする。

たとえば, (a[b(cd){e}][f]) は整合性がとれているが,
(a[b(cd){e})][f] は整合性がとれていない。

ヒント:スタックを用いる。文字列を最初から見ていき,
開き括弧があるとそれをスタックに push する。閉じ括弧があると,
スタックからデータを pop し,それが閉じ括弧と対応するかどうかを判定する。

[3] 環境
 [3.1] VineLinux最新版
 [3.2] コンパイラ(バージョン) gcc
 [3.3] 言語:C
[4] 期限:2005年5月31日24:00まで
お願いします。
511デフォルトの名無しさん:2005/05/31(火) 13:50:12
>>510
char *ks="({]",*ke=")}]",s=1,t[256];
while(*p){for(i=0;i<3;i++){if(*p==ks[i])t[s++]=i;else if(*p==ke[i])if(t>1&&t[s-1]==i)s--;else return 0;}p++}
return 1;
512デフォルトの名無しさん:2005/05/31(火) 13:53:42
int parenthesisCheck(char str[])
{
  char stack[100];
  int sp = 0;
  for ( ; *str; str++) {
    switch (*str) {
    case '(': case '{': case '[':
      if (sp >= sizeof(stack)/sizeof(stack[0]))
        return 0; /* スタックオーバーフロー */
      stack[sp++] = *str;
      break;
    case ')':
      if (sp <= 0)
        return 0;
      if (*stack[--sp] != '(')
        return 0;
      break;
      /* } や ]についても同様 */
    }
  }
  return 1;
}
513デフォルトの名無しさん:2005/05/31(火) 13:59:58
>if (*stack[--sp] != '(')
514デフォルトの名無しさん:2005/05/31(火) 14:04:04
あーしまった
スタック残を忘れてた
>>512の方が優秀だな
515デフォルトの名無しさん:2005/05/31(火) 14:07:57
>if (*stack[--sp] != '(')
素でボケた。
if (stack[--sp] != '(')
ね。
516太郎:2005/05/31(火) 14:43:58
みなさんありがとうございます。
助かりましたー。
517デフォルトの名無しさん:2005/05/31(火) 14:50:48
>>516
あれ?2次エロ画像は?
518464:2005/05/31(火) 16:24:28
>>479
ありがとうございます。助かりました。
循環部の部分については自分でがんばってみます。
519デフォルトの名無しさん:2005/05/31(火) 18:49:01
q
520デフォルトの名無しさん:2005/05/31(火) 18:49:05
q
521デフォルトの名無しさん:2005/05/31(火) 18:58:12
[1] 授業単元: C言語
[2] 問題文(含コード&リンク):

-9999を読み込むまで次々と整数値を読み込んでいき、合計値および平均値を表示するプログラム。
なお、最後に読み込んだ-9999は合計には加えない。do while文を使用すること。

変数は下記を使用すること。
int i; ←カウンタ
int n; ←整数値入力エリア
int sum; ←合計算出エリア

実行結果
1個目:15 2個目:65
3個目:84 4個目:96
5個目:23 6個目:45
7個目:85 8個目:-9
9個目:57 10個目:-9999

合計 : 461
平均 : 51.22

[3] 環境
 [3.1] OS: WinXP
 [3.2] コンパイラ(バージョン):
 [3.3] 言語:C++
[4] 期限:明日まで。
[5] その他の制限:

よろしくお願いします。
522デフォルトの名無しさん:2005/05/31(火) 19:02:51
[1] 授業単元: programing
[2] 問題文(含コード&リンク): 正の実係数a,bによって定義される関数f(x)=ax-bx^3を考える。
(x>=0)の定義域においてf(x)を最大化するxの値をx_0とするとき、f(x)を0からx_0まで
積分した値を求めるプログラムをお願いします。 ∫[0〜x_0]f(x)dx
[3] 環境
 [3.1] OS:WinXp
 [3.2] コンパイラ(バージョン): gcc
 [3.3] 言語:C/C++/どちらでも可 のいずれか C
[4] 期限:yyyy年mm月dd日hh:mmまで または 無期限 のいずれか  明日
523デフォルトの名無しさん:2005/05/31(火) 19:08:57
>>521-522はテンプレに従ってないからパス
524デフォルトの名無しさん:2005/05/31(火) 19:26:36
>>521 do-whileを指示する意図がわからん。実質whileだが・・・カウンタ回すならforのがいい気がする。
i = sum = 0;
do {
if (scasnf("%d", &n) != 0 && n != -9999)
break;
sum += n;
i++;
} while (1);
if (i > 0)
printf("合計 %d\n平均 %f\n", sum, (double) sum / i);

>>522
f'(x) = -2bx^2+a = 0 のところで最大がある。
このとき、x^2 = a / -2b ∴ x = ±√(a/-2b)
・・・なんか数学板のネタな気がしてきた・・・挫折。
525デフォルトの名無しさん:2005/05/31(火) 19:38:27
>>522
微分するとa-2bx^2だから、x=0のときの傾きはaで正。
なので、x_0 ≠ 0。
頂点は傾きが0だから、
a-2bx^2=0
a = 2bx^2
x = ±√(a/2b)
a > 0、b >0 だから
x_0=√(a/2b)
あとは、f(x)を積分。





526デフォルトの名無しさん:2005/05/31(火) 20:05:20
>>522

f(x)=ax-bx^3 とすると。
・f'(x) = a - 3bx^2 = 0 のとき、x = ±√(a/3b)
・3次関数の形が↓極小↑極大↓
・a>0, b>0
なので、x >= 0とき f(x)の最大値はx = √(a/3b)のときである。これが、x_0。
∫f(x)dx = ax^2/2 - bx^4/4 + C;
定積分してやると、
(5a^2)/(36b)
・・・うーん。なんか計算ミスしてそぉだ。
まあ、そんなわけで。

double func(double a, double b)
{
return 5.0 * a * a / 36.0 / b;
}
ってことでどーだろーか。
527デフォルトの名無しさん:2005/05/31(火) 20:41:17
【質問テンプレ】
[1] 授業単元: 情報処理基礎
[2] 問題文(含コード&リンク): データの個数のnお呼びnこのデータをファイルから読み込み、
そのデータについて、データ数、最大値、最小値、平均、不偏分散、
標準偏差を計算しファイルに出力するプログラムを作成し、プログラム、
出力結果を1つのファイルにしてプリントアウトし提出せよ

[3] 環境
 [3.1] OS:Windows/Linux/等々 Windous
 [3.2] コンパイラ(バージョン): Borland C++compiler
 [3.3] 言語:C
[4] 期限:2005年6月1日14:30まで
[5] その他の制限:

528527:2005/05/31(火) 20:42:39
制限というか↓はヒント?みたいなものだと思います

void filedta(FIL *in int,int*n1,double data[])/*データを読み込みデータ数データを返す*/
voidaverage(int n,double data[],double *max double *min,double *ave,double *vor,double *sigma,FILE *out)
/*
max min ave vor sigmaを計算して結果をファイルに書き出すとともにメンプログラムに返す
*/

プログラムのアルゴリズム

使用する変数関数の宣言
|
   入力ファイルの先頭アドレスを指定する←FILE*in in=fopen();使用
|
出力ファイルの先頭アドレスを指定する←FILE*out out=fopen();使用
|
入力データの読み込み n,data[]←ファイルが見つからない場合はエラーメッセージを
           |        プリントアウト 関数filedata()
最大値、最小値、平均、不偏分散、標準偏差の計算とファイルへの出力←関数average()

よろしくお願いします
529デフォルトの名無しさん:2005/05/31(火) 20:58:51
524 早いレスありがとうございます。do-whileの課題だったので指定しました。
530デフォルトの名無しさん:2005/05/31(火) 22:00:12
>>527-528 なんか指定されたものがイヤ〜ン
filedata()ってばバッファオーバーランを回避できないよなぁ。
agerage()の計算と出力を同時に行うのは・・・やっぱしイヤ。
センセ、下手な教え方せんでください。

とりあえず、要点だけ。
e に平均が入っているとして、
double s = 0; /* 偏差平方和 */
for (i = 0; i < n; i++)
s += (data[i] - e) * (data[i] - e);
*vor = s / (n - 1); /* 不偏分散 */
*sigma = sqrt(s / n); /* 標準偏差 */

平均、最大、最小の各値はの求め方はさんざん書いてあるので、これで十分でしょう。
531521:2005/05/31(火) 22:35:52
>>524
この問題ってbreak文なしでも記述できるんでしょうか?
532デフォルトの名無しさん:2005/05/31(火) 22:46:33
できる。がんばれ。
533デフォルトの名無しさん:2005/05/31(火) 23:35:39
>>531
i = -1;
n = sum = 0;
do {
sum += n;
i++;
} while (!scanf("%d", &n) || n != -9999);
534デフォルトの名無しさん:2005/05/31(火) 23:59:06
  γo⌒^^^⌒o       
  .i ノソ~ノ ハ .)リ
  从* ´ー` リノシ  おやしみだっぺ
  /^^     ^^\
 (_つ ・ 人  ・) )

535デフォルトの名無しさん:2005/06/01(水) 00:01:49
[1] 授業単元:C++
[2]  整数データを標準入力から与え,小さい順に並び替え,出力するプログラムを作りなさい。
ただし、プログラムの仕様は以下の通りです。

(1)0が入力されたら、入力の終わりとする。
(2)標準入力された正数データのみを計算の対象とし、最後に入力された0はデータには含めない。
(3)あらかじめ用意した配列サイズを越えた場合,あるいは入力が一つもない場合は,その旨,エラーを表示し
  実行を終了すること。
(4)配列サイズは各自で設定して構わない。

[3] 環境
 [3.1] OS:WinXP
 [3.2] コンパイラ(バージョン):
 [3.3] 言語:C++
[4] 期限:6月3日

よろしくお願いします。
536デフォルトの名無しさん:2005/06/01(水) 00:06:48
[1] 授業単元: プログラミング
[2] 問題文(含コード&リンク):ファイルを比較するプログラムを作成せよ。
コンパイラで「dif ファイル名1 ファイル名2」と入力すれば比較することができるようにする。
[3] 環境
 [3.1] OS:WindowsXP
 [3.2] コンパイラ(バージョン):
 [3.3] 言語:C
[4] 期限:明日まで
[5] その他の制限:
ファイルのコピー「cp ファイル名1 ファイル名2」は、検索したりして出来たのですが比較がさっぱりわかりません。
よろしくお願いします。
537デフォルトの名無しさん:2005/06/01(水) 00:38:38
>>536
エラーチェックは省略。適宜追加してくれ。

#include <stdio.h>

int main(int argc, char **argv) {
 FILE *fp1 = fopen(argv[1], "rb");
 FILE *fp2 = fopen(argv[2], "rb");
 int c1, c2;
 do {
  c1 = getc(fp1);
  c2 = getc(fp2);
 } while (c1 == c2 && c1 != EOF);
 printf (c1 == c2 ? "おなじ\n" : "ちがう\n");
 fclose(fp1);
 fclose(fp2);
 return 0;
}
538デフォルトの名無しさん:2005/06/01(水) 01:11:44
[1] 授業単元:計算機科学演習
[2] 問題文(含コード&リンク):基数の変換「○進法→○進法」に
するプログラムを作りなさい。(例:3進法→5進法)
ただし、整数に限ってよい。
[3] 環境
 [3.1] OS:WindowsXP
 [3.2] コンパイラ(バージョン):VC++
 [3.3] 言語:C
[4] 期限:2005年6月1日14:00まで
[5] その他の制限:下のアルゴリズムを使うこと。
int conv2(int d1, int m1, int x1[], int d2, int m2, int x2[])
{
    int i, j, r, t;
    for(i = 0; m1 > 0 && i < m2; i++){
        r = 0;
        for(j = m1 - 1; j >= 0; j--){
            t = d1 * r + x1[j];
            x1[j] = t / d2;
            r = t % d2;
        }
        x2[i] = r;
        while(m1 > 0 && x1[m1 - 1] == 0)
            m1--;
    }
    if(m1 == 0)
        return i;
    else
        return -1;
}

どうかお願いします。教えてください。
539536:2005/06/01(水) 01:12:16
>>537
ありがとうございます。
早速やってみたんですが、「argcが使われていません」と出ました。
でも「dif ファイル名1 ファイル名2」で実行してみたら比較できました。
540デフォルトの名無しさん:2005/06/01(水) 01:29:26
541538:2005/06/01(水) 01:30:41
>>538のアルゴリズムの説明を付け足します。
『conv2()は,d1進m1桁の数x1[]を,d2進たかだかm2桁の数x2[]に
 変換し,変換後の桁数を返す。
 変換後の桁数がm2を超えれば-1を返す。』
付け足しをしてすみません。
考えても分からなかったので、助けてください。
お願いします。
542デフォルトの名無しさん:2005/06/01(水) 02:09:00
[1] 授業単元:プログラミング
[2] 問題文(含コード&リンク):
英文をリダイレクションを使って、プログラムの標準入力から読み込み、
リスト構造に格納するプログラムを作成せよ。
標準入力からのテキストの読み込みには、readword関数を用いること。

例えば入力文字が「Hello, how are you doing?」の場合,
「Hello」「 how」「 are」「 you」「 doing」の5つの文字列をリスト構造に格納した後に
Hello
how
are
you
doing
と出力したいのです。
[3] 環境
 [3.1] OS:Linux
 [3.2] コンパイラ(バージョン):gcc
 [3.3] 言語:C
[4] 期限:金曜日まで

一応プログラムを書いてみました。
リスト構造がまだよく理解できていないので、突っ込みどころ満載だと思いますが…
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/480.txt
現在コンパイル時に表示されるエラーは下の通りです。
kadai03D-1.c: In function `main':
kadai03D-1.c:26: warning: passing arg 1 of `insert' makes integer from pointer without a cast
kadai03D-1.c: In function `insert':
kadai03D-1.c:79: warning: passing arg 2 of `strcpy' makes pointer from integer without a cast
よろしくお願いします。
543デフォルトの名無しさん:2005/06/01(水) 02:38:02
>>541
なんかグチャグチャでスマソ
#include <stdio.h>
#include <stdlib.h>
#define M1MAX 20
#define M2MAX 20

/* ここにconv2貼り付け */

int main(void){
int d1, d2;
int i = 0, tmp, m1, m2;
int x1[M1MAX], x2[M2MAX];
char buf[M1MAX+1];
char table[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

printf("何進数の数入力すんの?(1-36)>");
scanf("%d", &d1);
printf("%d進数の数入力すれば>", d1);
scanf("%s", buf);

while(buf[i] != '\0') i++;
m1 = i;
544デフォルトの名無しさん:2005/06/01(水) 02:39:01
>>541
for(i = m1 - 1; i >= 0; i--){
tmp = m1 - i - 1;
if(buf[tmp] >= '0' && buf[tmp] <= '9'){
x1[i] = buf[tmp] - '0';
}else if(buf[tmp] >= 'A' && buf[tmp] <= 'Z'){
x1[i] = buf[tmp] - 'A' + 10;
}else{
printf("入力おかしくない?\n");
exit(2);
}
if(x1[i] > d1 - 1){
printf("これ%d進法じゃなくない?\n", d1);
exit(2);
}
}
printf("何進数の数にしたいの?(1-36)>");
scanf("%d", &d2);
m2 = conv2(d1, m1, x1, d2, M2MAX, x2);
if(m2 != -1){
for(i = m2 - 1; i >= 0; i--){
printf("%c", table[x2[i]]);
}
}
else{
printf("なんか無理っぽい");
}
printf("\n");

return 0;
}
545デフォルトの名無しさん:2005/06/01(水) 02:41:08
とりあえず、
insert関数の引数のchar stringをchar *stringにすればいいよ
546デフォルトの名無しさん:2005/06/01(水) 02:42:54
>>542
エラーメッセージをよく読めば分かるのに。
insert()の第一引数は、char stringになってるけど
これは間違いで、char* stringのつもり
でしょ。
547546:2005/06/01(水) 02:43:15
かぶった
548デフォルトの名無しさん:2005/06/01(水) 03:33:16
>>542
insert()がheadを返してるせいで、
ずっとpがNULLになってるから、p==NULLが評価されることでリストが逆順になっちゃってるね。
insert()はr(現在のノード)を返すようにして、pを変化させるのがいくない?
549デフォルトの名無しさん:2005/06/01(水) 04:07:12
【質問テンプレ】
[1] 授業単元: STL
[2] 問題文(含コード&リンク):文章のスペルチェックをするプログラム。
[3] 環境
 [3.1] OS:Windows
 [3.2] コンパイラ(バージョン):MSVC
 [3.3] 言語:C++
[4] 期限:なるべく早く
[5] その他の制限:
std::set<std::string>(dictionaryを格納し、検索する),
std::map<std::string,std::string>を使用。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/482.txt
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/483.txt
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/484.txt
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/485.txt
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/486.txt
にEnglish Word 辞書があります。(サイズが大きいので、5つにわけました)
それを1つのファイルDictionary.txtにしてください。それを読み込みます。
input.txtにスペルチェックする文章が入っています。
それと先の辞書と比較し、ない単語は、ユーザーにi,a,r,cのどれかを入力させます。
i:一度その一語だけを無視する。
a:ファイルの中にあるその単語全てを無視する。
r:一度その一語を他の単語に書き換える。書き換える単語は聞く。
c:ファイルの中にあるその単語全てを他の単語に書き換える。
  書き換える単語は一度だけ聞く。
サンプルラン http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/487.txt
main.cpp http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/481.txt

どうか、よろしくお願いします。
550デフォルトの名無しさん:2005/06/01(水) 05:53:23
>>549
嫌ですぅ
551535:2005/06/01(水) 05:54:43
>>540
ありがとうございます。助かりました
552549:2005/06/01(水) 06:35:39
>>550
わかりました。私の考え方が甘かったようです。自己解決してみます。
553デフォルトの名無しさん:2005/06/01(水) 10:25:48
[1]授業単元: プログラミング演習I
[2] 問題文:

問題1.複利計算

キーボードから
数値 x 円と
預ける年数 r 年と
年利率 a %
を入力してもらい、複利計算で貯金がどれくらい増えるかを計算するプログラムを作成せよ。
なお複利計算は 10000 円を年利0.8%でまわした場合

・1年後には 10000*(1+0.008) = 10080
・2年後には 10080*(1+0.008) = 10160
・3年後には 10100*(1+0.008) = 10241
となるような計算である。

問題2.qの剰余系

キーボードから、整数値Nと整数値qを入力してもらい、
1〜Nのうちで qで割り切れるものを表示させるプログラムを作成しなさい。

[3] 環境
 [3.1] OS:Linux
 [3.2] コンパイラ(バージョン):cc
 [3.3] 言語:C
[4] 期限:6/7まで
[5] その他の制限:条件分岐と繰り返しまで習いました。

条件分岐と繰り返しの複合問題です。
昨日1日かけて考えてもわからなかったので、
2問ありますが、どなたかご教授お願いします。
554デフォルトの名無しさん:2005/06/01(水) 11:30:11
一応問題1はできた。変数名や型が気に入らなかったら適宜変えてくれ。
まだ初心者だからスマートにはかけなかったが…

#include<stdio.h>

main(){

double money,rate;
int yeah,i;

printf("いくら預けますか?:");
scanf("%lf",&money);

printf("年利率を設定してください(%):");
scanf("%lf",&rate);

printf("何年預けますか?:");
scanf("%d",&yeah);

printf("%f円を年利率%f%で%d年預けます\n",money,rate,yeah);
rate=0.001*rate;
for(i=0;i<yeah;i++) money=money*(1+rate);

printf("%d年後の預金は%f円です。\n",yeah,money);
}

555デフォルトの名無しさん:2005/06/01(水) 11:40:29
char *w[] = { "SUN", "MON", "TUE","WED", "THU", "FRI", "SAT", };
の"SUN", "MON", "TUE","WED", "THU", "FRI", "SAT"の部分をキーボードから
入力させるようにしたいのですが、
for( i = 0; i < 7; i++ )
{
printf( "data %d >>>", i + 1 );
gets( strings[i] );
}
のようにしてもできませんでした。どのようにすればよいでしょうか?
556デフォルトの名無しさん:2005/06/01(水) 11:43:38
>>553
問題2も作った

#include<stdio.h>

main(){

int N,q,i;

printf("整数を入力してください:");
scanf("%d",&N);

printf("割る数を入力してください:");
scanf("%d",&q);

printf("1〜%dのうちで%dで割り切れる数字は以下の通りです\n",N,q);

for(i=1;i<=N;i++){
if(i%q==0) printf("%d ",i);
}
}

数値が大きくなったら処理に時間がかかるけど…まぁ、大丈夫だと思う。
…って俺は自分の課題も終わってないのに何してるんだorz
557デフォルトの名無しさん:2005/06/01(水) 11:45:12
>>554
・利率の計算が間違っている。0.001ではないな。
・預金の場合、毎年切り捨てて計算するべき。0.1円を預けるわけではないのだから。

>>555
・説明が下手なんだから部分ではなく全体を貼れ。
・但しここは宿題スレだから初心者スレにでも逝け。
558デフォルトの名無しさん:2005/06/01(水) 12:03:58
>>555
malloc()
559デフォルトの名無しさん:2005/06/01(水) 12:04:46
>>557
指摘サンクス!
おお…確かに利率が間違ってる。問題文に書かれたとおりに計算してしまいました
やっぱり切り捨てた方が良いですね。書く時にどっちにしようか迷ったんですけど…

ということで改良(?)版を
#include<stdio.h>

main(){

double rate;
int money,yeah,i;

printf("いくら預けますか?:");
scanf("%d",&money);

printf("年利率を設定してください(%):");
scanf("%lf",&rate);

printf("何年預けますか?:");
scanf("%d",&yeah);

printf("%d円を年利率%f%で%d年預けます\n",money,rate,yeah);
rate=0.01*rate;
for(i=0;i<yeah;i++) money=money*(1+rate);


printf("%d年後の預金は%d円です。\n",yeah,money);
}
560デフォルトの名無しさん:2005/06/01(水) 12:15:41
rate=0.01*rate;
for(i=0;i<yeah;i++) money=money*(1+rate);
じゃなくて
rate=0.01*rate+1.0;
for(i=0;i<yeah;i++) money=money*rate;
のほうがいいん希ガス?
561デフォルトの名無しさん:2005/06/01(水) 12:16:57
いいん希ガス?->いい希ガス
orz
562デフォルトの名無しさん:2005/06/01(水) 12:26:33
[1] 授業単元:コンピュータ科学
[2] 問題文(含コード&リンク):

『ある個数のデータ群の中の最小値を見つける。さらにそのデータは何番目のデータだったかを探る』
このアルゴリズムを考えて、フローチャートまたはPADで示すこと。
使用するメモリはどんな役割を持っているかも記述すること。』

[4] 期限:2005/06/07 (金)

かなり初歩的な問題なのだろうと思いますが、教授の説明が
あまりに下手糞なので、もうお手上げ状態です。
どなたか僕に分かりやすく解説してくれませんか?
よろしくお願いします。
563562:2005/06/01(水) 12:30:28
期限が間違っていました。訂正します。

[4] 期限:2005/06/03 (金)

よろしくお願いします・・・


564デフォルトの名無しさん:2005/06/01(水) 12:58:36
549です。
問題文はこれです。
http://pc8.2ch.net/test/read.cgi/tech/1116914132/549
辞書のリンクが間違ってました。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/482.zip
です。以下4つとも同じく、txtではなくzipです。

自分なりにやってみたのですが、これです。 Runはします。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/488.txt
空白を読み込めないのと、選択のc(たぶんstd::map<std::string,std::string>を使うのかな?)、
あと既存の関数の使い方がわかりません。
どなたかご教授してください。
お願いします。
565デフォルトの名無しさん:2005/06/01(水) 13:07:54
>>562
アルゴリズムが分からないのか?
それともフローチャート or PADでの示し方が分からないのか?

前者ならこれを見てフローチャート or PAD作れ。
ttp://www.uplo.net/www/vip11872.zip
566デフォルトの名無しさん:2005/06/01(水) 13:10:19
>>564
なぜ
bool charIsPartOfWord(const char c)
にisalpha()を使わないのか悩む。
567デフォルトの名無しさん:2005/06/01(水) 13:43:20
[1] 授業単元: プログラミング基礎
[2] 問題文(含コード&リンク): case文を用いて、3〜5が入力されたら春。6〜8が入力されたら夏。
9〜11は秋。12〜2は冬を表示するプログラム。
[3] 環境
 [3.1] OS:Linux
 [3.2] コンパイラ(バージョン):gcc
 [3.3] 言語:C
[4] 期限:2005年6月2日まで
[5] その他の制限:case文の基礎まで

case文をそのまま繋げて提出したところ、(case:3 printf("春"); case:4 printf("春")…)もっとシンプルにするようにと言われてしまいました。
caseの条件をまとめるというのは可能なのでしょうか?
568デフォルトの名無しさん:2005/06/01(水) 13:47:16
switch (式) {
case 3: case 4: case 5:
  printf("春");
  break;
/* あとはためしてみなっせ */
}
569デフォルトの名無しさん:2005/06/01(水) 13:48:42
>>567

switch ( ... ) {
case 1 :
case 2 :
case 12 :
...;
break;
case 3 :
case 4 :
case 5 :
...;
break;
case 6 :
case 7 :
case 8 :
...;
break;
case 9 :
case 10 :
case 11 :
...;
break;
}

基本だ。
570デフォルトの名無しさん:2005/06/01(水) 13:53:53
[1] 授業単元:C言語
[2] 問題文(1): 任意の個数の整数を入力し、それを格納した配列と要素数を返す関数うを作りなさい。また、適当なmain関数を補って実行例を示しなさい。
[2] 問題文(2): 任意の長さの1行分の文字列を任意の行数分入力し、EOFを入力すると逆順に表示するプログラムを作成せよ。
[3] 環境
 [3.1] OS:WinXP SP2
 [3.2] コンパイラ:VC++
 [3.3] 言語:C
[4] 期限:今日中でお願いします。

両方ポインタで作成しなさい、だそうです。
宜しくお願いします。
571デフォルトの名無しさん:2005/06/01(水) 14:01:51
>>570
alloc系統は習っている?
572570:2005/06/01(水) 14:04:30
>>571
はい。授業でも出てきています。
まだしっかりと理解できていませんが・・・・・。
573デフォルトの名無しさん:2005/06/01(水) 14:04:42
#include <stdio.h>
int readint(FILE *fp, int *buf, int n)
{
int i;
for (i = 0; i < n && fscanf(fp, "%d", buf) == 1; i++, buf++)
;
return i;
}
int main(void)
{
int buf[100];
int n = readint(stdin, buf, 100);
/* あとはてきとーにnとbufの表示をしてください */
return 0;
}

問い2を取り掛かる前に質問。構造体習いました?あと、malloc()習いました?
574570:2005/06/01(水) 14:08:28
>>573
早いレスありがとうございます。
571さんにもレスした通りですが、reallocやmallocは授業で習いました。
575デフォルトの名無しさん:2005/06/01(水) 14:15:59
仁クン謎の失踪!?負けるな!赤西仁
http://air.ath.cx/~kp/pera/034/
最強KAT−TUN!!!
http://air.ath.cx/~kp/pera/035/
亀ちゃんサイト集めちゃいました!!
http://air.ath.cx/~kp/pera/036/
ジャニーズの誘惑!!!
http://air.ath.cx/~kp/pera/037/

仁クン謎の失踪!?負けるな!赤西仁
http://air.ath.cx/~kp/pera/034/
最強KAT−TUN!!!
http://air.ath.cx/~kp/pera/035/
亀ちゃんサイト集めちゃいました!!
http://air.ath.cx/~kp/pera/036/
ジャニーズの誘惑!!!
http://air.ath.cx/~kp/pera/037/

仁クン謎の失踪!?負けるな!赤西仁
http://air.ath.cx/~kp/pera/034/
最強KAT−TUN!!!
http://air.ath.cx/~kp/pera/035/
亀ちゃんサイト集めちゃいました!!
http://air.ath.cx/~kp/pera/036/
ジャニーズの誘惑!!!
http://air.ath.cx/~kp/pera/037/
576デフォルトの名無しさん:2005/06/01(水) 14:16:04
仁クン謎の失踪!?負けるな!赤西仁
http://air.ath.cx/~kp/pera/034/
最強KAT−TUN!!!
http://air.ath.cx/~kp/pera/035/
亀ちゃんサイト集めちゃいました!!
http://air.ath.cx/~kp/pera/036/
ジャニーズの誘惑!!!
http://air.ath.cx/~kp/pera/037/

仁クン謎の失踪!?負けるな!赤西仁
http://air.ath.cx/~kp/pera/034/
最強KAT−TUN!!!
http://air.ath.cx/~kp/pera/035/
亀ちゃんサイト集めちゃいました!!
http://air.ath.cx/~kp/pera/036/
ジャニーズの誘惑!!!
http://air.ath.cx/~kp/pera/037/

仁クン謎の失踪!?負けるな!赤西仁
http://air.ath.cx/~kp/pera/034/
最強KAT−TUN!!!
http://air.ath.cx/~kp/pera/035/
亀ちゃんサイト集めちゃいました!!
http://air.ath.cx/~kp/pera/036/
ジャニーズの誘惑!!!
http://air.ath.cx/~kp/pera/037/
577デフォルトの名無しさん:2005/06/01(水) 14:16:10
仁クン謎の失踪!?負けるな!赤西仁
http://air.ath.cx/~kp/pera/034/
最強KAT−TUN!!!
http://air.ath.cx/~kp/pera/035/
亀ちゃんサイト集めちゃいました!!
http://air.ath.cx/~kp/pera/036/
ジャニーズの誘惑!!!
http://air.ath.cx/~kp/pera/037/

仁クン謎の失踪!?負けるな!赤西仁
http://air.ath.cx/~kp/pera/034/
最強KAT−TUN!!!
http://air.ath.cx/~kp/pera/035/
亀ちゃんサイト集めちゃいました!!
http://air.ath.cx/~kp/pera/036/
ジャニーズの誘惑!!!
http://air.ath.cx/~kp/pera/037/

仁クン謎の失踪!?負けるな!赤西仁
http://air.ath.cx/~kp/pera/034/
最強KAT−TUN!!!
http://air.ath.cx/~kp/pera/035/
亀ちゃんサイト集めちゃいました!!
http://air.ath.cx/~kp/pera/036/
ジャニーズの誘惑!!!
http://air.ath.cx/~kp/pera/037/
578570:2005/06/01(水) 14:16:14
連投すみません。
構造体はまだ習っていませんが、うちの教授は習っていないことを使っても良いといっていました。
579デフォルトの名無しさん:2005/06/01(水) 14:16:18
仁クン謎の失踪!?負けるな!赤西仁
http://air.ath.cx/~kp/pera/034/
最強KAT−TUN!!!
http://air.ath.cx/~kp/pera/035/
亀ちゃんサイト集めちゃいました!!
http://air.ath.cx/~kp/pera/036/
ジャニーズの誘惑!!!
http://air.ath.cx/~kp/pera/037/

仁クン謎の失踪!?負けるな!赤西仁
http://air.ath.cx/~kp/pera/034/
最強KAT−TUN!!!
http://air.ath.cx/~kp/pera/035/
亀ちゃんサイト集めちゃいました!!
http://air.ath.cx/~kp/pera/036/
ジャニーズの誘惑!!!
http://air.ath.cx/~kp/pera/037/

仁クン謎の失踪!?負けるな!赤西仁
http://air.ath.cx/~kp/pera/034/
最強KAT−TUN!!!
http://air.ath.cx/~kp/pera/035/
亀ちゃんサイト集めちゃいました!!
http://air.ath.cx/~kp/pera/036/
ジャニーズの誘惑!!!
http://air.ath.cx/~kp/pera/037/
580デフォルトの名無しさん:2005/06/01(水) 14:25:12
>>570 配列の伸張やるのがメンドかったので、お茶をにごす。1行が長いときは対応してない。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct List { char *line, struct List *next; };
void *ealloc(size_t) { void *p = malloc(size_t); if (p == NULL) { fprintf(stderr, "no enough memory\n"); exit(2); } return p; }
char *estrdup(char *s) { char *t = (char *) malloc(strlen(s) + 1); strcpy(t, s); return t; };
int main(void) {
char line[200];
List *head = 0, *list;
while (fgets(line, sizeof(line), stdin)) {
list = (List *) ealloc(sizeof(*list));
list->line = estrdup(line);
list->next = head;
head = list;
}
for (list = head; list; list = list->next)
fputs(list->line, stdout);
return 0;
}
581570:2005/06/01(水) 14:30:03
あっ、そうか。そう書けば良かったのか・・・・・・・。

>>580サン
ありがとうございます。長い文字列の対応は、こちらで処理したいと思います。
本当に助かりました。

他の皆さんも、本当に助かりました。ありがとうございます。
582デフォルトの名無しさん:2005/06/01(水) 14:30:57
>>566
わかりません。
先生がオタなので・・・。
583570:2005/06/01(水) 14:38:45
すいません、580さん。
コンパイルしたところ、17エラーの1警告でした。

error C2143: 構文エラー : ':' が 'type' の前に必要です。
error C2059: 構文エラー : 'type'
error C2055: 関数定義内で仮引数リスト以外が使われていました。
error C2143: 構文エラー : ')' が 'type' の前に必要です。
error C2198: 'malloc' : 実引数が少なすぎます。
error C2059: 構文エラー : ')'
error C2065: 'List' : 定義されていない識別子です。
error C2065: 'head' : 定義されていない識別子です。
error C2106: '=' : 左のオペランドが、左辺値になっていません。
error C2065: 'list' : 定義されていない識別子です。
error C2100: 間接指定演算子 (*) の使い方が不正です。
error C2059: 構文エラー : ')'
error C2223: '->line' : 左側が構造体か共用体に対するポインタではありません。
error C2223: '->next' : 左側が構造体か共用体に対するポインタではありません。
error C2223: '->next' : 左側が構造体か共用体に対するポインタではありません。
error C2223: '->line' : 左側が構造体か共用体に対するポインタではありません。
warning C4133: 'function' : 'struct _iobuf *' と 'const char *' の間で型に互換性がありません。
error C2198: 'fputs' : 実引数が少なすぎます。

よろしかったら修正をお願いします。
584デフォルトの名無しさん:2005/06/01(水) 15:04:32
typedef struct List List;
585デフォルトの名無しさん:2005/06/01(水) 15:14:33
>506,509
ありがとうございます。
>506
改善できる問題点があるなら最初から良いほうのプログラムに
しなくてよいのですか?わざとあまりよくないほうを書いて
考察のところで直す、といった形をとるのでしょうか。
586デフォルトの名無しさん:2005/06/01(水) 15:20:21
>>580
プギャー
587デフォルトの名無しさん:2005/06/01(水) 15:27:52
【授業単元】プログラム言語
【問題文】
<処理内容>
unsigned intt型の整数n、mの値を読み込み、n×mの計算を
シフト演算を用いて行う。結果はunsigned long型の変数に格納し
表示する。
n×mの計算をシフト演算で行うには次のようにする。
@x=0、s=0とする。ここで、sシフト数で、xは結果を格納する
変数である。
Anをsビット右シフトし、最右端のビットをチェックする。
1ならばmをsビット左シフトしたものにxを加える。
B Aでnをsビット右シフトしたものが0に等しければ、
xに乗算結果が格納される。さもなければ、sに1を
加えてAに戻る。

[3] 環境
 [3.1] OS: windows
 [3.2] コンパイラ(バージョン):Visual C++
 [3.3] 言語:C

よろしくお願いします。
588デフォルトの名無しさん:2005/06/01(水) 15:46:37
>>587
for ( x = 0, s = 0; n >> s; s++ ) if ( ( n >> s ) & 0x00000001 ) x += m << s;
589デフォルトの名無しさん:2005/06/01(水) 16:29:59
改善できるのなら改善しる! >>585
その後で考察書けばよろし。
590553:2005/06/01(水) 16:47:13
>>554
>>556
>>557
>>559
>>560
答えてくださった方、早速の解答どうもありがとうございます。
すごく助かりました。
並びにアドバイスをくれた皆様方も、ありがとうございました。
ちなみに僕は問題1は、
for(i=0;i<yeah;i++) {money=money*rate/100+maney;}
でやってみました。



591553:2005/06/01(水) 16:49:05
ミスが一箇所。
maney×→money
592デフォルトの名無しさん:2005/06/01(水) 18:05:43
[1]C言語
[2]次のプログラムは外部変数に定義され、初期化された10個のint型データの平均を求め、各データと平均との差を表示するプログラムである。
 このプログラムを以下のような関数の翻訳単位にファイルを分け、同様な動作をするプログラムを作成せよ。
型関数名引数・パラメータ機能戻り値
floatget_aveなし平均値を求め表示平均値
voidprint_data配列の添字、平均値1つのデータと平均値との差を求め表示なし
プログラム
/*
program : average.c
comments : 結合(linkage)を用いて、平均・差を求める。
*/
#include <stdio.h>
int score[10]={3,5,8,9,10,6,7,9,8,3};
int main(){
int i;
float ave = 0.0, dif;
for(i=0; i<10; i++) ave = ave + (float)score[i];
ave = ave / 10.0;
printf("ave = %3.1f\n",ave);
for(i=0; i<10; i++){
dif = score[i] - ave;
printf("score[%02d]=%2d Difference from average = %4.1f\n",i,score[i],dif);
}
return(0);
}
[3]環境
 [3.1]MAC OS]
 [3.2]gcc version 3.3 20030304 (Apple Computer, Inc. build 1666)
 [3.3]C
[4]2005年6月2日am6:00あたりまで
[5]特になし
宜しくお願いします。
593デフォルトの名無しさん:2005/06/01(水) 19:28:40
>>592
// 型   関数名   引数・パラメータ     機能                        戻り値
// float  get_ave   なし            平均値を求め表示                平均値
// void  print_data  配列の添字、平均値  1つのデータと平均値との差を求め表示   なし
#include <stdio.h>

int score[10]={3,5,8,9,10,6,7,9,8,3};

float get_ave(void){
int i;
float ave = 0.0, dif;
for(i=0; i<10; i++) ave = ave + (float)score[i];
ave = ave / 10.0;
printf("ave = %3.1f\n",ave);
return ave;
}

void print_data(int i, float ave){
float dif;
dif = score[i] - ave;
printf("score[%02d]=%2d Difference from average = %4.1f\n",i,score[i],dif);
}

int main(){
int i; float ave;

ave = get_ave();
for(i=0; i<10; i++) print_data(i, ave);
return(0);
}
594デフォルトの名無しさん:2005/06/01(水) 19:30:33
[1] 授業単元:プログラミング
[2] 問題文:
人数nをキーボードから入力し、配列に身長のデータを読み込んでいき、
入力された身長を10cmごとにわけたヒストグラムを作成するプログラム。

<実行例>
何人の身長を入力しますか? 4
1人目の身長143
2人目の身長186
3人目の身長203
4人目の身長183

140<=x<150 : * 1名
180<=x<190 : ** 2名
200<=x<210 : * 1名


[3] 環境
 [3.1] OS:Linux
 [3.2] コンパイラ(バージョン):cc
 [3.3] 言語:C言語
[4] 期限:なるべく早めに・・・
[5] 制限など:習った場所は、変数宣言、条件文(for if while)、配列(数配列)、
関数です。

お願いしますm(_ _)m
595デフォルトの名無しさん:2005/06/01(水) 19:43:33
596594:2005/06/01(水) 19:49:23
>>244さんのPutSterというのと、continueはよくわかりません・・・
初心者なのですみません。
597594:2005/06/01(水) 20:09:19
自己解決できました。
>>244さん >>595さんありがとうございます。
598工大花子:2005/06/01(水) 21:00:08
[1] 授業単元: コンピュータ
[2] 問題文(含コード&リンク): 3角形の3辺の長さa,b,cを与えて、面積areaを求める関数を作れ。ただしs=(a+b+c)/2として、area=s(s-a)(s-b)(s-c)の平方根である。
[3] 環境
 [3.1] OS:Windowsxp
 [3.2] コンパイラ(バージョン):
 [3.3] 言語:C
[4] 期限:2005年6月1日24:00まで
[5] その他の制限:よろしくお願いします
599デフォルトの名無しさん:2005/06/01(水) 21:01:32
【授業単元】C++
【問題文】
電卓を作成する。データ取り込みは標準入力(キーボード)
ー使用可能関数ー
文字列から数値への変換  double atof(char*)<stdlib.h>
べき乗double pow(double x, double y)<math.h>
文字列の比較  int strcmp(char*, char*) <string.h>
数字か否か  int isdigit(unsigned int c)<ctype.h>
[3] 環境
 [3.1] OS:WinXP
 [3.2] コンパイラ(バージョン):VC6.0
 [3.3] 言語:C++
[4] 期限:本日中にお願いします
[5] 制限など:自分で書いてみたらこのような感じになりました
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/489.txt
問題点1:一部の制御部分の行い方がわからなくなりました。
2:エラー個所をコンパイルしないようにしたのですが、処理が行われて
いないみたいです。どのようにすれば直るのかよろしくお願いします。
600デフォルトの名無しさん:2005/06/01(水) 21:32:38
>>598
一応、問題文どおりに作ってみた。

#include<stdio.h>
#include<math.h>

main(){

double a, b, c, s, area;

printf("3辺の長さを入力してください\n");
printf("a =");
scanf("%lf",&a);
printf("b =");
scanf("%lf",&b);
printf("c =");
scanf("%lf",&c);

s = (a+b+c) / 2;
area = sqrt( s * (s-a) * (s-b) * (s-c));

printf("入力された三角形の面積は%fです。\n",area);
}
601デフォルトの名無しさん:2005/06/01(水) 22:49:27
5秒に一回時間を表示する関数を作ってください
602デフォルトの名無しさん:2005/06/01(水) 22:49:49
>>599
ぱっと見。
;忘れ、{}の整合性崩れ、returnしてない
グローバル変数と同じ変数
関数宣言ねぇ。
603デフォルトの名無しさん:2005/06/01(水) 22:52:41
>>601
つthread
604デフォルトの名無しさん:2005/06/01(水) 23:03:03
>>603 スレッド使う必要はないだろ
605604:2005/06/01(水) 23:13:03
>>601 DisplayTimeEveryFiveSeconds がその関数。
当たり前だが滅多なことでは終了しないプログラムだ

#include <time.h>
#include <stdio.h>
int Sleep(double second) {
    time_t start, end;
    if ((start = time(NULL)) == (time_t)-1) return 0;
    do {
        if ((end = time(NULL)) == (time_t)-1) return 0;
    } while (difftime(end, start) < second);
    return 1;
}
int DisplayTimeEveryFiveSeconds(void) {
    time_t t;
    while ((t = time(NULL)) != (time_t)-1) {
        puts(ctime(&t));
        if (!Sleep(5)) return 0;
    }
    return 1;
}
int main(void) {
    return !DisplayTimeEveryFiveSeconds();
}
606デフォルトの名無しさん:2005/06/01(水) 23:18:21
リンクが、間違っていたので書き直します。
【質問テンプレ】
[1] 授業単元: STL
[2] 問題文(含コード&リンク):文章のスペルチェックをするプログラム。
[3] 環境
 [3.1] OS:Windows
 [3.2] コンパイラ(バージョン):MSVC
 [3.3] 言語:C++
[4] 期限:なるべく早く
[5] その他の制限:
std::set<std::string>(dictionaryを格納し、検索する), std::map<std::string,std::string>を使用。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/482.zip
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/483.zip
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/484.zip
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/485.zip
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/486.zip
にEnglish Word 辞書があります。(サイズが大きいので、5つにわけました)
それを1つのファイルDictionary.txtにしてください。それを読み込みます。
input.txtにスペルチェックする文章が入っています。
それと先の辞書と比較し、ない単語は、ユーザーにi,a,r,cのどれかを入力させます。
i:一度その一語だけを無視する。
a:ファイルの中にあるその単語全てを無視する。
r:一度その一語を他の単語に書き換える。書き換える単語は聞く。
c:ファイルの中にあるその単語全てを他の単語に書き換える。 書き換える単語は一度だけ聞く。
サンプルラン http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/487.txt
途中まで自分でやったやつ。Runはします。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/488.txt
空白を読み込めないのと、選択のc(たぶんstd::map<std::string,std::string>を使うのかな?)、
あと既存の関数の使い方がわかりません。
どなたか、どうぞご教授お願いします。
607デフォルトの名無しさん:2005/06/02(木) 00:16:47
608544:2005/06/02(木) 00:36:53
>>545 >>546 >>548
皆さんありがとうございます!!
とりあえず、言われたとおり引数をポインタ型にしたところ
コンパイル時には問題なかったのですが、実行するとcore dumpしてしまいます。
他に不都合な点はないでしょうか…
609542:2005/06/02(木) 00:38:08
間違った…544じゃなくて542でした…
610デフォルトの名無しさん:2005/06/02(木) 00:46:31
>>542
せっかくcore吐いてるんならstack trace見ればいいのに。

ま、まじめに読んでねーけど

1) pが最初に初期化されてない(不定)のまま使われてる
2) 最初にmalloc()したheadのnextポインタの値が不定のままになる

ってとこじゃねーかな。あやしいのは。
611デフォルトの名無しさん:2005/06/02(木) 00:52:41
612デフォルトの名無しさん:2005/06/02(木) 01:10:00
613デフォルトの名無しさん:2005/06/02(木) 02:29:11
>>544 >>608 >>610
最初のheadは使われてないから、最初のmalloc()の後にでもp = headとかしたらいい。
insert()をrを返すようにして、それをpでうけるようにしたら、
ループが回る度にpが最新のノードをさすようになる。
p = insert(string, p , head); headを引数にする必要はないと思うけど。
最初にp = headにすれば、pがNULLになるときがないから。
あと、insert()のr->nextは次のノードがないうちは空なんだからNULLを代入した方がいい。
614デフォルトの名無しさん:2005/06/02(木) 02:56:21
[1] 授業単元: プログラミング基礎
[2] 問題文(含コード&リンク): あらかじめテキスト化された音声信号のファイル「data.txt」をリダイレクトで入力し
                   波形として描画するプログラムを作成せよ。
                   グラフィックウィンドウを簡単に書くためのヘッダファイルが用意されているのでそれを使うこと。 
[3] 環境
 [3.1] OS:Solaris8
 [3.2] コンパイラ(バージョン):gcc
 [3.3] 言語:C
[4] 期限:2005年06月04日まで

具体的なソースというよりは波形として描画するというのがよくわかりません
テキスト化された音声信号のファイル「deta.txt」は
-1
7
7
-1
0
-2
-2
0
0
2
2
こんな感じで書かれており全部で10020行あります。
この数字の意味もイマイチよくわかりません12kHzでサンプリングされた音声信号をテキスト化したものだそうです。

グラフィックウィンドウを簡単に書くためのヘッダファイルというのはどうやら先生が自作したらしく
点を打ったり、線を引いたり、円を書いたりということが簡単にできるようになっています。

X軸を時間軸、Y軸をdata.txtの内容軸としてグラフをつくればいいんですかね
信号処理のことも勉強したことないのでよくわからないんですが
アドバイスよろしくお願いします。
615デフォルトの名無しさん:2005/06/02(木) 03:10:22
>>610 >>612 >>613

返信ありがとうございます!!
とりあえず、家の環境ではリダイレクションが行えないので今日でも学校でやってみたいと思います。

あと先生にメールで質問したところ、以下のようなプログラムを作るうえでのヒント(?)をもらいました。

1. まず,単語を格納する領域(以下単語格納領域)と次のデータへのポインタ(次ポインタ)を持つリスト構造を構造体で宣言する.

2. 1単語分のリスト構造体データをmalloc関数で確保する。

3. readword関数を使って1単語を読み込み,リスト構造体データの単語格納領域に保存する.

4. 1単語分の構造体データをリストの末尾に連結する.つまり,末尾データの次ポインタを追加するリスト構造体データへのアドレスに更新する.
追加されたデータの次ポインタはnullにしておく.このようにnullポインタを使うことで末尾データの目印にしておく.
なお,リスト先頭データのアドレスは,ポインター型変数headに記憶させておく.

5. 2.〜 5. の処理を繰り返し行い、単語がすべて読み込まれたら6.に行く.

6. リストの先頭から終わりまで単語を表示する。

もしかしたら最初に書いたプログラムは自分の知識が乏しいまま書いたため、この条件にあっていないようなプログラム
(特にheadに記憶させるところとか)
になっているかもしれません…大幅な改変が必要なのかもしれませんが引き続き宜しくお願いします。
616デフォルトの名無しさん:2005/06/02(木) 03:26:50
>>614
はあ。まあ当然ながらそのヘッダファイルとやらがないと何も出来ないわな。
617614:2005/06/02(木) 09:33:41
ttp://briefcase.yahoo.co.jp/bc/buriten2000/lst?&.dir=/%a5%d8%a5%c3%a5%c0%a4%c8%a5%c7%a1%bc%a5%bf&.src=bc&.view=l

テキスト化された音声信号のファイル「data.txt」
グラフィックウィンドウを簡単に書くためのヘッダファイル「gw.h」

gw.hの中身を見てみたんですが
どうやら「Xlib.h」をインクルードしているようなので
X Windows Systemに関連するもののようなので
Windows環境ではできないかもしれないです。
618デフォルトの名無しさん:2005/06/02(木) 09:53:57
>>617
>X軸を時間軸、Y軸をdata.txtの内容軸としてグラフをつくればいいんですかね
その通り。とりあえず作って味噌。
ポイントだけならこんな感じになるべさ。
□■■□□□□□□□□
□□□□□□□□□□□
□□□□□□□□□□□
□□□□□□□□□□□
□□□□□□□□□□□
□□□□□□□□□■■
□□□□□□□□□□□
○○○○●○○●●○○ 0
■□□■□□□□□□□
□□□□□■■□□□□
→時間軸(データ行)
↑信号Lv(データ値)
619デフォルトの名無しさん:2005/06/02(木) 10:10:31
>>618
レスありがとうございます。

なるほどやはりそういうことでしたか
音声の波形というとWindowsの録音ツールにあるような波をイメージしていたので
本当にこの考え方でいいのかなーと不安に思っていたので安心しました。

あとはX軸、Y軸の間隔の幅を調整したりして見やすくなるようにすればいいわけですよね

自宅にSolarisがないんで簡単に試せないのが痛いところです;;
WindowsやらLinuxやらで出来たらいいんですけど。。。

アドバイスありがとうございました。
またつまづいたらよろしくおねがいしますm(__)m
620デフォルトの名無しさん:2005/06/02(木) 10:14:59
621デフォルトの名無しさん:2005/06/02(木) 10:21:57
>>615
リダイレクションが行えない環境ってどんなだ?
コマンドプロンプトでいくらでもできると思うのだが?
622デフォルトの名無しさん:2005/06/02(木) 11:31:37
[1] 授業単元: C++
[2] 問題文(含コード&リンク): 要素10の配列があり。1〜10の数値で初期化
               同一配列中で右に一つずつシフトするプログラム
               を作成せよ。 
               0 1 2 3 ・・・ 9  
                     ↓
               9 0 1 2 ・・・ 8
               ↑の様な感じです。
[3] 環境  
 [3.1] OS:Windows
 [3.2] コンパイラ(バージョン): Visual C++
 [3.3] 言語:C++
[4] 期限:できれば今日中に
[5] その他の制限:配列まで習いました。

よろしくお願いします。
623デフォルトの名無しさん:2005/06/02(木) 12:30:16
>>622
int dim[10]={0,1,2,3,4,5,6,7,8,9};
const int stock=dim[0];

for(int i=0;i<9;dim[i]=dim[i+++1]);
dim[i]=stock;
624デフォルトの名無しさん:2005/06/02(木) 12:32:10
1 〜 10 で初期化じゃないのか?
625デフォルトの名無しさん:2005/06/02(木) 12:33:05
あっ、1〜10だった。
626デフォルトの名無しさん:2005/06/02(木) 12:42:30
>>623
> i+++1

初心者相手に、この書き方はあんまりじゃないか?
627デフォルトの名無しさん:2005/06/02(木) 13:00:37
>>623
それ右じゃなくて左
正しくはこうだな。

int dim[10]={1,2,3,4,5,6,7,8,9,10};
const int stock = dim[9];

for(int i=9;i>0;dim[i]=dim[i---1]);
dim[i]=stock;
628デフォルトの名無しさん:2005/06/02(木) 13:04:35
>>623
dim[i] = stock;
のところ。すでにiは無効だな。
(VC++では有効なのかもしれんが、バグだろ)

const int stok = dim[0];
これもマズ。1度しかシフト(ローテートだと思うが・・)できんやん。
629デフォルトの名無しさん:2005/06/02(木) 13:10:01
>>622

問題は
  要素10の配列があり。1〜10の数値で初期化
実例は
  0 1 2 3 ・・・ 9
       ↓
  9 0 1 2 ・・・ 8

このうっかりさんがー
630デフォルトの名無しさん:2005/06/02(木) 13:11:50
>>629
「の様な感じです。」って書いてある。
「こうしてくれ」ではない。
631692:2005/06/02(木) 13:14:31
漏れがうっかりさんだったかorz
632デフォルトの名無しさん:2005/06/02(木) 13:18:25
692はうっかりさんなはず
633デフォルトの名無しさん:2005/06/02(木) 13:19:09
>>631程のうっかりさんは初めて見るぜ。
634デフォルトの名無しさん:2005/06/02(木) 13:36:38
[1] 授業単元:プログラミング演習I
[2] 問題文:
<3平方の定理が成り立つ組み合わせ>

キーボードから整数値 N を与えてもらい
a = 1〜N, b = 1〜N, c = 1〜N の範囲内で

a(2乗)+b(2乗)= c(2乗)

が成り立つ組み合わせを全て表示させなさい。

[3] 環境
 [3.1] OS:Linux
 [3.2] コンパイラ(バージョン):gcc
 [3.3] 言語:C
[4] 期限:6/7まで
[5] その他の制限:制御構造(条件分岐と繰り返し)まで

2乗の部分はa2とかになって表示できないので、(2乗)としています。
自分ではいくら考えてみてもわからないので、
どなたかご教授お願いします。
635デフォルトの名無しさん:2005/06/02(木) 13:46:50
unsigned int a, b, c ;
for ( a = 1; a <= N; a++)
  for ( b = 1; b <= N; b++)
    for ( c = 1; c <= N; c++)
      if ( a*a + b*b == c*c)
        printf("a == %d, b == %d, c == %d", a, b, c) ;
636デフォルトの名無しさん:2005/06/02(木) 13:52:18
int N;
int a;
int b;
int c;
double Cdush;
N = 100;
for ( a = 1; a <= N; a++ ) {
for ( b = a; b <= N; b++ ) {
Cdush = ( double )a * ( double )a + ( double )b * ( double )b;
c = ( int )sqrt( Cdush );
if ( c > N ) break;
if ( Cdush == ( double )c * ( double )c ) {
printf( "a = %d, b = %d, c = %d\n", a, b, c );
}
}
}
637デフォルトの名無しさん:2005/06/02(木) 13:58:35
>>611
ありがとうございます。
これちょっと勉強します。
638634:2005/06/02(木) 14:04:33
>>635
>>636
早速のレスありがとうございます。
言い忘れてたのですが、
最初の部分は
#include <stdio.h>
int main (void)
{
で始めてください。
せっかく書いてくれたのに申し訳ありません。
よろしくお願いします。
639デフォルトの名無しさん:2005/06/02(木) 14:05:55
>>634
それぐらい自分でやれよw
640デフォルトの名無しさん:2005/06/02(木) 14:20:39

[1] 授業単元: 基本プログラミング
[2] 問題文:
正の整数地を読み込み、その段数(1〜10)のピラミッドを表示するプログラムを作成せよ
ただし、if、switch文は使用せず、メインの繰り返しにはfor文を使用すること(他の処理で使う分にはかまわない)
また、範囲外の段数を入力した場合には”指定された段数は処理できません”と表示してプログラムを完了すること
実行例:
段数を入力してください:3
  *
 ***
*****

段数を入力してください:12

指定された段数は処理できません
[3] 環境
[3.1] OS:unix(emacs)
[3.2] コンパイラ(バージョン):不明
[3.3] 言語:C++
[4] 期限:2005年6月3日9:00まで
[5] その他の制限:forまで習っています。あと書き出しは#include<iostream>です。

forを三回使うのかな…以外はまったくわからないので何方かご教授のほどをお願いします。
641デフォルトの名無しさん:2005/06/02(木) 14:33:03
そーいや、ぼーよーセンセの本にそんな問題があったと思うが・・・
最近のヤツはiostream.hからiostreamに変更されとるんか?
642デフォルトの名無しさん:2005/06/02(木) 14:39:45
>>634
<math.h>が使えない様子なので修正。

#include <stdio.h>
int main( void )
{
unsigned int N;
unsigned int a, b, c;
unsigned int AnsA, AnsB;
do {
printf( "N ( 1 ~ 46340 ) = ?" );
scanf( "%d", &N );
} while ( N < 1 || 46340 < N ) ;
for ( a = 1; a <= N; a++ ) {
for ( b = a + 1; b <= N; b++ ) {
AnsA = a * a + b * b;
for ( c = b + 1; c <= N; c++ ) {
AnsB = c * c;
if ( AnsA == AnsB ) printf("a = %d, b = %d, c = %d\n", a, b, c );
if ( AnsA <= AnsB ) break;
}
}
}
return ( 0 );
}
643デフォルトの名無しさん:2005/06/02(木) 15:28:50
>>640
void
DrawPyramid(unsigned int n){
if(n==0 || n>10){
std::cout<<"指定された段数は処理できません"<<std::endl;
return;
}

unsigned inti=0;

for(i=0;i<n;++i){
std::cout<<"\n";
const unsigned int space = n-i-1,ass=i*2+1;
unsigned int k;
for(k=0;k<space;++k)
std::cout<<' ';
for(k=0;k<ass;++k)
std::cout<<'*';

}
std::cout<<std::endl;
}
644デフォルトの名無しさん:2005/06/02(木) 15:33:30
#include <iostream>
using namespace std;

int main()
{
int num, cnt = 1, spaces;

cout << "段数を入力してください:";
cin >> num;

if (num > 10 || num < 1){
cout << "指定された段数は処理できません\n";
} else {
spaces = num - 1;
for (int i = 1; i <= num; i++){
for (int k = 1; k <= spaces; k++) cout << " ";
for (int j = 1; j <= cnt; j++) cout << "*";
cnt += 2;
spaces --;
putchar('\n');
}
}
return 0;
}
645デフォルトの名無しさん:2005/06/02(木) 15:34:19
ありゃ被った
リロードし忘れた
646デフォルトの名無しさん:2005/06/02(木) 15:50:01
>>643-644
素早い回答ありがとうございます!
分からないところが何カ所かあるけど頑張って調べてみます。
647デフォルトの名無しさん:2005/06/02(木) 15:54:10
>>641
>最近のヤツはiostream.hからiostreamに変更されとるんか?

iostreamが標準で、iostream.hは互換性のために残されてる古い形式という形だったはず
648デフォルトの名無しさん:2005/06/02(木) 16:02:39
規格に合わせて、本が改稿されているか? ということを聞きたかったのだが。
649デフォルトの名無しさん:2005/06/02(木) 17:19:30
>>648
主語ぐらいきちんと書こうな
人に聞く前に自分で立ち読みしに行って確認しろ
650デフォルトの名無しさん:2005/06/02(木) 18:13:46
恵まれた土地に住んでるなぁ。
うちの周りじゃプログラミングの本はそんなに無いな。
651デフォルトの名無しさん:2005/06/02(木) 18:19:08
>>640
#include <iostream>
#include <string>
#include <iomanip>

int main()
{
    int n;
    std::cout << "段数を入力してください:";
    std::cin >> n;
    for (; 0 < n && n <= 10; )
    {
        for (int i = 1; i <= n; ++i)
            std::cout << std::setw(n + i - 1) << std::string(std::string::size_type(2 * i - 1), '*') << std::endl;
        std::cout << "段数を入力してください:";
        std::cin >> n;
    }
    std::cout << "指定された段数は処理できません";
}
652デフォルトの名無しさん:2005/06/02(木) 19:04:30
[1] 授業単元: 文字列とポインタ
[2] 問題文(含コード&リンク):

課題1 scanf() 関数で、int 型の変数は & をつけなければならないのに、文字列は & をつけないのはなぜですか? 下記のプログラムを例にして解説してください。また 下記のプログラムで ss ヘ入力するのは間違いです。なぜ間違いなのか解説してください。

#include <stdio.h>
int main()
{
int n;
char s[100];
char *ss;

scanf( "%d", &n); /* int 型では & をつける */
scanf( "%s", s); /* 文字列では & をつけない */
scanf( "%s", ss); /* なぜ誤り? */
...
}

653デフォルトの名無しさん:2005/06/02(木) 19:06:25
上の続き

課題2-1 下記のプログラムは正しいプログラムですが
/* Prog. A */
#include <stdio.h>
int main()
{
char s[6]="Hello";
char *ss;
ss=s;
printf("%s\n", ss);
}
下記のプログラムは誤りです。
/* Prog. B */
#include <stdio.h>
int main()
{
char s[6];
char *ss;
ss="Hello";
s=ss;
printf("%s\n", s);
}

その理由を解説してください。

[3] 環境
 [3.1] OS:Linux [3.2] コンパイラ(バージョン): 不明 [3.3] 言語:C
[4] 期限:明日
654デフォルトの名無しさん:2005/06/02(木) 19:07:24
>>652
ポインタ勉強汁
655デフォルトの名無しさん:2005/06/02(木) 19:11:24
>>652
答えても良いけど、これが理解できないならこの先授業について行けまい。
それでも構わないなら答えよう・・・、この先もこのスレで答えて貰える確実性は無いが。
656デフォルトの名無しさん:2005/06/02(木) 19:15:20
>>655
お願いします、明日までにレポートにして提出しないといけないのでosz
657デフォルトの名無しさん:2005/06/02(木) 19:22:57
>>655
教えてあげればいいじゃん。
解説付けてあげればいいじゃん。
お前のやっていることは単なる怠惰か嫌がらせだって知ってる?
どうせ、答えない事が質問者の為になる、とか言うんだろうけど実際にはそんなこと無いんだよねぇ。
658デフォルトの名無しさん:2005/06/02(木) 19:27:43
初心者のボクが答えるとこうなる

課題1
scanf( "%d", &n); アドレスを渡している
scanf( "%s", s);  アドレスを渡している
scanf( "%s", ss);  ポインタを渡している

課題2
#include <stdio.h>
int main()
{
char s[6];
char *ss;
ss="Hello";  これでは初期化できない
s=ss;  アドレスをポインタに代入すべきなのに逆になっている
printf("%s\n", s);  配列のアドレスを渡している。ポインタを宣言している意味がない。
}
659デフォルトの名無しさん:2005/06/02(木) 19:32:24
>>658
その論理は課題1で
int n, *p = &n;
scanf("%d", p); ポインタを渡している
となって破綻する。

課題2
ss="Hello"; 初期化ではないが、"Hello"という文字列リテラルの先頭
        アドレスをポインタに代入するので(式としては)妥当
なのでコメントがおかしい。それから、「意味がない」ことと「誤りである」と
いうことは全く異なる。
660デフォルトの名無しさん:2005/06/02(木) 19:39:07
/* Prog. A */ では
char s[6]="Hello";

/* Prog. B */ では
char s[6];
char *ss;
ss="Hello";

とやってるから
初期化したいのだろうという意を汲み取って
「ss="Hello";  これでは初期化できない 」
と書きますた
661デフォルトの名無しさん:2005/06/02(木) 19:39:53
>>652
scanf("%s", ss);
が誤りなのは、ポインタssの値が不定だから。

scanf()は、引数として渡されたアドレスに解析結果を書き込む。
よって、引数としては、変数のアドレスなり配列のアドレスなり
malloc()された領域のアドレスなり、要するに書き込み可能な
領域をちゃんと指しているアドレスを渡さなければならない。

>>653
s = ss;
が間違っている。Cでは配列に対する代入はできない。
初期化では
char s[6] = "hello";
のように書くことが可能だが、代入と初期化は異なる。
662デフォルトの名無しさん:2005/06/02(木) 19:41:23
663デフォルトの名無しさん:2005/06/02(木) 19:46:53
>>652
まずメモリ確保の面から見ると

int n; /* int変数 1個分のメモリが確保されている。 */
char s[100]; /* char変数 100個分のメモリが確保されている。 */
char *ss; /* charへのポインタ変数 1個分のメモリが確保されている。 */

&n は int変数 n へのポインタ(先頭アドレス)
s は char変数 s[] へのポインタ(先頭アドレス)
ここで注意すべきは s は &s[0] と等価であるという事。

つまり、
scanf( "%s", s );

scanf( "%s", &s[0] );
と等価である。

scanf() の引数は格納すべき変数へのポインタ(先頭アドレス)である必要があるため、
ポインタ変数である ss はこのプログラム上では適切ではない。

ただし、

ss = s;

の様に、プログラム中にポインタ変数 ss に変数へのポインタを渡している場合は正しい使い方と言える。
664デフォルトの名無しさん:2005/06/02(木) 19:55:02
1] 授業単元: C言語入門
[2]
[3]
 [3.1] OS:UNIX
 [3.2] fortran
 [3.3] 言語:C言語
[4] 期限:6月5日
[5] その他の制限:基本的な数学関数まで。<math.h>。

e^x = 1 + x + (1/2!)x^2 + (1/3!)x^3 + ,,,,,+ (1/N!)x^N

問題文:
(上式のxの値を1次から5次の場合で展開し、)
(それぞれの次数の時にmath.hにあるexp関数で出した結果と比較してみる。)
xの値はファイルから入力するようにし、ファイルの最後になったら処理を終えるようにする。
xの値を書くファイルには、1行に一つの数字だけを書くようにしてみて下さい。
665デフォルトの名無しさん:2005/06/02(木) 19:55:08
>>658-663
返信ありがとうございます、少しずつわかってきました。
ひとまずレポート仕上げちゃいます
666デフォルトの名無しさん:2005/06/02(木) 19:58:16
>>664
 [3.1] OS:UNIX
 [3.2] fortran
 [3.3] 言語:C言語

ワケワカンネ
667デフォルトの名無しさん:2005/06/02(木) 20:28:02
>>664
では

[3.1] OS:UNIX
[3.2] コンパイラ(バージョン):不明
[3.3] 言語:C言語
668デフォルトの名無しさん:2005/06/02(木) 20:37:03
ごめん、訂正。
[3.2] コンパイラ(バージョン):g77(不明)
669デフォルトの名無しさん:2005/06/02(木) 23:53:39
>>664
#include <stdio.h>
#include <math.h>
int main( int argc, char *argv[] )
{
char buff[256];
FILE *fp;
double val, result, col;
int count;
fp = fopen( argv[1], "r" );
printf( " x 1次 2次 3次 4次 5次 exp\n" );
while( fgets( buff, sizeof(buff), fp ) ){
sscanf( buff, "%lf", &val );
printf( "%e", val );
result = 1.0;
col = 1.0;
for( count=1; count<=5; count++ ){
col *= ( val / (double)count );
result += col;
printf( "\t%e", result );
}
printf( "\t%e\n", exp(val) );
}
fclose( fp );
return 0;
}
670デフォルトの名無しさん:2005/06/03(金) 00:20:37
[1] 授業単元: プログラミング演習T
[2] 問題文:任意の長さの整数値を読み込み、グラフ化して表示することができるプログラムを作れ。        
[3] 環境
 [3.1] OS:Linux
 [3.2] コンパイラ:gcc
 [3.3] 言語:C
[4]  無期限  
[5] その他の制限:ファイルの入力はリダイレクションを利用します。
            課題用に400個ほどのデータファイルが用意されていてそれを使います。

今考えているのは読み込んだ数字をnとしてn回だけFor文で*を表示させるようにしてグラフにしようと思っているのですが
読み込むデータの長さが不定の場合、一次元配列に格納してあれこれやるという方法は避けた方がいいのでしょうか?

 
671デフォルトの名無しさん:2005/06/03(金) 00:29:23
>>670
任意なのは整数の個数なのか、整数の長さなのか?
データは数字が羅列されているだけなのか、表題もあるのか?
微妙にわからんな。
例えばどういうデータファイルになるか>>1のアップローダーにアップしてみてくれないか?
672デフォルトの名無しさん:2005/06/03(金) 00:30:00
[1] 授業単元:計算機とアルゴリズム
[2] 問題文(含コード&リンク): 円の半径を入力し、面積と円周の長さを出力するプログラムを作れ。
                  なお、円周率πは#define文を用いて定数宣言を利用すること。
[3] 環境
 [3.1] OS:Windows XP
 [3.2] コンパイラ(バージョン):??
 [3.3] 言語:C
[4] 期限:明日の午後の授業には提出です。
[5] その他の制限:大学に入って初めてプログラムを知り1時間習っただけの初心者です。


回答いただいても色々質問するかもしれませんがどうかよろしくお願いします。

673デフォルトの名無しさん:2005/06/03(金) 00:40:29
>>672
#include <stdio.h>
#define PI 3.1415926535898

int main(void) {
    double r;
    printf("半径:"); scanf("%lf", &r);
    printf("面積:%f\n円周:%f", PI * r * r, 2 * PI * r);
    return 0;
}
674デフォルトの名無しさん:2005/06/03(金) 00:42:12
>>673 きちんとPIとなっていて感動した。
675672:2005/06/03(金) 01:00:46
>>673
ありがとうございます!

PIというのは初見なのですがどういう意味があるのですか?
あと最後のreturn 0の意味を教えていただけますか、申し訳ありません。
676デフォルトの名無しさん:2005/06/03(金) 01:03:15
PIを見てπを指してるということが分からないアフォが一人
677670:2005/06/03(金) 01:04:58
>>671さん
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/494.txt

こんな感じで400個(行?)ほど書かれているデータを使います。
整数の長さは最大で+-7000くらいだったと思います。
表題などはありません。
678672=アフォ:2005/06/03(金) 01:07:41
すいません気付くべきでした・・
あと、return 0はどういう意味があるんでしょうか?
679デフォルトの名無しさん:2005/06/03(金) 01:08:49
mainの戻り値だろ
680デフォルトの名無しさん:2005/06/03(金) 01:10:29
ついでなんで疑問に答えておくか。
PIは>>676に書いたとおりπのこと。日本人がパイと書くようにローマ字(abcde…のこと)を
使う人がπのことを書くときに使う書き方。
ちなみにα,β,γ,δ→alpha, beta, gamma, delta

最後の return 0; は見た通りmain関数の戻り値が0ということ。
こんな課題程度なら値は何でもいいんだが、コンパイル後のプログラムを
使ってシェルプログラムを組む時とかに利用することもあるので、普通(エラー無し)は
0を返す習慣になってる。
681デフォルトの名無しさん:2005/06/03(金) 01:11:02
>>678
まぁ、return 0は書かなくても一応動くけどな
682デフォルトの名無しさん:2005/06/03(金) 01:13:30
>>681
つ gcc -Wall
683デフォルトの名無しさん:2005/06/03(金) 01:18:57
まあ警告は出ようがコンパイルは通るし、「動く」ことには変わりはない
わなあ。
この程度のおもちゃプログラムの返り値をシェルから見て何かに利用することなど
無いし、まさにどうでもいい話だ。
684デフォルトの名無しさん:2005/06/03(金) 01:23:35
>>680
はじめ皆さんありがとうございました。
685デフォルトの名無しさん:2005/06/03(金) 01:43:42
>>670
(固定長の)1次元配列を使う方法が素直だと思う。
・いったんメモリに読み込む
・max,minを得る
・グラフの幅とmax,minから(縮小)率を決める。
・for文で出力
ってな具合だろうけれども。

固定長の配列が嫌ならメモリの動的確保(malloc, realloc)を使うとか。
686671:2005/06/03(金) 02:34:21
687670:2005/06/03(金) 03:09:26
>>685さん
>>686さん

ありがとうございます!
686さんのソースを見させてもらったんですが
まだまだ勉強不足な私には理解するのに時間が掛かりそうです。
Lv1のキャラがいきなりLv50で装備できるようになる武器を
裏技で装備してしまったような感じでw
初心者の癖にこんな大作を提出すると怒られそうなんで
まずは理解できるように頑張ろうと思います。

685さんの仰るとおりに固定長の一次元配列を使ってみようと思います
任意の長さの整数値を取り扱えるようにしたいので
最初にLinuxのコマンドで行数を調べてその都度書き換えてコンパイルしなおせば
一応任意の長さに対応できるということになると思うのでw
malloc,やreallocも試してみたいのですがまだポインタがあまり理解できていないので
今回はやめておきます

お二人ともアドバイスありがとうございました!
688デフォルトの名無しさん:2005/06/03(金) 03:12:31
http://ccserv.adm.ehime-u.ac.jp/ICPC/problems/domestic/d2004/D.jp/D.html
↑プログラミングコンテストの去年の国内予選の過去問なんだけど一日中考えてるけど解けね、、
解ける神はおりませんか
689デフォルトの名無しさん:2005/06/03(金) 03:50:12
>>688
X と Y の二次元配列を 0 で初期化。
(どのくらいの大きさなら良いかはInputを読んで計算すれば判る)
点から半径1.0の円の範囲内の配列に +1 していく。
最大値を表示する。
690689:2005/06/03(金) 04:05:48
あ、ダメだ。計算したら配列が大きくなりすぎる。
691デフォルトの名無しさん:2005/06/03(金) 05:56:55
二点は周上にあるとしてよい。そのような高々 2*nC2 通りの円に対してしらみつぶしする

とか言ってみるテスト。Cのソースは書けません。
692从*・ 。.・) ◆SayuminPM. :2005/06/03(金) 06:05:47
693688:2005/06/03(金) 08:22:33
>>692
おぉ、こんなサイトが!悲しいけど参考にします
考えてくれた方ありがとうございました(;´д⊂)
694デフォルトの名無しさん:2005/06/03(金) 11:35:43
>>670 >>687
>最初にLinuxのコマンドで行数を調べてその都度書き換えてコンパイルしなおせば
>一応任意の長さに対応できるということになると思うのでw

なんかややこしいこと考えてるなぁ。
動くかしらんけど。 >>573 ってのもあるな。

for (i = 0; i < n && fscanf(fp, "%d", buf) == 1; i++, buf++)

for (i = 0; i < n; && fscanf(fp, "%d", &buf[i]) == 1; i++)
とでもしとけば、ポインタ使わんで済むだろう。
695デフォルトの名無しさん:2005/06/03(金) 19:11:13
[1] 授業単元: 情報処理演習
[2] 問題文(含コード&リンク): 10進数で入力した値を、n(2〜9)進数に変換するプログラムをお願いします。
[3] 環境
 [3.1] OS:Windows/Linux/等々 WindowsXP
 [3.2] コンパイラ(バージョン): gcc
 [3.3] 言語:C/C++/どちらでも可 のいずれか C
[4] 期限:yyyy年mm月dd日hh:mmまで または 無期限 のいずれか 6月5日まで
696デフォルトの名無しさん:2005/06/03(金) 19:36:11
>>695
#include <stdio.h>

char* to_base_n(int x, char* s, int n) {
    int index = 0;
    do {
        s[index++] = x % n + '0';
        x /= n;
    } while (x);
    s[index--] = '\0';
    int left = 0;
    while (left < index) {
        char temp = s[left];
        s[left] = s[index];
        s[index] = temp;
        ++left;
        --index;
    }
    return s;
}

int main(void) {
    int x, i;
    char s[128];
    printf("数:"); scanf("%d", &x);
    for (i = 2; i < 10; i++)
        printf("%d進数:%s\n", i, to_base_n(x, s, i));
    return 0;
}
697デフォルトの名無しさん:2005/06/03(金) 20:17:40
>>696
どうもありがとうございます。
698デフォルトの名無しさん:2005/06/03(金) 20:44:31
[1] 授業単元: C言語入門
[2] e^x = 1 + x + (1/2!)x^2 + (1/3!)x^3 + ,,,,,+ (1/N!)x^N

(上式のxの値を1次から5次の場合で展開し、)
(それぞれの次数の時にmath.hにあるexp関数で出した結果と比較してみる。)
xの値はファイルから入力するようにし、ファイルの最後になったら処理を終えるようにする。
xの値を書くファイルには、1行に一つの数字だけを書くようにしてみて下さい。

[3]
 [3.1] OS:UNIX
 [3.2] コンパイラ:gcc(gcc Developer Station 2000 Version 1.1.2.7)
 [3.3] 言語:C言語
[4] 期限:6月5日
[5]その他の制限:基本的な数学関数まで。<math.h>。

664で書き込みしたものです。
詳細が分かったので、再度書き込みました。
668でなぜか自演されました。

>>669
ありがとうございます。
コンパイルできたのですが、セグメント例外(core dumped)と表示され、
プログラムを実行することができませんでした。
それと、今やっている授業内容と比べてこれは難しいプログラムでした。
教えてもらう側で心苦しいのですが、簡単になりませんでしょうか。
699デフォルトの名無しさん:2005/06/03(金) 21:55:24
700デフォルトの名無しさん:2005/06/03(金) 23:45:39
バイナリー→テキスト変換する。

Cでやる方法を教えてください
701デフォルトの名無しさん:2005/06/03(金) 23:48:35
>>700
どういう風に?
702デフォルトの名無しさん:2005/06/04(土) 00:11:37
>>700
int を char* にしたいなら ltoa とか sprintf とか
703デフォルトの名無しさん:2005/06/04(土) 00:19:15
>>698
プログラムの引数にxの値の入ったファイル名を指定すること。
(例)
program xdata.txt

どこが難しいのか具体的に書くこと。
704デフォルトの名無しさん:2005/06/04(土) 03:22:11
[1] 授業単元: 基礎プログラミングU
[2] 問題文):

f(x)=|cos(x)|を一周期積分しなさい。

[3] 環境
 [3.1] OS:Windows2000
 [3.2] コンパイラ(バージョン): Visual C++ Standard6.0
 [3.3] 言語:C++
[4] 期限:6月4日夕方
[5] その他の制限:
ありません。とにかくC++で動くものができればOKです。
一応、シンプソンの公式推奨、とのことです。
705デフォルトの名無しさん:2005/06/04(土) 04:51:40
>>704
main(int argc,char **argv)
{
 printf("4\n");
}
706デフォルトの名無しさん:2005/06/04(土) 05:01:28
【質問テンプレ】
[1] 授業単元: C言語
[2] 問題文(含コード&リンク): 1+1 の結果を出力せよ。
[3] 環境
 [3.1] OS:Windows XP
 [3.2] コンパイラ(バージョン): VC++2003
 [3.3] 言語:C++
[4] 期限:2005年06月04日05:10まで
[5] その他の制限:特になし

よろしくお願いします。
707デフォルトの名無しさん:2005/06/04(土) 06:02:42
>>702
ちなみに _itoa() は非標準な。
708デフォルトの名無しさん:2005/06/04(土) 06:12:28
>>706
#include <stdio.h>
int main(){
printf("10");
}
709デフォルトの名無しさん:2005/06/04(土) 10:35:50
バイナリ「2010200B100101」をアスキー「 」で表示させて
アスキー「 」を「2010200B100101」にもどして表示する。

要するに変換前「 」、変換後「2010200B100101」としたいです。
説明が下手ですいません。どなたかおしえてください。
710デフォルトの名無しさん:2005/06/04(土) 10:44:53
よくわからない。>>709
711デフォルトの名無しさん:2005/06/04(土) 11:33:02
>>704
暇つぶしに書いてみた。あれ、「一周期」ってゼロからパイまで?絶対値ついてるしな・・・。
まー適宜なおして。
#include <iostream>
using namespace std;
double simpson(double a, double b, int n, double (* pf)(double));
double f(double x);
int main()
{
  const int M = 1000000;
  cout << simpson(0, 2*M_PI, M, f) << endl;
  return 0;
}
double simpson(double a, double b, int m, double (* pf)(double))
{
  int n = 2 * m;
  double d = (b - a) / n;
  double sum = pf(a);
  double x = a;
  for (int i = 1; i < n; i ++)
  {
    x += d;
    sum += (i & 1 ? 4 : 2) * pf(x);
  }
  sum += pf(b);
  return sum * d / 3;
}
double f(double x)
{
  return fabs(cos(x));
}
712デフォルトの名無しさん:2005/06/04(土) 12:06:30
>>711
基本周期ならそれでOKでつ。
713デフォルトの名無しさん:2005/06/04(土) 12:17:17
適宜,対応.
714デフォルトの名無しさん:2005/06/04(土) 12:51:43
[1] 授業単元: C言語
[2] 問題文(含コード&リンク): 配列に1から1000までのデ‐タを格納し100ごとに表示させよ、
このとき1から100まで101から200まで、、、
という風に現在どの部分表示しているか解るように工夫せよ。
[3] 環境
 [3.1] OS:Linux
 [3.2] コンパイラ(バージョン):gcc
 [3.3] 言語:C
[4] 期限: 無期限

とりあえず1から1000を格納して100ずつ表示するというのは出来るのですが
現在どこを表示しているのかを解るようにする方法がわかりません。
715デフォルトの名無しさん:2005/06/04(土) 12:55:39
誰よりも大きな数を言った奴が勝ち
716デフォルトの名無しさん:2005/06/04(土) 13:31:26
>>714
問題の意味が分かりません。
717716:2005/06/04(土) 13:31:57
あ、わかった。
718デフォルトの名無しさん:2005/06/04(土) 13:33:04
>とりあえず1から1000を格納して100ずつ表示するというのは出来るのですが
>現在どこを表示しているのかを解るようにする方法がわかりません。

出来てるところまで書いて。
719デフォルトの名無しさん:2005/06/04(土) 13:59:13
>>714 こんなかんじ?
#include <stdio.h>
#include <stdlib.h>
#define MAX_NUM 1000
#define PRINT_NUM 100
int a[MAX_NUM];
int main()
{
  int begin, end,i, cnt;
  char buf[256];
  for(i = 0; i < MAX_NUM; i++) a[i] = i+1;
  for(;;)
  {
    printf("\n開始番号を入力 (-1で終了) > ");
    begin = atoi(fgets(buf, sizeof(buf), stdin));
    if( begin == -1 ) break;
    if( begin < 1 || begin > MAX_NUM)
    {
      puts("\n<< 入力エラー >>");
      continue;
    }
    end = begin + PRINT_NUM - 1;
    if( end > MAX_NUM ) end = MAX_NUM;
    printf("\n[ %d - %d ]\n", begin, end);
    for(i = begin - 1, cnt = 0; i != end; ++i, ++cnt )
      printf("%d%c", a[i], cnt % 10==9 ? '\n' : ' ');
  }
  return 0;
}
720デフォルトの名無しさん:2005/06/04(土) 14:05:00
>>714
for ( i = 0; i < 1000; ) {
printf( "%d ~ %d\n", i, i + 99 );
do printf( "%d\t", a[i]++ ); while ( i % 100 != 0 );
getch();
}
721720:2005/06/04(土) 14:05:52
間違った・・・、ま、いっか。
722デフォルトの名無しさん:2005/06/04(土) 14:17:54
>>715
3→3→3→3(Chained Arrow Notation)
723714:2005/06/04(土) 14:42:06

#include <stdio.h>

int main()
{
int data[1000];
int x, y, c1, c2;

for(x = 1; x <= 1000; x++){
data[x] = x;
}

c1 = 1;
c2 = 10;
for(x = 1; x <= 100; x++){
for(y = c1; y <= c2; y++){
printf("%4d", data[y]);
}
printf("\n");
c1 = c2;
c2 = c2+10;
}

return 0;
}
こんな感じです スマートじゃないかもしれませんが^^;
例えばchar型の配列に"x から yまで"と入れてxとyの部分にc1とc2の内容を入れて表示するってのは可能なんでしょうか
724デフォルトの名無しさん:2005/06/04(土) 14:57:56
えーっと。要点だけ。

int data[1000 + 1];
for(x = 1; x <= 100; x++){
printf("%d - %d: ", c1, c2);
for(y = c1; y <= c2; y++){
printf("%4d", data[y]);
}
725デフォルトの名無しさん:2005/06/04(土) 16:12:04
>>722
エチーなやつ、ういやつ
726デフォルトの名無しさん:2005/06/04(土) 17:57:41
>>711
ありがとうございます。
一部間違いありましたが、ちょっと手直ししたらちゃんとうごいたっぽいです。
ありがとうございました!
727デフォルトの名無しさん:2005/06/04(土) 19:09:24
#include <stdio.h>
int main(){
printf("田");
}
728デフォルトの名無しさん:2005/06/04(土) 20:25:45
>>766

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int dataIndex;

int main(void){
char buffer[1024];
char **Data;
int i, max;
dataIndex = 0;
printf("How many data do you input? ->");
scanf("%d", &max);
Data = (char **)malloc(max*sizeof(char *));
while( dataIndex < max) {
scanf( "%s" , buffer );
if ( strcmp( "end" , buffer ) == 0 ) break;
Data[dataIndex] = (char *)malloc((strlen(buffer) + 1) * sizeof(char));
strcpy(Data[dataIndex], buffer);
dataIndex = dataIndex + 1;
}
printf( "----\n" );
for ( i = 0 ; i < dataIndex ; i++ ) {
printf( "%s\n" , Data[i] );
free(Data[i]);
}
free(Data);
return 0;
}
729デフォルトの名無しさん:2005/06/04(土) 21:38:19
[1] 授業単元:C言語
[2] 問題文(含コード&リンク):学籍番号(3桁)と点数を学籍番号000が入力
されるまで読み込み、最高点の人の点数と学籍番号、最低点の人の点数と学籍
番号、および全員の平均点を表示しなさい。最高点、最低点が同じ人が複数いた
場合、一人だけ出力すればよい。
[3] 環境
[3.1] OS:Linux
[3.2] コンパイラ(バージョン):gcc
[3.3] 言語:C
[4] 期限: 無期限

730デフォルトの名無しさん:2005/06/04(土) 21:42:43
[1] 授業単元: 情報処理演習(初級)
[2] 問題文(含コード&リンク):二つの整数を入力し、小さい方の数以上
で大きい方の数以下の整数をすべて加えた値を表示しなさい。
[3] 環境
 [3.1] OS:Linux
 [3.2] コンパイラ(バージョン):gcc
 [3.3] 言語:C
[4] 期限: 無期限
731デフォルトの名無しさん:2005/06/04(土) 22:17:50
732デフォルトの名無しさん:2005/06/04(土) 22:22:02
>>731
おお、有難う御座います!!
助かりましたm(_ _)m
733デフォルトの名無しさん:2005/06/04(土) 22:26:09
>>729
>>731
これは構造体の練習問題なんじゃないの?
734デフォルトの名無しさん:2005/06/04(土) 22:53:14
KMP法での一致検索でパターンテーブル作るんだけど

まず,pattern に対して以下のように情報を収集して next[i] (1 ≦ i ≦ pattern_len) という配列を作る:
1 ≦ i ≦ pattern_len に対して,0 ≦ j ≦ i - 2 の範囲で j を動かして,
pattern[0] 〜 pattern[j] と pattern[i - 1 - j] 〜 pattern[i - 1] が完全に一致するようなできるだけ大きい j を選んで,next[i] = j + 1とする.
そのような j が無いときは,next[i] = 0 とする.

どういう事やってるの?
735デフォルトの名無しさん:2005/06/04(土) 23:02:03
[1] 授業単元:VCプログラミング
[2] 問題文(含コード&リンク):
起動中である自己プログラムのCRC、又はMD5値を取得し
CRC、MD5値が"111111"で無い場合、自己プログラムを終了する関数を作りなさい。
CRC,MD5値はどちらか一方を選択する事。
[3] 環境
[3.1] OS:Windows
[3.2] コンパイラ(バージョン):VC++
[3.3] 言語:C 又は C++
[4] 期限: 一ヶ月以内

終了は解っているのですがCRCなどの取得が解りません。
APIを使うんじゃないか?と思って検索しておりますが見つからず
課題前にMSDNの使い方やネットでリフェンス(英語)を見る方法だったので
それで調べるのかと思ってますが見つかりません。お力をお貸し下さいませ。
736デフォルトの名無しさん:2005/06/04(土) 23:20:34
>>730
#include <stdio.h>

int main( void )
{
int min, max, sum, counter;

scanf( "%d %d", &min, &max );

sum = 0;
for( counter=min; counter<=max; counter++ )
sum += counter;

printf( "%d %d %d\n", min, max, sum );

return 0;
}
737デフォルトの名無しさん:2005/06/04(土) 23:31:54
>>736
30点
738デフォルトの名無しさん:2005/06/04(土) 23:39:06
>>736
どうもありがとうございます
739デフォルトの名無しさん:2005/06/04(土) 23:43:35
>>735
FastHashDllでも使え。
740デフォルトの名無しさん:2005/06/04(土) 23:55:26
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

main()
{
int n,r,hand;
printf("ジャンケンをします\nグーは0、チョキは1、パーは2を入力してください:");
scanf("&lf",&n);

srand(time(NULL));
r = rand();
hand=rand()%3;

if (n==hand) printf("\nコンピュータは %d\n引き分けです\n\n",hand);
else if (((n==0) && (hand==1)) || ((n==1) && (hand==2)) || ((n==2) && (hand==0)))
printf("\nコンピュータは %d\nあなたの勝ちです\n\n",hand);
else if (((n==0) && (hand==2)) || ((n==1) && (hand==0)) || ((n==2) && (hand==1)))
printf("\nコンピュータは %d\nあなたの負けです\n\n",hand);

}

これなんですが、0を入力したときはちゃんと動作するんですが、1と2を入力した時はおかしな答えが出てきてしまいます
どうしてでしょうか?
ifまでしかまだ習ってないんでそこをよろしくお願いします
741デフォルトの名無しさん:2005/06/04(土) 23:57:41
すみません、自己解決しました
intなのにscanf("&lf",&n)って、なにやってんだ俺……
742614:2005/06/05(日) 00:21:53
以前質問した>>614です。
一応波形のように表示させることはできたんですが
ウィンドウが640x480なのにたいして与えられるデータ値が
+ー6800前後(Y軸)、データの量が10020個(X軸)と入りきらないという事態になりました
一応クリックする度に600個づつ表示出来るようにして10020個の問題はクリアしたつもりなのですが、
X軸、Y軸の間隔の調整方法でなにか良いアイディア在りませんでしょうか?

743デフォルトの名無しさん:2005/06/05(日) 00:41:18
実際の大きさp:-6800〜+6800
画面の大きさv:0〜480(上下逆の場合は適宜変える)

v=(6800+p)*480/(+6800-(-6800))
v=(6800-p)*480/(+6800-(-6800))(逆)

vがintなら割る順序に気をつけるかdoubleに変換するか
試行錯誤すると。
744デフォルトの名無しさん:2005/06/05(日) 09:54:39
[1] 授業単元: コンピュ‐タ初級
[2] 問題文: 繰り返し(for文 or while文) printf scanf  if文
       をすべて使って 自由にプログラムを完成させよ。
[3] 環境
 [3.1] OS:Linux
 [3.2] コンパイラ(バージョン):
 [3.3] 言語:C
[4] 期限:6月8日
[5] その他の制限:for文まで習ってます。
745デフォルトの名無しさん:2005/06/05(日) 10:18:41
>>744
あんた、昨日もどっかのスレにあげてなかった?
ちょっと自分でやってみ。
で、わからんとこを質問してみろ。
746デフォルトの名無しさん:2005/06/05(日) 10:20:34
>>742
元データの精度にもよるけど、音声データは連続して
少しずつ変化していくから、隣接しているデータの平均を取ったり、
一部のデータを無視したりしても結果はそんなには変わらないと思うが。

もしくは、Wav編集ソフトのようにY軸を小さくして複数段で表示したりするとか。
http://www.hookup.co.jp/software/vegas5/images/wav_multi.jpg
747デフォルトの名無しさん:2005/06/05(日) 10:58:29
[1] 授業単元:
[2] 問題文(含コード&リンク): tの値を変化させていった時の、sin((2πf)t)の波形を出力する。fは任意。
[3] 環境
 [3.1] OS:windows xp
 [3.2] コンパイラ(バージョン):Visual C++ 6.0
 [3.3] 言語:C
[4] 期限:2005/6/5
[5] その他の制限:
一応、以下のプログラムを書いて実行したのですが、一般的なsinカーブになりません。
出力はcsvファイルにして、Excelでグラフを描けるようにしたいのですが。
どうぞ、ご教授お願いいたします。
748747:2005/06/05(日) 10:59:08
自分で書いてみたものです↓

#include <stdio.h>
#include <math.h>
#include <string.h>

main()
{
FILE *fp;
char fn[1000];

int i;
double D[1000],pi,f;

pi=3.1415;
f=10;

strcpy(fn,"sin.csv");
fp=fopen(fn,"w");

for(i=0 ; i<1000 ; i++)
{
D[i]=sin((2*pi*f)*i*0.1);
fprintf(fp,"%f\n",D[i]);
}
}
749デフォルトの名無しさん:2005/06/05(日) 11:04:20
D[i]=sin((2*pi*f)*i*0.1);

D[i]=sin(2*pi/f*i);
(fを周期と考えたとき)
または、
D[i]=sin(2*pi*1000/f*i);
(Dの長さを単位としてfを周波数と考えたとき)
750747:2005/06/05(日) 11:14:10
>>749さん
ありがとうございます。
何だかできそうなのですが、
いまいち何が悪かったのか分かりません(汗)
何かご指摘がございましたら、教えてくださいませ。
751614:2005/06/05(日) 11:41:42
>>743さん
>>746さん
レスありがとうございます。
>>743さんの式を使ってみたらうまくいきました。
ただこの式の効果というか仕組がよく理解できません
よかったら教えてもらえませんか?

あとはX軸をどうやって全体表示させるか考えようとおもいます
(課題の指示に全体を表示させるようにあったので)
>>746さんのいうとおり 何段かに別けるか、
一部無視してみたりいろいろためしてみようとおもいます。
752デフォルトの名無しさん:2005/06/05(日) 12:24:21
>>751

目盛りが-6800〜6800まであるグラフを目盛り0〜479がある別のグラフに形を似せて書くとき、
どういう座標変換がされるかを考えるとよい。
753デフォルトの名無しさん:2005/06/05(日) 12:45:30
>>735
『C言語による最新アルゴリズム辞典』で検索。
全ソースコードが引っかかるはず。
zip内のファイル名がcrcとか着いてるのを探せばいいんでないかい?
754デフォルトの名無しさん:2005/06/05(日) 12:56:08
[1] 授業単元: 情報処理演習
[2] 問題文 :ユークリッドの互除法に従って2つの自然数の最大公約数を求めるプログラムを作成せよ。
[3] 環境
 [3.1] OS:UNIX
 [3.2] コンパイラ(バージョン): gcc
 [3.3] 言語:C
[4] 期限:2005年6月6日
[5] その他の制限:C言語を習ってまだ1ヶ月で繰り返し処理までは習っています。
755デフォルトの名無しさん:2005/06/05(日) 12:57:45
>>754
int gcd (int a, int b) {
if (b == 0) return a;
else {return gcd2 (b, a%b);}
}
756デフォルトの名無しさん:2005/06/05(日) 12:58:29
×else {return gcd2 (b, a%b);}
○else {return gcd (b, a%b);}
757デフォルトの名無しさん:2005/06/05(日) 12:59:13
int gcd(int a, int b)
{
int tmp;
if (a < 1 || b < 1)
return 0;
while (a % b != 0) {
tmp = a % b;
a = b;
b = tmp;
}
returm b;
}
758デフォルトの名無しさん:2005/06/05(日) 12:59:50
また、このアルゴリズムをアセンブリで書けば高速。
int gcd (int a, int b) {
register int g, c, e = 0;
while (a&1 + b&1 == 0) {a = a>>1; b = b>>1; e++;}
while (a&1 == 0) a = a>>1;
while (b&1 == 0) b = b>>1;
while (b != 0 && b != 1) {
c = (a-b); c = c>=0?c:-c; // c = abs (a-b);
a = a>=b?b:a; // a = min (a, b);
b = c; while (b&1 == 0) b = b>>1;
}
if (b == 0) g = a * power (2, e);
if (b == 1) g = power (2, e);
return g;
}
759デフォルトの名無しさん:2005/06/05(日) 13:00:12
int power (int a, int b) {
int n = 1;
while (b) {if (b&1) n = n*a; b = b >> 1; a = a*a;}
return n;
}
760なかじま:2005/06/05(日) 13:01:36
#include<stdio.h>
#define MAX 3

int main(void)
{
int num[MAX];
int cnt;

for(cnt=0; cnt<MAX; cnt++)
{
printf("Input number %d ",cnt+1);
scanf("%d",&num[cnt]);
}

for(cnt=MAX; cnt>0; cnt--)
{
printf("number %d(%06d)\n",cnt, num[cnt]);
}

return 0;
}
number1〜3まで入力して、numbe3から1の順で格納された値を表示するというプログラムなのですが、表示のときnumber3だけ入力していない4が表示されます。すいませんアドバイスください。
761754:2005/06/05(日) 13:02:12
すいませんreturn文の使い方はプログラムの最後にreturn 0と書く
ということ以外は習ってないので良く分からないです。
762デフォルトの名無しさん:2005/06/05(日) 13:06:04
>>761
関数というのは、値を入力して値を出力するものを言う。
return 〜というのは関数を終了して〜を出力するという意味。
関数の中ならどこで使っても良い。
763754:2005/06/05(日) 13:10:45
>>762
ありがとうございます。なんとなく分かりました。
でも授業では習ってないので、return文を使わない
方法で>>754の問題のプログラムを教えていただきたいですm(_ _)m
764デフォルトの名無しさん:2005/06/05(日) 13:12:33
int gcd(int a, int b)
{
int tmp;
if (a >= 1 && b >= 1) {
while (a % b != 0) {
tmp = a % b;
a = b;
b = tmp;
}
}
returm b;
}
765デフォルトの名無しさん:2005/06/05(日) 13:13:13
>>763
嫌です。
あの関数を提出しなさい。
766デフォルトの名無しさん:2005/06/05(日) 13:24:37
>>763
習っていないものを使って何が悪い。
767デフォルトの名無しさん:2005/06/05(日) 13:28:46
>>766
習ってないものを使うとインターネットから拾ってきたものだと怪しまれるからじゃない?
768デフォルトの名無しさん:2005/06/05(日) 13:29:44
みんな厳しいなw
769デフォルトの名無しさん:2005/06/05(日) 13:30:38
>>767
「独学で勉強した」とも考えられる。
770デフォルトの名無しさん:2005/06/05(日) 13:32:42
>>769
あー。プログラミングは独学のほうがレベル高いからなぁ。
学校の場合、よい教官にあたらんとな。
771デフォルトの名無しさん:2005/06/05(日) 13:37:55
>>749
>D[i]=sin(2*pi*1000/f*i);
>(Dの長さを単位としてfを周波数と考えたとき)
おいおい、fが周波数ならこんな式にはならんだろう。

>>747=748
時間軸が短いだけじゃない?
>D[i]=sin((2*pi*f)*i*0.1);
の0.1をもっと小さい値(0.01〜0.05くらい?)にすれば
多分求めてる波形が出るはず。
772デフォルトの名無しさん:2005/06/05(日) 13:42:22
エラーが出て宿題ができません。

d:\home>cl a.c
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.

a.c
コマンド ラインのエラー D2027 : '.\c2' を実行できませんでした。

なんでなんじゃー。ぐすん。
773735:2005/06/05(日) 13:59:21
>753
見ました。FlashDLLより解りやすそうだったのですが
CRC**t と CRC** の違いが解りません。
tが付いてるファイルは何なのでしょうか?
774デフォルトの名無しさん:2005/06/05(日) 14:08:02
>>773
>753ではないけど。

チェックサムでもCRCでもMD5でもいいんだけどさ、まずは

Validator = GetValidator(自己ファイル全体)

というところをk何が得たほうがよくね?
775デフォルトの名無しさん:2005/06/05(日) 14:09:07
書籍を読みませう。>>773
776デフォルトの名無しさん:2005/06/05(日) 14:09:19
  ⊂ ヽ ミ ヽ ⊂ ヽ ミ ヽ ⊂ ヽ ミ ヽ ⊂ ヽ
    \\ ∧_∧ ノノノ _∧ ノノノ _∧ ノノノ _∧
╋┏┓ \ ( ´∀`) ゚∋゚)´∀`) ゚∋゚)´∀`) ゚∋゚)´∀`)
┃┣┫━━>  ⌒ヽ  ⌒ヽ  ⌒ヽ  ⌒ヽ  ⌒ヽ ⌒ヽ  ⌒ヽ  ━━┃┃┃
╋  ┃  /   . へ \ へ \ へ \ へ \ へ \ へ \ へ \.  ・ ・ ・
     /    /   \.\   \\ .\\ \\ \\ .\\ . \\
     レ  ノ    ノヽ_つノ ヽ_ミ  ヽ_つ ヽ_ミ ヽ_つ ヽ_ミ  ヽ_つ
    /  /  /  /  /  /  /  /  /  / /  /  /  /
   /  /|  /  /| /  /| /  /| / . /|/  /|  /  /|
777デフォルトの名無しさん:2005/06/05(日) 14:09:40
まず,pattern に対して以下のように情報を収集して next[i] (1 ≦ i ≦ pattern_len) という配列を作る:

1 ≦ i ≦ pattern_len に対して,0 ≦ j ≦ i - 2 の範囲で j を動かして,pattern[0] 〜 pattern[j] と pattern[i - 1 - j] 〜 pattern[i - 1] が完全に一致するようなできるだけ大きい j を選んで,next[i] = j + 1とする.


そのような j が無いときは,next[i] = 0 とする.



KMP法のテーブル表を作るんだけど教えてください
778デフォルトの名無しさん:2005/06/05(日) 14:19:15
ちと便乗。
>774
GetValidatorってMSDNに載ってないけどどうやって使う?
>>775
廃刊してたと思う。
779デフォルトの名無しさん:2005/06/05(日) 14:50:38
【質問テンプレ】
[1] 授業単元: データ構造とアルゴリズム
[2] 問題文(含コード&リンク):スタックのpush,pop関数を連結リストで実現せよ

[3] 環境
 [3.1] OS:Linux
 [3.2] コンパイラ(バージョン):gcc
 [3.3] 言語:C
[4] 期限:6月7日まで
[5] その他の制限:

連結リストを使ってpop,push関数をつくりスタックを実現せよという問題なのですが、
以下のプログラムを書いて実行すると、セグメントエラー(coreを出力しました)
とでて実行できません。
順に1,3,5をプッシュしてそのあとポップを実行する、というものです
あと同様にenqueue,dequeue関数をつくりキューを実現せよというものもあり
そちらもできれば教授お願いします。
よろしくお願いいたします。
780デフォルトの名無しさん:2005/06/05(日) 14:51:08
#include<stdio.h>
#include<malloc.h>
struct LIST{
int data;
struct LIST *next;
};
struct LIST *head,*tail,*new;

void push(int x)
{
new=(struct LIST *)malloc(sizeof(struct LIST));
new->data=x;
new->next=head;
head=new;
}
int pop(void){
int x;
x=head->data;
head=head->next;
return(x);
}

int main(void){
tail=NULL;
head=NULL;
push(1); push(3); push(5);
printf("stack data={%d,%d,%d}\n",head->data,
head->next->data,head->next->next->data);
printf("output data(stack)=%d\n",pop());
return(0);
}
781デフォルトの名無しさん:2005/06/05(日) 15:04:33
head=NULL;

小一時間(r
782デフォルトの名無しさん:2005/06/05(日) 15:06:19
>>781
で?それがcore吐く原因?
783デフォルトの名無しさん:2005/06/05(日) 15:07:13
どこを見ているのかと小一時間(r
struct LIST *head,*tail,*new;
784781:2005/06/05(日) 15:12:21
new->next=head;



head->next->data
head->next->next->data

なんてやってるからてっきりそうだと思ったんでつが。違ってたならスマソ
785デフォルトの名無しさん:2005/06/05(日) 15:13:28
free してない以外は良さそう
786デフォルトの名無しさん:2005/06/05(日) 15:17:03
>>783
自信が無いなら語らないほうがいいよ
787デフォルトの名無しさん:2005/06/05(日) 15:28:47
>>783 あおられてる(苦笑)
788デフォルトの名無しさん:2005/06/05(日) 15:33:21
>>783
あおられてますよ(失笑)
789デフォルトの名無しさん:2005/06/05(日) 15:42:42
んじゃ
new=(struct LIST *)malloc(sizeof(struct LIST));
に失敗したとか(w
790デフォルトの名無しさん:2005/06/05(日) 15:46:53
Linux でコンパイル、実行してみたけど、core 吐かない。

$ ./a.out
stack data={5,3,1}
output data(stack)=5

$ gcc --version
gcc (GCC) 3.3.5-20050130 (Gentoo Linux 3.3.5.20050130-r1, ssp-3.3.5.20050130-1, pie-8.7.7.1)
以下略。
791デフォルトの名無しさん:2005/06/05(日) 15:58:16
792デフォルトの名無しさん:2005/06/05(日) 16:00:32
必死にあおってるヤシ。欲求不満か?
793デフォルトの名無しさん:2005/06/05(日) 16:03:27
>>760
答えは簡単だからヒントを…

配列の格納をもう一度かんがえてみ
scanfの段階ではnum[0]から格納しているのに対して
入力された値を出力するところではnum[3]から出力しようとしてる
num[3]には何か値を入力してるか?
794デフォルトの名無しさん:2005/06/05(日) 16:06:12
テキトーなこと言ってるので突っ込んだら煽ってるといわれましたw
795789:2005/06/05(日) 16:14:53
freeしてないから、メモリが足りなくなった可能性ない?
796デフォルトの名無しさん:2005/06/05(日) 16:40:40
コンパイルしようとすると
  互換でない型変換(関数 main ) ってのが出てしまいます
(´;ω;`)ナンダヨソレ・・・。 どうかデバッグお願いします
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/501.txt
エラーの行や問題も書いてありますが正しくコンパイルされてても実行がうまくいくか自信ありません・・・
よかったら間違いを訂正して下さると嬉しいです orz
797デフォルトの名無しさん:2005/06/05(日) 16:48:20
>>796
×(struct list)
○(struct list *)
798& ◆.1WWo/rNig :2005/06/05(日) 16:48:35
[1] 授業単元:
[2] 問題文(含コード&リンク):
以下のようなプログラムを書け。

形式
コマンド名 モード 行数 ファイル...
機能
モード(8進数)で指定されたアクセス権でファイルを作成し、
その内容は、各行が%一文字のみからなり(すなわち、改行文字を含めて2
バイトからなり)、行数(10進数)で指定された行数のテキストとなるよ
うにする。ファイルは1個以上任意個指定できるものとする。 同名のファ
イルがすでに存在する場合はエラーとする。 指定されたファイルが複数
の場合で、処理の途中でエラーが発生した場合でも、未作成のファイル
があれば、処理を中断することなく残りのファイルを作成すること。


[3] 環境
 [3.1] vineLinux最新版
 [3.2] コンパイラ(バージョン):gcc
 [3.3] 言語:C
[4] 期限:2005年6月5日24:00まで
[5] その他の制限:どこまで習っているか、等々
お願いいたします。
799デフォルトの名無しさん:2005/06/05(日) 16:50:26
>>796
明日提出期限なのに、今から送って間に合うのか?
800796:2005/06/05(日) 16:56:24
>>799
大丈夫やと思うんだがな
以前当日に出して間に合ったし
801デフォルトの名無しさん:2005/06/05(日) 17:19:03
環境 OS XP
コンパイラ Microsoft.NET Framework SDK


ちょっとお尋ねしたいのですが、ファイルからデータa.datを読み込むプログラムで
ファイルの場所を、

fp = fopen("C:\Documents and Settings\Owner\My Documents\a.out","rt");

というふうに書いて実行すると、以下のようになってしまいます

yomikomi.c
yomikomi.c(12) : warning C4129: 'D' : エスケープ シーケンスとして正しく認識され
ませんでした。
yomikomi.c(12) : warning C4129: 'O' : エスケープ シーケンスとして正しく認識され
ませんでした。
yomikomi.c(12) : warning C4129: 'M' : エスケープ シーケンスとして正しく認識され
ませんでした。


正しくファイルの場所を記述するにはfp = fopen(" ","rt");の中身をどうすればよいのでしょうか?
802デフォルトの名無しさん:2005/06/05(日) 17:20:18
>>801
\ではなく\\と書け
803デフォルトの名無しさん:2005/06/05(日) 17:25:21
>>798
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>

int main( int argc, char *argv[] )
{
mode_t mode;
int line, fd, i, j;

sscanf( argv[1], "%o", &mode );
line = atoi( argv[2] );

for ( i = 3; i < argc; i++ ) {
if ( -1 == ( fd = open( argv[i], O_WRONLY | O_CREAT | O_EXCL, mode ) ) ) {
printf( "エラー %s\n", argv[i] );

} else {
for ( j = 0; j < line; j++ ) {
write( fd, "%\n", 2 );
}
close( fd );
}
}
}
804デフォルトの名無しさん:2005/06/05(日) 17:29:57
805801:2005/06/05(日) 17:41:51
>>802
こういうことでしょうか?

fp = fopen("C:\\Documents and Settings\\Owner\\My Documents\\a.dat","rt");
if (fp==NULL){
printf("Error: File not found.\n");
exit(1);
}

しかし実行してもエラーになってしまうのですが・・・
a.datも確かにマイドキュメントの中です。

C:\Documents and Settings\Owner\My Documents>yomikomi.exe
Error: File not found.
806デフォルトの名無しさん:2005/06/05(日) 17:50:33
ヒント

フォルダ名にスペースがある
807801:2005/06/05(日) 18:02:16
"C:\\Documents and Settings\\Owner\\My Documents\\a.dat"

"C:\\DocumentsandSettings\\Owner\\MyDocuments\\a.dat"

"C:\\DocumentsandSettings\\Owner\\MyDocuments\a.dat"

破れかぶれで色々試していますが、一向にファイルが読み込めません(ノД`)
808デフォルトの名無しさん:2005/06/05(日) 18:05:14
"\"C:\\Documents and Settings\\Owner\\My Documents\\a.dat\""
809デフォルトの名無しさん:2005/06/05(日) 18:09:16
答えてる奴も詰まらんことで引っ張るなよと・・・
810デフォルトの名無しさん:2005/06/05(日) 18:12:18
>809
ほらやっぱwindowsならではのお約束って体験してみないと身につかないし
811デフォルトの名無しさん:2005/06/05(日) 18:31:26
ここは優しい人が多いインターネッツですね
812デフォルトの名無しさん:2005/06/05(日) 18:33:06
以前より厨が増えたがな
813デフォルトの名無しさん:2005/06/05(日) 18:35:02
なんか回答者のレベルに疑問があるね。
814デフォルトの名無しさん:2005/06/05(日) 19:06:05
配列にまとめて代入するときってどうしたらいいんですか?
宣言時に int a[]={1,2,3,4,5};
はわかるのですが、
そのあとに同じようにしても代入できません
815デフォルトの名無しさん:2005/06/05(日) 19:10:32
Cでは配列の初期化はできても代入はできんので、あきらめて
memcpy()はforループなどを使って明示的に初期化しる
816801:2005/06/05(日) 19:53:23
>>808
ありがとうございます。解決しますた
817デフォルトの名無しさん:2005/06/05(日) 20:44:24
>>814-815
そこでC99の複合リテラルですよ。
どうせmemcpyとかが必要だけど。
818デフォルトの名無しさん:2005/06/05(日) 21:11:40
C99ってかなり合理的で自然な拡張なのに全然普及してないよな。
819デフォルトの名無しさん:2005/06/05(日) 21:24:09
gccとかならもはやC++使っちゃうからでそ>C99
820デフォルトの名無しさん:2005/06/05(日) 22:23:59
うむ。今やCに求められるのは互換性と移植性だろ。
わざわざ新しいCに手を出すぐらいならC++で良し。
821デフォルトの名無しさん:2005/06/05(日) 23:17:22
822デフォルトの名無しさん:2005/06/05(日) 23:29:11
>>820
そんなもの誰もCに期待していない。
お前素人?
823デフォルトの名無しさん:2005/06/05(日) 23:35:32
互換性と移植性

むしろJava
824デフォルトの名無しさん:2005/06/05(日) 23:36:31
>>820は「C++に比べて」の話だよ

Javaでいいような領域でそもそも今時Cなんぞ使うものか
825デフォルトの名無しさん:2005/06/05(日) 23:38:27
まだだ、まだ終わらんよ!
826デフォルトの名無しさん:2005/06/06(月) 00:30:18
[1] 授業単元:C言語
[2] 問題文(含コード&リンク):
3つの整数をキーボードから読み取って
その合計を求めるプログラムを次の条件で作りなさい
@変数は3個だけ使用 Ascanfは繰り返し処理
[3] 環境
 [3.1] OS:Windows
 [3.2] コンパイラ(バージョン):gcc ・・・かな?
 [3.3] 言語:C
[4] 期限:2005年6月6日午後3時まで
どうしてもわかりません。よろしくお願いします。
827デフォルトの名無しさん:2005/06/06(月) 00:32:10
工業高校か高専の1年生かな?
大学でそれなら諦めた方が良いよ。
教科書あるだろ?
828デフォルトの名無しさん:2005/06/06(月) 00:36:19
[1] 授業単元:ファイル入出力
[2] 問題文(含コード&リンク):
  int型の配列に格納された数値を効率よくファイルに書き込む
  方法をご教授ください。

// データ格納バッファ
unsigned int i[50];
// 数値格納関数(定期的に1msec毎に定期的にコールされる)
void func(unsigned int j)
{
static unsigned char idx;
if(idx > 50)
idx = 0;
i[idx++] = j;
}
ファイル出力イメージは以下のとおりです。
  (テキスト形式)
34
56
123
・   
・   
・   
この場合、i[]に数値を代入する代わりにfprintf等の関数を用いれば
ファイル書き込みが可能とは思いますが、毎回ファイル書き込みにいかずに、
バッファリングされたものを効率よくファイル書き込みできる方法を
教えてください。 ファイルアクセスを極力少なくしたいと考えています。
よろしくお願いいたします。
[3] 環境
 [3.1] OS:Windows
 [3.3] 言語:どちらでも可
829デフォルトの名無しさん:2005/06/06(月) 00:38:26
>>826

#include <stdio.h>

int main(){
    int i,a,b,c;/*変数宣言*/
    int *p[]={&a,&b,&c};/*ポインタを宣言*/
    puts("Input...");
    for(i=0;i<3;i++){
        scanf("%d",p[i]);/*標準入力から入力*/
    }
    printf("%d",a+b+c);/*表示*/
}
830デフォルトの名無しさん:2005/06/06(月) 00:39:19
fprintfは別に効率悪くないぞ。
まさに
> ファイルアクセスを極力少なく
するために、デフォルトでバッファリングを行ってくれるから。
831デフォルトの名無しさん:2005/06/06(月) 00:44:03
>>829
すみませんが変数は3つでお願いします。
832829ではないが:2005/06/06(月) 00:52:25
>>831
#include?<stdio.h>

int?main(){
????int?i,sum,tmp;/*変数宣言*/
????puts("Input...");
????for(i=0;i<3;i++){
????????scanf("%d",&tmp);/*標準入力から入力*/
????????sum += tmp;
????}
????printf("%d",tmp);/*表示*/
}
833デフォルトの名無しさん:2005/06/06(月) 00:54:38
>>826
#include <stdio.h>

int main(void) {
  int i, sum, n; /* 変数3つ */
  sum = 0;
  for( i = 0 ; i < 3 ; i++ ) {
    scanf("%d", &n);
    sum += n;
  }
  printf("Sum = %d\n", sum);
  return 0;
}
834激しく文字化けしたorz:2005/06/06(月) 00:55:08
#include<stdio.h>

int main(void){
int i, sum, tmp;
puts("Input...");
for(i = 0; i < 3; i++){
scanf("%d", &tmp);
sum += tmp;
}
printf("%d", sum);
return 0;
}
835デフォルトの名無しさん:2005/06/06(月) 00:58:05
[1] 授業単元:プログラミング通論
[2] 問題文(含コード&リンク):
文字列s、fが与えられ、文字列sの中で文字列fが最初に現れる位置を見つけ、その位置を返す関数searchを作れ。
例:s = tractor f = act  →  actor
[3] 環境
 [3.1] OS:Windows XP
 [3.2] bcc551
 [3.3] 言語:C
[4] 期限:2005年6月10日
[5]このsearchってのは要するにライブラリ関数のstrstrって奴と同じものらしいです。
以下のようなものを作ってみたのですが、コンパイルは出来るのに実行するとセグメントエラーがおきます。何故でしょうか?

#include<stdio.h>

char *search(char *s, char *f){
char *w;
if(s[0] == f[0]){
w = search(s+1, f+1);
if(w == s+1) return s;
}
return search(s+1,f);
}

int main(){
char s[] = "tractor";
char f[] = "actor";

printf("%s\n",search(s,f));
}
836デフォルトの名無しさん:2005/06/06(月) 01:01:02
>>835
追ってみれば無限再帰することが分かる。ちゃんと終端チェックしないと。
837デフォルトの名無しさん:2005/06/06(月) 01:02:43
文字列の長さを考えろ。
838デフォルトの名無しさん:2005/06/06(月) 01:05:49
>>835
つーかあんたは lisper なのか?
839デフォルトの名無しさん:2005/06/06(月) 01:08:35
再帰を使ったからと言ってlisperと決め付けるのはいかがなものか。
まあ俺も素直に書くなら二重ループになるだろうけどさ。
840835:2005/06/06(月) 01:09:59
ありがとうございます。できました。
それとセグメントエラーって何なんですか?
841835:2005/06/06(月) 01:11:47
>>838
必要ないと思ったので書きませんでしたが、課題の条件に必ず再帰を使うことがあったので。
842デフォルトの名無しさん:2005/06/06(月) 01:13:09
本当に正確に「セグメントエラー」という用語だったの?
まあいいけどさ

普通は、参照または書き込みできないメモリにアクセスしようとした
という意味ね
基本的なメモリ保護機能のあるOSでの話だけど。
843デフォルトの名無しさん:2005/06/06(月) 01:15:52
>>841
なるほどね。

>>839にはlisperと決め付けたと言われるし、なんかコエー。
844デフォルトの名無しさん:2005/06/06(月) 01:22:29
・質問は必ず【質問テンプレ】に従ってください。
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
・問題文は、解いてもらう方にわかりやすいように全文を書きましょう。
                              ~~~~~~~~~~~~~~~~~~~~
・エラーは、その詳細と発生した行を書きましょう。エラーメッセージはコピペしてください。
                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
・後から問題に付け足しするのはやめましょう。解いてもらっている方に失礼です。
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
845デフォルトの名無しさん:2005/06/06(月) 01:31:02
見てて疲れるな。もちっとスムーズに出来ん?
846デフォルトの名無しさん:2005/06/06(月) 01:47:55
>>828 
こういうものを作ってみたなりよ。うちの環境では1clock()かからない。
@P3-1Ghz&i815Chipset(今となっては結構ぷあな環境かな。

http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/506.txt
847デフォルトの名無しさん:2005/06/06(月) 01:49:47
貧弱ゥ貧弱ゥ貧弱ゥ貧弱ゥ貧弱ゥ貧弱ゥ貧弱ゥ貧弱ゥ貧弱ゥ貧弱ゥ貧弱ゥ〜〜〜〜〜〜〜〜〜〜〜。
848デフォルトの名無しさん:2005/06/06(月) 02:09:52
>>846
デバッグ中に65MBのファイルをはいたときはびびった。
あれだけ作るのに10秒かかってないし。
こえーこえー。
849デフォルトの名無しさん:2005/06/06(月) 02:23:17
>>846
fflush() なしか・・・何を図ってるの?
850デフォルトの名無しさん:2005/06/06(月) 02:29:50
>>828
まともな Operating System ならライブラリ関数が最適にバッファリングしてくれて
システムコール呼び出し回数を減らしてくれる

それにファイルに書き込んだからってすぐにハードディスクに書き込まれるわけじゃない
ちゃんとOSバッファリングしてる

それを制御しようとしたら Kernel レベルの実装をやってください
851デフォルトの名無しさん:2005/06/06(月) 02:30:17
ちゃんとOSがバッファリングしてる
852デフォルトの名無しさん:2005/06/06(月) 02:32:05
>>850
カーネルレベルのバッファリングとライブラリレベルのバッファリングは
違うので、ごっちゃにすると誤解をまねく恐れが。

stdioの場合は、ライブラリレベル、つまりユーザコードのレベルで
バッファリングが行われる。
で、そのバッファリングモードを変える方法もあるし、たんに明示的に
fflush()を呼ぶこともできる。
853デフォルトの名無しさん:2005/06/06(月) 02:34:23
>>846
fflush???
一応、fprintf*DATAMAX(=50)の速度についてなんだけど、気にするほど遅くないということが出たと思ったんだが。

*-*-*-*-*-*-*-*-実験中*-*-*-*-*-*-*-*-*;

fflushをprintf("end - %d\n\n",clock());の前においてみたけど、やっぱり1clock()かかりませんでしたよ。
こんな感じじゃだめかしらん??


854デフォルトの名無しさん:2005/06/06(月) 02:37:49
>>853
で、CLOCKS_PER_SEC はいくつですか?
855デフォルトの名無しさん:2005/06/06(月) 02:45:21
クロックって何か分かって計測してるのかね。
856デフォルトの名無しさん:2005/06/06(月) 03:02:36
>>CLOCKS_PER_SEC
1000でdefineされてた。グローバル変数だと思っていた。(汗

>>クロック
3年ほど前に習ったときはアプリ起動からのmsecと教えられたような気がする。(Windowsの40日問題もこれ系だったきがする。
CLOCKS_PER_SECが変数だと勘違いしてたので動的にその値が変わるもんだと思っていた。
よく考えてみると理解してないかもしれない。(大汗
たぶん、アプリ起動時からのmsecで良いと思う。
857デフォルトの名無しさん:2005/06/06(月) 03:09:32
clock は、アプリケーションが使用したCPU時間を返す。
sleep(10) だけのプログラムの場合、プログラムの実行時間は10秒だけど、
clock は、限りなく0に近い値を返す。

この場合、ファイルI/Oのkernel処理の時間は含まれない。
858デフォルトの名無しさん:2005/06/06(月) 03:15:09
time ./a.out ではかればいいだろ
859デフォルトの名無しさん:2005/06/06(月) 03:16:31
>>857
ありゃ。思ってたのとぜんぜん違う。
clockが使えないとなると、WINAPI使うとかしないとだめか。うげ〜。
勉強になったよ。
レスthx。
860デフォルトの名無しさん:2005/06/06(月) 03:17:06
>>858
そだね。この話もぼちぼち終わりにしておきますか。
861デフォルトの名無しさん:2005/06/06(月) 03:23:52
お休み〜。
862デフォルトの名無しさん:2005/06/06(月) 03:43:29
ああ
おやすみ
863太郎:2005/06/06(月) 10:34:54
>>803

ありがとうございます。
ここのみなさんやさしい。。。
864デフォルトの名無しさん:2005/06/06(月) 10:40:44
[1] 授業単元:アドバンスプログラミングA
[2] 問題文(含コード&リンク):
待ち行列を初期化する関数 void queueInitialize(queue_t *que) と,
待ち行列が空であるかどうかを判断する関数 int queueEmptyQ(queue_t *que)
とを作れ。ただし, queueEmptyQ は,待ち行列が空であるときに 1 を,空で
はないときに 0 を返すものとする。
[3] 環境
 [3.1] VineLinux
 [3.2] コンパイラ(バージョン):
 [3.3] 言語:C
[4] 期限:2005年6月6日02:00まで
865864:2005/06/06(月) 10:41:55
礼儀がなってませんでした。
遅ればせながらお願いします。
866デフォルトの名無しさん:2005/06/06(月) 10:51:41
[1] 授業単元: プログラミングとその応用
[2] 問題文(含コード&リンク): 標準入力からテキストファイルを読み込んで、
ファイルに出現する各文字の出現頻度データを出力するプログラムを作成せよ。
文字コードとその出現頻度を1行ずつ並べたデータを出力するようにせよ。
なお、頻度集計の対象とするのは、コードが0〜127の範囲に入る文字に限るものとする。

出力するデータの形式は、各行は2つの数字からなり、1番目を文字コード、1文字あけて2番目をその文字の出現頻度とする。

プログラムを実行するときは、上記の形式でstdoutにデータを出力したものとすれば、
それをパイプで送り込む事で、xgraphというソフトウェアによってグラフを描く事ができる。
%./char_hist < char_hist.c | xgraph
(プログラム名をchar_histとする。)
なお文字コードと文字の対応関係は「man ascii」で調べられる。

[3] 環境
 [3.1] OS:Windows/Linux/等々 :Linux
 [3.2] コンパイラ(バージョン): gcc
 [3.3] 言語:C/C++/どちらでも可 のいずれか:C
[4] 期限:yyyy年mm月dd日hh:mmまで または 無期限 のいずれか:今週中に
[5] その他の制限:どこまで習っているか、等々 :関数、配列などを習って、今回は「文字列と標準入出力」というところを習いました。
できるだけ簡単なプログラムでお願いします。

よろしくお願いしますm( __ __ )m
867デフォルトの名無しさん:2005/06/06(月) 11:36:29
>>866
#include <stdio.h>
#include <string.h>

int main( void )
{
int code, count[128], i;

memset( &count[0], 0, sizeof( count ) );

while ( EOF != ( code = fgetc( stdin ) ) ) {
if( code >= 0 && code <= 127 ) {
count[code]++;

}
}

for ( i = 0; i < 128; i++ ) {
printf( "%d %d\n", i, count[i] );

}
}
868デフォルトの名無しさん:2005/06/06(月) 12:19:54
>>866
#include <stdio.h>
#define LOWER 0
#define UPPER 127
#define MAXLEN ((UPPER-LOWER)+1)
int
main(void)
{
int c, i;
long tot, freq[MAXLEN];
/* 配列とカウンタを初期化する */
for (i = 0; i < MAXLEN; i++)
freq[i] = 0;
tot = 0;
/* 標準入力を読みこみ、データを集計する */
while ((c = getchar()) != EOF)
if (c >= LOWER && c <= UPPER)
{
++freq[c-LOWER];
++tot;
}
/* データがあれば標準出力に出力する */
if (tot > 0)
{
for (i = 0; i < MAXLEN; i++)
printf("%d %.0f\n", i, (freq[i] == 0) ? 0 : (100.0*freq[i])/tot);
}
return 0;
}
869デフォルトの名無しさん:2005/06/06(月) 12:32:41
どうして同じ問題なのに >>867>>868 の出力が違うんですか?

初心者スマソ
870デフォルトの名無しさん:2005/06/06(月) 13:27:28

[1] 授業単元: プログラミングA
[2] 問題文(含コード&リンク): パスワードの桁数を最初に入力させ、パスワードをランダム(アルファベットと数字)に生成するプログラムを作成せよ。
[3] 環境
 [3.1] OS:WindowsXP
 [3.2] コンパイラ(バージョン): borland
 [3.3] 言語:C
[4] 期限:今日の17時までにお願いします(T_T)

よろしくおねがいします(T_T)
871デフォルトの名無しさん:2005/06/06(月) 14:08:30
>>870
mallocで確保した領域の解放は自分でやってくれ。
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
char *str;
int num, i, j, c;

scanf("%d", &num);
str = (char*)malloc(sizeof(char) * num + 1);

srand(getpid());
for(i = 0; i < num; i++)
{
while(1)
{
c = rand() % 128;
if(isalnum(c) != 0)
{
break;
}
}
str[i] = c;
}

printf("%s\n", str);

return 0;
}
872デフォルトの名無しさん:2005/06/06(月) 14:09:33
あ、j消すの忘れた orz
873デフォルトの名無しさん:2005/06/06(月) 14:14:10
ああ、終端文字追加するの忘れてる...orzモウダメポ

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
char *str;
int num, i, c;

scanf("%d", &num);
str = (char*)malloc(sizeof(char) * num + 1);
srand(getpid());
for(i = 0; i < num; i++)
{
while(1)
{
c = rand() % 128;
if(isalnum(c) != 0)
{
break;
}
}
str[i] = c;
}
str[num] = '\0';
printf("%s\n", str);

return 0;
}
874デフォルトの名無しさん:2005/06/06(月) 14:21:53
>>869

867 出現回数(回)
868 出現確率(%)

AABC  (改行無し)
のをWindowsXPで試してみたら
 (867) (868)
65 2  50
66 1  25
67 1  25
って出た
875デフォルトの名無しさん:2005/06/06(月) 14:29:27
[1] コンピュータ第1同演習
[2] unsigned char型変数を宣言し、その中のビット位置と、
  ビットの状態(1か0か)を読み込み、実際にその位置のビットを
  指定された状態にセットするるプログラムを作成しなさい。
[3] 環境
 [3.1] OS:Windows
 [3.2] コンパイラ(バージョン):
 [3.3] 言語:C
[4] 期限:6月9日まで
876するる〜:2005/06/06(月) 14:43:10
>>871
そこまでやって解放だけしないのかよ!?
877デフォルトの名無しさん:2005/06/06(月) 14:49:56
>>876
普段new/deleteだからfreeの使い方をわすr(ry
878デフォルトの名無しさん:2005/06/06(月) 15:06:20
>>875
unsigned char data, mask;
int pos, bit;
/* pos と bit に入力 */
mask = 1 << pos;
if (bit == 0)
  data &= ~ mask;
else
  data |= mask;
/* 結果出力 */
879デフォルトの名無しさん:2005/06/06(月) 15:13:43
880デフォルトの名無しさん:2005/06/06(月) 15:31:16
>>777
自演乙
881(*゚д゚)さん:2005/06/06(月) 15:34:18
>>777
自演乙
882デフォルトの名無しさん:2005/06/06(月) 15:40:27
>>880-881
???
883デフォルトの名無しさん:2005/06/06(月) 16:09:22
1.授業単元:プログラミング
2.問題文:正整数n(2以上) を入力させ、nを素因数分解するプログラムを作れ。2*3*3...のように出力しなさい。
3.環境
OS:Linux
言語:C
4.期限:2005/06/08
いくら考えてもわかんないorz
884デフォルトの名無しさん:2005/06/06(月) 16:10:14
【質問テンプレ】
[1] ゼミ
[2] スケールフリーネットワークを生成したいです。
   これは以下の規則を持ちます。
   1.ノードの初期値は2、リンク数は1。ノードは1つづつ増えていきかならず二つのリンクを得、100マデ試行を繰り返します。
   2.新規ノードは二つのリンクを得ますがリンク数を多くもつノードほどリンクを張りやすい傾向にあります。
    つまり一方のノードが他方の2倍のリンクを持つとき、倍もつほうはリンク数も倍の確率で得やすいということです。
    ただし、リンクは重複を許しません。

   3.得られたリンク数がベキ法則に従うことを図に示します。(これはエクセルに出力して図を描くので自分でやります)

[3] 環境
 [3.1] OS:Windows
 [3.2] コンパイラ(バージョン):
 [3.3] 言語:C/C++/どちらでも可
[4] 期限:2005年6月7日の23:59まで
[5] 基礎はすべて習っています。ネ申頼みまつ

885デフォルトの名無しさん:2005/06/06(月) 16:10:33
>>883
math.h は利用しても良いの?
886デフォルトの名無しさん:2005/06/06(月) 16:25:52
>>883
再起を使う方法

#include <stdio.h>

int iOutput = 0;

void _function_034( int v, int i )
{
while ( i < v ) {
if ( ( v % i ) == 0 ) {
if ( iOutput ) printf( " *" );
iOutput = 1;
printf( " %d", i );
_function_034( v / i, i );
break;
}
i++;
}
if ( i == v ) {
if ( iOutput ) printf( " *" );
printf( " %d\n", i );
return;
}
}

int main( void )
{
int n = 311112546;
_function_034( n, 2 );
return ( EXIT_SUCCESS );
}
887デフォルトの名無しさん:2005/06/06(月) 16:26:13
つかっていいです。
888デフォルトの名無しさん:2005/06/06(月) 16:29:56
>>883
環境依存だから、そのまま出すのはまずいがLinuxならgccだろうから多分動く。

#include <stdio.h>
void print_prime_factorization(int n) {
void aux(int n, int k, const char * del) {
if (n == 1) {
puts("");
return;
}

if (!(n % k)) {
printf("%s%d", del, k);
aux(n / k, k, "*");
} else {
aux(n, k + 1, del);
}
}

aux(n, 2, "");
}

int main(void)
{
int n;

scanf("%d", &n);
print_prime_factorization(n);

return 0;
}
889デフォルトの名無しさん:2005/06/06(月) 16:42:51
>>883
math.h バージョン

#include <stdio.h>
#include <math.h>

int iOutput = 0;

int main( void )
{
int n = 217483645;
int i = 2;

while ( i < ( int )sqrt( ( double )n ) ) {
if ( ( n % i ) == 0 ) {
if ( iOutput ) printf( " *" );
iOutput = 1;
printf( " %d", i );
n /= i;
} else {
i++;
}
}
if ( iOutput ) printf( " *" );
printf( " %d\n", n );
return ( 0 );
}
890デフォルトの名無しさん:2005/06/06(月) 17:30:26
>>886
>>888
>>889
どうもありがとうございます。
とりあえず全部やってみます。
891デフォルトの名無しさん:2005/06/06(月) 17:34:28
環境も関係してくるだろうが、オレの環境だと
>>888 で大きな素数(例えば 2147483647)を入れると
Stack Overflow になる。
892888:2005/06/06(月) 18:14:42
あ、ほんとだ。
末尾再帰は最適化してくれるんじゃなかったのか?>gcc

いずれにせよそのまま出せるような解答ではないわけだが。
893デフォルトの名無しさん:2005/06/06(月) 19:06:59
学校の課題です。
球の半径を1から10まで1ずつ変化させ、球の表面積と体積を出力しなさい
補足 表面積S=4πr二乗 体積 V=4/3πr三乗 π=3.141592
二種類のループ(while,for,whileの無限ループ)を使いなさい。
出力例: 半径R= 表面積S= 体積V=
誰か助けて下さい。
894864:2005/06/06(月) 19:08:15
すいません。期限間違えていました。
[1] 授業単元:アドバンスプログラミングA
[2] 問題文(含コード&リンク):
待ち行列を初期化する関数 void queueInitialize(queue_t *que) と,
待ち行列が空であるかどうかを判断する関数 int queueEmptyQ(queue_t *que)
とを作れ。ただし, queueEmptyQ は,待ち行列が空であるときに 1 を,空で
はないときに 0 を返すものとする。
[3] 環境
 [3.1] VineLinux
 [3.2] コンパイラ(バージョン): gcc
 [3.3] 言語:C
[4] 期限:2005年6月7日02:00まで
です。お願いしますm(__)m

895デフォルトの名無しさん:2005/06/06(月) 19:20:01
>>893
// for使用
#include <stdio.h>
#define PI 3.141592
int main(){
int r;
for(r = 1; r <= 10; r++) printf("半径R=%d 表面積S=%f 体積V=%f\n", r, 4*PI*r*r, 4*PI*r*r*r/3);
return 0;
}

// while使用
#include <stdio.h>
#define PI 3.141592

int main(){
int r = 1;
while(r <= 10){ printf("半径R=%d 表面積S=%f 体積V=%f\n", r, 4*PI*r*r, 4*PI*r*r*r/3); r++; }
return 0;
}

// while無限ループ使用
#include <stdio.h>
#define PI 3.141592

int main(){
int r = 1;
while(1){ printf("半径R=%d 表面積S=%f 体積V=%f\n", r, 4*PI*r*r, 4*PI*r*r*r/3); r++; if(r > 10) break; }
return 0;
}
896デフォルトの名無しさん:2005/06/06(月) 19:24:08
>>894
queue_tってどんな風に定義されてるの?
897デフォルトの名無しさん:2005/06/06(月) 19:27:17
struct queue : public std::deque{}
898894:2005/06/06(月) 19:41:02
>>896

すいません。
初心者でよくわからないんですが
このページのレポート問題です。。
http://www.kyoto-su.ac.jp/%7Eyamada/ap/queue.html#report
おねがいします。。

899デフォルトの名無しさん:2005/06/06(月) 19:51:21
>>898
void queueInitialize(queue_t *que){
que->head = 0;
que->num = 0;
}

int queueEmptyQ(queue_t *que){
return que->num ? 0 : 1;
}
900デフォルトの名無しさん:2005/06/06(月) 19:56:34
[1] 授業単元: 情報処理
[2] 問題文(含コード&リンク): 月を入力すると、その季節を表示するプログラムを作る。
  不適当な数字を入力した場合もう一度入力を促すようにする。
[3] 環境
 [3.1] OS:Windows
 [3.2] コンパイラ(バージョン): gcc
 [3.3] 言語:C
[4] 期限:今日の9時まで。
[5] その他の制限:どこまで習っているか、等々
901デフォルトの名無しさん:2005/06/06(月) 19:57:04
コンパイルさえできませんでしたが。
自分でできたところまで書いてみます。

#include <stdio.h>

int main(void)
{
int month;

printf("input month:");
scanf("%d",&month);

if(month >=3 && month <=5)
puts("It is spring.");
else if(month >=6 && month <=8)
puts("It is summer.");
else if(month >=9 && month <=11)
puts("It is autumn.");
else if(month ==1 || month ==2 || month ==12)
puts ("It is winter.");

return 0;
}
902デフォルトの名無しさん:2005/06/06(月) 20:09:22
? よくわからんができてるような
903デフォルトの名無しさん:2005/06/06(月) 20:10:51
ああ、そういうことか
904デフォルトの名無しさん:2005/06/06(月) 20:16:44
while (1){
printf("input month:");
scanf("%d",&month);
if(month >= 1 && month <= 12) break;
}
905デフォルトの名無しさん:2005/06/06(月) 20:17:26
>>884
だいぶ遅れたがスケールフリーネットワークのやつ。
問題読み違えてなきゃいいけど、一応確認。
>ノードの初期値は2、リンク数は1
ってノードが二つあって1つのリンクでつながってるってことだよね?
あと、リンクは無向だよね?(有向だとつじつま合わん希ガス)
とりあえず書いた分だけ書き込んどく。
あーネットワークの構造とか一切記録してないけど。w
ネットワークの構造を保存しておきたければ
list<int> を list<Network> とかやって Network クラスつくって隣接ノードのリストでも記録しておけばいいんでないかと思う。

#include <iostream>
#include <list>
using namespace std;
typedef list<int> List;
typedef List::iterator Iter;
void rearrange_list(List & ranking, Iter & iter);
906905:2005/06/06(月) 20:18:57
int main()
{
  List ranking; // リンクの数が多い順にひたすらならべる。
  srand((unsigned)time(0));
  ranking.push_back(1);
  ranking.push_back(1);
  int total_links = 2;
  for (int i = 0; i < 100; i ++)
  {
    int next = rand() % total_links; // 変数名わかりづらくてスマソ
    Iter iter1, iter2;
    for (iter1 = ranking.begin(); iter1 != ranking.end(); iter1 ++)
    {
      next -= * iter1;
      if (next < 0)
      {
        total_links ++;
        (* iter1) ++;
        break;
      }
    }
    rearrange_list(ranking, iter1); // 並び替え
907905:2005/06/06(月) 20:20:09
    next = rand() % (total_links - * iter1); // 重複を除外
    for (iter2 = ranking.begin(); iter2 != ranking.end(); iter2 ++)
    {
      if (iter1 == iter2) // 重複を回避
      {
        continue;
      }
      next -= * iter2;
      if (next < 0)
      {
        total_links ++;
        (* iter2) ++;
        break;
      }
    }
    rearrange_list(ranking, iter2); // 並び替え
    ranking.push_back(2);
    total_links += 2;
  }
908905:2005/06/06(月) 20:20:43
  int prev = 0;
  int count = 1;
  for (Iter iter = ranking.begin(); iter != ranking.end(); iter ++)
  {
    if (prev && * iter == prev)
    {
      count ++;
    }
    else
    {
      cout << * iter << " 個リンクを持つノードは " << count << "個" << endl;
      prev = * iter;
      count = 1;
    }
  }
  return 0;
}
909905:2005/06/06(月) 20:21:04
void rearrange_list(List & ranking, Iter & iter)
{
  // インクリメントされた iter の所以外は全部ソートされてる(はず)なので、
  // ひたすらリストをさかのぼる。
  Iter iter_back = iter, iter_prev = iter;
  iter_back --;
  for (; iter_back != ranking.begin() && * iter_back < * iter; iter_back --)
  {
    iter_prev = iter_back;
  }
  
  if (* iter_prev < * iter)
  {
    ranking.splice(iter_back, ranking, iter);
  }
}
910デフォルトの名無しさん:2005/06/06(月) 20:32:51
901です。
ムリポ。

>>904
えーそれ以降に何繋げたらいいんでしょうか
911デフォルトの名無しさん:2005/06/06(月) 20:34:24
【質問テンプレ】
[1] 言語処理
[2] 入力された文字列をランダムに入れ替えるプログラムを作れ。

<例>
input=>hello

hloel


↑が全然出来ません。

[3] 環境
 [3.1] OS:Unix
 [3.2] コンパイラ(バージョン):
 [3.3] 言語:C
[4] 期限:2005年6月8日の23:59まで
[5] ポインタをかじったくらい

どなたか助けてください。
912デフォルトの名無しさん:2005/06/06(月) 20:40:35
>>910
while文の中に、
>>901を入れてみるんだ。
ガンガレ
913905:2005/06/06(月) 20:43:30
クソ長いソースはってしまって申し訳ないっす。OTL
クソ長いクセに一箇所間違ってました。
下から3行目 iter_back ではなく iter_prev でした。
とりあえず逝ってきます。
914デフォルトの名無しさん:2005/06/06(月) 20:43:59
>>910
あと、>>901にコンパイルさえできなかったって
書いてあるけど、コピペしたら
普通に動いたよん。
915デフォルトの名無しさん:2005/06/06(月) 20:45:20
>>904は不正な入力したら無限ループになるぞ
百害あって一理無しでまったく意味がない

scanf()で戻り値チェックしないのはfopen()の戻り値をチェックしないのと
同じだ
916デフォルトの名無しさん:2005/06/06(月) 20:51:41
>>911

#include <stdio.h>
#include <string.h>

void swap(char *a, char *b)
{
nbsp;nbsp;nbsp;nbsp;char tmp;
nbsp;nbsp;nbsp;nbsp;tmp = *a, *a = *b, *b = tmp;
}
void random_shuffle(char *start, char *last)
{
nbsp;nbsp;nbsp;nbsp;char *next = start;
nbsp;nbsp;nbsp;nbsp;size_t index;
nbsp;nbsp;nbsp;nbsp;
nbsp;nbsp;nbsp;nbsp;for (index = 2; ++next != last; ++index)
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;swap(next, first + (rand() % index));
}

int main()
{
nbsp;nbsp;nbsp;nbsp;char buff[1024];
nbsp;nbsp;nbsp;nbsp;char *p;
nbsp;nbsp;nbsp;nbsp;while (fgets(buff, sizeof buff, stdin)) {
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;if (p = strchr(buff, '\n'))
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;*p = '\0';
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;random_shuffle(buff, buff + strlen(buff));
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;puts(buff);
nbsp;nbsp;nbsp;nbsp;}
nbsp;nbsp;nbsp;nbsp;return 0;
}
917916:2005/06/06(月) 20:52:29
すまん

#include <stdio.h>
#include <string.h>

void swap(char *a, char *b)
{
    char tmp;
    tmp = *a, *a = *b, *b = tmp;
}
void random_shuffle(char *start, char *last)
{
    char *next = start;
    size_t index;
    
    for (index = 2; ++next != last; ++index)
        swap(next, first + (rand() % index));
}

int main()
{
    char buff[1024];
    char *p;
    while (fgets(buff, sizeof buff, stdin)) {
        if (p = strchr(buff, '\n'))
            *p = '\0';
        random_shuffle(buff, buff + strlen(buff));
        puts(buff);
    }
    return 0;
}
918デフォルトの名無しさん:2005/06/06(月) 20:52:56
>>916
どう反応しようか…

つ 
919893:2005/06/06(月) 21:39:59
>>895さん
遅くなりましたが、どうもありがとうございました。
920デフォルトの名無しさん:2005/06/06(月) 21:48:37
【質問テンプレ】
[1] 授業単元:プログラミング演習
[2] 問題文(含コード&リンク):
   アラビア数字(1,2,3,4・・・)を入力すると、それに対応したローマ数字(T,U,V,W,・・・)を返すプログラムを作成せよ。
   なお、配列を使って表現すること。
   数字は10まで表現できればよい。
[3] 環境
 [3.1] OS:Linux
 [3.2] コンパイラ(バージョン):gcc
 [3.3] 言語:C
[4] 期限:06月17日まで
[5] その他の制限:問題にも書きましたが、配列を必ず使わないと駄目だそうです。
            よろしくお願いします。
921デフォルトの名無しさん:2005/06/06(月) 22:03:24
>>920
int main(void) {
  static const char *Rome[] = {"T", "U", "V", "W", "X", "Y", "Z", "[", "\"};
  char buf[16];
  if (fgets(buf, sizeof buf, stdin)) {
    int n = atoi(buf) - 1;
    if (0 <= n && n < 10) {
      puts(Rome[n]);
      return EXIT_SUCCESS;
    }
  }
  fputs("エラー:1〜10の数として認識できなかった。\n", stderr);
  return EXIT_FAILURE;
}
922デフォルトの名無しさん:2005/06/06(月) 22:07:36
>>884
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/508.txt

かぶっちまったけどclass化してみた。
サンプルは500で実行してるけど100に直して実行してみてくれ。
923884:2005/06/06(月) 22:14:06
>>905
レス禿げしく感謝!!
#include<time.h>
が落ちていましたが、ちゃんと出力されています!dクス
924デフォルトの名無しさん:2005/06/06(月) 22:14:20
[1] 授業単元:ソフトウェア演習2
[2]問題文(含コード&リンク):
  1main関数およびkeyequal, keyltを実装して3.5節(次レスに書きます)で示した二分探索木のプログラムを完成させ、データの挿入・探索が行えることを確認せよ。
2格納済みのデータをkeyの順に一覧表示する関数を実装せよ。
3keyを指定して、二分探索木からデータを削除する関数を実装せよ。
4課題1,2,3のプログラムを、ローマ字表記された氏名をkeyとすることができるように変更せよ
[3] 環境
 [3.1] OS:Linux
 [3.2] コンパイラ(バージョン):cc
 [3.3] 言語:C
[4] 期限:06月8日の午後2時まで
  よろしくお願いしますm(__)m。
925924:2005/06/06(月) 22:18:48
木の節構造を表す構造体は以下のようになる。ここでは教科書のサンプルに従い、typedefを使う。以後プログラム中で、struct nodeと書くところをNODEで置き換えることができる。また、木の根を指すグローバル変数rootをNULLで初期化しておく。

typedef int KEY;
typedef struct node {
KEY data;
struct node *left, *right;
} NODE;
NODE *root=NULL;

926924:2005/06/06(月) 22:19:25
木の節構造を表す構造体は以下のようになる。ここでは教科書のサンプルに従い、typedefを使う。以後プログラム中で、struct nodeと書くところをNODEで置き換えることができる。また、木の根を指すグローバル変数rootをNULLで初期化しておく。

typedef int KEY;
typedef struct node {
KEY data;
struct node *left, *right;
} NODE;
NODE *root=NULL;
927924:2005/06/06(月) 22:19:56
if (keyequal(key, (*p)->data))
return NULL;
else if (keylt(key, (*p)->data))
p =&(*p)->left;
else
p = &(*p)->right;
}
if ((new=malloc(sizeof(NODE))) == NULL) {
printf("Out of memory!\n");
exit(0);
}
new->left = NULL;
new->right = NULL;
new->data = key;
*p = new;
return new;
}
928デフォルトの名無しさん:2005/06/06(月) 22:23:48
>>833 >>834
だいぶ遅くなりましたが、ありがとうございました。
929828:2005/06/06(月) 22:56:24
遅ればせながら、皆様からのご回答ありがとうございます。

>>830
fprintfについての知識があいまいなため、
詳細を勉強し実装検討をしてみます。

>>850
今回の実行環境はWindowsですが、
将来的にはマイコンに移植したいと考えています。
OSは未搭載の予定ですが、ファイルアクセス(open,read,write etc)に関しては
実装済み(パクリもの)となっているのでfprintfでの実装を検討してみます。

>>846
サンプルコードどうもです。
実装時の参考とさせていただきます。
930デフォルトの名無しさん:2005/06/06(月) 23:17:11
[1] 授業単元:プログラミング(C)
[2] 問題文(含コード&リンク):1000以下の整数2数を入力させ、その和を出力するプログラムを作りなさい。
[3] 環境
 [3.1] OS:Windows
 [3.2] コンパイラ(バージョン):Visual C++
 [3.3] 言語:C
[4] 期限:2005/6/10まで
以下までは組まれているのですが、ここから分かりません…お願いします。

#include <stdio.h>
int i_input();//1:integer 0:string
int char2int(char []);

main(){
char s[80];
printf("%d\n",i_input(s));
}

int i_input(char a[]){
int i;
printf("1000以下の整数を入力してください。\n");
gets(a);
i=0;
while(a[i]){
if(!(a{i]>='0' && a[i]<='9')) return 0;
i++;
}
return 1;
}
931デフォルトの名無しさん:2005/06/06(月) 23:46:34
>if(!(a{i]>='0' && a[i]<='9')) return 0;
a[i]だよな?
932sage:2005/06/06(月) 23:51:47
>>930
#include <stdio.h>

int main()
{
 int m, n;
 if (scanf("%d %d", &m, &n) != 2 || m > 1000 || n > 1000) {
  fprintf(stderr, "1000以下の2数を入力してください\n");
  return 1;
 }
 printf("%d\n", m + n);
 return 0;
}
933デフォルトの名無しさん:2005/06/07(火) 00:01:16
[1] 授業単元: C言語
[2] 問題文(含コード&リンク): 「コマンドラインから指定された文字列を使い、何か応答(出力)するプログラムを作れ。」
[3] 環境
 [3.1] OS:unix
 [3.2] コンパイラ(バージョン): gcc
 [3.3] 言語:C
[4] 期限:2005年06月10日16:30まで

課題の意味がわかりません。「コマンドラインから指定」???
ランダムで表示が変わるおみくじとか作れば良いのかな?違います?
934デフォルトの名無しさん:2005/06/07(火) 00:05:47
>>933
#include <stdio.h>

int main(int argc, char *argv[]){

if(argc > 1){
printf("%sなんて言う人絶対狂ってますよ!\n", argv[1]);
}
return 0;
}
935デフォルトの名無しさん:2005/06/07(火) 00:08:22
>>934
ああ〜なんかそういうの見たことありますわ、サンクス。
じっくり調べてやってみます。
見当違いのレポートを出さずにすんで良かった。
936デフォルトの名無しさん:2005/06/07(火) 02:04:01
有名な4桁の数字当てゲームを作りたいんですが、どうしたらいいですか?
お願いします。
937デフォルトの名無しさん:2005/06/07(火) 02:37:42
>>936
お前さんがどのプログラムを有名と言っているのかは知らんが、
俺の知っている数当てゲームはコレ

#include<stdio.h>

main(){

int d, x;
unsigned int seed;

printf("number hitting game\n");
printf("Input an integer to seed = ");
scanf("%d",&seed);
srand(seed);

x = rand();
x %= 10000;

do{
printf("Hit my number(0-9999) = ");
scanf("%d", &d);
if(x > d) printf("greater than %d\n", d);
else if(x < d) printf("less than %d\n", d);
}while(x != d);

printf("Congratulations !\n");
}
938デフォルトの名無しさん:2005/06/07(火) 03:01:56
七行すれで見つけた
#include <stdio.h>
int i,p,v,c,n,z,a[10];long time(long *);void srand(unsigned);void main(void){
for(srand(time(NULL)),i=0;i<10;)a[i++]=-1;for(a[z=p=rand()%9+1]=0,i=1;i<=3;)if
(a[p=rand()%10]<0){a[p]=i++;z=z*10+p;}for(c=0;c<10;){printf("[%2d] >> ",++c);
scanf("%d",&n);for(v=0,i=4;i;n/=10)v+=(a[p=n%10]==--i)?10:(a[p]>=0);if(v==40)
break;printf("%14c## %2dH %2dB\n",' ',v/10,v%10);}printf("\n <<%d>>\n",z);}
939デフォルトの名無しさん:2005/06/07(火) 03:02:19
>>936
俺も何が有名かは知らんが、「数当て」でなく「数字当て」であることを考慮すると

# include <stdio.h>
# include <stdlib.h>

int main(void)
{
    int digits[4];
    int i;
    srand((unsigned)time(0));
    for(i = 0; i < 4; i++)
        digits[i] = (10.0 * rand() - 1) / RAND_MAX;
    while(1)
    {
        int abs_sum = 0;
        puts("guess four numbers");
        for(i = 0; i < 4; i++)
        {
            int input;
            scanf("%1d", &input);
            abs_sum += abs(input - digits[i]);
        }
        if(abs_sum == 0)
            break;
        printf("Sum of absolute difference is %d.\n", abs_sum);
    }
    puts("Excellent!");
    return 0;
}

940デフォルトの名無しさん:2005/06/07(火) 03:07:44
[1] 授業単元: C言語
[2] 問題文(含コード&リンク): 2つの自然数a,bを読み込み、1から100までの整数のうちでaで割り切れ
               かつbで割り切れない整数をすべて求めるプログラムを作れ。
[3] 環境
 [3.1] OS:Linux
 [3.2] コンパイラ(バージョン): cc
 [3.3] 言語:C
[4] 期限:2005年06月14日12:00まで
よろしくお願いしますm(__)m

941894:2005/06/07(火) 03:39:01
>>899さん
遅れてすいません。
ありがとうございました。
942デフォルトの名無しさん:2005/06/07(火) 03:46:35
#include <stdio.h>

int main(void)
{
int a, b, i;
printf("a = "); scanf("%d", &a);
printf("b = "); scanf("%d", &b);
for (i = 1; i <= 100; i++)
if ( i % a == 0 && i % b != 0)
printf("%d ", i);
return 0;
}
943デフォルトの名無しさん:2005/06/07(火) 03:49:48
>>940
#include <stdio.h> 

int main(void) { 
    int a,b,st=1,ed=100,p;
    printf("input a b ");
    scanf("%d %d",&a,&b);
    if(a==b || a<1 || b<2 || a%b==0){
        /* 勘弁してくれ */
    }else{
        p=st/a*a;
        if(p<st)p+=a;
        while(p<=ed){
            if(p%b) printf("%d ",p);
            p+=a;
        }
        printf("\n");
    }
    return 0; 
944デフォルトの名無しさん:2005/06/07(火) 06:42:30
>>303
if(num1*num2*num3==6&&(num1%3==num2%3-1||(num1==2&&num2==3))&&num1>0&&num2>0)
945911:2005/06/07(火) 07:16:04
>>917
ありがとうございます!
なんとか出来ました。
946デフォルトの名無しさん:2005/06/07(火) 12:21:58
[1] 授業単元: C言語
[2] 問題文(含コード&リンク): クラスカルのアルゴリズムを用いて,最小全域木を求めるプログラムを作成せよ.
* プログラムは,標準入力からグラフデータを読み込み,最小全域木を出力する.
* グラフデータは,以下の形式で与えられる:3
(0,1):13
(0,2):8
(1,2):11
* プログラムの動作例を以下に示す(上記グラフのデータファイルを graph.txt とする).
% ./kruskal < graph.txt
Min spanning tree:
(5,2) (4,0) (2,1) (4,3) (1,0)


[3] 環境
 [3.1] OS:Linux
 [3.2] 言語:C
[4] 期限:2005年06月10日12:00まで
[5]プログラムの雛形は以下です。「がんばって作る」のところをお願いします
947デフォルトの名無しさん:2005/06/07(火) 12:27:10
#include <stdio.h>
#include <stdlib.h>
// グラフを表す構造体
typedef struct {
int numNodes; // 節の数
int numEdges; // 枝の数
char *matrix; // グラフの隣接行列表現
} GRAPH;

void loadGraph(GRAPH *graph);
void setEdge(GRAPH *graph, int x, int y, int len);
int getEdge(GRAPH *graph, int x, int y);
void destroyGraph(GRAPH *graph);

int main(int argc, char *argv[])
{
GRAPH graph;
loadGraph(&graph);

// がんばって作る

destroyGraph(&graph);
return 0;
}
948デフォルトの名無しさん:2005/06/07(火) 12:27:52
void loadGraph(GRAPH *graph)
{
int x, y, len, numNodes, numEdges;
scanf("%d\n", &numNodes);    
graph->numNodes = numNodes;
graph->matrix = (char *)calloc(numNodes * numNodes, sizeof(char)); // 隣接行列の確保
if (graph->matrix == NULL) {
fprintf(stderr, "%d: memory overflow!\n", __LINE__);
exit(1);
}

// 枝データの読み込み
numEdges = 0;
while (scanf("(%d,%d):%d\n", &x, &y, &len) != EOF) {
setEdge(graph, x, y, len);
numEdges++;
}
// 枝数の登録
graph->numEdges = numEdges;
}
949デフォルトの名無しさん:2005/06/07(火) 12:28:05
/*
* グラフに枝 (x,y) を登録する
* 引数: graph - グラフ
* : x - 節1
* : y - 節2
* : len - 枝の長さ
*/
void setEdge(GRAPH *graph, int x, int y, int len)
{
*(graph->matrix + x * graph->numNodes + y) = (char)len;
*(graph->matrix + y * graph->numNodes + x) = (char)len;
}

int getEdge(GRAPH *graph, int x, int y)
{
return (int)*(graph->matrix + x * graph->numNodes + y);
}

void destroyGraph(GRAPH *graph)
{
free(graph->matrix);
}
950デフォルトの名無しさん:2005/06/07(火) 12:55:17
>>946
* グラフデータは,以下の形式で与えられる:
3
(0,1):13
(0,2):8
(1,2):11
* プログラムの動作例を以下に示す(上記グラフのデータファイルを graph.txt とする).
% ./kruskal < graph.txt
Min spanning tree:
(5,2) (4,0) (2,1) (4,3) (1,0)

3〜5 って何?
951デフォルトの名無しさん:2005/06/07(火) 13:55:21
>>946
int minX, minY, minCost;
int IndexX, IndexY, IndexCost;

printf( "Min spanning tree:\n" );
while ( graph.numEdges ) {
for ( minCost = 0, IndexX = 0; IndexX < graph.numNodes; IndexX++ ) for ( IndexY = IndexX + 1; IndexY < graph.numNodes; IndexY++ ) if ( ( IndexCost = getEdge( &graph, IndexY, IndexX ) ) > 0 && ( minCost == 0 || minCost > IndexCost ) ) {
minX = IndexX; minY = IndexY; minCost = IndexCost;
}
if ( !minCost ) break;
printf( "(%d,%d)", minX, minY ); setEdge( &graph, minX, minY, -1 ); graph.numEdges--;
for ( IndexX = 0; IndexX < graph.numNodes; IndexX++ ) {
if ( IndexX != minX && IndexX != minY ) {
if ( getEdge( &graph, IndexX, minX ) < 0 ) { setEdge( &graph, IndexX, minY, 0 ); graph.numEdges--; }
if ( getEdge( &graph, IndexX, minY ) < 0 ) { setEdge( &graph, IndexX, minX, 0 ); graph.numEdges--; }
}
}
}
printf( "\n" );
952デフォルトの名無しさん:2005/06/07(火) 14:38:58
>>940
#include <stdio.h>
int
main()
{
int a, b;
if (scanf("%d%d", &a, &b) == 2) {
int i = a, j = b;
while (i < 100) {
while (j < i)
j += b;
if (i < j)
printf("%d\n", i);
i += a;
}
}
return 0;
}
953デフォルトの名無しさん:2005/06/07(火) 14:48:42
[1]C言語入門
[2]数字を10個入力し、配列に格納する。隣同士を入れ換えた後
  その配列を出力する。ただし、用意する配列は一つとする。 
  入力を格納した配列内部で実際に隣同士を入れ換えること。
  出力時に入れ換えるのは不可とする。
[3]環境
  [3.1]windows98
[3.2]?
[3.3]C++
[4]6月8日午前10時まで
[5]for,while,if,配列くらいしかまだ習っていません。

途中までしかできませんでした。
どうかお願いします。
954デフォルトの名無しさん:2005/06/07(火) 14:48:47
羽根の角度や長さが異なる2つのミュラーリヤー図形を表示するWindowsプログラム.ただ
し,キーボードやマウスの入力によって,どちらかの図形の羽根の角度や長さを簡単に変
更できるようにしておくこと.ウィンドウの右下部分に自分の名前,名列番号を表示させ
ること.(20点満点.マウスやキーボードによる変更ができない場合は10点満点)
 上の条件でレポートが出ちゃいました。このレポートが出来る方いましたら、どうかよろしくお願いします。。。
挑戦してみてください。
955デフォルトの名無しさん:2005/06/07(火) 15:07:41
>>953
>隣同士を入れ換えた後
って
1 2 3 4 5 6 7 8 9 10
の順で入力したら
2 1 4 3 6 5 8 7 10 9
って入れ替えるの?
956デフォルトの名無しさん:2005/06/07(火) 15:17:22
>>954
まずキーボードの入力で線分や文字列が描けるサンプルを>>1のあぷろだに上げてほしい。
あと環境がわからないので>>1のテンプレにそって書いてほしい。

何でもいいなら作れるかもしれないけど
採点者がそれを認めるかどうかは全くわからないので
957デフォルトの名無しさん:2005/06/07(火) 15:20:40
sが英数字だったら1、そうじゃなかったら0を返す関数を作ります。
どっちがいいと思う?

1.
int chkchar(const int s)
{
if (('0' <= s && s <= '9') || ('A' <= s && s <= 'Z') || ('a' <= s && s <= 'z'))
return 1 ;
else
return 0 ;
}


2.
int chkchar(const int s)
{
if (('0' <= s && s <= '9') || ('A' <= s && s <= 'Z') || ('a' <= s && s <= 'z'))
return 1 ;

return 0 ;
}

958953:2005/06/07(火) 15:20:43
>>955
そんな感じです!!
959デフォルトの名無しさん:2005/06/07(火) 15:22:19
>>957
つ isalnum()
960957:2005/06/07(火) 15:24:43
いや、まあ課題でライブラリ関数を使わずに書きたいのです。
961デフォルトの名無しさん:2005/06/07(火) 15:30:25
>>957
オレならこうする。
後から条件の追加も楽だしね。

int chkchar(const int s)
{
if ( '0' <= s && s <= '9' ) return 1;
if ( 'A' <= s && s <= 'Z' ) return 1;
if ( 'a' <= s && s <= 'z' ) return 1;
return 0 ;
}
962デフォルトの名無しさん:2005/06/07(火) 15:30:59
>>957
int chkchar(const int s){
    char a[]="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
    int i=0;
    while(a[i])
        if(a[i++]==s) return 1;
    return 0;
}

ASCIIでなくても何とかなる。EBCDICの呪(ry
963デフォルトの名無しさん:2005/06/07(火) 15:40:12
[1] 授業単元: プログラミング基礎(C)
[2] 問題文(含コード&リンク): 二人の名前(平仮名、片仮名、漢字、アルファベット)を入力し、
相性を%(0〜100)で表示するプログラムを作りなさい。
[3] 環境
 [3.1] OS:Windows
 [3.2] コンパイラ(バージョン):Visual C++
 [3.3] 言語:C
[4] 期限:2005年6月9日まで

よろしくお願いします
964デフォルトの名無しさん:2005/06/07(火) 15:43:47
>>693
相性の計算方法は?
965デフォルトの名無しさん:2005/06/07(火) 15:44:52
>>957
#define MYCTYPE_LOWER0x0001
#define MYCTYPE_UPPER0x0002
#define MYCTYPE_ALPHA(MYCTYPE_LOWER|MYCTYPE_UPPER)
#define MYCTYPE_DIGIT0x0004
#define MYCTYPE_XDIGIT0x0008
unsigned short MYctype_[0x100];
#define MYislower(x) ((MYctype_[(x)&0xff])&MYCTYPE_LOWER)
#define MYisupper(x) ((MYctype_[(x)&0xff])&MYCTYPE_UPPER)
#define MYisdigit(x) ((MYctype_[(x)&0xff])&MYCTYPE_DIGIT)
#define MYisalnum(x) ((MYctype_[(x)&0xff])&(MYCTYPE_DIGIT|MYCTYPE_ALPHA))
#define MYisxdigit(x) ((MYctype_[(x)&0xff])&MYCTYPE_XDIGIT)
static
void
setup_sub(char* p, unsigned short b)
{
while (*p) {
MYctype_[*p] |= b;
p++;
}
}
void
setup()
{
setup_sub("0123456789", MYCTYPE_DIGIT);
setup_sub("abcdefghijklmnopqrstuvwxyz", MYCTYPE_LOWER);
setup_sub("ABCDEFGHIJKLMNOPQRSTUVWXYZ", MYCTYPE_UPPER);
setup_sub("0123456789abcdefABCDEF", MYCTYPE_XDIGIT);
}
966デフォルトの名無しさん:2005/06/07(火) 15:47:51
>>964
101で割るとかなんとか、そういうことを聞いたような…詳しくはちょっと分からなくて
すみません吊ってきますorz
967デフォルトの名無しさん:2005/06/07(火) 15:58:12
[1] 授業単元:プログラミング基礎
[2] 問題文:
24ビットと8ビットのbmpファイルがある。
このどちらを読み込んでも元画像をモノクロ化したbmp画像を出力せよ。
なお、bmp画像以外のファイル、対応してない形式のbmp画像、
これらを読み込んだ時「〜という理由でファイルを生成できない」
といった内容のエラーメッセージを出力すること。
[3] 環境
 [3.1] OS:Windows
 [3.2] コンパイラ:Visual C++
 [3.3] 言語:C++
[4] 期限:2005年06月16日まで
[5] その他の制限:mallocを使用

これを落とすと留年してしまうのでどうかよろしくお願いします!
968デフォルトの名無しさん:2005/06/07(火) 15:59:37
>>953
#include <stdio.h> 

int main(void) { 
    int a[10],i,tmp;
    for(i=0;i<10;i++){
        printf("input a[%d] ",i);
        scanf("%d",&(a[i]));
    }
    for(i=0;i<5;i++){
        tmp=a[2*i];a[2*i]=a[2*i+1];a[2*i+1]=tmp;
    }
    for(i=0;i<10;i++)
        printf("%d ",a[i]);
    printf("\n");
    return 0; 

969デフォルトの名無しさん:2005/06/07(火) 16:00:52
>>965 は頭が良いが、バカなのが欠点だ。
970デフォルトの名無しさん:2005/06/07(火) 17:19:06
[1] 授業単元:プログラミング演習
[2] 問題文: 羽根の角度や長さが異なる2つのミュラーリヤー図形を表示するWindowsプログラム.ただ
し,キーボードやマウスの入力によって,どちらかの図形の羽根の角度や長さを簡単に変
更できるようにしておくこと.ウィンドウの右下部分に自分の名前,名列番号を表示させ
ること.(20点満点.マウスやキーボードによる変更ができない場合は10点満点)
[3] 環境
 [3.1] OS:windows2000
 [3.2] コンパイラ:Visual C++
 [3.3] 言語:C++
[4] 期限:2005年06月12日
971デフォルトの名無しさん:2005/06/07(火) 17:37:48
[1] 授業単元:プログラミング基礎
[2] 縦5横7の二次元配列を適当な整数で初期化し、縦5個の要素の総和を
横7の分だけ求め出力せよ。
[3] 環境
 [3.1] OS:windowsXP
 [3.2] コンパイラ:Visual C++
 [3.3] 言語:C++
[4] 期限:2005年06月8日
どうかよろしくお願いします
972デフォルトの名無しさん:2005/06/07(火) 18:17:09
[1] 授業単元:ソフトウェアU
[2] RSSファイルはXMLで記述されているので、木構造で管理できる。
  ダウンロードしたRSSを読み込んで、特定分野(社会、スポーツなど)の記事タイトルと配信時間を表示するプログラムを作成せよ。
[3] 環境
 [3.1] OS:Linux
 [3.2] コンパイラ:cc
 [3.3] 言語:C
[4] 期限:2005年06月8日 午後1時30分
[5] 木構造で作る
よろしくお願いします。
973デフォルトの名無しさん:2005/06/07(火) 18:22:05
#include <iostream>
using namespace std;

int main()
{
int array[5][7] = { {1,2,3,4,5,6,7},{1,2,3,4,5,6,7},{1,2,3,4,5,6,7},{1,2,3,4,5,6,7},{1,2,3,4,5,6,7} };
int ans = 0;

for (int i = 0; i < 5; i++){
for (int j = 0; j < 7; j++){
cout.width(3);
cout << array[i][j];
}
putchar('\n');
}
cout << "-----------------------\n";
for (int j = 0; j < 7; j++){
for (int i = 0; i < 5; i++){
ans += array[i][j];
}
cout.width(3);
cout << ans;
ans = 0;
}
return 0;
}
974デフォルトの名無しさん:2005/06/07(火) 20:45:29
[1] 授業単元:C++応用
[2] 以下の式に対応した、プログラムを作成せよ。
計算例:cal2 17 + 4 more * 43 more / 3.5
計算例:cal2 17 + 4
2項目以降も計算が続く場合は継続を示す単語"more"が入力されるものとする。
2項計算の場合はmoreは必要ない。
条件:
・文字列"more"の比較にstrcmp関数は使わない。
 (それ以外の文字列の比較には使用可)
・比較に使う文字列"more"はグローバル定数で定義する。:const char〜
・入力項が"more"かどうかの判定は以下の関数で行う
 関数名:chk_more
 引数1:比較対象の文字列
 戻り値:bool型 ture:"more"/flase:"more"以外
[3] 環境
 [3.1] OS:WinXP
 [3.2] コンパイラ:VC++
 [3.3] 言語:C++
[4] 期限:2005年06月8日 午前7時
[5] ここまで完成しました。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/509.txt
しかし、注釈を書いた部分がおかしいみたいで動きません。
どのようにすればよいのかよろしくお願いします。
表示するメッセージは既に組み込み済みとなっています。
975デフォルトの名無しさん:2005/06/07(火) 21:10:29
#include <string>
using namespace std;

string g_more = "more";

bool chk_more(const string& s)
{
  return s == g_more;
}
976デフォルトの名無しさん:2005/06/07(火) 22:18:46
>>974
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/513.txt

変更点
・main関数内の式チェック部分
・関数chk_more全部
・関数code_not全部
他はいじってない…と思う
977974:2005/06/07(火) 22:35:02
>>976
ありがとうございました。
978デフォルトの名無しさん:2005/06/07(火) 22:45:09
[1] 授業単元: 情報基礎
[2] 問題文(含コード&リンク): 乗除、剰余演算は一切使わず、代わりにシフト演算とビット列演算のみを用いて、
               入力された10進数の値を、2進数と16進数にそれぞれ変換するプログラムを作成せよ。
[3] 環境
 [3.1] OS:Windows/Linux/等々 WindowsXP
 [3.2] コンパイラ(バージョン): gcc
 [3.3] 言語:C/C++/どちらでも可 のいずれか C
[4] 期限:yyyy年mm月dd日hh:mmまで または 無期限 のいずれか 6月8日まで
よろしくお願いします。
979965:2005/06/08(水) 00:00:10
>>969
>>965 は頭が良いが、バカなのが欠点だ。

俺もそう思う。
980デフォルトの名無しさん:2005/06/08(水) 00:05:27
981980:2005/06/08(水) 00:06:59
return 0;
忘れた
982デフォルトの名無しさん:2005/06/08(水) 00:08:44
>>978
#include <stdio.h>

int main () {
 unsigned u;
 int i, n;
 printf("10進数を入力しろ: ");
 scanf("%u", &u);
 for (n = 1; n <= 4; n += 3) {
  printf("%d進数: ", 1 << n);
  for (i = sizeof u * 8 - n; i >= 0; i -= n)
   putchar("0123456789abcdef"[(u >> i) & ((1 << n) - 1)]);
  putchar('\n');
 }
 return 0;
}
983978:2005/06/08(水) 00:11:31
>>980
どうもありがとうございました。
984デフォルトの名無しさん:2005/06/08(水) 02:13:32
3×3の行列A、B、CのためにINT型の二次元配列を3個用意し、C=A^t(Aの転置行
列)、C=A+B(AとBの行列和)、C=A*B(AとBの行列積)の計算結果を表示するプ
ログラムを作成し、実行しなさい。ただし、配列の要素へのアクセスにはポイン
タを使用し、また、各要素は100以下であるものとします。
入出力例)
Matrix A
Please input three elements in row#1:285
Please input three elements in row#2:937
Please input three elements in row#3.678
985デフォルトの名無しさん:2005/06/08(水) 02:18:19

A =
(a, b, c)
(d, e, f)
(g, h, i)

の転置って

A^t =
(a, d, g)
(b, e, h)
(c, f, i)

でおk?
986デフォルトの名無しさん:2005/06/08(水) 02:30:11
おk
987デフォルトの名無しさん:2005/06/08(水) 02:37:59
C/C++の宿題を片付けます 45代目
http://pc8.2ch.net/test/read.cgi/tech/1118165596/
988デフォルトの名無しさん
>>984
Please input three elements in row#1:2185
という入力はどう解釈するの?

21, 8, 5
or
2, 18, 5
or
2, 1, 85