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

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

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

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

【前スレ】
C/C++の宿題を片付けます 63代目
http://pc8.2ch.net/test/read.cgi/tech/1143405137/
【過去スレ一覧】
http://makimo.to/cgi-bin/search/search.cgi?q=C%2B%2B%82%CC%8Fh%91%E8&andor=AND&sf=2&H=&view=table&D=tech&shw=2000
0153デフォルトの名無しさん2006/05/04(木) 02:01:22
>>152
お前さ、プログラムのセンスも何もないし
どんな学校かしらないけど辞めたほうがいいと
思うよ。たぶん、OFFICEの検定とかとって
事務職就いた方が幸せになれるし
1年ならどこか別の学校に編入したほうがいいよ
0154デフォルトの名無しさん2006/05/04(木) 04:47:42
>>151
使えないのはお前の頭だろ
>>152
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1817.txt
0155デフォルトの名無しさん2006/05/04(木) 06:08:10

ある宿題のプログラムの抜粋。
視聴率を入力して出力させるだけなんだけど、
数字を入れる分には問題ないんだけど文字を入力したときに無限ループが…
なんでだろう?
本来視聴率に文字もへったくれもないけど気持ち悪いからなんとかしたい…
for(;;)
{
cout << "視聴率をいれてください:";

cin >> TVaichi.AAR;
if(0 <= TVaichi.AAR && TVaichi.AAR <= 100)
{
TVaichi.ShowData();
break;
}
else
{
cout << "数値が不正です" << endl;
}
}
0156デフォルトの名無しさん2006/05/04(木) 06:28:57
>>155
std::getline()でstd::stringに一行取得してから解析すれば?
0157デフォルトの名無しさん2006/05/04(木) 07:05:38
>>156
日本語はなしてくださいよ
0158デフォルトの名無しさん2006/05/04(木) 07:43:16
>>155
数字を期待しているところに文字を投げられて cin が驚いているから。
対処法は >>156
0159デフォルトの名無しさん2006/05/04(木) 09:50:24
後は boost::lexical_castで好きなように調理しろ。
0160デフォルトの名無しさん2006/05/04(木) 10:02:47
scanf("%d", &i); に、整数に解析されない文字列を読み込もうと
したようなものだ。永遠に入力バッファからは読み込まれなくなる。
0161デフォルトの名無しさん2006/05/04(木) 14:21:50
[1] 授業単元: キタ*・゜゚・*:.。..。.:*・゜(゚∀゚)゚・*:.。. .。.:*・゜゚・*!!!!
[2] 問題: arg1、arg2の値で文字列を返すプログラム
[3] 環境
 [3.1] OS: Windows
 [3.2] コンパイラ名とバージョン: Visual Studio 2005 VC8
 [3.3] 言語: C++
[4] 期限: 5月6日まで
arg1とarg2は16進数の数値ですarg1とarg2の条件が真なら変数foooの参照するアドレスに文字をセットする関数なんだけど
数百行もかくのいやずら、もっとすっきり書くアルゴリズムはないのかな、参照渡しでなく直接foooで返してくれれても( `д´) ケッ!構
//fooの定義
void foo(unsigned char arg_1, unsigned char arg_2);
//変数fooの書込むところ(アドレス参照渡し)
char fooo[255];
void foo(unsigned char arg1, unsigned char arg2)
{
if(arg1 == 0x01 && arg2 == 0x00) {
strcpy_s(fooo, "New York");
}
else if(arg1 == 0x01 && arg2 == 0x03) {
strcpy_s(fooo, "Paris");
}
else if(arg1 == 0x02 && arg2 == 0x10) {
strcpy_s(fooo, "London");
}
else {
strcpy_s(fooo, "1, 2byteが不正な値です");
}
//こんな感じで延々数百行続く
return;
}
0162デフォルトの名無しさん2006/05/04(木) 14:28:04
( `д´) ケッ!
0163デフォルトの名無しさん2006/05/04(木) 14:28:47
>>161
日本語でおk
0164デフォルトの名無しさん2006/05/04(木) 14:36:17
条件も曖昧だし何聞きたいのかもさっぱり分からんけど、
適当にテーブル参照にすればいいんじゃねーの。

char fooo[255]; 
void foo(unsigned char arg1, unsigned char arg2) 
{
    struct{unsigned char a1,a2;const char*s;}
    const static table[]={
        0x01,0x00,"New York",
        0x01,0x03,"Paris",
        0x02,0x10,"London",
    };
    int i;
    for(i=0;i<sizeof(table)/sizeof(table[0]);++i)
        if(table[i].a1==arg1&&table[i].a2==arg2){
            strcpy_s(fooo, table[i].s);
            return;
        }
    strcpy_s(fooo, "1, 2byteが不正な値です"); 
}
01651612006/05/04(木) 16:22:50
>>164
凄いな、最後にもう一個だけ教えて、条件は一緒でarg1とarg2が真のとき、返す値が
fooo
foooo
fooooo
といった感じで3つ答えがホスイ場合はどうすんの?
オナガイシマス
//fooの定義
void foo(unsigned char arg1, unsigned char arg2);
//変数fooの書込むところ(アドレス参照渡し)
char fooo[255];
char foooo[255];
char fooooo[255];
void foo(unsigned char arg1, unsigned char arg2)
{
if(arg1 == 0x01 && arg2 == 0x00) {
strcpy_s(fooo, "New York");
strcpy_s(foooo, "Paris");
strcpy_s(fooooo, "London");
}
else if(arg1 == 0x01 && arg2 == 0x03) {
strcpy_s(fooo, "Beijing");
strcpy_s(foooo, "Seoul");
strcpy_s(fooooo, "Pyongyang");
}
else {
strcpy_s(fooo, "1, 2byteが不正な値です");
}
//こんな感じで延々数百行続く
return;
}
0166デフォルトの名無しさん2006/05/04(木) 16:24:53
だめだ、名前付けの仕方がキモくてイライラする
01671612006/05/04(木) 16:38:51
そんなこと言わないでおしえてよ〜ん
なおすからさ
strcpy_s(fooo, "164 is the highest. ");
strcpy_s(foooo, "166 is also the highest.");
strcpy_s(fooooo, "However, 161 is (・∀・) Ii after all.");
0168デフォルトの名無しさん2006/05/04(木) 16:40:13
テーブル伸ばせばいいじゃん。
「arg1とarg2が真のとき」て表現変だよ。
01691612006/05/04(木) 16:43:50
>>テーブル伸ばせばいいじゃん。
そうしたいのも山山だが、知恵がない

>>「arg1とarg2が真のとき」て表現変だよ。
う、うん
漏れもきになっていた、おゆるしたまえ
0170デフォルトの名無しさん2006/05/04(木) 16:45:30
>>169
table を二項目ふやせば?

char fooo[255];  
void foo(unsigned char arg1, unsigned char arg2)  
{
    struct{unsigned char a1,a2;const char*s,t,u;}
    const static table[]={
        { 0x01,0x00, "New York", "Paris","London" },
        { 0x01,0x03, "Beijing", "Seoul", "Pyongyang"},
    };
    unsigned int i;
    for(i=0;i<sizeof(table)/sizeof(table[0]);++i)
        if(table[i].a1==arg1&&table[i].a2==arg2){
            strcpy_s(fooo, table[i].s);
            strcpy_s(foooo, table[i].t);
            strcpy_s(fooooo, table[i].u);
            return;
        }
    strcpy_s(fooo, "1, 2byteが不正な値です");  
}

というか規模が大きくなるようなら、ファイルから読み込むかリソースに汁
01711612006/05/04(木) 17:04:25
>>165
>>170
>>170
Thanks ☆☆** v( ̄ー ̄)v**☆☆ Thanks
修正前  struct{unsigned char a1,a2;const char*s,t,u;}
修正後  struct{unsigned char a1,a2;const char*s, *t, *u;}
これでデキマスタ
お蔭様で半分くらいになったよ
>>というか規模が大きくなるようなら、ファイルから読み込むかリソースに汁
ファイルから読込むは(>Д<)ゝ”ラジャー!!だけど
リソースって、どんなソースデツカ?

0172デフォルトの名無しさん2006/05/04(木) 17:26:48
>>171
お前の書き込み見ると胸糞悪くなるから氏ね
0173デフォルトの名無しさん2006/05/04(木) 17:43:03
日本語が不自由なヤツはプログラミングより先に国語やれと。
0174デフォルトの名無しさん2006/05/04(木) 18:34:25
>>142
入力ほんとに大文字?
0175デフォルトの名無しさん2006/05/04(木) 18:49:27
全角って言いたいのか?
0176デフォルトの名無しさん2006/05/04(木) 19:11:21
まぁ半角全角以前に区切れがないよね
1 2 + 3 4 + *
ってことでしょ
0177デフォルトの名無しさん2006/05/04(木) 23:47:34
>>154
おくれてすみません、ありがとうございました。
これを元に勉強します!!
0178デフォルトの名無しさん2006/05/05(金) 04:05:22
フォートランのソースプログラムを、C言語で読み取って、言語変換したものを画面出力するプログラム教えてください。
0179デフォルトの名無しさん2006/05/05(金) 04:18:28
http://www.google.com/search?hl=ja&lr=lang_ja&ie=UTF-8&oe=UTF-8&q=f2c&num=50
0180デフォルトの名無しさん2006/05/05(金) 04:35:26
>>179
すいません、プログラムではなくて、C言語のソースリストが知りたいです。
0181デフォルトの名無しさん2006/05/05(金) 05:49:21
スレ違い
0182デフォルトの名無しさん2006/05/05(金) 08:40:20
>>180
f2cのソースなら転がってるべ。
0183デフォルトの名無しさん2006/05/05(金) 12:07:03
>>148
すいません、見落としてました。

>>149
ありがとうございました
0184デフォルトの名無しさん2006/05/05(金) 12:28:09
[1] 授業単元:
[2] 問題文:exp(x)をx=0のまわりにテーラー展開し、exp(0.2)を求め、打切り誤差の影響を調べよ
[3] 環境
 [3.1] OS:Windows
 [3.2] コンパイラ名とバージョン:BCC
 [3.3] 言語:C
[4] 期限:GW明けまで
[5] その他の制限:難しいことは習っていないので簡潔にお願いします
0185デフォルトの名無しさん2006/05/05(金) 13:28:34
>>182
見つからないです。教えて下さい。お願いします。
01861822006/05/05(金) 13:38:03
>>185
なぁ、ホントに探したのか?
「f2c」と「ソース」のキーワードでGoogleで検索したら最初の方のページで簡単に拾えたんだけど。
#ってことで、いい加減スレ違いなので後はしらね。
0187デフォルトの名無しさん2006/05/05(金) 17:46:42
>>185
ソース:
ttp://www.netlib.org/f2c/src/
0188デフォルトの名無しさん2006/05/05(金) 23:53:28
>>184
(・∀・)
#include <stdio.h>
int main(void){
double x,y,n,i;
for(x=0.2,y=n=i=1;i<16;y+=x/n,i+=1,n*=i,x*=0.2)printf("%.15f\n",y);
return 0;
}
0189デフォルトの名無しさん2006/05/06(土) 02:13:58
[1] 授業単元: 演習
[2] 問題文:キーボードから10個の整数を入力し、それらの総和、1番大きい数、
2番目に大きい数、1番小さい数、2番目に小さい数を求めて出力するプログラムを作り実行しなさい。
ただし、入力する整数には重複がないものとする
[3] 環境
 [3.1] OS:linux
 [3.2] コンパイラ名とバージョン:gcc
 [3.3] 言語:C
[4] 期限:5/10
[5] その他の制限:特にございません、よろしくおねがいします(・∀・;)
0190デフォルトの名無しさん2006/05/06(土) 02:14:04
>>187
ありがとうごさいます。m(__)m助かりました。
0191デフォルトの名無しさん2006/05/06(土) 02:48:37
>>189
意外といい問題な気がする。自分でも解いてみるべき

#include <stdio.h>
#include <stdlib.h>
#define N 10
int main(void)
{
int nums[N], i, sum = 0, max, sec_max, min, sec_min;
char buf[64];
for ( i = 0; i < sizeof(nums)/sizeof(nums[0]); ++i ) {
printf( "Input an integer (%2d)> ", (i+1) );
fgets( buf, sizeof(buf), stdin );
sum += nums[i] = atoi( buf );
}
max = min = nums[0];
for ( i = 1; i < sizeof(nums)/sizeof(nums[0]); ++i ) {
if ( nums[i] > max ) max = nums[i];
if ( nums[i] < min ) min = nums[i];
}
sec_max = min;
sec_min = max;
for ( i = 0; i < sizeof(nums)/sizeof(nums[0]); ++i ) {
if ( nums[i] > sec_max && nums[i] < max ) sec_max = nums[i];
if ( nums[i] < sec_min && nums[i] > min ) sec_min = nums[i];
}
printf( "sum:%d, max:%d, sec_max:%d, min:%d, sec_min:%d\n",
sum, max, sec_max, min, sec_min);
}
0192デフォルトの名無しさん2006/05/06(土) 02:48:53
>>189
#include <stdio.h>
int main(void){
 int i, j, k, x[10], temp, sum = 0;
 for(i = 0; i < 10; i++){
  scanf("%d", &x[i]);
  sum += x[i];
 }
 for ( i = 0; i < 10 - 1; i++ ) {
  k = i;
  for ( j = i + 1; j < 10; j++ )
   if ( x[k] > x[j] )k = j;
    temp = x[i];
    x[i] = x[k];
    x[k] = temp;
 }
 puts("入力");
 for(i = 0; i < 10;i++)printf("x[%d] = %d\n", i, x[i]);
 printf("min1 = %d, min2 = %d, max1 = %d, max2 = %d, sum = %d\n", x[0], x[1], x[9], x[8], sum);
 return 0;
}

入力値を一度ソートし、表示させるようにしました。
0193デフォルトの名無しさん2006/05/06(土) 03:00:08
[1] 授業単元: プログラミング演習
[2] 問題文:32ビット整数jを引数として受け取り、その右から(k-1)ビット目の値を
関数の値として返す関数int test_bit(int j,int k);を作成し、この関数を用いて、
キーボードから16進数jを一度読み込み、その後10進数kを読み込み、jの右から(k-1)ビット目が
1か0か表示するプログラムを作成せよ。
[3] 環境
 [3.1] OS:WindowsXP
 [3.2] コンパイラ名とバージョン:gcc
 [3.3] 言語:C
[4] 期限:5/7
よろしくお願いします。
0194デフォルトの名無しさん2006/05/06(土) 03:06:11
>>189
ソート使うならqsort使うのがスマートかと。

http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1823.txt
0195デフォルトの名無しさん2006/05/06(土) 03:17:03
10個ぐらいのデータ数じゃどのアルゴリズム使っても大差ないと思う
0196デフォルトの名無しさん2006/05/06(土) 03:22:51
>>195
速度のことは問題にしてないよ。
使えるものは使いましょう、ってこと。
0197デフォルトの名無しさん2006/05/06(土) 03:40:16
>>193
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1824.txt

参考) ttp://www.bohyoh.com/CandCPP/FAQ/FAQ00034.html
0198デフォルトの名無しさん2006/05/06(土) 03:45:52
>>193
#include <stdio.h>
int test_bit(int j,int k) {
  unsigned int m=(unsigned int)j;
  while(--k) m=m>>1;
  return m%2;
}
void main() {
  int j,k;
  scanf("%x",&j); scanf("%d",&k);
  printf("%d\n",test_bit(j,k));
}
0199デフォルトの名無しさん2006/05/06(土) 03:56:50
>>197-198
どうもありがとうございます。
02001982006/05/06(土) 04:02:27
シフト32回しても、コンパイラによってしなかったことにされるんだな。
知らんかった。

(参照)
スレッドを立てるまでもない質問雑談スレ23
http://pc8.2ch.net/test/read.cgi/prog/1139729337/963-964
0201デフォルトの名無しさん2006/05/06(土) 04:17:49
>200
シフト、ローテート時に32の余りになるのって、コンパイラじゃ無くて、CPUの問題じゃなかった?
CPUの判別に使われてた気が。
02022012006/05/06(土) 05:24:14
自己レス。
8086は実際にシフト、ローテートを行う。
80186以降は最大31で下位5ビットのみ有効(32回は0回になる)。
その為、同じコードであっても実行結果が異なる場合がある。
mov al,01h
mov cl,20h
shr al,cl ;al=0(8086)/al=1(80186)
0203デフォルトの名無しさん2006/05/06(土) 09:11:41
>>196
バブルの方が宿題の回答っぽくていいじゃないかw
0204デフォルトの名無しさん2006/05/06(土) 10:49:17
初心者らしさを強調するために、コメント欄に「バビルソートを使いました」
とか入れておくか。クオークソートとか。
0205デフォルトの名無しさん2006/05/06(土) 11:03:00
>>188
ありがとうございます
02061982006/05/06(土) 11:10:46
>>202
なるほど、CPUですか。
参考になります。
個人的には32回は1回を32回繰り返してることになるから、
結果が0になるほうがいいなあ
0207デフォルトの名無しさん2006/05/06(土) 15:10:55
単元名:プログラミングC
問題文:(1)三つの数n,m,lのうち2個以上当てた場合(順番は不問)当選するくじびきのプログラムを作りなさい。
    (2)整数の四則演算が出来る電卓を作りなさい。演算子は次で指定するものとする。 +:1 -:2 *:3 /:4 終了:0
    (3)x^3 - 2x^2 - x + 2 = 0の解を二分法で求めるプログラムを作りなさい。
     根(解)を一つだけ挟む適当な区間[x0,x1]を選定すれば、f(x0)・f(x1)<0である。
     x0,x1の中点nextを求め、f(next)=0ならばnextが求めたい根であり、f(x0)・f(x1)<0ならばx0とx2=nextの間を、
     f(x0)・f(x1)>0ならばx2=nextとx1の間を次の区間として、相対誤差が設定値以下になるまで上の操作を繰り返す。
環境:OS→Windows XP
   コンパイラ→gcc
   言語→C
期限:出来れば今日中に
その他:問題文は上記にあるもので全部です。それぞれの問題同士の関係はありません。制御文、論理演算子などはやっていますが、関数はmainやscanfくらいしかやっておらずあまり難しいことは出来ません。よろしくお願いします。
0208デフォルトの名無しさん2006/05/06(土) 16:03:39
>>207
時間無いので(1)だけ。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1825.txt
qsort使うのが嫌だったら、バブルソートにでも変えて下さい。
02092082006/05/06(土) 16:21:09
・乱数は1〜10を生成するようにしています。
→32bit整数の全範囲の乱数を使ったら、当たる訳ないんで。

・乱数生成範囲を変えたければ、rand( )%10 + 1を適宜変えて下さい。
→本当は定数定義するべきだった。今は反省している。

・バブルソートに変える方法
ttp://www.google.co.jp/search?hl=ja&q=%E3%83%90%E3%83%96%E3%83%AB%E3%82%BD%E3%83%BC%E3%83%88&lr=lang_ja
簡単に出来ますので、頑張ってください(変えるなら)
関数化して、qsortを使ってる部分を書き換えるのが一番良いと思います。
0210デフォルトの名無しさん2006/05/06(土) 17:01:04
[1] 授業単元: C演習
[2] 問題文:文字列str内の全ての数字文字を削除する関数
      void del_digit(char str[])
      を作成せよ(たとえば"AB1C9"を受け取ったら、"ABC"とする)。
[3] 環境
 [3.1] OS:Windows XP
 [3.2] コンパイラ名とバージョン:Visual C++ 2005
 [3.3] 言語:C
[4] 期限:5/8
 よろしくお願いします。
0211デフォルトの名無しさん2006/05/06(土) 17:08:45
すみません。>>75さんと投稿問題が被っていましたorz
0212デフォルトの名無しさん2006/05/06(土) 17:16:46
(・∀・)ニヤニヤ
0213デフォルトの名無しさん2006/05/06(土) 17:27:15
>>207
(2)
#include <stdio.h>

int main()
{
    int l, r, enzanshi;
    scanf("%d", &l);
    while(1)
    {
        scanf("%d", &enzanshi);
        scanf("%d", &r);
        switch(enzanshi)
        {
            case 1:
                l+=r;
                break;
            case 2:
                l-=r;
                break;
            case 3:
                l*=r;
                break;
            case 4:
                l/=r;
                break;
        }
        printf("%d\n", l);
    }
}
0214デフォルトの名無しさん2006/05/06(土) 17:56:56
質問なのですが、実験の課題で高速フーリエ変換のプログラムリストの一部の
フーリエ係数の計算
For J2=0 To m
acl(J2, 0) = l/n * UV(0) * Cos(J2 * Pi / Thalf * THEA(0))
acl(J2, n) = l/n * UV(n) * Cos(J2 * Pi / Thalf * THEA(n))
acl(J2, 0) = l/n * UV(0) * Cos(J2 * Pi / Thalf * THEA(0))
acl(J2, n) = l/n * UV(n) * Cos(J2 * Pi / Thalf * THEA(n))
For J3 = 1To n - 1
acl(J2,J3) = 2/n * UV(J3) * Cos(J2 * Pi / Thalf *THEA(J3))
bcl(J2,J3) = 2/n * UV(J3) * Cos(J2 * Pi / Thalf *THEA(J3))
NEXT J3
For J4 = 0 To n
aclsam(J2) = aclsam(J2) + acl(J2, J4)
bclsam(J2) = aclsam(J2) + bcl(J2, J4)
Next J4
a(J2) = aclsam(J2)
b(J2) = bclsam(J2)
Worksheets("fft").Cells(11, 4) = J2 '計算カウンタ
Next J2
という部分の意味を考えるという課題が出たのですがよくわかりません。
詳しい方がいたら教えてください。ちなみに高調波解析の時使用したプログラムです

0215デフォルトの名無しさん2006/05/06(土) 17:59:55
これは難解なC/C++だな。
0216デフォルトの名無しさん2006/05/06(土) 18:03:38
ダメだ、漏れにはその断片がCにもC++にも見えないよ。
0217デフォルトの名無しさん2006/05/06(土) 18:08:30
あえて言おう、スレ違いだと
0218デフォルトの名無しさん2006/05/06(土) 18:26:52
>>207 (3)
#include <stdio.h>
#include <math.h>
#define EPS .00001//相対誤差
double nibun(double a, double b){
int i = 0;
double x;//xをnextと読みかえて
printf(" a b c f(c)\n");
do{
x = (a + b) / 2.0;
if((func_y(x) * func_y(a)) < 0)b = x;
else a = x;
printf("%02d : %6.3lf %6.3lf %6.3lf %6.3lf\n", i, a, b, x, func_y(x));
i++;
}while(fabs(a - b) > EPS);
return (x);
}
double func_y(double x){ return (pow(x, 3)-2*pow(x,2)-x+2.0); }
int main(void){
double a, b, x;//a,bをx0,x1と読みかえて
printf("範囲の左の値を入力してください.\n");
scanf("%lg",&a);
printf("範囲の右の値を入力してください.\n");
scanf("%lg",&b);
printf("x^3 - 2x^2 - x + 2 = 0の二分法による数値計算\n");
printf("初期値a=%6.3lf\n",a);
printf("初期値b=%6.3lf\n",b);
x = nibun(a, b);
printf("近似解x=%6.3lf\n",x);
return 0;
}
0219デフォルトの名無しさん2006/05/06(土) 18:53:13
[1] 授業単元:情報演習
[2] 問題文(含コード&リンク): 2つの16進数の数を読み込み、掛け算を行い
答えと計算過程を表し表示するプログラムを作ってください。
[3] 環境
 [3.1] OS:Linux
 [3.2] コンパイラ名とバージョン:gcc
 [3.3] 言語: C
[4] 期限: 5月8日まで
例:(16進数で最低8桁かける8桁がで
    a
×  1a
------------------
 64
a
------------------
104
0220sage2006/05/06(土) 20:23:26
[1] 授業単元: C言語
[2] 問題文(含コード&リンク):
 2分探索プログラムbinary_searchを元にして、
 入力したデータを昇順に整列されたデータの正しい位置に追加する関数add_dataを作成、
 binary_searchを改良しプログラム完成させなさい。
 http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1827.txt
[3] 環境
 [3.1] OS: WindowsXP
 [3.2] コンパイラ名とバージョン:Borland C++Compiler
 [3.3] 言語: C
[4] 期限: 明日までに提出
[5] その他の制限:
関数add_dataの仕様
【呼び出し形式】int add_data(int *data, int data_num, int add_data)
【 引 数 】int *data : データを格納してある配列の先頭ポインタ
int data_num : 配列に格納してあるデータの個数
int add_data : 追加するデータ
【 戻 値 】追加に成功したとき : SUCCESS
すでに同じデータが存在するとき : FAIL

add_dataからbinary_searchを呼び出す方式です。
あと、binary_searchは自作なので、不備があるかもしれません。
なので自由に改良していただいて結構です。

自力で取り組んだのですが、どうしても完成させることができませんでした。
よろしくお願いします。
0221デフォルトの名無しさん2006/05/06(土) 20:28:22
>>219
#include <stdio.h>

int main()
{
    char num1[9], num2[9], fmt[10];
    unsigned long long inum1, inum2, sum;
    int space=16;
    scanf("%s", num1);
    scanf("%s", num2);
    sscanf(num1, "%llx", &inum1);
    sscanf(num2, "%llx", &inum2);
    sum=inum1*inum2;

    printf(" %16llx\n", inum1);
    printf("x%16llx\n", inum2);
    printf("-----------------\n");
    if (inum2>15)
    {
        while(inum2!=0)
        {
            sprintf(fmt, " %%%dx\n", space--);
            printf(fmt, inum1*(inum2%16));
            inum2=inum2/16;
        }
        printf("-----------------\n");
    }
    printf(" %16llx\n", sum);
}
0222お願いします ◆/Ev6wa/Oy2 2006/05/06(土) 20:39:04
[1] 授業単元: プログラミングC
[2] 問題文(含コード&リンク):
百桁の整数の四則演算のプログラムを配列使用のみとポインタ使用版を各1ずつ作成せよ。
[3] 環境
 [3.1] OS: windows xp
 [3.2] コンパイラ名とバージョン: Visual studio.net2003
 [3.3] 言語: C++
[4] 期限: 5月11日まで
[5] その他の制限:配列、if、while、gets、puts、ポインタを学習済み
ライブラリはstdio.hのみ。
開始時のDOS窓で演算する数字を入力してchar型の配列に代入、それをint型の変数に変換して計算する。
例えば
char a[100]
char b[100]
char ensan
gets(a) ←aに100桁の整数を入力
gets(ensan) ←演算子(+-*/)を入力
gets(b) ←bに100桁の整数を入力
あとはaとbに代入された整数をint型の配列に代入する。四則演算の種類はensanに代入された演算子によって決定する。
結果の表示はprintfを使用する。

加算の答えは最大101桁まで。減算は結果によってはマイナスいくつと表示できるようにする。
乗算の答えは最大1万桁まで。除算は商と余りを表示すること。
0223デフォルトの名無しさん2006/05/06(土) 21:17:43
>>220 #include <string.h>
int binary_search (int *data, int data_no, int key_data)
{
    int right, left, center;
    left = 0;
    right = data_no - 1;
    
    while (right >= left){
        center = (left + right) / 2;
        
        if (data[center] == key_data){
            return (-1);
        }
        else if(data[center] < key_data){
            left = center + 1;
        }
        else if(data[center] > key_data){
            right = center - 1;
        }
    }
    return(left);
}
int add_data(int *data, int data_num, int add_data){
    int pos;
    if ( (pos=binary_search (data, data_num, add_data)) == -1)
    {
        return FAIL;
    }
    memmove(&data[pos+1], &data[pos], (data_num-pos)*sizeof(data_num));
    data[pos]=add_data;
    return SUCCESS;
}
0224デフォルトの名無しさん2006/05/06(土) 21:36:18
>>210
#include <stdio.h>
#include <ctype.h>
void del_digit(char *str)
{
char *from, *to;
for (from = to = str; *from; from++)
if (!isdigit(*from))
*to++ = *from;
*to = '\0';
}
int main( void )
{
char buf[] = "This 7is a32 test.123";
del_digit( buf );
puts( buf );
}
02252242006/05/06(土) 21:41:16
あ、解答済か。失礼。
0226デフォルトの名無しさん2006/05/06(土) 21:52:08
[1] 授業単元:演習
[2] 問題文:以下のデータをファイルから入力し,
      データは構造体の配列として持つ.
      (int番号,char[10]名前,int年齢)
      平均点を求める関数を使って,構造体に追加する.
      (番号,名前,年齢,平均年齢)
      <file.txt>
      1,hiroyuki,26
2,mona,34
      3,morara,35
...
      10,dokuwo,29  10個のデータ

[3] 環境
 [3.1] OS:Linux
 [3.2] コンパイラ:cc
 [3.3] 言語:C
[4] 期限:2006年05月09日14:40まで
[5] freadを使用してファイルから入力するという制限があります.
0227デフォルトの名無しさん2006/05/06(土) 22:23:11
>>221
お礼遅くなってしまってすみません。本当にありがとうございました。
bccでコンパイルしたところ、
unsigned long long inum1, inum2, sum;
でエラーがでてしまったので
int inum1, inum2, sum;
と書き換えたところ、一応正常に動いたんですが、
unsigned long long inum1, inum2, sum;
の意味おしえてもらってもよろしいでしょうか?なんか抽象的な質問で
すみません。面倒でしたらスルーしてもらって結構です。
0228デフォルトの名無しさん2006/05/06(土) 23:21:56
>226

構造体の中身は何が必要なの?
平均点っていうのがわからないです。
10人分のデータを入力し終わった後に平均点を追加するのですか?
0229sage2006/05/06(土) 23:32:01
>>223

どうもありがとうございます。
0230デフォルトの名無しさん2006/05/06(土) 23:54:44
>228
すいません。補足します。
構造体の中身は、
int型で番号
char[10]で名前
int型で年齢です。

誤:平均点
正:平均年齢
書き間違えました。

入力後に平均点を追加したいと思っています。
ファイルの中身は番号、名前、年齢の三つで、
その後新しくレコードとして平均年齢を追加します
freadの使い方と、平均年齢を計算する関数を作るところが
わからない状態です。
お願いします。
0231デフォルトの名無しさん2006/05/07(日) 00:06:09
>>230
まだ言ってること(レコード)が分からないので、適当な例となるファイル内容と
出力結果(それがファイルになるというならそういうことも)書いて。

あと、また平均点って書いてる。
02322072006/05/07(日) 00:14:19
回答ありがとうございます。

>>208-209
現在リンク先が見れない状況ですので明日にも見させて頂きます。

>>213
計算は問題無く出来ました。
0を入力しプログラムを終了させる際の処理は自分で考えてみます。

>>218
<math.h>や#define〜は習っていないのですが、それはどのように代用がきくでしょうか?
やはり地道に計算式を記述するべきでしょうか?
0233デフォルトの名無しさん2006/05/07(日) 00:19:58
>>227
そのコードはunsigned long longをunsigned longにして、
scanfの書式を%lxにすればbcc/gccのどっちでも使えるコードになる。

unsigned long long型は最新のC99という規格で定められている符号無し整数型。
少なくとも64ビット以上あることが規定されている。(現在のところ殆どの実装では64ビット)

C99に対応しているコンパイラは少ないが、少なくともgccは対応している。
BCCはC99非対応。実用には代わりにunsigned __int64という64ビットの符号無し整数型がある。
0234デフォルトの名無しさん2006/05/07(日) 00:23:48
>>232
君が言ったやつを使わないバージョン。
main関数は変更なし。
コンパイルしてないから動くかわからないけど。
これで上のソースと同じ答えか試してみて。
駄目だったら書き直す。

#include <stdio.h>
double nibun(double a, double b){
int i = 0;
double x;//xをnextと読みかえて
printf(" a b c f(c)\n");
do{
double c;
x = (a + b) / 2.0;
if((func_y(x) * func_y(a)) < 0)b = x;
else a = x;
printf("%02d : %6.3lf %6.3lf %6.3lf %6.3lf\n", i, a, b, x, func_y(x));
i++;
c=a-b;
if(c<0)
c*=-1.0;
}while(c > .00001);
return (x);
}
double func_y(double x){ return (pow(x, 3)-2*pow(x,2)-x+2.0); }
0235デフォルトの名無しさん2006/05/07(日) 00:30:21
つpowもたぶん数学関数
0236デフォルトの名無しさん2006/05/07(日) 00:33:59
>>235
……そうだった。見落としてた。
>>232
すまん、>>234のやつは間違いだ。
0237デフォルトの名無しさん2006/05/07(日) 00:37:44
double func_y(double x){
return (x * x * x - 2 * x * x - x + 2);
}
をnibun関数の前に書けばおk
0238デフォルトの名無しさん2006/05/07(日) 00:55:07
>231
>まだ言ってること(レコード)が分からないので、適当な例となるファイル内容と
>出力結果(それがファイルになるというならそういうことも)書いて。

ファイルは番号,名前,年齢があって、改行という形です
1,hiroyuki,26
2,nantoka,34
3,aaaaaa,40

10,bbbbb,48
それが10行、10人分あります。
ファイルから番号、名前、年齢を入力し、平均年齢を計算して構造体に追加します
<構造体の形式>
int 番号
char[10] 名前
int 年齢
float 平均年齢

出力結果は番号をキーボードから入力すると、
その人物のデータと平均年齢を出力します
<実行結果>
番号入力→1
番号:1
名前:hiroyuki
年齢:26
平均年齢:35.5


>あと、また平均点って書いてる。
orz
すいませんでした。
よろしくお願いします。
0239デフォルトの名無しさん2006/05/07(日) 01:00:51
>>238
構造体の形式おかしくね?
一回しか必要なfloatの要素を態々配列にもたす必要あるの?

typedef struct person_data{
int number;
char name[10];
int age;
}person_data_t;

typdef struct data{
person_data_t person *;
float age_avg;
}data_t;

これでいいんじゃねぇの?
0240デフォルトの名無しさん2006/05/07(日) 01:13:32
>>239
今後の課題で使い回す(まさに平均点として)ためでは?
0241デフォルトの名無しさん2006/05/07(日) 01:29:34
>239
回答ありがとうございます
構造体に平均年齢を入れて(追加して)みてといわれまして。
無駄というか、おかしいんですかね?
ちょっと考えてみます。
0242デフォルトの名無しさん2006/05/07(日) 01:37:09
>>241
言い方悪かったかもしれないけど
10人分のデータを格納する構造体には平均年齢という要素必要かどうか考えて欲しい
だよね。データの中でどんな要素をまとめるべきか考えて欲しいんだよね
0243デフォルトの名無しさん2006/05/07(日) 01:38:06
>>234
ありがとうございます。
>>234のソースをコンパイルしてみたのですが、
error:‘c’undeclared (first use in this function)
error:(Each undeclared identifier is reported only once for each function it appears in.)
とエラーが出ました。
if(c>.00001)に関してのエラーのようなのですが…
0244デフォルトの名無しさん2006/05/07(日) 01:48:49
>>243
cの宣言をxと一緒に
double c, x;
とすれば多分おk
0245デフォルトの名無しさん2006/05/07(日) 01:53:43
>242
わかりました
最初から考え直してみます。
ありがとうございました
0246デフォルトの名無しさん2006/05/07(日) 01:55:02
>>243
あぁ、すまんかった。>>244の言うとおりにすればなるよ。
0247デフォルトの名無しさん2006/05/07(日) 02:23:52
【質問テンプレ】
[1] 授業単元: プログラム基礎�T
[2] 問題文(含コード&リンク):3以上の整数xと、
x個の実数を読み込み、その平均値を小数点第二まで求め、
さらに入力した実数の中で大きいものから順に3つまで表示する
プログラムを作成せよ

[3] 環境
 [3.1] OS: Vine Linux 3.2 
 [3.2] コンパイラ名とバージョン: gcc 3.4.3
 [3.3] 言語: C
[4] 期限: 5/8
[5] その他の制限:if文、for文についてまで習いました
            配列使用不可
0248デフォルトの名無しさん2006/05/07(日) 02:43:14
>>247
この下にソースをはる。
あとは適宜自分で修正してくれ。
0249デフォルトの名無しさん2006/05/07(日) 02:43:47
#include<stdio.h>

int main(void)
{
int x,i;
double avg=0,max1,max2,max3;

scanf("%d",&x);
max1=max2=max3=0;
for(i=0;i<x;i++)
{
double t;
scanf("%lf",&t);
avg+=t;
if(max1<t)
{
max3=max2;
max2=max1;
max1=t;
}
else if(max2<t)
{
max3=max2;
max2=t;
}
else if(max3<t)
max3=t;
}
printf("%.2lf\n%lf\n%lf\n%lf\n",avg/x,max1,max2,max3);

return 0;
}
0250デフォルトの名無しさん2006/05/07(日) 02:46:14
すまん、ちょっと修正。

#include<stdio.h>

int main(void)
{
int x,i;
double avg=0,max1=0,max2=0,max3=0;
scanf("%d",&x);
for(i=0;i<x;i++)
{
double t;
scanf("%lf",&t);
avg+=t;
if(max1<t)
{
max3=max2;
max2=max1;
max1=t;
}
else if(max2<t)
{
max3=max2;
max2=t;
}
else if(max3<t)
max3=t;
}
printf("%.2lf\n%lf\n%lf\n%lf\n",avg/x,max1,max2,max3);

return 0;
}
0251デフォルトの名無しさん2006/05/07(日) 03:48:13
[1] 授業単元: C言語入門演習
[2] 問題文(含コード&リンク): 1から10000までの整数の乱数をx個発生させ、
そのx個の整数が素数であるかどうかを判別するプログラムを作れ
[3] 環境
 [3.1] OS: Linux
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C
[4] 期限: 5/10
[5] その他の制限: 少し上の方と同じく、if,for,while文までやっています
0252デフォルトの名無しさん2006/05/07(日) 03:50:59
>>247
for文の中
double t;
scanf("%lf", &t);
avg += t;
switch(i){
case 0:
max1 = t;
case 1:
if(max1 < t){max2 = max1;max1 = t;}
else max2 = t;
break;
case 2:
if(max2 < t){
if(max1 < t){max3 = max2;max2 = max1;max1 = t;}
else{max3 = max2;max2 = t;}}
else{max3 = t;}
break;
default:
if(max1 < t){max3 = max2;max2 = max1;max1 = t;}
else if(max2 < t){max3 = max2;max2 = t;}
else if(max3 < t) max3 = t;}
たぶんコレで負値もいけると思うんだけど
switch文分かるのかなという一抹の不安が
で、でも、if文に置き換えるぐらいできるよね
■ このスレッドは過去ログ倉庫に格納されています