C/C++の宿題を片付けます 86代目
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2007/04/20(金) 00:35:41【質問者へ】
回答者の便宜のため、質問の際は以下を行うことを推奨します。
・質問は【質問テンプレ】を利用してください。
・問題文は、出題されたまま全文を書いてください。
・計算問題は数式をあげ、どのような計算をするのか詳しく説明してください。
・エラーは、その詳細と発生した行を書きましょう。エラーメッセージはコピペしてください。
・後から問題に付け足しするのはやめましょう。付け足しは作業を無駄にしがちです。
・なりすましを防ぐため、トリップを使ってください。名前欄に、「#」に続けて任意の文字列を入力して投稿すると、その文字列を知らない他人に騙られることを防ぐことができます。
【質問テンプレ】
[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
【過去ログ検索】 http://chomework.sakura.ne.jp/
【wiki】 http://www23.atwiki.jp/homework/
【前スレ】
C/C++の宿題を片付けます 85代目
http://pc11.2ch.net/test/read.cgi/tech/1175129517/
0002デフォルトの名無しさん
2007/04/20(金) 00:35:550003デフォルトの名無しさん
2007/04/20(金) 00:36:150004デフォルトの名無しさん
2007/04/20(金) 00:36:42#include <iostream>
#include <fstream>
#include <string>
#include <cctype>
int main()
{
const int N = 100;
std::ifstream fin("infile1.txt");
int c[N];
int count = 0;
std::string str;
std::getline(fin, str);
while (fin >> c[count]) count++;
for (std::string::const_iterator pos = str.begin(); pos != str.end(); ++pos) {
if (std::isalpha(*pos)) {
std::cout << *pos << " ";
}
}
std::cout << std::endl;
0005デフォルトの名無しさん
2007/04/20(金) 00:37:01if (c[i] >= 80)
std::cout << "優 ";
else if (c[i] >= 70)
std::cout << "良 ";
else if (c[i] >= 60)
std::cout << "可 ";
else
std::cout << "不可 ";
}
std::cout << std::endl;
}
0006デフォルトの名無しさん
2007/04/20(金) 00:37:55#include <stdio.h>
char* Gakusei[9] = {"A", "B", "C", "D", "E", "F", "G", "H", "I"};
int TokuPoint[9] = {90, 73, 55, 60, 45, 66, 75, 40};
int main(void){
int i;
for(i=0; i!=9; i++){
printf("%s ", Gakusei[i]);}
printf("\n");
for(i=0; i!=9; i++){
if(TokuPoint[i] >= 80) printf("優 ");
else if(TokuPoint[i] >= 70) printf("良 ");
else if(TokuPoint[i] >= 60) printf("可 ");
else printf("不可 ");}}
0007デフォルトの名無しさん
2007/04/20(金) 00:37:55乙
0008945
2007/04/20(金) 00:40:02ありがとうございました。
0009デフォルトの名無しさん
2007/04/20(金) 00:41:490010デフォルトの名無しさん
2007/04/20(金) 00:44:02よぉ、俺!!
0011デフォルトの名無しさん
2007/04/20(金) 00:45:28ビールでも買ってくるか('A`)
0012デフォルトの名無しさん
2007/04/20(金) 00:45:37> int TokuPoint[9] = {90, 73, 55, 60, 45, 66, 75, 40};
int TokuPoint[9] = {90, 73, 55, 60, 45, 88, 66, 75, 40};
間違って不合格になる人間が発生する瞬間に立ち会ってしまった。
0013デフォルトの名無しさん
2007/04/20(金) 00:46:430014デフォルトの名無しさん
2007/04/20(金) 00:47:24>>1
> 気に入らない質問やその他や発言はスルーの方向で。
0015デフォルトの名無しさん
2007/04/20(金) 08:13:11っつーかね、CよりC++の方が扱いが楽だわ。
0016デフォルトの名無しさん
2007/04/20(金) 14:03:56[2] 問題文(含コード&リンク):下記
[3] 環境
[3.1] OS: WindowsXP
[3.2] Visual Studio .NET
[3.3] 言語: C
[4] 期限: 4月末
[5] その他の制限: 基本的なCの知識しか習っていません(曖昧ですいません)。
副プログラム(サブルーチン)構造体、モジュールなども習っていません。
今持っている基本的な知識(if文、for文、配列)でこれを解けと言われました…。
ポアソン方程式の5点差分法による求解を考える。
ただし領域は、
0≦x≦1, 0≦y≦1, とし、
境界条件は
φ[i,0]=φ[i,Ny]=0 (i=0,1,2,...,Nx)
φ[0,j]=φ[Nx,j]=0 (j=0,1,2,...,Ny)
とする。
またx方向の分割数をNxとし、y方向の分割数をNyとし
Nx*Nyが格子点数。
ポアソン方程式は
φ[i+1,j]-2φ[i,j]+φ[i-1,j]/(Δx)^2+φ[i,j+1]-2φ[i,j]+φ[i,j-1]/(Δy)^2=-13π^2sin(3πx)sin(2πy)
で与えられる。
上式をAφ=bの形に変形し、その連立一次方程式をガウスの消去法で未知数φを求める
プログラムを作成せよ。
0017デフォルトの名無しさん
2007/04/20(金) 21:15:08早くやっちゃいな
0018デフォルトの名無しさん
2007/04/20(金) 21:19:25かーちゃん、俺たけしだってばぁ
たかしは弟だろ〜
0019デフォルトの名無しさん
2007/04/20(金) 21:25:07誰か教えてくれ!
0020デフォルトの名無しさん
2007/04/20(金) 21:44:38http://oshiete1.goo.ne.jp/qa2919426.html
これ?
0021デフォルトの名無しさん
2007/04/20(金) 21:46:19変形まではやってくれぇ。
0022デフォルトの名無しさん
2007/04/20(金) 22:20:43[2] http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3846.txt
[3] 環境
[3.1] OS: Windows
[3.2] コンパイラ名とバージョン: gcc
[3.3] 言語: C
[4] 期限:月曜朝7時まで
[5] 制限:なし。
よろしくお願いします。
002316
2007/04/20(金) 23:26:37やりました。設問と少し変わってしまったのですが、
分割数は同じ(Δx=Δy=h)にして、これを連立一次方程式にしました。
φ[i+1,j]+φ[i-1,j]+φ[i,j+1]+φ[i,j-1]-4φ[i,j]=-13π^2sin(3πx)sin(2πy)*h^2
-φ[i+1,j]-φ[i-1,j]-φ[i,j+1]-φ[i,j-1]+4φ[i,j]=f(x,y)*h^2
x=ih,y=jh
h=1/N
分割数N=3の場合、格子点は9個存在し
φ[1,1] φ[2,1] φ[3,1] φ[1,2] φ[2,2] φ[3,2] φ[1,3] φ[2,3] φ[3,3]
と各々の格子点の値を求めます。
002416
2007/04/20(金) 23:28:19A:
4 -1 0 -1 0 0 0 0 0
-1 4 -1 0 -1 0 0 0 0
0 -1 4 0 0 -1 0 0 0
-1 0 0 4 -1 0 -1 0 0
0 -1 0 -1 4 -1 0 -1 0
0 0 -1 0 -1 4 0 0 -1
0 0 0 -1 0 0 4 -1 0
0 0 0 0 -1 0 -1 4 -1
0 0 0 0 0 -1 0 -1 4
002516
2007/04/20(金) 23:29:10φ[1,1]
φ[2,1]
φ[3,1]
φ[1,2]
φ[2,2]
φ[3,2]
φ[1,3]
φ[2,3]
φ[3,3]
b:
h^2*f[1,1]
h^2*f[2,1]
h^2*f[3,1]
h^2*f[1,2]
h^2*f[2,2]
h^2*f[3,2]
h^2*f[1,3]
h^2*f[2,3]
h^2*f[3,3]
境界条件より、
φ[i,0]=φ[i,N]=0 (i=0,1,2,...,Nx)
φ[0,j]=φ[N,j]=0 (j=0,1,2,...,Ny)
です。
002616
2007/04/20(金) 23:33:24φ=(φ[1,1],φ[2,1],...,φ[N,1],φ[1,2],φ[2,2],...,φ[N,2],...φ[1,N],φ[2,N],...,φ[N,N])
となります。
002716
2007/04/20(金) 23:34:21http://www.coins.tsukuba.ac.jp/~itosho/NC05/chap4.pdf
002816
2007/04/20(金) 23:39:26xの値を決める→yの値を決める→x,y方向の分割数Nを決める
→出来た連立一次方程式をガウスの消去法を用いて解く
だと思います…。
正直、自分には全く作れるような気がしません…よろしくお願いします・・・。
0029デフォルトの名無しさん
2007/04/20(金) 23:41:28それです
0030デフォルトの名無しさん
2007/04/20(金) 23:43:19(1)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
enum { NC_MAX = 10, NLEN = 11 };
int cmp(const void *a, const void *b) {
return strcmp(*(char(*)[NLEN])a, *(char(*)[NLEN])b);
}
int main(void) {
char *p, names[NC_MAX][NLEN] = {{ 0 }}, buff[BUFSIZ];
int i, nc;
for (nc = 0; nc < NC_MAX; ) {
fputs("name => ", stdout);
if (!fgets(buff, sizeof buff, stdin) || buff[0] == '0')
break;
if ((p = strchr(buff, '\n')))
*p = '\0';
strncat(names[nc++], buff, NLEN - 1);
printf("累計%d件\n", nc);
}
qsort(names, nc, NLEN, cmp);
for (i = 0; i < nc; ++i)
printf("%d:%s\n", i + 1, names[i]);
return 0;
}
0031デフォルトの名無しさん
2007/04/20(金) 23:53:36#include <stdio.h>
#include <stdlib.h>
#include <string.h>
enum { NC_MAX = 10, NLEN = 10 };
int cmp(const void *a, const void *b) {
return strcmp(*(char**)a, *(char**)b);
}
char *strndup(const char *s, size_t n) {
char *ss;
size_t len = strlen(s);
if (len < n) n = len;
ss = malloc(n + 1);
return strncat(ss, s, n);
}
int main(void) {
char *p, *names[NC_MAX] = { 0 }, buff[BUFSIZ];
int i, nc;
for (nc = 0; nc < NC_MAX; ) {
fputs("name => ", stdout);
if (!fgets(buff, sizeof buff, stdin) || buff[0] == '0') break;
if ((p = strchr(buff, '\n'))) *p = '\0';
names[nc++] = strndup(buff, NLEN);
printf("累計%d件\n", nc);
}
qsort(names, nc, sizeof(char*), cmp);
for (i = 0; i < nc; ++i) {
printf("%d:%s\n", i + 1, names[i]);
free(names[i]);
}
return 0;
}
003231
2007/04/20(金) 23:56:12char *strndup(const char *s, size_t n) {
char *ss;
size_t len = strlen(s);
if (len < n) n = len;
ss = malloc(n + 1);
ss[0] = '\0'; <-- これを追加
return strncat(ss, s, n);
}
0033デフォルトの名無しさん
2007/04/21(土) 00:17:02どうもありがとうございました。助かります。
0034デフォルトの名無しさん
2007/04/21(土) 00:52:47[2] 問題文:
一次不定式の一般解を求めるコンソールプログラムを作る。
例えば A,B という形で整数値が入力された場合、
Ax+By=gcd(A,B)←最大公約数
↑のような式を作ってxとy(整数解)を求め、それらから一般解を求めるプログラム。
[3] 環境
[3.1] OS:Ubuntu
[3.2] gcc
[3.3] C
[4] 来週くらい
[5] scanf使っても大丈夫です
0035デフォルトの名無しさん
2007/04/21(土) 11:58:06> #include <math.h>
> main()
> {
> double a,b,degree,radian,s,n;
> printf("三角形の二つの長さを入力せよ:");
> scanf("%lf%lf",&a,&b);
複数の変数の入力を行う場合は、それぞれ1つずつscanf文で入力した方が良い。
> printf("その間の角度を入力せよ:");
> scanf("%lf",°ree);
> radian=3.1416*degree/180.0;
> s=sin(radian);
> n=a*b*s*0.5;
> printf("面積は%0.3lfです\n",n);
> }
関数を使ったプログラムにしてください。
↑この関数を使ったプログラムって何ですか?><わかりません
訂正してください><
0036デフォルトの名無しさん
2007/04/21(土) 12:01:43具体的な数値は質問者に任せてガウス法(掃き出し法のほうだよね?)だけ
でも実装しようかと思ったが、自分がすっかり退化していることに気づ
いた。添え字がゴチャゴチャしてどっちが行でどっちが列だか分からな
くなるぅ。
0037デフォルトの名無しさん
2007/04/21(土) 12:37:13#include <stdio.h>
int main() {
int A, B;
printf("input two non-zero numbers\n");
scanf("%d %d", &A, &B);
if (A==0 || B==0) { printf("zero\n"); return 0; }
int a, b, x1, x2, y1, y2, w;
a = A; b = B; x1 = y2 = 1; x2 = y1 = 0;
while (b != 0) {
w = x2; x2 = x1 - x2 * (a/b); x1 = w;
w = y2; y2 = y1 - y2 * (a/b); y1 = w;
w = b; b = a%b; a = w; }
printf("%dx+%dy=%d\n\tx=%d%+dt\n\ty=%d%+dt\n", A, B, a, x1, B/a, y1, -A/a);
}
0038デフォルトの名無しさん
2007/04/21(土) 13:37:20おお、ちゃんと計算できるけど何やってるのか全然わかんねえw
0039デフォルトの名無しさん
2007/04/21(土) 14:24:43[2] 問題文(含コード&リンク): 下の関数を用いて、与えられたデータの平均と標準偏差を計算
するプログラムを作成し、与えられたデータの平均と標準偏差を求めよ。また、与えられたデータに
関して正常に計算できない場合には(関数を)修正せよ。
[3] 環境
[3.1] OS: (Windows/Linux/等々) Windows
[3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等) Borland
[3.3] 言語: (C/C++/どちらでも可 のいずれか) C
[4] 期限: ([yyyy年mm月dd日hh:mmまで] または [無期限] のいずれか) 次の月曜
[5] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々)
「与えられたデータ」は、1073741823.000000が並んでいて、最後が1073741822.000000
のデータです。
void average_stddev(double *data, int count)
{
double a, a_square, mean, var, std_dev;
a = a_square = 0.0;
for (i=0; i<count; i++){
a += data[i];
a_square += data[i]*data[i];
}
mean = var = std_dev = 0.0;
if ( count > 0 ){
mean = a / (double)count;
var = a_square / (double)count - mean * mean;
std_dev = sqrt(var);
}
printf("mean = %.16f std_dev = %16f\n", mean, std_dev);
}
0040デフォルトの名無しさん
2007/04/21(土) 15:14:12一番スマートなやり方ってどんなのがありますか?
0041デフォルトの名無しさん
2007/04/21(土) 15:29:28負数の剰余に対応してなかった.一応修正.
#include <stdio.h>
int main() {
int A, B;
printf("input two non-zero numbers\n");
scanf("%d %d", &A, &B);
if (A*B == 0) return printf("zero\n");
int a, b, x1, x2, y1, y2, w;
a = A; b = B; x1 = y2 = 1; x2 = y1 = 0;
while (b != 0) {
int q = a/b, r = a%b;
if (r<0) {
if (b>0){ q--; r+=b; }
else { q++; r-=b; }}
w = x2; x2 = x1 - x2 * q; x1 = w;
w = y2; y2 = y1 - y2 * q; y1 = w;
w = b; b = r; a = w; }
printf("%dx%+dy=%d\n\tx=%d%+dt\n\ty=%d%+dt\n", A, B, a, x1, B/a, y1, -A/a);
}
>>40
すれちがい
ttp://en.wikipedia.org/wiki/Shunting_yard_algorithm
0042デフォルトの名無しさん
2007/04/21(土) 16:17:39[2] 問題文 (含コード&リンク) :
1) Cプログラムファイル名 「one.c」
以下の条件でプロセスIDを出力するプログラムを組みなさい。呼び出しプロセスはfork()関数を使用し、子、孫プロセスを作る物とする。
1) 呼び出しプロセス自身のプロセスIDを出力しなさい。
2) 孫プロセスから自分、親、祖父のIDを出力しなさい。
※補足として、流れを描いた画像をアップしておきます。
ttp://up.tseb.net/src/up11246.jpg
2) Cプログラムファイル名 「two.c」
two.cは二つのサブプロセスを生成出来る。
それぞれのサブプロセスを呼び出し、動作するプログラムを組みなさい。ただし、exec関数を使用する事。
動作例:例えば、プログラムにて 「ls」コマンドを呼び出すようにした場合、
コンソール画面にて、「./two -l -lt」と入力したら、
「ls –l」、「ls-lt」 の出力結果が表示される。
ヒント: ttp://up.tseb.net/src/up11247.txt
[3] 環境
[3.1] OS:Linux
[3.2] コンパイラ名とバージョン:gcc 3.4
[3.3] 言語:C言語
[4] 期限:2007年04月23日08:00まで
[5] その他の制限:特にありませんが、
初級クラスなのでその辺で使われるであろう関数を使っていただけるとありがたいです。
丸投げでよろしくお願いします。
0043デフォルトの名無しさん
2007/04/21(土) 20:39:33[2] 問題文(含コード&リンク):
・メインで用意した文字列上の適当な位置を指定して、
その位置から逆向き(先頭方向)に1文字ずつ出力するプログラムを書け。
-文字列は"Back to the (Double) Feature"を使用する
-適当な位置は配列の添え字を入力する
-添え字の範囲をチェックする
-逆向きに出力する関数backwardを用意する
-文字列の先頭位置と出力する最初の配列要素の位置
を引数にし、出力した文字数を戻り値にする:
int backward(char *s,int pos);
backwardではポインタが指す文字を出力させる
[3] 環境
[3.1] OS: Linux
[3.2] コンパイラ名とバージョン: gcc 3.4
[3.3] 言語: C
[4] 期限: 無期限
[5] その他の制限: 特にありませんが初歩的な関数で書いていただけると
有難いです。
0044デフォルトの名無しさん
2007/04/21(土) 21:41:33#include <stdio.h>
#include <string.h>
int backward(const char *s,int pos) {
for(pos--;pos>=0;pos--)
printf("%c",s[pos]);
return 0; }
int main(void) {
char *str={"Back to the (Double) Feature"};
int pos,nx=strlen(str);
printf("Input position (%d以下) > " ,nx );
scanf("%d",&pos);
if(pos>nx) return 1;
else backward(str,pos);
return 0; }
0045デフォルトの名無しさん
2007/04/22(日) 03:53:10http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3849.txt
0046デフォルトの名無しさん
2007/04/22(日) 04:19:29#include <stdio.h>
#include <math.h>
#define N 10
void average_stddev(double *data, int count)
{
double a, a_square, mean, var, std_dev;
int i;
a = a_square = 0.0;
for (i=0; i<count; i++)
a += data[i];
mean = var = std_dev = 0.0;
if ( count > 0 ){
mean = a / (double)count;
for(i = 0; i < count; i++)
a_square += pow((data[i] - mean), 2);
var = a_square/count;
std_dev = sqrt(var);
}
printf("mean = %.16f std_dev = %16f\n", mean, std_dev);
}
0047デフォルトの名無しさん
2007/04/22(日) 12:39:08[2] 問題文(含コード&リンク):
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3853.c
問題はこちらに書いてあります。よろしくお願いいたします。
[3] 環境
[3.1] OS: Windows
[3.2] コンパイラ名とバージョン: gcc 3.4
[3.3] 言語: C
[4] 期限: [2007年4月23日00:00(深夜)まで]
0048デフォルトの名無しさん
2007/04/22(日) 16:31:420049デフォルトの名無しさん
2007/04/22(日) 23:48:25これは同じ問題をやったことある香具師じゃなきゃ無理だろ。
参考URLとかもってきてくれ。
0050デフォルトの名無しさん
2007/04/23(月) 01:25:16やはり無理ですか...orz
私もよく理解ができなかったので
どの参考URLを探せば良いのかわからなくて困っています
数字が
0123456
1234567
2345678
の様な感じで並んでいたのは覚えているのですが、参考にもならなくてすみません。
今からまた調べてみます
0051デフォルトの名無しさん
2007/04/23(月) 02:54:13の部分が他の表し方だって言われたんですけどどうしたらいいんでしょうか?
あとint main(void)ではなくてvoid main(void)って言われたんですけど・・・
0052デフォルトの名無しさん
2007/04/23(月) 03:06:51int main , void main についてはすでに前スレでどういうことなのかについての結論は出ている。
ttp://www.kouno.jp/home/c_faq/c11.html
ttp://kbs.cs.tu-berlin.de/~jutta/c/c-faq/c-5.html
ttp://hpcgi1.nifty.com/MADIA/Vcbbs/wwwlng.cgi?print+200211/02110028.txt
ttp://his.luky.org/ML/linux-users.a/msg00056.html
世界的な標準を決めている団体、ANSI、ISO準拠だと、プログラムの開始のfunctionは
mainと名づけられていて、その戻り値はint型とされている。
個人の報告によれば、void mainでコンパイルエラーを起こした開発環境があっても
int main(最後にreturn (int型変数);でエラーが起きたという報告は皆無。
自分が使っている環境でvoid mainが通るならそれでも良いが、値を返す関数じゃないからといって
void mainという理由を通すなら、それはもはやANSI、ISOに従ったmainではないということになるが。
0053デフォルトの名無しさん
2007/04/23(月) 03:13:16char *Gakusei2 = {"ABCDEFGHI"}; < こうですか?それとも
char Gakusei2[9] = {"ABCDEFGHI"}; < こうですか?わかりません ><;
0054デフォルトの名無しさん
2007/04/23(月) 03:23:59授業で習ったものに、文字配列の初期化や格納について参考になるものはない?
出来るのにそれじゃダメとか言い出す講師は、ただ単にそういうんじゃなくて
どういうことに則って記述するのか、ちゃんと聞いてみるしかないかと。
0055デフォルトの名無しさん
2007/04/23(月) 03:33:05すいません。無知なんで詳しいことがよくわかんないんですけど
charってのは使わないみたいです。あとはfor構文を使うとしか聞いていません。
0056デフォルトの名無しさん
2007/04/23(月) 03:45:21すいませんでした。
A B C D E F G H I
90 73 55 60 45 88 66 75 40
です。
実行結果が下のようになるようにお願いします。
A B C D E F G H I
優 良 不可 可 不可 優 可 良 不可
と書いてあるけど、文字配列を使っちゃダメならA〜Iを何で表示しろと?
まさか↓のようにやれと?
for(i=65; i<=73; i++) printf("%c ",i);
0057デフォルトの名無しさん
2007/04/23(月) 04:46:37TAか教授か・・・
0058デフォルトの名無しさん
2007/04/23(月) 05:17:16http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3854.txt
0059デフォルトの名無しさん
2007/04/23(月) 05:21:531 2 3 4 5 6 7 8 9
4 6 8 10 12 14 16 18
9 12 15 18 21 24 27
16 20 24 28 32 36
25 30 35 40 45
36 42 48 54
49 56 63
64 72
81
というように表示させたいんですけどうまくいきません。
0060デフォルトの名無しさん
2007/04/23(月) 05:23:10int main()
{
int i;
int j;
for (i=1; i <= 9; i++) {
for(j=1; j <= 9; j++) {
if(i <= j){
printf("%3d,",i*j);
}
}
printf("\n");
}
return 0;
}
ここまではできたのですが表がどうしても左詰めになってしまいます。
どこがいけないんでしょうか?それ以外にも直したほうがいいところ
があればおねがいします。
0061デフォルトの名無しさん
2007/04/23(月) 05:28:48#include <stdio.h>
int main()
{
int i, j;
for(i = 1; i < 10; i++){
for(j = 1; j < i ; j++)
printf(" "); /* 半角の空白3つ分を出力 */
for(j = i; j < 10; j++)
printf("%3d", i*j);
puts("");
}
return 0;
}
0062デフォルトの名無しさん
2007/04/23(月) 05:39:39表示されないんですけど・・・
0063デフォルトの名無しさん
2007/04/23(月) 05:41:03> printf(" "); /* 半角の空白3つ分を出力 */
この中に半角の空白をあと2つ足して3つに汁!
0064デフォルトの名無しさん
2007/04/23(月) 05:42:15printfの中を半角のスペース3つにしといて。
2ch投稿時にまとまったスペースはひとつにされてしまう。
0065デフォルトの名無しさん
2007/04/23(月) 05:43:53006664
2007/04/23(月) 05:46:23なじられるのにはなれてますから。
0067デフォルトの名無しさん
2007/04/23(月) 05:49:37ちうか、俺流の書式の指定
#include <stdio.h>
int main() {
int i, j,t=3;
for(i = 1; i < 10; i++){
for(j = 1; j < i ; j++)
printf("%*c",t,32);
for(j = i; j < 10; j++)
printf("%*d", t,i*j);
puts(""); }
return 0; }
0068デフォルトの名無しさん
2007/04/23(月) 05:50:450069デフォルトの名無しさん
2007/04/23(月) 05:54:31ただputs(""); っていうのをまだ習ってないんですけど
これを使わずに表示することはできないんですか?
0070デフォルトの名無しさん
2007/04/23(月) 05:55:190071デフォルトの名無しさん
2007/04/23(月) 05:55:54printf("\n");に置き換えて
0072デフォルトの名無しさん
2007/04/23(月) 12:43:14NULLを%cで表示ってバカ?
0073デフォルトの名無しさん
2007/04/23(月) 15:15:41007442
2007/04/23(月) 16:27:310075デフォルトの名無しさん
2007/04/23(月) 16:32:53http://www.psl.ne.jp/perl/pdojo00b.html
バカじゃないだろ、ちゃんとコードに割り当てられているし
単に文字が無いんではなく、空文字として存在してんだよぉ〜
無知は黙ってろ、クソカス低学歴(プ
お前は一生void mainに0^0=1を使ってろw
0076本年度のバカ6、7号
2007/04/23(月) 16:36:42>>68
NULLを%cで表示ってバカ?
73 名前:デフォルトの名無しさん 投稿日:2007/04/23(月) 15:15:41
どうせやるなら、printf("%*s", t, "")だな。
0077デフォルトの名無しさん
2007/04/23(月) 16:40:06""が示す文字、すなわち空文字=NULLじゃねーかYO!
007873
2007/04/23(月) 17:12:16やってみれば判るけど、"%s"に""を渡しても何も出力しないが
"%c"にNULLを渡すとナル文字が出力されるのよ。
つまり、非可読文字が出力されちゃうわけ。判る?
#あ、標準出力をリダイレクトしてodするなんて知恵も無いDozerには理解できるわけ無いか。
0080デフォルトの名無しさん
2007/04/23(月) 17:29:43> #あ、標準出力をリダイレクトしてodするなんて知恵も無いDozerには理解できるわけ無いか。
> Dozerには理解できるわけ無いか。
> Dozer
さすがにこれはどうかと思うぞ。
関係ない人間にまで喧嘩売ってるとしか思えん。
0081デフォルトの名無しさん
2007/04/23(月) 17:33:350082デフォルトの名無しさん
2007/04/23(月) 17:34:580083デフォルトの名無しさん
2007/04/23(月) 17:35:08お前ってさぁ、自分の間違いを指摘されると何か言い返して相手の間違い(だと思ったこと)を
指摘しないと気がすまない基地外だろ?w
バカじゃね?出力結果が物語っているのに、何自分勝手な自論をこんなところで提言してんだよw
何これ↓?知ったかぶり?
> やってみれば判るけど、"%s"に""を渡しても何も出力しないが
> "%c"にNULLを渡すとナル文字が出力されるのよ。
だからその通りになってんじゃんwwwwwwwwwwww
> つまり、非可読文字が出力されちゃうわけ
お前のやっている %s と "" の方がどう見てもおかしいし理解不能だろwwwwww
これだからわけのわからねぇ〜知ったか理論を持ち出して説明する専門学校卒は困るんだよ!視ねw
0084頭の上にウンコを乗せたバカの今日の名言
2007/04/23(月) 17:36:30>>68
NULLを%cで表示ってバカ?
NULLを%cで表示ってバカ?
NULLを%cで表示ってバカ?
NULLを%cで表示ってバカ?
NULLを%cで表示ってバカ?
NULLを%cで表示ってバカ?
NULLを%cで表示ってバカ?
"" を %s で表示の方がバカだよwwwwww
文字列じゃねーだろ "" はw あっ、お前の場合ダブルクォートが文字列のつもりか?w
0085デフォルトの名無しさん
2007/04/23(月) 17:36:54脳みそ硬化してる連中はどっかよそへいけ。
0086デフォルトの名無しさん
2007/04/23(月) 17:40:29> 文字列じゃねーだろ "" はw あっ、お前の場合ダブルクォートが文字列のつもりか?w
どうみても0文字以上の文字を含む文字列では?
0087デフォルトの名無しさん
2007/04/23(月) 17:42:050088デフォルトの名無しさん
2007/04/23(月) 17:44:090089デフォルトの名無しさん
2007/04/23(月) 17:48:20まぁ、それについてはともかく、以下のソースをコンパイルして実行してみろ。
お前がやったこともNULLの引用と変わらんことだと気づくよw
#include <stdio.h>
#include <string.h>
int main(void)
{
char *buf={"ABC"},*a="";
unsigned int i;
for(i=0; i<=strlen(buf); i++)
printf("buf[%d] : \"%c\" / %d \n",i,buf[i],buf[i]);
printf("a[0] : \"%c\" / %d \n",a[0],a[0]);
printf("NULL : \"%c\" / %d \n",NULL,NULL);
return 0;
}
0090デフォルトの名無しさん
2007/04/23(月) 17:50:540091デフォルトの名無しさん
2007/04/23(月) 17:51:18>>73の方が浅はか、無知、知ったかw
実証してみりゃ結論が出るのに、やらずに勝手な自論を持ち出して相手の不適切を
指 摘 し た つ も り が
自分がやったことが相手のやったことの違うやり方だったことに過ぎないという
お間抜けなことに気づかないアホw
やれやれ、ここはやたらとint mainにかみついたり、C言語スタイルで記述したソースを
C++コンパイラでコンパイルできればそれもC++のソースとか平気で言っちゃう香具師らが多いなんて
もはや終わってんなここw 所詮、プロのプログラマーになれなかった落ちこぼれ
負け組みの集団だろ?俺なんて趣味でやっている程度だが、確実にボケ老人より知識は上だなw
経験はまだ浅いが、いずれプロにも匹敵するくらいにはなるぜw
0092デフォルトの名無しさん
2007/04/23(月) 17:56:14で、出力結果は? 勿論、出力をリダイレクトしてダンプしてね。
0093デフォルトの名無しさん
2007/04/23(月) 17:57:46出力結果を聞くなんておかしいね?お前がコンパイルしてやってないってことは
結局""も脳内コンパイルか?脳みそこねこねコンパイルw
0094本日のボケ老人
2007/04/23(月) 17:58:32>>68
NULLを%cで表示ってバカ?
73 名前:デフォルトの名無しさん 投稿日:2007/04/23(月) 15:15:41
どうせやるなら、printf("%*s", t, "")だな。
↑こいつら死刑なw
0095デフォルトの名無しさん
2007/04/23(月) 18:02:28int main()
{
printf("%%s:%s\n", "");
printf("%%c:%c\n", NULL);
return 0;
}
#if 0
% gcc foo.c
% ./a.out
%s:
%c:
% ./a.out | od -t x1
00000000 25 73 3a 0a 25 63 3a 00 0a
00000011
%
#endif
009642
2007/04/23(月) 18:07:57お願いします。どなたか>>42の課題をやっては戴けないでしょうか?
0097デフォルトの名無しさん
2007/04/23(月) 18:10:27残念、参考資料が両方とも流れてしまっている。
009842
2007/04/23(月) 18:14:04画像:ttp://www.uploda.org/uporg784837.jpg.html
ttp://user.ftth100.com/log/up/log/4352.jpg
ヒントコード:ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3854.txt
0099デフォルトの名無しさん
2007/04/23(月) 18:15:04これやったらおかしな数値が表示されたぞ?
010042
2007/04/23(月) 18:18:54アップをしました。
ヒントコードの方、文字化けをしているみたいなのでもう一度アップしました。
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3856.txt
010142
2007/04/23(月) 18:20:01スレ汚しすいません。
0102デフォルトの名無しさん
2007/04/23(月) 18:35:28ここがどこだか言ってみろ?
空気読めない奴はマに向かないぞ。
0103デフォルトの名無しさん
2007/04/23(月) 18:48:00一匁。
#include <stdio.h>
#include <unistd.h>
void grandchild(int gparent, int parent) {printf("child:%d\nparent:%d\ngparent:%d\n", getpid(), parent, gparent);}
void child(int parent)
{
int pid = getpid();
int x = fork();
if (x < 0) {
/* error */
} else if (x == 0) {
grandchild(parent, pid);
} else {
/* int status; */
/* wait(& status); */
}
}
void parent() {printf("one:%d\n", getpid());}
int main()
{
int pid = getpid();
int x = fork();
if (x < 0) {
} else if (x == 0) {
child(pid);
} else {
parent();
}
return 0;
}
010442
2007/04/23(月) 18:56:33ありがとうございます。早速、動作確認の方、完了しました。
2問目もよろしくお願いします。
0105デフォルトの名無しさん
2007/04/23(月) 19:19:26waitしないと出力が混ざるから、こっちはwaitしておいた。
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#define EXEC_COMMAND "/bin/ls"
#define EXEC_NAME "ls"
int main(int argc, char ** argv)
{
int pid;
if (argc < 3) {fprintf(stderr, "Usage:%s <option1> <option2>.\n", argv[0]); return 1;}
pid = fork();
if (pid == 0) {
execl(EXEC_COMMAND, EXEC_NAME, argv[1], NULL);
}
waitpid(pid, NULL, 0);
pid = fork();
if (pid == 0) {
execl(EXEC_COMMAND, EXEC_NAME, argv[2], NULL);
}
waitpid(pid, NULL, 0);
return 0;
}
010642
2007/04/23(月) 19:46:23ありがとうございました。どちらも動作確認いたしました。
早速、提出してきます。
本当にありがとうございました。
0108デフォルトの名無しさん
2007/04/23(月) 21:32:54グラフ理論(?)の授業さぼったならそれは助けようがない。
0109デフォルトの名無しさん
2007/04/23(月) 21:57:18情報不足でしたか
授業はさぼっていないです、ちゃんと聞いていたはずなのですが
聞き逃したのかノートにも書いていないので
必死に知り合いに詳細を聞いているところです、申し訳ない
0110デフォルトの名無しさん
2007/04/23(月) 22:29:06"end"と入力されたら、名前が入力された件数分だけ得点を入力させてください。得点は0〜50の範囲内とし、範囲外の値が入力された場合は、エラーメッセージを出力して再入力させてください。
名前の入力の最初にendが入力された場合は、その旨のメッセージを出力してください。なお名前は最大10文字入力できるものとし、それ以上入力が行われる状況は考慮しないものとします。
Input name1 : End
Input name2 : endo
Input name3 : end
Input point(End ) : -5
Sorry.Input point(0-50).
Input point(End ) : 0
Input point(endo ) : 100
Sorry.Input point(0-50).
Input point(endo ) : 5
---NAME-------0v-------10v-------20v-------30v-------40v-------50v
End ( 0):
endo ( 5):*****
[3] 環境
[3.1] OS:windows
[3.2]
[3.3] 言語: C
[4] 期限
: 出来るだけ早くおねがいします。
[5] その他の制限: 現在、制御文、配列、文字と文字列まで習っています。
よろしくお願いします
0111デフォルトの名無しさん
2007/04/23(月) 23:07:58[2] 問題文(含コード&リンク): scanfを使って整数a,bを読み込む。このa,bの足し算を
ビット毎演算(|, &, ^, <<, >>)のみを使って計算する
[3] 環境
[3.1] OS:Windows
[3.2] gcc 3.4
[3.3] 言語:C言語
[4] 2007年4月25日22:00まで
[5] 制限: 特になし
0112デフォルトの名無しさん
2007/04/24(火) 00:13:44http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3857.txt
0113デフォルトの名無しさん
2007/04/24(火) 02:06:53[2] 問題文(含コード&リンク):つり銭をもらわずに、ある金額を支払うのに必要な紙幣と
硬貨の種類と枚数を出力するプログラムを作成せよ。ただし、紙幣および硬貨は、
10000円、5000円、1000円、500円、100円、50円、10円、5円、1円とする。
[3] 環境
[3.1] OS:Windows
[3.2] コンパイラ名とバージョン:
[3.3] 言語:C++
[4] 期限:今日の正午まで
[5] その他の制限:
実行結果が下のようになるようにお願いします。
(例)28110を入力
金額入力 28110
10000円 2
5000円 1
1000円 3
100円 1
10円 1
お願いします。
0114デフォルトの名無しさん
2007/04/24(火) 03:52:16#include <iostream>
struct Yen {
int kingaku;
int maisuu;
} yen[] = {{10000, 0}, {5000, 0}, {1000, 0}, {500, 0}, {100, 0}, {50, 0}, {10, 0}, {1, 0}};
int main()
{
int n, m = sizeof(yen) / sizeof(yen[0]);
std::cout << "金額入力 ";
std::cin >> n;
for (int i = 0; i < m; i++)
if (n / yen[i].kingaku) {
yen[i].maisuu = n / yen[i].kingaku;
n -= yen[i].kingaku * yen[i].maisuu;
if (yen[i].maisuu)
std::cout << yen[i].kingaku << "円 " << yen[i].maisuu << std::endl;
}
}
0115デフォルトの名無しさん
2007/04/24(火) 04:43:14#include <iostream>
using namespace std;
int main()
{
int money = 10000, amount, i = 0;
cout << "金額を入力してください:";
cin >> amount;
while(amount) {
int count = amount / money;
if(count) {
cout << money << "円:" << count << "枚" << endl;
amount %= money;
}
money = i ? money / 5 : money / 2;
i = 1 - i;
}
}
0116デフォルトの名無しさん
2007/04/24(火) 04:52:26[2] 問題文(含コード&リンク):
1.csv形式ファイルから各行各列を動的配列に読み込む関数。
2.行と列、または、行と項目名を指定して、動的配列から要素を返す関数。
3.動的配列をcsv形式ファイルとして書き出す関数。
4,指定行の全列を抽出し、動的配列として返す関数。
5.指定列の全要素を抽出し、動的配列として返す関数。
6.行数か項目名を指定し、その列を基準にして各行を昇順にソートした動的配列を返す関数。
csv形式ファイルの1行目は、各列の項目名が格納されているものとする。
[3] 環境
[3.1] OS:Windows
[3.2] コンパイラ名とバージョン: VC++8.0
[3.3] 言語:C++
[4] 期限:25日まで
[5] その他の制限:
0117デフォルトの名無しさん
2007/04/24(火) 05:07:55読み込むCSVファイルの中身と出力結果の例をきぼんぬ
0118デフォルトの名無しさん
2007/04/24(火) 05:17:26両方とも正の整数と仮定していいの?
0119デフォルトの名無しさん
2007/04/24(火) 06:45:49それなんて業務?
0120デフォルトの名無しさん
2007/04/24(火) 08:28:08#include <stdio.h>
int main()
{
int intsize = sizeof(int)*8;
int a, b, i, e, f, flag=0, res=0;
printf("整数を二つ入力してください:");
scanf("%d+", &a); scanf("%d", &b);
for(i=0; i<intsize; i++){
e=(a>>i)&1; f=(b>>i)&1;
res|=(e^f^flag) << i;
flag=(e&f)||(e&flag)||(f&flag);
}
printf("\n%d + %d = %d", a, b, res);
return 0;
}
0121デフォルトの名無しさん
2007/04/24(火) 16:12:55出力は今回の範囲に入ってません。多分好きな形式で良いと思われます。
csvファイルは日本郵政公社で配布している郵便番棒データファイルを使うことを
推奨されていますが、このデータを使うことを決め撃ちしたプログラムは書いてはいけません。
例えば、以下のようなファイルにも対応しなければいけません。
[商品マスタ.CSV]
商品コード,商品区分,商品名称,仕入れ単価,販売単価,単位,税区分,取扱開始日,備考
E00018,023,xxxxxxxxxxx,150,400,3,1,2001/06/18,
E00021,011,yyyyyyyy,200,350,2,1,2001/06/25,2008年9月取扱終了予定
>>119
業務ではありません。データベース基礎の演習です。
0122デフォルトの名無しさん
2007/04/24(火) 17:33:00VIPでやれ
0123デフォルトの名無しさん
2007/04/24(火) 18:23:36> 3.動的配列をcsv形式ファイルとして書き出す関数。
いや、モロに「出力」に該当する部分があるんだが・・・出力って何も画面に表示ってだけじゃないぜ?
出す力と書いてウンコのごとく(ry いやすまん、今のはジョークだ。要するにファイルに出力だろ?
0124デフォルトの名無しさん
2007/04/24(火) 18:28:10[2] 問題文(含コード&リンク):
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3858.txt
[3] 環境
[3.1] OS:Windows
[3.2] コンパイラ名とバージョン:VC++ 2005
[3.3] 言語: C++
[4] 期限:4/25 水 17:00
[5] その他の制限:問題文リンクの方をお願いします
よろしくお願いします
0125デフォルトの名無しさん
2007/04/24(火) 18:35:23kwsk
>前回と同様である
>概論I第14回で説明している
>使用例をここに示す
>テスト用の入力ファイルは、test.txtを取得して
0126デフォルトの名無しさん
2007/04/24(火) 18:59:04わざわざ申し訳ないっす。
気にせずお願いします。
教官の指示に合わない箇所があった場合は自分でなんとかしますので
一応説明すると
前回と同様:普通にFile.open("test.txt");で要素(stringの文字列)を格納
test.txtは英文が書かれているだけです。
0127デフォルトの名無しさん
2007/04/24(火) 20:20:53[2] 問題文(含コード&リンク):
問1
2x2行列を2次元配列で確保し、そこに4つの整数をキーボードから入力し、
その逆行列を出力するプログラムを作成せよ。
問2
(1)(for文との融合)100個の要素数を持つ整数型の配列nを作成し、
100個の要素全てに乱数で値を入力し、その総和を出力するプログラムを作成せよ。
(2)(if文との融合)上記の配列nの、最大値と最小値及び、
最大値と最小値である配列要素の番号を出力するプログラムを作成せよ。
[3] 環境
[3.1] OS: Windows
[3.2] コンパイラ名とバージョン:Visual C++ 2003
[3.3] 言語:C
[4] 期限:明日の正午まで
[5] その他の制限:
宜しくお願いします。
0128デフォルトの名無しさん
2007/04/25(水) 00:06:34[2] http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3865.txt
[3] 環境
[3.1] OS: Linux
[3.2] コンパイラ名とバージョン: gcc
[3.3] 言語: C
[4] 期限:明後日
[5] 制限:なし。
よろしくお願いします。
0129デフォルトの名無しさん
2007/04/25(水) 00:25:40今、帰宅しました。
空白を入れずに各項目を","で区切ったテキスト形式でOKです。
0130デフォルトの名無しさん
2007/04/25(水) 00:34:53逆行列がぴったり整数になる事は少ないので勝手に実数で計算したよ
#include <stdio.h>
int main(void)
{
int i, j, k, a[2][2];
double p, q, b[2][2];
for (i = 0; i < 2; i++)
for (j = 0; j < 2; j++) {
printf("a[%d][%d]=", i, j);
scanf("%d", &a[i][j]);
b[i][j] = a[i][j];
}
for (k = 0; k < 2; k++) {
p = b[k][k];
b[k][k] = 1.0;
for (j = 0; j < 2; j++)
b[k][j] /= p;
for (i = 0; i < 2; i++)
if (i != k) {
q = b[i][k];
b[i][k] = 0.0;
for (j = 0; j < 2; j++)
b[i][j] -= q * b[k][j];
}
}
for (i = 0; i < 2; i++)
for (j = 0; j < 2; j++)
printf("b[%d][%d]=%f\n", i, j, b[i][j]);
return 0;
}
0131デフォルトの名無しさん
2007/04/25(水) 00:35:45#include <stdio.h>
int main()
{
int x[2][2];
scanf("%d%d%d%d", &x[0][0], &x[0][1], &x[1][0], &x[1][1]);
printf("行列\n %10d %10d\n %10d %10d\n", x[0][0], x[0][1], x[1][0], x[1][1]);
printf("逆行列\n %10d %10d\n %10d %10d\n", x[1][1], -x[0][1], x[1][0], x[0][0]);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <time.h>
int main()
{
int x[100], max = INT_MIN, min = INT_MAX, i;
double sum = 0;
srand((unsigned int)time(NULL));
for(i = 0; i < 100; i++){
x[i] = rand()%INT_MAX;
sum += x[i];
if(x[i] > max)
max = x[i];
if(x[i] < min)
min = x[i];
}
printf("総和:%.f\n最大値:%d\n最小値:%d\n", sum, max, min);
return 0;
}
0132デフォルトの名無しさん
2007/04/25(水) 00:39:100133デフォルトの名無しさん
2007/04/25(水) 00:44:50#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 100
int main(void)
{
int i, s, a[N], Min, Max, nMin, nMax;
/* (1) */
srand((unsigned)time(NULL));
for (i = 0; i < N; i++)
a[i] = rand();
for (i = 0, s = 0; i < N; i++)
s += a[i];
printf("総和 = %d\n", s);
/* (2) */
for (i = 0, nMin = nMax = 0, Min = Max = a[0]; i < N; i++) {
if (a[i] < Min) {
Min = a[i];
nMin = i;
}
if (Max < a[i]) {
Max = a[i];
nMax = i;
}
}
printf("最大値 = %d, その添え字 = %d\n", Max, nMax);
printf("最小値 = %d, その添え字 = %d\n", Min, nMin);
return 0;
}
0134デフォルトの名無しさん
2007/04/25(水) 00:59:55#include <stdio.h>
int main(void)
{
double ma[3][4] = {{2, 4, 6, 6},
{3, 8, 7, 15},
{5, 7, 21, 24},
};
double p, d;
int i, j, k;
for (k = 0; k < 3; k++) {
p = ma[k][k];
for (j = k; j < 4; j++)
ma[k][j] /= p;
for (i = 0; i < 3; i++)
if (i != k) {
d = ma[i][k];
for (j = k; j < 4; j++)
ma[i][j] -= d * ma[k][j];
}
}
for (k = 0; k < 3; k++)
printf("x%d=%f\n", k + 1, ma[k][3]);
return 0;
}
0136デフォルトの名無しさん
2007/04/25(水) 01:51:06ありがとうございました 感謝です
0137デフォルトの名無しさん
2007/04/25(水) 08:30:17投げる人はあれだが、このスレ的には盛り上がって良いなww
解答をじっくり噛み砕いて、次こそ自分で解けるようにね^^
0138デフォルトの名無しさん
2007/04/25(水) 09:51:38レポート提出になるだろうけど、そのときもまたここで質問するんだろうね・・・( ´д`)
0139デフォルトの名無しさん
2007/04/25(水) 12:58:20それよりも研修の問題丸投げしてる奴を想像して……。
0140デフォルトの名無しさん
2007/04/25(水) 13:44:04しっかり破壊工作にいそしんでくれ。
0141デフォルトの名無しさん
2007/04/25(水) 14:26:42表示するプログラムを作成してくれませんか?
至急おねがいします。
0142デフォルトの名無しさん
2007/04/25(水) 14:35:13int main(void)
{
int i,j,kuku[9][9];
for(i=0;i<9;i++){
for(j=0;j<9;j++){
kuku[i][j]=(i+1)*(j+1);
printf("%2d ",kuku[i][j]);
}
printf("\n");
}
}
何時までにとか何分以内にとか言ってくれたほうが
くだらない問題でも無駄にやる気が出る。(百マス計算とかと一緒)
0143デフォルトの名無しさん
2007/04/25(水) 14:42:50return 0;
を忘れてた
0144デフォルトの名無しさん
2007/04/25(水) 18:17:540145デフォルトの名無しさん
2007/04/25(水) 20:22:52[2]
1.0を入力し、0.1刻みで減じながら次の処理を行う。
減じた値に「繰り返し数」を乗じた値を表示する。
ただし、0.6のときは2.0を乗ずる。
これを0.0になるまで繰り返す。
[3] 環境
[3.1] OS: WindowsXP
[3.2] コンパイラ名とバージョン: VC++ 2005
[3.3] 言語: C
[4] 期限:金曜日
[5] 制限:なし。
結構厳しい先生なのに見た感じ楽勝の課題だと思ってたら、やっぱり
初心者には簡単に解けない引っかけのような点があって詰まってます。
くだらない問題でしょうがお願いします。
自分なりにやってみて詰まった点は下のレスに書きます。
0146デフォルトの名無しさん
2007/04/25(水) 20:27:12int main(void)
{
int i;
double a = 1.0;
double b = 0;
for( i = 0; i <= 10; i++){
printf("%.1f\t",a);
a = a - 0.1;
printf("%.1f\t",a);
if( a == 0.6) b = (double) (a * 2.0);
else b = (double) (a * i);
printf("%.1f\n",b);
}
return 0;
}
課題文の「0.6のときは2.0を乗ずる」が実行されず、普通に i の4で乗算されます。
それがなぜなのか分かりません。
ちなみに家のPCの環境はBorland C++ Compiler 5.5です。他は上で書いたのと同じです。
よろしくお願いします。
0147デフォルトの名無しさん
2007/04/25(水) 20:48:02実数の小数部分は2進数では正確に表せない物がある。
そういう場合は具体的には小数を使わない工夫をする。
例えばa=10.0としておき1.0ずつ引いていき、a==6.0の時に
処理を分岐すれば正しい動作になる。
0148デフォルトの名無しさん
2007/04/25(水) 21:05:01ありがとうございます。2進数の章の課題なのでやっぱり2進数が関わってくる
とは思っていましたが・・・勉強になりました。
しかし、
>>
a=10.0としておき1.0ずつ引いていき、a==6.0の時に
処理を分岐すれば正しい動作になる。
これ、今やってみましたがやはり結果は6.0と4の乗算になってしまいました。
すみません。
0149デフォルトの名無しさん
2007/04/25(水) 21:10:100150デフォルトの名無しさん
2007/04/25(水) 21:10:42すみませんよく見たらちゃんと出来てました。ただ、そうすると課題本来の
「1.0から0.1を引いていく」場合には少数を使って正しく分岐する方法は
無い、ということですか?
0151デフォルトの名無しさん
2007/04/25(水) 21:14:48十進化二進数を使っているような処理系の場合うまくいく。
つまり処理系依存としか言えない。
どうしても小数を使いたいなら、0.6と比較するのではなくて
0.599と0.601の間に入ったら、みたいに条件を緩めるしかない。
IEEE754で正しく表せる小数は、0.5, 0.25, 0.125, 0.0625,....のような
列とその足し合わせた小数のみ。それ以外は必ず誤差がある。
0152デフォルトの名無しさん
2007/04/25(水) 21:16:01○二進化十進数
0153デフォルトの名無しさん
2007/04/25(水) 21:22:49int main(void)
{
double r = 1.0;
int i;
for (i = 0; i < 4; i++)
r -= 0.1;
printf("%.15e\n", r);
return 0;
}
のようなプログラムの実行結果は
6.000000000000001e-01
となり、ごくわずかだが誤差がある事がわかる。
0154デフォルトの名無しさん
2007/04/25(水) 21:26:11>>153
本当に勉強になります。ありがとうございます。なるほど、誤差がある
ということを勉強させる課題だったわけですね。具体的な解答はまだ
思いつきませんが、誤差について調べて金曜まであがいてみます。
0155デフォルトの名無しさん
2007/04/25(水) 21:29:41ちうか小数点以下きらーーい(ゆとり教育世代じゃないが)w
0156デフォルトの名無しさん
2007/04/25(水) 21:32:32使うのも同じ理由だよね。
0157デフォルトの名無しさん
2007/04/25(水) 21:33:320158154
2007/04/25(水) 21:36:50>>
どうしても小数を使いたいなら、0.6と比較するのではなくて
0.599と0.601の間に入ったら、みたいに条件を緩めるしかない。
これで試しにやってみたところ、うまくいきました。本当にありがとうございました。
少数を使わない方法はこれから試行錯誤して探そうと思います。
0159デフォルトの名無しさん
2007/04/25(水) 22:40:44[2] 問題文(含コード&リンク):
問1
関数:int max4
引数:int a, int b, int c, int d
a,b,c,dのうちの最大値を戻り値とする。
この機能を実現する中でif文は1回しか用いてはならない。ただし、max4の他に
関数をいくつ定義してもかまわない。
問2
標準入力から読んだ10個の整数値を配列aへ格納した後、もうひとつの整数値
を標準入力から読み、これを変数xへ格納する。そのあと、xと同じ値を
配列中(読み込んだ10個の中)に探し、見つかればその配列要素番号を、
見つからなければ-1を標準出力へ出力する。
プログラムの実現には番兵つき線型探索アルゴリズムを用いよ。
要素の番号を出力するプログラムを作成せよ。
[3] 環境
[3.1] OS: Windows
[3.2] コンパイラ名とバージョン:
[3.3] 言語:C
[4] 期限:明日の6時まで。
[5] その他の制限:
お願いします!
0160デフォルトの名無しさん
2007/04/25(水) 22:46:16問1は降べきにソートして最初の要素を出力すればいいのかな
0161デフォルトの名無しさん
2007/04/25(水) 22:48:40問1
int max2(int a, int b){
if(a>b) return a;
return b;
}
int max4(int a, int b, int c, int d){
return max2(max2(a, b), max2(c, d));
}
0162デフォルトの名無しさん
2007/04/25(水) 22:50:59#include <stdio.h>
int max4(int a, int b, int c, int d)
{
int x[4], i, j, t;
x[0] = a;
x[1] = b;
x[2] = c;
x[3] = d;
for (i = 0; i < 3; i++)
for (j = i + 1; j < 4; j++)
if (x[i] < x[j])
t = x[i], x[i] = x[j], x[j] = t;
return x[0];
}
int main(void)
{
printf("max = %d\n", max4(5, 2, 7, 1));
return 0;
}
0163デフォルトの名無しさん
2007/04/25(水) 22:53:090164デフォルトの名無しさん
2007/04/25(水) 23:03:57#include <stdio.h>
#include <limits.h>
int main(void)
{
int a[11], i, x;
for (i = 0; i < 10; i++) {
printf("a[%d]=", i);
scanf("%d", &a[i]);
}
printf("x=");
scanf("%d", &x);
a[10] = INT_MAX; /* 番兵 */
for (i = 0; a[i] != INT_MAX; i++)
if (a[i] == x) {
printf("%d\n", i);
return 0;
}
printf("-1\n");
return 0;
}
0165デフォルトの名無しさん
2007/04/25(水) 23:07:53[2] 問題文:【1】10桁までの任意の数字を入力し、入力した値を配列に格納し、
「何桁目を表示しますか?」を出力し1〜10までの任意の数字を入力後
「○○桁目の数字は○です」と出力されるプログラムを作成せよ
* 使用する関数 : scanf printf switch case
[3] 環境
[3.1] OS:WindowsXP
[3.2] コンパイラ名とバージョン:.NET2003
[3.3] 言語: C言語
[4] 期限: 明日の朝
[5] 制限:なし
入力した10桁の値を配列に格納する方法が調べてもググってもわかりません…
お願いします!
0166デフォルトの名無しさん
2007/04/25(水) 23:08:48#include <stdio.h>
int main(void)
{
int a[11],x,i,sz=sizeof(a)/sizeof(a[0]);
for(i=0; i<sz-1; i++) {
printf("a[%d] > ",i);
fscanf(stdin,"%d",&a[i]);
}
printf("検索する値 x > ");
fscanf(stdin,"%d",&x);
for(i=0; a[i]!=a[sz]; i++);
if(i==sz) printf("-1\n");
else printf("%d\n",i);
return 0;
}
0167デフォルトの名無しさん
2007/04/25(水) 23:11:25問1
int max4(int a, int b, int c, int d)
{
return (a>b?a:b)>(c>d?c:d)?(a>b?a:b):(c>d?c:d);
}
ごめん、ちょっとやってみたかっただけ。
0168デフォルトの名無しさん
2007/04/25(水) 23:13:00それは反則だろ。三項演算子はif文と同等とみなされると思って
俺は使わなかった。
0169デフォルトの名無しさん
2007/04/25(水) 23:13:22a[sz]=x;をfscanf(stdin,"%d",&x); の下に
0170デフォルトの名無しさん
2007/04/25(水) 23:14:20素早い返答ありがとうございました(^0^)
0171デフォルトの名無しさん
2007/04/25(水) 23:18:23#include<stdio.h>
int t[10]={
1,10,100,1000,10000,100000,
1000000,10000000,10000000,10000000};
int main(){
int a[1];
int n;
printf("10桁までの数字を入力してください\n");
scanf("%d",a);
printf("何桁目を表示しますか?\n");
scanf("%d",&n);
switch(0){case 0:;}
printf("%d桁目の数字は%dです\n",n,a[0]/t[n-1]%10);
return 0;
}
0172デフォルトの名無しさん
2007/04/25(水) 23:18:35int max4(int a, int b, int c, int d)
{
int i = a;
while(b>i){i = b;break;}
while(c>i){i = c;break;}
while(d>i){i = d;break;}
return i;
}
じゃぁこれならどうd(ry
ネタ回答なんで気にしないでください。
0173デフォルトの名無しさん
2007/04/25(水) 23:22:32#include <stdio.h>
int main(void)
{
char num[11];
int n;
scanf("%11s", num);
printf("何桁目を表示しますか?\n");
scanf("%d", &n);
switch(num[n-1])
{
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '7':
case '8':
case '9':
printf("%2d桁目の数字は%cです", n, num[n-1]);
break;
default:
printf("%2d桁目の数字は%cです", n, num[n]);
}
return 0;
}
0174デフォルトの名無しさん
2007/04/25(水) 23:31:26素早いご回答ありがとうございます!
すごいです尊敬します
0175デフォルトの名無しさん
2007/04/25(水) 23:33:340176デフォルトの名無しさん
2007/04/25(水) 23:37:57#include <stdio.h>
void myitoa(int n, char s[])
{
int i, j, count = 0, sign;
char c;
if ((sign = n) < 0) n = -n;
i = 0;
do {
switch (n % 10) {
case 0: case 1: case 2: case 3: case 4:
case 5: case 6: case 7: case 8: case 9:
s[i++] = '0' + (n % 10); break;
}
} while (count++, (n /= 10) > 0);
if (sign < 0) s[i++] = '-';
s[i] = '\0';
for (i = 0, j = count - 1; i < j; i++, j--) c = s[i], s[i] = s[j], s[j] = c;
}
int main(void)
{
char s[12];
int x, n;
printf("10桁までの任意の数字を入力=", x);
scanf("%d", &x);
myitoa(x, s);
printf("何桁目を表示しますか?");
scanf("%d", &n);
printf("%d桁目の数字は%cです\n", n, s[n - 1]);
return 0;
}
0177165
2007/04/25(水) 23:44:12でも少しわかってきたような気がします。
0178デフォルトの名無しさん
2007/04/25(水) 23:44:25俺もさ、数値で入力しようとしたんだけど10桁だとint 超えるよね
で、いま考え中
0179デフォルトの名無しさん
2007/04/25(水) 23:45:15自由度が大きい言語だからだね。BASICとかだと似たりよったりになる。
0180デフォルトの名無しさん
2007/04/25(水) 23:46:16あちゃあそうか。だとやっぱし>>173みたいにいきなりcharの配列に
入れさせるのが正しいのかもな。
0181デフォルトの名無しさん
2007/04/25(水) 23:48:120182デフォルトの名無しさん
2007/04/25(水) 23:49:54うん、ただ気になったのが>>173だとたとえば1桁目を表示とした場合(1を入力)上位桁が表示されるわけだけどまずくない?
いや、俺は今考え中だよ、もちろん
0183デフォルトの名無しさん
2007/04/25(水) 23:51:15そこでそこでlong long(ry
0184デフォルトの名無しさん
2007/04/25(水) 23:51:14そしたら入力された文字列を前後ひっくり返しておけばいいのでわ?
0185デフォルトの名無しさん
2007/04/25(水) 23:53:04[2] 問題文(含コード&リンク):
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3870.txt
[3] 環境
[3.1] OS:Windows
[3.2] コンパイラ名とバージョン:VC++ 2005
[3.3] 言語: C++
[4] 期限:4/26 17:00
[5] その他の制限:
よろしくお願いします
0186デフォルトの名無しさん
2007/04/25(水) 23:54:12[2] http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3869.txt
[3] 環境
[3.1] OS: WindowsXP
[3.2] コンパイラ名とバージョン:gcc
[3.3] 言語: C
[4] 期限:金曜日。
[5] 制限:なし。
よろしくお願いします!
0187デフォルトの名無しさん
2007/04/25(水) 23:56:52{
char num[11] = {'\0'};
int Num[10] = {0};
int n;
int i,j;
printf("10桁以内の数値を入力 \n");
scanf("%s",num);
for(j = 0,i = 9; i >= 0; i--,j++)
Num[j] = num[i] - '0';
do{
printf("「何桁目を表示しますか?」");
scanf("%d",&n);
switch(n){
case 1:printf("「%d桁目の数字は%dです」\n",n , Num[n-1]);break;
case 2:printf("「%d桁目の数字は%dです」\n",n , Num[n-1]);break;
case 3:printf("「%d桁目の数字は%dです」\n",n , Num[n-1]);break;
case 4:printf("「%d桁目の数字は%dです」\n",n , Num[n-1]);break;
case 5:printf("「%d桁目の数字は%dです」\n",n , Num[n-1]);break;
case 6:printf("「%d桁目の数字は%dです」\n",n , Num[n-1]);break;
case 7:printf("「%d桁目の数字は%dです」\n",n , Num[n-1]);break;
case 8:printf("「%d桁目の数字は%dです」\n",n , Num[n-1]);break;
case 9:printf("「%d桁目の数字は%dです」\n",n , Num[n-1]);break;
case 10:printf("「%d桁目の数字は%dです」\n",n , Num[n-1]);break;
default:break;
}
}while(n <= 10 && n > 0);
return 0;
}
0188178
2007/04/26(木) 00:03:49文句ばかり言うと怒られるのでちゃんと作ってみた
でもswitch() 使う意味がさっぱり分からないし、strlen使っちゃった
#include <stdio.h>
#include <string>
int main(void)
{
char num[20];
int n,k;
scanf("%19s", num);
printf("何桁目を表示しますか?\n");
scanf("%d", &n);
switch(strlen(num))
{
case 10:k=10-n;break;
case 9:k=9-n;break;
case 8:k=8-n;break;
case 7:k=7-n;break;
case 6:k=6-n;break;
case 5:k=5-n;break;
case 4:k=4-n;break;
case 3:k=3-n;break;
case 2:k=2-n;break;
case 1:k=1-n;break;
defult:printf("入力値は無効"); return 0;
};
printf("%2d桁目の数字は%cです", n, num[k]);
return 0;
}
0189デフォルトの名無しさん
2007/04/26(木) 00:06:14[2] 問題文:
任意の文字列を入力し、入力後に再度任意の文字列を入力し
最初の文字列と2回目の文字列が結合されて出力されるように作成せよ
[3] 環境
[3.1] OS:Windows
[3.2] コンパイラ名とバージョン:VC++
[3.3] 言語: C
[4] 期限:4/26
[5] その他の制限:
さっぱりです・・・
よろしくお願いします
0190デフォルトの名無しさん
2007/04/26(木) 00:07:10#include<stdio.h>
int main(void){
double value;
char buf[1+10+1+1];/* 符号+数値+\0+文字数オーバーチェック用 */
int digit;
printf("10桁までの任意の数字を入力して下さい : ");
scanf("%lf", &value);
switch(sprintf(buf, "%+011.0f", value)){
case 11: break;
default: return 1;
}
printf("\n何桁目を表示しますか? : ");
scanf("%d", &digit);
switch(digit<1 || 10<digit){
case 0: break;
default: return 1;
}
printf("\n%d 桁目の数字は %c です\n", digit, buf[11-digit]);
return 0;
}
0191デフォルトの名無しさん
2007/04/26(木) 00:14:07scanf("%lf", &value);
↓
scanf("%12s", buf);
sscanf(buf, "%lf", &value);
0192デフォルトの名無しさん
2007/04/26(木) 00:17:32[2] 問題:標準入力から整数値を繰り返し読み、読み込んだ値の個数および平均値を
標準出力へ出力する。繰り返しの終わりは負の値で示す。負の値はデータの終わりを示す
もので、集計に含めない。平均値は小数点以下一桁まで出力せよ。また、データ数が0の
ときは、標準出力に"データがありません/n"を出力する。
[3] 環境
[3.1] OS: Window
[3.2] コンパイラ名とバージョン:
[3.3] 言語: C
[4] 期限:4月26日06時00分(木)
[5] 制限:なし。
お願いします!
0193178
2007/04/26(木) 00:22:23エラーチェック一切なし、バッファオーバフローチェックなし
とりあえず動けばいいやコ〜〜〜ドです
#include <stdio.h>
int main(void)
{
char s[100];
char buf[40];
int i=0,k=0;
scanf("%s",s);
scanf("%s",buf);
while(s[i]!='\0')i++;
while(buf[k]!='\0')
{
s[i]=buf[k];
i++,k++;
}
s[i]='\0';
printf("%s",s);
return 0;
}
0194デフォルトの名無しさん
2007/04/26(木) 00:25:49#include <stdio.h>
int main(void)
{
char buf1[128], buf2[128];
printf("最初の文字列=");
gets(buf1);
printf("次の文字列=");
gets(buf2);
printf("2つの文字列を結合すると %s%s\n", buf1, buf2);
return 0;
}
0195デフォルトの名無しさん
2007/04/26(木) 00:25:55もっと初歩的な感じにしないとならなくないんかい?
使用する関数のみでやったほうがいいんかな
まぁもう寝るけど
0196178
2007/04/26(木) 00:36:34エラーチェック一切なし、バッファオーバフローチェックなし
とりあえず動けばいいやコ〜〜〜ドです.第2弾
#include <stdio.h>
int main(void)
{
int n=0;
double x,y=0.0;
while(1)
{
scanf("%lf",&x);
if(x<0) break;
y+=x;
n++;
}
if(n) printf("個数=%d\n平均値=%20.1f",n,y/n);
else printf("データがありません");
return 0;
}
書式指定子があいまいだなぁ
>>195
やっぱstringはまずいよねぇ
この手の問題でswitchを使えってよく出る気がするけどこの場合のswitchの使い道が分からない.whileなら納得できるけど
こんな問題でswitch使って役に(勉強に)なるのかなぁ?
あーおやすみです
俺も寝ますね
0197デフォルトの名無しさん
2007/04/26(木) 00:38:17#include<stdio.h>
int main(void){
double sum=0.0;
int data_num, data;
for(data_num=0;;data_num++)
{
printf("\n整数値を入力して下さい(負数入力で終了) : ");
scanf("%d", &data);
if(data<0) break;
sum+=data;
}
if(data_num==0)
printf("\"データがありません/n\"\n");
else
printf("\n読み込んだ値の個数 : %d\n平均値 : %.1f\n", data_num, sum/data_num);
return 0;
}
0198192
2007/04/26(木) 00:57:57助かりました♪
0199デフォルトの名無しさん
2007/04/26(木) 02:41:53#include <algorithm>
#include <vector>
#include <string>
#include <iostream>
#include <fstream>
using namespace std;
vector<string> 単語配列;
const char* 入力ファイル名 = "test.txt";
void storeWord(){} void replaceWord(){} void findWord(){} void countWord(){} void showWord(){}
struct{string 名前; void(*関数)(void);}メニュー[] = {
#define 項目数 5
{"END", NULL},
{"REPLACE", &replaceWord},
{"FIND", &findWord},
{"COUNT",&countWord},
{"SHOW", &showWord}};
void showMenu(){
cout << "[ Menu ]" << endl;
for(int i=1; i != 項目数; i++)
cout << i << "." << メニュー[i].名前 << endl;
cout << "--" << endl << "0." << メニュー[0].名前 << endl << endl << "?";}
int main(void){
storeWord();
while(1){
showMenu();
int 選択番号; cin>>選択番号; if(選択番号 == 0) break;
else if(選択番号 < 項目数) (*メニュー[選択番号].関数)();
else cout << "ダメだ。" << endl;}
単語配列.clear(); return 0;}
0200デフォルトの名無しさん
2007/04/26(木) 05:24:39すごい適当。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3871.txt
0201200
2007/04/26(木) 05:29:124文字以上のものかああああああっ
0202200
2007/04/26(木) 05:38:55だめぽ。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3872.txt
0203200
2007/04/26(木) 05:46:23しにたい。
0204165
2007/04/26(木) 07:57:58少し素人っぽい感じに直して提出したいと思います(笑)
0205デフォルトの名無しさん
2007/04/26(木) 12:12:47VisualStudioのどっちがいいの?
0206デフォルトの名無しさん
2007/04/26(木) 12:16:080208デフォルトの名無しさん
2007/04/26(木) 12:17:52ほんの付録というとBORANDのやつになっちゃうけど、
できれば統合開発環境がいいです!!
0209デフォルトの名無しさん
2007/04/26(木) 12:21:29昔、本の付録についてたC++Builder3で勉強した
0210デフォルトの名無しさん
2007/04/26(木) 12:25:04VisualStudioだと一度ビルドしないと実行できないのが気に入りません。
普通はeclipseのJavaならビルドなしで実行できますよね?
でも、eclipseでCだとビルドの必要がありそうですね。
どうなんでしょうか?
0211デフォルトの名無しさん
2007/04/26(木) 12:29:02eclipseってのは知らないがその場合インタプリタ方式で実行されているんじゃないか
BORANDにしたってビルドは必要だぞ
0212デフォルトの名無しさん
2007/04/26(木) 12:29:13CPad
ttp://hp.vector.co.jp/authors/VA017148/pages/cpad.html
を使えば、コマンドラインコンパイラでもエディタ→すぐ実行ができるのに。
0213デフォルトの名無しさん
2007/04/26(木) 12:30:02いや、ビルドって作業にはコンパイル作業も含まれるわけで、
インタプリタ言語で無ければ(名前と手間は兎も角)必ず必要になるのだが。
0214デフォルトの名無しさん
2007/04/26(木) 12:33:56そんなのがあったのですかこれならすぐに実行できるのかな?
>>213
eclipseだとソースを書いて保存するだけで、自動にコンパイルしてくれるのだと思います。
書いて保存するとすぐにエラーがあるラインが表示されますので
0215デフォルトの名無しさん
2007/04/26(木) 12:35:51>>212には似たような物がたくさん出てるが個人的にはCPadが一番
使いやすいと思う。
ソースを入れて右▼ボタンを押すだけで自動的にコンパイル・リンク・実行
をまとめてやってくれるしDOS窓は実行後にすぐに閉じたりしないし。
0216デフォルトの名無しさん
2007/04/26(木) 12:40:43なるほど。ありがとうございます
0217デフォルトの名無しさん
2007/04/26(木) 12:50:340218デフォルトの名無しさん
2007/04/26(木) 12:58:11[2] 問題文(含コード&リンク): 次のような、左上を直角とし「+-」からなる三角形図を作りなさい
+-+-+
+-+-
+-+
+-
+
[3] 環境
[3.1] OS: Windows XP
[3.2] コンパイラ名とバージョン: Visual Studio .NET
[3.3] 言語: C
[4] 期限:5月2日
お願いします
0219回答一番乗りw
2007/04/26(木) 13:02:55#include <stdio.h>
int main()
{
printf(
"+-+-+\n"
"+-+-\n"
"+-+\n"
"+-\n"
"+\n");
return 0;
}
0220デフォルトの名無しさん
2007/04/26(木) 13:03:23int main()
{
printf("+-+-+\n+-+-\n+-+\n+-\n+");
return 0;
}
0221デフォルトの名無しさん
2007/04/26(木) 13:05:29#include <stdio.h>
int main(void)
{
int i, j, n;
printf("列数=");
scanf("%d", &n);
for (i = n; i > 0; i--) {
for (j = i; j > 0; j--)
putchar(((j + i - 1) % 2) ? '+' : '-');
putchar('\n');
}
}
0222218
2007/04/26(木) 13:07:350223回答一番乗りw
2007/04/26(木) 13:10:00#include <stdio.h>
#include <stdlib.h>
void trigon(unsigned len)
{
for (int ic = 0; ic < len; ++ic) {
for (int lc = 0; lc < len - ic; ++lc) {
putchar((lc % 2) ? '-' : '+');
}
putchar('\n');
}
}
int main(int argc, char ** argv)
{
int len = 5;
if (argc > 1) {
len = atoi(argv[1]);
}
trigon(len);
return 0;
}
0224回答一番乗りw
2007/04/26(木) 13:11:460225デフォルトの名無しさん
2007/04/26(木) 13:22:25俺も書いてみた。
#include <stdio.h>
int main(void)
{
int i, j, n;
scanf("%d", &n);
for(i=0; i<n; i++) {
for(j=0; j<(n-i)/2; j++) printf("+-");
for(j*=2; j<n-i; j++) putchar('+');
putchar('\n');
}
return 0;
}
0226デフォルトの名無しさん
2007/04/26(木) 13:26:220227デフォルトの名無しさん
2007/04/26(木) 13:28:20反省はしていない。
0228デフォルトの名無しさん
2007/04/26(木) 16:14:52実行画面
実数入力==>10.4
四捨五入:10
実数入力==>10.5
四捨五入後: 11
になるプログラムを作成しなさい
この問題わかる方がいましたら教えてください(T_T)
0229デフォルトの名無しさん
2007/04/26(木) 16:19:21>>1 のテンプレ読んで書きなおし
0230デフォルトの名無しさん
2007/04/26(木) 16:19:340.5を足して整数部表示
書くのメンドイから後は自分でしてね
0231デフォルトの名無しさん
2007/04/26(木) 16:22:24int a=10;
int b=7;
doule syo;
実行画面
syo:1.43
何方かわかる方が居ましたら教えてください(ノ_<。)
0232デフォルトの名無しさん
2007/04/26(木) 16:23:33#include <stdio.h>
#include <math.h>
int main()
{
double foo;
printf("実数入力==>");
scanf("%lf", & foo);
// int化版
printf("四捨五入:%d\n", (int) (foo + .5));
// c90版
printf("四捨五入:%g\n", floor(foo + .5));
// c90版
printf("四捨五入:%g\n", round(foo));
return 0;
}
0233228の者ですが
2007/04/26(木) 16:24:520234デフォルトの名無しさん
2007/04/26(木) 16:25:14#include <stdio.h>
int main()
{
int a = 10;
int b = 7;
double syo = static_cast<double>(a) / static_cast<double>(b);
printf("syo:%.3g\n", syo);
return 0;
}
0235デフォルトの名無しさん
2007/04/26(木) 16:25:48Cならborlandをお勧めするのだけど(手軽だから)、
C++とかをやるようになると、eclipseとかの新しいコンパイラの方が良い。
ただし、微妙に安定しない。
VisualStudioも良いのだけど、#include<stdafx.h>とかの特殊な部分が含まれるから、微妙に抵抗は感じる。
standard editionとかなら、VisualStudioを使うのもいい。重いけど。
ただし、VisualStudioは初学者向けではない。
0236デフォルトの名無しさん
2007/04/26(木) 16:25:56round()はc99だな。って、コメントの間違いか。
0237デフォルトの名無しさん
2007/04/26(木) 16:26:38Eclipseはいつからコンパイラになりましたか?
0238デフォルトの名無しさん
2007/04/26(木) 16:27:14ごめんなさい。
gccですね。
0239デフォルトの名無しさん
2007/04/26(木) 18:40:43ごめんなさい。言ってみたかっただけです。
0240デフォルトの名無しさん
2007/04/26(木) 19:38:24[2] 問題文(含コード&リンク):
番号(整数型)、氏名(20字以内)、年齢(整数型)、血液型(文字列)を
一組とした構造体配列(要素数2人分)を用意する。
キーボードからの2人分のデータを入力し構造体配列へ格納後表示しなさい。
氏名はfgetsを用いブランク(空白)を含む入力も可能とすること。
入力部分、表示部部は関数を用い関数の引数にはポインタを使用すること。
[3] 環境
[3.1] OS: WindowsXP
[3.2] コンパイラ名とバージョン: gcc
[3.3] 言語: C
[4] 期限:2007年4月28日まで
[5] その他の制限: 特になし
よろしくお願いします。
0241デフォルトの名無しさん
2007/04/26(木) 20:40:38[2] http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3875.txt >>22の問題(>>30-31さんに書いていただいた)ものの機能拡張です。
[3] 環境
[3.1] OS: Windows
[3.2] コンパイラ名とバージョン: gcc
[3.3] 言語: C
[4] 期限:金曜17時まで
[5] 制限:なし。
よろしくお願いします。
0242デフォルトの名無しさん
2007/04/26(木) 21:51:42[2] 問題文(含コード&リンク): http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3877.txt
[3] 環境
[3.1] OS: Windows
[3.2] コンパイラ名とバージョン
[3.3] 言語:C
[4] 期限:出来るだけ早めでお願いします。無理言ってすいません。
[5] その他の制限: 現在習っているのが制御文、配列、文字と文字列、関数です。初心者なのでよろしくお願いします。
0243デフォルトの名無しさん
2007/04/26(木) 22:15:20http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3878.txt
0244デフォルトの名無しさん
2007/04/26(木) 22:34:39[2] 問題文(含コード&リンク):
[3] 環境
[3.1] Linux
[3.2] gcc 3.36
[3.3] C
[4] 2007年4月27日
[5] 非再帰で且つ要素数が奇数でも2^n個でもソートできるようなマージソート関数をお願いします。
再帰かけるとスタックオーバーフローの恐れがあるので非再帰版も作ることにしました。
よろしくお願いします
0245243
2007/04/26(木) 22:37:190246243
2007/04/26(木) 22:42:09http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3880.txt
ごめん、他の作業をしていたので気を取られてた。
0247デフォルトの名無しさん
2007/04/26(木) 23:03:33[1] 授業単元:プログラミング
[2] 問題文(含コード&リンク):
1000個までの、整数あるいは少数を打ち込んで、
その平均と標準偏差を表示することのできるプログラムを作成せよ。
[3] 環境
[3.1] OS:Windows xp
[3.2] コンパイラ名とバージョン:
[3.3] 言語:C
[4] 期限: 2007年5月5日まで]
[5] その他の制限:特にないです。
Windows xp Visual Studioを使っております。
よろしくお願いします。
0248デフォルトの名無しさん
2007/04/26(木) 23:07:58一体どれだけあれば気が済むんだ?
0249デフォルトの名無しさん
2007/04/26(木) 23:11:02いや少数じゃなくて小数の間違いだと思うよ
0250デフォルトの名無しさん
2007/04/27(金) 00:31:11書いてみたけど何か遅いな。こんなものなのかな
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3881.txt
0251デフォルトの名無しさん
2007/04/27(金) 00:38:55すごく・・・早いです・・・
どうもありがとうございます
読んでみます
0252デフォルトの名無しさん
2007/04/27(金) 00:44:58はずなんだが、このプログラムは標準関数qsort()の1/10程度の
速度しか出てないような気がする。もっと改良できるはずなんだが
0253デフォルトの名無しさん
2007/04/27(金) 00:47:120254デフォルトの名無しさん
2007/04/27(金) 01:17:25http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3882.txt
0255デフォルトの名無しさん
2007/04/27(金) 01:24:02http://www.codereading.com/algo_and_ds/algo/merge_sort.html
たとえばこれ。再帰版なんだが、>>250より遥かに高速だ。
>>250は元々シーケンシャルアクセスしかできないデバイスに適用できる
アルゴリズムで、コピーの回数が相当多いため遅くなっているのだと思う。
0256デフォルトの名無しさん
2007/04/27(金) 23:10:560257デフォルトの名無しさん
2007/04/27(金) 23:24:18ちょwwww
お前コテとトリップつけてこのスレに居座ってくれ。
俺はGW中は答える暇がないと思うので。
0258デフォルトの名無しさん
2007/04/27(金) 23:27:42ならないと投げてこないと思う。
まさにゆとり。
0259デフォルトの名無しさん
2007/04/27(金) 23:28:350260デフォルトの名無しさん
2007/04/27(金) 23:36:26[1] 授業単元:cプログラミング
[2] 問題文(含コード&リンク):
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3883.txt
[3] 環境
[3.1] OS:Windows xp
[3.2] コンパイラ名とバージョン: gcc
[3.3] 言語:C
[4] 期限: G.W明け
[5] その他の制限:特になし。 お願いします。
0261デフォルトの名無しさん
2007/04/27(金) 23:37:10俺GW暇だからちょっと難しい問題でもがんばっちゃうYO
といっても休みはカレンダー通りだけどな・・・ orz もっと寝ていたい
0262デフォルトの名無しさん
2007/04/28(土) 00:08:29fflush(stdin);は環境依存かも
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3884.txt
お酒の見ながらやったから間違ってても気にしない
0263デフォルトの名無しさん
2007/04/28(土) 00:15:49まぁそこらへんは自分で工夫してちゃんと表示されるようにがんばれ
0264デフォルトの名無しさん
2007/04/28(土) 00:54:15http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3888.txt
0265デフォルトの名無しさん
2007/04/28(土) 00:57:29[2] 問題文(含コード&リンク):
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3885.txt
weather_3.datの中身↓
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3886.txt
[3] 環境
[3.1] OS: Linux
[3.2] コンパイラ名とバージョン: gcc
[3.3] 言語:C
[4] 期限: なるべく早く、お願いします。できれば朝までにお願いします。
[5] for文でお願いします。なるべく簡単にお願いします。
すみません、問題が多いですがよろしくお願いします。
0266デフォルトの名無しさん
2007/04/28(土) 01:55:37「なるべく早く」やれって
0267デフォルトの名無しさん
2007/04/28(土) 02:06:16weather_3.datのEOFは最後のデータ(その場合117)の後ろかい?
出来れば最後のデータの後ろには改行コードを入れてくれれば良いのだが・・・
0268デフォルトの名無しさん
2007/04/28(土) 02:22:00とりあえず練習1、配列でって言ってるしweather_3.datの中身固定ってことで決め打ちしたからな
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3889.c
練習2の上記の操作ってどれよ?
0269268
2007/04/28(土) 02:25:050270265
2007/04/28(土) 02:43:31ごめんなさい。
>>267
たぶんそうだと思います。
>>268
ありがとうございます。
すみません、weather_3.datの中身は本当はわからない状態で出すんです。
あとweather_3.datは端末エミュレータから入力して
やっているんです。
emacs ~~.c > weather_3.dat 見たいな感じで…
あとARRAY_SIZEってなんでしょうか?
ごめんなさい。こんな時間に…
0271デフォルトの名無しさん
2007/04/28(土) 02:59:01練習3
練習2の処理を行ったあと,もう一度別のループで奇数番目のデータを配列bの残り部分に移動せよ.
結果が正しいことを確かめよ.
> 配列bの残り部分
とはなんぞや?何が残り?
0272268
2007/04/28(土) 03:05:15こういうことでいいのか?C89では配列の要素数は定数でしか指定できないから
C99では変数でもできるけどやったことないので他の人に頼んでください
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3891.txt
練習1と2の違いは何ぞや?
0273デフォルトの名無しさん
2007/04/28(土) 03:16:08http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3892.txt
自分でもなんだかよく分からず、きんもぉ〜〜〜☆なソースになったがw
0274デフォルトの名無しさん
2007/04/28(土) 03:19:440275268
2007/04/28(土) 03:29:590276デフォルトの名無しさん
2007/04/28(土) 03:33:240277デフォルトの名無しさん
2007/04/28(土) 03:34:080278デフォルトの名無しさん
2007/04/28(土) 03:36:38全体の実力に合わせて問題作っている感じがするんだけど。
専門学校かも?
0279デフォルトの名無しさん
2007/04/28(土) 03:42:48一年以上経ってるなら逆に心配になってくる
0280デフォルトの名無しさん
2007/04/28(土) 07:42:590281デフォルトの名無しさん
2007/04/28(土) 08:44:36お前がやってやればいいだろ。
0282265
2007/04/28(土) 09:30:55皆さんが使っている関数?が難しくて全然わからないです…
問題文はそのまま書いたので1、2の違いはなんとも…
>>279
去年の前期で一度単位を落としてしまいまして、少し遅いんです。
これまでに習ってプログラミングをやるときに使ったのは
#include <stdio.h>,#include <math.h>,#include <stdlib.h>,
main関数,int,double,printf,scanf,while,if,for
だけなんです。
前回の配列部分も休んでしまってわからないんです。
だからそれ以外はさっぱり…です…
0283デフォルトの名無しさん
2007/04/28(土) 09:57:59そんな態度だから単位落すんだよ。休んだから配列が分らないだ?
教科書を読めば分るだろ。黄金週間中に教科書を頭から読んで
練習問題やりまくれば何とかなるよ。あと、問題文が凄く分りにくいから
出題者に文句言って、分りやすく作り直してもらった方が良さげ
0284265
2007/04/28(土) 11:44:03授業でてないからってそれじゃあだれですよね.
そこでプログラミングC言語の専門書買って最初から勉強しようと思うのですが
おすすめの専門書ありませんか?
0285デフォルトの名無しさん
2007/04/28(土) 11:49:57専門書なんか買っても金の無駄だと思うけど
できれば単位取るのを諦めて、他の道へ進むのを考えるのがオススメ
0286265
2007/04/28(土) 12:05:37教科書はありますが,少しわかりにくくて...
最近,大学やめることを悩んだんですよね...
今の勉強がおもしろくないし,ついていけてない.
いろんな人に相談して,やりたいことないのにやめるのは
やっぱりよくないということで,通い続けているんです.
特にプログラミングがついていけてなくて...
関係ないレスになってしまってすみません.
0287デフォルトの名無しさん
2007/04/28(土) 12:08:08さっさとやりたいことを見つけてやめればいいだろ
プログラミングを勉強するより、そっちに努力しろ
0288デフォルトの名無しさん
2007/04/28(土) 13:08:47問題文は順を追ってプログラムを完成させるような感じみたいだが・・・
それほど難しいもんでもないと思うが・・・。関数だって難しいもんは使ってへんよ?
アルゴリズムが分からんだけじゃね?
0289デフォルトの名無しさん
2007/04/28(土) 14:25:06何を作れと指示されているのかの解釈が難しいんだよね
・「配列aに読み込み,別の配列bにデータが逆順となるよう入れ替えよ」とは
配列aから配列bにコピー、ってこと?
・「配列bに上記の操作をしてデータを移動せよ.」とは
むーぶ?
例えば配列aから配列bにコピー後、配列aの内容を0クリア、でいい?
・「もう一度別のループで奇数番目のデータを配列bの残り部分に移動せよ.」
上に倣って、元の要素が配列のサイズの半分以下という条件で、
配列bの奇数番目のみをコピーしつつ0クリア、でいい?
あまりに問題に抜けが多くて想像して作ってもいいけど難易度高すぎ
(...ひょっとして授業中に前提となるものが提示済みなのか?)
0290デフォルトの名無しさん
2007/04/28(土) 14:37:310291デフォルトの名無しさん
2007/04/28(土) 15:05:330292デフォルトの名無しさん
2007/04/28(土) 15:10:51ハリウッド板南極物語は、動物のお医者さん犬だったorz
0293デフォルトの名無しさん
2007/04/28(土) 15:25:15じゃ、君がビート版に
0294デフォルトの名無しさん
2007/04/28(土) 16:40:40>>>159 問2 番兵をINT_MAXにしたが、INT_MAXを入力されるとかなわんなあ
>a[10] = INT_MAX; /* 番兵 */
>for (i = 0; a[i] != INT_MAX; i++)
>if (a[i] == x) {
>printf("%d\n", i);
>return 0;
>}
番兵の使い方が間違っているZo
a[10] = x; /* 番兵 */
for (i = 0; a[i] != x; i++)
;
if(i<10) printf("%d\n", i); else printf("-1\n");
0295デフォルトの名無しさん
2007/04/28(土) 17:07:01・検索対象の値そのものを配列の末尾に加えておく。
・すると、ループの最後まで行けば必ず見つかるので、終了判定はいらない。
・見つかったのが目標物なのか番兵かは、添え字がどこまで進んだかで判定。
というものだな。
0296デフォルトの名無しさん
2007/04/28(土) 17:14:300297デフォルトの名無しさん
2007/04/28(土) 17:17:480298デフォルトの名無しさん
2007/04/28(土) 17:20:18英語のほうを見ると1.の用法(¥0で文字列終了とか)しか書いてないな。
0299デフォルトの名無しさん
2007/04/28(土) 17:53:36好きなことで分からないなら何故調べようとしない?
配列が分からないなら分からないなりに簡単なコード書いてみて
それいじくるところから始めてもう一度教科書読めよ
関数名くらいぐぐれ
0300デフォルトの名無しさん
2007/04/28(土) 17:58:24漏れはここを参照している
0301デフォルトの名無しさん
2007/04/28(土) 18:00:23よく読むだ、しむらぁ〜
「やりたいこと」ではなく「やりたいことない」だぁ
0302デフォルトの名無しさん
2007/04/28(土) 18:09:32消してしまったか。
0303デフォルトの名無しさん
2007/04/28(土) 18:16:34それで結局授業出てないならやめるべきだな…
0304デフォルトの名無しさん
2007/04/28(土) 18:21:18やりたいことないからとりあえず大学って
うらやましぃ〜
大学卒業したかったよorz
0305デフォルトの名無しさん
2007/04/28(土) 18:52:52http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3894.txt
0306デフォルトの名無しさん
2007/04/28(土) 18:57:360307デフォルトの名無しさん
2007/04/28(土) 19:12:14scanfの書式設定で%dとint型変数の指定はいただけない
0308デフォルトの名無しさん
2007/04/28(土) 19:13:32[1] 授業単元:C言語
[2] http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3895.txt
>>22の問題(>>30-31さんに書いていただいた)ものの機能拡張です。
[3] 環境
[3.1] OS: Windows
[3.2] コンパイラ名とバージョン: gcc
[3.3] 言語: C
[4] 期限:
[5] 制限:なし。
よろしくお願いします。
0309デフォルトの名無しさん
2007/04/28(土) 20:06:110310デフォルトの名無しさん
2007/04/28(土) 20:07:350311デフォルトの名無しさん
2007/04/28(土) 20:15:01まぁ、細かいことを言ってたらキリがなくなるんで、あとは個人で追求するだけ追及かね。
宿題は目的が果たせていりゃとりあえずおk。
0312デフォルトの名無しさん
2007/04/28(土) 20:39:29じゃあとりあえずはfgetsとstrtol使っとけばおk?
0313デフォルトの名無しさん
2007/04/28(土) 21:03:02適当です。線形リストのが楽だ。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3897.zip
0314デフォルトの名無しさん
2007/04/28(土) 21:22:08文字から整数にしてみた。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3898.txt
0315265
2007/04/28(土) 22:37:59最初から勉強し直してみます。
0316デフォルトの名無しさん
2007/04/28(土) 22:48:01[2] 問題文(含コード&リンク):
英文字列の指定した範囲を逆順にするプログラムを次のように書け。
(1)文字列は下のものをmainに文字配列として用意する:
Google agreed to its largest acquisition yesterday, reaching a deal to purchase DoubleClick.
(2)逆順にする範囲はキーボードから入力する。この範囲を第m番目と第n番目(0≦m<n)として
mとnが、妥当な数値(つまり、文字配列の添字範囲内)であることもチェックする。
(3)関数pswapを利用する。つまり、与えられた文字配列の上で2つの文字[文字ペア]を入れ替
えることを繰り返すことで全体(指定範囲の文字列)を逆順にする。文字ペアとして何に着目す
ればよいか考える。
(4)出力は、入力した文字列と逆順にした文字列(を含む全体文字列)、および最後に逆順にした文
字ペアとする。
【実行結果】
Initial: Google agreed to its largest acquisition yesterday,reaching a deal to purchase DoubleClick.
0と91の間の整数を2つ入力せよ: 2 5
Swapped: Goolge agreed to its largest acquisition yesterday,reaching a deal to purchase DoubleClick.
Last pair: l & g
[3] 環境
[3.1] OS:Linux
[3.2] コンパイラ名とバージョン:gcc 3.4
[3.3] 言語:C
[4] 期限:なし
[5] その他の制限:なし
0317デフォルトの名無しさん
2007/04/28(土) 22:55:520318316
2007/04/28(土) 22:57:48void pswap(char *a,int,int);
main() {
char a[]="Google agreed to its largest acquisition yesterday,reaching a deal to purchase DoubleClick.";
int m,n,x,y;
printf("Initial: %s\n",a);
printf("0と91の間の整数を2つ入力せよ: ");
scanf("%d %d", &m,&n);
if((m>=0)&&(n>=0)&&(m<n)&&(n<strlen(a) - 1 ){
while(m<n){
m++;
n--;}
pswap(a,m,n);
printf("Swapped: %s\n",a);
printf("Last pair: %c & %c\n",x,y); }
else
printf("添字の値が範囲外です!\n"); }
void pswap(char *a,int m,int n) {
int temp;
temp=*(a+m);
*(a+m)=*(a+n);
*(a+n)=temp; }
途中までやってみたのですが、Last pairの意味がよく分からないので解説していただけると有難いです。
0319デフォルトの名無しさん
2007/04/28(土) 23:08:300320316
2007/04/28(土) 23:25:41Swapped: Goelgo agreed to its largest acquisition yesterday,reaching a deal to purchase DoubleClick.
0321デフォルトの名無しさん
2007/04/28(土) 23:27:260322316
2007/04/28(土) 23:32:24有難う御座います。助かりました。
できれば、どの様なコードになるか教えていただけませんか?
0323デフォルトの名無しさん
2007/04/28(土) 23:37:270324316
2007/04/28(土) 23:41:59>319さん
有難う御座いました。
あと、自己解決できました。
皆様、有難う御座いました。
0325デフォルトの名無しさん
2007/04/28(土) 23:43:28こんなんでどうよ?
#include <stdio.h>
#include <string.h>
void swap(char *a, int n)
{
char temp;
temp = *a;
*a = *(a + n);
*(a+n) = temp;
}
int main(void)
{
char str[] = "Google agreed to its largest acquisition yesterday, reaching a deal to purchase DoubleClick";
int m, n, i, len = strlen(str);
printf("Initial:%s\n", str);
printf("0から%dの間の数字を2つ入力せよ:", len);
scanf("%d %d", &m, &n);
if(m<0 || n<0 || m>len || n>len || m>n) return 1;
while(n-m>0) {
swap(str+m, n-m);
m++;
n--;
}
printf("Swapped:%s\n", str);
printf("Last pair:%c & %c", str[++n], str[--m]);
return 0;
}
0326デフォルトの名無しさん
2007/04/29(日) 00:22:05[2] 問題文(含コード&リンク):
モンテカルロ法による面積の近似手順により、
領域a = {(x,y)|x≧1,y≧2,(x-1)^2 + (y-2)^2 ≦1}の面積の近似値を計算するプログラムを作成し、これを利用してn=10000とした場合の上の領域の面積、および円周率πの近似値を求めよ。
[3] 環境
[3.1] OS: (Windows/Linux/等々) WinXP
[3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等)Borland C++
[3.3] 言語: (C/C++/どちらでも可 のいずれか) C
[4] 期限: ([yyyy年mm月dd日hh:mmまで] または [無期限] のいずれか)明後日
0327デフォルトの名無しさん
2007/04/29(日) 00:34:15[2] 問題文(含コード&リンク):
1.レポート課題内容: ./a.out 5 2 4 6 8
の形で使うと,その逆転した順に結果を打ち出すプログラムを作れ。
2../a.out n
の形で使うと,指定された個数 n だけ乱数を発生して整列し,その結果を出力するプログラムを仕上げよ。
[3] 環境
[3.1] OS:Windows
[3.2] コンパイラ名とバージョン:gcc 3.4
[3.3] 言語: C
[4] 期限: 2007年4月30日
[5] その他の制限
リンクによるリスト処理の形で仕上げてください。
どなたかよろしくお願いします
0328デフォルトの名無しさん
2007/04/29(日) 00:36:080329デフォルトの名無しさん
2007/04/29(日) 00:42:17>327の問題1は
link reverse(link x){
link t, y= x, r= NULL;
while( y!=NULL ){
t= y->next; y->next= r;
r= y; y= t; }
return r;
}
問題2は
struct node heada, headb;
link t, u, x, a= &heada, b;
for(i= 0, t= a; i<N; i++){
t->next= malloc(sizeof *t);
t= t->next; t->next= NULL;
t-> item= rand()%1000;}
b= &headb; b->next= NULL;
for(t= a->next; t!=NULL; t= u){
u= t->next;
for(x= b; x->next!=NULL; x= x->next)
if( x->next->item > t->item ) break;
t->next= x->next; x->next= t; }
を元に作ってください。本当に失礼しました
0330デフォルトの名無しさん
2007/04/29(日) 00:48:41およそ3
0331デフォルトの名無しさん
2007/04/29(日) 00:53:11[2] 問題文(含コード&リンク):
(1)(0,6)×(0,1)の長方形領域Ωをne個の合同な三角形に分割し一連の番号1,2,...,neをつけ、その頂点の座標を出力するプログラムを作れ。
なおneはキーボードから入力するものとし、分割が不可能な場合はerrorを返せ。
[実行結果]
neを入力 12
1 (○,○) (○,○) (○,○)
.
.
.
12 (○,○) (○,○) (○,○)
(2)Ω内の任意の点Pがどの三角形に属しているか求めるプログラムを作れ。
[実行結果]
Pを入力 3.0 0.5
三角形○
[3] 環境
[3.1] OS:Windows XP
[3.2] コンパイラ名とバージョン: VC.NET
[3.3] 言語:C++
[4] 期限:無期限
[5] その他の制限:特に無し
0332デフォルトの名無しさん
2007/04/29(日) 01:14:03#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#define Nx 1
#define Ny 2
int main()
{
double x, y, s;
int n, count_in = 0, count_out = 0;
srand((unsigned int)time(NULL));
for(n = 0; n < 10000; n++){
x = ((double)rand()/RAND_MAX)*Nx + 1;
y = ((double)rand()/RAND_MAX)*Ny + 1;
if(x >= 1 && y >= 1 && pow(x-1, 2) + pow(y-2, 2) <= 1)
count_in++;
else
count_out++;
}
s = (double)count_in/(count_in + count_out)*Nx*Ny;
printf("s = %f\n", s);
printf("pi = %f\n", 2*s);
return 0;
}
0333デフォルトの名無しさん
2007/04/29(日) 01:44:56とりあえず問題1
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3899.txt
0334デフォルトの名無しさん
2007/04/29(日) 02:05:09問題2
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3900.txt
0335デフォルトの名無しさん
2007/04/29(日) 02:13:09アルゴリズムが分からん……。
正方形に分割してやれば、おのずと合同な三角形にはなるのかな?
0336デフォルトの名無しさん
2007/04/29(日) 03:39:51[2] リンク先のコードを使い、ユニットの作成、指定されたユニットの削除、
学生の作成、指定された学生の削除、学生のユニットへの登録、または解除、
指定した学生の登録しているユニットの表示、などを行う
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3902.zip
[3] 環境
[3.1] UNIX鯖にXPでLogon
[3.2] gcc 3.4
[3.3] C
[4] 無期限
[5] 基本的にはアップしたファイルの中の説明による通りです。
数字によるstruct nodeを作成はできたのですが、
struct node
{
char *name;
int n_students;
struct student students[1000];
node_ptr next;
}
という風に作るやり方がよくわからないのでそれだけでもご教示願えたら
物凄く有難いです。
0337デフォルトの名無しさん
2007/04/29(日) 12:04:00list.hを見ると
struct node
{
int data_item;
node_ptr next;
};
bst.hを見ると
struct node
{
int data_item;
node_ptr left;
node_ptr right;
};
こうなってるんだけど、この2つの関係は?
あと、なんで↓みたいに変わってるんだろう?
>struct node
>{
>char *name;
>int n_students;
>struct student students[1000];
>node_ptr next;
>}
やりたいことは単方向/双方向リストへのノードの追加/削除なんだろうけど、
3種のnode構造体の関係と、何を聞きたいのかが不明確かな。
リストというデータ構造を調べてくると良い。
0338デフォルトの名無しさん
2007/04/29(日) 12:13:14しかし、リストの中にリストがあるというのが解釈するのに難しい。
例えば、市内に存在する学校のリストがある。
そして、学校のノードにはその学校に在学する学生のリストがある。
――という解釈でいいのか?
そもそも、二分木と線形リストは自分でできたということだから、
>>336が分からないというのは、char *nameの扱いのみということでいいのか?
0339デフォルトの名無しさん
2007/04/29(日) 13:18:49list.hの中のstruct nodeを
struct node
{ char *name;
int n_students;
struct student students[1000];
node_ptr next; }
に変更をし、bst.hを
struct student
{int ID;
char *name};
に変更をし云々、といった感じです。
最初のint data_itemをcharにかえる部分で、
node_ptr the_list = create();
printf("Enter a new unit name\n");
scanf("%s", buffer);
node_ptr->name =(char *) malloc(strlen(buffer) + 1);
strcpy(name,buffer);
ってやってみたんですがうまくできないので。
>>338
有体に言えば、
学校の中に複数の教科を登録、それに複数の学生を登録
授業に対して生徒が履修登録をしたりそれを削除したり
といった感じで認識されてるので大体そうだと思います。
nodeの作成→名前を認識→授業ノードの作成というところで
躓いてるので、char*nameの扱いだけでもヒントかなにか貰えたら
物凄く助かります。
0340デフォルトの名無しさん
2007/04/29(日) 16:23:52#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUF_SIZE 256
int main()
{
char *p, *q, buf[BUF_SIZE];
scanf("%s", buf);
if(q = strchr(buf, '\n'))
*q = '\0';
p = (char*)malloc(sizeof(char)*strlen(buf));
strcpy(p, buf);
printf("%s\n", p);
free(p);
return 0;
}
0341デフォルトの名無しさん
2007/04/29(日) 16:25:280342デフォルトの名無しさん
2007/04/29(日) 16:34:34今書いてるコードがよくわからんからあれだが
node_ptr->name =(char *) malloc(strlen(buffer) + 1);
strcpy(name,buffer);
↓
the_list->name =(char *) malloc(strlen(buffer) + 1);
strcpy(the_list->name,buffer);
とかいう落ちってことはないよな・・・
0343デフォルトの名無しさん
2007/04/29(日) 16:37:03#include <stdio.h>
#include <string.h>
#define BUF_SIZE 256
int main()
{
char *p, buf[BUF_SIZE];
scanf("%s", buf);
p = strdup(buf);
printf("%s\n", p);
free(p);
return 0;
}
つーか、>>340は
sizeof(char)*(strlen(buf)+1)
じゃないとダメか。
0344デフォルトの名無しさん
2007/04/29(日) 16:43:110345339
2007/04/29(日) 18:23:13大学のlabから串の関係か書き込みができなかったので。
これから先教えて貰えるかどうかはわからないですが
進捗状況だけアプロダにおいときました。
これからまた大学に戻って続きをするので
レスが遅くなったりするので先に謝罪をさせていただきます。
すいません。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3903.zip
>>340,343
考え方の参考になりました。ありがとうございます
>>342
とりあえずそんな感じで作ってました
charで作るのが初めてだったので。
初歩的質問ですいません。
方向的な確認はできたので、
ものすごく助かります。ありがとうございます
0346デフォルトの名無しさん
2007/04/29(日) 18:45:08遅くなって申し訳ありません。
本当にありがとうございました。
0347デフォルトの名無しさん
2007/04/29(日) 21:39:57線形合同法でできますか??
0348デフォルトの名無しさん
2007/04/29(日) 21:55:21[2] 問題文(含コード&リンク): ビュフォンの針の問題のプログラム(針の本数10000本)
[3] 環境
[3.1] OS: (Windows/Linux/等々) WindowsXP
[3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等) gcc
[3.3] 言語: (C/C++/どちらでも可 のいずれか) C
[4] 期限: ([yyyy年mm月dd日hh:mmまで] または [無期限] のいずれか)月曜日まで
0349デフォルトの名無しさん
2007/04/29(日) 21:57:390350332
2007/04/30(月) 00:34:40こうですか? よくわかりません!
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3904.txt
0351デフォルトの名無しさん
2007/04/30(月) 01:08:03[2] 問題文(含コード&リンク): ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3905.txt
[3] 環境
[3.1] OS: (Windows/Linux/等々) XP
[3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等) VC
[3.3] 言語: (C/C++/どちらでも可 のいずれか) C
[4] 期限: ([yyyy年mm月dd日hh:mmまで] または [無期限] のいずれか) 月曜の午後三時までです。
0352デフォルトの名無しさん
2007/04/30(月) 01:13:090353デフォルトの名無しさん
2007/04/30(月) 10:01:18問1
typedef struct{double re; double im;} Complex;
typedef struct{unsigned day : 6; unsigned month : 4; unsigned year : 11;} Date;
typedef struct{
char** name; char** fastname;
Date birthdate;
enum{male, female}sex;
enum{single, married, windowed, divorced} marstatus;} Person;
うーん、なんかDateが間違ってる気がする。
0354デフォルトの名無しさん
2007/04/30(月) 10:08:06Person family[N];
int count = 0;
for(i=1; i<=N; i++){
if(family[N].sex == female) && family[N].marstatus == single) {count += 1;}}
0355デフォルトの名無しさん
2007/04/30(月) 10:14:38これはchar* name; char* fiastname;だな。
二重に恥ずかしい間違いだ。
0356デフォルトの名無しさん
2007/04/30(月) 10:43:45返事が遅れてしまい申し訳ありません。
助かりました。これを元に一から考え直してみようと思います。
ありがとうございました。
0357デフォルトの名無しさん
2007/04/30(月) 11:19:37fiastの方が恥ずかしいだろ
0358デフォルトの名無しさん
2007/04/30(月) 11:40:36>>349
おねがいしますorz
0359デフォルトの名無しさん
2007/04/30(月) 15:15:400360デフォルトの名無しさん
2007/04/30(月) 15:51:04rand()なんか使うなはともかく、rand()って欲しい範囲にするために割っていいんだっけ?
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
int main()
{
int count = 0;
int trial = 10000;
int i;
double p;
srand(time(NULL));
for (i = 0; i < trial; i++) {
double d = (double)rand() / RAND_MAX;
double t = (double)rand() * M_PI / 2.0 / RAND_MAX;
if (d <= cos(t)) count++;
}
p = (double)count / (double)trial;
printf("PI=%f¥n", 2.0 / p);
}
0361デフォルトの名無しさん
2007/04/30(月) 15:51:45[2] http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3907.txt
[3] 環境
[3.1] OS: WindowsXP
[3.2] コンパイラ名とバージョン:gcc
[3.3] 言語: C
[4] 期限:
[5] 制限:scanfは使わない
よろしくお願いします!
0362デフォルトの名無しさん
2007/04/30(月) 15:53:55y座標をランダムに振る必要もないし、角度を使うと標準の円周率に頼らざる得ないし、
まあ、てきとうです。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3906.txt
0363デフォルトの名無しさん
2007/04/30(月) 15:55:200364デフォルトの名無しさん
2007/04/30(月) 15:56:47このスレのどこかにある。
0365デフォルトの名無しさん
2007/04/30(月) 16:05:24仕様の部分やエラー処理で不具合があったので
再度掲載させていただきました。よろしくお願いします。
0366デフォルトの名無しさん
2007/04/30(月) 16:18:45期限が書いてないぞ
0367デフォルトの名無しさん
2007/04/30(月) 16:29:36期限は1日〜遅くて7日です。
0368デフォルトの名無しさん
2007/04/30(月) 16:36:500369デフォルトの名無しさん
2007/04/30(月) 17:16:18どのへんに問題あったのか書いてくれないの?
一から作るのめんどい
0370デフォルトの名無しさん
2007/04/30(月) 17:19:24解凍後の表示がされないのと、エラー処理の2つ目です。
よろしくお願いします。
0371デフォルトの名無しさん
2007/04/30(月) 17:28:01「期限」の意味わかってる?
普通は「遅くても5/7まで」とか書くんだよ?
0372デフォルトの名無しさん
2007/04/30(月) 19:43:19http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3908.txt
0373デフォルトの名無しさん
2007/04/30(月) 19:52:56*の後ろに数字が来たらという条件に直しておいて
0374デフォルトの名無しさん
2007/04/30(月) 19:56:090375デフォルトの名無しさん
2007/04/30(月) 20:01:31http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3909.txt
0376デフォルトの名無しさん
2007/04/30(月) 20:19:31ありがとうございました!
0377デフォルトの名無しさん
2007/04/30(月) 20:19:57[2] 問題文(含コード&リンク):
定数a,c,初期値X0、発生させる乱数の個数nを入力すると、
線形合同法によって区間[0,1]上に一様に分布する算術乱数を発生し、
得られた乱数を遅れ1から遅れ10までの系列相関検定を行うプログラムを作成し、
n=2000000個の乱数を発生させ、危険率1%(2.326よりtが小さければ良い)で系列相関検定を行え。
[3] 環境
[3.1] OS: (Windows/Linux/等々) WindousXP
[3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等) gcc
[3.3] 言語: (C/C++/どちらでも可 のいずれか) C言語
[4] 期限: ([yyyy年mm月dd日hh:mmまで] または [無期限] のいずれか) 今日中
0378デフォルトの名無しさん
2007/04/30(月) 21:26:510379デフォルトの名無しさん
2007/04/30(月) 21:31:10あー針の下端が針に一番近いラインより下にあれば交わってるってことか、面白いなぁ
0380デフォルトの名無しさん
2007/04/30(月) 21:46:05boostのmt19937を使ったけど一向に収束しねえなw
0381デフォルトの名無しさん
2007/04/30(月) 22:07:07公式?
Pk = 12/n×Σ(XiXi+k) -3
(Σはi=1からi=n-k)
(k=1から10)
t = √(n-2)×Pk/√(1-Pk^2)
で、tが2.326より小さければOKと出るようにすれば良いと思います!
よろしくおねがいしますorz
0382デフォルトの名無しさん
2007/04/30(月) 22:25:470383初心者
2007/04/30(月) 23:05:11#define N 20
void print_queens(int Q[N][N],int n){int i,j;
for(i=0;i<n;i++){ for(j=0;j<n;j++){if(Q[i][j]==1)printf("1");
else if(Q[i][j]==0)printf("0");}
printf("\n"); }}
int check(int i,int j,int Q[N][N], int n){int I,J,sum=0;for(J=0;J<n;J++)if(Q[i][J]==1 && J!=j)sum++;
for(I=0;I<n;I++)if(Q[I][j]==1 && I!=i)sum++;
for(I=0;I<n;I++ ){for(J=0;J<n;J++){if(i+j==I+J && Q[I][J]==1 && J!=j && I!=i)sum++; }}
for(I=0;I<n;I++ ){for(J=0;J<n;J++){if(i-j==I-J && Q[I][J]==1 && J!=j && I!=i)sum++;}} return (sum);}
int main(void){ int Q[N][N], P[N],n,kensaku=1,flag,i,j,I,J,a;
printf("クイーンの数を入力しなさい\n"); scanf("%d",&n);
for(i=0;i<n;i++){for(j=0;j<n;j++){ Q[i][j]=0; P[i]=0;}}
for(i=0;i<n;i++){for(j=P[i];j<n;j++){if( check(i,j,Q,n)==0){Q[i][j]=1; P[i]=j}
while( j==n ){ P[i]=0; j=P[--i];Q[i][j]=0;P[i]++;i--;}}
print_queens(Q,n); } return(0); }
while( j==n ){P[i]=0;j=P[--i];Q[i][j]=0;P[i]++; i--;}このwhile文をi--をけして正常に結果がえられるように改良していただきたいと思っています。i--がなくても正常な結果がえられると言うのですが僕にはそのプログラムが作れません。
どうか、作ってはいただけませんか?? お願いします。
0384デフォルトの名無しさん
2007/04/30(月) 23:07:33その公式どおりやるとPkが4294815800程度になるので
√(1-Pk^2)の部分がエラーになっちゃうんだけど
0385デフォルトの名無しさん
2007/04/30(月) 23:18:19すげー醜い、すれ違い、清書したものをうpロダにうpして出直し!
0386デフォルトの名無しさん
2007/04/30(月) 23:21:13初心者でもこれは酷すぎる
改行インデントくらいしろ
俺も初心者だけど、ここまで酷いソースにはできない
0387デフォルトの名無しさん
2007/04/30(月) 23:22:49またお前か、それについてgdgd言うけど、ここに書く際に改行を省略しただけだろ。うるせーんだよ
ろくに答えもしないくせにソース批判しかしないボケは
0388デフォルトの名無しさん
2007/04/30(月) 23:24:330389247
2007/04/30(月) 23:36:23今まで書き込みが規制中やらで書き込みができませんでした。
0390デフォルトの名無しさん
2007/04/30(月) 23:41:29while( j==n ){P[i]=0;j=P[--i];Q[i][j]=0;P[i--]++;}
こういうこと?
0391初心者
2007/05/01(火) 00:02:19書き直しました
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3911.txt
>390
それで実行できますかね??
一応きれいなものをupしました
0394デフォルトの名無しさん
2007/05/01(火) 00:07:42確認だけど、今現在は正しい結果が得られるの?
で、ループの中からi--を消せばいいの?
あとスレ違いなんだけどそこは理解できた?
0395デフォルトの名無しさん
2007/05/01(火) 00:11:23理屈ではありえないとは思うんですが、実際に条件をn-1にすると実行できません
>394
一応正しい結果は出てます。
二番目のwhile文のなかのi--を消したいのですが
スレ違いですか、すいません
0396デフォルトの名無しさん
2007/05/01(火) 01:07:31とりあえず以下3点、気になる事があるんだが
int success(int Q[N][N],int n)中の
done==1;の==。
int main(void)中の
P[i]=j;の次の行。
if(success(Q,n)==1);{の;。
>i--を消したいのですが
goto使えば出来るんじゃない?
それかfor(i=0;i<n;i++)のi++を最後に書いてcontinueとか
0397デフォルトの名無しさん
2007/05/01(火) 01:12:24なんだこれ
0398デフォルトの名無しさん
2007/05/01(火) 01:22:04抽象化した結果表現されるものは、設計者が想定した概念やイメージだ。しかし、
実在するものそのものではなく、人が考えたものであるために、このイメージは
非常に脆く、不安定だ。外部からの影響をもろに受け、形を変え易い。個々人が
持つイメージの些細な相違から認識のずれが生じ易い。扇風機の使い方は人に
よって異なることはないが、人がイメージしたものは、その生成から、破棄に至る
まで、非常に不安定な状態になり易い。それを防ぐには、イメージそのものをなる
べく強固なものにし、インターフェースに一貫性と整合性をもたせ、外因による影響
を受けに難くく、壊れ難くするための技術を見につけ、理解を深めておくしかない。
仮想化とは対象物を不完全ながらもその性質や姿を模倣し現出させることだ。
対して抽象化は、対象物のある特徴的な側面を抽出し概念化することだ。
仮想化で抽象化の技術が使われることはあるだろうが、その逆は考え難い。
コンピュータを使い、扇風機やコタツを抽象化することはできても、仮想化する
ことはできないのだ。少なくとも今の技術では無理だ。コンピュータがその姿形
を変えることはできないのだから。コンピュータが仮想化できるものは、コンピュー
タそのものが直接扱うものだけだ。例えば、仮想メモリ、仮想ネットワーク、仮想
マシン、仮想キーボードといったものだ。
0399デフォルトの名無しさん
2007/05/01(火) 01:32:51死ねよカス
0400デフォルトの名無しさん
2007/05/01(火) 01:34:17[2] 問題文(含コード&リンク):2つの3行3列の行列の和を求め、表示する
プログラムを作成しなさい。
[3] 環境
[3.1] OS:Windows
[3.2] コンパイラ名とバージョン:VC 2005
[3.3] 言語:C++
[4] 期限:5月1日正午まで
[5] その他の制限:3つの2次元配列a[3][3],b[3][3],c[3][3]を宣言し、
配列a,bを3行3列の行列の値で初期化して、各要素の
和を配列cに入れる。
お願いします。
0401デフォルトの名無しさん
2007/05/01(火) 02:16:00int main()
{
int a[3][3] = {1, 2, 3,
4, 5, 6,
7, 8, 9},
b[3][3] = {1, 0, 0,
0, 1, 0,
0, 1, 1},
c[3][3], i, j;
for(i = 0; i < 3; i++)
for(j = 0; j < 3; j++)
c[i][j] = a[i][j] + b[i][j];
for(i = 0; i < 3; i++){
for(j = 0; j < 3; j++)
printf("%3d", c[i][j]);
printf("\n");
}
return 0;
}
0402デフォルトの名無しさん
2007/05/01(火) 02:19:41#include <cstdio>
int main(void){
int a[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
int b[3][3] = {{1 ,1, 1}, {1, 1, 1}, {1, 1, 1}};
int c[3][3];
for(int 縦=0; 縦!=3; 縦++){
for(int 横=0; 横!=3; 横++){
c[縦][横] = a[縦][横] + b[縦][横];
printf("%d ", c[縦][横]);}
printf("\n");} return 0;}
0404デフォルトの名無しさん
2007/05/01(火) 02:31:42拡張子をcppにしてコンパイルすればC++のソースとして使える
だっておーー(バンバンAA略)
0405デフォルトの名無しさん
2007/05/01(火) 02:40:080406デフォルトの名無しさん
2007/05/01(火) 02:41:47それがスタンダードかどうかは別として。
0407デフォルトの名無しさん
2007/05/01(火) 02:43:240408デフォルトの名無しさん
2007/05/01(火) 02:55:240409デフォルトの名無しさん
2007/05/01(火) 02:59:200410デフォルトの名無しさん
2007/05/01(火) 03:08:39配列を使うこと自体がメモリ配置を意識してしまってCっぽいと感じるがどうなんだろ。
#include <iostream>
using namespace std;
int main(void)
{
const RowCnt = 3;
const ColCnt = 3;
int a[RowCnt][ColCnt] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} };
int b[RowCnt][ColCnt] = { {1 ,1, 1}, {1, 1, 1}, {1, 1, 1} };
int c[RowCnt][ColCnt];
for(int Row = 0; Row < RowCnt; Row++){
for(int Col = 0; Col < ColCnt; Col++){
c[Row][Col] = a[Row][Col] + b[Row][Col];
cout << c[Row][Col] << " ";
}
cout << endl;
}
return 0;
}
0411デフォルトの名無しさん
2007/05/01(火) 14:46:02[2] 問題文 (含コード&リンク) : スレッドの課題
1) 実行をすると、スレッドを使って現在いるディレクトリの中にあるファイル名と、
ファイルの合計数を出力するCプログラムを書きなさい。
ただし、個々のスレッドがそれぞれのファイル名を出力するものとします。
2) 指定したディレクトリを読み込んで、そのディレクトリの名前、
中に入ってるファイル名をすべて出力するCプログラムを書きなさい。
指定したディレクトリ内に別のディレクトリが存在する場合、
ディレクトリの名前の前に(d)という文字を付けなさい。
ただし、個々のスレッドがそれぞれのディレクトリ名、ファイル名を出力するものとします。
また、ディレクトリを指定しなかった場合、現在いるディレクトリの中にあるファイル名等を出力しなさい。
入力例:./two d1 /d2 ../d3
[3] 環境
[3.1] OS:Linux
[3.2] コンパイラ名とバージョン:gcc 3.4
[3.3] 言語:C言語
[4] 期限:2007年05月03日08:00まで
[5] その他の制限:特にありません。
丸投げでよろしくお願いします。
0412デフォルトの名無しさん
2007/05/01(火) 16:58:210413デフォルトの名無しさん
2007/05/01(火) 17:11:560414デフォルトの名無しさん
2007/05/01(火) 17:20:06公式は教科書のだから合ってると思うんですがorz
[0,1]の乱数でそうなっちゃいますか??
0415gost
2007/05/01(火) 17:47:37>>
unsigned long a;
unsigned long b;
a と b には任意の値が格納済みであるとして、加算するとオーバー
フロー(0xFFFFFFFFを超える)の場合、"Overflow"、オーバーフロー
しない場合、"(a+b) OK" を出力するプログラム 教えてください
条件:
if((a + b) > 0xFFFFFFFF) の判定は使えません。
if((a + b) <= 0xFFFFFFFF) の判定は使えません。
a と b を加算してはなりません。
0416デフォルトの名無しさん
2007/05/01(火) 17:54:200417デフォルトの名無しさん
2007/05/01(火) 18:31:13ではいかんか?
0418デフォルトの名無しさん
2007/05/01(火) 19:40:11[2] 問題文: 入力された任意の自然数が3の倍数か否かを判断するプログラムを
�@のアルゴリズムにしたがって作成せよ
アルゴリズム�@
各要素T(nj、r)は(nj+r)%3の値とする
k術の自然数n0n1・・・・nk-1が入力されたとする・
1:i←0 r←0.
2:i < kであるかぎり、以下を繰り返す。
3:r=0ならば、’Yes’そうでなければ’No’。
ヒント
任意桁数(ただし100桁以下)の整数の入力部はc言語では次のように書けばよい
main()
{
int i, r, n[100], k;
k=0;
printf("自然数を入力してください ?\n”);
whlie((n[k]=getchar()i=''\n){ /*n[k]に数字一字を読み込む*/
n[k]-='0'; /*その数字を対応する1術数値に変える。*/
k++;
}
[3] 環境
[3.1] OS: Linux
[3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等)
[3.3] 言語: C言語
[4] 期限: ([2007年05月02日12:00まで
[5] その他の制限: 特にありません。
まったく覚えていないので、誰かお願いします
0419デフォルトの名無しさん
2007/05/01(火) 22:09:21k術とか1術数値ってなんですか?
0420デフォルトの名無しさん
2007/05/01(火) 22:41:25#include <stdio.h>
int main()
{
int i, r = 0, n[100], k = 0, T[100];
while((n[k] = getchar()) != '\n')
n[k++] -= '0';
for(i = 0; i < k; i++)
r = (10*r + n[i])%3;
if(r == 0)
printf("3の倍数\n");
else
printf("3の倍数ではない\n");
return 0;
}
0421デフォルトの名無しさん
2007/05/01(火) 22:46:190422デフォルトの名無しさん
2007/05/01(火) 23:11:53for(i=0,r=0; i<k; i++) r += n[i];
if(r%3==0) ……
ってした方が簡単じゃね?
0423デフォルトの名無しさん
2007/05/01(火) 23:15:000424418
2007/05/01(火) 23:17:15http://www-ui.is.s.u-tokyo.ac.jp/~takeo/course/2005/algorithm/note-1.pdf#search='%EF%BC%93%E3%81%AE%E5%80%8D%E6%95%B0%20%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0'
ここの 3ページの 3の倍数の判定 ってところの表を配列でプログラミング
すればいいと思うのですが自分にはさっぱりです
0425デフォルトの名無しさん
2007/05/01(火) 23:33:16int main()
{
int i, r, n[100], k = 0;
while((n[k] = getchar()) != '\n')
n[k++] -= '0';
for(i = 0, r = 0; i < k; i++)
r = (n[i] + r)%3;
if(r == 0)
printf("Yes! 東大万歳!\n");
else
printf("No! 単位取得は人任せ!\n");
return 0;
}
0426デフォルトの名無しさん
2007/05/01(火) 23:40:04配列を使うんならこうか?
#include <stdio.h>
int main(void)
{
int n[100], i, k = 0, r;
int T[10][3] = {{0, 1, 2}, {1, 2, 0}, {2, 0, 1},{0, 1, 2}, {1, 2, 0},
{2, 0, 1},{0, 1, 2}, {1, 2, 0}, {2, 0, 1},{0, 1, 2}};
while((n[k]=getchar())!='\n') n[k++] -= '0';
for(i=0, r=0; i<k; i++) r = T[n[i]][r];
if(r==0) printf("3で割り切れる\n");
else printf("3で割り切れない\n");
return 0;
}
0427デフォルトの名無しさん
2007/05/01(火) 23:43:36なるほど。
0428デフォルトの名無しさん
2007/05/01(火) 23:59:03[2] 問題文(含コード&リンク):三角形の三辺の長さを入力すると三つの角の角度と三角形の面積を求めるプログラム
三辺の長さをmain の部分で入力。角度、面積を求める部分を1つの関数にする。三辺の長さを引数として関数に渡す。
△abc=(s*(s-a)*(s-b)*(s-c))^0.5 s=(a+b+c)/2
関数のreturnとして面積を、ポインタを用いて3つの角度の値をmainに戻す。
[3] 環境
[3.1] OS:Windows
[3.2]
[3.3] 言語: C++
[4] 期限: 5月2日PM9:00
お願いします
0429デフォルトの名無しさん
2007/05/02(水) 00:24:34#include <stdio.h>
#include <math.h>
int main()
{
double a, b, c, s, S;
scanf("%lf%lf%lf", &a, &b, &c);
if(a + b <= c || c + a <= b || b + c <= a){
printf("三角形にならない\n");
return -1;
}
s = (a + b + c)/2;
S = sqrt(s*(s - a)*(s - b)*(s - c));
printf("面積 = %.2f\n", S);
printf("角度1 = %.2f°\n", asin(2*S/(b*c))*180/M_PI);
printf("角度2 = %.2f°\n", asin(2*S/(c*a))*180/M_PI);
printf("角度3 = %.2f°\n", asin(2*S/(a*b))*180/M_PI);
return 0;
}
0430デフォルトの名無しさん
2007/05/02(水) 00:29:190431デフォルトの名無しさん
2007/05/02(水) 00:31:000432429
2007/05/02(水) 00:53:08>>428
#include <iostream>
#include <cmath>
#define M_PI 3.14159265
int main()
{
double a, b, c, s, S;
std::cout << "(a, b, c) > ";
std::cin >> a >> b >> c;
if(a + b <= c || c + a <= b || b + c <= a){
std::cerr << "三角形にならない" << std::endl;
return -1;
}
s = (a + b + c)/2;
S = sqrt(s*(s - a)*(s - b)*(s - c));
std::cout << "面積 = " << S << std::endl;
std::cout << "角度1 = " << asin(2*S/(b*c))*180/M_PI << std::endl;
std::cout << "角度2 = " << asin(2*S/(c*a))*180/M_PI << std::endl;
std::cout << "角度3 = " << asin(2*S/(a*b))*180/M_PI << std::endl;
return 0;
}
0433デフォルトの名無しさん
2007/05/02(水) 00:57:510434デフォルトの名無しさん
2007/05/02(水) 01:04:25>>381
おねがいしますorz
0435デフォルトの名無しさん
2007/05/02(水) 01:12:42http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3913.txt
>>434
もう一度公式を確認して。
0436デフォルトの名無しさん
2007/05/02(水) 01:18:49[2] 問題文(含コード&リンク):
与えられた配列の中から、要素を抜き出すプログラムを作りなさい。
ただし、同じ要素が複数ある場合、その要素は1つだけ抜き出すようにせよ。
例えば、
[0,1,1,0,1]の場合、0,1
[1,2,2,3,3,4]の場合、1,2,3,4
[0,0,3,7,7,7,10,10]の場合、0,3,7,10
となるようにせよ。
[3] 環境
[3.1] OS:Windows
[3.2] gcc
[3.3] 言語: C
[4] 期限: 5/2
よろしくお願いします。
0437デフォルトの名無しさん
2007/05/02(水) 01:46:07includeは消してるから勝手に補完してくれ。後、エラー処理も面倒だからやってないから要注意な
int main(void)
{
int aSample[] = { 0, 1, 2, 2, 3, 4, 4, 5, 4, 6, 8};
char *abValid;
int i, j, size;
/* init */
size = sizeof(aSample)/sizeof(int);
abValid = (char*)malloc(size);
memset(abValid, 1, size); /* fill by NOT zero */
/* main routine */
for (i=0; i<size; ++i)
if (abValid[i])
{
printf("%d ", aSample[i]);
for (j=i; j<size; ++j)
if (aSample[i] == aSample[j])
abValid[j] = 0;
}
putchar('\n');
return 0;
}
0438デフォルトの名無しさん
2007/05/02(水) 01:49:01#include <stdio.h>
#include <limits.h>
#define N 10
int main()
{
int a[N] = {1, 2, 3, 2, 3, 1, 0, 2, 5, 4};
int b[N],i, j, k = 0, flag;
for(i = 0; i < N; i++){
flag = 1;
for(j = 0; j < k; j++)
if(a[i] == b[j]){
flag = 0;
break;
}
if(flag)
b[k++] = a[i];
}
for(i = 0; i < k - 1; i++)
for(j = i; j < k; j++)
if(b[i] > b[j]){
int temp = b[i];
b[i] = b[j];
b[j] = temp;
}
for(j = 0; j < k; j++)
printf("%d ", b[j]);
printf("\n");
return 0;
}
0439438
2007/05/02(水) 01:49:49駄目すぎだ……(´・ω・`)
0440デフォルトの名無しさん
2007/05/02(水) 01:52:44バブルソートも掛けてるのか。律儀だなw
しばらくlimits何処で使ってるんだ?と悩んだ
0441デフォルトの名無しさん
2007/05/02(水) 01:54:07じゃできないでしょうか?
0442デフォルトの名無しさん
2007/05/02(水) 01:54:35じゃ、俺も
#include <stdio.h>
#define N 10
int main(void)
{
int a[N] = { 1, 1, 3, 0, 1, 4, 0 ,1, 0, 9}, b[N];
int i, j, count = 0;
for(i=0; i<N; i++) {
for(j=0; j<count; j++) if(a[i]==b[j]) break;
if(j==count) b[count++] = a[i];
}
for(i=0; i<N; i++) printf("%3d", a[i]);
putchar('\n');
for(i=0; i<count; i++) printf("%3d", b[i]);
putchar('\n');
return 0;
}
0443デフォルトの名無しさん
2007/05/02(水) 01:57:36>[3.3] 言語: C++
どういうことよw
0444デフォルトの名無しさん
2007/05/02(水) 01:58:19みんな不正解です^^
0446デフォルトの名無しさん
2007/05/02(水) 02:00:400447デフォルトの名無しさん
2007/05/02(水) 02:05:43ここでやっていただいたソースなんですが、
int型の変数fの動きと役目がよくわかりません。
どなたか解説していただければ…
0448デフォルトの名無しさん
2007/05/02(水) 02:07:30iostreamとかcmathは使わないとできない問題ですか?
0449デフォルトの名無しさん
2007/05/02(水) 02:19:27http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3914.txt
0450436
2007/05/02(水) 02:29:050451デフォルトの名無しさん
2007/05/02(水) 03:09:38[2] 問題文:arrayに含まれているばらばらになったアルファベットを順番通りにする。
[3] 環境
[3.1] OS: stupid Windows
[3.2] gcc 3.4
[3.3] 言語: C++
[4] 期限: 記入時から5時間後。
ここまで出来ましたが、なぜか20文字のうち5文字しか表示されません。どちら様かオーバーホールをお願いします。
0452デフォルトの名無しさん
2007/05/02(水) 03:11:38#include<string.h>
#define ARRAYSIZE 20
void Sort(char *array[], int size);
int main()
{
char *Alpha[ARRAYSIZE] =
{"j","g","m","l","k","b","r","s","a","i",
"h","n","c","q","d","f","e","o","t","p"};
int k;
Sort(Alpha, sizeof(*Alpha));
cout << endl << endl;
cout << "Sorted Numbers: ";
for (k = 0; k < sizeof(*Alpha)+1; k++)
cout << Alpha[k] << " ";
cout << endl << endl << endl;
//system("PAUSE");
return 0;
}// end main()
void Sort(char *array[], int size)
{
int pass, k;
char *temp;
for (pass=0; pass < size - 1; pass++) {
for (k=0; k<size - 1; k++) {
if (strcmp(array[k], array[k+1]) > 0) {
temp = array[k];
array[k] = array[k+1];
array[k+1] = temp;}}}}
0453デフォルトの名無しさん
2007/05/02(水) 03:23:39sizeof(*Alpha)→sizeof(Alpha)/sizeof(*Alpha)
0454デフォルトの名無しさん
2007/05/02(水) 03:33:42おれならこう書いちゃうな
(前略)
Sort(Alpha, ARRAYSIZE);
(中略)
for (k = 0; k < ARRAYSIZE; k++)
(後略)
0455デフォルトの名無しさん
2007/05/02(水) 03:34:49Pk = 12/n×Σ(Xi × Xi+k) -3
書き方悪かったですか??
公式は確認しましたorz
0456デフォルトの名無しさん
2007/05/02(水) 03:35:41スマン、よく見てなかった
0457デフォルトの名無しさん
2007/05/02(水) 07:14:02書き込みThanks.
0458デフォルトの名無しさん
2007/05/02(水) 08:29:15>>426さんのがそれっぽいので今日行って確かめてきます
皆様どうもありがとうございました
0459デフォルトの名無しさん
2007/05/02(水) 13:01:59[2] 問題文
次のタスクを行うC++を作りなさい。
1.ユーザーにStringを入力させる。
2.AかBの選択をさせる。
A入力したStringをシーザー暗号で暗号化させる。
シーザー暗号とは、元のアルファベットを決められた数だけ
ずらす暗号(例:3ずらす、A→D)
何個ずらすかもユーザーに入力させる。
B入力したStringを換字-転字暗号化させる。
換字-転字暗号化とは、アルファべットの順番を並べ変えて
他のアルファベットを作る(例;clear→clear,learc,earcl,arcle,rclea)
3.暗号化されたStringを表示する。
[3] 環境
[3.1] OS: Windows
[3.2] コンパイラ名とバージョン: 不明です。
[3.3] 言語: C++です。
皆さん、どうかお力添えよろしくお願いします。
0460デフォルトの名無しさん
2007/05/02(水) 13:54:43式が良く分りません。こうですか?
ttp://www.borujoa.org/upload/source/upload11425.pdf
0461デフォルトの名無しさん
2007/05/02(水) 14:00:292人の得点を入力し勝者を表示しなさい
実行画面
aさんの得点==>200
bさんの得点==>150
aさんの勝ち
aさんの得点==>100
bさんの得点==>250
bさんの勝ち
aさんの得点==>120
bさんの得点==>120
引き分け
何方かわかる方がいましたら教えてください(ノ_<。)
0462デフォルトの名無しさん
2007/05/02(水) 14:11:23多分、Pk < 1 にならなきゃいかんと思うのだけど、
その公式じゃ、n = 2000000 で k = 1〜10 だと Pk < 1 になってくれない。
0463デフォルトの名無しさん
2007/05/02(水) 14:25:50�A3教科の合計点を計算す。
�B合計点の大きい順に順位をつける
intを指定したあとのプログラミングお願いしまず
5分以内でお願いします。
0464デフォルトの名無しさん
2007/05/02(水) 14:29:00多分Σの括弧の中はi番目のXとi+k番目のXを掛けてるんじゃないかな
0465デフォルトの名無しさん
2007/05/02(水) 14:31:13#include <stdio.h>
#include <math.h>
double func_triangle(double a, double b, double c, double *deg1, double *deg2, double *deg3)
{
double s = (a + b + c)/2, S = sqrt(s*(s - a)*(s - b)*(s - c));
*deg1 = asin(2*S/(b*c));
*deg2 = asin(2*S/(c*a));
*deg3 = asin(2*S/(a*b));
return S;
}
int main()
{
double a, b, c, S, deg1, deg2, deg3;
scanf("%lf%lf%lf", &a, &b, &c);
if(a + b <= c || c + a <= b || b + c <= a)
return -1;
S = func_triangle(a, b, c, °1, °2, °3);
printf("S = %f\ndeg1 = %f\ndeg2 = %f\ndeg3 = %f\n", S, deg1, deg2, deg3);
return 0;
}
0466デフォルトの名無しさん
2007/05/02(水) 14:31:17すいません。
こんな感じです↓
ttp://www.borujoa.org/upload/source/upload11426.pdf
0467465
2007/05/02(水) 14:35:25>>428
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3915.txt
0468411
2007/05/02(水) 16:53:39どなたかやってはいただけないでしょうか?
0469デフォルトの名無しさん
2007/05/02(水) 17:15:23どこにどのように情報が格納されているか分からん・・・
検索してみたら、DOSのdirやUNIX系OSのlsコマンドを自作する内容の書かれた本はあるみたいだが・・・
ttp://www.cbook24.com/bm_detail.asp?sku=4839919844
Chapter18[十八日目] dirコマンド
7 dirコマンド
これを見てみようかと思ってはいるが、本の値段が・・・
これから本屋に行って、あったら見てこようかとは思ったのだが・・・
レスの期限には間に合いそうにないかな・・・スマソ
0470デフォルトの名無しさん
2007/05/02(水) 19:36:32ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3916.cpp
>>461>>463
天麩羅、じゃなくてテンプレを確認して下さい。
0471デフォルトの名無しさん
2007/05/02(水) 20:22:14#include <stdio.h>
#include <math.h>
#define N 200000
#define LCGs(a, c, x) ((a*x)%c) /* 式は適当に変えて */
int main()
{
double p[10], t, sigma;
int a, c, x[N], i, k;
x[0] = 7, a = 1009, c = N; /* 定数と初期値 */
for(i = 2; i <= N; i++)
x[i - 1] = LCGs(a, c, x[i - 2]); /* 乱数を格納 */
for(k = 1; k <= 10; k++){
p[k - 1] = 0;
sigma = 0;
for(i = 1; i <= N - k; i++)
sigma += (double)x[i - 1]/c*x[i - 1 + k]/c;
p[k - 1] = 12.0/N*sigma - 3;
}
for(k = 1; k <= 10; k++){
t = sqrt(N - 2)*p[k - 1]/sqrt(1 - pow(p[k - 1], 2));
printf("P%d = %f\t\tt = %f\t\t", k, p[k - 1], t);
if(abs(t) < 2.326) /* 勝手に絶対値と解釈 */
printf("受容");
printf("\n");
}
return 0;
}
0472デフォルトの名無しさん
2007/05/02(水) 20:33:13[2] 問題文:
与えられた金額に対して、コインの最小化問題の解(枚数)を求める。(複数の場合には1つでよい)
[3] 環境
[3.1] OS: Mac OS
[3.2] コンパイラ名とバージョン: gcc
[3.3] 言語: C
[4] 期限: 5/8(火)まで
[5] その他の制限:
再帰を使うこと。
コインはA[n]の配列に入れて、日本円みたいに1,5,10,50…というコインではなく、
どんなコインの組み合わせに対しても、最小の枚数を求めさせる。
日本円だと大きいコインから順に取っていけばいいのですが、
1円、3円、4円のコインの組み合わせで、6円だったら3円×2枚が最小になる、
みたいな場合があるのでどうすればいいのか分からないです><
0473デフォルトの名無しさん
2007/05/02(水) 21:53:29ttp://homepage3.nifty.com/aokura/src/myls.html
これを解析してディレクトリも表示させて (d) をつける仕様に出来れば・・・
普通に実行したらディレクトリは無視したファイルが表示されたが
実行コマンド -a のオプションをつけたらディレクトリも表示された。
その辺の仕組みを変えてやれば何とかできるかも?
0474411
2007/05/02(水) 22:07:00具体的にどうやれば良いのでしょうか…
初心者ですいません。
0475デフォルトの名無しさん
2007/05/02(水) 22:09:43この辺りにもヒントが出ているけど
name=SUBDIR, size=0, attrib=0x10
name=SAMPLE.DAT, size=207, attrib=0x20
ここの値が(属性とか一切なしの普通の?)ファイルとディレクトリとでは違っていて
ディレクトリだと 0x10 らしいとの内容を >>469 にある本をさっき立ち読みしてきたときにも見かけた。
ただ、使われているヘッダに dos.h があるんで、これはこれで自分でこのヘッダの中にある
ライブラリを実装する必要性があるかも?
0476デフォルトの名無しさん
2007/05/02(水) 22:11:33>>411 が授業でどんな内容を習っているか分かれば、それもヒントになると思うのだが
やったことのない俺にとっては、どのように情報を探してアプローチすりゃ良いかさっぱり・・・
0477デフォルトの名無しさん
2007/05/02(水) 22:35:18ディレクトリの判別等は確か環境依存のはず
授業単元がLinuxとなっているから、unistd.hの中の奴でできたと思うが詳細は忘れた
0478ぶる
2007/05/02(水) 22:39:04[3] 環境
[3.1] OS: WindowsXP
[3.2] コンパイラ名とバージョン:
[3.3] 言語:C++
[4] 期限:[2007年5月4日正午まで]
[5]制限あまり難しいプログラムでなければ(すいません)
[問題]
以下の文字のテキストファイルを作成するプログラムを作成してください。
空白、行間隔もそのままでお願いします。
そしてそのテキストファイルの拡張子を「.txt」から「.net」にかえ、デスクトップに出力。
ファイル名は適当でも構いませんがとりあえず「HB.net」でお願いします。
(改行が多すぎのエラーでこのスレに書き込めないので問題文を次のレスに書きます)
0479ぶる
2007/05/02(水) 22:40:34* Schematics Netlist *
R_R1 0 $N_0001 50
E_E2 $N_0003 0 $N_0002 0 1
E_E1 $N_0004 0 $N_0001 $N_0003 1
H_H2 $N_0005 0 VH_H2 1
VH_H2 $N_0003 0 0V
V_V1 $N_0006 0 10V
H_H1 $N_0001 $N_0003 VH_H1 1
VH_H1 $N_0007 0 0V
H_H5 $N_0008 $N_0009 VH_H5 1
VH_H5 $N_0004 0 0V
E_E5 $N_0007 0 $N_0008 $N_0009 1
H_H6 $N_0002 0 VH_H6 1
VH_H6 $N_0009 0 0V
E_E6 $N_0009 0 $N_0005 0 1
R_R4 $N_0006 $N_0008 50
↑↑↑↑↑↑テキストファイルの終わり(上の行まで)↑↑↑↑↑↑
0480411
2007/05/02(水) 22:43:28授業でやっている内容です。
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3917.txt
0481デフォルトの名無しさん
2007/05/02(水) 22:43:39問題の意味が分からん
>>479の内容をテキストファイルとして出力すりゃいいのか?
0482デフォルトの名無しさん
2007/05/02(水) 22:48:25うひゃっ、Linux板で質問したほうが良いかも
0483デフォルトの名無しさん
2007/05/02(水) 22:49:58宿題をLinux板に持ち込むのは流石にダメだろw
0484411
2007/05/03(木) 00:00:44LinuxでやるC言語のクラスなので、Linuxのシステムプログラムよりな課題が多いです。
学部が経営情報学部なので必修で最低2個はプログラミングのクラスを取らないといけないのですが、
前期はJava入門を取り、後期はあいてるクラスが今のクラスしかなかったので取ったのはいいのですが、
アルゴリズム、スタックやスレッドの知識がある事を前提で授業が行われているので、半文系の自分にはきついですorz
0485デフォルトの名無しさん
2007/05/03(木) 00:13:12あるファイルがただのファイルなのか、それともディレクトリなのかというのは
こいつを使えば判定できるがLinux限定な
ttp://www.linux.or.jp/JM/html/LDP_man-pages/man2/stat.2.html
0486デフォルトの名無しさん
2007/05/03(木) 00:23:13こんな感じの処理を組み込めばディレクトリの場合だけ(その逆も)なんかの処理をするというのは可能なはず
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int main(void)
{
char *path = "./hoge"; /* file name */
struct stat st;
stat(path, &st); /* get information */
if (S_ISDIR(st.st_mode))
{
puts("\"path\" is directory");
} else
{
puts("\"path\" is file or something else");
}
return 0;
}
0487411
2007/05/03(木) 00:43:25ありがとうございます。確認してみます。
0488デフォルトの名無しさん
2007/05/03(木) 01:51:40何年生か知らないけど、4年生じゃないなら急いで単位取る必要無いんじゃない。
その講義捨てて来年か次の学期にJava入門の続きか簡単そうな講義取ったほうが良さげ
変な所でエネルギーと時間を浪費せずに、自分の将来の為にエネルギーと時間を使いなよ。
とここでエネルギーと時間を浪費して他人の宿題を解いているNEETが言ってみる。
0490デフォルトの名無しさん
2007/05/03(木) 02:07:38うまく動かないってのはどういう風に動かないんだ?
0491デフォルトの名無しさん
2007/05/03(木) 02:25:340492デフォルトの名無しさん
2007/05/03(木) 02:27:530493デフォルトの名無しさん
2007/05/03(木) 02:29:03大変だな・・・
0495デフォルトの名無しさん
2007/05/03(木) 09:16:28[2] 問題文(含コード&リンク): http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3918.txt
[3] 環境
[3.1] OS: Linux
[3.2] コンパイラ名とバージョン: gcc -o
[3.3] 言語: C
[4] 期限: 5月3日午後2時
どうしても、うまく動きません。main関数に問題があるのかもしれませんが、分かりません
main関数を作り変えてもいいので、よろしくお願いします。
0496デフォルトの名無しさん
2007/05/03(木) 09:18:50http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3919.txt
0497デフォルトの名無しさん
2007/05/03(木) 10:00:39main.c(69) : warning C4101: 'a' : ローカル変数は 1 度も使われていません。
main.c(69) : warning C4101: 'J' : ローカル変数は 1 度も使われていません。
main.c(68) : warning C4101: 'flag' : ローカル変数は 1 度も使われていません。
main.c(69) : warning C4101: 'I' : ローカル変数は 1 度も使われていません。
0498デフォルトの名無しさん
2007/05/03(木) 10:05:53main.c:58: warning: statement with no effect
main.c: In function `main':
main.c:68: warning: unused variable `kensaku'
main.c:68: warning: unused variable `flag'
main.c:69: warning: unused variable `I'
main.c:69: warning: unused variable `J'
main.c:69: warning: unused variable `a'
GCCのほうが賢いな
0499デフォルトの名無しさん
2007/05/03(木) 10:09:04main関数以外は作り変えちゃダメ?
0500478 479(ぶる)
2007/05/03(木) 10:14:03はい、そうです。
そしてそのテキストファイルの拡張子を「.net」に変換して出力するプログラムを作りたいんで(ノд`)
0501デフォルトの名無しさん
2007/05/03(木) 10:20:00条件に合うのであれば作り変えてもらってもかまいません。
0502デフォルトの名無しさん
2007/05/03(木) 10:31:11条件にあっている場合はかまいません
0503デフォルトの名無しさん
2007/05/03(木) 10:32:05条件に合っている場合はかまいません
0504デフォルトの名無しさん
2007/05/03(木) 11:17:45for(j=P[i];j<n;j++){
if( check(i,j,Q,n)==0){
Q[i][j]=1;
P[i]=j;
break;
}
}
while( j==n ){
P[i]=0;
j=P[--i];
Q[i][j]=0;
P[i]++;
i--;
}
}
でいいんぢゃねの?
0505デフォルトの名無しさん
2007/05/03(木) 12:27:04[2] 問題文(含コード&リンク):
ttp://www.saiensu.co.jp/book_support/4-7819-0855-1/snln.txt
を改変して、x*x+y*y=4 x*y=1、の連立非線形方程式をニュートン法でなく修正ニュートン法で解を求める
[3] 環境
[3.1] OS:WinXP
[3.2] コンパイラ名とバージョン:VC++ 2002
[3.3] 言語:C言語
[4] 期限: 2007年05月10日まで
[5] その他の制限:[2]のものを改変した形でないといけない
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3920.txt
↑は与えられた文から自分で、関数を読み込むようにして
32行目jacob関数内の式をニュートン法のものから修正ニュートン法のものに変えてみたものです
改変だったので関数内はあまりいじらなくていいと思ったのですが、この状態でビルドするとエラーが出てしまいます
32行目の式を元のニュートン法のものにしても同じエラーが出るため
もっと基本的な、方程式の定義の仕方あたりに原因があると思うのですが…
わかる方いらっしゃったらお願いします
0506411
2007/05/03(木) 12:32:59どうしても分からなかったので、ヒントを貰ってきたのですが、
さらに分からなくなってしまっていますorz
戴いたヒントです。:
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3921.txt
>>491,492,493
おっしゃるとおり、集中講義のようなものです。
今、4年なのですが開講されているコースの関係でこのクラスをパスしないと、
留年しそうなのです…orz
0507デフォルトの名無しさん
2007/05/03(木) 12:34:39バレたときの責任とかとれないし
0508411
2007/05/03(木) 12:37:42[root@network root]# ./two d (この場合、ディレクトリです。)
とコンソールで入力しても
"path" is file or something else
と表示されます。
この課題の場合、ディレクトリ名を入力した場合、
中のファイルがすべて表示されると同時に、サブディレクトリも表示されるように作らなくてはいけないので、
そうなってくると、ちんぷんかんぷんです…。
0509デフォルトの名無しさん
2007/05/03(木) 12:43:01おれは495じゃないけど
その変更だと何も表示されなくなったぜ?
配列の添え字にマイナス突っ込んでる状態は改善されたが
0510411
2007/05/03(木) 12:44:25海外の大学なのでその辺りは大丈夫です。
0511デフォルトの名無しさん
2007/05/03(木) 12:51:310512デフォルトの名無しさん
2007/05/03(木) 12:55:020513デフォルトの名無しさん
2007/05/03(木) 12:57:59>>396
後は再度checkするやり方がある。
0514デフォルトの名無しさん
2007/05/03(木) 12:58:240515411
2007/05/03(木) 12:58:56はい。授業が後二日で終わるのでそれを過ぎたら0点になってしまうのですorz
「留年」といった具体的な概念はないのですが、これが出来ないと5月半ばに卒業する予定が、
冬になってしまうので正直、かなり焦っています。
>>512
欧米ですね。
0516デフォルトの名無しさん
2007/05/03(木) 13:24:280517デフォルトの名無しさん
2007/05/03(木) 14:01:010518デフォルトの名無しさん
2007/05/03(木) 14:05:270519デフォルトの名無しさん
2007/05/03(木) 16:08:20[1] 授業単元: C++プログラミング
[2] 問題文(含コード&リンク):
|1 2 3| |9 2 7|
配列 [i][j] = |4 5 6| を |4 5 6|
|7 8 9| |3 8 1|
(array[i][j] = [0][0] の位置に [2][2]、[2][2] の位置に [0][0]、[0][2] の位置に [2][0]、[2][0] の位置に [0][2])
となるように並べ替えるプログラムを、forループを使って作成しなさい。
[3] 環境
[3.1] OS: WindowsXP
[3.2] コンパイラ名とバージョン: gcc 3.4
[3.3] 言語: C++
[4] 期限: 5月4日4:00まで
[5] その他の制限: 特に無し。
よろしくお願いします。
0520デフォルトの名無しさん
2007/05/03(木) 16:37:46[2] 問題文(含コード&リンク):
下記の仕様に沿った数字判定プログラムを作成しよ。
・入力文字列の最大文字数が10文字とする。
・数字か、文字かの判定ができる。(入力に1つでも数字以外のものがあれば数字とみなす)
・数字の場合は正数か負数かの判定もする。
・文字入力関数、入力判定関数を作成、判定結果はmain関数で表示する。
・入力エラー時(文字数オーバー、何も入力されていない)は、再入力を促す。
[3] 環境
[3.1] OS: WindowsXP
[3.2] コンパイラ名とバージョン: gcc
[3.3] 言語: C
[4] 期限: 2007年5月5日
[5] その他の制限: 特になし
よろしくお願いします。
0521デフォルトの名無しさん
2007/05/03(木) 16:42:46#include <stdio.h>
void display(int *ary)
{
int i;
for (i=0 ; i<9 ; i++)
printf("%d%c", *(ary+i), (!((i+1)%3))?'\n':' ');
}
void swap(int *l, int *r)
{
printf("%d %d\n", *l, *r);
int temp;
temp=*l;
*l=*r;
*r=temp;
}
0522デフォルトの名無しさん
2007/05/03(木) 16:43:21int main()
{
int ary[][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
int i;
const int swap_count = 2;
int src_x[] = {0, 0};
int src_y[] = {0, 2};
int dest_x[] = {2, 2};
int dest_y[] = {2, 0};
printf("並べ替え前\n");
display(&ary[0][0]);
for (i = 0 ; i < swap_count ; i++)
{
swap( &ary[src_y[i]][src_x[i]] , &ary[dest_y[i]][dest_x[i]]);
}
printf("\n並べ替え後\n");
display(&ary[0][0]);
return 0;
}
0523デフォルトの名無しさん
2007/05/03(木) 16:43:20int main(void)
{
int i,j,swap;
int array[3][3]={{1,2,3},{4,5,6},{7,8,9}};
for(i=0;i<3;i++) {
for(j=0;j<3;j++) {
printf("array[%d][%d] = %d ", i, j,array[i][j]);
}
putchar('\n');
}
for(i=0;i<2;i++) {
for(j=0;j<3;j++) {
if(array[i][j] == array[2-i][2-j]) break;
array[i][j]^=array[2-i][2-j];
array[2-i][2-j]^=array[i][j];
array[i][j]^=array[2-i][2-j];
}
}
putchar('\n');
for(i=0;i<3;i++) {
for(j=0;j<3;j++) {
printf("array[%d][%d] = %d ", i, j,array[i][j]);
}
putchar('\n');
}
return 0;
}
ここまで書いてC++だったことに気付く、と。
0524デフォルトの名無しさん
2007/05/03(木) 16:44:44>・数字か、文字かの判定ができる。(入力に1つでも数字以外のものがあれば数字とみなす
「数字とみなす」でいいの?
0527デフォルトの名無しさん
2007/05/03(木) 16:49:520529デフォルトの名無しさん
2007/05/03(木) 16:51:14入力例とかをみるに、引数として指定されたディレクトリ一つ一つに対して
それぞれスレッドを作って処理しろって事なんだろうが
そんなことしたら表示が無茶苦茶になると思うんだがな
0530デフォルトの名無しさん
2007/05/03(木) 16:55:40表示する順番は同期とれってことだろう
と出題者になったつもりで名推理してみる
0531523
2007/05/03(木) 17:10:19>>528
本当はswap使うべきところを無駄に混乱させる為に
心を鬼にしてXOR交換にしたから、頑張ってくれ
0532デフォルトの名無しさん
2007/05/03(木) 17:15:40昨日から考えてるけどサッパリ。
0533デフォルトの名無しさん
2007/05/03(木) 17:23:43計算量がでかくなっても良いならやりようはあるんだけどな
0534デフォルトの名無しさん
2007/05/03(木) 17:24:31どんなやり方ですか??
0535デフォルトの名無しさん
2007/05/03(木) 17:38:28総当たりみたいなもんになるが、こんな感じ
脳内シミュレートではうまく動くはずだが、計算量がかなりでかくなる
もっともxを選ぶ際にでかいものから選ぶ等して、分枝限定法を使えば多少は削減できるだろうがな
1) コインの集合をZ、目標金額をYとする
2) あるx(∈Z)を選んだと仮定
2.1) Y-x<0であれば3)に
2.2) Y-x>0であれば、目標金額をY-xとして再帰呼び出しし、その結果+1を枚数とする
2.3) Y-x=0であれば枚数を1として返す
3) Z=Z-{x}とし、2)に戻ってZ=φとなるまで繰り返す
4) 最小の枚数となっている物を↑の結果から選ぶ
0536504
2007/05/03(木) 17:40:268
10000000
00001000
00000001
00000100
00100000
00000010
01000000
00010000
それらしく動いてる気がする
0538デフォルトの名無しさん
2007/05/03(木) 18:06:58再度checkする方法ではどうプログラムすればいいですか??
0539デフォルトの名無しさん
2007/05/03(木) 18:08:48http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3922.txt
きんもぉ〜☆なソースかもしれないけど、どぞ。
符号は + , - の指定が出来るが符号なしの数字のみを入力したら正とみなす。
あと、先頭の符号以外に数字以外の文字が入っていたら文字とみなすようにしてありまつ。
0540デフォルトの名無しさん
2007/05/03(木) 18:09:53って、よく見たら
> 文字入力関数、入力判定関数を作成
これやってなかった・・・適当に自分で分けて作っておいて orz
0541デフォルトの名無しさん
2007/05/03(木) 18:30:23http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3923.txt
0542デフォルトの名無しさん
2007/05/03(木) 18:31:43なるほど・・・
自分は、n番目のコインをとれるだけとって、残りのn-1枚で再帰
n-1番目のコインをとれるだけとって、残りのn-2枚で再帰
n番目から取ったときとn-1番目から取ったときで比較し、少ないほうを採用
次にそれとn-2番目から取ったときと比較…
って感じでやる方法しか思いつかなかったのですが、
これ上手く書けるのかなぁ…とか思ってました。(しかもこれで最小になるのか?)
もしよろしければ、そのプログラム書いていただけますか?><
0543504
2007/05/03(木) 18:46:19for(i=0;i<n;++i)
for(j=0;j<n;++j){
Q[i][j]=0;
P[i]=-1;
}
for(i=0;i<n;){
for(j=P[i]+1;j<n;++j){
if( check(i,j,Q,n)==0){
Q[i][j]=1;
P[i]=j;
break;
}
}
if(j<n){
++i;
}else{
--i;
P[i+1]=-1;
Q[i][P[i]]=0;
}
}
0544デフォルトの名無しさん
2007/05/03(木) 19:08:20main 関数の中の sz の初期化を間違えた。 sz=sizeof(buf)/sizeof[buf[0]); にしといて orz
0545デフォルトの名無しさん
2007/05/03(木) 19:24:56[2] 問題 コインの枚数を最小にする
(詳細)
C[1]〜C[n]までのn種類のコインがある。入力としてxを入れたときコインの最小枚数を求めるプログラムを書け。
色々考えたけどなかなか思いつきません
日本のコインなら大きいものから順番に取ればいいと思うんですが…
よろしくおねがいします
0546デフォルトの名無しさん
2007/05/03(木) 19:29:57n種類から選べって事?
0547デフォルトの名無しさん
2007/05/03(木) 19:31:160548デフォルトの名無しさん
2007/05/03(木) 19:31:21>472
0549デフォルトの名無しさん
2007/05/03(木) 19:45:06(10*4+1*4=44)
0550デフォルトの名無しさん
2007/05/03(木) 20:10:58472ですけど、そういうことです。。
549さんと同じとこだったりしてw
0551デフォルトの名無しさん
2007/05/03(木) 20:27:43#include<stdio.h>
void coin_num_check(int num[], int tmp[], int kind_num){
int num_total=0, tmp_total=0, i;
for(i=0;i<kind_num;i++){
num_total+=num[i];
tmp_total+=tmp[i];
}
if(num_total>tmp_total || num_total==0) for(i=0;i<kind_num;i++) num[i]=tmp[i];
}
int coin_check(int kind[], int num[], int tmp[], int kind_num, int kind_index, int value){
int i;
if(kind_index>=kind_num) return 0;
for(i=0;kind[kind_index]*i<=value;i++){
tmp[kind_index]=i;
if(kind[kind_index]*i==value) coin_num_check(num, tmp, kind_num);
coin_check(kind, num, tmp, kind_num, kind_index+1, value-kind[kind_index]*i);
}
return 1;
}
int main(void){
int kind[]={25,10,1}, num[sizeof(kind)/sizeof(kind[0])]={0}, tmp[sizeof(kind)/sizeof(kind[0])]={0}, i, x, total=0;
printf("Input value : ");
scanf("%d", &x);
coin_check(kind, num, tmp, sizeof(kind)/sizeof(kind[0]), 0, x);
for(i=0;i<sizeof(kind)/sizeof(kind[0]);i++){
if(num[i]>0) printf("%5d : %d\n", kind[i], num[i]);
total+=num[i];
}
printf("\nTotal : %d\n", total);
return 0;
}
0552デフォルトの名無しさん
2007/05/03(木) 20:29:24Ck 硬貨の種類 Ak 枚数 m 入力
として、
条件
n
Ck Ak = m
k=1
n
min Ak
k=1
0553デフォルトの名無しさん
2007/05/03(木) 20:30:010554デフォルトの名無しさん
2007/05/03(木) 20:30:490555デフォルトの名無しさん
2007/05/03(木) 20:32:48宿題レベルとしては十分だろうね
0556デフォルトの名無しさん
2007/05/03(木) 20:34:24ごめ、配列名見落としてた
main 関数の中の kind を全て A に置換しておいてちょ
0557デフォルトの名無しさん
2007/05/03(木) 20:36:360558デフォルトの名無しさん
2007/05/03(木) 20:46:010560デフォルトの名無しさん
2007/05/03(木) 21:01:33coin_check内のforの処理が頭いいなー。
0561デフォルトの名無しさん
2007/05/03(木) 21:09:47うわぁー。すごいけど、プログラム超初心者なのでなにをやってるのかよくわかんないんです><
議事コードで説明してくれる人いたら教えてください
0562561
2007/05/03(木) 21:11:070564ぺこちゃん
2007/05/03(木) 21:31:07void func(void)
{
int pArray[] = {1,2,3,4,5,-1};
int nSum = 0;
int *pi = pArray;
while ( *pi != -1){
nSum += *pi;
pi += sizeof(int);
}
printf("nSum = %d\n", nSum);
}
どこが間違えているか教えてください!!
0565デフォルトの名無しさん
2007/05/03(木) 21:32:33↓
pi++;
0566デフォルトの名無しさん
2007/05/03(木) 21:32:55mainが無い
0567デフォルトの名無しさん
2007/05/03(木) 21:34:200568デフォルトの名無しさん
2007/05/03(木) 21:35:250570ぺこちゃん
2007/05/03(木) 21:41:23#include<stdlib.h>
#include<stdio.h>
void func(void)
{
int *pi = (int *)malloc( sizeof(int));
if ( pi ) {
*pi = 100;
free( pi );
}
printf("Value = %d\n", *pi );
}
0571デフォルトの名無しさん
2007/05/03(木) 21:42:54free(pi) を関数の最後に移動
0572デフォルトの名無しさん
2007/05/03(木) 21:43:10int *pi = (int *)malloc( sizeof(int));
int 1個分しか確保してない
int *pi = (int *)malloc( sizeof(int):*100);
にする
0573ぺこちゃん
2007/05/03(木) 21:43:320574デフォルトの名無しさん
2007/05/03(木) 21:43:44>>572は水に流して
0575ぺこちゃん
2007/05/03(木) 21:49:15どうぞよろしくお願いします。。。
#include<stdlib.h>
void func(void)
{
int *pi = 0;
int i = 0;
for ( ; i<10; i++){
pi = (int *)malloc(sizeof(int));
}
if (pi ){
free(pi);
}
}
0576デフォルトの名無しさん
2007/05/03(木) 21:51:01残り2問はまとめてうpろだにあげろ
分割する意味がわからん
0577デフォルトの名無しさん
2007/05/03(木) 21:56:53戻り値の値をきちんと返せばOKっぽい。
もしくはdoubleではなくvoidにするか。
0578デフォルトの名無しさん
2007/05/03(木) 21:58:47・ループでまわした数分確保したい、のか
・同じ変数に別の領域を割り当てる前に開放すべきである、か
どっちだ?
0579ぺこちゃん
2007/05/03(木) 22:00:25#include<string.h>
#include<ctype.h>
#define MAX_CONVERT_LENGTH 100
const char *ConvertToUpper( const char *pcLower)
{
char Upper[MAX_CONVERT_LENGTH + 1];
const char *pc = pcLower;
int nUpperldx = 0;
for ( ; *pc!='\0'; pc++ ){
if( nupperldx < MAX_CONVERT_LENGTH ){
UPPER[nUpperldx] = toupper( *pc );
nUpperldx ++;
}
else{
break;
}
}
Upper[nUppreldx] = '\0';
return Upper;
}
0580デフォルトの名無しさん
2007/05/03(木) 22:01:170581ぺこちゃん
2007/05/03(木) 22:02:45解説していただけたら助かります。。。すいません。。。
0582デフォルトの名無しさん
2007/05/03(木) 22:03:38char Upper[MAX_CONVERT_LENGTH + 1];
↓
static char Upper[MAX_CONVERT_LENGTH + 1];
0583ぺこちゃん
2007/05/03(木) 22:10:32#include <stdio.h>
#define SIZE 10
void func(void)
{
int data[SIZE]={165,173,169,178,175,159,171,169,170,168};
int i,j,tmp;
for( i=0; i<SIZE-1; i++)
{
for( j=i+1; j<SIZE-1; j++)
{
if( data[i]<data[j])
{
tmp=data[i];
data[i]=data[j];
data[j]=tmp;
}
}
}
for(i=0;i<SIZE;i++)
{
printf("%2d%5d\n",i,data[i]);
}
}
0584デフォルトの名無しさん
2007/05/03(木) 22:11:24UPPER[nUpperldx] = toupper( *pc );
↓
Upper[nUpperldx] = toupper( *pc );
こうですか?
0585デフォルトの名無しさん
2007/05/03(木) 22:12:22j<SIZE-1
↓
j<SIZE
0586ぺこちゃん
2007/05/03(木) 22:18:17PGになりたくて独学していますが、どのような勉強方法が
最適かわからないので、是非教えて下さい。
>>584は「入力ミスでした。申し訳ありません」
0587デフォルトの名無しさん
2007/05/03(木) 22:21:170588デフォルトの名無しさん
2007/05/03(木) 22:25:190589デフォルトの名無しさん
2007/05/03(木) 22:25:42ありがとうございます!!
0590デフォルトの名無しさん
2007/05/03(木) 22:25:520591デフォルトの名無しさん
2007/05/03(木) 23:04:25Cの勉強だけじゃダメですよ。アルゴリズムやデータ構造もやるべきですよ。
プログラムが出来ない人は、アルゴリズム、つまり問題を解く手順を
考えずにやってるから、プログラムが組めないんだと思う。
プログラムする上で重要な事が詰まってるから以下のページの
プログラミング講座を一読して欲しい。
ttp://www.smg.co.jp/seminar/techsquare/index.html
0592デフォルトの名無しさん
2007/05/03(木) 23:19:42[2] 問題文(含コード&リンク): ttp://www.borujoa.org/upload/source/upload11442.pdf
[3] 環境
[3.1] OS: (Windows/Linux/等々) Linux
[3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等) gcc
[3.3] 言語: (C/C++/どちらでも可 のいずれか) C言語
[4] 期限: ([yyyy年mm月dd日hh:mmまで] または [無期限] のいずれか) GW明け
[5] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々)
0593デフォルトの名無しさん
2007/05/03(木) 23:21:01マジレスするとコミュニケーション能力。
0594デフォルトの名無しさん
2007/05/03(木) 23:50:230595デフォルトの名無しさん
2007/05/04(金) 00:04:44またお前か。相手と意思通じがうまくても自分が基本を理解する能力がなきゃ
「プログラマー」となるのは難しいぞ。
0596デフォルトの名無しさん
2007/05/04(金) 00:06:57プログラム組みたいならやっぱ生産性の高さとなにより他の人に出来ない事が出来るってのが武器だよ
0597デフォルトの名無しさん
2007/05/04(金) 00:09:05各々の割り当ては与えられた課題を理解することが重要。
自分が作ったライブラリないしモジュールは、汎用性があれば他人のソースの一部に
目的がきっちりと果たせていればそのまま引用できるし。変な使用や汎用性がない
ソースだと、それに応じて書き直さなきゃならんぞ。
0598デフォルトの名無しさん
2007/05/04(金) 00:18:150599デフォルトの名無しさん
2007/05/04(金) 00:19:55教えたがりがどこにでもいるからな
0600デフォルトの名無しさん
2007/05/04(金) 00:21:06うまい、座布団10枚で海外旅行の懸賞を与えよう
0601デフォルトの名無しさん
2007/05/04(金) 00:56:48>再度check
上の方でやったcheckを再度やるんだ。単にコピペするだけ。
同じの2回書くからあんまりいいコードじゃ無いんだけど。
よくわからなかったらgoto使うやり方でいいんじゃない?
変更が最小限で済むし。
0602デフォルトの名無しさん
2007/05/04(金) 03:12:39[2] 問題文(含コード&リンク):万年歴の作成
[3] 環境
[3.1] OS:XP
[3.2] コンパイラ名とバージョン:VS2005
[3.3] 言語: C
お願いします
0603デフォルトの名無しさん
2007/05/04(金) 03:37:58http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3925.txt
0604デフォルトの名無しさん
2007/05/04(金) 05:16:15[2] 問題文(含コード&リンク): ニュートンラフソン法を用いてx^3-4x1=0の0≦x≦1に在る根を求めよ。
[3] 環境
[3.1] OS: Windows
[3.2] コンパイラ名とバージョン: Visual Studio .net2003
[3.3] 言語: C
[4] 期限: 5月6日19時まで
[5] その他の制限: 特になし
お願いします
0605デフォルトの名無しさん
2007/05/04(金) 07:42:35#include<stdio.h>
#include<math.h>
#define DELTA_X (1.0e-5)
double f(double x){return x*x*x-4*x+1;}
double f_(double x){return (f(x+DELTA_X)-f(x))/DELTA_X;}
int main(void){
double x=1.0, delta;
do{
delta=-f(x)/f_(x);
x=x+delta;
printf("%.6f %.6f %.6f\n", x, f(x), delta);
}while(fabs(delta)>1e-6);
return 0;
}
0606478
2007/05/04(金) 12:52:25* Schematics Netlist *
R_R1 0 $N_0001 50
E_E2 $N_0003 0 $N_0002 0 1
E_E1 $N_0004 0 $N_0001 $N_0003 1
H_H2 $N_0005 0 VH_H2 1
VH_H2 $N_0003 0 0V
V_V1 $N_0006 0 10V
H_H1 $N_0001 $N_0003 VH_H1 1
VH_H1 $N_0007 0 0V
H_H5 $N_0008 $N_0009 VH_H5 1
VH_H5 $N_0004 0 0V
E_E5 $N_0007 0 $N_0008 $N_0009 1
H_H6 $N_0002 0 VH_H6 1
VH_H6 $N_0009 0 0V
E_E6 $N_0009 0 $N_0005 0 1
R_R4 $N_0006 $N_0008 50
0607デフォルトの名無しさん
2007/05/04(金) 13:57:43以前の誰かの繰り返し質問になるかもだが、
いったん 〜.txt としてデスクトップに出力しないといけないのか?
最初から 〜.net としてデスクトップに出力するのではなく?
0608デフォルトの名無しさん
2007/05/04(金) 14:43:53ありがとうございます!
0609デフォルトの名無しさん
2007/05/04(金) 17:23:42[2] 問題文(含コード&リンク):http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3926.txt
[3] 環境
[3.1] OS:Linux
[3.2] コンパイラ名とバージョン:gcc
[3.3] 言語: C言語
[4] 期限: 2007年5月6日24:00まで
[5]その他の制限:特になし
自分なりに考えてはみましたがさっぱり分かりません
ご迷惑かもしれませんが、よろしくお願いします
0610デフォルトの名無しさん
2007/05/04(金) 17:34:36[2] 問題文(含コード&リンク): *****の部分を埋めてハノイの塔のプログラムを作成せよ。ただし再帰的関数を使ってはならない。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3927.txt
[3] 環境
[3.1] OS: Linux
[3.2] コンパイラ名とバージョン: gcc
[3.3] 言語: C
[4] 期限: 2007年05月08日17:00
[5] その他の制限: 再帰的関数を使ってはならない。
再帰的関数を使うのは分かったのですが、これはさっぱり…よろしくお願いします。
0611デフォルトの名無しさん
2007/05/04(金) 17:36:15いろいろと恥ずかしくないか?
0612478
2007/05/04(金) 17:45:35すいません、俺の理解不足だったかも…
要はテキストで「.net」ファイルを開いた時にその内容のものが書けてればOKなんです。
上の内容の「.net」で出力出来れば大丈夫です。
0613デフォルトの名無しさん
2007/05/04(金) 19:34:04おまえ、まだ理解できてないだろ
0614デフォルトの名無しさん
2007/05/04(金) 21:41:19[2] 問題文
[3] 環境
[3.1] OS:windows
[3.2] コンパイラ名とバージョン: gcc
[3.3] 言語: C
[4] 期限: 2007年05月08日17:00
二分木のスレッドを使った挿入方なのですが
successorのいみが分かりません。
なんのためにあるのでしょうか?教えてください。
できれば全体の解説もお願いします
以下にプログラム乗せます
InsertInThreadedTree(threaded_tree_type *root_adder, e1type key){
threaded_tree_type p, prev = NULL, new_node;
new_node = (threaded_tree_type) malloc (sizeof(struct threaded_node_rec));
new_node->left = new_node->right = NULL;
new_node->key = key;
new_node->successor = 0;
if (!*root_addr) {
*root_addr = new_node;
return;
のこりは下です
0615デフォルトの名無しさん
2007/05/04(金) 21:42:39p = *root_addr;
while (p) {
prev = p;
if (p->key > key)
p = p->left;
else if (p->successor == 0)
p = p->right;
else break
}
if (prev->key > key) {
prev->left - new_node;
new_node->successor = 1;
new_node->right = prev;
}
else if (prev->successor == 1) {
new_node->successor = 1;
prev->successor = 0;
new_node->right = prev->right;
prev->right = new_node;
}
else prev->right = new_node;
}
\end{verbatim}
\end{boxedminipage}
0616デフォルトの名無しさん
2007/05/04(金) 22:50:13を・・・・・
0617デフォルトの名無しさん
2007/05/04(金) 22:55:050618デフォルトの名無しさん
2007/05/04(金) 23:17:07ちゃんと写せてる?
0619デフォルトの名無しさん
2007/05/04(金) 23:17:12とりあえず大学で数学を真面目に学んでかつプログラミングもできる勇者をゆるりと待て
0620デフォルトの名無しさん
2007/05/04(金) 23:25:17ttp://www.amazon.co.jp/Successor-Sonata-Arctica/dp/B0000506FY/ref=sr_1_1/249-7896356-0761913?ie=UTF8&s=music&qid=1178288635&sr=1-1
ttp://www.amazon.co.jp/Martian-Successor-Nadesico-Various-Artists/dp/B000066HFI/ref=sr_1_2/249-7896356-0761913?ie=UTF8&s=music&qid=1178288635&sr=1-2
0621505
2007/05/04(金) 23:54:05遅くなりましたが、そちらのヒントを見てからしばらくやってみたところできました
一つ前の課題でずっと関数はdoubleを使っていたので、今回もそのままdoubleを使ってしまい全く気づかず悩んでいました
ありがとうございました
0622デフォルトの名無しさん
2007/05/05(土) 02:35:54とりあえず、用語と手法の説明が必要。nとかRとかが何を表すのかも。
0623デフォルトの名無しさん
2007/05/05(土) 04:15:02[2] 問題文(含コード&リンク):
名前/理科の得点/社会の得点/英語の得点を、持つ構造体を定義して、
各教科の最高得点者の名前を表示するプログラム
[3] 環境
[3.1] OS: XP
[3.2] コンパイラ名とバージョン:visual c++
[3.3] 言語:C
御指導お願いします
0624デフォルトの名無しさん
2007/05/05(土) 04:23:09[2] 問題文(含コード&リンク): √5の値をニュートン法で小数点5位まで求めよ。
[3] 環境
[3.1] OS: (Windows
[3.2] コンパイラ名とバージョン: Visual Studio2003
[3.3] 言語: C
[4] 期限: 5月9日
[5] その他の制限: とくになし
0625デフォルトの名無しさん
2007/05/05(土) 07:26:03>>605 の
double f(double x){return x*x*x-4*x+1;}
を
double f(double x){return x*x-5;}
に変更
0626デフォルトの名無しさん
2007/05/05(土) 07:36:03#include <stdio.h>
#include <stdlib.h>
struct hoge{
char name[100];
int rika, shakai, eigo;
};
int rika(const struct hoge *a, const struct hoge *b)
{
return b->rika - a->rika;
}
int shakai(const struct hoge *a, const struct hoge *b)
{
return b->shakai - a->shakai;
}
int eigo(const struct hoge *a, const struct hoge *b)
{
return b->eigo - a->eigo;
}
main()
{
struct hoge data[]={{"a", 50, 50, 100},{"b", 80, 80, 80}{"c", 100, 50, 80}};
qsort(data, sizeof(data)/sizeof(data[0]), sizeof(struct hoge), rika);
printf("%s\n", data[0].name);
qsort(data, sizeof(data)/sizeof(data[0]), sizeof(struct hoge), shakai);
printf("%s\n", data[0].name);
qsort(data, sizeof(data)/sizeof(data[0]), sizeof(struct hoge), eigo);
printf("%s\n", data[0].name);
}
0627デフォルトの名無しさん
2007/05/05(土) 07:38:15#include <stdio.h>
#include <stdlib.h>
struct Data{int science, social, english;char name[256];};
int main(){
struct Data data[] = {{85, 90, 100, "Shiori Hujisaki"}, {95, 80, 80, "Tamaki Kousaka"},
{90, 80, 80, "Tomoyo Sakagami"}, {70, 70, 70, "Honoka Yukishiro"}, {85, 95, 90, "Haruhi Kansaka"}};
int i, max_index;
for(i = 1, max_index = 0; i < sizeof(data)/sizeof(data[0]); i++)
if(data[i].science > data[max_index].science)
max_index = i;
printf("\nscience top : %s\n", data[max_index].name);
for(i = 1, max_index = 0; i < sizeof(data)/sizeof(data[0]); i++)
if(data[i].social > data[max_index].social)
max_index = i;
printf("\nsocial top : %s\n", data[max_index].name);
for(i = 1, max_index = 0; i < sizeof(data)/sizeof(data[0]); i++)
if(data[i].english > data[max_index].english)
max_index = i;
printf("\nenglish top : %s\n", data[max_index].name);
return 0;
}
0628sage
2007/05/05(土) 08:05:12#include <stdio.h>
typedef struct{
char name[20];
double sci, soc, eng;
} Data;
int main(void){
Data s[]={
{"安藤", 86, 43, 66},
{"石田", 72, 35, 70},
{"上野", 23, 33, 25},
{"榎本", 52, 55, 98},
{"岡村", 36, 87, 52},
{"神谷", 82, 62, 52},
{"岸本", 15, 40, 22},
{"楠木", 55, 23, 76},
{"", -1, -1, -1} /* 番兵 */
};
double max[3] = {0};
int i = 0;
while(s[++i].sci != -1){
if(s[i].sci > s[max[0]].sci)
max[0] = i;
if(s[i].soc > s[max[1]].soc)
max[1] = i;
if(s[i].eng > s[max[2]].eng)
max[2] = i;
}
printf("[最高得点者]\n理科:%s\n社会:%s\n英語:%s\n", s[max[0]].name, s[max[1]].name, s[max[2]].name);
return 0;
}
0629デフォルトの名無しさん
2007/05/05(土) 08:25:14#include <stdio.h>
int main(void){
double x = 5, s, root;
s = x;
do{
root = s;
s = ((x / s) + s) / 2;
}while(s < root);
printf("sqrt(5) = %.5f\n", root);
return 0;
}
0631デフォルトの名無しさん
2007/05/05(土) 13:01:45[2] 問題文(含コード&リンク):
複数の不等式ax+by≧cの係数a,b,cを入力してそれらを満たす交点を出力する
また、x≧0、y≧0といった場合にも対応させること
[3] 環境
[3.1] OS:Windows
[3.2] コンパイラ名とバージョン: gcc
[3.3] 言語: C
[4] 期限: 5月7日
[5] その他の制限: 特にありません
お願いします
0632デフォルトの名無しさん
2007/05/05(土) 13:05:29複数ってのは最低3つ?
閉じてない場合はどうすんの?
0633デフォルトの名無しさん
2007/05/05(土) 13:14:39閉じてないっていうのがよくわからないけど
それを考えることで複雑になるようなら飛ばしても大丈夫だと思います
0634デフォルトの名無しさん
2007/05/05(土) 13:17:19直線に囲まれた領域の格子点を求めるってことじゃないの?
0635デフォルトの名無しさん
2007/05/05(土) 13:34:25それぞれの直線ごとの交点を出して不等式に合ったやつを出力するって感じかな?
図にするとこんな感じ
ttp://up2.viploader.net/upphp/src/vlphp054344.jpg
即興でつくったから間違ってたらすまない
0636デフォルトの名無しさん
2007/05/05(土) 13:43:070637636
2007/05/05(土) 13:43:500638デフォルトの名無しさん
2007/05/05(土) 13:51:26>>635の図だと
(0.000 , 2.000)
(0.000 , 3.000)
(0.600 , 0.800)
・
・
・
という感じに
説明不足ですみません
0639デフォルトの名無しさん
2007/05/05(土) 15:14:25[2] 問題文(含コード&リンク):
15パズルを作る。
ランダムでピースを配置する。
パズルの完成も判定せよ。
キー入力関数は提供するモノ(15p.cpp内の関数)でOK。
[3] 環境
[3.1] OS: Windows
[3.2] コンパイラ名とバージョン: VC 2005
[3.3] 言語: C
[5] その他の制限:
ピースをランダムに配置
完成を判定
キー入力関数は提供するモノ良い
先生、おながいします
0640デフォルトの名無しさん
2007/05/05(土) 15:29:2415p.cppて
0641デフォルトの名無しさん
2007/05/05(土) 15:39:420642デフォルトの名無しさん
2007/05/05(土) 15:48:45まだ童貞だけど
0643デフォルトの名無しさん
2007/05/05(土) 16:06:36だとすると不等号は全然関係なくて、
3つ以上の直線の交点を全て列挙する
→ 3つ以上の方程式のうち、任意の2つを
連立したものの解をすべて列挙する
ってことなのかな?
0644デフォルトの名無しさん
2007/05/05(土) 16:21:27えっと、連立不等式だから領域が出ると思うんだけど
交点のうちでその領域にある(不等式の条件を満たす)点の座標を出力するという形だと思います
0645デフォルトの名無しさん
2007/05/05(土) 16:31:47あ、理解。
>>643で列挙した点のうち、与えられた不等式をすべてみたすものだけ
出力すればいいってかたちになるのね。
0646デフォルトの名無しさん
2007/05/05(土) 16:45:00そういうことです
説明下手ですまんかった
0647デフォルトの名無しさん
2007/05/05(土) 17:31:28急ぎ過ぎてて忘れてました。すいません・・・
1は、hit or missモンテカルロ積分についての問題です。
nは標本数で、多分Aの近似値を出せば良いんだと思いますorz
2は、Rは繰り返し数で多分10000は十分大きいので多重積分の中の関数(問題ではexp)
の平均値が多重積分のIと近似されると解釈すればいいんだと思います・・・。
ttp://www.borujoa.org/upload/source/upload11469.pdf
0648デフォルトの名無しさん
2007/05/05(土) 18:09:29>>609の課題が分かる方いましたら
よろしくお願いします><
0649デフォルトの名無しさん
2007/05/05(土) 21:08:22催促したい人は未回答問題のリストを作れ、とかいうルールがあったな。
今はなくなったのかな?
0650デフォルトの名無しさん
2007/05/05(土) 21:42:12そんなルール作っても守る奴居ないよな。正直、催促してもらえるだけでも
見逃した未回答問題に気付く事が出切るからありがたい。
まあ、回答が無い問題と言うのは、難しい専門用語に説明が無かったり
重要な式、情報が抜けてたりして回答しようにもムリポな事が多いから
催促する前に、十分な情報を提供したか確かめて、情報不足くなら
解説付けるとか参考になるリンクを貼って欲しい。
と言うか、問題を投稿する時に十分な情報を出せ!!
0651デフォルトの名無しさん
2007/05/06(日) 01:53:06[2] 問題文(含コード&リンク):
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3933.txt
[3] 環境
[3.1] OS:Windows
[3.2] コンパイラ名とバージョン:VC++ 2005
[3.3] 言語: C++
[4] 期限:2007.5.7.
[5] その他の制限:出来るだけ初心者っぽくお願いします。
0652デフォルトの名無しさん
2007/05/06(日) 02:08:52stackを使って書かないといけない、ということを忘れてました。すみません
0653デフォルトの名無しさん
2007/05/06(日) 02:25:35http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3934.cpp
0654デフォルトの名無しさん
2007/05/06(日) 02:48:04ありがとうございました。助かります。
0655デフォルトの名無しさん
2007/05/06(日) 05:16:04[2] 非再帰マージソート
[3] 環境
[3.1] Linux
[3.2] gcc
[3.3] C
[4] 2007.5.6
[5] 出来るだけ初心者っぽく、初心者にも説明できるようお願いします。
0656デフォルトの名無しさん
2007/05/06(日) 05:34:16[2] 問題文(含コード&リンク):
問題1:大きさ10の配列に10個の整数値を標準入力から読み込んだ後、配列中に格納された値が昇順になるように配列させなさい。その後、配列中の値の平均値以下の値
の最大値が格納されている配列要素番号を求め、標準出力へ出力しなさい。該当する値が配列中に複数ある場合は、その中で最も大きい要素番号を出力しなさい。
問題2:問題1と同じ処理を異なるアルゴリズムで実現しなさい。
[3] 環境
[3.1] OS: Windows
[3.2] コンパイラ名とバージョン: Visual Studio .net2003
[3.3] 言語: C
[4] 期限: 5月7日0時00分
途中までやったのですが昇順までした後からわからなくなしました。やったとこまではっときます。
#include<stdio.h>
#define N 10
main(){
int a[N],i,j,k,t;
printf("整列前:\n");
for(i = 0; i < N; i++){
scanf("%d" ,&a[i]);}
for(i = 0; i < N -1; i++){k =i;
for(j = i+1; j < N; j++){if(a[j] < a[k]) {k = j;}}
t = a[i]; a[i] = a[k]; a[k] = t;}
printf("整列後:\n");
for(i =0; i < N; i++){printf("%d\n" ,a[i]);}
printf("\n");}
0657デフォルトの名無しさん
2007/05/06(日) 06:07:17問題1だけ。基本の骨組みはそのまま。
#include<stdio.h>
#define N 10
int main(void){
int a[N], i, j, k, t, avr = 0;
printf("整列前:\n");
for(i = 0; i < N; i++){
scanf("%d", &a[i]);
avr += a[i];
}
avr /= N;
for(i = 0; i < N - 1; i++){
k = i;
for(j = i + 1; j < N; j++)
if(a[j] < a[k])
k = j;
t = a[i];
a[i] = a[k];
a[k] = t;
}
printf("整列後:\n");
for(i = 0; i < N; i++)
printf("%d\n", a[i]);
for(i = 0; a[i] <= avr; i++)
;
i--;
printf("平均以下の最大値:a[%d] = %d\n", i, a[i]);
return 0;
}
0658デフォルトの名無しさん
2007/05/06(日) 06:53:58問題2。1は直接選択ソートのようなので、こちらはバブルソートで。
#include <stdio.h>
#define N 10
void swap(int *a, int *b){
int tmp = *a;
*a = *b;
*b = tmp;
}
int main(void){
int i, n = N, min, avr = 0, ary[N];
printf("[整列前]\n");
for(i = 0; i < N; i++){
scanf("%d", &ary[i]);
avr += ary[i];
}
avr /= N;
while(n--)
for(i = 0; i < n; i++)
if(ary[i] > ary[i + 1])
swap(&ary[i], &ary[i + 1]);
printf("[整列後]\n");
for(i = 0; i < N; i++)
printf("%d\n", ary[i]);
while(ary[--i] > avr)
;
printf("平均以下の最大値:ary[%d] = %d\n", i, ary[i]);
return 0;
}
0659デフォルトの名無しさん
2007/05/06(日) 07:25:380660デフォルトの名無しさん
2007/05/06(日) 09:16:28[2] 問題文(含コード&リンク):
テキストファイルを読み込み、TAB文字を除去したコピーファイルを作成する
プログラムを作成しなさい。
コピー元テキストファイルにTAB文字が使われていた場合、コピー先ファイルには
TAB文字をコピーしない。
main関数の引数として、コピー元ファイル名、コピー先ファイル名を入力させる。
コピー元ファイル名で指定されたファイルが正常に開けない場合
エラーメッセージを出力し、プログラムを終了する。
コピー先ファイル名で指定されたファイルがすでに存在する場合は上書きを行うか
否かを問い合わせる。この問いに対してユーザの入力が"y"か"Y"の場合は上書きを
それ以外は何も行わずプログラムを終了する。
[3] 環境
[3.1] OS: Windows
[3.2] コンパイラ名とバージョン: gcc
[3.3] 言語: C
[4] 期限: 2007年5月8日
[5] その他の制限:特になし
よろしくお願いします
0661631
2007/05/06(日) 09:31:19汚い上不等式の条件を満たすかの判定がさっぱりわかりません…
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3935.txt
0662デフォルトの名無しさん
2007/05/06(日) 11:51:15#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <errno.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(int argc, char **argv)
{
FILE *rp, *wp;
int fd, c;
if (argc < 3)
return (fprintf(stderr, "usage: %s FROM TO\n", argv[0]), 1);
if ((rp = fopen(argv[1], "r")) == NULL)
return (perror(argv[1]), 1);
if ((fd = open(argv[2], O_WRONLY|O_CREAT|O_EXCL, 0666)) == -1) {
if (errno != EEXIST) return (perror(argv[2]), 1);
fprintf(stderr, "%s exists. overrite? [Y/N]: ", argv[2]);
if (tolower(getchar()) != 'y') return 1;
if ((fd = open(argv[2], O_WRONLY|O_CREAT|O_TRUNC, 0666)) == -1)
return (perror(argv[2]), 1);
}
wp = fdopen(fd, "w");
while ((c = getc(rp)) != EOF)
if (c != '\t') putc(c, wp);
fclose(rp), fclose(wp);
return 0;
}
0663デフォルトの名無しさん
2007/05/06(日) 12:48:02一応>>635の図だと合ってるっぽいけど、正しいかどうかはよくわからん。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3936.c
0664デフォルトの名無しさん
2007/05/06(日) 12:51:45あげなおし
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3937.c
0665デフォルトの名無しさん
2007/05/06(日) 12:57:29何度もスマソ。再度。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3938.c
0666デフォルトの名無しさん
2007/05/06(日) 13:59:57[2] 問題文(含コード&リンク):
あらかじめ用意された枠組みを利用して、リスト順次探索のプログラムを作成せよ。
詳細、元になるファイルはうpしました。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3939.zip
[3] 環境
[3.1] OS:Linux
[3.2] コンパイラ名とバージョン:gcc
[3.3] 言語:C
[4] 期限:5/9
[5] その他の制限:番兵を使ってはいけないそうです。
よろしくお願いします
0667デフォルトの名無しさん
2007/05/06(日) 14:04:01[2]
1.1 # 縦 m,横 n の寸法を受け取って長方形を出力する次の関数 printRect を定義
し,実行結果のように動作するプログラムを作りなさい.
void printRect(int m, int n)
ここでprintRectを定義するときは printStars を利用するものとします.
実効結果
縦 ? 2
横 ? 5
*****
*****
1.2
n 個の中から m 個を取り出す組合せの数 C(n, m) を求める公式はつぎのように
なります.
C(n, m) = n(n-1) ・・・ (n-m+1) / m!
ここで n(n-1) ・・・(n-m+1) の値は次の関数 fact2(n, m) で求めるものとします.
int fact2(int n, int m)
fact2を定義し、C(n,m)を求めるプログラムを作りなさい。このときfact2をm!の計算にも用いること。
[3][3.1] OS:Linux[3.2] gcc 3.4 VC 6.0[3.3] 言語:C
[4] 期限:[2007年05月07日9:00まで
[5] その他の制限: 特にありません
2つあります、よろしくお願いします
0668デフォルトの名無しさん
2007/05/06(日) 14:10:56ありがとうございました!
0669デフォルトの名無しさん
2007/05/06(日) 14:28:511.2
#include <stdio.h>
int fact2(int n, int m) {
int i,ret=1;
if(n>=m)for(i=0;i<m;i++)ret*=n-i;
return ret;
}
int main(void) {
int n,m;
printf("calculate C(n,m)\n");
printf("n ? "); scanf("%d",&n);
printf("m ? "); scanf("%d",&m);
printf("C(n,m) = %d\n",fact2(n,m)/fact2(m,m));
return 0;
}
0670デフォルトの名無しさん
2007/05/06(日) 14:39:321.1
printStars は推測で。
#include <stdio.h>
void printStars(int n) {
int i; for(i=0;i<n;i++)printf("*");printf("\n");
}
void printRect(int m,int n) {
int i; for(i=0;i<m;i++)printStars(n);
}
int main(void) {
int m,n;
printf("縦 ? "); scanf("%d",&m);
printf("横 ? "); scanf("%d",&n);
printRect(m,n);
return 0;
}
0671デフォルトの名無しさん
2007/05/06(日) 15:16:21[2] 問題文(含コード&リンク):
1から、2^30までの数値を全て2進数で表示。
ただし実際の表示は行わなくて良く、
アルゴリズムのみを記述すればいい。
これをなるべく高速に実行できるプログラムを作成する。
[3] 環境
[3.1] OS: Windows
[3.2] コンパイラ名とバージョン: Borland C++Compiler 5.5
[3.3] 言語: C
[4] 期限: 2007年5月7日中
[5] その他の制限: 特になし
宜しくお願いいたします。
0672デフォルトの名無しさん
2007/05/06(日) 15:23:57/':.:.:.:.:.:.:.:.:.:.:|.:.:.:.:.:.:.:\ ヽ: /_/
/.:.:.:.:.:/:.:.:.:,:.:.:|:.:.:ヽ.:.:.:.:.:.', } /:.:.|
l{:.:.:.:|:.l:.:.:.:/l/'ハ:、.:.:ヽ.:.:.:.:} .{::.:.:.:.:l
ハ:.:.:.|:|:.// ノ ‐ヾ\_|l.:.:.:i }::.:.:.:.:.',
ヽ:.:.{. ,:=、 ==、 ノ.;./ /::.::.::.:.:.:.',
ヽゝ 、 ソ!※}::.::.::.::.:.:.
{ `ヽ、ヽフ /イ /‐、_:.:.:.:.:.:.
f^)^)^)^)^)^)^)^)^)^)「-、_,{※} r′ヽ:.:.:.:.
r''⊇、 l|ヽ_/ } t′ ',:.:.:.
{ =='、 答えられるが l|!;r'!※{ t′ ',:.:.:
ハ,,_う´ l||;;l}. {,コ !:.
_{'V|l >>671の態度が l||;;;{※.},コ !、
ゞ |l l|.l;;{ },コ }
\,,|l気に入らないですっl| L{.※{,コ /|
|l________l|,rn} },コ\ / 〉
0673デフォルトの名無しさん
2007/05/06(日) 15:41:48向こうでも聞かれてたが、表示するプログラムなのに表示しなくてもいいとはこれ如何に
0674デフォルトの名無しさん
2007/05/06(日) 15:45:21「表示するプログラム」、というより
「表示の前段階までを処理して実際の表示は行わないプログラム」
って意味で書いたつもりでした。
友人の友人の課題が私のところまで回ってきて、
課題文も原文のものではないので
かなり分かり難い表現になってしまって申し訳ないです。
0675デフォルトの名無しさん
2007/05/06(日) 15:48:01あぁそういうことね。けど全部表示するアルゴリズムって言っても1足して表示して、また1足してryしかない気がするけどな
0676デフォルトの名無しさん
2007/05/06(日) 15:58:24その友人は何で君に丸投げ?
俺できるよっとか言っちゃったクチ?
ようは整数を2進数表示させるアルゴリズムを考えろって事かな?
0677デフォルトの名無しさん
2007/05/06(日) 16:02:34はやいかどうかは知らん
#include <stdio.h>
#define N 30
int main(void)
{
int i, count = 0;
char buff[N+1] = {0};
while(count<N) {
for(i=0; i<=count; i++) {
if(buff[i]) {
buff[i] = 0;
if(i==count) count++;
}
else {
buff[i] = 1;
break;
}
}
for(i=N; i>=0; i--) putchar(buff[i]+'0');
putchar('\n');
}
return 0;
}
0678デフォルトの名無しさん
2007/05/06(日) 16:08:55「俺できるよ」なんて事言って2chに投げるような真似は出来ないですorz
単純にプログラム少しでも触ってる人が俺くらいしか居なかったみたいです。
出来ないって言ってるのに中々諦めてくれなかったので、2chに投げてみた次第です。
友達はネット環境が無くて、自分でやらせることが出来なかったので。
整数を2進表示させるのに加えて、1〜2^30までの数値を全て表示(すると過程した処理)をするようです。
1 11 10 100 101 ・・・ 111111111111111111111111111111 みたいな感じで。
後はprintf等で表示する記述を書けば、上記のように全て表示されるってところまで作って、
10秒程度で実行できるように作らなきゃいけないみたいです。
0679デフォルトの名無しさん
2007/05/06(日) 16:10:52表示ありだとそれだけで10秒こえちゃいそうな予感
0680デフォルトの名無しさん
2007/05/06(日) 16:11:01>ようは整数を2進数表示させるアルゴリズムを考えろって事かな?
なんか受信したんですか?
0681デフォルトの名無しさん
2007/05/06(日) 16:14:17putcharのfor部をコメント潰しして、私の環境で実行したところ、
8秒程度で処理が完了いたしました。
課題の要求を満たすことが出来たと思います。ありがとうございました。
>>679
実際の表示は行わず、処理だけを記述すればいいようです。
確かに表示を行うと数分かかってしまいますね。
0682デフォルトの名無しさん
2007/05/06(日) 16:16:15送信してきたじゃんか
0683デフォルトの名無しさん
2007/05/06(日) 16:20:272^30ってあるから1000000000000000000000000000000で終わるようにしたけどそれでいいの?
0684デフォルトの名無しさん
2007/05/06(日) 16:22:45どこか間違っているか?
0685671
2007/05/06(日) 16:23:09終了の数値の話は友人からしっかりと聞いていませんが、
1000000000000000000000000000000か、111111111111111111111111111111で終了させるかは、
比較演算子の書き換えですぐに変更できるので此方でその課題に合わせて直させます。
0686デフォルトの名無しさん
2007/05/06(日) 16:25:45[2] 問題文(含コード&リンク):文字列Aの中に文字列Bが含まれいるか調べる関数
[3] 環境
[3.1] OS: Windows
[3.2] コンパイラ名とバージョン: VC++2005
[3.3] 言語: C
[5] その他の制限: strcmpを自作
異常へ対処すること
お願いします。
0687デフォルトの名無しさん
2007/05/06(日) 16:42:56http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3940.zip
番兵の意味を考えずにやってしまった。objファイルが混じってるが気にするな。
0688デフォルトの名無しさん
2007/05/06(日) 16:45:200689デフォルトの名無しさん
2007/05/06(日) 17:01:27手抜き+脳内コンパイル
動くかどうかはしらん
int mystrcmp(char *a, char *b){
int len, i;
if ((len = strlen(a)) != strlen(b))
return -1;
for (; *a; ++a, ++b)
if (*a != *b)
return *a - *b;
return 0;}
char *mystrstr(char *a, char *b){
int lenA, lenB, diffLen, i;
char *substr, ch;
lenA = strlen(a);
lenB = strlen(b);
if (lenA < lenB)
return NULL;
diffLen = lenA - lenB;
substr = strdup(a);
for (i=0; i<=diffLen; ++i){
ch = *(substr + i + lenB);
*(substr + i + lenB) = '\0';
if (!mystrcmp(substr + i, b)){
free(substr);
return a + i;}
*(substr + i + lenB) = ch;}
free(substr);
return NULL;}
0690デフォルトの名無しさん
2007/05/06(日) 17:02:24char型つかってる意味が理解できないけど
そのアルゴリズム(・∀・)イイネ!!
0691デフォルトの名無しさん
2007/05/06(日) 17:07:21[1] 授業単元:電卓プログラム
[2] 問題文(含コード&リンク):
+,-,*,/の四則演算。=入力で演算。e入力で終了。c入力でクリア、ce入力でクリアエントリー、Ctrl+cで強制終了。
プロンプト上入力で0003.0500と入力されたら、3.05と表示させる(0消し)。桁数は小数点以上5桁、以下5桁。
演算結果が小数点以下5桁を超えた場合、6桁目を四捨五入する。
[3] 環境 [3.1] OS:XP [3.2] コンパイラ名とバージョン: VisualStadio2005 [3.3] 言語: C言語のみ
[4] 期限: 2007/5/7
[5] その他の制限:なし
電卓の作成はここのwikiにあったのですが、もうちょっと細かいものを造るため
分からない部分をお聞きしたいです。
�@入力された値が整数でも小数点でも可能のため、最初の変数宣言では何型がやりやすいか?(後々の演算や0消しに大きく影響すると思われるため、判断に迷ってます)。
整数同士の演算結果を5とか6と表示したい。double型にした時の様に6.000000ではなく。
�A桁数判別するにはどうするのか?(小数点上5桁下5桁)
�Bctrl+cが入力されたら時のプログラムの書き方はどうすればいいのか?
�C問題文にある0消しのやり方
�D6桁目を四捨五入するという処理はどうするのか?
�E英字の「ce」が入力された場合の処理のやり方
初期画面は 今の値: 演算子: 入れたもの: 数値を入力しましょう>>
となります。それぞれ改行が本来されてますが、改行が多い為横書きにしてます。
・5を入力
今の値:5 演算子: 入れたもの: 演算子を入力しましょう>>
・+を入力
今の値:5 演算子:+ 入れたもの: 演算子又は数値を入力しましょう>>
・10を入力
今の値:5 演算子:+ 入れたもの:10 演算子を入力しましょう>>
この後ceを入力したら、+を入れた時の表示にしたいです。
こういう処理をするにはどのようにすればいいのか?
色んなサイトを見て廻ったのですが分からないため、書き込ませて頂きました。
書き込み自体初のため色々足りない部分あるかも知れませんが、どうか宜しくお願いします。
0692デフォルトの名無しさん
2007/05/06(日) 17:15:50つまり、もっとライブラリの勉強をしなさい、ということだな。
> 整数同士の演算結果を5とか6と表示したい。double型にした時の様に6.000000ではなく。
それは型に関係なく printf("%g") を使えばオーケー。
double型変数 d が 6.00000 でも %g を使えば 6 と出力される。
> �C問題文にある0消しのやり方
これも strtod() とかで読めば勝手に消える。
> �Bctrl+cが入力されたら時のプログラムの書き方はどうすればいいのか?
何もしなくていいんじゃね?勝手に止まるだろ。
> �D6桁目を四捨五入するという処理はどうするのか?
%.6g とかかな。
というわけで、ちゃんと読んでないけど、型はdouble型でやるのがいいと思うんだ。
0693デフォルトの名無しさん
2007/05/06(日) 17:50:100694デフォルトの名無しさん
2007/05/06(日) 17:53:29最初は文字を直接入れようと思ってたから。
for(i=0; i<=N; i++) buff[i] = '0';
while(count<N) {
for(i=0; i<=count; i++) {
buff[i] = '1' - buff[i] + '0';
if(buff[i]=='1') break;
else if(count==i) count++;
}
//ここで表示
}
0695デフォルトの名無しさん
2007/05/06(日) 18:01:07API叩けばいいじゃない
0696デフォルトの名無しさん
2007/05/06(日) 18:05:340697デフォルトの名無しさん
2007/05/06(日) 18:10:43ありがとうございました
0698デフォルトの名無しさん
2007/05/06(日) 19:35:58問題は↓なのでお願いします!!
http://www.borujoa.org/upload/source/upload11498.pdf
他に分からないところがあったら言ってください!
でも、正直資料とかあんまりないので何も言えない感じですがorz
>>622
>>647
0699デフォルトの名無しさん
2007/05/06(日) 20:29:22>>691,692
%gを使ったことがほとんど無かったので少々調べて見たのですが
指数が-4より小さいとき(0.00001など)は%eの表示になるのと
%.6gだと小数部6桁ではなく全体で6桁になるようです
(%sの扱いに近い? でも小数点はカウントされてない、、、)
なので、調べた小数点以下の桁数をn、値をaとして
printf("%.*f",n,a)
としたらどうでしょうか
桁数判別の方法とかは考えてないので微妙かもですが
0700デフォルトの名無しさん
2007/05/06(日) 20:52:25>>699に書いてあるように、小数の数値の場合は
6桁が基準で短い方が使われるんだった。
なので6桁にこだわるためには、小数桁を切り出さないといけないのね。
ちゃんとやるなら、sprintf(&tmp, "%f", value) するとかして、
tmpの中の '.' の位置とか '\0' の位置を検索して桁を判定して、
そのうえで四捨五入したりすることになるかな。
0701デフォルトの名無しさん
2007/05/06(日) 21:07:14[2] 問題文(含コード&リンク):
(2)キーボードから次の値(-10、10、12.36、200)を入力し、
cahr型、unsigned char型、int型、double型の変数に代入せよ。
また、その値を表示してどのようなことが起こるか確認し、説明せよ。
(3)キーボードから入力した2つのint型変数について、
加算、減算、乗算した結果を正しく表示するプログラムを書け。
ただしそれぞれの演算は引数を2つとる関数として記述せよ。
[3] 環境
[3.1] OS: MacOSX
[3.2] コンパイラ名とバージョン: gcc
[3.3] 言語: C
[4] 期限: 5月7日までにお願いします。
0702デフォルトの名無しさん
2007/05/06(日) 21:37:19void main(void)
{
cahr a;
unsigned b;
char c;
double d;
a = -10;
b = 10;
c = 12.36;
d = 200
printf("a = %d b = %d c = %d d = %d\n", a, b, c, d);
return 0;
}
>>701
こんな感じですか?
0703デフォルトの名無しさん
2007/05/06(日) 21:42:350704デフォルトの名無しさん
2007/05/06(日) 21:42:52void main(void)
{
int a, b, c;
printf("Aの値を入力してください---");
scanf("%d\n", a);
printf("Bの値を入力してください---");
scanf("%d\n", b);
c = a + b;
printf("A+B=%d\n");
c = a - b;
printf("A-B=%d\n");
c = a * b;
printf("A*B=%d\n");
return 0;
}
>>701こんな感じですか?
>>702 と >>703はコンパイルしてないんで間違ってたらごめんなさい
0705デフォルトの名無しさん
2007/05/06(日) 21:43:260706デフォルトの名無しさん
2007/05/06(日) 21:44:18[2] 問題文(含コード&リンク):
下図の全てのルートを出力するプログラムを作成しなさい
ttp://uproda11.2ch-library.com/src/114337.gif
[3] 環境
[3.1] OS: WINxp sp2
[3.2] コンパイラ名とバージョン: gcc
[3.3] 言語: C
[4] 期限: 5月14日まで
0707デフォルトの名無しさん
2007/05/06(日) 21:44:48すみません課題を最後まで読んでませんでしたw
関数として記述するんですねw
0708699
2007/05/06(日) 21:47:41せっかくだから少し回答してみようかと
普段RON専だし自分も学生なので微妙かもですが
�A
・整数部
一旦int型にして10で割っていき、「どの時点で0になるか」で判断
ただ、整数部が6桁以上かどうかだけなら 絶対値 >= 100000 でいいのではないかと
・小数部
double型のまま10倍していき、「どの時点で小数部が0になるか」で判断
小数部のみを見るときは [値]-(int)[値] で小数部を抜き出せるかと。
�D
型キャストと違って%fなどで精度を指定しても、
切り捨て、四捨五入、5より上のみ切り上げ(四捨五入ではない)
のどれなのかがはっきりしないようです。
なので、
・値を10の5乗倍→小数部が0.5以上なら1を足す
→intでキャスト(切捨て)→10の5乗で割る
でなるかと。
�E
次に-を入力したら
今の値:15 演算子:- 入れたもの: 演算子又は数値を入力しましょう>>
となるんですかね?
だとしたら、10を入力した時点で今の値を計算するのではなく、
次の演算子が入力された時点で計算すれば、値は保持されたままなので
演算子を入力した後の表示にもっていけばなるんじゃないでしょうか。
と、まぁ、こんな感じでどうでしょうか。。。
計算上の誤差とか無視してたり日本語妙だったりしますが、参考になってれば幸いです。
0709デフォルトの名無しさん
2007/05/06(日) 22:14:17int main()
0710デフォルトの名無しさん
2007/05/06(日) 22:32:18普通にdouble型で計算して
計算結果はsprintfかなんかで文字列に変換して出力すればいいんじゃね?
四捨五入は文字列変換前に0.000005足して、
文字列変換後に小数点以下6桁目をNULLで上書き。
(でももっといい方法あると思う)
�Eについては何に困ってるのか良く分からんのでなんともかんとも。
0711691
2007/05/06(日) 22:39:54まだC始めて1ヶ月ぐらいなので、ぱっと頭の中にどう書いたら出来るかが出てこない
ですけど(汗)。
あと、strtodを使った0消しは、strtodは文字列をdoubleに変換なので、最初にdouble型で入れた数値は
文字列ではないので、一旦適当な配列を作ってそれに、double型として
いれた数値を入れてあげてから変換ということでしょうか?
配列にdouble型変数に入れてある数値を代入出来るかどうか分かりませんが。
0712699
2007/05/06(日) 22:48:36なるほどその手が、、、
よってさっきのを訂正、あくまで自分が紹介した方法でやるなら、だけど、、、
・値を10の5乗倍→0.5を足す→intでキャスト(切捨て)→10の5乗で割る
0713デフォルトの名無しさん
2007/05/06(日) 22:51:010714デフォルトの名無しさん
2007/05/06(日) 22:51:55すべてのルートっていうのは任意の頂点から他の任意の頂点への経路ってことなのか?
0715699
2007/05/06(日) 22:58:00>>711
最初からdouble型で入力を受けたなら、
何もしなくても前後の0は勝手に消えてるかと思います、たぶん
>>713
なんかもう自分失敗しまくりですねホント、、、
先の計算ですが、絶対値で計算してから符号を元に戻せばなる、かな、、、
0716デフォルトの名無しさん
2007/05/06(日) 23:21:49a地点からf地点への考えられる全てのルートです。
説明不足ですみません・・・
0717デフォルトの名無しさん
2007/05/06(日) 23:33:01[2] 問題文(含コード&リンク):
目の前に三つの箱があり、そのうちの一つには当たりが入っており、
残りの二つにははずれが入っているものとする。
人間aはまず三つの箱から一つを選択する。
(この時点ではaは箱の中身を確認しない)
その後、別の人間bにより、aが選択しなかった二つの箱のうちからハズレの箱が一つ示されるものとする。
この状況において、再度aに選択のチャンスが与えられた場合、
(bによりハズレの箱が一つ示されているのでaの選択肢は二つ)
aは最初の選択で選ばなかった箱を選択した方が
当たりを引く可能性が高いことをプログラムを用いて確認せよ
[3] 環境
[3.1] OS: WindowsXP
[3.2] コンパイラ名とバージョン: bcc5.5
[3.3] 言語: C/C++どちらでも可
[4] 期限: 2007/05/07 17時
期限ギリギリで申し訳ありませんが
よろしくお願いします
0718デフォルトの名無しさん
2007/05/06(日) 23:43:37ありがとうございます!
0719デフォルトの名無しさん
2007/05/07(月) 00:03:28明日(5/7)の9時までです…
誰か
A=1/√(2π)∫exp(-x^2/2)dx(x=0~2)
のAをモンテカルロ法で出してください・・
そして
exp[-1/200 Σ(x_i - 50)^2](i=1~3)
の平均値を出してもらえると嬉しいです・・
まじでお願いしますorz
GWで先生に聞けなかったんで・・・
ttp://www.borujoa.org/upload/source/upload11498.pdf
>>622
>>647
>>698
0720699
2007/05/07(月) 00:13:45#include<stdio.h>
void function(int p,int n);
char str1[7];
char str2[6][3]={"bc","dc","de","ef","f",""};
int main(void){
function(0,0);
return(0);
}
void function(int p,int n){
int i;
str1[n] = p + 'a';
str1[n+1] = '\0';
if(p != 5)
{
for(i=0;str2[p][i] != '\0';i++)
function(str2[p][i]-'a',n+1);
}
else
printf("%s\n",str1);
}
こんな感じでどうでしょうか
アルゴリズムとか調べず直感で作ったので自信薄ですが
0721デフォルトの名無しさん
2007/05/07(月) 00:22:55選んだものが当りの可能性が1/3で残ったほうが2/3なのは当たり前すぎて
どう書いていいのか分からん。
正直抜き取る処理なんて書くだけ無駄だろ。
0722デフォルトの名無しさん
2007/05/07(月) 00:35:56#include <stdio.h>
#define N 6
const int adjacency_matrix[N][N] = {
{0, 1, 1, 0, 0, 0},
{0, 0, 1, 1, 0, 0},
{0, 0, 0, 1, 1, 0},
{0, 0, 0, 0, 1, 1},
{0, 0, 0, 0, 0, 1},
{0, 0, 0, 0, 0, 0}
};
void print_route(int path[], int idx) {
int i;
for(i=0;i<idx;i++)printf("%c -> ",'a'+path[i]);
printf("%c\n",'a'+path[idx]);
}
void check_edge(int path[], int idx) {
int j;
for(j=0;j<N;j++){
if(adjacency_matrix[path[idx-1]][j]){
path[idx]=j;
if(j==N-1)print_route(path,idx);
else check_edge(path,idx+1);
}
}
}
int main(void) {
int path[N];
path[0]=0;
check_edge(path,1);
return 0;
}
0723デフォルトの名無しさん
2007/05/07(月) 00:44:43これでいいかい。
ttp://www.geocities.jp/wepon_bafu/monty_hole_dilemma.html
0724デフォルトの名無しさん
2007/05/07(月) 00:51:37[2] 問題文(含コード&リンク):
data7.txt〜data15.txtに対し、順列生成した結果を割当の解として、
全ての解を比較して最小コストになる割当を求めよ。
その際、順列生成と解の比較に要した時間を計測する事。
但し、実行時間があまりに膨大になった場合には、「***時間実行後キャンセル」と報告しても良い。
data7〜data15
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3941.zip
[3] 環境
[3.1] OS: WindowsXP
[3.2] コンパイラ名とバージョン: cygwin
[3.3] 言語: C++
[4] 期限:2007年5月7日13:00まで]
[5] その他の制限:特にありません。
割当の設計がどうも上手く行きません。
どなたかよろしくお願いします。
0725デフォルトの名無しさん
2007/05/07(月) 01:04:56こういうことかな?
説明の便宜上3つの箱に名前をつける → 箱1、箱2、箱3
最初にAが選択したときあたりを引く確率は1/3
逆に選らばなったほうにあたりがある確率は2/3
仮にAが箱1を選んだとする.このときの箱1があたりである確率は1/3
すると箱2、箱3のどちらかがあたりである確率は2/3になる
次にBが箱2を選びそれがはずれだったと示されたとする
すると箱2と箱3の「どちらかがあたり」の確率が2/3だったのがBの「はずれ」によって
箱3があたりである確率が2/3となる
よって最初に選んだ箱1があたりである確率1/3より
最後に残った箱3があたりである確率2/3の方が当たる確率は高い
ってことででどうでしょうか?
0726725
2007/05/07(月) 01:08:20徒労に終わりましたね、俺・・・
もう寝よ
0727699,720
2007/05/07(月) 01:09:16720ですが、投稿時に全角スペースが混じった模様、
そのままではコンパイルできないので注意されたし。
あと、いちいち'\0'入れてますけど出力する前に入れたほうが良いことに気づきました
まぁ結果は変わらないですけど。。。
0728699,720
2007/05/07(月) 01:13:42配列str2ですが、pが5のときは参照されないので最後の要素は不要です
0729デフォルトの名無しさん
2007/05/07(月) 01:16:32[2] 問題文
三角形の2辺の長さa,bとその間の角度θ(ラジアン:0>θ>π)を読み込み、
残りの1辺の長さcと三角形の面積Sを求めて表示するプログラムを作成し
適当な数値を与えて実行しなさい。
[3] 環境
[3.1] OS: WINxp sp2
[3.2] コンパイラ名とバージョン: gcc
[3.3] 言語: C
[4] 期限: 5月8日まで
0730デフォルトの名無しさん
2007/05/07(月) 01:49:50#include <stdio.h>
#include <math.h>
int main(void)
{
double a, b, c, S, rad;
char buf[80];
printf("a = "); fgets(buf, sizeof(buf), stdin); sscanf(buf, "%lf", &a);
printf("b = "); fgets(buf, sizeof(buf), stdin); sscanf(buf, "%lf", &b);
printf("rad = "); fgets(buf, sizeof(buf), stdin); sscanf(buf, "%lf", &rad);
c = sqrt(pow(a, 2.0) + pow(b, 2.0) + 2 * a * b * cos(rad));
S = (a * b * sin(rad)) / 2.0;
printf("a = %g, b = %g, c = %g, and S = %g\n", a, b, c, S);
return 0;
}
実行例
% ./a.exe
a = 4
b = 3
rad = 1.57
a = 4, b = 3, c = 5.00191, and S = 6
% ./a.exe
a = 2
b = 1.732051
rad = 1.047
a = 2, b = 1.73205, c = 3.23501, and S = 1.49983
0731デフォルトの名無しさん
2007/05/07(月) 01:51:15あきらかにcの値が変だな。すまない。
見直しはしていない。
0732デフォルトの名無しさん
2007/05/07(月) 03:02:29ここだな
powのあとのやつがマイナスだな
0733デフォルトの名無しさん
2007/05/07(月) 03:09:04cygwinでもclock()でいいのかな.不確定事項が多いので何かと適当.
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3943.cpp
>>730
とりあえず余弦定理の第三項はマイナス.
× c = sqrt(pow(a, 2.0) + pow(b, 2.0) + 2 * a * b * cos(rad));
◯ c = sqrt(pow(a, 2.0) + pow(b, 2.0) - 2 * a * b * cos(rad));
0734デフォルトの名無しさん
2007/05/07(月) 05:53:10[2] 問題文(含コード&リンク):srand関数を用いず、
合同法の応用、
整数列 Rn=a(R(n-1)%c)-d(R(n-1)/c)これが負なら
a(R(n-1)%c)-d(R(n-1)/c)+b
ただし、a=16807,b=2147483647 ,c=127773,d=2836
区間(0,1)における擬似乱数(実数)列 Rn'=Rn/b
を利用した乱数を元に、
モンテカルロ法を用いて円周率を求めなさい。
また、その円周率は10回行い、その平均と標準偏差を出しなさい。
[3] 環境
[3.1] OS:Windows
[3.2] コンパイラ名とバージョン:VC 2005
[3.3] 言語:C
[4] 期限:5月8日深夜24時まで
[5] その他の制限:3つの2次元配列a[3][3],b[3][3],c[3][3]を宣言し、
配列a,bを3行3列の行列の値で初期化して、各要素の
和を配列cに入れる。
少し変わっていて、プログラミング以外の知識も必要かもしれませんが、
どうか宜しくお願いします。
PS.とりあえず自力でsrand関数を使った(モンテカルロ法を利用した円周率を求める)
バージョンを少しだけ作ってみました。
一応ちゃんとエラーなしで起動して、円周率を表示させられました。
正しい方向性かわかりませんが、下地にして頂けたらと思います。
0735デフォルトの名無しさん
2007/05/07(月) 05:54:24#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
double i,imax,n;
double x,y,pi[10],ave,sum;
int a;
for(a=0; a<10; a++)
{
srand((unsigned)time(NULL)%32768);
n=0.0;
imax=10000.0; //乱数発生回数
for(i=0; i<=imax; i++)
{
x=rand()/(RAND_MAX+1.0); //範囲(0,1)の乱数発生
y=rand()/(RAND_MAX+1.0);
if((x*x+y*y)<=1.0) //0<=x,y<=1の範囲にある中心原点1の4分円内に入ればカウント
{
n+=1.0;
}
}
pi[a]=n/imax*4.0; //半径1の円の面積、すなわち円周率
}
for(a=0, sum=0; a<10; a++) //結果の合計
sum += pi[a];
ave=sum/10.0; //結果の平均
printf("π=%f\n",ave);
return 0;
}
0736734
2007/05/07(月) 05:56:44[5] その他の制限:3つの2次元配列a[3][3],b[3][3],c[3][3]を宣言し、
配列a,bを3行3列の行列の値で初期化して、各要素の
和を配列cに入れる。
の部分はなしでお願いします。
制限としては、乱数をsrand関数を用いず自作する以外はありません。
よろしくお願いします
0737デフォルトの名無しさん
2007/05/07(月) 06:02:11とりあえずこいつが問題ないという前提で、書かれてるアルゴリズムを使った乱数ジェネレータを書いた
これとrand()を入れ替えて試してみてくれ
脳内コンパイラだからエラーでるかもしれん
後、指示がなかったからR0=1と仮定したぞ
int myrand()
{
static int x = 1;
int a = 16807;
int b = 2147483647;
int c = 127773;
int d = 2836;
int r = a*(x%c) - d*(x/c);
if (r < 0)
r += b;
return r/b;
}
0738デフォルトの名無しさん
2007/05/07(月) 06:04:19x=myrand(); y=myrand();
-int myrand()
+double myrand()
-return r/b;
+return (double)r/(double)b;
0739デフォルトの名無しさん
2007/05/07(月) 06:13:28>>738に追加
-static int x = 1;
-int r = a*(略)
+static int r;
+if (!r) r=1;
+r=a*(r%c) - d*(r/c);
0740デフォルトの名無しさん
2007/05/07(月) 06:56:43お二人のソース参考にしてなんとか仕上がりそうです。
どうもありがとうございます!
0741734
2007/05/07(月) 14:44:13お手伝い、大変ありがとうございます!!
早速組み立ててみたのですが、エラーはでませんでした。
しかし、円周率が常に4.000400になってしまいました。
しかもcやdの値を変えても変化がありませんでした。
このアルゴリズムに乗っ取ると、こうなるのでしょうか…
組み立てたコードを示させていただきますので、 何か変なところ、
ここがこれだとダメでしょ などのご指摘があれば宜しくお願いします。
ちなみにr0は4119でお願いします。
0742734
2007/05/07(月) 14:46:11#include<stdlib.h>
double myrand() //乱数作成関数
{ static int r;
int a = 16807; int b = 2147483647; int c = 127773; int d = 2836;
if(!r)
{ r = 4119;
r = a*(r%c)-d*(r/c); }
if(r<0)
{ r += b; }
return (double)r/(double)b; }
int main()
{ double i,imax,n;
double x,y,pi[10],ave,sum;
int a;
for(a=0; a<10; a++)
{ n=0.0;
imax=10000.0; //乱数発生回数
for(i=0; i<=imax; i++)
{ x = myrand()/(RAND_MAX+1.0); //範囲(0,1)の乱数発生
y = myrand()/(RAND_MAX+1.0);
if((x*x+y*y)<=1.0) //0<=x,y<=1の範囲にある中心原点1の4分円内に入ればカウント
{ n += 1.0; }
}
pi[a] = n/imax*4.0; //半径1の円の面積、すなわち円周率 }
for(a=0, sum=0; a<10; a++) //結果の合計
{ sum += pi[a];
ave = sum/10.0; //結果の平均 }
printf("π=%f\n",ave);
return 0; }
0743デフォルトの名無しさん
2007/05/07(月) 15:02:460744デフォルトの名無しさん
2007/05/07(月) 15:03:14#include <stdio.h>
#include <math.h>
int my_rand(int a, int b, int c, int d, int rn){
int temp = a*(rn%c) - d*(rn/c);
return temp > 0 ? temp : temp + b;
}
int main(){
double x, y, pi[10], ave = 0;
int rn = 1, a=16807, b=2147483647 , c=127773, d=2836, j, i, i_max = 20000, count_in;
for(j = 0; j < sizeof(pi)/sizeof(pi[0]); j++){
count_in = 0;
for(i = 0; i < i_max; i++){
rn = my_rand(a, b, c, d, rn);
x = (double)rn/b;
rn = my_rand(a, b, c, d, rn);
y = (double)rn/b;
if(sqrt(pow(x, 2) + pow(y, 2)) <= 1) count_in++;
}
pi[j] = 4*(double)count_in/i_max;
}
for(j = 0; j < sizeof(pi)/sizeof(pi[0]); j++) ave += pi[j];
ave /= sizeof(pi)/sizeof(pi[0]);
printf("pi = %f\n", ave);
return 0;
}
0745デフォルトの名無しさん
2007/05/07(月) 15:15:19if(!r) {
r = 4119;
r = a*(r%c)-d*(r/c);
}
↓
if(!r) r = 4119;
r = a*(r%c)-d*(r/c);
x = myrand()/(RAND_MAX+1.0);
y = myrand()/(RAND_MAX+1.0);
↓
x = myrand();
y = myrand();
0746734
2007/05/07(月) 17:11:51>>744
皆さん本当にありがとうございます!
>745さんの修正で、先ほどのが一応動きました。
このアルゴリズムでは、当然ながらシード(初期値)をかえない限り、
毎回同じ乱数になりますよね。
なので、出力結果は毎回同じなのですが、たぶん課題はこれでOKだと
思います。
気になりますのは、>744さんの作品。
コードを読んでいて途中でよくわからなくなってしまったのですが、
やっていることは同じなのでしょうか…?
初期値(rn)を1から4119にして起動してみて、正常に動きました。
これもまた同じく毎回同じ乱数のため、毎回同じ円周率が出力されますが。
ですが、特にメイン関数が謎です。
>745さんのと>744さんのでは何が違うのか自分ではよくわかりません…。
課題の文章を全体載せさせていただきます。
区間(0,1)内の一様乱数を2個発生させ、x、yとし、x~2+y~2<=1ならば
合格、外れれば不合格とし、合格回数と2個ずつの乱数発生回数との比ρを
用いて、円周率πが得られる。なぜなら、一様乱数2個の組み合わせで、
長さ1の正方形の1点を指定でき、これを繰り返すと、その正方形内を
一様になめていくことになる。その組み合わせのうち半径1の4分円内に入る
比率ρはこれらの面積比に等しいはずである。
このような考えの上、乱数発生回数10000回の実験にし、それらを10回
実行し、10個の標本値の平均と標準偏差を出しなさい。
というものです。最初に少し解釈しすぎて載せてしまったために、わかりずらくなってしまった
かもしれませんが、すみませんでした…。
0747デフォルトの名無しさん
2007/05/07(月) 17:20:37int strcmp(const char *str1, const char *str2)
{
while(*str1 && *str2){
if(*str1 != *str2){
if(*str1 > *str2)
return 1;
return -1;
}
str1++;
str2++;
}
if(!*str1 && !*str2)
return 0;
if(*str1)
return 1;
return -1;
}
0748744
2007/05/07(月) 18:21:32乱数の戻り値とpiの扱いが違うかも。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3948.txt
0749デフォルトの名無しさん
2007/05/07(月) 19:06:24744と745はやってることはほぼ同じ。
ただ745はfor(i=0; i<=imax; i++)をfor(i=0; i<imax; i++)に修正すべきなのを見落としたから
結果が微妙に間違ってる。
そこを修正して744のrnを4119、i_maxを10000にすれば同じ結果になると思うよ。
0750ges
2007/05/07(月) 19:30:27[3] 環境
[3.1] OS: WindowsXP
[3.2] コンパイラ名とバージョン:VisualC++(ここ何て書けばいいか分からなくてすいません。)
[3.3] 言語:C++
[4] 期限:[2007年5月8日正午まで]
[5]制限:
[問題]あるソフトのある動作をマウスクリックやキーボード入力をせずC++で実行させるプログラムが欲しいんですが。ってこんな言い回しじゃ訳分からんので下の例題プログラムの作成をお願いします…。
(例題)ソフトInternetExplolerを開いている状態で(ページはどこでも構わない)そのページを保存するプログラムを作って下さい。
簡単に言うとIE上でマウスで「ファイル」をクリック→「名前を付けて保存(A)」をクリックっていうだけの動作のプログラム。キーボード操作で言うと、「Alt」→「F」→「A」って入力するだけなんですが(何故こんなことをプログラムで実行するのか)
そのC++プログラムで出来た「.exe」ファイルを実行する(開く)とIEを開いている状態なら「名前を付けて保存(A)」が実行され、IEが開いていなければエラー→終了ってのをお願いします。
こんな説明で分かって頂けたら幸いです。
0751デフォルトの名無しさん
2007/05/07(月) 19:48:510752620
2007/05/07(月) 19:52:02コンパイルはできるのですが、実行するとセグメンテーション違反ですと表示されます。
間違いなどのご指摘お願いします。
#include<stdio.h>
#include<stdlib.h>
int main(int argc, char *argv[])
{
FILE *fin;
FILE *fout;
int data;
char judge;
fin = fopen(argv[1], "r");
if(fin == '\0')
{
printf("コピー元ファイルが存在しません\n");
exit(1);
}
0753620
2007/05/07(月) 19:53:02if(fout != '\0')
{
printf("コピー先ファイル名で指定したファイルが既にあります\n");
printf("上書き処理は'y''Y'を、行わない場合はそれ以外を入力してください")
scanf("%s", &judge);
if(judge == 'y' || judge == 'Y')
{
fclose(fout);
}
else
{
exit(1);
}
}
fout = fopen(argv[2], "w");
0754620
2007/05/07(月) 19:54:44{
data = fgetc(fin);
if(feof(fin))
{
break;
}
if(data == '\t')
{
continue;
}
fputc(data, fout);
}
fclose(fin);
fclose(fout);
return 0;
}
0755デフォルトの名無しさん
2007/05/07(月) 19:55:43細かいことだが、fin=='\0'はどうかと思うな
そりゃ意図通り動くっちゃ動くが一瞬何事かと思うぞ
で、セグフォが出てる原因だが、char型のjudgeに読み込み指定子%sを使ってるのが悪い
%sは文字列であって、文字列を文字型に突っ込むのはァゥァゥ
0756デフォルトの名無しさん
2007/05/07(月) 19:58:50どーでもいいけど、お前さん>>660でないの?
>>620でなくて。
0757デフォルトの名無しさん
2007/05/07(月) 20:29:09引数が2コより少ない場合もsegvの可能性があるな。
引数の個数チェックはちゃんとやったほうがいいぞ。
0758デフォルトの名無しさん
2007/05/07(月) 20:49:48[2] 問題文(含コード&リンク): モンテカルロ法でS=∫x^2dx(x=0~1)を求めよ。
[3] 環境
[3.1] OS: (Windows/Linux/等々) WindowsXP
[3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等)gcc
[3.3] 言語: (C/C++/どちらでも可 のいずれか) C
[4] 期限: ([yyyy年mm月dd日hh:mmまで] または [無期限] のいずれか) あと12時間
0759デフォルトの名無しさん
2007/05/07(月) 21:08:31ここは勉強になります
0761デフォルトの名無しさん
2007/05/07(月) 21:30:06#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
double func_1(double x){
return pow(x, 2);
}
double monte(double a, double b, double c, int n, double (*func)()){
int i, j;
double x, y;
srand(time(NULL));
for (i = 0, j = 0; i < n; i++)
{
x = (b - a)*rand()/RAND_MAX+a;
y = c*rand()/RAND_MAX;
if (func(x) >= y)
j++;
}
printf("count = %d\n", j);
return (b - a)*c*(double)j/(double)n;
}
int main(){
double s = monte(0.0, 1.0, 1.0, 1000, func_1);
printf("S = %lf\n", s);
}
0762デフォルトの名無しさん
2007/05/07(月) 22:05:28[2] 問題文(含コード&リンク):http://www.geocities.jp/gigabeatsenyou/kadai.JPG
[3] 環境
[3.1] OS: WindowsXP
[3.2] Borland C++ Compiler 5.5
[3.3] 言語: C
[4] 期限: 5月12日 土曜(2時30まで)
[5] その他の制限: 基本的なC言語(printfやscanf)しか習っていません
今回は予習でif文やfor文などを使って上記のURLの式を解いて来いといわれました
よろしくお願いいたします
0763691
2007/05/07(月) 22:17:14改めて質問なんですが、入力したものを文字列として入れて処理をすることに
なりました(入れたものが数字かどうかを判断するのにisdigit関数を使う為)。
それで、文字列として入ったものを使って
初期画面表示を
printf("今の値:%s",A); printf("演算子:%c",B); printf("入れたもの:%s\n",C);とするときに
(A,Cはそれぞれ配列)
�@003.0300と入ってきた時に3.03とするには(0消しの後、AやCに入れて表示する)
�A入った文字列が数字のときに、その桁数が小数点上5桁下5桁だと判断するには
�B演算するには数字でないといけないと思うので、数字に変換するには(atofとかでしょうか?)
数字にしたあとは結果をAに入れて表示するので、最終的には再び文字列にするわけですが。
の3つが今考えているところです。
やり方が分かる方、知恵を貸して頂けるとあり難いです。
0764デフォルトの名無しさん
2007/05/07(月) 22:20:57[2] 問題文 (含コード&リンク) :
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3949.txt
weather_3.dat↓
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3950.txt
[3] 環境
[3.1] OS:Linux
[3.2] コンパイラ名とバージョン:gcc
[3.3] 言語:C言語
[4] 期限:2007年05月08日02:00くらいまでにお願いします。
[5] その他の制限:初心者でもわかるようにお願いします。
長くなってもかまいません。
0765デフォルトの名無しさん
2007/05/07(月) 22:23:38atof()を使えば数値化できる。strtod()なら切り出しにも便利。
逆に文字列化するには、sprintf()で%.10gでもすればいいだろう。
あー、5桁小数点5桁か。それなら%12.5fで。負の値を扱わないなら%11.5fか。
0766デフォルトの名無しさん
2007/05/07(月) 22:27:15[2] 問題文:
文字列(128文字以内)を読み込み、大文字を小文字に変換し、
アルファベット順に再構成して表示するプログラムを作成せよ。ただし、
文字列の走査にはポインタ変数を使用すること。文字列変換関数を用いないこと。
大文字を小文字に変換するには、文字コードの差('A'-'a')を利用すればよい。
[3] 環境
[3.1] OS: Linux
[3.2] コンパイラ名とバージョン: gcc 3.4 VC 6.0
[3.3] 言語: C言語
[4] 期限: 2007年5月8日8:00まで
[5] その他の制限: 走査にはポインタ変数を使用 文字列変換関数を用いない
どうかよろしくお願いします。
0767デフォルトの名無しさん
2007/05/07(月) 22:31:20ありがとうございます!
0768デフォルトの名無しさん
2007/05/07(月) 22:35:25ありがとうございます!
0769デフォルトの名無しさん
2007/05/07(月) 22:47:25[2] 問題文(含コード&リンク):
http://upload.fam.cx/cgi-bin/img-box/vib70507224551.jpg
↑の平均値を求めるプログラムを作れ。
[3] 環境
[3.1] OS: (Windows/Linux/等々) WindowsXP
[3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等) Borland C++
[3.3] 言語: (C/C++/どちらでも可 のいずれか) C
[4] 期限: ([yyyy年mm月dd日hh:mmまで] または [無期限] のいずれか) 約あと1時間
何回もすみません。
よろしくお願いしますorz
0770699,720
2007/05/07(月) 23:43:34既に数字に変換する方法は紹介されているようなので、その他の解説で
他にいい方法があるとは思いますが、なければ使ってやってください
数字に変換(�B)を先に行った場合、その時点で�@は満たされるのではないかと思います
ただし、通常の%fだと小数点以下6桁を表示するので後に0が付いてしまいます
なので、�Aの時(708,712,715参照)に小数点以下の桁数を調べておき、
表示の桁数を合わせる(699参照)でいけるかと
文字列のまま0を消す場合ですが
配列に 0 0 3 . 0 3 0 0 '\0' と入っているとすると
配列の先頭から見ていき、符号と0を除外した数値が出る位置
つまり本当の意味での数値の先頭(この場合3の位置)を調べます
位置を調べたら符号を消さないように配列をずらし
3 . 0 3 0 0 '\0' とします
今度は'\0'の位置を調べて、そこから0以外の数値が出る位置を、
さっきとは逆方向に進みながら調べます
その位置(最後尾の3)の後ろに'\0'を入れれば
3 . 0 3 '\0'
となるのでOKです
0771699,720
2007/05/08(火) 00:06:030消しをした後に小数点の位置を調べて、
先頭と小数点の間隔で整数部の桁数(符号に注意)
小数点と'\0'の間隔で小数部の桁数
が分かるはずです
あと、以前に紹介した小数部の桁数を調べる方法ですが、
やはり誤差のせいで上手くいかないようです
(double型の変数に適当な値を代入して%.30fなどで出力していただければわかるかと)
なので、確実にいくなら文字列の状態のまま桁数を調べた方が上手くいきそうです
0772デフォルトの名無しさん
2007/05/08(火) 00:35:05問題文は
テキストファイルとして作成されたnews001.txt news002.txt...etcというファイルを読み込んで
タイトルと内容を分かりやすいデザインで表示するphpプログラムを作成する。
演習を行う前にテキストファイルを置くディレクトリをつくりそこに次のような内容のファイルを置く
Subject:任意
content:任意
作成順序
まずファイル名を読み込んで全て表示できるようにする。
それぞれを開いてsubject行を表示するプログラムにする
標題と内容を表示するスクリプトにする。
以上です。
PHPに手を出したのですが全く手がでないので途中まででも教えてもらえると嬉しいです。
0773デフォルトの名無しさん
2007/05/08(火) 00:42:56スレ違いじゃんかよ。
とりあえずここ読め。
http://www.php.gr.jp/project/doc/
opendir
file
とかその辺調べろ。
0774デフォルトの名無しさん
2007/05/08(火) 07:44:20#include <stdio.h>
#include <stdlib.h>
#define N 1024
void bsort(int x[], int n){
int i, j;
for(i = 0; i < n - 1; i++)
for(j = i + 1; j < n; j++)
if(x[i] < x[j]){ int temp = x[i]; x[i] = x[j]; x[j] = temp; }
}
int main(int argc, char *argv[]){
FILE *fp;
int x[N], i, count = 0;
char buf[256];
if(argc < 2){ fprintf(stderr, "argment is needed.\n"); return -1; }
if((fp = fopen(argv[1], "r")) == NULL){ fprintf(stderr, "%s is cannot openned.\n", argv[1]); return -2; }
while(count < N){
fscanf(fp, "%s", buf);
if(feof(fp)) break;
x[count++] = atoi(buf);
}
bsort(x, count);
fp = freopen(argv[2], "w", fp);
for(i = 0; i < count; i++) fprintf(fp, "%d\n", x[i]);
fclose(fp);
return 0;
}
0775デフォルトの名無しさん
2007/05/08(火) 07:57:57#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define STR_SIZE (128+1)
int my_tolower(int ch){ return islower(ch) ? ch : ch - ('A' - 'a'); }
int comp_char(const char *p, const char *q){ return *p - *q; }
int main(){
int i;
char buf[STR_SIZE], *p;
fgets(buf, STR_SIZE, stdin);
if((p =strchr(buf, '\n')) != NULL) *p = '\0';
for(p = buf; *p != '\0'; p++) *p = my_tolower(*p);
qsort(buf, strlen(buf), sizeof(char), (int (*)(const void *, const void *))comp_char);
puts(buf);
return 0;
}
0776774
2007/05/08(火) 08:03:250777デフォルトの名無しさん
2007/05/08(火) 08:33:57ありがとうございました!
0778デフォルトの名無しさん
2007/05/08(火) 12:36:18ありがとうございました!
0779デフォルトの名無しさん
2007/05/08(火) 13:31:18[2] 問題文:f(x)=x^3(xの3乗)のdf(x)/dxを求めるプログラムをC++を作れ。
(1≦x≦2、xは0.01ずつ増加、そのときのf(x)値を用いる。)
[3] 環境
[3.1] OS:WindowsXP
[3.2] コンパイラ名とバージョン: Borland C++
[3.3] 言語: C++
[4] 期限: 5月14日まで
C言語が全く手つかずにいます。
どうか、よろしくお願いします。
0780デフォルトの名無しさん
2007/05/08(火) 13:49:29ありがとうございました!
0781デフォルトの名無しさん
2007/05/08(火) 14:28:00[2] 問題文(含コード&リンク):
n回のコイン投げをおこなった時の表が出た回数の割合とコイントスで表の出
る確率pの差の絶対値に対する1000セットのシミュレーションの結果を大数の
法則を用いて論ぜよ。ただし、n=256,512,1024,...,32768のように2倍づつ
大きくせよ。さらに、p=0.58とせよ。また、計算プログラムはMPIを使って並
列化を行い、並列化(最大8プロセス)の効果を計算時間から報告せよ。
[3] 環境
[3.1] OS:Windows XP
[3.2] コンパイラ名とバージョン:gcc
[3.3] 言語:C
[4] 期限:5月14日(月)
[5] その他の制限:特にありません
0782781
2007/05/08(火) 14:30:47やり方が分かりません・・。よろしくお願いします。
1 #include <stdio.h>
2 #include <stdlib.h>
3
4 int* setup_memory(int n);
5 void toss(double p, int n, int *board);
6
7 int main(int argc, char** argv){
8 int n=256;
9 double p=0.58;
10 int nsample=16;
11 int seed=12345;
12
13 int *board=setup_memory(n);
14
15 srandom(seed);
16
17 int imc;
18 for(imc=0;imc<nsample;imc++){
19 toss(p,n,board);
20 double z=0;
21 int i;
22 for(i=0;i<n;i++)
23 z += board[i];
24 z /= n;
25 printf("%g\n",z);
26 }
27 return 0;
28 }
0783782の続き
2007/05/08(火) 14:33:1030 int* setup_memory(int n){
31 return (int*) malloc(sizeof(int)*n);
32 }
33
34 void toss(double p, int n, int *board){
35 int i;
36 for(i=0;i<n;i++){
37 if((double)random()/RAND_MAX < p)
38 board[i]=1;
39 else
40 board[i]=0;
41 }
42 }
0784デフォルトの名無しさん
2007/05/08(火) 14:45:55[2] 問題文:
『引数 strを逆順にして返す関数』 reverseString(char str[]) を 作成し
コンソールから入力した文字列を逆順にして返すプログラムを作成せよ。
[3] 環境
[3.1] OS: Linux
[3.2] コンパイラ名とバージョン: gcc 3.4 VC 6.0
[3.3] 言語: C言語
[4] 期限: 2007年5月9日8:00まで
[5] その他の制限: 文字列操作にはポインタ変数を使用すること
どうぞよろしくお願いします。
0785デフォルトの名無しさん
2007/05/08(火) 14:52:14ここを管理している方は誰なのでしょうか?
0786デフォルトの名無しさん
2007/05/08(火) 15:16:35#include <stdio.h>
void reverseString(char str[]) {
int i;
for(i=0; *str!='\0'; i++,str++);
for(str--,i--; i>=0; i--) {
putchar(*str--); } }
int main(void) {
char str[256];
int ch,i,j,sz=sizeof(str)/sizeof(str[0])-1;
printf("Input > ");
for(i=0; i<sz; i++) {
if( (ch=getchar()) == '\n') break;
str[i]=ch; }
str[i]='\0';
reverseString(str);
return 0; }
0787デフォルトの名無しさん
2007/05/08(火) 15:23:08ちとやり直してくる。
0788デフォルトの名無しさん
2007/05/08(火) 15:39:37#include <stdio.h>
void reverseString(char str[]) {
int i,j;
char tmp;
for(i=0; str[i]!='\0'; i++);
for(i--,j=0; j<i; j++,i--) {
tmp=str[i];
str[i]=str[j];
str[j]=tmp;
} }
int main(void) {
char str[256];
int ch,i,j,sz=sizeof(str)/sizeof(str[0])-1;
printf("Input > ");
for(i=0; i<sz; i++) {
if( (ch=getchar()) == '\n') break;
str[i]=ch;}
str[i]='\0';
reverseString(str);
puts(str);
return 0; }
0789デフォルトの名無しさん
2007/05/08(火) 15:41:28786氏が解答してるけど、色々なコードを見た方が勉強になるかな
と思うので貼っとく、と言うか" "のテストしたいだけだったりして
#include<stdio.h>
#include<string.h>
void reverseString(char str[]);
int main(void)
{
char s[50];
gets(s);
printf(s);
reverseString(s);
printf(s);
return 0;
}
void reverseString(char str[]){
char *p1,*p2,str2[50];
p1=str + strlen(str)-1;
p2=str2;
while(p1>=str) *p2++=*p1--;*p2='\0';
p1=str;p2=str2;
while(*p2) *p1++=*p2++;*p1='\0';
}
0790デフォルトの名無しさん
2007/05/08(火) 15:45:08printf(s) は s中に % あると誤爆するぜよ
0791デフォルトの名無しさん
2007/05/08(火) 15:49:180792784
2007/05/08(火) 16:55:08#include <stdio.h>
#include "reverse_string1.h"
int main(void) {
char str[256];
str[0] = '/';
str[1] = ')';
str[2] = '`';
str[3] = 'A';
str[4] = '\'';
str[5] = '(';
str[6] = '/';
str[7] = '~';
str[8] = 'o';
str[9] = 't'; str[10] = 'a';str[11] = 'g';
str[12] = 'i';str[13] = 'r';str[14] = 'a';
puts(str);
reverseString(str); puts(str);
return 0;
}
gcc -c reverse_string1.c // reverse_string1.o 生成
gcc test_reverse.c -o test_reverse // コンパイルエラー test_reverse.c:(.text+0xb4): undefied reference to `reverseString'
上手くヘッダが取りこめない orz
0793デフォルトの名無しさん
2007/05/08(火) 16:59:430794784
2007/05/08(火) 17:23:49gcc -c test_reverse.c
gcc test_reverse.o reverse_string1.o -o test_reverse
ってやったら
>test_reverse
/)`A'(/~otagira
arigato~/('A`)/
上手く取り込めたけど何か最後に変な文字が入ってました。
先生最後の変な文字を strip(str) とかで落としたいです…
0795デフォルトの名無しさん
2007/05/08(火) 17:29:31>>792 コードなら str[15] = 0; が抜けてる
0796デフォルトの名無しさん
2007/05/08(火) 17:32:12プロジェクト(P)−>(プロジェクト名) のプロパティ(P)...
−>構成プロパティ−>C/C++−>プリコンパイル済みヘッダー−>プリコンパイル済みヘッダーの作成/使用
を"プリコンパイル済みヘッダーを使用しない"にする
0797デフォルトの名無しさん
2007/05/08(火) 17:37:29char str[256]="/)`A'(/~otagira";
0798デフォルトの名無しさん
2007/05/08(火) 17:39:35ってか、文字列をputsやら書式を%sにしてその引数をchar型のポインタで指定する場合は
文字列の終わりを意味する\0が最後に入っていないとおかしな表示にはなるね。
0800デフォルトの名無しさん
2007/05/08(火) 17:43:03int main(void)
{
char str[256]={'\0'};
char *temp;
fgets(str,sizeof(str),stdin);
if(temp = strchr(str, '\n'))
*temp = '\0';
puts(str);
rstring(str);
puts(str);
return 0;
}
void rstring(char *str)
{
unsigned int l = strlen(str) - 1, i;
char temp;
for(i = 0; i < l/2;i++){
temp =str[i];
str[i] = str[l - i];
str[l - i] =temp;
}
}
0801デフォルトの名無しさん
2007/05/08(火) 17:55:55ってなんか挟まれてつぶれそうな感じだな
0802デフォルトの名無しさん
2007/05/08(火) 18:19:09[2] ポインタを用いた線形リストデータ構造を利用して,
キーボードから順に入力した複数の整数値(int型)を
空の「スタック」および「キュー」にそれぞれ保存し,
取り出した時,出力される整数値を順に表示するプログラムpointlist.c を作成せよ.
また,次のようにして行った動作確認の結果も報告せよ.
動作確認のために入力する整数値は,各自の学籍番号の数字の部分とせよ
また,スタックとキューに保存されているデータがどのような順で出力されるかをそれぞれ表示するようにせよ.
(スタックの場合は「3→2→1→6→0→3」の順で出力され,キューの場合は「3→0→6→1→2→3」の順で表示させ確認せよ)
[3] 環境
[3.1]WindowsXPPro
[3.2] Visual Studio2005
[3.3] どちらでも可
[4] 期限:2007/5/10まで
[5] リスト・スタック・キュー
0803デフォルトの名無しさん
2007/05/08(火) 18:21:38C++ だと STL 使って終わりみたいな題意外の解がきそうだな
0804デフォルトの名無しさん
2007/05/08(火) 18:22:58[3.3] たぶんCのみだと思います。
すみませんでした。
0805デフォルトの名無しさん
2007/05/08(火) 19:03:36http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3954.txt
0806デフォルトの名無しさん
2007/05/08(火) 19:20:05表示は完璧でした。
あと、自分で入力した数値をスタック・キューで表示できればいいんですが。
0807デフォルトの名無しさん
2007/05/08(火) 19:21:03#include <iostream.h>
#include <math.h>
#define func(x) pow(x, 3)
int main()
{
double x1 = 1.0, x2 = 2.0, dx = 0.01, x, sum = 0;
for(x = x1; x < x2; x += dx)
sum += (func(x) + func(x + dx))*dx/2;
std::cout << sum << std::endl;
return 0;
}
誤差が……。
0808デフォルトの名無しさん
2007/05/08(火) 19:24:14#include <stdio.h>
/* 中略 */
int main()
{
Node *que = NULL, *stack = NULL;
int i, num;
for(i = 0; i < 10; i++){
scanf("%d", &num);
que = add_que(que, num);
stack = push(stack, num);
}
/* 以下略 */
0809デフォルトの名無しさん
2007/05/08(火) 19:42:14うーん…ちょっとおかしくなっちゃったかな(汗)
バカな俺ですいません。
0810デフォルトの名無しさん
2007/05/08(火) 20:27:24[2] 問題文(含コード&リンク):
配列要素3のキュー構造を以下の実行結果になるように実現せよ。
実行結果は別に書きます。
[3] 環境
[3.1] OS: WindowsXP
[3.2] コンパイラ名とバージョン: gcc
[3.3] 言語: C
[4] 期限: 5月10日
[5] その他の制限:特になし
よろしくお願いします。
0811デフォルトの名無しさん
2007/05/08(火) 20:28:53EMPTY (入力)
select no[1.in 2.out 3.end] > 1 (入力)
input > a (入力)
select no[1.in 2.out 3.end] > 1 (入力)
input > b (入力)
select no[1.in 2.out 3.end] > 1 (入力)
input > c (入力)
select no[1.in 2.out 3.end] > 1 (入力)
FULL (表示)
select no[1.in 2.out 3.end] > 2 (入力)
output > a (入力)
select no[1.in 2.out 3.end] > 2 (入力)
output > b (入力)
select no[1.in 2.out 3.end] > 2 (入力)
output > c (入力)
select no[1.in 2.out 3.end] > 4 (入力)
again (表示)
select no[1.in 2.out 3.end] > 3 (入力)
good-bye (表示)
0812810
2007/05/08(火) 20:35:19output > a (表示)
output > b (表示)
output > c (表示)
0813デフォルトの名無しさん
2007/05/08(火) 20:48:47int main(void)
{
int queue[3], index = 0;
while(1) {
int n;
printf("select no[1.in 2.out 3.end] > ");
scanf("%d", &n);
if(n==1) {
if(index==3) printf("FULL\n");
else {
char ch;
printf("input > ");
scanf(" %c", &ch);
queue[index++] = ch;
}
}
else if(n==2) {
if(!index) printf("EMPTY\n");
else printf("output > %c\n",queue[--index]);
}
else break;
}
printf("good-bye\n");
return 0;
}
0814デフォルトの名無しさん
2007/05/08(火) 20:51:15ageinとも言ってほしいみたいだぞ。
0815デフォルトの名無しさん
2007/05/08(火) 20:56:03printf("select no[1.in 2.out 3.end] > ");
scanf("%d", &n);
を
while(1) {
printf("select no[1.in 2.out 3.end] > ");
scanf("%d", &n);
if(n==1||n==2||n==3) break;
printf("again\n");
}
に換えといて。
0816デフォルトの名無しさん
2007/05/08(火) 21:06:08前進差分公式で数値微分してみた。
建設的な突っ込み大歓迎
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3955.cpp
0817デフォルトの名無しさん
2007/05/08(火) 21:21:47「建設的な突っ込み」じゃなくてただのチャチャだけど。
・printf()ならずっと出力整形が楽なのに乙だ
・ループでxに0.01ずつ加算していくと誤差が集積していくので、1を加算して
100で割ったほうが良いかも
・そこのうpろだへのリンクは、さすがにh抜かんでも良いと思う
0818デフォルトの名無しさん
2007/05/08(火) 21:28:33#include <stdio.h>
int main(){
int op, count = 0, i = 0, j = 0;
char que[3][2];
while(1){
printf("select no[1.in 2.out 3.end] > "); scanf("%d", &op);
if(op == 1){
if(count == 3)
printf("FULL (表示)\n");
else{
printf("input > "); scanf("%s", &que[j]);
j = (j + 1)%3 == 0 ? 0 : j + 1; count++;
}
}else if(op == 2){
if(count == 0)
printf("EMPTY (入力)\n");
else{
printf("output > %c (入力)\n", que[i][0]);
i = (i + 1)%3 == 0 ? 0 : i + 1; count--;
}
}else if(op == 3) break;
}
return 0;
}
0819デフォルトの名無しさん
2007/05/08(火) 21:44:45FOX★公認!!!
俺たちのクリックで日本を一位にしようぜ!!
“30年は日本に手は出せないな”という勝ち方をしたい
http://wwwww.2ch.net/test/read.cgi/news4vip/1178602852/
1. ポーランド 139,797,680
2. チリ 137,040,439
3. ★日本 86,475,213★
4. イスラエル 80,930,530
5. スロベニア 57,137,042
6. フィンランド 40,857,499
石を投げる戦争から人は進化・進歩を遂げ、剣や槍などの武器をもって戦うようになった
人間はさらに発展し兵器を使う戦争を始めた
そして今、指先一つを武器とした電脳戦争が勃発したのであった・・・
皇国を勝利へと導くには貴様らの参戦が不可欠である
・戦場
http://www.clickclickclick.com/default.asp
・まとめサイト
http://www33.atwiki.jp/clickvip/
0820デフォルトの名無しさん
2007/05/09(水) 03:20:02[2] 問題文(含コード&リンク):http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3957.txt
[3] 環境
[3.1] OS:Windows
[3.2] コンパイラ名とバージョン:VC++ 6.0
[3.3] 言語:C
[4] 期限:2007年5月9日23時まで。
[5] その他の制限:なし。
よろしくお願いします。
0821デフォルトの名無しさん
2007/05/09(水) 06:03:13#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define swap(type, x, y) do{type temp = x; x = y; y = temp;}while(0)
int main(){
FILE *fp = fopen("data.txt", "w");
int num[100], i, j;
// init
for(i = 0; i < sizeof(num)/sizeof(num[0]); i++)
num[i] = i + 1;
srand((unsigned int)time(NULL));
// random
for(i = 0; i < sizeof(num)/sizeof(num[0]); i++){
j = rand()%100;
swap(int, num[i], num[j]);
}
// output
for(i = 0; i < sizeof(num)/sizeof(num[0]) - 1; i++)
fprintf(fp, "%d\n", num[i]);
fclose(fp);
return 0;
}
0822デフォルトの名無しさん
2007/05/09(水) 06:03:48#include <stdio.h>
int main()
{
FILE *fp;
int data, exist, i;
for(i = 1; i <= 100; i++){
exist = 0;
if((fp = fopen("data.txt", "r")) == NULL)
return -1;
while(fscanf(fp, "%d", &data) == 1)
if(data == i)
exist = 1;
fclose(fp);
if(exist == 0)
break;
}
if(exist == 0)
printf("%d does not exist.\n", i);
return 0;
}
0823デフォルトの名無しさん
2007/05/09(水) 06:07:41#include <stdio.h>
int main(){
FILE *fp;
int min, max, mid, count1, count2, data, i;
min = 1;
max = 100;
while(min != max){
mid = (min + max)/2;
count1 = 0;
count2 = 0;
if((fp = fopen("data.txt", "r")) == NULL)
return -1;
while(fscanf(fp, "%d", &data) == 1){
if(min <= data && data <= mid)
count1++;
else if(mid < data && data <= max)
count2++;
}
fclose(fp);
if(count1 > count2)
min = mid + 1;
else
max = mid;
}
printf("%d does not exist.\n", min);
return 0;
}
0824デフォルトの名無しさん
2007/05/09(水) 13:50:47表示するプログラムを作成しなさい。
一次元配列とソートでお願いします。
15分以内にお願いします。
15 64 86 77 97 11 65 45 38
0825デフォルトの名無しさん
2007/05/09(水) 13:59:19ありがとうございます!
0826デフォルトの名無しさん
2007/05/09(水) 14:03:17#include <stdio.h>
#include <stdlib.h>
int comp_int(const int *x, const int *y){ return *x - *y; }
int main()
{
int x[] = {15, 64, 86, 77, 97, 11, 65, 45, 38}, i;
puts("before sort");
for(i = 0; i < sizeof(x)/sizeof(x[0]); i++) printf("%d\n", x[i]);
qsort(x, sizeof(x)/sizeof(x[0]), sizeof(x[0]), (int (*)(const void*, const void*))comp_int);
puts("after sort");
for(i = 0; i < sizeof(x)/sizeof(x[0]); i++) printf("%d\n", x[i]);
return 0;
}
0827デフォルトの名無しさん
2007/05/09(水) 14:25:52実行結果
文字入力==>A
変換後:a
文字入力==>n
変換後:N
文字入力==>S
変換後:変換できない
この文問題わかる方がいましたら教えてください
0828デフォルトの名無しさん
2007/05/09(水) 15:00:47どうして'S'は変換できないの?
0829デフォルトの名無しさん
2007/05/09(水) 15:12:22[2] 問題文(含コード&リンク):
以下の要求を満たす shell を作成せよ。
・コマンドライン入力を受け付けて、実行可能ファイルを実行できる
コマンドサーチパスを持っている方が望ましいが、実行時に full path指定
するのでも構わない
・バックグラウンド実行
・標準入出力・エラー出力のリダイレクション
・パイプによる標準入出力の他プロセスへの接続
作成の上で条件は以下の通りです。
・使ってよいのは基本的にはシステムコールのみ
man で (2)
execve, fork, pipe, dup, read, write, open
・プログラム作成の効率化を考慮して以下の library関数は使うことを認める
exec周り execv
文字列関係 str...
入出力関係 fprintf, fgets
入出力関係は、コマンドライン入力、エラー出力に限る
[3] 環境
[3.1] OS:Linux
[3.2] コンパイラ名とバージョン:gcc 3.6.6
[3.3] 言語: C
[4] 期限: 今月一杯
[5] その他の制限:上のとおり
誰か助けてくださいorz
0830デフォルトの名無しさん
2007/05/09(水) 15:32:58もうちょっと詳しく書かないとわからないよ
0831デフォルトの名無しさん
2007/05/09(水) 15:59:25問1
#include <stdio.h>int count(void);
main()
{
int i;
for (i = 0; i < 10; i++) {
printf("%d\n", count());
}
return 0;
}
int count(void)
{
int c;
return ++c;
}
このプログラムを1 から 10 までの整数が出力されるようにプログラムを変更しなさい。 ただし,変更は関数 count の本体のみとする。
問2
コイン投げをシュミレートするプログラムを書け。引数をもたず、表なら0、裏なら1を返す関数flipを使って、コインを1回投げるたびに”表”か”裏”をプリントすること。また、100回コインを投げて表と裏の出た回数をそれぞれカウントし、その結果もプリントすること。
画面には,表なら Head,裏なら Tail と表示させること。 プログラムを実行する度に,裏・表の出方が変わることが望ましい。 なお,関数 flip は,もちろん,標準ライブラリ関数ではないので, 自分で定義(作成)しなければならない。
[3] 環境
[3.1] OS:WindowsXP [3.2] Terminal emulator(ttermpro)
[3.3] 言語: C言語
[4] 期限: 2007年5月10日17:00までお願いいたします。
必修の授業でプログラミングがあるのですが、毎回課題に苦労しています。
プログラミングを得意になるにはどうしたら良いでしょうか?
0832デフォルトの名無しさん
2007/05/09(水) 16:01:43問1.
- int c;
+ static int c;
0833デフォルトの名無しさん
2007/05/09(水) 16:12:02問2(flip()のみ)
int flip(void)
{
srand(time(NULL));
if (((rand()+1.0)/(RAND_MAX+1.0)) > 0.5)
return 1;
else
return 0;
}
0834デフォルトの名無しさん
2007/05/09(水) 16:18:53#include <stdlib.h>
#include <stdio.h>
int flip(void);
int main(void)
{
int i;
int Tail = 0;
int Head = 0;
for(i = 0; i != 100; i++){
if(flip()){
Tail++;
printf("Tail");
}else{
Head++;
printf("Head");
}
printf("\n");
}
printf("表:%d", Tail);
printf("裏:%d", Head);
return 0;
}
int flip(void){
return rand() % 2;
}
0835デフォルトの名無しさん
2007/05/09(水) 16:28:04#include <stdlib.h>
#include <stdio.h>
#include <time.h>
int flip(void);
int main(void)
{
srand(time(NULL));
int i;
int Tail = 0;
int Head = 0;
for(i = 0; i != 100; i++){
if(flip()){
Tail++;
printf("Tail");
}else{
Head++;
printf("Head");
}
printf("\n");
}
printf("表:%d", Tail);
printf("裏:%d", Head);
return 0;
}
int flip(void){
return rand() % 2;
}
0836デフォルトの名無しさん
2007/05/09(水) 16:35:29rand()は多くの場合、線形合同法によって実装されている
その関係で下位ビットのみを使用する方法(剰余とか)では
非常に質の悪い乱数しか得られない
0838デフォルトの名無しさん
2007/05/09(水) 16:43:08でいいじゃん。
いちいち関数呼び出すたびに乱数初期化すんのもな。
0839デフォルトの名無しさん
2007/05/09(水) 18:57:46#include<stdlib.h>
#include<conio.h>
#include<math.h>
main()
{
float u[4],dv,dt=0.1,s=3.14,a=1,lim=5,r,p;
FILE *file_p;
for(p=0;p<5;p++){
printf("u%dの水位=",p);
scanf("%f\n",&u[p]);
}
file_p=fopen("kadai03.txt","w");
fprintf(file_p,"経過時間 u1の水位 u2の水位 u3の水位 u4の水位 u5の水位\n");
fprintf(file_p,"0.0 %f %f %f %f %f\n",u[0],u[1],u[2],u[3],u[4]);
for(r=dt;r<=lim;r=r+dt){
u[0]=u[0]+a*(-2*u[0]+u[1])*dt/s;
fprintf(file_p,"%f ",u[0],);
for(p=1;p<4;p++){
u[p]=u[p]+a*(u[p-1]-2*u[p]+u[p+1])*dt/s;
fprintf(file_p,"%f ",u[p],);
}
u[4]=u[4]+a*(u[3]-2*u[4])*dt/s;
fprintf(file_p,"%f\n",u[4],);
}
fclose(file_p);
getch();
exit(0);
}
のプログラムが動かないんですけど、どこが悪いのか教えていただけないでしょうか?
0840デフォルトの名無しさん
2007/05/09(水) 19:07:57ここはデバッグするところじゃねーぞ
0841デフォルトの名無しさん
2007/05/09(水) 19:08:39悪いところが多すぎる。勉強し直せ
0842デフォルトの名無しさん
2007/05/09(水) 19:12:57fprintf(file_p,"%f ",u[0],);
最後の , コンマが不要
0843デフォルトの名無しさん
2007/05/09(水) 19:57:47[2] 問題文(含コード&リンク):
引数として与えられた文字列sの先頭から整数値を取り出して返す関数
int string_to_number(char *s, int *p) を作成せよ。正しく数が取り出せた場合、
第二引数のポインタpが指す先に取り出した値をセットしてから、関数の戻り値として
1を返す。数と解釈できない文字列が渡された場合(先頭が符号でも数字でもない時)
関数の戻り値として0を返す。
また以下のmain関数を用いる事
int main(void)
{
char buff[128];
int n, r;
fgets(buff, 128, stdin);
n = 0;
r = string_to_number(buff, &n);
printf("%d %d\n", r, n);
}
要はatoi関数と同じ振る舞いをする関数の作成です。
[3] 環境
[3.1] OS: Linux
[3.2] コンパイラ名とバージョン: gcc
[3.3] 言語: C
[4] 期限: 5月10日
[5] その他の制限: なし
よろしくお願いします
0844691
2007/05/09(水) 19:59:19アドバイスの御陰で、現在電卓製造がほぼ終盤にさしかかってます。
最後一点だけ
・Ctrl+cが入力されたら、エラーメッセージを表示してから終了させる。
この処理だけが、色々検索かけて分からずじまいです。
通常はctrl+cを入れたらプロンプトでは「^C」が表示されて終了なんですが、
今回の場合はCtrl+cが入力されたということをプログラムに認識させて、その後printfで
エラーメッセージ出力なんでしょうが、その認識させる方法がまだ見つかって
ません。
方法についてアドバイス頂けませんでしょうか。
0845デフォルトの名無しさん
2007/05/09(水) 20:18:14#include <ctype.h>
void astring_to_number(char *buff, int *n)
{
int negative = 0, i = 0;
if(buff[i] == '-'){
negative = 1;
i++;
}else if(buff[i] == '+'){
i++;
}
while(isdigit(buff[i]))
*n = 10*(*n) + (buff[i++] - '0');
if(negative)
*n *= -1;
}
0846デフォルトの名無しさん
2007/05/09(水) 20:21:28Ctrl+Cの場合、プログラムにはSIGINTが送られる
これを捕捉してやればできなくはない
0847デフォルトの名無しさん
2007/05/09(水) 20:34:01int string_to_number(char *buff, int *n)
{
int negative = 0, i = 0;
if(buff[i] == '-'){
negative = 1;
i++;
}else if(buff[i] == '+')
i++;
if(!isdigit(buff[i]))
return 0;
while(isdigit(buff[i]))
*n = 10*(*n) + (buff[i++] - '0');
if(negative)
*n *= -1;
return 1;
}
0848699,720
2007/05/09(水) 20:51:02力になれたか自信ないですが、とりあえずおめでとうございます
最後の一点についてですが、自分もわからなかったので、調べながら作ってみました
かなりのやっつけ仕事になっていますが、参考(になるか分かりませんが(^^; )にしつつ
いろいろ調べてみてください。
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
void ctrl_c(int);
int main(void)
{
signal(SIGINT,ctrl_c);
while(1) //永久ループ
;
return(0);
}
void ctrl_c(int sig)
{
if(sig == SIGINT)
perror("CTRL+C\n");
else
perror("???\n");
exit(0);
}
0849デフォルトの名無しさん
2007/05/09(水) 21:30:44�dです。
回答を参考にしたいと思います。
0850デフォルトの名無しさん
2007/05/09(水) 21:57:31[2] 問題文:コマンド行に指定した2つの実数の和を画面に表示するプログラムを作成せよ。
ただし、オプション -mが指定された場合は積を、また、引数付きオプション -f num
など指定された場合には、答えをnum倍した値を表示せよ。
実行結果
$ gcc –o ex1-2 ex1-2.c
$ ./ex1-2 2.0 3.0
answer = 5.0
$ ./ex1-2 -m 2.0 3.0
answer = 6.0
$ ./ex1-2 -mf 5.0 2.0 3.0
answer = 30.0
[3] 環境
[3.1] OS:vine linux
[3.2] コンパイラ名とバージョン: gcc (バージョン不明、すみません)
[3.3] 言語:C言語
[4] 期限: 2007年5月11日14時50分
[5] その他の制限: C言語一通り学習程度
自分でも今奮闘中ですが、お願いいたします。
あと、参考書も何か紹介していただけたらありがたいです。
0851デフォルトの名無しさん
2007/05/09(水) 22:08:080852デフォルトの名無しさん
2007/05/09(水) 22:20:17僕は、編入でプログラムは初めて。
しかし、単位取らないと卒業できないので…
C言語一通り学習程度向けの講義だそうです。
0853デフォルトの名無しさん
2007/05/09(水) 22:28:25オプションの処理が面倒だったから手を抜いた。その実行例は上手く通る
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char *argv[]){
int opt; double arg1, arg2; char flagMult = 0; char flagOpt = 0; double optArg;
while (1){
opt = getopt(argc, argv, "mf:");
if (opt == -1) break;
switch (opt) {
case 'm':
flagMult = 1;
break;
case 'f':
flagOpt = 1;
optArg = atof(optarg);
break;
case '?':
return -1;
default:
fprintf(stderr, "unknown error\n");
return -1;}}
if (argc - optind != 2) {fprintf(stderr, "invalid arguments\n"); return -1; }
arg1 = atof(argv[optind++]); arg2 = atof(argv[optind]);
if (flagMult) arg1 *= arg2;
else arg1 += arg2;
if (flagOpt) arg1 *= optArg;
printf("answer = %f\n", arg1);
return 0;}
0854デフォルトの名無しさん
2007/05/09(水) 23:03:22wchar_t[]で。
0855デフォルトの名無しさん
2007/05/09(水) 23:11:51意味が分からんし、そもそもスレ違い
0856デフォルトの名無しさん
2007/05/09(水) 23:13:00[2] 問題文(含コード&リンク):
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3958.txt
[3] 環境
[3.1] OS: Windows
[3.2] コンパイラ名とバージョン:VC++2005
[3.3] 言語: C++
[4] 期限: 2007/ 5/ 10/ 17:00
[5] お願いします
0857デフォルトの名無しさん
2007/05/09(水) 23:25:11whileを使うのかなってところまでしかわかりません。
それと下記のものをコンパイルしようとすると
「sample21.c(37) : error C2371: 'tohex' :再定義されています。
異なる基本型です。」
と、表示されます。どこか入力ミスでもしてるのでしょうか。
上記2つ、ご教授下さい。よろしくお願いします。
1] 授業単元: プログラミング通論
[2] http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3959.txt
[3] 環境
[3.1] OS:WindowsXP
[3.2] .NET Framework Service Pack 1
[3.3] 言語: C
[4] 期限: 今週金曜18時まで
[5] その他の制限: 特になし
0858デフォルトの名無しさん
2007/05/09(水) 23:45:19for(;d >= 16;d = d/16)push(d);
for(;putchar(hex[d%16]),!stackempty();d = pop());
}
>どこか入力ミスでもしてるのでしょうか。
main関数より先にtohexを定義するよろし。
0859デフォルトの名無しさん
2007/05/10(木) 00:02:36どうもありがとうございました。
おかげでエラー原因もわかり、もとのものでもコンパイル成功しました。
また、858さんに教えていただいたfor文で書き換えることにも成功しました。
本当にありがとです。
0860デフォルトの名無しさん
2007/05/10(木) 00:33:20本当にありがとうございます。
0861デフォルトの名無しさん
2007/05/10(木) 00:47:52[2] 問題文(含コード&リンク):http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3960.txt
[3] 環境
[3.1] OS: Linux
[3.2] コンパイラ名とバージョン: gcc 3.4
[3.3] 言語: Cだと思います
[4] 期限: 2007年5月10日 08:00まで
[5] その他の制限: 問題のとおりです
どうかお力をお貸し下さい。よろしくお願いします。
0862デフォルトの名無しさん
2007/05/10(木) 02:24:01牛乳1パック買っても3パック分(200円)の料金となります。
この牛乳の料金を求める数式っていうのが全くわからない・・・
本当に私事だけど急ぎで知りたいのですが教えていただけませんか??
0863デフォルトの名無しさん
2007/05/10(木) 02:29:010864デフォルトの名無しさん
2007/05/10(木) 02:45:25iteratorがよくわかんなし・・・誰か助けて・・・
#include "stdafx.h"
#include <string.h>
#include <list>
#include <iostream>
class BusJikokuhyou
{
public:
char Busteimei[128];
int hhmm;
};
std::list<BusJikokuhyou> ichijigenlist;
std::list<BusJikokuhyou>::iterator iter;
int index;
void SHOW()
{
std::list<BusJikokuhyou>::iterator betsunolist;
BusJikokuhyou b;
int id = 0;
for(betsunolist = ichijigenlist.begin() ; betsunolist != ichijigenlist.end() ; betsunolist++)
{
b = *betsunolist;
id++;
if ( id == index)//currentに>表示したい・・・
{
printf(">");
}
printf("%s\n" , b.Busteimei);
}
}
0865デフォルトの名無しさん
2007/05/10(木) 02:46:49{
char c[128];
BusJikokuhyou bj;
scanf("%s" , c);
strcpy(bj.Busteimei , c);
printf("dd\n");
bj.hhmm = 30;
ichijigenlist.insert(ichijigenlist.begin() , bj);//currentに入れたい。
}
int _tmain(int argc, _TCHAR* argv[])
{
index = 0;
int bangou = 0;
for(;;)
{
printf("コマンド番号?\n");
printf("0:SHOW 1:INSESRT 2:DELETE 3:NEXT 4:PREVIOUS 5:END \n");
scanf("%d" , &bangou);
if (bangou == 0)
{
printf("SHOW\n");
SHOW();
}
0866デフォルトの名無しさん
2007/05/10(木) 02:48:29{
printf("INSERT\n");
INSERT();
}
else if (bangou == 2){
printf("DELETE\n");
ichijigenlist.erase(iter);
}
else if (bangou == 3){//もうわかんないや・・・
printf("NEXT\n");
if (iter != ichijigenlist.end()) {
index++ ;
iter++;
}
}
else if (bangou == 4) {
printf("PREVIOUS\n");
if (iter != ichijigenlist.begin()) {
index--;
iter--;
}
}
else if (bangou == 5) {
printf("END");
break;
}
}
return 0;
}//もうだめぽ。
0867デフォルトの名無しさん
2007/05/10(木) 05:31:13牛乳3パックで1パックの値段になる特売の場合
牛乳の本数をn、合計金額をamountとすると、
amount = (n / 3 + n % 3) * 200;
1パックから3パックまですべて1パック分の値段の場合は
amount = (n + 2) / 3 * 200;
0868656
2007/05/10(木) 05:36:07[1] 授業単元:情報処理
[2] 問題文(含コード&リンク):
大きさ10の配列に10個の整数値を標準入力から読み込んだ後、配列中に格納された値が昇順になるように配列させなさい。その後、配列中の値の平均値以下の値
の最大値が格納されている配列要素番号を求め、標準出力へ出力しなさい。該当する値が配列中に複数ある場合は、その中で最も大きい要素番号を出力しなさい
[3] 環境
[3.1] OS: Windows
[3.2] コンパイラ名とバージョン: Visual Studio .net2003
[3.3] 言語: C
[4] 期限: 5月10日8時20分
[5] 制限:ポインタはまだ習っていません。
起きている方、どうかお願いします。
0869デフォルトの名無しさん
2007/05/10(木) 11:42:28で、ポインタを利用して入力した数値を
スタックとキューで表示させるプログラムをお願いして、
>>806
のプログラムをやってもらったんですが、
この中のnodeというC言語は習っていないので、
nodeと使わずにするにはどうすればいいのでしょうか?
(int *)malloc(sizeof(int)という形にしたいんです。
よろしくお願いします。
0870デフォルトの名無しさん
2007/05/10(木) 12:55:34お前初めてかCは? 力抜けよ
0871デフォルトの名無しさん
2007/05/10(木) 14:11:59そしてポインタは習ってないのに(int *)malloc(sizeof(int))を使うとな・・・
0872829
2007/05/10(木) 17:31:51という機能は実装できたのですが、その他がさっぱりです。
どなたかお願いします・・・
0873デフォルトの名無しさん
2007/05/10(木) 18:23:12これは「宿題」の規模じゃねぇな・・・
金取る「仕事」のレベルだぞコレ
1年かけたらまぁ作れるレベルでもあるんだろうけどな
0874デフォルトの名無しさん
2007/05/10(木) 18:38:21某入門書のサンプルソース (sh2.c - パイプとリダイレクトのみ実装)
http://www.loveruby.net/ja/linuxprog/
busybox (組込みLinux向けツール群) のソース
http://busybox.net/cgi-bin/viewcvs.cgi/trunk/busybox/shell/
0875デフォルトの名無しさん
2007/05/10(木) 18:44:41http://basepath.com/aup/ex/sh3_8c-source.html
0876デフォルトの名無しさん
2007/05/10(木) 19:41:42マジすか・・・
あと1ヶ月じゃやっぱり無理ですかね・・・
>>874>>875
�dクス!
これ見てもうちょっとだけ頑張ってみます
0877デフォルトの名無しさん
2007/05/10(木) 19:59:48> 1年かけたらまぁ作れるレベルでもあるんだろうけどな
ねーよwwwどんだけ底辺なんだよw
0878デフォルトの名無しさん
2007/05/10(木) 20:30:50来年もがんばれ。
0879デフォルトの名無しさん
2007/05/10(木) 21:06:13もう3年の頃から全くついていけてないorz
0880デフォルトの名無しさん
2007/05/10(木) 21:23:38院生にでもアドバイス貰ったら?
0881810
2007/05/10(木) 21:24:46[2] 問題文(含コード&リンク):
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3963.txt
[3] 環境
[3.1] OS: WindowsXP
[3.2] コンパイラ名とバージョン: gcc
[3.3] 言語: C
[4] 期限: 2007年5月12日
[5] その他の制限: 特になし
よろしくお願いします。
0882デフォルトの名無しさん
2007/05/10(木) 21:55:462] 問題文(含コード&リンク):
二次の連立方程式 ・ax + cy = e ・bx + dy = f についてa,b,c,d,e,fを入力するとx,yの値を計算して表示するプログ ラムを書け。ただし、行列式の値によって解が不定なることも考慮して 設計せよ。
[3] 環境
[3.1] OS: MacOSX
[3.2] コンパイラ名とバージョン: gcc
[3.3] 言語: C
[4] 期限: 2007年5月13日までにお願いします。
0883デフォルトの名無しさん
2007/05/11(金) 00:34:19クラメールの法則を使った。入力は整数のみだが、x、yの値が小数になる時には
分数で表示するようにしてある。無意味な機能を付けて複雑になったからバグが有るかもね。
所で、int型の絶対値を取る簡単な方法は無いですか?(unsigned)を使ったけど
ダメだったので(int)fabs((double)datA2)とかやって無理やり絶対値を取った。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3964.c
0884デフォルトの名無しさん
2007/05/11(金) 00:43:52[2] 問題文(含コード&リンク):
少数を文字列に書き換える関数を書け。
int floatToString(char string[],double f,int intf,int fd)
返す値はintでカンマ、−サインを抜かした文字列の数。
小数点の範囲はfdで指定される。使えるライブラリは<iostream>のみ。
[3] 環境
[3.1] OS: winxp
[3.2] コンパイラ名とバージョン: VisualStudio
[3.3] 言語: C++
[4] 期限: 2007年5月11日 夕方
0885883
2007/05/11(金) 00:56:16×クラメールの法則
○クラメールの公式
俺自体がバグってるよ。
あと、変数の宣言のあとに以下の文を入れた方が親切だったな。
printf("ax+cy=e\nbx+dy=f");
0886デフォルトの名無しさん
2007/05/11(金) 01:11:45簡単ってどの程度のことを言ってるの分からんけど、
fabs使うんなら普通にabs使えばいいんでないか。
libm も要らんしな。
0887デフォルトの名無しさん
2007/05/11(金) 01:26:17ふつうの取り方じゃ駄目なんだろw
/*絶対値を返す*/
int myAbs(int in){
return ((in >> 30) | 1) * in;
}
0888デフォルトの名無しさん
2007/05/11(金) 01:43:19[2] 問題文(含コード&リンク):サイコロを1200回振ったとき、1〜6の目が出る回数を求め
表示するプログラムを作成しなさい。サイコロの目は乱数を
使って求めなさい。
[3] 環境
[3.1] OS:Windows
[3.2] コンパイラ名とバージョン:vc2005
[3.3] 言語:C++
[4] 期限:今日の正午までにお願いします。
[5] その他の制限: 関数を使ってください。
表示結果
乱数を初期化する数値を入力=> 547
x[1]=220
x[2]=195
x[3]=213
x[4]=178
x[5]=187
x[6]=207
お願いします。
0889デフォルトの名無しさん
2007/05/11(金) 02:30:52[1] 授業単元:プログラミング
[2] 問題文(含コード&リンク):フィボナッチ数列(ai+2=ai+1 + ai, a1=1,a2=1)の30項までの値を計算して一次元配列の
各要素に格納し逆順に画面に表示せよ。
[3] 環境
[3.1] OS: Windows
[3.2] コンパイラ名とバージョン:VC++6.0
[3.3] 言語:C
[4] 期限:月曜までにできればお願いします。
[5] その他の制限: for文と配列で。
表示結果
a[30]=832040
a[29]=514229
…
a[1]=1
お願いします。
0890デフォルトの名無しさん
2007/05/11(金) 03:02:45#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
class Dice{
int num; int side;
public:
Dice(){Init(6, (unsigned)time(NULL));}
Dice(int s, unsigned int n){Init(s, n);}
void Init(int s, int n){ num = 0; side = s; srand(n);}
int Roll(){ return num = (rand() >> 16) % side + 1;}
int GetValue(){ return num;}
int GetSide(){return side;}};
int main(void){
const int RNUM = 1200, SIDE = 6; int n, x[6] = {0};
cout << "乱数を初期化する数値を入力=> ";
cin >> n;
Dice d6(6, n);
for(int i=0; i!=RNUM; i++){
x[d6.Roll()-1] += 1;}
for(int i=0; i!=SIDE; i++){
cout << "x[" << i+1 << "] = " << x[i] << endl;}
return 0;}
0891デフォルトの名無しさん
2007/05/11(金) 03:11:55#include <stdio.h>
#define MAX 30
int main(void) {
int a[MAX],i;
a[0]=1; a[1]=1;
for(i=2; i<30; i++)
a[i]=a[i-2]+a[i-1];
for(i=MAX-1; i>=0; i--)
printf("a[%d]=%d \n",i+1,a[i]);
return 0;
}
0892デフォルトの名無しさん
2007/05/11(金) 04:03:36889です。大変早急にレスして頂いて本当にありがとうございました。
0893デフォルトの名無しさん
2007/05/11(金) 04:27:15[2] 問題文(含コード&リンク):入力テキストファイルを解析する問題を考える、
テキスト行には、T1、T2、T3という3つの型があり、それぞれのテキスト行の1文字目には
1,2,3と書いてあるものとする。このとき、次のような解析を行うプログラムを作成せよ。
・最初のT1行の前にある行の数を数える(これをカウントAと呼ぶ)
・最初のT1行を表示する
・最初のT1行の後に来るバッチ(1枚以上の連続したT1行の列または1枚以上の連続したT3行の列)
の数を数える(これをカウントBと呼ぶ)
・最初のT1行の後に来るT3行からなるバッチの数を数える(これをカウントDと呼ぶ)
・最後の行を表示する(この行は必ず最初のT1行の後に来る最初のT2行でなければならないと仮定する)
・最後の行の表示直後にカウントABCDを表示する
[3] 環境
[3.1] OS: WindowsXP
[3.2] VC
[3.3] 言語: C
[4] 期限: 5月13日
[5] その他の制限:申し訳ありませんができれば構造化設計言語でも作成をお願いします
0894デフォルトの名無しさん
2007/05/11(金) 04:37:14Cってなによ?
0895デフォルトの名無しさん
2007/05/11(金) 04:44:510896デフォルトの名無しさん
2007/05/11(金) 04:47:100897デフォルトの名無しさん
2007/05/11(金) 04:53:31[2] 問題文(含コード&リンク):入力テキストファイルを解析する問題を考える、
テキスト行には、T1、T2、T3という3つの型があり、それぞれのテキスト行の1文字目には
1,2,3と書いてあるものとする。このとき、次のような解析を行うプログラムを作成せよ。
・最初のT1行の前にある行の数を数える(これをカウントAと呼ぶ)
・最初のT1行を表示する
・最初のT1行の後に来るバッチ(1枚以上の連続したT1行の列または1枚以上の連続したT3行の列)
の数を数える(これをカウントBと呼ぶ)
・最初のT1行の後に来るT1行の総数を数える(これをカウントCと呼ぶ)←ここ抜けてました
・最初のT1行の後に来るT3行からなるバッチの数を数える(これをカウントDと呼ぶ)
・最後の行を表示する(この行は必ず最初のT1行の後に来る最初のT2行でなければならないと仮定する)
・最後の行の表示直後にカウントABCDを表示する
本当にすいません
0898デフォルトの名無しさん
2007/05/11(金) 08:46:24こんな感じ?
#include <stdio.h>
int main(void)
{
int ch, flag, A = 0, B = 0, C = 0, D = 0;
FILE *fp;
if((fp=fopen("input.txt", "r"))==NULL) return 1;
while((ch=fgetc(fp))!='1') {
while((ch=fgetc(fp))!='\n');
A++;
}
putchar(ch);
while(ch!='\n') putchar(ch=fgetc(fp));
flag = 0;
while((ch=fgetc(fp))!='2') {
if(ch=='3') {
if(flag == 1) B++;
flag = 3;
} else {
C++;
if(flag == 3) { B++; D++; }
flag = 1;
}
while((ch=fgetc(fp))!='\n');
}
if(flag==1 || flag==3) B++;
putchar(ch);
while(ch!='\n') putchar(ch=fgetc(fp));
printf("A = %d, B = %d, C = %d, D = %d\n", A, B, C, D);
return 0;
}
0899C言語
2007/05/11(金) 11:57:43FDの中のデータは会員IDのみになっていて、1001がはいっています。PCのdatファイルには会員ID、名前、生年月日、住所の順に
1001 田中 19840908 千葉県
1002 高橋 19841203 埼玉県
1003 吉田 19840405 山形県
1004 佐藤 19841112 沖縄県
がはいっています。この二つを照らし合わせて1001のIDの田中の名前だけを表示させたいというプログラムです。空白はタブです。やさしいかたお願いします。
0900デフォルトの名無しさん
2007/05/11(金) 12:22:01>1
つーか、向こうで相手にされなかったんだからいい加減諦めたら?
0901デフォルトの名無しさん
2007/05/11(金) 12:25:17grep `cat FD` PCのdatファイル |awk '{print $2;}'
0902デフォルトの名無しさん
2007/05/11(金) 13:30:44#include<stdio.h>
int main(void){
puts("田中");
return 0;
}
0903デフォルトの名無しさん
2007/05/11(金) 14:28:23その内容なら、Cよりperlとかのほうが良いのではないか?w
0905デフォルトの名無しさん
2007/05/11(金) 16:12:21俺は >890 じゃねーけど、バグ取ってみた。
>>890 の、クラス内のRoll()を以下のように変えれば動くね。
int Roll(){ num = (rand() % side) + 1; return num; }
個人的には、SIDEを定義してるんだから、
宣言やd6の初期値にも渡せば良いような気がするけど。
まぁどうでもいいか。
0906デフォルトの名無しさん
2007/05/11(金) 16:17:25>890試してみたけどちゃんと表示されるよ。
「表示されない」を詳しく。
0907デフォルトの名無しさん
2007/05/11(金) 16:20:250908デフォルトの名無しさん
2007/05/11(金) 19:29:440909デフォルトの名無しさん
2007/05/11(金) 19:34:44http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3965.txt
fd.datの中身(4桁の数字のみ、改行なしでもおk)
1001
pc.datの中身(値同士の区切りはTABかスペースでおk)
1001 田中 19840908 千葉県
1002 高橋 19841203 埼玉県
1003 吉田 19840405 山形県
1004 佐藤 19841112 沖縄県
0910デフォルトの名無しさん
2007/05/11(金) 19:35:02[2] 問題文:
ポインタを用いた線形リストデータ構造を利用して、キーボードから順に入力した複数の整数値を空のスタックおよびキューにそれぞれ保存し,
取り出した時,出力される整数値を順に表示するプログラムを作成せよ。
例えば1,2,3と入力した時、スタックの場合は「3,2,1」、キューの場合は「1,2,3」と表示するようにせよ。
[3] 環境
[3.1] OS:Windows
[3.2] コンパイラ名とバージョン:cygwin
[3.3] 言語:C
[4]日曜日まで
[5] ifやforといった基本的なこと。ポインタは少し。
今年からアルゴリズムを習い始めました。
スタックやキューの違いは理解できているのですがそれらをどうプログラムに直すかがわかりません。
よろしくお願いします。
ソースのほうに適宜、コメント等付け加えてもらえると有り難いです。
0911デフォルトの名無しさん
2007/05/11(金) 19:36:520912デフォルトの名無しさん
2007/05/11(金) 20:01:26#include <stdio.h>
#include <stdlib.h>
/* 線形リスト用ノード */
struct node {
int data; /* データ */
struct node *next; /* 次のノード */
};
typedef struct node Node;
int main(void)
{
int tmp;
Node *stack = NULL; /* 空のスタック */
Node *queue = NULL; /* 空のキュー */
Node *pTmp, *pTmp2; /* 作業用 */
while (1)
{
if (scanf("%d", &tmp) != 1) /* 入力無ければ終了 */
break;
/* こっからスタックへプッシュ */
pTmp = (Node*)malloc(sizeof(Node)); /* 新しいノードを確保 */
pTmp->data = tmp; /* データ保存 */
pTmp->next = stack; /* 先頭に追加 */
stack = pTmp;
0913デフォルトの名無しさん
2007/05/11(金) 20:01:58/* キューへエンキュー */
pTmp = (Node*)malloc(sizeof(Node)); /* ここはスタックと一緒 */
pTmp->data = tmp;
if (!queue) /* キューが空なら追加して次へ */
{
queue = pTmp;
continue;
}
pTmp2 = queue; /* 先頭から */
while (pTmp2 && pTmp2->next) /* 末尾まで移動 */
pTmp2 = pTmp2->next;
pTmp2->next = pTmp; /* 末尾に追加 */
}
/* ここから表示 */
/* まずはスタック */
puts("stack:");
while (stack)
{
printf("%d ", stack->data);
/* ポップ */
pTmp = stack; /* 先頭を削除 */
stack = stack->next;
free(pTmp);
}
0914デフォルトの名無しさん
2007/05/11(金) 20:02:52/* ここからキュー */
puts("\nQueue:");
while (queue)
{
printf("%d ", queue->data);
/* デキュー */
pTmp = queue; /* スタックと一緒 */
queue = queue->next;
free(pTmp);
}
putchar('\n');
return 0;
}
エラー処理はしてないから勝手に追加してくれ
0915デフォルトの名無しさん
2007/05/11(金) 21:38:30[2] 問題文(含コード&リンク): http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3966.txt
[3] 環境
[3.1] OS: UNIX
[3.2] コンパイラ名とバージョン: cc
[3.3] 言語: C
[4] 期限: 5月13日
[5] その他の制限: 特になし
最小2乗法を用いて、データ点に対する近似多項式を求める問題
なのですが、上記のプログラムを実行するとセグメントエラーを
起こしてしまいます。何度も見直しましたが解決できませんでした。
間違っている部分を指摘していただけると助かります。
よろしくお願いします。
0916デフォルトの名無しさん
2007/05/11(金) 21:43:22CodeGuardをONにして走らせると下のような実行エラーが延々と出る。
Error 00001. 0x130700 (スレッド 0x08B8):
アクセス オーバーラン: アドレス 0x0013FF30+80 から 8 バイトを参照しました。
これは 80 バイトの長さしか確保されていない ローカルブロック
0x0013FF30(=[ebp-0x5C] @saisyou1.exe:0x01:000908)のオフセット 0+80
に当たります。
| saisyou1.c line 54:
| Y += bb[i]*pow(X,i);
| }
|> fprintf(saisyou1,"%f %f\n",X,Y);
| }
|
呼び出し履歴:
0x004013CE(=saisyou1.exe:0x01:0003CE) saisyou1.c#54
0x00401908(=saisyou1.exe:0x01:000908) saisyou1.c#116
0x32778E3E(=CC3270MT.DLL:0x01:077E3E)
0917デフォルトの名無しさん
2007/05/11(金) 21:44:28恐らく49行目のこのforループが怪しい。
forループは実数で回さず、整数で回して、ループ内でXの値を
計算で求めるようにするとよい。
> for(X=x[0]-1.0; X<x[S]+1.0; X+=0.1)
0918デフォルトの名無しさん
2007/05/11(金) 21:46:18・・・と思ったが、これがおかしいね。
x[S]
S=10で、xは[0..9]までしか確保されてないのだから、x[10]を
アクセスしようとしてエラーが出るのか。
0919デフォルトの名無しさん
2007/05/11(金) 21:49:440920デフォルトの名無しさん
2007/05/11(金) 21:52:49この文でSが10だとまずいだろ。9までだぞ。
0921デフォルトの名無しさん
2007/05/11(金) 22:00:35for(X=x[0]-1.0; X<x[S-1]+1.0; X+=0.1)
でいいんじゃね?>>915
0922デフォルトの名無しさん
2007/05/11(金) 22:19:48早速の回答ありがとうございました。
指摘されている通り、for文での X < x[S]+1.0 がまずかったみたいです。
[S]を[S-1]にすることで正しく実行できるようになりました。
何度も見直したはずなのに、こんなところで凡ミスをしていたなんて・・・orz
0923デフォルトの名無しさん
2007/05/11(金) 22:22:13ありがとうございます。
多分こんな感じでいいんだと思います。
0924デフォルトの名無しさん
2007/05/11(金) 23:03:49[2] 問題文(含コード&リンク)
コインの種類C[0]からC[k-1],与えられた金額mに対して、コインの数を最小にするmの払い方を求めるプログラムを書け。
[4]提出期限 5月28日月
よろしくお願いします。
0925デフォルトの名無しさん
2007/05/11(金) 23:41:14[2] 問題文(含コード&リンク):
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3967.txt
[3] 環境
[3.1] OS: (Windows/Linux/等々) Windows XP
[3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等) Microsoft .NET Framework SDK
[3.3] 言語: (C/C++/どちらでも可 のいずれか) C言語
[4] 期限: ([yyyy年mm月dd日hh:mmまで] または [無期限] のいずれか) 5月12日午後2時ごろまで
[5] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々)
大学生なので制限はほぼないのですが、例示されている箇所はなるべくそのままでお願いします
1〜4、5と6は一つのプログラムにまとめる感じだと思います
それと問題文には書いてないのですが、任意の整数(struct bignum)に対する
足し算・引き算・かけ算、割り算をする関数も作っていただけると幸いです
よろしくお願いします。
0926デフォルトの名無しさん
2007/05/12(土) 00:05:02「コインの種類」って何か決まっているんじゃないの?
たとえば日本の通貨でいうとC[0] = 1、C[1] = 5、C[2] = 10 とか。(kは6未満)
勝手に決めていいものじゃないだろ。
そのへんを詳しく。
0927デフォルトの名無しさん
2007/05/12(土) 00:05:410928デフォルトの名無しさん
2007/05/12(土) 00:06:56このスレで既に回答されてる
0929デフォルトの名無しさん
2007/05/12(土) 00:39:170930デフォルトの名無しさん
2007/05/12(土) 01:47:30http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3968.c
問題文のみ
0931デフォルトの名無しさん
2007/05/12(土) 03:32:05[2] 問題文(含コード&リンク):
int型変数xとyがある。一時変数を使わずに演算のみでxとyの値を入れ替えよ。
[3] 環境
[3.1] OS:Windows
[3.2] コンパイラ名とバージョン:VC ExpressEdition 2005
[3.3] 言語: どちらでも
[4] 期限:無期限
[5] その他の制限: 一行でやれとのことです
宜しくお願いします。
0932デフォルトの名無しさん
2007/05/12(土) 03:43:38x = x - (y = (x = x + y) - y);
0933デフォルトの名無しさん
2007/05/12(土) 03:46:20x ^= y;
y ^= x;
x ^= y;
これでテンポラリ無しでの交換は出来るが一行って制限が意味不明だな
x ^= y ^= x ^= y;とすりゃ一行にはなるし、一応動くが
直前の副作用完了点から次の副作用完了点までの間で同一変数への
書き込みを2度も行ってるからまともに動かない処理系があっても文句は言えん
次善策としてこれでもいいが見辛くなるだけ
x ^= y, y ^= x, x^= y;
結論としては一行なんて意味の無い制限を課した教官がアホ
0934925
2007/05/12(土) 03:51:47素早い回答ありがとうございます。
ですが、コンパイラが古いためかsnprintfが使えないみたいです
なので、自分でも考えていたプログラムの方と混ぜてみたのですが、
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3969.txt
これでコンパイルして実行してみたのですが、
どんな値を入れてもx=0、y=0、x+y=0となってしまいます。
printの所を自分で考えた
void print(struct bignum b){
int i;
if(b.sign==0) printf("NAN");
else{
int h;
i = 0;
for(h=0;h<b.p+1;h++){
i = i + b.str[h] * 10^h;
}
if(b.sign==-1){
i = i * (-1);
}
}
}
にすると今度は数字が表示されなくなってしまいました。
恐らく無理矢理混ぜたことでおかしくなってるんだと思いますが、
原因が自分には分からないのでよろしくお願いします
0935デフォルトの名無しさん
2007/05/12(土) 04:04:59x ^=(y ^=(x ^= y))
0936デフォルトの名無しさん
2007/05/12(土) 04:05:14これイイ
0937デフォルトの名無しさん
2007/05/12(土) 04:15:20ある。()を付けたところで副作用完了点になる訳じゃないから意味がない
疑問に思うならlintに掛けてみるといい。警告が出されるはずだから
0938925
2007/05/12(土) 04:15:306の方(1〜3+5+6)も1〜3を>>934のようにしてコンパイルし実行してみたところ、
同様に2の100乗は0、fib(100)は0と出力されました
お答えいただいたプログラムのまま6の方をコンパイルした場合も、
error LNK2019:未解決の外部シンボル _snprintfが関数_tobignumで参照されました。
faal error LNK1120:外部参照1が未解決です。
と出てコンパイルできません。
注釈をつけやすい方がいいので、お手数ですが
>>934のプログラムのおかしい箇所を直していく方向でお願いします
0939デフォルトの名無しさん
2007/05/12(土) 04:21:31おおお
ありがとうございます。
本来の課題にオマケとして付いてきた感じの課題で、「興味がある奴は考えてみると基礎的な部分の理解に繋がる」とか
そんなことを言われて、サッパリ分からずに質問したのです。
今ノートに書きつつ手で計算してビックリしました。
ありがとうございます。
0940デフォルトの名無しさん
2007/05/12(土) 08:09:13実際には、全く使えない技術だけどね。
0941デフォルトの名無しさん
2007/05/12(土) 11:09:54[2] 問題文(含コード&リンク):
以下の電流と電圧をy=a+bの一次関数であらわすとき、
定数a、bを下記の公式から求めてyを求めるプログラムを作れ。
電圧 x 20.1 39.8 60.1 79.8 100.1 120.1 138.9
電流 y 19.1 28.6 35.2 42.1 48.9 53.3 60.2
a=n*Σxi * yi - Σxi * Σyi/ nΣ xi^{2} - (Σxi)^{2}
b=1/n (Σyi - aΣxi )
[3] 環境
[3.1] OS:Windows
[3.2] コンパイラ名とバージョン:特になし
[3.3] 言語: C++
[4] 期限:無期限:5月21
[5] その他の制限:
宜しくお願いします
0942デフォルトの名無しさん
2007/05/12(土) 12:03:15[2] 問題文(含コード&リンク):
X時0分0秒からの一時間を考える。Xを読み込んで、
時計の短針と長針が重なる時刻を○時×分△秒で表示する
プログラムを作成せよ。ただし、秒数の表示においては秒よりも
一つ下位の桁を四捨五入によって丸めること。
[実行例]何時台ですか?3
短針と長針が重なるのは3時16分22秒です。
[3] 環境
[3.1] OS: Linux
[3.2] コンパイラ名とバージョン:特になし
[3.3] 言語: C++
[4] 期限: 5月14日
[5] その他の制限: 特になし
期限が短くて申し訳ないんですがお願いします。
0943デフォルトの名無しさん
2007/05/12(土) 13:43:43[2] 問題文(含コード&リンク):
2つの文字列の比較を行う関数を配列とポインタを用いて作成せよ。
また文字列が同じであれば1を、異なれば0を出力しなさい。
<実行例>
文字列�@:English
文字列�A:England
結果:0
[3] 環境
[3.1] OS: Windows
[3.2] コンパイラ名とバージョン:特になし
[3.3] 言語: C
[4] 期限: 5月13日
[5] その他の制限: 特になし
0944943
2007/05/12(土) 13:44:460945デフォルトの名無しさん
2007/05/12(土) 13:46:54#include <stdio.h>
int main(void){
int hour, minute, second;
long msec;
printf("何時台ですか?");
scanf("%d",&hour);
if(hour<0) return 1;
msec=(hour%12)*60*60*1000/11.0;
second=(msec+500)/1000;
minute=second/60;
second%=60;
if(minute<60) printf("短針と長針が重なるのは%d時%d分%d秒です。\n", hour, minute, second);
else printf("短針と長針は重なりません。\n");
return 0;
}
0946945
2007/05/12(土) 13:53:31#include <iostream>
int main(void){
int hour, minute, second;
long msec;
std::cout << "何時台ですか?";
std::cin >> hour;
if(hour<0) return 1;
msec=(hour%12)*60*60*1000/11;
second=(msec+500)/1000;
minute=second/60;
second%=60;
if(minute<60) std::cout << "短針と長針が重なるのは" << hour << "時" << minute << "分" << second << "秒です。" << std::endl;
else std::cout << "短針と長針は重なりません。" << std::endl;
return 0;
}
0947デフォルトの名無しさん
2007/05/12(土) 13:59:17#include<stdio.h>
int my_strcmp(char *a, char *b){
for(;*a!='\0';a++,b++)
if(*a!=*b) return 0;
return 1;
}
int main(void){
char str1[]="English", str2[]="England";
printf("文字列�@:%s\n", str1);
printf("文字列�A:%s\n", str2);
printf("結果:%d\n", my_strcmp(str1, str2));
return 0;
}
0948デフォルトの名無しさん
2007/05/12(土) 14:06:05もしかして一つずつってこういう意味?
int my_strcmp(char a[], char *b){
int i;
for(i=0;a[i]!='\0';i++)
if(a[i]!=*(b+i)) return 0;
return 1;
}
0949943
2007/05/12(土) 14:13:25ありがとうございます。
文字列のEnglishと、Englandですが、実行例なので、数字や漢数字、半角英数も含めた任意の文字列の場合は、どうしたらいいでしょうか?
>>947
関数を2つ作ってそれぞれ別のファイルで1つずつ使用する問題です。
(配列を利用した関数とポインタを利用した関数の2つ)
0950デフォルトの名無しさん
2007/05/12(土) 14:21:17スマン >>947 >>948 はバグってた
int my_strcmp(char *a, char *b){
for(;*a!='\0';a++,b++)
if(*a!=*b) return 0;
return (*a==*b);
}
int my_strcmp(char a[], char b[]){
int i;
for(;a[i]!='\0';i++)
if(a[i]!=b[i]) return 0;
return (a[i]==b[i]);
}
0951デフォルトの名無しさん
2007/05/12(土) 14:22:29for(;a[i]!='\0';i++)
↓
for(i=0;a[i]!='\0';i++)
0952デフォルトの名無しさん
2007/05/12(土) 14:30:56それとも、演算子を換えただけで配列と言い張るのか?
だとしたら、>943の出題者はとんでもないな。
0953デフォルトの名無しさん
2007/05/12(土) 14:31:19[1] 授業単元:C言語演習
[2] 問題文(含コード&リンク):int a[10] = {1,1,2,2,3,3,3,4,5,0};
上記の配列をポインタを使って書き換えよ。
int a[]={1,-2,2,-2,3,-3,4,5,0};
数字が続いた場合その個数をマイナスにした値を隣に格納する。
配列に0があるまでこの操作を繰り返す。
[3] 環境
[3.1] OS: WindowsXP
[3.2] コンパイラ名とバージョン:VC 6.0
[3.3] 言語:C
[4] 期限:[2007年05月14日まで
[5] その他の制限:特になし
よろしくお願いします。
0954デフォルトの名無しさん
2007/05/12(土) 14:47:38#include<stdio.h>
int main(void){
int a[] = {1,1,2,2,3,3,3,4,5,0};
int i, prev_num=0, count=0;
int *check, *record;
printf("int a[]={");
for(i=0;a[i]!=0;i++) printf("%d,", a[i]);
printf("0};\n");
for(check=record=&a[0];*check!=0;check++){
if(*check==prev_num){
count++;
}else{
if(count>1) *record++=-count;
*record++=*check;
count=1;
}
prev_num=*check;
}
if(count>1) *record++=-count;
*record=0;
printf("int a[]={");
for(i=0;a[i]!=0;i++) printf("%d,", a[i]);
printf("0};\n");
return 0;
}
0955699,720
2007/05/12(土) 15:32:16本人じゃないですが気になったので。
単に[]と*の二つの演算子の扱いを確認するための問題なんじゃないかなと思います。
問題文の時点で変な気がしますけど、そうじゃないとますます変な問題になりそうな・・・。
自分が未熟なだけかもしれませんが・・・。
0956デフォルトの名無しさん
2007/05/12(土) 15:32:32公式が間違ってないか?
括弧とかきちんと書かないと計算結果が変になるぞ
(故意に計算間違いをする会計システムじゃあるまいし)
その公式でいいというのなら別だが…
0957デフォルトの名無しさん
2007/05/12(土) 15:50:48#include<stdio.h>
int main(void){
double x[]={20.1,39.8,60.1,79.8,100.1,120.1,138.9};
double y[]={19.1,28.6,35.2,42.1,48.9,53.3,60.2};
double xy_sum=0.0, xx_sum=0.0, x_sum=0.0, y_sum=0.0;
double a, b;
const int n=sizeof(x)/sizeof(x[0]);
int i;
for(i=0;i<n;i++)
{
xy_sum+=x[i]*y[i];
xx_sum+=x[i]*x[i];
x_sum+=x[i];
y_sum+=y[i];
}
a=(n*xy_sum-x_sum*y_sum)/(n*xx_sum-x_sum*x_sum);
b=1.0/n*(y_sum-a*x_sum);
printf("a=%f b=%f\n", a, b);
return 0;
}
0958デフォルトの名無しさん
2007/05/12(土) 15:55:57ありがとうございました!
0959デフォルトの名無しさん
2007/05/12(土) 16:19:05すみません。
y=ax+bの一次関数でa、bを求めてからy=ax+bの式に入れて表示するプログラムです。
a、bの式はこれであってます。
0960デフォルトの名無しさん
2007/05/12(土) 17:02:20エレガントな方法が思いつかなかった
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3970.c
0961デフォルトの名無しさん
2007/05/12(土) 17:12:52x1, x2, x3 の内容は?
0962デフォルトの名無しさん
2007/05/12(土) 23:14:18[2] 問題文(含コード&リンク)ある基数の数値を10進数に変換するプログラムを作れ。
[3] 環境
[3.1] OS: (Windows/Linux/等々) winxp
[3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等) :MS VC++を使ってます。
[3.3] 言語: (C/C++/どちらでも可 のいずれか) :C++
[4] 期限: ([yyyy年mm月dd日hh:mmまで] または [無期限] のいずれか):2007/5/23まで
[5] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々)
ループは使っちゃいけないけど、あとでループにできるように組め
include <iostream> 以外は習ってないので使っちゃいけない
32進数まで変換できればよい
以上です。
よろしくお願いします。
0963デフォルトの名無しさん
2007/05/12(土) 23:21:51追記です
const int aaCharToInt[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0,
0,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,
25,26,27,28,29,29,30,31,32,33,34,35, 0, 0, 0, 0,
0,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,
25,26,27,28,29,30,31,32,33,34,35,35, 0, 0, 0, 0, };
を使いなさい
を忘れてた
すみません
} ;
0964デフォルトの名無しさん
2007/05/12(土) 23:55:08とりあえず、変換を関数にしてみた。
int n2dec(int n, char *p) {
int ret = 0, flag = 1;
if(*p=='-') flag = -1;
while(*p) {
int temp = aaCharToInt[*p];
ret = ret * n + temp;
p++;
}
return ret * flag;
}
範囲チェックとかは面倒だから割愛
0965デフォルトの名無しさん
2007/05/13(日) 00:14:15>>934
10^hは10のh乗じゃ無くて10とhのxor
頭に#include <stdlib.h>を追加して、
struct bignum tobignum(int x){
struct bignum b;
int i;
ldiv_t r;
b.p=1;
b.sign=x<0?-1:1;
for(i=0;i<LIMIT;++i){
r=ldiv(x,10);
x=r.quot;
b.str[i]=r.rem*b.sign;
if(x) b.p++;
}
if(x) b.sign=0;
return b;
}
0966デフォルトの名無しさん
2007/05/13(日) 01:30:20[2] 問題文(含コード&リンク):
実数型のfloatとdoubleの変数を1つずつ宣言しなさい。どちらの変数も0で初期化してから,それぞれ0.01を1万回加えてその結果を比較しなさい。floatとdoubleで計算結果に差が出るとしたら,その理由を述べなさい。
《ヒント》浮動小数点数演算での定数を定義してあるヘッダファイル<float.h>を調べると,floatやdoubleで表現できる最小数が分かります。
[3] 環境
[3.1] OS: Windows
[3.2] コンパイラ名とバージョン: MS VS
[3.3] 言語: C
[4] 期限: 明日メール添付にて提出
[5] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々)
制限は特にありません
よろしくお願いします
0967デフォルトの名無しさん
2007/05/13(日) 01:40:24int main(void)
{
int i;
float fl = 0.0;
double dbl = 0.0;
for (i=0; i<10000; ++i)
{
fl += 0.01;
dbl += 0.01;
}
printf("float: %f\ndouble: %f\n", fl, dbl);
return 0;
}
0968デフォルトの名無しさん
2007/05/13(日) 01:49:19floatとdoubleで実行結果に差が出るのはなぜなんでしょうか?
0969デフォルトの名無しさん
2007/05/13(日) 01:58:25小数点以下の精度の問題じゃね?0.01を2進数でどう表せる?考えてみ。
double型の方がfloat型より精度が高い。その精度の差が誤差として出てしまっている。
0970デフォルトの名無しさん
2007/05/13(日) 02:08:55浮動小数ってのは簡単に言うと
○.○○×△^□
という形で数値を表す方法
んで、○の部分は桁数が、△は数値がそれぞれ固定、□にも上限下限がある
だから例えば○部分が3桁の場合
1.01*10^2になってる時に0.01を足しても影響が無くなる(つまり演算結果がおかしくなる)けど
もし、○が6桁だったとしたら
1.01000*10^2 + 0.01 = 1.01010*10^2という風にちゃんと表すことができる
これがdoubleとfloatで結果がずれる理由
#まぁ実際にはこんなに精度悪くはないんだけどな
#その辺はヘッダ参照の事
0971デフォルトの名無しさん
2007/05/13(日) 02:58:37課題を見かけたけど、そんときゃ確かif文の中に指定した値に足していった値が一致しなくて
if文の条件にある計算がされなかったという結果が出てたな。
要するに近似値が使われていると。小数点以下の精度が低くなればなるほど、その近似値にも
差が出るわけで。まぁ、最終的には小数点以下を2進数で表現したらどうなるか?そこにいきつくかと。
0972デフォルトの名無しさん
2007/05/13(日) 03:02:23doubleだったかfloatだったかをループ変数にしてた奴だな
あれは余程の理由があって、またそれによる副作用(C的な意味じゃなくて普通の意味な)が
ちゃんと分かってる時以外は御法度だな
0973デフォルトの名無しさん
2007/05/13(日) 03:08:44ふと考えたらどうすればいいのかわからなくなってしまった
オレもまだまだっていう証拠だな┐(´д`)┌
0974デフォルトの名無しさん
2007/05/13(日) 03:14:26浮動小数で演算する以上は避けられない誤差として諦めるしかない
どうにかしたいっていうなら、BCD等で計算してくれるライブラリ・処理系を探してくるか
無いなら自分でそういうライブラリ作るしかない
0975デフォルトの名無しさん
2007/05/13(日) 03:24:57まぁ、それが精度によって可能な範囲内で、指定した値を越えない近似値で処理されているみたいで。。。
0976910
2007/05/13(日) 04:11:42遅くなりましたが有り難うございます。
いろいろと弄ってみたのですがいくつか疑問が。
1.>>913の
while (stack)
{
printf("%d ", stack->data);
...
}
の部分の"while (stack)"という書き方を初めてみたのですがどのような条件を表しているのでしょうか?
2.同じく>>913の
while (pTmp2 && pTmp2->next) /* 末尾まで移動 */
は単体の処理でしょうか?
習ったwhile文で
while (pTmp2 && pTmp2->next) /* 末尾まで移動 */
{
pTmp2 = pTmp2->next;
pTmp2->next = pTmp; /* 末尾に追加 */
}
}
のように{}で囲むとキューの表示がおかしくなったので。
よろしくお願いします。
0977デフォルトの名無しさん
2007/05/13(日) 04:39:24先ず1つ目。C言語では、ifやwhileの条件節の中身はスカラ型であれば良いという事になってる
そして判定条件としては0(false)かそうでない(true)かの2つしかない
またポインタ(スカラ型の1つ)の場合、NULLは0と等価とされてる
だからwhileの条件式としてポインタを与えることで、stack!=NULLと同じ事ができる
2つ目は、ifやwhile, forといった文の定義で、それらが影響する範囲(ループ本体とか)は
条件式節の直後の「文」と決められてる
ここでいう「文」の定義は下の6つ
・ラベル付き文(hoge: hage;)
・複合文({ hoge; hage; }って奴)
・式文(hoge;)
・選択文(ifやswitch)
・繰り返し文(while, do〜while, for)
・分岐文(goto, continueとか)
だから実行したい操作が1つの式文でしかないのであれば、{}を省いても構わない事になってる
例えば今回の場合だと、そのwhileでやりたい処理はpTmp2=pTmp2->next;だけだから括弧が省ける
この性質を使うと例えば2重ループで何かしたいって時に、外のループで特に何も処理をしないのであれば
for (;;)
for(;;)
{
hoge;
hage;
}
みたいな書き方もできる。まぁどっちも略記だな。混乱するようなら{}を省かないようにした方がいいと思われ
蛇足だが、式文の定義ではhoge;のhogeにあたる部分はオプションとなっている(空文)から
ほんとにループ本体で何もしないのであれば次のように書けばいい
while (hoge)
;
0978デフォルトの名無しさん
2007/05/13(日) 07:23:45{}で囲む範囲がおかしい。
つまりループの内容を全く理解していない。
理解してないんなら、余計なことはしないほうがいい。
0979デフォルトの名無しさん
2007/05/13(日) 09:01:16[1] 授業単元:プログラミング技術1
[2]
main(){
int i,j;
int a[100];
for(i=1;i<100;i++)a[i]=0;
for(i=2;1<50;i++)
for(j=i+i;j<100;j=j+i){
a[i]=1;
}
for(i=2;i<100;i++){
if(a[i]==0)printf("%d\n",i);
}
}
上記ソースコードをベースに素数の表示と個数の表示をしろってプログラム
なのですが、素数の表示までは出来たのですが、個数のカウントをどうやるのか
漏れの頭では思い浮かびませんorz
何方か助けてください。
[3] 環境
[3.1] OS:Linux
[3.2] gcc ver不明
[3.3] 言語:C
[4] 期限: ([2007年5月15日hh:mmまで] または [無期限] のいずれか)
[5] その他の制限: まだ習い始めたばかりでfor文あたりまでしか習っていません。
先生の話によると変数の宣言はそのままに後半を少し変更するだけで
出来るらしいのですが・・・。
0980デフォルトの名無しさん
2007/05/13(日) 09:29:15a[i]=1の時に100-1するとか、a[i]==0の時に+1するとか好きなようにしれ
0981979
2007/05/13(日) 10:58:24レスどうもです。
a[i+1]==0とやってみましたが、個数は表示はされず、各素数に+1
された値が表示されただけでした。
何処が間違ってるのでしょうか?助けてくださいorz
0982デフォルトの名無しさん
2007/05/13(日) 11:14:09#include<stdio.h>
int main(void)
{
int i,j;
int a[100] = {0};
for(i=2;i<100;i++) for(j=2; j<=i/2; j++) if(i%j == 0) {a[i] = 1;break;}
for(i=2,j=0;i<100;i++) if(a[i] == 0) {printf("%d\t",i);j++;if(j%5==0)printf("\n");}
printf("総数:%d\n", j);
return 0;
}
0983デフォルトの名無しさん
2007/05/13(日) 11:25:45[2] 客の欲しい果物とその量を入力させ、合計の値段を出す。
客は好きなものを、好きな時に注文できるものとする。
ただし、注文を止めたいときには、その選択も好きな時にできるものとする。
Appleは30g以下、Pearは40g以下、Grapeは50g以下の
注文しかできないものとする。限度を超えたときは、すぐに合計の値段を出す。
[3]
環境
[3.1] OS: Windows
[3.2] コンパイラ名とバージョン: 不明です。
[3.3] 言語: C++です。
質問があります
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3971.txt
簡単なSwitchについての質問です、どうかよろしくお願いします。
0984デフォルトの名無しさん
2007/05/13(日) 11:31:07問題ないと思う
>Appleの合計注文量・sumappleが25gのときに追加注文で10gを加えると
>Do-Whileは終わってしまいますが、その後のsumappleは25なのでしょうか
>それとも35で計算されるのでしょうか?
sumapple = sumapple + apple;で25+10で35になってる
0985デフォルトの名無しさん
2007/05/13(日) 12:06:10早速の回答ありがとうございます。
実はもうひとつ条件があって、注文した果物の合計量が100gを超えても
会計に以降するという条件を忘れていました、すみません。
合計量が100gを超えた場合に、最後の(100gを超えるような)注文を自動的に
キャンセルするか、もしくはその最後の注文を調整して100gで収まる量にして
会計する方法がどちらかありましたら、ご教授していただきいと思います。
よろしくお願いします。
0986デフォルトの名無しさん
2007/05/13(日) 12:07:58そこまで分かってるなら、まずは自分でやってみるんだ
C/C++の宿題を片付けます 87代目
http://pc11.2ch.net/test/read.cgi/tech/1179025919/
0988デフォルトの名無しさん
2007/05/13(日) 12:13:37注文量の入力をswitchの外に書いて、たとえば
float *g;
case xxx:
g = &apple;
break;
cin >> *g;
みたいにするのは?
ところでこれswitchにbreakないけどいいの?
0989デフォルトの名無しさん
2007/05/13(日) 12:31:03まことにおっしゃるとおりです。ご指導ありがとうございます
case "apple":
cout <<"how much?";
cin >> apple;
sumapple = sumapple + apple;
if (sumapple + sumpear + sumgrape > 100)
sumapple = sumapple - ((sumapple + sumpear + sumgrape) -100);
Ifで100gを超えたときに超えた分を計算して、それを合計量から引いてみました
これで大丈夫でしょうか。
0990デフォルトの名無しさん
2007/05/13(日) 13:25:52実際にコンパイル・実行してみてる?
0991デフォルトの名無しさん
2007/05/13(日) 16:35:58いえ、今コンパイルできる環境でないのでしてません
0992デフォルトの名無しさん
2007/05/13(日) 16:44:220993デフォルトの名無しさん
2007/05/13(日) 19:35:40写し間違えが多いな。
間違えを脳内修正してみても、篩としては無駄が多い。
0994デフォルトの名無しさん
2007/05/14(月) 00:15:240995デフォルトの名無しさん
2007/05/14(月) 00:25:59main(){
int i,j,count=0;
int a[100]={0};
for(i=2;i<10;i++)
for(j=i+i;j<100;j=j+i) a[j]=1;
for(i=2;i<100;i++){
if(a[i]==0){
printf("%d\n",i);
count++;
}
}
printf("%d\n", count);
}
0996デフォルトの名無しさん
2007/05/14(月) 21:40:16随分と変更を加えた
#include<stdio.h>
#define NUM 1000
int main(void){
int i, j, count;
char a[NUM]={1,1,0};
for(i=2;i*i<=NUM;i++)
if(a[i]==0)
for(j=i*2;j<NUM;j+=i) a[j]=1;
for(i=0,count=0;i<NUM;i++)
if(a[i]==0){
printf(" %4d", i);
count++;
}
printf("\ncount:%d\n", count);
return 0;
}
そして埋め
0997デフォルトの名無しさん
2007/05/14(月) 21:49:550998デフォルトの名無しさん
2007/05/14(月) 21:53:000999デフォルトの名無しさん
2007/05/14(月) 21:54:10そして埋め
1000デフォルトの名無しさん
2007/05/14(月) 21:54:3310011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。