[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 04/05 20:54 / Filesize : 366 KB / Number-of Response : 964
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

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



1 名前:デフォルトの名無しさん [2008/10/01(水) 07:28:51 BE:151474728-PLT(18888)]
あなたが解けない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] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々)

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

前スレ
C/C++の宿題を片付けます 115代目
pc11.2ch.net/test/read.cgi/tech/1217741118/

228 名前:デフォルトの名無しさん mailto:sage [2008/10/12(日) 03:31:35 ]
public: // ユーザー宣言
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

これがUnit1.hね

それからUnit1.cpp

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
OpenDialog1->Execute();
Fname1 = OpenDialog1->FileName;
Edit1->Text = Fname1;
}

229 名前:デフォルトの名無しさん mailto:sage [2008/10/12(日) 03:32:24 ]
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
OpenDialog1->Execute();
Fname2 = OpenDialog1->FileName;
Edit2->Text = Fname2;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
OpenDialog1->Execute();
Fname3 = OpenDialog1->FileName;
Edit3->Text = Fname3;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button4Click(TObject *Sender)
{
std::ifstream ifs[3];

ifs[0].open(Fname1.c_str());
ifs[1].open(Fname2.c_str());
ifs[2].open(Fname3.c_str());
for (int i = 0; i < 6; i++) {
double sum, t1, t2, t3;

ifs[0] >> t1;
ifs[1] >> t2;
ifs[2] >> t3;
sum = (t1 + t2 + t3) / 3;
Memo1->Lines->Add(AnsiString(sum));
}
}

230 名前:213 mailto:sage [2008/10/12(日) 03:59:24 ]
>>227>>228>>229
ありがとうございました!
おかげで正しく算出することができました><

231 名前:デフォルトの名無しさん mailto:sage [2008/10/12(日) 04:15:13 ]
[1] 授業単元:アルゴリズム
[2] 引数nに対して、1/nの小数表示を逆配列と動的配列を用いた形でプログラムせよ
  kk.kake.info.waseda.ac.jp/ads08/Cbasics/one-n-th.html
[3] 環境
 [3.1] OS: Windows
 [3.2] cygwin gcc 3.4
 [3.3] 言語: C
[4] 期限: [2008年10月12日00:00まで]
[5] 特になし

全然わかりません……どなたか助けて頂けると幸いです……

232 名前:デフォルトの名無しさん mailto:sage [2008/10/12(日) 13:29:10 ]
>>231
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7778.c

233 名前:デフォルトの名無しさん mailto:sage [2008/10/12(日) 14:05:25 ]
>>232
動きました!
あぁ…なんといっていいやら……ありがとうございます!!
これからプログラムの挙動について考えてみたいと思います


234 名前:デフォルトの名無しさん mailto:sage [2008/10/12(日) 20:21:40 ]
てs

235 名前:デフォルトの名無しさん [2008/10/12(日) 21:59:38 ]
[1] 授業単元:アルゴリズムとデータ構造
[2] 問題文(含コード&リンク):任意の長さの文字列(英字のみ)データをファイルから読み込み(ファイル名をキーボードから入力して読み込ませる)、辞書順に並べ替えて最終結果のみを表示するプログラムを作成せよ。
ただし、データは改行で区切られており、文字列の最大長を64文字、データの最大個数を1000個(1000行)とする。
[3] 環境
 [3.1] OS:Windows
 [3.2] コンパイラ名とバージョン: gcc (バージョン不明です)
 [3.3] 言語: C言語
[4] 期限: 2008年10月14日23:59まで
[5] その他の制限: バブルソートの基本らしいのですが…str〜、getsなど使用する関数や、とりあえず、配列とポインタを使わないといけないんだろう、など断片的なものにしか自信が、持てずプログラムを組んでみたものの実行できません…orz
助けてください…。


236 名前:デフォルトの名無しさん mailto:sage [2008/10/12(日) 22:05:11 ]
>>235
問題文には含んでないけど
結局バブルソートは自分で書かなきゃだめなのか?
平たくいえばqsortとstrcmp使っていいか?




237 名前:デフォルトの名無しさん mailto:sage [2008/10/12(日) 22:15:10 ]
>>236
qsortという関数はまだ習っていないのでなるべく控えたいのですが、strcmpは自分がプログラムを組んでみた時にも使用しましたので使っていただいて大丈夫です。
早速ありがとうございます。

238 名前:デフォルトの名無しさん mailto:sage [2008/10/12(日) 22:31:36 ]
>>235
#include<stdio.h>
#include<string.h>
#define WORD_NUM_MAX 1000
#define WORD_LEN_MAX 64
int main(void){
char word[WORD_NUM_MAX][WORD_LEN_MAX+1+1], tmp[WORD_LEN_MAX+1], *p;
char filename[256];
int i, j, word_num;
FILE *fp;
printf("Input filename : ");
scanf("%255[^\n]", filename);
if((fp=fopen(filename, "r"))==NULL) return 1;
for(word_num=0;word_num<WORD_NUM_MAX;word_num++){
if(fgets(word[word_num], sizeof(word[0]), fp)==NULL) break;
if((p=strchr(word[word_num], '\n'))!=NULL) *p='\0';
}
fclose(fp);
for(i=0;i<word_num;i++){
for(j=0;j+1<word_num-i;j++){
if(strcmp(word[j], word[j+1])>0){
strcpy(tmp, word[j]);
strcpy(word[j], word[j+1]);
strcpy(word[j+1], tmp);
}
}
}
for(i=0;i<word_num;i++) puts(word[i]);
return 0;
}

239 名前:デフォルトの名無しさん [2008/10/12(日) 23:21:54 ]
[1] 授業単元:c++ builder
[2] 3科目4人分の得点と科目ごと、個人ごとの平均点を配列を使って作れって
[3] 環境
 [3.1] OS:windows xp
 [3.2] コンパイラ名とバージョン: c++ builder5
 [3.3] 言語: どちらでも可
[4] 期限:2008年10月13日まで



240 名前:デフォルトの名無しさん mailto:sage [2008/10/12(日) 23:57:56 ]
>>239
とりあえずgccでは動いた。

#include <stdio.h>

int main(int argc, char *argv[]) {
int score[4][3] = {{90,73,82},{60,50,55},{71,59,80},{95,88,80}};
int i,j;

double personAvg[4];
double classAvg[3];

printf("人別平均\n");

for(i=0; i<4; i++) {
for(j=0; j<3; j++) {
personAvg[i] += score[i][j];
}
personAvg[i] /= 3;
printf("%f\n", personAvg[i]);
}

printf("科目別平均\n");

for(j=0; j<3; j++) {
for(i=0; i<4; i++) {
classAvg[j] += score[i][j];
}
classAvg[j] /= 4;
printf("%f\n", classAvg[j]);
}
}

241 名前:デフォルトの名無しさん [2008/10/13(月) 00:07:50 ]
>240
ありがとうございました・・・

世の中すてたもんじゃないっておもいました・・
本当に困ってたので・・・

242 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 00:17:33 ]
>>241
妙な授業単元に問題文
ついでに抜けてる部分を修正できると思えない人間
言葉からにじみ出てくる、「俺は悪くないよ」オーラ
世の中ろくなもんじゃないよ

243 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 00:28:25 ]
それは本当の優しさなのだろうか。



244 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 00:53:39 ]
下記の問題をやっていただける方いませんか?よろしくお願いします
[1]
情報処理
[2]
ある自然数nがある。
このnを和に分解するすべての場合を列挙しなさい。
なお、以下の例のように順列でも組み合わせでもかまわない。

n = 4
1 1 1 1
1 1 2
1 2 1
1 3
2 1 1
2 2
3 1

n = 4
1 1 1 1
1 1 2
1 3
2 2
3 1

[3]
 [3.1] Linux
 [3.2] gcc4.0
 [3.3] C言語
[4]
10月15日23:59
[5] 再帰について習いました

245 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 01:18:06 ]
>>244
#include<stdio.h>
#define N_MAX 100
int g_result[N_MAX];
void bar(int result_num, int n){
int i;
if(n<=0){
for(i=0;i<result_num;i++) printf(" %d", g_result[i]);
printf("\n");
return;
}
for(i=1;i<=n;i++){
g_result[result_num]=i;
bar(result_num+1, n-i);
}
}

void foo(int n){
int i;
if(n>N_MAX) return;
for(i=1;i<=n-1;i++){
g_result[0]=i;
bar(1, n-i);
}
}
int main(void){
int n=4;
printf("n = %d\n", n);
foo(n);
return 0;
}

246 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 02:55:57 ]
じゃあ僕は組み合わせで。

#include<stdio.h>
#include<string.h>
int partition(int n,int m,char *exp);
int main(void){
int i,n,c;
do{
printf("nを入力してください。 n=");
scanf("%d",&n);
c=0;
for(i=n;i>0;i--) c += partition(n,i,"");
printf("Total:%d\n",c);
}while(n != 0);
return 0;
}
int partition(int n,int m,char *exp){
int i,c=0;
char ex[100]="";
if(n==m){
printf("%s%d\n",exp,m);
return 1;
}
if(m==0) return 0;
if(n>m){
sprintf(ex,"%s%d+",exp,m);
for(i=m;i>0;i--) c += partition(n-m,i,ex);
return c;
}
return 0;
}



247 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 02:57:17 ]
>>245
どうもありがとうございました。

248 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 02:58:05 ]
>>246
こちらもどうもありがとうございました。

>>245,246
ソースを理解していきたいです。

249 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 11:00:03 ]
どなたか >>205 お願いできませんでしょうか・・

250 名前:デフォルトの名無しさん [2008/10/13(月) 12:54:17 ]
[1] 授業単元: C
[2] 問題文(含コード&リンク):
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7781.txt
[3] 環境
 [3.1] OS: WindowsXP 
[3.2] コンパイラ名とバージョン:VB2008
 [3.3] 言語: C++
[4] 期限: 10/14まで
[5] その他の制限: 特になし。

どなたか、お願いします。

251 名前:デフォルトの名無しさん [2008/10/13(月) 14:09:18 ]
>>249
ネットでぱくれ

252 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 14:34:26 ]
2次方程式ax^2+bx+cの根を計算するプログラムをかきなさい。

という問題です。
//二次方程式の根を計算するプログラム
#include <stdio.h>
void main () {
double a, b, c, d;
printf("3つの数字を入力してください");
scanf("%d %d %d", &a ,&b ,&c);
d = b*b-4*a*c;
printf("二次方程式の根は%d\n",d);
}

のように書いたのですがすべて答えが同じになってしまいます
お願いします。

253 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 14:36:35 ]
%d →%f

254 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 14:38:04 ]
>>252
> 2次方程式ax^2+bx+cの根を計算するプログラムをかきなさい。
>
> という問題です。
> //二次方程式の根を計算するプログラム
> #include <stdio.h>
> void main () {
> double a, b, c, d;
> printf("3つの数字を入力してください");
> scanf("%d %d %d", &a ,&b ,&c);
> d = b*b-4*a*c;
> printf("二次方程式の根は%d\n",d);
> }
>
> のように書いたのですがすべて答えが同じになってしまいます
> お願いします。

> scanf("%d %d %d", &a ,&b ,&c);
scanf("%lf %lf %lf", &a ,&b ,&c);

> printf("二次方程式の根は%d\n",d);
printf("二次方程式の根は%f\n",d);


255 名前:235 [2008/10/13(月) 16:30:13 ]
>>238
お礼が遅れてすいません、ありがとうございます。
…しかしながら…自分の説明不足のせいで大変申し訳ないのですが、
問題文中の「辞書順」=「大文字小文字も区別する」ということなのです…。
つまり、
A<a<B<b<C<c<D<d<・・・・・・・・・・・・・<X<x<Y<y<Z<z
このように並べ替えたいのです。
>>238さんのプログラムを参考に自分でももう少し考えてみますが、あまり自信がないので手助けしていただけたら幸いです…。

大変申し訳ないです。

256 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 17:26:45 ]
>>253
>>254
ありがとうございます。

どうやら自分が勘違いしてたようで根は二次方程式の解そのものみたいです。
少し自分でも書きなおしてみましたが教科書には
a=0の場合は1次方程式,b=0かどうかをチェックする必要がある。
二次方程式は判別式の符号をチェックする必要があるとかいてありそれがよくわかりません。
よろしくおねがいします。

#include <stdio.h>
#include <math.h>
void main () {
double a, b, c, d;
printf("3つの数字を入力してください");
scanf("%lf %lf %lf", &a ,&b ,&c);
d = sqrt(b*b-4*a*c);
printf("二次方程式の根は%lf,%lf\n",-b+d/2*a,-b+d/2*a);
}





257 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 17:38:24 ]
>>256
判別式が負だったらどうすればいいの
解なしと表示するのか虚数まで表示するのか


258 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 17:59:25 ]
>>257
虚数表示でいいと思います。

259 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 19:37:42 ]
>>235>>255
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7782.c
main()はあまりいじってない。もっとクールな比較関数を誰か頼む。

260 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 19:49:40 ]
それなんてstrcasecmp

261 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 19:51:29 ]
こうするだけでよくね?

#include<stdio.h>
#include<string.h>
#define WORD_NUM_MAX 1000
#define WORD_LEN_MAX 64
int main(void){
char word[WORD_NUM_MAX][WORD_LEN_MAX+1+1], tmp[WORD_LEN_MAX+1], *p;
char filename[256];
int i, j, word_num;
int icmp;
FILE *fp;
printf("Input filename : ");
scanf("%255[^\n]", filename);
if((fp=fopen(filename, "r"))==NULL) return 1;
for(word_num=0;word_num<WORD_NUM_MAX;word_num++){
if(fgets(word[word_num], sizeof(word[0]), fp)==NULL) break;
if((p=strchr(word[word_num], '\n'))!=NULL) *p='\0';
}
fclose(fp);
for(i=0;i<word_num;i++){
for(j=0;j+1<word_num-i;j++){
if((icmp = stricmp(word[j], word[j+1])) == 0 && strcmp(word[j], word[j+1])>0 || icmp >0){
strcpy(tmp, word[j]); strcpy(word[j], word[j+1]); strcpy(word[j+1], tmp);
}
}
}
for(i=0;i<word_num;i++) puts(word[i]);
return 0;
}

262 名前:259 mailto:sage [2008/10/13(月) 20:19:53 ]
>>260>>261
strcasecmp()もstricmp()も
A<a<B<b<C<c<D<d<・・・・・・・・・・・・・<X<x<Y<y<Z<zの順にならないと思うのだが。
strcasecmp()は、実際にthe The The the the みたいになってうまくいかなかった。
stricmp()も、比較前に文字列を小文字にするから、同じだろう。

263 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 20:40:25 ]
小文字で比較して一緒だったら、大文字も考慮して比較すればいいと思ったけど、だめなのかなぁ。

264 名前:259 mailto:sage [2008/10/13(月) 21:07:41 ]
if ( ((icmp = stricmp(word[j], word[j+1])) == 0 && strcmp(word[j], word[j+1])>0) || icmp >0 )
たしかに、論理的にもこれでいけますね。
stricmp()なかったので、作ってやってみました。

265 名前:デフォルトの名無しさん [2008/10/13(月) 21:56:11 ]
>>250

の、すごろくをどなたかお願いします。

266 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 21:57:22 ]
>>261
The book // 1番目
the apple // 3番目
tHe earth // 2番目

これを並べ替えると

the apple // 3番目
The book // 1番目
tHe earth // 2番目

こうなったよ



267 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 22:17:21 ]
>>258#include <stdio.h>
#include <math.h>
int main() {
  double a, b, c, d, x;
  printf("a^2 * x + b * x + c = 0となるa, b, cを入力してください\n");
  scanf("%lf %lf %lf", &a ,&b, &c);
  if (a == 0) {
    puts("2次方程式ではありません");
    return 1;
  }
  b /= a;
  if (c == 0) {
    printf("x = %g, 0\n", -b);
  } else {
    c /= a;
    b /= 2; /* x^2 + 2b'x + c = 0の形へ */
    d = b * b - c; /* 判別式 */
    if (d > 0) {
      if (b > 0) {
        x = -b - sqrt(d);
      } else {
        x = -b + sqrt(d);
      }
      printf("x = %g, %g\n", x, c / x);
    } else if (d < 0) {
      printf("x = %g ± %gi\n", -b, sqrt(-d));
    } else {
      printf("x = %g\n", -b);
    }
  }
  return 0;
}

268 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 22:18:01 ]
C言語による最新アルゴリズム事典には、解の公式をそのまま使うと、
|b| ≒ √(b^2 - 4ac)のとき桁落ちを起こすから、桁落ちしないほうだけ公式で求めて、
残りは解と係数の関係(解α, βとしてαβ = c / a)で求めろって書いてあるからそうした。

269 名前:259 mailto:sage [2008/10/13(月) 22:56:37 ]
>>266 のおっしゃる通りでした。
一瞬、そのテストケースもあったのか、と思ったが、
>>[2] 問題文(含コード&リンク):任意の長さの文字列(英字のみ)データ(>>235)
だから、スペースが入る文字列はテストケースとしては、条件外になる。
しかし、指摘通り今回の問題では、>>261では、スペースをのぞいてひとつの文字列に見せかけて食わせたとき、大文字優先の原則に従っていなくなりますね。

私は、単語だけと思っていたけど、英字だけの文字列だったのね。
これ以上出ると荒れそうなので、私が出るのは止めておくが、誰か>>259よりクールな比較関数頼む。

270 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 23:12:12 ]
>>250
>>265

ほい、
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7783.txt

でも、VB2008じゃないんで…
VC6なんて、iostreamとかの .h とかは自分の環境に合わせてくれ
それと、ゴール出来ない双六が出来る可能性もあると言えばある

271 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 23:44:10 ]
てか、strcmpだけで正しく辞書順になるんじゃね?頭こんがらがってきた\(^o^)/

272 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 23:55:22 ]
>>271
いやasciiコードだとして英字が
A-Zがならんでその次にa-zになるじゃん

273 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 00:22:14 ]
でも、strcmpの戻り値は辞書式で比較した値でしょ??
msdn.microsoft.com/ja-jp/library/e0z9k731(VS.80).aspx
難しく考えなくていいんじゃない??

274 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 00:47:53 ]
Order by case insensitive dictionary order,dictionary order.

Are you OK?

275 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 00:58:30 ]
>>235
>>238 にこれを追加して strcmp を mystrcmp に変更すれば希望通りになる筈
int mystrcmp(const unsigned char *a, const unsigned char *b){
static int table[256], is_table_initialized=0;
int i;

if(!is_table_initialized){
for(i=0;i<256;i++) table[i]=i*2;
for(i=0;i<26;i++) table['a'+i]=table['A'+i]+1;
is_table_initialized=1;
}
for(;*a!='\0';a++,b++) if(*a!=*b) break;
return table[*a]-table[*b];
}

276 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 02:04:40 ]
>>273
「辞書式順序」 (dictionary order)というのは英和辞典なんかの並び順のことじゃないぞ。
きちんとした定義を持った数学用語。
ja.wikipedia.org/wiki/%E8%BE%9E%E6%9B%B8%E5%BC%8F%E9%A0%86%E5%BA%8F
1文字目が同じなら2文字目の大小で比較し、
2文字目も同じなら3文字目の大小で比較し、……という順序付けのこと。
>>275なんかももちろん辞書式順序。

strcmpは各文字の大小比較を単純に文字コードの値で比較しており、
それだと>>273の言うとおりなので、>>255の要求には沿わないわけ。



277 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 13:19:06 ]
どなたか>>162の問題をお願いできないでしょうか?

278 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 13:23:04 ]
>>277
このスレを「すごろく」で検索

279 名前:デフォルトの名無しさん [2008/10/14(火) 15:00:10 ]
[1] 授業単元:プログラミング言語
[2] 問題文:直角三角形の直行する2辺の長さ、a、bともに正の整数(n≧0)が与えられた時、斜辺の長さcをプリントするプログラムを書き、数例に対して実行せよ。
[3] 環境
 [3.1] OS:Linux
 [3.2] コンパイラ名とバージョン:gcc
 [3.3] 言語:C言語
[4] 期限:2008年10月15日まで
[5] その他の制限:floatを使えと指示されました。


習い始めたばかりでまったくと言っていいほどわかりません。呆れるほど簡単な問題かもしれませんが、よろしくお願いします!

280 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 15:08:38 ]
>>279
俺にも出来そうな問題がきた
#include <stdio.h>
#include <math.h>

int main(void)
{
int a, b;
float c;
printf("a = ");
scanf("%d", &a);
printf("b = ");
scanf("%d", &b);
c = (float)sqrt(a * a + b * b);
printf("\n答え %f\n", c);
return 0;
}
>数例に対して実行せよ。
の意味がわからないので入力値で計算させた

281 名前:デフォルトの名無しさん [2008/10/14(火) 15:22:09 ]
>>280
ありがとうございます!

もう一つお聞きしてもよろしいですか?
書いていただいたプログラムをこのままコピーしてコンパイルして実行したら未定義のシンボルsqrtとか重大なエラーとか出てきてしまったんですが、
この場合はどうすればよろしいのでしょうか?

282 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 15:23:58 ]
>>281
gcc -lm hoge.c
かな

283 名前:デフォルトの名無しさん [2008/10/14(火) 15:29:34 ]
>>282
できました!!本当にありがとうございます!!!
こんな見ず知らずの勉強不足クソ野郎にもかかわらず、ご親切に教えていただきまして大変感謝しております。

ありがとうございました!

284 名前:デフォルトの名無しさん [2008/10/14(火) 15:39:34 ]
sqrtくらい実装した方がいい

285 名前:デフォルトの名無しさん [2008/10/14(火) 15:47:42 ]
たとえばroot(n,c) cのn乗根の作り方

x=n√cとおくとx^n=cとなる。f(x)=x^n-cという関数の根を求めればいい
一般に、f(x)の根はニュートン法で計算できる。

点aでfに接する直線の方程式は、y = f'(a)(x-a) + f(a)
これがy=0としてxについてとくと、x = a + f(a)/f'(a)
この値を新たにaとしておいて、同様の操作をすると収束すれば解が求まる。

286 名前:デフォルトの名無しさん [2008/10/14(火) 15:56:34 ]
コンパイルは通してないがおおかたこんな通りだろう

float pow(int n, float c){
int k; float a=1;
for( k=0; k<n; k++)a*=c;
return a; }

float root(int n, float c){
int k; float a=c;
for( k=0; k<50; k++) a += (pow(n,a)-c)/(n*pow(n-1,a));
return a; }



287 名前:デフォルトの名無しさん [2008/10/14(火) 16:03:24 ]
#include <stdio.h>

float pow(int n, float c){
int k; float a=1;
for( k=0; k<n; k++)a*=c;
return a; }

float root(int n, float c){
int k; float a=c;
for( k=0; k<50; k++) a -= (pow(n,a)-c)/(n*pow(n-1,a));
return a; }

float sqr(float c){ return root(2,c); }



int main(){
printf("√2 =%f\n",sqr(2));
printf("√3 =%f\n",sqr(3));
}

288 名前:デフォルトの名無しさん [2008/10/14(火) 16:06:45 ]
微分、積分して関数で返すライブラリってある?

289 名前:デフォルトの名無しさん [2008/10/14(火) 16:44:57 ]
こっちの方が速い
#include <stdio.h>

#define GOSA 0.00001
double pow(int n, double c){
int k; double a=1;
for( k=0; k<n; k++) a*=c;
return a; }


float root(int n, float c){
double x=c,y,z;
while(1){
y=pow(n-1,x); z=x*y;
if(z>c-GOSA && z<c+GOSA)break;
x -= (z-c)/(n*y);
printf("root( %d , %.1f )の計算経過 %f\n",n,c,x);
}
return x; }

float sqr(float c){ return root(2,c); }



int main(){
printf("√2 =%f\n\n",sqr(2));
printf("√3 =%f\n\n",sqr(3));
}

290 名前:デフォルトの名無しさん [2008/10/14(火) 16:52:47 ]
これでいいか

#define GOSA 0.00001
float sqr(float c){
double x=c,y;
while(1){
y=x*x;
if(y>c-GOSA)if(y<c+GOSA)break;
x -= (y-c)/(2*x);
printf("sqr( %.1f )の計算経過 %f\n",c,x);
}
return x; }

291 名前:デフォルトの名無しさん [2008/10/14(火) 17:04:40 ]
みなさまに質問があります。若干スレチになるかもしれんが、一つ力を貸してくれないだろうか…

292 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 17:09:06 ]
質問ならもっとふさわしいスレがあるだろう
ここは宿題をやってもらうスレ

293 名前:デフォルトの名無しさん [2008/10/14(火) 17:09:39 ]
標準ライブラリ速いな どうやったら速度を抜けるだろうか?


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

#define GOSA 0.0001
float sqr(float c){
double x=c,y;
while(1){
y=x*x;
if(y>c-GOSA)if(y<c+GOSA)break;
x -= (y-c)/(2*x);}
return x; }


int main(){
double sum;
int n,cl;
sum=0; cl=clock(); for(n=0;n<1000000;n++)sum+=sqr(1000);
cl=clock()-cl; printf("time=%d sum=%f\n",cl,sum);
sum=0; cl=clock(); for(n=0;n<1000000;n++)sum+=sqrt(1000);
cl=clock()-cl; printf("time=%d sum=%f\n",cl,sum);
}

294 名前:デフォルトの名無しさん [2008/10/14(火) 17:09:52 ]
>>292

そうだな。すまん。

295 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 19:18:31 ]
ソースみればいいだろ標準の

296 名前:デフォルトの名無しさん [2008/10/14(火) 19:55:39 ]
[1] 授業単元: C言語
[2] 問題文(含コード&リンク): kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7784.txt
[3] 環境
 [3.1] OS: Windows
 [3.2] Linux
 [3.3] 言語: C
[4] 期限: 明日の朝
[5] その他の制限:出来るだけ簡単に

意味不明なんでお願いします。



297 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 20:59:43 ]
#include <stdio.h>
int main(void)
{
FILE *fp;
int m, p1, p2, s1 = 0, s2 = 0;
char *member[] = {"", "会","特","非"};

if((fp=fopen("data03.dat", "r"))==NULL) return 0;

printf("種別  購入金額(円) 支払い金額(円)\n");
while(fscanf(fp, "%d%d", &m, &p1)==2) {
switch(m) {
case 1: p2 = p1 * 9 / 10;
break;
case 2: p2 = p1 * 7 / 10;
break;
case 3: p2 = p1 < 15000 ? p1 : p1 - 1000;
break;
}
printf(" %s %15d%15d\n", member[m], p1, p2);
s1 += p1, s2 += p2;
}

printf("---------------------------------------\n");
printf("合計%15d%15d\n", s1, s2);

return 0;
}

298 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 21:08:06 ]
>>296
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7785.txt

299 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 22:36:32 ]
[1] 授業単元: C言語
[2] 問題文(含コード&リンク): kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7786.txt
[3] 環境
 [3.1] OS: Windows
 [3.2] Linux
 [3.3] 言語: C
[4] 期限: 明日の昼
[5] その他の制限:出来るだけ簡単に

300 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 22:42:31 ]
>>296 == >>299 ?

301 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 23:03:00 ]
>>299 手ごわかったぜ
#include<stdio.h>
int nabeatu(int num){
if(num%3==0) return 1;
for(;num>0;num/=10) if(num%10==3) return 1;
return 0;
}
int main(void){
int i, n=100, nabeatu_count=0, stop_flag=0;
printf("自然数を入力してください。\n");
scanf("%d", &n);
for(i=1;i<=n;i++){
if(nabeatu(i)){
nabeatu_count++;
if(nabeatu_count>10 && n-i>30){
static int is_first=1;
if(is_first){
printf("〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜\n"
" すいません、打つの大変なので中略します><\n"
"〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜\n");
}
is_first=0;
stop_flag=1;
}else{
if(!stop_flag) printf(" %5d%.*s", i, !(nabeatu_count%5), "\n");
if(nabeatu_count%5==0) stop_flag=0;
}
}
}
return 0;
}

302 名前:デフォルトの名無しさん [2008/10/14(火) 23:15:36 ]
成績をつけるプログラムを教えてほしいです。

80点以上100点以内 A
65点以上80点未満  B
50点以上65点未満  C
0点以上50点未満   D

それ以外の整数に対しては「ありえない」と出す



303 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 23:18:00 ]
>>302
if elseでも並べておけば?

304 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 23:19:28 ]
>>303
A・B・C・Dに分けれたのですが、101など100を超える場合を組み込めません

305 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 23:22:00 ]
if
else if
else if
else if
else ありえない

306 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 23:22:47 ]
#include <stdio.h>
int main(void) {
int score;
scanf("%d",&score);
if(80<=score&&score<=100) printf("A\n");
else if(65<=score&&score<80) printf("B\n");
else if(50<=score&&score<65) printf("C\n");
else if(0<=score&&score<50) printf("D\n");
else printf("ありえない\n");
return 0;
}



307 名前:デフォルトの名無しさん [2008/10/14(火) 23:22:53 ]
[1] 授業単元:データ構造
[2] 再帰的二分探索
入力の引数をint x(求める値)、int v[]、int n(要素数)の三つを用いて
ループを使用せずに関数の再帰呼び出しを使うこと。
外部変数で値の受渡しはしてはいけない。
[3] 環境
 [3.1] OS: Windows
 [3.2] gcc
 [3.3] C
[4] 期限: 10月15日16:00まで
[5] 探索する配列はソート済みのものと考えてよい。

308 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 23:26:38 ]
>>306
できました。
ありがとうございました。

309 名前:298 mailto:sage [2008/10/14(火) 23:43:34 ]
>>301
友達になれそうだなw

310 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 00:01:48 ]
質問です
ある整数が格納されている配列seisuu[4]がある。
その配列の添え字に対応して優先度が格納される配列priority[4]を考える。
整数が小さいほど優先度は高くする。優先度は最高が4最低が0。
格納されている整数が0の場合は優先度は0。
格納されている数字は同じ場合もある。
というのを考えているのですが、
for(i=0 ; i<4 ; i++){
  priority[i] = 1; /* 初期化 */
}
for(i=0 ; i<4 ; i++){
  if(seisuu[i] == 0){
    priority[i] = 0; /* 整数が0なら優先度も0 */
  }else{ /* 整数が0以外のものを発見 */
    for(j=i+1 ; j<4 ; j++){ /* 発見した次の配列から数字のある配列を探索 */
      if(seisuu[j] != 0){ /* 0以外の配列を発見 */
        if(seisuu[i] < seisuu[j]){ /* 最初の方が小さいなら */
          priority[i]++; /* 最初の方の優先度をアップ */
        }else if(seisuu[i] > seisuu[j]){ /* 発見した方が小さいなら */
          priority[j] = priority[i]+1; /* 発見した方の優先度を最初の方の優先度+1 */
        }else{ /* 整数が同じなら */
          priority[i] = priority[j]; /* 優先度を同一とする */
        }
      }
    }
  }
}
このように考えてみたのですが、何か違うような気がします。
指摘等宜しくお願いします。

311 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 00:05:25 ]
5 3 2 3 と入っていたら 2 1 0 1 としたいということ?

312 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 00:20:04 ]
>>311
レスありがとうございます
整数 :5 3 2 3だと
優先度:1 2 3 2
としたいです

313 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 00:40:31 ]
>>312
要素数が4個固定ならガチで見てもいいと思うけど、
増減ありなら、構造体にでも詰めて、ソートしてからの方がいいように思う。

314 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 00:45:00 ]
>>307
int *func(int x, int v[], int n){
int c;

c=n/2;
if(n<=0) return NULL;
if(x<v[c]) return func(x, &v[0], c);
if(x>v[c]) return func(x, &v[c+1], n-c-1);
return &v[c];
}

315 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 01:24:52 ]
>>300 YES
>>301 ちょwこれはwwマジすかww これを参考に考えて見ますwあざす^^

316 名前:デフォルトの名無しさん [2008/10/15(水) 01:33:31 ]
1] 授業単元: 関数
[2] 問題文(含コード&リンク): 3次元のfloat型の配列 a[3]、b[3]、c[3]を頂点の座標とする三角形ABCを考える。
1.ベクトルの長さを計算する関数を作れ、ただし関数の宣言は以下のようになるようにせよ。
float Vnagasa(float *x);
2.ベクトルの差 z=y−xを計算する関数を作れ。ただし関数の宣言は以下のようになるようにせよ。
void Vhiku(float *x, float *y, float *z);
3.ベクトルの外積z=x×yを計算する関数を作れ。ただし関数の宣言は以下のようになるようにせよ。
void Vgaiseki(float *x, float *y, float *z);
4.上記1,2,3を用いて、ベクトルx、y、zを頂点とする三角形の面積を計算する関数を作れ。
float Vmenseki(float *x, float *y, float *z);
5.1,2,3,4に関してそれぞれ正しく動作しているかどうか確認するプログラムを作れ。
6.ベクトルx、y、z及び原点からなる三角錐の表面積を計算するプログラムを作れ。

[3] 環境
 [3.1] OS:Linux
 [3.2] コンパイラ名とバージョン:gcc
 [3.3] 言語:C
[4] 期限: 2008年10月20日16:00まで
[5] その他の制限: 自分で関数の宣言をしなくてはならない

4番からがうまく出来ません
お願いします




317 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 02:53:16 ]
[1]C言語初級
[2]次のコードを並べ替えて動作するものにせよ。また
動作仕様を簡潔に述べよ。(コンパイル可能なコードと
動作仕様署を提出)
for(k=0,j=1;j<=i/2;j++)
k+=j;
int main(int argc,char **argv){
if(i%j==0)
int i=1,j,k,l,c=0;
for(l=0,j=1;j<=k/2;j++)
if(( i==l )&&(i<k)){
}
}
}
l+=j;
#include <stdio.h>
return 0;
c++;
if( k % j==0 )
while(c<=10){
printf("(%d,%d)¥n",i,k);
i++;
[3] Solaris/Gnu C++/C
[4]10/31正午まで

急ぎませんがよろしく御願いします。この手の問題
苦手中の苦手です。


318 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 03:09:27 ]
/*
for(k=0,j=1;j<=i2;j++)
k+=j;
if(i%j==0)
int i=1,j,k,l,c=0;
for(l=0,j=1;j<=k2;j++)
if(( i==l )&&(i<k)){
}
}
l+=j;
#include <stdio.h>
c++;
if( k % j==0 )
while(c<=10){
printf("(%d,%d)¥n",i,k);
i++;
int argc,char argv
*/
int main(){
return 0;
}

なにもせずに終了するプログラム

319 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 03:38:14 ]
>>316
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7787.txt

6番は正しいか単体テストはしてない、答えが分るテストデータは自分で用意してくれ

320 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 08:33:14 ]
>>317
#include <stdio.h>

int main(int argc,char **argv){
int i=1,j,k,l,c=0;
while(c<=10){
for(k=0,j=1;j<=i/2;j++)
if(i%j==0)
k+=j;
for(l=0,j=1;j<=k/2;j++)
if( k % j==0 )
l+=j;
if(( i==l )&&(i<k)){
printf("(%d,%d)\n",i,k);
i++;
}
c++;
}
return 0;
}
/*何も表示しないプログラム*/

321 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 10:48:31 ]
うわあ。並べ替え分からんなあと思いながらやってたら>>320と全く同じでワロタw

322 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 12:24:48 ]
[1] 授業単元:マルチタスクプログラミング

[2] 問題文(含コード&リンク):
funcA 1〜5を表示する
funcB A〜Eを表示する

メインにてスレッドを生成し、生成したスレッドにfuncBを走らせる。
メインスレッドはfuncAを走らせる。

そのうえで表示結果が
「1A2B3C4D5E」となるようマルチタスクプログラムを作成せよ。

[3] 環境
 [3.1] OS:Windows
 [3.2] コンパイラ:VisualStudio2005
 [3.3] 言語:C++

[4] 期限:10/17(金)

[5] その他の制限:特に無し

イベントのやり取りでスレッドを制御せよとのことなのですがサンプルを提示して
頂けると助かります。スレッド等イメージをまだ把握しておらず…
申し訳ないですが宜しくお願いします。

323 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 13:26:06 ]
並べ替え問題はこうだと思う。
友愛数を求めるアルゴリズム。
ja.wikipedia.org/wiki/%E5%8F%8B%E6%84%9B%E6%95%B0

#include <stdio.h>
int main(int argc,char **argv){
int i=1,j,k,l,c=0;
while(c<=100000){
for(k=0,j=1;j<=i/2;j++)
if(i%j==0)
k+=j;
for(l=0,j=1;j<=k/2;j++)
if( k % j==0 )
l+=j;
if(( i==l )&&(i<k)){
printf("(%d,%d)\n",i,k);
}
i++;
c++;
}
return 0;
}


324 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 13:39:56 ]
まちがった。こうだ〜!
友愛数を小さい方から10個見つけるプログラム。

#include <stdio.h>
int main(int argc,char **argv){
int i=1,j,k,l,c=0;
while(c<=10){
for(k=0,j=1;j<=i/2;j++)
if(i%j==0)
k+=j;
for(l=0,j=1;j<=k/2;j++)
if( k % j==0 )
l+=j;
if(( i==l )&&(i<k)){
c++;
printf("(%d,%d)\n",i,k);
}
i++;
}
return 0;
}


325 名前:320 mailto:sage [2008/10/15(水) 13:44:18 ]
>>323
なるほど
forには{ }がなくてifには { }があるので2文以上入るんだろうなと思ったんだよ
/* 友愛数を10個表示するプログラム */
#include <stdio.h>
int main(int argc,char **argv){
int i=1,j,k,l,c=0;
while(c<=10){
for(k=0,j=1;j<=i/2;j++)
if(i%j==0)
k+=j;
for(l=0,j=1;j<=k/2;j++)
if( k % j==0 )
l+=j;
if(( i==l )&&(i<k)){
printf("(%d,%d)\n",i,k);
c++;
}
i++;
}
return 0;
}

326 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 14:15:14 ]
>>322
後始末無視して簡単に書いてみた
#include<windows.h>
#include<stdio.h>
HANDLE eventA,eventB;
DWORD func(HANDLE self,HANDLE other,const char*str){
    while(*str)
        WaitForSingleObject(self,INFINITE) , putchar(*str++) , SetEvent(other);
    return 0;
}
DWORD WINAPI funcA(LPVOID p){return func(eventA,eventB,"12345");}
DWORD WINAPI funcB(LPVOID p){return func(eventB,eventA,"ABCDE");}
int main(){
    eventA = CreateEvent(0,0,1,0);
    eventB = CreateEvent(0,0,0,0);
    HANDLE f[] = {CreateThread(NULL,0,funcA,0,0,0),CreateThread(NULL,0,funcB,0,0,0)};
    WaitForMultipleObjects(2,f,1,INFINITE);
    printf("\n");
}




327 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 14:23:45 ]
>>326
ホント面倒かけて申し訳ない。

なにやってるか全くわからないけどとりあえず張り付けてデバッグします
ありがとう

328 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 16:26:42 ]
[1] 授業単元:数値計算
[2] 問題文(含コード&リンク):
このアーカイブにはいってるprog.cのファイルの逆の処理をする
プログラムを作ってほしいのですが。プログラムの説明はソースの一番上にかいてあります。
www1.axfc.net/uploader/He/so/147917
パスはsageです。知りたいところがあれば聞いてください
[3] 環境
 [3.1] OS:Linux
 [3.2] コンパイラ名とバージョン:gcc
 [3.3] 言語:C言語
[4] 期限: 10/16 の12時くらい






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧](;´∀`)<366KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef