1 :
デフォルトの名無しさん :
2007/04/20(金) 00:35:41
2 :
デフォルトの名無しさん :2007/04/20(金) 00:35:55
2
ANSI、ISO準拠など標準スタイルの話は禁止!した奴は罰金ね
>>前スレ945 #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;
for (int i = 0; i < count; i++) { if (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; }
6 :
デフォルトの名無しさん :2007/04/20(金) 00:37:55
>>前スレ945 #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("不可 ");}}
8 :
945 :2007/04/20(金) 00:40:02
>>4>>5>>6 ありがとうございました。
あーしまった入力はファイルではなくて配列に決め打ちしてよかったのか
前スレの余韻が冷めやらん ビールでも買ってくるか('A`)
>>6 > int TokuPoint[9] = {90, 73, 55, 60, 45, 66, 75, 40};
int TokuPoint[9] = {90, 73, 55, 60, 45, 88, 66, 75, 40};
間違って不合格になる人間が発生する瞬間に立ち会ってしまった。
>>13 >>1 > 気に入らない質問やその他や発言はスルーの方向で。
[1] 授業単元:数値解析 [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の形に変形し、その連立一次方程式をガウスの消去法で未知数φを求める プログラムを作成せよ。
たかし!宿題が出てるよ 早くやっちゃいな
>>17 かーちゃん、俺たけしだってばぁ
たかしは弟だろ〜
ccmath.h のdeqsy関数の使い方さえわかれば解ける! 誰か教えてくれ!
偏微分方程式の専門知識はないから、せめて連立一次方程式への 変形まではやってくれぇ。
23 :
16 :2007/04/20(金) 23:26:37
>>21 やりました。設問と少し変わってしまったのですが、
分割数は同じ(Δ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]
と各々の格子点の値を求めます。
24 :
16 :2007/04/20(金) 23:28:19
この場合(N=3)の連立一次方程式Aφ=bは、 A: 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
25 :
16 :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) です。
26 :
16 :2007/04/20(金) 23:33:24
つまり、格子点の数は分割数をNとすると φ=(φ[1,1],φ[2,1],...,φ[N,1],φ[1,2],φ[2,2],...,φ[N,2],...φ[1,N],φ[2,N],...,φ[N,N]) となります。
27 :
16 :2007/04/20(金) 23:34:21
28 :
16 :2007/04/20(金) 23:39:26
プログラムとしては、 xの値を決める→yの値を決める→x,y方向の分割数Nを決める →出来た連立一次方程式をガウスの消去法を用いて解く だと思います…。 正直、自分には全く作れるような気がしません…よろしくお願いします・・・。
>>22 (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;
}
>>22 (2)
#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;
}
32 :
31 :2007/04/20(金) 23:56:12
すまん、
>>31 ちと修正。
char *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);
}
[1] 授業単元: C [2] 問題文: 一次不定式の一般解を求めるコンソールプログラムを作る。 例えば A,B という形で整数値が入力された場合、 Ax+By=gcd(A,B)←最大公約数 ↑のような式を作ってxとy(整数解)を求め、それらから一般解を求めるプログラム。 [3] 環境 [3.1] OS:Ubuntu [3.2] gcc [3.3] C [4] 来週くらい [5] scanf使っても大丈夫です
35 :
デフォルトの名無しさん :2007/04/21(土) 11:58:06
> #include <stdio.h> > #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); > } 関数を使ったプログラムにしてください。 ↑この関数を使ったプログラムって何ですか?><わかりません 訂正してください><
>>16 具体的な数値は質問者に任せてガウス法(掃き出し法のほうだよね?)だけ
でも実装しようかと思ったが、自分がすっかり退化していることに気づ
いた。添え字がゴチャゴチャしてどっちが行でどっちが列だか分からな
くなるぅ。
>>34 #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);
}
>>37 おお、ちゃんと計算できるけど何やってるのか全然わかんねえw
[1] 授業単元: C言語 [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); }
40 :
デフォルトの名無しさん :2007/04/21(土) 15:14:12
C言語で中置記法から後置記法に変換する 一番スマートなやり方ってどんなのがありますか?
>>34 負数の剰余に対応してなかった.一応修正.
#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
42 :
デフォルトの名無しさん :2007/04/21(土) 16:17:39
[1] 授業単元:C言語入門(Linux)
[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] その他の制限:特にありませんが、
初級クラスなのでその辺で使われるであろう関数を使っていただけるとありがたいです。
丸投げでよろしくお願いします。
43 :
デフォルトの名無しさん :2007/04/21(土) 20:39:33
[1] 授業単元: プログラミング演習U [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] その他の制限: 特にありませんが初歩的な関数で書いていただけると 有難いです。
>>43 #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; }
>>39 #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);
}
プログラマーにとってEditorの操作が重要
>>47 これは同じ問題をやったことある香具師じゃなきゃ無理だろ。
参考URLとかもってきてくれ。
>>49 やはり無理ですか...orz
私もよく理解ができなかったので
どの参考URLを探せば良いのかわからなくて困っています
数字が
0123456
1234567
2345678
の様な感じで並んでいたのは覚えているのですが、参考にもならなくてすみません。
今からまた調べてみます
51 :
デフォルトの名無しさん :2007/04/23(月) 02:54:13
前スレの945なんですけど
>>6 のchar* Gakusei[9] = {"A", "B", "C", "D", "E", "F", "G", "H", "I"};
の部分が他の表し方だって言われたんですけどどうしたらいいんでしょうか?
あとint main(void)ではなくてvoid main(void)って言われたんですけど・・・
>>51 char *Gakusei2 = {"ABCDEFGHI"}; < こうですか?それとも
char Gakusei2[9] = {"ABCDEFGHI"}; < こうですか?わかりません ><;
>>51 授業で習ったものに、文字配列の初期化や格納について参考になるものはない?
出来るのにそれじゃダメとか言い出す講師は、ただ単にそういうんじゃなくて
どういうことに則って記述するのか、ちゃんと聞いてみるしかないかと。
55 :
デフォルトの名無しさん :2007/04/23(月) 03:33:05
>>52 <<53
すいません。無知なんで詳しいことがよくわかんないんですけど
charってのは使わないみたいです。あとはfor構文を使うとしか聞いていません。
前スレには すいませんでした。 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);
誰に言われたんだろう TAか教授か・・・
59 :
デフォルトの名無しさん :2007/04/23(月) 05:21:53
九九の表で 1 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 というように表示させたいんですけどうまくいきません。
60 :
デフォルトの名無しさん :2007/04/23(月) 05:23:10
#include <stdio.h> int 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; } ここまではできたのですが表がどうしても左詰めになってしまいます。 どこがいけないんでしょうか?それ以外にも直したほうがいいところ があればおねがいします。
>>60 #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;
}
62 :
デフォルトの名無しさん :2007/04/23(月) 05:39:39
>>62 > printf(" "); /* 半角の空白3つ分を出力 */
この中に半角の空白をあと2つ足して3つに汁!
>>62 printfの中を半角のスペース3つにしといて。
2ch投稿時にまとまったスペースはひとつにされてしまう。
< どうだぁ
66 :
64 :2007/04/23(月) 05:46:23
ええ、べつにいいんです。 なじられるのにはなれてますから。
&nbsp; <これの半角にしたコードを使うのも面倒やしなぁ・・・ ちうか、俺流の書式の指定 #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; }
printf("%*c",t,NULL); でも良いかな。戯言すまそ。
69 :
デフォルトの名無しさん :2007/04/23(月) 05:54:31
表示できました。ありがとうございました。 ただputs(""); っていうのをまだ習ってないんですけど これを使わずに表示することはできないんですか?
int main論議なんかよりも、
>>67 >>68 みたいな情報をもっと書いて欲しい。
どうせやるなら、printf("%*s", t, "")だな。
74 :
42 :2007/04/23(月) 16:27:31
42です。どなたかお願いできないでしょうか?
75 :
デフォルトの名無しさん :2007/04/23(月) 16:32:53
76 :
本年度のバカ6、7号 :2007/04/23(月) 16:36:42
72 名前:デフォルトの名無しさん 投稿日:2007/04/23(月) 12:43:14
>>68 NULLを%cで表示ってバカ?
73 名前:デフォルトの名無しさん 投稿日:2007/04/23(月) 15:15:41
どうせやるなら、printf("%*s", t, "")だな。
>>73 ""が示す文字、すなわち空文字=NULLじゃねーかYO!
78 :
73 :2007/04/23(月) 17:12:16
>>76 >>77 やってみれば判るけど、"%s"に""を渡しても何も出力しないが
"%c"にNULLを渡すとナル文字が出力されるのよ。
つまり、非可読文字が出力されちゃうわけ。判る?
#あ、標準出力をリダイレクトしてodするなんて知恵も無いDozerには理解できるわけ無いか。
79 :
73 :2007/04/23(月) 17:13:37
>>78 > #あ、標準出力をリダイレクトしてodするなんて知恵も無いDozerには理解できるわけ無いか。
> Dozerには理解できるわけ無いか。
> Dozer
さすがにこれはどうかと思うぞ。
関係ない人間にまで喧嘩売ってるとしか思えん。
全てのDozerが理解できないのではなくて、知恵の無いDozerが理解できないのだろうよ。
Dozerなんて蔑称使ってる時点で論外。
83 :
デフォルトの名無しさん :2007/04/23(月) 17:35:08
>>78 お前ってさぁ、自分の間違いを指摘されると何か言い返して相手の間違い(だと思ったこと)を
指摘しないと気がすまない基地外だろ?w
バカじゃね?出力結果が物語っているのに、何自分勝手な自論をこんなところで提言してんだよw
何これ↓?知ったかぶり?
> やってみれば判るけど、"%s"に""を渡しても何も出力しないが
> "%c"にNULLを渡すとナル文字が出力されるのよ。
だからその通りになってんじゃんwwwwwwwwwwww
> つまり、非可読文字が出力されちゃうわけ
お前のやっている %s と "" の方がどう見てもおかしいし理解不能だろwwwwww
これだからわけのわからねぇ〜知ったか理論を持ち出して説明する専門学校卒は困るんだよ!視ねw
84 :
頭の上にウンコを乗せたバカの今日の名言 :2007/04/23(月) 17:36:30
72 名前:デフォルトの名無しさん 投稿日:2007/04/23(月) 12:43:14
>>68 NULLを%cで表示ってバカ?
NULLを%cで表示ってバカ?
NULLを%cで表示ってバカ?
NULLを%cで表示ってバカ?
NULLを%cで表示ってバカ?
NULLを%cで表示ってバカ?
NULLを%cで表示ってバカ?
"" を %s で表示の方がバカだよwwwwww
文字列じゃねーだろ "" はw あっ、お前の場合ダブルクォートが文字列のつもりか?w
端から見てりゃ
>>76 も
>>78 も同類。同じ馬鹿だよ。
脳みそ硬化してる連中はどっかよそへいけ。
>>84 > 文字列じゃねーだろ "" はw あっ、お前の場合ダブルクォートが文字列のつもりか?w
どうみても0文字以上の文字を含む文字列では?
誰かまとめ頼む!
各自であぼーんして無かったことにするのが吉。
89 :
デフォルトの名無しさん :2007/04/23(月) 17:48:20
>>73 はおそらく、文字列の終わりに終端を示す\0が入るのは分かっているのだろうか?
まぁ、それについてはともかく、以下のソースをコンパイルして実行してみろ。
お前がやったことも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;
}
ナルターミネートされて出力されないことと、ナル文字が出力されることの区別がつかない香具師数名。
91 :
デフォルトの名無しさん :2007/04/23(月) 17:51:18
>>85 はぁ?一緒?そりゃやっていることは一緒だろうけどさぁ、考え方は明らかに
>>73 の方が浅はか、無知、知ったかw
実証してみりゃ結論が出るのに、やらずに勝手な自論を持ち出して相手の不適切を
指 摘 し た つ も り が
自分がやったことが相手のやったことの違うやり方だったことに過ぎないという
お間抜けなことに気づかないアホw
やれやれ、ここはやたらとint mainにかみついたり、C言語スタイルで記述したソースを
C++コンパイラでコンパイルできればそれもC++のソースとか平気で言っちゃう香具師らが多いなんて
もはや終わってんなここw 所詮、プロのプログラマーになれなかった落ちこぼれ
負け組みの集団だろ?俺なんて趣味でやっている程度だが、確実にボケ老人より知識は上だなw
経験はまだ浅いが、いずれプロにも匹敵するくらいにはなるぜw
>>91 で、出力結果は? 勿論、出力をリダイレクトしてダンプしてね。
93 :
デフォルトの名無しさん :2007/04/23(月) 17:57:46
>>92 出力結果を聞くなんておかしいね?お前がコンパイルしてやってないってことは
結局""も脳内コンパイルか?脳みそこねこねコンパイルw
72 名前:デフォルトの名無しさん 投稿日:2007/04/23(月) 12:43:14
>>68 NULLを%cで表示ってバカ?
73 名前:デフォルトの名無しさん 投稿日:2007/04/23(月) 15:15:41
どうせやるなら、printf("%*s", t, "")だな。
↑こいつら死刑なw
#include <stdio.h> int 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
96 :
42 :2007/04/23(月) 18:07:57
論争で流れてしまったみたいなので。
お願いします。どなたか
>>42 の課題をやっては戴けないでしょうか?
>>96 残念、参考資料が両方とも流れてしまっている。
98 :
42 :2007/04/23(月) 18:14:04
printf("\"\" : \"%c\" / %d \n","",""); これやったらおかしな数値が表示されたぞ?
100 :
42 :2007/04/23(月) 18:18:54
101 :
42 :2007/04/23(月) 18:20:01
>>98 のヒントコード、誤爆ですorz
スレ汚しすいません。
>>91 ここがどこだか言ってみろ?
空気読めない奴はマに向かないぞ。
>>101 一匁。
#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;
}
104 :
42 :2007/04/23(月) 18:56:33
>>103 ありがとうございます。早速、動作確認の方、完了しました。
2問目もよろしくお願いします。
二匁。 waitしないと出力が混ざるから、こっちは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; }
106 :
42 :2007/04/23(月) 19:46:23
>>105 ありがとうございました。どちらも動作確認いたしました。
早速、提出してきます。
本当にありがとうございました。
107 :
47 :2007/04/23(月) 20:52:56
>>47 はさすがに無理ですか?
自分でもいろいろ調べてみたのですが難しくて...orz
スレ汚しすみません
CとLの定義くらい書いてよ。 グラフ理論(?)の授業さぼったならそれは助けようがない。
>>108 情報不足でしたか
授業はさぼっていないです、ちゃんと聞いていたはずなのですが
聞き逃したのかノートにも書いていないので
必死に知り合いに詳細を聞いているところです、申し訳ない
110 :
デフォルトの名無しさん :2007/04/23(月) 22:29:06
最大10件の名前と得点を入力させ、得点グラフを表示グラフを表示するプログラムを作りなさい。最初に名前を入力させ、10件分の入力が行われるか、 "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] その他の制限: 現在、制御文、配列、文字と文字列まで習っています。 よろしくお願いします
[1] 授業単元: プログラミング [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] 制限: 特になし
113 :
デフォルトの名無しさん :2007/04/24(火) 02:06:53
[1] 授業単元:プログラミング実習 [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 お願いします。
>>113 #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;
}
}
>113 #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; } }
116 :
デフォルトの名無しさん :2007/04/24(火) 04:52:26
[1] 授業単元:データベース基礎 [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] その他の制限:
>>116 読み込むCSVファイルの中身と出力結果の例をきぼんぬ
>>111 #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;
}
>>117 出力は今回の範囲に入ってません。多分好きな形式で良いと思われます。
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 業務ではありません。データベース基礎の演習です。
>>121 > 3.動的配列をcsv形式ファイルとして書き出す関数。
いや、モロに「出力」に該当する部分があるんだが・・・出力って何も画面に表示ってだけじゃないぜ?
出す力と書いてウンコのごとく(ry いやすまん、今のはジョークだ。要するにファイルに出力だろ?
124 :
デフォルトの名無しさん :2007/04/24(火) 18:28:10
>>124 kwsk
>前回と同様である
>概論I第14回で説明している
>使用例をここに示す
>テスト用の入力ファイルは、test.txtを取得して
126 :
デフォルトの名無しさん :2007/04/24(火) 18:59:04
>>125 わざわざ申し訳ないっす。
気にせずお願いします。
教官の指示に合わない箇所があった場合は自分でなんとかしますので
一応説明すると
前回と同様:普通にFile.open("test.txt");で要素(stringの文字列)を格納
test.txtは英文が書かれているだけです。
127 :
デフォルトの名無しさん :2007/04/24(火) 20:20:53
[1] 授業単元:プログラミング演習 [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] その他の制限: 宜しくお願いします。
128 :
デフォルトの名無しさん :2007/04/25(水) 00:06:34
>>123 今、帰宅しました。
空白を入れずに各項目を","で区切ったテキスト形式でOKです。
>>127 問1
逆行列がぴったり整数になる事は少ないので勝手に実数で計算したよ
#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;
}
>>127 #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;
}
>>127 問2
#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;
}
>>128 #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;
}
135 :
127 :2007/04/25(水) 01:07:06
新学期始まって、色々と宿題投げる人が増えてきて 投げる人はあれだが、このスレ的には盛り上がって良いなww 解答をじっくり噛み砕いて、次こそ自分で解けるようにね^^
提出した次に同じ問題はこない。学校によって違うかもしれんが、定期試験とかはなく レポート提出になるだろうけど、そのときもまたここで質問するんだろうね・・・( ´д`)
学生はいいや。 それよりも研修の問題丸投げしてる奴を想像して……。
それはけなげなサボタージュだな。 しっかり破壊工作にいそしんでくれ。
141 :
デフォルトの名無しさん :2007/04/25(水) 14:26:42
2次元配列kukuの各要素に九九の各計算を格納し 表示するプログラムを作成してくれませんか? 至急おねがいします。
#include <stdio.h> int 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"); } } 何時までにとか何分以内にとか言ってくれたほうが くだらない問題でも無駄にやる気が出る。(百マス計算とかと一緒)
そういや return 0; を忘れてた
144 :
デフォルトの名無しさん :2007/04/25(水) 18:17:54
[1] 授業単元:C言語基礎演習 [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] 制限:なし。 結構厳しい先生なのに見た感じ楽勝の課題だと思ってたら、やっぱり 初心者には簡単に解けない引っかけのような点があって詰まってます。 くだらない問題でしょうがお願いします。 自分なりにやってみて詰まった点は下のレスに書きます。
#include <stdio.h> int 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です。他は上で書いたのと同じです。 よろしくお願いします。
>>146 実数の小数部分は2進数では正確に表せない物がある。
そういう場合は具体的には小数を使わない工夫をする。
例えばa=10.0としておき1.0ずつ引いていき、a==6.0の時に
処理を分岐すれば正しい動作になる。
>>147 ありがとうございます。2進数の章の課題なのでやっぱり2進数が関わってくる
とは思っていましたが・・・勉強になりました。
しかし、
>>
a=10.0としておき1.0ずつ引いていき、a==6.0の時に
処理を分岐すれば正しい動作になる。
これ、今やってみましたがやはり結果は6.0と4の乗算になってしまいました。
すみません。
149 :
デフォルトの名無しさん :2007/04/25(水) 21:10:10
>>147 すみませんよく見たらちゃんと出来てました。ただ、そうすると課題本来の
「1.0から0.1を引いていく」場合には少数を使って正しく分岐する方法は
無い、ということですか?
>>150 十進化二進数を使っているような処理系の場合うまくいく。
つまり処理系依存としか言えない。
どうしても小数を使いたいなら、0.6と比較するのではなくて
0.599と0.601の間に入ったら、みたいに条件を緩めるしかない。
IEEE754で正しく表せる小数は、0.5, 0.25, 0.125, 0.0625,....のような
列とその足し合わせた小数のみ。それ以外は必ず誤差がある。
×十進化二進数 ○二進化十進数
#include <stdio.h> int 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 となり、ごくわずかだが誤差がある事がわかる。
>>151 >>153 本当に勉強になります。ありがとうございます。なるほど、誤差がある
ということを勉強させる課題だったわけですね。具体的な解答はまだ
思いつきませんが、誤差について調べて金曜まであがいてみます。
ひょっひょっひょ、詰まる話が 0.5 0.25 0.125 すなわち 2^-nの話か。 ちうか小数点以下きらーーい(ゆとり教育世代じゃないが)w
C言語の場合はループカウンタに実数を使わずに整数を 使うのも同じ理由だよね。
0.5 0.25 0.125 0.0625 0.03125 0.015625 0.0078125 0.00390625
158 :
154 :2007/04/25(水) 21:36:50
>>151 >>
どうしても小数を使いたいなら、0.6と比較するのではなくて
0.599と0.601の間に入ったら、みたいに条件を緩めるしかない。
これで試しにやってみたところ、うまくいきました。本当にありがとうございました。
少数を使わない方法はこれから試行錯誤して探そうと思います。
159 :
デフォルトの名無しさん :2007/04/25(水) 22:40:44
[1] 授業単元:情報処理 [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] その他の制限: お願いします!
>>159 問1は降べきにソートして最初の要素を出力すればいいのかな
>>159 問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));
}
>>159 問1はこんな感じかと
#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;
}
163 :
デフォルトの名無しさん :2007/04/25(水) 22:53:09
はい!最初の数字だけを出力すればいいそうです。
>>159 問2 番兵をINT_MAXにしたが、INT_MAXを入力されるとかなわんなあ
#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;
}
[1] 授業単元:C言語基礎演習 [2] 問題文:【1】10桁までの任意の数字を入力し、入力した値を配列に格納し、 「何桁目を表示しますか?」を出力し1〜10までの任意の数字を入力後 「○○桁目の数字は○です」と出力されるプログラムを作成せよ * 使用する関数 : scanf printf switch case [3] 環境 [3.1] OS:WindowsXP [3.2] コンパイラ名とバージョン:.NET2003 [3.3] 言語: C言語 [4] 期限: 明日の朝 [5] 制限:なし 入力した10桁の値を配列に格納する方法が調べてもググってもわかりません… お願いします!
>>159 問2
#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;
}
>>159 問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);
}
ごめん、ちょっとやってみたかっただけ。
>>167 それは反則だろ。三項演算子はif文と同等とみなされると思って
俺は使わなかった。
>>166 a[sz]=x;をfscanf(stdin,"%d",&x); の下に
170 :
デフォルトの名無しさん :2007/04/25(水) 23:14:20
>>159 です。
素早い返答ありがとうございました(^0^)
>>165 #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;
}
>>168 int 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
ネタ回答なんで気にしないでください。
>>165 #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;
}
尊敬するのは良いが、提出する前にちゃんと中身を検証しとけよ
>>165 正攻法でやってみた。
#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;
}
177 :
165 :2007/04/25(水) 23:44:12
あら、エラーでした でも少しわかってきたような気がします。
>>176 俺もさ、数値で入力しようとしたんだけど10桁だとint 超えるよね
で、いま考え中
にしてもCで書くと3者3様のプログラムになるねー。 自由度が大きい言語だからだね。BASICとかだと似たりよったりになる。
>>178 あちゃあそうか。だとやっぱし
>>173 みたいにいきなりcharの配列に
入れさせるのが正しいのかもな。
意外と難しいな
>>180 うん、ただ気になったのが
>>173 だとたとえば1桁目を表示とした場合(1を入力)上位桁が表示されるわけだけどまずくない?
いや、俺は今考え中だよ、もちろん
>>182 そしたら入力された文字列を前後ひっくり返しておけばいいのでわ?
185 :
デフォルトの名無しさん :2007/04/25(水) 23:53:04
187 :
デフォルトの名無しさん :2007/04/25(水) 23:56:52
int main() { 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; }
188 :
178 :2007/04/26(木) 00:03:49
>>180 も俺なわけで
文句ばかり言うと怒られるのでちゃんと作ってみた
でも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;
}
[1] 授業単元:C言語基礎 [2] 問題文: 任意の文字列を入力し、入力後に再度任意の文字列を入力し 最初の文字列と2回目の文字列が結合されて出力されるように作成せよ [3] 環境 [3.1] OS:Windows [3.2] コンパイラ名とバージョン:VC++ [3.3] 言語: C [4] 期限:4/26 [5] その他の制限: さっぱりです・・・ よろしくお願いします
>>165 #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;
}
訂正 scanf("%lf", &value); ↓ scanf("%12s", buf); sscanf(buf, "%lf", &value);
192 :
デフォルトの名無しさん :2007/04/26(木) 00:17:32
[1] 授業単元:情報処理 [2] 問題:標準入力から整数値を繰り返し読み、読み込んだ値の個数および平均値を 標準出力へ出力する。繰り返しの終わりは負の値で示す。負の値はデータの終わりを示す もので、集計に含めない。平均値は小数点以下一桁まで出力せよ。また、データ数が0の ときは、標準出力に"データがありません/n"を出力する。 [3] 環境 [3.1] OS: Window [3.2] コンパイラ名とバージョン: [3.3] 言語: C [4] 期限:4月26日06時00分(木) [5] 制限:なし。 お願いします!
193 :
178 :2007/04/26(木) 00:22:23
>>189 エラーチェック一切なし、バッファオーバフローチェックなし
とりあえず動けばいいやコ〜〜〜ドです
#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;
}
>>189 #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;
}
195 :
デフォルトの名無しさん :2007/04/26(木) 00:25:55
>>165 のは基礎らしいから長くなっても
もっと初歩的な感じにしないとならなくないんかい?
使用する関数のみでやったほうがいいんかな
まぁもう寝るけど
196 :
178 :2007/04/26(木) 00:36:34
>>192 エラーチェック一切なし、バッファオーバフローチェックなし
とりあえず動けばいいやコ〜〜〜ドです.第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使って役に(勉強に)なるのかなぁ?
あーおやすみです
俺も寝ますね
>>192 #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;
}
198 :
192 :2007/04/26(木) 00:57:57
夜遅くにありがとうございました! 助かりました♪
>>149 すまん、途中で飽きた。
#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;}
201 :
200 :2007/04/26(木) 05:29:12
ああああああああああああああああああああああああああああああああ 4文字以上のものかああああああっ
202 :
200 :2007/04/26(木) 05:38:55
203 :
200 :2007/04/26(木) 05:46:23
int kがおかしいな…… しにたい。
204 :
165 :2007/04/26(木) 07:57:58
皆様どうもありがとうございました。 少し素人っぽい感じに直して提出したいと思います(笑)
205 :
デフォルトの名無しさん :2007/04/26(木) 12:12:47
C言語の勉強をするならエクリプスと VisualStudioのどっちがいいの?
206 :
デフォルトの名無しさん :2007/04/26(木) 12:16:08
本の付録でいいよ
207 :
178 :2007/04/26(木) 12:16:42
>>204 ども、正解とされるソースを先生が出してきたら教えて欲しいな
なぜこの問題でswitch case なのかが分からない、気になる
208 :
デフォルトの名無しさん :2007/04/26(木) 12:17:52
>>206 ほんの付録というとBORANDのやつになっちゃうけど、
できれば統合開発環境がいいです!!
BORANDのだって統合開発環境だと思うが 昔、本の付録についてたC++Builder3で勉強した
210 :
デフォルトの名無しさん :2007/04/26(木) 12:25:04
borandのやつでも統合開発環境があるんですね。 VisualStudioだと一度ビルドしないと実行できないのが気に入りません。 普通はeclipseのJavaならビルドなしで実行できますよね? でも、eclipseでCだとビルドの必要がありそうですね。 どうなんでしょうか?
CとJavaを一緒にしないで欲しいけどな eclipseってのは知らないがその場合インタプリタ方式で実行されているんじゃないか BORANDにしたってビルドは必要だぞ
>>210 いや、ビルドって作業にはコンパイル作業も含まれるわけで、
インタプリタ言語で無ければ(名前と手間は兎も角)必ず必要になるのだが。
214 :
デフォルトの名無しさん :2007/04/26(木) 12:33:56
>>212 そんなのがあったのですかこれならすぐに実行できるのかな?
>>213 eclipseだとソースを書いて保存するだけで、自動にコンパイルしてくれるのだと思います。
書いて保存するとすぐにエラーがあるラインが表示されますので
>>214 >>212 には似たような物がたくさん出てるが個人的にはCPadが一番
使いやすいと思う。
ソースを入れて右▼ボタンを押すだけで自動的にコンパイル・リンク・実行
をまとめてやってくれるしDOS窓は実行後にすぐに閉じたりしないし。
216 :
デフォルトの名無しさん :2007/04/26(木) 12:40:43
スレ違いな議論をしないで宿題を出せYO!
[1] 授業単元:C言語 [2] 問題文(含コード&リンク): 次のような、左上を直角とし「+-」からなる三角形図を作りなさい +-+-+ +-+- +-+ +- + [3] 環境 [3.1] OS: Windows XP [3.2] コンパイラ名とバージョン: Visual Studio .NET [3.3] 言語: C [4] 期限:5月2日 お願いします
>>218 #include <stdio.h>
int main()
{
printf(
"+-+-+\n"
"+-+-\n"
"+-+\n"
"+-\n"
"+\n");
return 0;
}
#include <stdio.h> int main() { printf("+-+-+\n+-+-\n+-+\n+-\n+"); return 0; }
>>218 #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');
}
}
222 :
218 :2007/04/26(木) 13:07:35
みなさんありがとうございます
// 一応真面目な方も貼っとく #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; }
>219-223
>218 俺も書いてみた。 #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; }
うはぁ、なんで内側の二つ目もループにするよ。チェックだけでいいんだからifでいいでしょよ。
ifを使いたくなかったら、わざとforにした。 反省はしていない。
228 :
デフォルトの名無しさん :2007/04/26(木) 16:14:52
実数を入力し小数点以下第1位で四捨五入し整数部を表示しなさい 実行画面 実数入力==>10.4 四捨五入:10 実数入力==>10.5 四捨五入後: 11 になるプログラムを作成しなさい この問題わかる方がいましたら教えてください(T_T)
>>228 0.5を足して整数部表示
書くのメンドイから後は自分でしてね
231 :
デフォルトの名無しさん :2007/04/26(木) 16:22:24
何方か教えてください(ノ_<。)以下に示す変数をもとに商を求め,実行画面のように編集しなさい int a=10; int b=7; doule syo; 実行画面 syo:1.43 何方かわかる方が居ましたら教えてください(ノ_<。)
>>228 #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;
}
233 :
228の者ですが :2007/04/26(木) 16:24:52
229>それが問題集に書かれてるのはこれだけなんですよ(・_・;)
>>231 #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;
}
>>205 Cならborlandをお勧めするのだけど(手軽だから)、
C++とかをやるようになると、eclipseとかの新しいコンパイラの方が良い。
ただし、微妙に安定しない。
VisualStudioも良いのだけど、#include<stdafx.h>とかの特殊な部分が含まれるから、微妙に抵抗は感じる。
standard editionとかなら、VisualStudioを使うのもいい。重いけど。
ただし、VisualStudioは初学者向けではない。
>>232 round()はc99だな。って、コメントの間違いか。
>>235 Eclipseはいつからコンパイラになりましたか?
VC++Toolkit2003最強伝説 ごめんなさい。言ってみたかっただけです。
[1] 授業単元: C言語 [2] 問題文(含コード&リンク): 番号(整数型)、氏名(20字以内)、年齢(整数型)、血液型(文字列)を 一組とした構造体配列(要素数2人分)を用意する。 キーボードからの2人分のデータを入力し構造体配列へ格納後表示しなさい。 氏名はfgetsを用いブランク(空白)を含む入力も可能とすること。 入力部分、表示部部は関数を用い関数の引数にはポインタを使用すること。 [3] 環境 [3.1] OS: WindowsXP [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限:2007年4月28日まで [5] その他の制限: 特になし よろしくお願いします。
242 :
デフォルトの名無しさん :2007/04/26(木) 21:51:42
244 :
デフォルトの名無しさん :2007/04/26(木) 22:34:39
[1] 授業単元: [2] 問題文(含コード&リンク): [3] 環境 [3.1] Linux [3.2] gcc 3.36 [3.3] C [4] 2007年4月27日 [5] 非再帰で且つ要素数が奇数でも2^n個でもソートできるようなマージソート関数をお願いします。 再帰かけるとスタックオーバーフローの恐れがあるので非再帰版も作ることにしました。 よろしくお願いします
245 :
243 :2007/04/26(木) 22:37:19
あしもた、calculate関数にしないとだめなのね。ちと待て。
246 :
243 :2007/04/26(木) 22:42:09
247 :
デフォルトの名無しさん :2007/04/26(木) 23:03:33
初めまして。大学1年生です。 [1] 授業単元:プログラミング [2] 問題文(含コード&リンク): 1000個までの、整数あるいは少数を打ち込んで、 その平均と標準偏差を表示することのできるプログラムを作成せよ。 [3] 環境 [3.1] OS:Windows xp [3.2] コンパイラ名とバージョン: [3.3] 言語:C [4] 期限: 2007年5月5日まで] [5] その他の制限:特にないです。 Windows xp Visual Studioを使っております。 よろしくお願いします。
1000個でも少数とは…… 一体どれだけあれば気が済むんだ?
>>248 いや少数じゃなくて小数の間違いだと思うよ
251 :
デフォルトの名無しさん :2007/04/27(金) 00:38:55
>>250 すごく・・・早いです・・・
どうもありがとうございます
読んでみます
理論的にはマージソートはクイック・ソートの1/2程度の速度は出る はずなんだが、このプログラムは標準関数qsort()の1/10程度の 速度しか出てないような気がする。もっと改良できるはずなんだが
マージでぇ?
256 :
デフォルトの名無しさん :2007/04/27(金) 23:10:56
おいっ、どうした?もっと宿題を出せゴルァ!
>>256 ちょwwww
お前コテとトリップつけてこのスレに居座ってくれ。
俺はGW中は答える暇がないと思うので。
宿題を○投げする奴もGWの終わりギリギリに ならないと投げてこないと思う。 まさにゆとり。
だな。
どうせGW終わり頃にスレ探すだろうから今言ってもしょうがないけど、 俺GW暇だからちょっと難しい問題でもがんばっちゃうYO といっても休みはカレンダー通りだけどな・・・ orz もっと寝ていたい
printfの位置がなんか間違ってるな まぁそこらへんは自分で工夫してちゃんと表示されるようにがんばれ
265 :
デフォルトの名無しさん :2007/04/28(土) 00:57:29
おい、お前ら、出番です。ぎりぎりちゃんがきましたよ? 「なるべく早く」やれって
>>265 weather_3.datのEOFは最後のデータ(その場合117)の後ろかい?
出来れば最後のデータの後ろには改行コードを入れてくれれば良いのだが・・・
269 :
268 :2007/04/28(土) 02:25:05
あ、ゴミ入れたままでやんの、適当に消しといて
270 :
265 :2007/04/28(土) 02:43:31
>>266 ごめんなさい。
>>267 たぶんそうだと思います。
>>268 ありがとうございます。
すみません、weather_3.datの中身は本当はわからない状態で出すんです。
あとweather_3.datは端末エミュレータから入力して
やっているんです。
emacs ~~.c > weather_3.dat 見たいな感じで…
あとARRAY_SIZEってなんでしょうか?
ごめんなさい。こんな時間に…
>>270 練習3
練習2の処理を行ったあと,もう一度別のループで奇数番目のデータを配列bの残り部分に移動せよ.
結果が正しいことを確かめよ.
> 配列bの残り部分
とはなんぞや?何が残り?
272 :
268 :2007/04/28(土) 03:05:15
並び替えは、要するに基本選択法ってことか?並び替えも課題だよな・・・
275 :
268 :2007/04/28(土) 03:29:59
配列でってあるからrealloc使わなかった俺の立場なんてどうでもいいですよね(´・ω・`)
ってか、出題者のレベルが低そうな気がしてならんのだが・・・
出題者というのはここで質問している人の授業の担当者という意味ね
んー、どっちかというと多分この問題の出し方だと生徒の 全体の実力に合わせて問題作っている感じがするんだけど。 専門学校かも?
Cの講義やり始めたばっかならこの時期の問題としては考え難いし 一年以上経ってるなら逆に心配になってくる
誰か無視されてる問題もやってやれよ。
>280 お前がやってやればいいだろ。
282 :
265 :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
だけなんです。
前回の配列部分も休んでしまってわからないんです。
だからそれ以外はさっぱり…です…
>>282 そんな態度だから単位落すんだよ。休んだから配列が分らないだ?
教科書を読めば分るだろ。黄金週間中に教科書を頭から読んで
練習問題やりまくれば何とかなるよ。あと、問題文が凄く分りにくいから
出題者に文句言って、分りやすく作り直してもらった方が良さげ
284 :
265 :2007/04/28(土) 11:44:03
確かにそうですね... 授業でてないからってそれじゃあだれですよね. そこでプログラミングC言語の専門書買って最初から勉強しようと思うのですが おすすめの専門書ありませんか?
教科書は無いの? 専門書なんか買っても金の無駄だと思うけど できれば単位取るのを諦めて、他の道へ進むのを考えるのがオススメ
286 :
265 :2007/04/28(土) 12:05:37
>>285 教科書はありますが,少しわかりにくくて...
最近,大学やめることを悩んだんですよね...
今の勉強がおもしろくないし,ついていけてない.
いろんな人に相談して,やりたいことないのにやめるのは
やっぱりよくないということで,通い続けているんです.
特にプログラミングがついていけてなくて...
関係ないレスになってしまってすみません.
>>286 さっさとやりたいことを見つけてやめればいいだろ
プログラミングを勉強するより、そっちに努力しろ
>>282 問題文は順を追ってプログラムを完成させるような感じみたいだが・・・
それほど難しいもんでもないと思うが・・・。関数だって難しいもんは使ってへんよ?
アルゴリズムが分からんだけじゃね?
>それほど難しいもんでもないと思うが・・・ 何を作れと指示されているのかの解釈が難しいんだよね ・「配列aに読み込み,別の配列bにデータが逆順となるよう入れ替えよ」とは 配列aから配列bにコピー、ってこと? ・「配列bに上記の操作をしてデータを移動せよ.」とは むーぶ? 例えば配列aから配列bにコピー後、配列aの内容を0クリア、でいい? ・「もう一度別のループで奇数番目のデータを配列bの残り部分に移動せよ.」 上に倣って、元の要素が配列のサイズの半分以下という条件で、 配列bの奇数番目のみをコピーしつつ0クリア、でいい? あまりに問題に抜けが多くて想像して作ってもいいけど難易度高すぎ (...ひょっとして授業中に前提となるものが提示済みなのか?)
泳げない奴は(ry
浮き輪でもビート版でも使って泳げば良いのさ。パンがないならケーキを(ry
>ビート版 ハリウッド板南極物語は、動物のお医者さん犬だったorz
>164
>
>>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");
番兵は、 ・検索対象の値そのものを配列の末尾に加えておく。 ・すると、ループの最後まで行けば必ず見つかるので、終了判定はいらない。 ・見つかったのが目標物なのか番兵かは、添え字がどこまで進んだかで判定。 というものだな。
条件判定の数を削減するために置くダミーのデータ
>>297 英語のほうを見ると1.の用法(¥0で文字列終了とか)しか書いてないな。
>>286 好きなことで分からないなら何故調べようとしない?
配列が分からないなら分からないなりに簡単なコード書いてみて
それいじくるところから始めてもう一度教科書読めよ
関数名くらいぐぐれ
>>299 よく読むだ、しむらぁ〜
「やりたいこと」ではなく「やりたいことない」だぁ
>>301 それで結局授業出てないならやめるべきだな…
金の無駄 やりたいことないからとりあえず大学って うらやましぃ〜 大学卒業したかったよorz
feofっていうのはなんて便利なんだ……
数値データ以外に英数文字が入ってたり 113a みたいな数値+文字とか入ると scanfの書式設定で%dとint型変数の指定はいただけない
fscanfもfgetsとsscanfに代えるべき?
fscanf?
文字データが数値を扱う型の変数に入るような状況を避ける措置がしてありゃおkかと。 まぁ、細かいことを言ってたらキリがなくなるんで、あとは個人で追求するだけ追及かね。 宿題は目的が果たせていりゃとりあえずおk。
そっかfscanf(stdin,...)と変わらないんだったな… じゃあとりあえずはfgetsとstrtol使っとけばおk?
315 :
265 :2007/04/28(土) 22:37:59
皆さんすみませんでした。 最初から勉強し直してみます。
316 :
デフォルトの名無しさん :2007/04/28(土) 22:48:01
[1] 授業単元:プログラミング [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] その他の制限:なし
(0≦m<n) なんとなく顔に見えた、すまそ。 (0>m<0)
318 :
316 :2007/04/28(土) 22:57:48
#include void 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の意味がよく分からないので解説していただけると有難いです。
>>318 入れ替えをした範囲の両端の文字じゃない?
320 :
316 :2007/04/28(土) 23:25:41
実行例を間違えていました。 Swapped: Goelgo agreed to its largest acquisition yesterday,reaching a deal to purchase DoubleClick.
外側から入れ替えていって最後に入れ替えたペアのことだろ。
322 :
316 :2007/04/28(土) 23:32:24
>316さん、321さん 有難う御座います。助かりました。 できれば、どの様なコードになるか教えていただけませんか?
316は自分だろうと
324 :
316 :2007/04/28(土) 23:41:59
すみません間違えました。 >319さん 有難う御座いました。 あと、自己解決できました。 皆様、有難う御座いました。
>316 こんなんでどうよ? #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; }
[1] 授業単元: C言語 [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まで] または [無期限] のいずれか)明後日
327 :
デフォルトの名無しさん :2007/04/29(日) 00:34:15
[1] 授業単元:C言語 [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] その他の制限 リンクによるリスト処理の形で仕上げてください。 どなたかよろしくお願いします
328 :
デフォルトの名無しさん :2007/04/29(日) 00:36:08
失礼しました。>327の期限は4月30日の23時59分までです
329 :
デフォルトの名無しさん :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; } を元に作ってください。本当に失礼しました
331 :
デフォルトの名無しさん :2007/04/29(日) 00:53:11
[1] 授業単元:情報数学基礎 [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] その他の制限:特に無し
>>326 #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;
}
>>331 アルゴリズムが分からん……。
正方形に分割してやれば、おのずと合同な三角形にはなるのかな?
[1] Algorithms
[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;
}
という風に作るやり方がよくわからないのでそれだけでもご教示願えたら
物凄く有難いです。
>>336 list.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構造体の関係と、何を聞きたいのかが不明確かな。
リストというデータ構造を調べてくると良い。
二分木と線形リストは参考としてあるのかな?
しかし、リストの中にリストがあるというのが解釈するのに難しい。
例えば、市内に存在する学校のリストがある。
そして、学校のノードにはその学校に在学する学生のリストがある。
――という解釈でいいのか?
そもそも、二分木と線形リストは自分でできたということだから、
>>336 が分からないというのは、char *nameの扱いのみということでいいのか?
>>337 list.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の扱いだけでもヒントかなにか貰えたら
物凄く助かります。
>>339 あんまり確認せずに条件反射レス
#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;
}
strdup()使うと楽なんだけどな
>>339 今書いてるコードがよくわからんからあれだが
node_ptr->name =(char *) malloc(strlen(buffer) + 1);
strcpy(name,buffer);
↓
the_list->name =(char *) malloc(strlen(buffer) + 1);
strcpy(the_list->name,buffer);
とかいう落ちってことはないよな・・・
こんな感じか。
#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)
じゃないとダメか。
うpロダ使ってくれい
345 :
339 :2007/04/29(日) 18:23:13
346 :
デフォルトの名無しさん :2007/04/29(日) 18:45:08
>333 >334 遅くなって申し訳ありません。 本当にありがとうございました。
[1] 授業単元: C [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まで] または [無期限] のいずれか)月曜日まで
350 :
332 :2007/04/30(月) 00:34:40
ワロタ
>>351 問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が間違ってる気がする。
問2 Person family[N]; int count = 0; for(i=1; i<=N; i++){ if(family[N].sex == female) && family[N].marstatus == single) {count += 1;}}
> char** name; char** fastname; これはchar* name; char* fiastname;だな。 二重に恥ずかしい間違いだ。
>>353 返事が遅れてしまい申し訳ありません。
助かりました。これを元に一から考え直してみようと思います。
ありがとうございました。
>355 fiastの方が恥ずかしいだろ
計算式は分かったけど、針が平行線に交わった回数の数え方が分からん
簡単のためL=H=1とすると、
>>349 のリンク先からπ=2/p
rand()なんか使うなはともかく、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);
}
かぶったか……
>>364 仕様の部分やエラー処理で不具合があったので
再度掲載させていただきました。よろしくお願いします。
あ、円周率使ってよかったんだ…
>>365 どのへんに問題あったのか書いてくれないの?
一から作るのめんどい
>>369 解凍後の表示がされないのと、エラー処理の2つ目です。
よろしくお願いします。
>>367 「期限」の意味わかってる?
普通は「遅くても5/7まで」とか書くんだよ?
あぁ〜すまん、*に続いて数字の部分がなってなかった。*が入ってたらエラーになってるから *の後ろに数字が来たらという条件に直しておいて
って、さらに*****が続いたときの解凍がうまく出来ていないや・・・ちと書き直してくるw
[1] 授業単元: C言語 [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まで] または [無期限] のいずれか) 今日中
まず、用語がむずいんだよな。
>>362 あー針の下端が針に一番近いラインより下にあれば交わってるってことか、面白いなぁ
>>379 boostのmt19937を使ったけど一向に収束しねえなw
>>378 公式?
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
パンッ!
383 :
初心者 :2007/04/30(月) 23:05:11
#include <stdio.h> #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--がなくても正常な結果がえられると言うのですが僕にはそのプログラムが作れません。 どうか、作ってはいただけませんか?? お願いします。
>>381 その公式どおりやるとPkが4294815800程度になるので
√(1-Pk^2)の部分がエラーになっちゃうんだけど
>>383 すげー醜い、すれ違い、清書したものをうpロダにうpして出直し!
>>383 初心者でもこれは酷すぎる
改行インデントくらいしろ
俺も初心者だけど、ここまで酷いソースにはできない
>>386 またお前か、それについてgdgd言うけど、ここに書く際に改行を省略しただけだろ。うるせーんだよ
ろくに答えもしないくせにソース批判しかしないボケは
いや、ここに書くことを踏まえてもこいつはひどすぎる
389 :
247 :2007/04/30(月) 23:36:23
254様 ありがとうございます。 今まで書き込みが規制中やらで書き込みができませんでした。
>>383 while( j==n ){P[i]=0;j=P[--i];Q[i][j]=0;P[i--]++;}
こういうこと?
391 :
初心者 :2007/05/01(火) 00:02:19
392 :
362 :2007/05/01(火) 00:04:12
>>362 get_floorがダメだ。
return n*floor(x/n);
に直しといて。
393 :
362 :2007/05/01(火) 00:05:42
>>391 j == n になることってあるのか?
>>391 確認だけど、今現在は正しい結果が得られるの?
で、ループの中からi--を消せばいいの?
あとスレ違いなんだけどそこは理解できた?
395 :
デフォルトの名無しさん :2007/05/01(火) 00:11:23
>393 理屈ではありえないとは思うんですが、実際に条件をn-1にすると実行できません >394 一応正しい結果は出てます。 二番目のwhile文のなかのi--を消したいのですが スレ違いですか、すいません
>一応正しい結果は出てます。 とりあえず以下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とか
>>397 抽象化した結果表現されるものは、設計者が想定した概念やイメージだ。しかし、
実在するものそのものではなく、人が考えたものであるために、このイメージは
非常に脆く、不安定だ。外部からの影響をもろに受け、形を変え易い。個々人が
持つイメージの些細な相違から認識のずれが生じ易い。扇風機の使い方は人に
よって異なることはないが、人がイメージしたものは、その生成から、破棄に至る
まで、非常に不安定な状態になり易い。それを防ぐには、イメージそのものをなる
べく強固なものにし、インターフェースに一貫性と整合性をもたせ、外因による影響
を受けに難くく、壊れ難くするための技術を見につけ、理解を深めておくしかない。
仮想化とは対象物を不完全ながらもその性質や姿を模倣し現出させることだ。
対して抽象化は、対象物のある特徴的な側面を抽出し概念化することだ。
仮想化で抽象化の技術が使われることはあるだろうが、その逆は考え難い。
コンピュータを使い、扇風機やコタツを抽象化することはできても、仮想化する
ことはできないのだ。少なくとも今の技術では無理だ。コンピュータがその姿形
を変えることはできないのだから。コンピュータが仮想化できるものは、コンピュー
タそのものが直接扱うものだけだ。例えば、仮想メモリ、仮想ネットワーク、仮想
マシン、仮想キーボードといったものだ。
400 :
デフォルトの名無しさん :2007/05/01(火) 01:34:17
[1] 授業単元:プログラミング [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に入れる。 お願いします。
#include <stdio.h> int 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; }
>>400 #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;}
403 :
401 :2007/05/01(火) 02:21:54
そうか、C++か。
>>401 はなかったことに……。
C言語スタイルで記述したソースもC++コンパイラで通るのであれば 拡張子をcppにしてコンパイルすればC++のソースとして使える だっておーー(バンバンAA略)
もういいよ荒れるから・・・
実際その通りだろ。 それがスタンダードかどうかは別として。
いや、すまん、要約すると そのソースをC++として扱え と遠まわしに言っただけでつ orz
また基地外K○s○k○b○が来るからやめよーぜ
ようわからんけど、キモメンメガネデヴピッツァ?
よく覚えてないけど
>>402 をC++っぽく直すとこんなかんじかな?
配列を使うこと自体がメモリ配置を意識してしまって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;
}
411 :
デフォルトの名無しさん :2007/05/01(火) 14:46:02
[1] 授業単元:C言語入門(Linux) [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] その他の制限:特にありません。 丸投げでよろしくお願いします。
>>384 公式は教科書のだから合ってると思うんですがorz
[0,1]の乱数でそうなっちゃいますか??
符号なし 32bit の変数 a と b があります。 >> unsigned long a; unsigned long b; a と b には任意の値が格納済みであるとして、加算するとオーバー フロー(0xFFFFFFFFを超える)の場合、"Overflow"、オーバーフロー しない場合、"(a+b) OK" を出力するプログラム 教えてください 条件: if((a + b) > 0xFFFFFFFF) の判定は使えません。 if((a + b) <= 0xFFFFFFFF) の判定は使えません。 a と b を加算してはなりません。
ヒント:移項
0xFFFFFFFF - a < b ではいかんか?
[1] 授業単元: データ構造論(C言語) [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] その他の制限: 特にありません。 まったく覚えていないので、誰かお願いします
よくわかりません。 #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; }
T[100]は蜃気楼です。
3の倍数なら for(i=0,r=0; i<k; i++) r += n[i]; if(r%3==0) …… ってした方が簡単じゃね?
3の倍数って不思議だな
424 :
418 :2007/05/01(火) 23:17:15
#include <stdio.h> int 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; }
>>424 配列を使うんならこうか?
#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;
}
428 :
デフォルトの名無しさん :2007/05/01(火) 23:59:03
[1] 授業単元: プログラミング [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 お願いします
>>428 #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;
}
突っ込みどころのある解答をする奴は荒らしを呼びたいの?
ジャニーズじゃあるまいし
432 :
429 :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;
}
436 :
デフォルトの名無しさん :2007/05/02(水) 01:18:49
[1] 授業単元: プログラミング [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 よろしくお願いします。
>>436 includeは消してるから勝手に補完してくれ。後、エラー処理も面倒だからやってないから要注意な
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;
}
>>436 便乗
#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;
}
439 :
438 :2007/05/02(水) 01:49:49
limits.hはいらないわ。 駄目すぎだ……(´・ω・`)
>>438 バブルソートも掛けてるのか。律儀だなw
しばらくlimits何処で使ってるんだ?と悩んだ
441 :
デフォルトの名無しさん :2007/05/02(水) 01:54:07
>>429 >>435 ありがとうございますところでiostreamとかcmathは習ってないんですがstdio.hとかmath
じゃできないでしょうか?
>436 じゃ、俺も #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; }
>441 >[3.3] 言語: C++ どういうことよw
だれもintの配列だなんていってないから みんな不正解です^^
445 :
429 :2007/05/02(水) 01:58:59
うわああああああああああああああああああああん。
寝る。
>>441 のことは任せた。
哀れすぎる…
447 :
デフォルトの名無しさん :2007/05/02(水) 02:05:43
448 :
デフォルトの名無しさん :2007/05/02(水) 02:07:30
>>443 え?Visual Studio6.0 Visual C++ってのを使ってんですけど見たこと無いもんで…
iostreamとかcmathは使わないとできない問題ですか?
450 :
436 :2007/05/02(水) 02:29:05
みなさんどうもありがとうございます。勉強になります。
451 :
デフォルトの名無しさん :2007/05/02(水) 03:09:38
[1] 授業単元: C++ [2] 問題文:arrayに含まれているばらばらになったアルファベットを順番通りにする。 [3] 環境 [3.1] OS: stupid Windows [3.2] gcc 3.4 [3.3] 言語: C++ [4] 期限: 記入時から5時間後。 ここまで出来ましたが、なぜか20文字のうち5文字しか表示されません。どちら様かオーバーホールをお願いします。
452 :
デフォルトの名無しさん :2007/05/02(水) 03:11:38
#include <iostream.h> #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;}}}}
>>452 sizeof(*Alpha)→sizeof(Alpha)/sizeof(*Alpha)
>>453 おれならこう書いちゃうな
(前略)
Sort(Alpha, ARRAYSIZE);
(中略)
for (k = 0; k < ARRAYSIZE; k++)
(後略)
>>435 Pk = 12/n×Σ(Xi × Xi+k) -3
書き方悪かったですか??
公式は確認しましたorz
457 :
デフォルトの名無しさん :2007/05/02(水) 07:14:02
昨日の418です
>>426 さんのがそれっぽいので今日行って確かめてきます
皆様どうもありがとうございました
459 :
デフォルトの名無しさん :2007/05/02(水) 13:01:59
[1] 授業単元:プログラミング [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++です。 皆さん、どうかお力添えよろしくお願いします。
461 :
デフォルトの名無しさん :2007/05/02(水) 14:00:29
テーマ:判断処理(if文) 2人の得点を入力し勝者を表示しなさい 実行画面 aさんの得点==>200 bさんの得点==>150 aさんの勝ち aさんの得点==>100 bさんの得点==>250 bさんの勝ち aさんの得点==>120 bさんの得点==>120 引き分け 何方かわかる方がいましたら教えてください(ノ_<。)
>>455 多分、Pk < 1 にならなきゃいかんと思うのだけど、
その公式じゃ、n = 2000000 で k = 1〜10 だと Pk < 1 になってくれない。
463 :
デフォルトの名無しさん :2007/05/02(水) 14:25:50
@学生番号、英語、数学、国語の点を二次元配列sに格納する A3教科の合計点を計算す。 B合計点の大きい順に順位をつける intを指定したあとのプログラミングお願いしまず 5分以内でお願いします。
>>460 多分Σの括弧の中はi番目のXとi+k番目のXを掛けてるんじゃないかな
>>441 #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;
}
467 :
465 :2007/05/02(水) 14:35:25
468 :
411 :2007/05/02(水) 16:53:39
>>411 です。
どなたかやってはいただけないでしょうか?
>>377 #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;
}
[1] 授業単元:アルゴリズムとデータ構造 [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枚が最小になる、 みたいな場合があるのでどうすればいいのか分からないです><
474 :
411 :2007/05/02(水) 22:07:00
>>473 具体的にどうやれば良いのでしょうか…
初心者ですいません。
ttp://www.gulf.or.jp/~damayan/data/index.html この辺りにもヒントが出ているけど
name=SUBDIR, size=0, attrib=0x10
name=SAMPLE.DAT, size=207, attrib=0x20
ここの値が(属性とか一切なしの普通の?)ファイルとディレクトリとでは違っていて
ディレクトリだと 0x10 らしいとの内容を
>>469 にある本をさっき立ち読みしてきたときにも見かけた。
ただ、使われているヘッダに dos.h があるんで、これはこれで自分でこのヘッダの中にある
ライブラリを実装する必要性があるかも?
あぁ、あとファイル名は拡張子を抜いて8文字までとか、拡張子が3文字とか言う制約もあったかなぁ・・・
>>411 が授業でどんな内容を習っているか分かれば、それもヒントになると思うのだが
やったことのない俺にとっては、どのように情報を探してアプローチすりゃ良いかさっぱり・・・
>>411 ディレクトリの判別等は確か環境依存のはず
授業単元がLinuxとなっているから、unistd.hの中の奴でできたと思うが詳細は忘れた
478 :
ぶる :2007/05/02(水) 22:39:04
[1] 授業単元:プログラミング演習 [3] 環境 [3.1] OS: WindowsXP [3.2] コンパイラ名とバージョン: [3.3] 言語:C++ [4] 期限:[2007年5月4日正午まで] [5]制限あまり難しいプログラムでなければ(すいません) [問題] 以下の文字のテキストファイルを作成するプログラムを作成してください。 空白、行間隔もそのままでお願いします。 そしてそのテキストファイルの拡張子を「.txt」から「.net」にかえ、デスクトップに出力。 ファイル名は適当でも構いませんがとりあえず「HB.net」でお願いします。 (改行が多すぎのエラーでこのスレに書き込めないので問題文を次のレスに書きます)
479 :
ぶる :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 ↑↑↑↑↑↑テキストファイルの終わり(上の行まで)↑↑↑↑↑↑
480 :
411 :2007/05/02(水) 22:43:28
>>480 うひゃっ、Linux板で質問したほうが良いかも
>>482 宿題をLinux板に持ち込むのは流石にダメだろw
484 :
411 :2007/05/03(木) 00:00:44
>>480 LinuxでやるC言語のクラスなので、Linuxのシステムプログラムよりな課題が多いです。
学部が経営情報学部なので必修で最低2個はプログラミングのクラスを取らないといけないのですが、
前期はJava入門を取り、後期はあいてるクラスが今のクラスしかなかったので取ったのはいいのですが、
アルゴリズム、スタックやスレッドの知識がある事を前提で授業が行われているので、半文系の自分にはきついですorz
参考URI貼るだけじゃあれなんで適当に書いたサンプルコードも貼っとく こんな感じの処理を組み込めばディレクトリの場合だけ(その逆も)なんかの処理をするというのは可能なはず #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; }
487 :
411 :2007/05/03(木) 00:43:25
>>486 ありがとうございます。確認してみます。
>>411 何年生か知らないけど、4年生じゃないなら急いで単位取る必要無いんじゃない。
その講義捨てて来年か次の学期にJava入門の続きか簡単そうな講義取ったほうが良さげ
変な所でエネルギーと時間を浪費せずに、自分の将来の為にエネルギーと時間を使いなよ。
とここでエネルギーと時間を浪費して他人の宿題を解いているNEETが言ってみる。
489 :
411 :2007/05/03(木) 02:03:49
>>488 これが最後の課題なので、どうにか… といったところです。
>>486 コードを入れてみたのですが、上手く動きませんorz
>>489 うまく動かないってのはどういう風に動かないんだ?
最後の課題ってまだ五月になったばっかりだぞ・・・
集中講義とかなんでないの
GW中の? 大変だな・・・
494 :
459 :2007/05/03(木) 09:14:17
>>470 ありがとうございます。
大変に役に立ちました。
495 :
デフォルトの名無しさん :2007/05/03(木) 09:16:28
496 :
デフォルトの名無しさん :2007/05/03(木) 09:18:50
main.c(58) : warning C4553: '==' : 演算子にプログラム上の作用がありません。'=' を意図しましたか? main.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 度も使われていません。
main.c: In function `success': main.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のほうが賢いな
>>481 はい、そうです。
そしてそのテキストファイルの拡張子を「.net」に変換して出力するプログラムを作りたいんで(ノд`)
501 :
デフォルトの名無しさん :2007/05/03(木) 10:20:00
>495 条件に合うのであれば作り変えてもらってもかまいません。
502 :
デフォルトの名無しさん :2007/05/03(木) 10:31:11
503 :
デフォルトの名無しさん :2007/05/03(木) 10:32:05
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; break; } } while( j==n ){ P[i]=0; j=P[--i]; Q[i][j]=0; P[i]++; i--; } } でいいんぢゃねの?
506 :
411 :2007/05/03(木) 12:32:59
留年がかかってるとか言われると逆にやる気無くなるな バレたときの責任とかとれないし
508 :
411 :2007/05/03(木) 12:37:42
>>490 [root@network root]# ./two d (この場合、ディレクトリです。)
とコンソールで入力しても
"path" is file or something else
と表示されます。
この課題の場合、ディレクトリ名を入力した場合、
中のファイルがすべて表示されると同時に、サブディレクトリも表示されるように作らなくてはいけないので、
そうなってくると、ちんぷんかんぷんです…。
>>504 おれは495じゃないけど
その変更だと何も表示されなくなったぜ?
配列の添え字にマイナス突っ込んでる状態は改善されたが
510 :
411 :2007/05/03(木) 12:44:25
>>507 海外の大学なのでその辺りは大丈夫です。
海外だとGW関係なしか 大変そうだな
欧米か!
海外ってどうせ北海道とか九州の話なんだぜ
515 :
411 :2007/05/03(木) 12:58:56
>>511 はい。授業が後二日で終わるのでそれを過ぎたら0点になってしまうのですorz
「留年」といった具体的な概念はないのですが、これが出来ないと5月半ばに卒業する予定が、
冬になってしまうので正直、かなり焦っています。
>>512 欧米ですね。
break life;
なんでかわからないけど「代理受験」って言葉が浮かんだ。
今日中って何時まで?
【質問テンプレ】 [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] その他の制限: 特に無し。 よろしくお願いします。
[1] 授業単元: プログラム演習 [2] 問題文(含コード&リンク): 下記の仕様に沿った数字判定プログラムを作成しよ。 ・入力文字列の最大文字数が10文字とする。 ・数字か、文字かの判定ができる。(入力に1つでも数字以外のものがあれば数字とみなす) ・数字の場合は正数か負数かの判定もする。 ・文字入力関数、入力判定関数を作成、判定結果はmain関数で表示する。 ・入力エラー時(文字数オーバー、何も入力されていない)は、再入力を促す。 [3] 環境 [3.1] OS: WindowsXP [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 2007年5月5日 [5] その他の制限: 特になし よろしくお願いします。
>>519 #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;
}
>>521 int 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;
}
#include <stdio.h> int 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++だったことに気付く、と。
>>520 >・数字か、文字かの判定ができる。(入力に1つでも数字以外のものがあれば数字とみなす
「数字とみなす」でいいの?
525 :
523 :2007/05/03(木) 16:47:34
>>525 べ、べつにわかってたんだからねっ
あんたなんかと一緒にされるぐらいなら死んだ方がマシよ!!
ばかばかばかー!
528 :
519 :2007/05/03(木) 16:49:57
>>521-523 ありがとうございます。
Cは使ったことないのでよく分かりませんが、調べてやってみます。
>>411 の課題は意図が解せんから何か作る気が起きないんだよな
入力例とかをみるに、引数として指定されたディレクトリ一つ一つに対して
それぞれスレッドを作って処理しろって事なんだろうが
そんなことしたら表示が無茶苦茶になると思うんだがな
1ディレクトリにつき1スレッドってことかな 表示する順番は同期とれってことだろう と出題者になったつもりで名推理してみる
531 :
523 :2007/05/03(木) 17:10:19
制限なしなら各ディレクトリでsystem("ls -a");とかw
>>528 本当はswap使うべきところを無駄に混乱させる為に
心を鬼にしてXOR交換にしたから、頑張ってくれ
>>472 はむずいぞ。
昨日から考えてるけどサッパリ。
>>472 計算量がでかくなっても良いならやりようはあるんだけどな
>>534 総当たりみたいなもんになるが、こんな感じ
脳内シミュレートではうまく動くはずだが、計算量がかなりでかくなる
もっとも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) 最小の枚数となっている物を↑の結果から選ぶ
536 :
504 :2007/05/03(木) 17:40:26
クイーンの数を入力しなさい 8 10000000 00001000 00000001 00000100 00100000 00000010 01000000 00010000 それらしく動いてる気がする
537 :
519 :2007/05/03(木) 18:06:47
>>521-523 プログラムを理解するのに時間かかりましたが、何とかできました。
ありがとうございました。
538 :
デフォルトの名無しさん :2007/05/03(木) 18:06:58
>513 再度checkする方法ではどうプログラムすればいいですか??
>>520 って、よく見たら
> 文字入力関数、入力判定関数を作成
これやってなかった・・・適当に自分で分けて作っておいて orz
>>535 なるほど・・・
自分は、n番目のコインをとれるだけとって、残りのn-1枚で再帰
n-1番目のコインをとれるだけとって、残りのn-2枚で再帰
n番目から取ったときとn-1番目から取ったときで比較し、少ないほうを採用
次にそれとn-2番目から取ったときと比較…
って感じでやる方法しか思いつかなかったのですが、
これ上手く書けるのかなぁ…とか思ってました。(しかもこれで最小になるのか?)
もしよろしければ、そのプログラム書いていただけますか?><
543 :
504 :2007/05/03(木) 18:46:19
ちょっと変えてみた for(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; } }
>>541 main 関数の中の sz の初期化を間違えた。 sz=sizeof(buf)/sizeof[buf[0]); にしといて orz
545 :
デフォルトの名無しさん :2007/05/03(木) 19:24:56
[1] プログラミング (C言語) [2] 問題 コインの枚数を最小にする (詳細) C[1]〜C[n]までのn種類のコインがある。入力としてxを入れたときコインの最小枚数を求めるプログラムを書け。 色々考えたけどなかなか思いつきません 日本のコインなら大きいものから順番に取ればいいと思うんですが… よろしくおねがいします
x(総金額?)を満たす最小の枚数を n種類から選べって事?
素因数分解を応用すればいいんだよ
>545 >472
549 :
デフォルトの名無しさん :2007/05/03(木) 19:45:06
たとえば1、10、25って3種類のコインがあって、44と入力すれば8を答えとして返すということ? (10*4+1*4=44)
>>549 472ですけど、そういうことです。。
549さんと同じとこだったりしてw
>>472 枝狩り一切無し
#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;
}
552 :
デフォルトの名無しさん :2007/05/03(木) 20:29:24
式で書くとこれだけなんだけど・・・ Ck 硬貨の種類 Ak 枚数 m 入力 として、 条件 n Ck Ak = m k=1 n min Ak k=1
数学はエレガントなのにC言語の泥臭さときたら……
ベタに全解探索して、その中から最小枚数の解を求めるしかないんじゃないかな。
最小値だけ保存すればいいし大きいほうから検索すれば結構刈れるだろうから(その時点の最小値を越えた場合はそこで終われる) 宿題レベルとしては十分だろうね
>>472 ごめ、配列名見落としてた
main 関数の中の kind を全て A に置換しておいてちょ
AつかCね。スッパプログラマも読み違えるんだなぁ
559 :
472 :2007/05/03(木) 20:50:02
>>551 coin_check内のforの処理が頭いいなー。
561 :
デフォルトの名無しさん :2007/05/03(木) 21:09:47
>>551 うわぁー。すごいけど、プログラム超初心者なのでなにをやってるのかよくわかんないんです><
議事コードで説明してくれる人いたら教えてください
562 :
561 :2007/05/03(木) 21:11:07
擬似コード でした
563 :
472 :2007/05/03(木) 21:12:03
564 :
ぺこちゃん :2007/05/03(木) 21:31:07
#include<stido.h> void 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); } どこが間違えているか教えてください!!
pi += sizeof(int); ↓ pi++;
ボケる前に答えるなよヽ(`Д´)ノ
stido.h
569 :
520 :2007/05/03(木) 21:37:06
570 :
ぺこちゃん :2007/05/03(木) 21:41:23
2問目です。すいません。訂正個所はどこでしょうか? #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 ); }
>>570 int *pi = (int *)malloc( sizeof(int));
int 1個分しか確保してない
int *pi = (int *)malloc( sizeof(int):*100);
にする
573 :
ぺこちゃん :2007/05/03(木) 21:43:32
あーなるほど、大変助かります。
575 :
ぺこちゃん :2007/05/03(木) 21:49:15
3問目です。全部で5問あります。 どうぞよろしくお願いします。。。 #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); } }
>>575 残り2問はまとめてうpろだにあげろ
分割する意味がわからん
>>505 戻り値の値をきちんと返せばOKっぽい。
もしくはdoubleではなくvoidにするか。
>575 は質問の意図がわからんな ・ループでまわした数分確保したい、のか ・同じ変数に別の領域を割り当てる前に開放すべきである、か どっちだ?
579 :
ぺこちゃん :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; }
575ってメモリリークじゃないの?
581 :
ぺこちゃん :2007/05/03(木) 22:02:45
問題はプログラムの誤りを修正することなのですが、さっぱりわからないので・・・ 解説していただけたら助かります。。。すいません。。。
>>579 char Upper[MAX_CONVERT_LENGTH + 1];
↓
static char Upper[MAX_CONVERT_LENGTH + 1];
583 :
ぺこちゃん :2007/05/03(木) 22:10:32
最後でございます。面倒でも是非お願いしますm(_ _)m #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]); } }
>>579 UPPER[nUpperldx] = toupper( *pc );
↓
Upper[nUpperldx] = toupper( *pc );
こうですか?
586 :
ぺこちゃん :2007/05/03(木) 22:18:17
PGの世界ではこのくらい朝飯前くらいでしょうか??
PGになりたくて独学していますが、どのような勉強方法が
最適かわからないので、是非教えて下さい。
>>584 は「入力ミスでした。申し訳ありません」
最適な勉強法:こういうところに丸投げしないで自分で考える。
ヒント:あきらめる
ちゃんと仕様書に目を向ける、なるべくANSI、ISO準拠の参考書を見る
[1] 授業単元: プログラミング
[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] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々)
>>586 マジレスするとコミュニケーション能力。
594 :
デフォルトの名無しさん :2007/05/03(木) 23:50:23
代筆家とプログラマは違うと思う
>>593 またお前か。相手と意思通じがうまくても自分が基本を理解する能力がなきゃ
「プログラマー」となるのは難しいぞ。
プログラマ職で雇用されても雑用しかやらないもんな プログラム組みたいならやっぱ生産性の高さとなにより他の人に出来ない事が出来るってのが武器だよ
ぶっちゃけ、相手との意思通じが重要なのは複数でプロジェクトを組むときだろ。 各々の割り当ては与えられた課題を理解することが重要。 自分が作ったライブラリないしモジュールは、汎用性があれば他人のソースの一部に 目的がきっちりと果たせていればそのまま引用できるし。変な使用や汎用性がない ソースだと、それに応じて書き直さなきゃならんぞ。
598 :
デフォルトの名無しさん :2007/05/04(金) 00:18:15
コンピュータとのコミュニケーション力がまず必要。
コミュニケーション能力さえあればなんとかやっていけるさ 教えたがりがどこにでもいるからな
>>598 うまい、座布団10枚で海外旅行の懸賞を与えよう
>>538 >再度check
上の方でやったcheckを再度やるんだ。単にコピペするだけ。
同じの2回書くからあんまりいいコードじゃ無いんだけど。
よくわからなかったらgoto使うやり方でいいんじゃない?
変更が最小限で済むし。
[1] 授業単元:ツェラー [2] 問題文(含コード&リンク):万年歴の作成 [3] 環境 [3.1] OS:XP [3.2] コンパイラ名とバージョン:VS2005 [3.3] 言語: C お願いします
604 :
デフォルトの名無しさん :2007/05/04(金) 05:16:15
[1] 授業単元: プログラミング [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] その他の制限: 特になし お願いします
>>604 #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;
}
606 :
478 :2007/05/04(金) 12:52:25
すいません478なんですが…期限が明日まで延びたので。以下の内容のテキストファイルをデスクトップに出力するプログラムをVisualC++でお願いしますm(_ _)m拡張子を「.net」に変換するようにお願いしたいです(ノд`) * 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
>606 以前の誰かの繰り返し質問になるかもだが、 いったん 〜.txt としてデスクトップに出力しないといけないのか? 最初から 〜.net としてデスクトップに出力するのではなく?
608 :
デフォルトの名無しさん :2007/05/04(金) 14:43:53
609 :
デフォルトの名無しさん :2007/05/04(金) 17:23:42
610 :
デフォルトの名無しさん :2007/05/04(金) 17:34:36
URLに関西2ちゃんねらーとかジョイフルとか いろいろと恥ずかしくないか?
612 :
478 :2007/05/04(金) 17:45:35
>>607 すいません、俺の理解不足だったかも…
要はテキストで「.net」ファイルを開いた時にその内容のものが書けてればOKなんです。
上の内容の「.net」で出力出来れば大丈夫です。
[1] 授業単元: プログラミング [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; のこりは下です
} p = *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}
pdfめんどくせえwww
>614 ちゃんと写せてる?
>>592 とりあえず大学で数学を真面目に学んでかつプログラミングもできる勇者をゆるりと待て
621 :
505 :2007/05/04(金) 23:54:05
>>577 遅くなりましたが、そちらのヒントを見てからしばらくやってみたところできました
一つ前の課題でずっと関数はdoubleを使っていたので、今回もそのままdoubleを使ってしまい全く気づかず悩んでいました
ありがとうございました
>>592 とりあえず、用語と手法の説明が必要。nとかRとかが何を表すのかも。
[1] 授業単元:配列化 [2] 問題文(含コード&リンク): 名前/理科の得点/社会の得点/英語の得点を、持つ構造体を定義して、 各教科の最高得点者の名前を表示するプログラム [3] 環境 [3.1] OS: XP [3.2] コンパイラ名とバージョン:visual c++ [3.3] 言語:C 御指導お願いします
624 :
デフォルトの名無しさん :2007/05/05(土) 04:23:09
[1] 授業単元: プログラミング [2] 問題文(含コード&リンク): √5の値をニュートン法で小数点5位まで求めよ。 [3] 環境 [3.1] OS: (Windows [3.2] コンパイラ名とバージョン: Visual Studio2003 [3.3] 言語: C [4] 期限: 5月9日 [5] その他の制限: とくになし
>>624 >>605 の
double f(double x){return x*x*x-4*x+1;}
を
double f(double x){return x*x-5;}
に変更
>>623 #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);
}
>>623 ごめんなさい
#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;
}
628 :
sage :2007/05/05(土) 08:05:12
>>623 #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;
}
>>624 #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;
}
630 :
626 :2007/05/05(土) 12:34:32
>>627-629 ありがとうございます。
ハルヒというのが気になるのですが
名前はなんでもいいのでしょうか?
[1] 授業単元: プログラミング演習 [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] その他の制限: 特にありません お願いします
>631 複数ってのは最低3つ? 閉じてない場合はどうすんの?
最低3つでいくつ入力するかもプログラム実行時に入力させる形です 閉じてないっていうのがよくわからないけど それを考えることで複雑になるようなら飛ばしても大丈夫だと思います
交点の意味がいまいちわからん。 直線に囲まれた領域の格子点を求めるってことじゃないの?
もしくは、領域内に存在する“点”のことジャマイカ?
637 :
636 :2007/05/05(土) 13:43:50
整数の点ということで。
交点の座標を出力するということでした、
>>635 の図だと
(0.000 , 2.000)
(0.000 , 3.000)
(0.600 , 0.800)
・
・
・
という感じに
説明不足ですみません
[1] 授業単元:プログラミング [2] 問題文(含コード&リンク): 15パズルを作る。 ランダムでピースを配置する。 パズルの完成も判定せよ。 キー入力関数は提供するモノ(15p.cpp内の関数)でOK。 [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: VC 2005 [3.3] 言語: C [5] その他の制限: ピースをランダムに配置 完成を判定 キー入力関数は提供するモノ良い 先生、おながいします
エスパーの登場が期待される
一度でいいから3pやってみたい まだ童貞だけど
>>638 だとすると不等号は全然関係なくて、
3つ以上の直線の交点を全て列挙する
→ 3つ以上の方程式のうち、任意の2つを
連立したものの解をすべて列挙する
ってことなのかな?
>>643 えっと、連立不等式だから領域が出ると思うんだけど
交点のうちでその領域にある(不等式の条件を満たす)点の座標を出力するという形だと思います
>>644 あ、理解。
>>643 で列挙した点のうち、与えられた不等式をすべてみたすものだけ
出力すればいいってかたちになるのね。
>>645 そういうことです
説明下手ですまんかった
648 :
デフォルトの名無しさん :2007/05/05(土) 18:09:29
催促するようで申し訳ありませんが
>>609 の課題が分かる方いましたら
よろしくお願いします><
そういや、前スレだか前々スレだかに 催促したい人は未回答問題のリストを作れ、とかいうルールがあったな。 今はなくなったのかな?
解答する方としては未回答問題のリストを作って貰えると嬉しいけど そんなルール作っても守る奴居ないよな。正直、催促してもらえるだけでも 見逃した未回答問題に気付く事が出切るからありがたい。 まあ、回答が無い問題と言うのは、難しい専門用語に説明が無かったり 重要な式、情報が抜けてたりして回答しようにもムリポな事が多いから 催促する前に、十分な情報を提供したか確かめて、情報不足くなら 解説付けるとか参考になるリンクを貼って欲しい。 と言うか、問題を投稿する時に十分な情報を出せ!!
651 :
デフォルトの名無しさん :2007/05/06(日) 01:53:06
652 :
デフォルトの名無しさん :2007/05/06(日) 02:08:52
>>651 stackを使って書かないといけない、ということを忘れてました。すみません
654 :
デフォルトの名無しさん :2007/05/06(日) 02:48:04
655 :
デフォルトの名無しさん :2007/05/06(日) 05:16:04
[1] 勉強 [2] 非再帰マージソート [3] 環境 [3.1] Linux [3.2] gcc [3.3] C [4] 2007.5.6 [5] 出来るだけ初心者っぽく、初心者にも説明できるようお願いします。
656 :
デフォルトの名無しさん :2007/05/06(日) 05:34:16
[1] 授業単元:情報処理 [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");}
>>656 問題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;
}
>>656 問題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;
}
答えてるやつ同じ人じゃねーの?
[1] 授業単元: プログラム演習 [2] 問題文(含コード&リンク): テキストファイルを読み込み、TAB文字を除去したコピーファイルを作成する プログラムを作成しなさい。 コピー元テキストファイルにTAB文字が使われていた場合、コピー先ファイルには TAB文字をコピーしない。 main関数の引数として、コピー元ファイル名、コピー先ファイル名を入力させる。 コピー元ファイル名で指定されたファイルが正常に開けない場合 エラーメッセージを出力し、プログラムを終了する。 コピー先ファイル名で指定されたファイルがすでに存在する場合は上書きを行うか 否かを問い合わせる。この問いに対してユーザの入力が"y"か"Y"の場合は上書きを それ以外は何も行わずプログラムを終了する。 [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 2007年5月8日 [5] その他の制限:特になし よろしくお願いします
661 :
631 :2007/05/06(日) 09:31:19
>>660 移植性の無いコードになった。cygwinならOKだがmingwではだめかも
#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;
}
[1] C言語(プログラミング) [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つあります、よろしくお願いします
>>667 1.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;
}
>>667 1.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;
}
[1] 授業単元: プログラミング [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] その他の制限: 特になし 宜しくお願いいたします。
672 :
デフォルトの名無しさん :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} },コ\ / 〉
>>671 向こうでも聞かれてたが、表示するプログラムなのに表示しなくてもいいとはこれ如何に
>>673 「表示するプログラム」、というより
「表示の前段階までを処理して実際の表示は行わないプログラム」
って意味で書いたつもりでした。
友人の友人の課題が私のところまで回ってきて、
課題文も原文のものではないので
かなり分かり難い表現になってしまって申し訳ないです。
>>674 あぁそういうことね。けど全部表示するアルゴリズムって言っても1足して表示して、また1足してryしかない気がするけどな
>>674 その友人は何で君に丸投げ?
俺できるよっとか言っちゃったクチ?
ようは整数を2進数表示させるアルゴリズムを考えろって事かな?
適当に作ってみた はやいかどうかは知らん #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; }
>>676 「俺できるよ」なんて事言って2chに投げるような真似は出来ないですorz
単純にプログラム少しでも触ってる人が俺くらいしか居なかったみたいです。
出来ないって言ってるのに中々諦めてくれなかったので、2chに投げてみた次第です。
友達はネット環境が無くて、自分でやらせることが出来なかったので。
整数を2進表示させるのに加えて、1〜2^30までの数値を全て表示(すると過程した処理)をするようです。
1 11 10 100 101 ・・・ 111111111111111111111111111111 みたいな感じで。
後はprintf等で表示する記述を書けば、上記のように全て表示されるってところまで作って、
10秒程度で実行できるように作らなきゃいけないみたいです。
>>678 表示ありだとそれだけで10秒こえちゃいそうな予感
>>676 >ようは整数を2進数表示させるアルゴリズムを考えろって事かな?
なんか受信したんですか?
>>677 putcharのfor部をコメント潰しして、私の環境で実行したところ、
8秒程度で処理が完了いたしました。
課題の要求を満たすことが出来たと思います。ありがとうございました。
>>679 実際の表示は行わず、処理だけを記述すればいいようです。
確かに表示を行うと数分かかってしまいますね。
>681 2^30ってあるから1000000000000000000000000000000で終わるようにしたけどそれでいいの?
685 :
671 :2007/05/06(日) 16:23:09
>>683 終了の数値の話は友人からしっかりと聞いていませんが、
1000000000000000000000000000000か、111111111111111111111111111111で終了させるかは、
比較演算子の書き換えですぐに変更できるので此方でその課題に合わせて直させます。
[1] 授業単元:プログラミング [2] 問題文(含コード&リンク):文字列Aの中に文字列Bが含まれいるか調べる関数 [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: VC++2005 [3.3] 言語: C [5] その他の制限: strcmpを自作 異常へ対処すること お願いします。
催促するやつは、ついでに回答されてない問題へのレスをリストにしてくれ。
>>686 手抜き+脳内コンパイル
動くかどうかはしらん
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;}
690 :
デフォルトの名無しさん :2007/05/06(日) 17:02:24
>>677 char型つかってる意味が理解できないけど
そのアルゴリズム(・∀・)イイネ!!
内容: [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を入力したら、+を入れた時の表示にしたいです。 こういう処理をするにはどのようにすればいいのか? 色んなサイトを見て廻ったのですが分からないため、書き込ませて頂きました。 書き込み自体初のため色々足りない部分あるかも知れませんが、どうか宜しくお願いします。
アルゴリズムと関係ないところが多いね。 つまり、もっとライブラリの勉強をしなさい、ということだな。 > 整数同士の演算結果を5とか6と表示したい。double型にした時の様に6.000000ではなく。 それは型に関係なく printf("%g") を使えばオーケー。 double型変数 d が 6.00000 でも %g を使えば 6 と出力される。 > C問題文にある0消しのやり方 これも strtod() とかで読めば勝手に消える。 > Bctrl+cが入力されたら時のプログラムの書き方はどうすればいいのか? 何もしなくていいんじゃね?勝手に止まるだろ。 > D6桁目を四捨五入するという処理はどうするのか? %.6g とかかな。 というわけで、ちゃんと読んでないけど、型はdouble型でやるのがいいと思うんだ。
693 :
デフォルトの名無しさん :2007/05/06(日) 17:50:10
('A`) コマンドプロンプトツマンネ
>690 最初は文字を直接入れようと思ってたから。 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++; } //ここで表示 }
処理は速いのにputs使えなくて表示は遅いって悲しいのぅ
いつもROM専なのですが、少々気になったことがあるので、、、
>>691 ,692
%gを使ったことがほとんど無かったので少々調べて見たのですが
指数が-4より小さいとき(0.00001など)は%eの表示になるのと
%.6gだと小数部6桁ではなく全体で6桁になるようです
(%sの扱いに近い? でも小数点はカウントされてない、、、)
なので、調べた小数点以下の桁数をn、値をaとして
printf("%.*f",n,a)
としたらどうでしょうか
桁数判別の方法とかは考えてないので微妙かもですが
ごめん忘れてた。
>>699 に書いてあるように、小数の数値の場合は
6桁が基準で短い方が使われるんだった。
なので6桁にこだわるためには、小数桁を切り出さないといけないのね。
ちゃんとやるなら、sprintf(&tmp, "%f", value) するとかして、
tmpの中の '.' の位置とか '\0' の位置を検索して桁を判定して、
そのうえで四捨五入したりすることになるかな。
[1] 授業単元: C言語 [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日までにお願いします。
#include<stdio.h>
void 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 こんな感じですか?
cahrまでマネせんでも。
#include <stdio.h>
void 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 はコンパイルしてないんで間違ってたらごめんなさい
>>404 すみません課題を最後まで読んでませんでしたw
関数として記述するんですねw
708 :
699 :2007/05/06(日) 21:47:41
>>691 せっかくだから少し回答してみようかと
普段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を入力した時点で今の値を計算するのではなく、
次の演算子が入力された時点で計算すれば、値は保持されたままなので
演算子を入力した後の表示にもっていけばなるんじゃないでしょうか。
と、まぁ、こんな感じでどうでしょうか。。。
計算上の誤差とか無視してたり日本語妙だったりしますが、参考になってれば幸いです。
#include<stdio.h> int main()
>>691 普通にdouble型で計算して
計算結果はsprintfかなんかで文字列に変換して出力すればいいんじゃね?
四捨五入は文字列変換前に0.000005足して、
文字列変換後に小数点以下6桁目をNULLで上書き。
(でももっといい方法あると思う)
Eについては何に困ってるのか良く分からんのでなんともかんとも。
711 :
691 :2007/05/06(日) 22:39:54
色々な参考意見有難う御座いました。 まだC始めて1ヶ月ぐらいなので、ぱっと頭の中にどう書いたら出来るかが出てこない ですけど(汗)。 あと、strtodを使った0消しは、strtodは文字列をdoubleに変換なので、最初にdouble型で入れた数値は 文字列ではないので、一旦適当な配列を作ってそれに、double型として いれた数値を入れてあげてから変換ということでしょうか? 配列にdouble型変数に入れてある数値を代入出来るかどうか分かりませんが。
712 :
699 :2007/05/06(日) 22:48:36
>>710 なるほどその手が、、、
よってさっきのを訂正、あくまで自分が紹介した方法でやるなら、だけど、、、
・値を10の5乗倍→0.5を足す→intでキャスト(切捨て)→10の5乗で割る
負の数の四捨五入も忘れないでね。
>>706 すべてのルートっていうのは任意の頂点から他の任意の頂点への経路ってことなのか?
715 :
699 :2007/05/06(日) 22:58:00
書いてる間に、、、orz
>>711 最初からdouble型で入力を受けたなら、
何もしなくても前後の0は勝手に消えてるかと思います、たぶん
>>713 なんかもう自分失敗しまくりですねホント、、、
先の計算ですが、絶対値で計算してから符号を元に戻せばなる、かな、、、
>>714 a地点からf地点への考えられる全てのルートです。
説明不足ですみません・・・
717 :
デフォルトの名無しさん :2007/05/06(日) 23:33:01
[1] 授業単元: 確率 [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時 期限ギリギリで申し訳ありませんが よろしくお願いします
720 :
699 :2007/05/07(月) 00:13:45
>>706 #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);
}
こんな感じでどうでしょうか
アルゴリズムとか調べず直感で作ったので自信薄ですが
>717 選んだものが当りの可能性が1/3で残ったほうが2/3なのは当たり前すぎて どう書いていいのか分からん。 正直抜き取る処理なんて書くだけ無駄だろ。
>>706 もう解答はあるみたいだけど、せっかく書いたので
#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;
}
724 :
デフォルトの名無しさん :2007/05/07(月) 00:51:37
[1] 授業単元:アルゴリズム
[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] その他の制限:特にありません。
割当の設計がどうも上手く行きません。
どなたかよろしくお願いします。
>>717 こういうことかな?
説明の便宜上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の方が当たる確率は高い
ってことででどうでしょうか?
726 :
725 :2007/05/07(月) 01:08:20
あっ先に答えられてたorz 徒労に終わりましたね、俺・・・ もう寝よ
>>706 720ですが、投稿時に全角スペースが混じった模様、
そのままではコンパイルできないので注意されたし。
あと、いちいち'\0'入れてますけど出力する前に入れたほうが良いことに気づきました
まぁ結果は変わらないですけど。。。
すいません、一つ言い忘れ 配列str2ですが、pが5のときは参照されないので最後の要素は不要です
1] 授業単元: C言語 [2] 問題文 三角形の2辺の長さa,bとその間の角度θ(ラジアン:0>θ>π)を読み込み、 残りの1辺の長さcと三角形の面積Sを求めて表示するプログラムを作成し 適当な数値を与えて実行しなさい。 [3] 環境 [3.1] OS: WINxp sp2 [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 5月8日まで
>>729 エラー処理してないけど、こんな感じ?
#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
>>730 あきらかにcの値が変だな。すまない。
見直しはしていない。
c = sqrt(pow(a, 2.0) + pow(b, 2.0) + 2 * a * b * cos(rad)); ここだな powのあとのやつがマイナスだな
[1] 授業単元:通信工学 [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関数を使った(モンテカルロ法を利用した円周率を求める) バージョンを少しだけ作ってみました。 一応ちゃんとエラーなしで起動して、円周率を表示させられました。 正しい方向性かわかりませんが、下地にして頂けたらと思います。
※上の続き #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; }
736 :
734 :2007/05/07(月) 05:56:44
上の>734書き込みでミスりました [5] その他の制限:3つの2次元配列a[3][3],b[3][3],c[3][3]を宣言し、 配列a,bを3行3列の行列の値で初期化して、各要素の 和を配列cに入れる。 の部分はなしでお願いします。 制限としては、乱数をsrand関数を用いず自作する以外はありません。 よろしくお願いします
>>735 とりあえずこいつが問題ないという前提で、書かれてるアルゴリズムを使った乱数ジェネレータを書いた
これと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;
}
>>737 にミスがあった。使い方はこうな
x=myrand(); y=myrand();
-int myrand()
+double myrand()
-return r/b;
+return (double)r/(double)b;
ミスしすぎだな・・・
>>738 に追加
-static int x = 1;
-int r = a*(略)
+static int r;
+if (!r) r=1;
+r=a*(r%c) - d*(r/c);
>>720 722
お二人のソース参考にしてなんとか仕上がりそうです。
どうもありがとうございます!
741 :
734 :2007/05/07(月) 14:44:13
>739 お手伝い、大変ありがとうございます!! 早速組み立ててみたのですが、エラーはでませんでした。 しかし、円周率が常に4.000400になってしまいました。 しかもcやdの値を変えても変化がありませんでした。 このアルゴリズムに乗っ取ると、こうなるのでしょうか… 組み立てたコードを示させていただきますので、 何か変なところ、 ここがこれだとダメでしょ などのご指摘があれば宜しくお願いします。 ちなみにr0は4119でお願いします。
742 :
734 :2007/05/07(月) 14:46:11
#include<stdio.h> #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; }
乱数になってない
>>734 #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;
}
>734 if(!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();
746 :
734 :2007/05/07(月) 17:11:51
>>745 >>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個の標本値の平均と標準偏差を出しなさい。
というものです。最初に少し解釈しすぎて載せてしまったために、わかりずらくなってしまった
かもしれませんが、すみませんでした…。
>>686 int 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;
}
748 :
744 :2007/05/07(月) 18:21:32
>746 744と745はやってることはほぼ同じ。 ただ745はfor(i=0; i<=imax; i++)をfor(i=0; i<imax; i++)に修正すべきなのを見落としたから 結果が微妙に間違ってる。 そこを修正して744のrnを4119、i_maxを10000にすれば同じ結果になると思うよ。
750 :
ges :2007/05/07(月) 19:30:27
[1] 授業単元:研究室の課題なんですが [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が開いていなければエラー→終了ってのをお願いします。 こんな説明で分かって頂けたら幸いです。
つSendInput
752 :
620 :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); }
753 :
620 :2007/05/07(月) 19:53:02
fout = fopen(argv[2], "r"); if(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");
754 :
620 :2007/05/07(月) 19:54:44
while(1) { data = fgetc(fin); if(feof(fin)) { break; } if(data == '\t') { continue; } fputc(data, fout); } fclose(fin); fclose(fout); return 0; }
>>752 細かいことだが、fin=='\0'はどうかと思うな
そりゃ意図通り動くっちゃ動くが一瞬何事かと思うぞ
で、セグフォが出てる原因だが、char型のjudgeに読み込み指定子%sを使ってるのが悪い
%sは文字列であって、文字列を文字型に突っ込むのはァゥァゥ
>>752 引数が2コより少ない場合もsegvの可能性があるな。
引数の個数チェックはちゃんとやったほうがいいぞ。
[1] 授業単元: C [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時間
759 :
デフォルトの名無しさん :2007/05/07(月) 21:08:31
自分の課題と関係ないやつもちょくちょく見てますが ここは勉強になります
760 :
660 :2007/05/07(月) 21:09:53
>>758 #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);
}
762 :
デフォルトの名無しさん :2007/05/07(月) 22:05:28
[1] 授業単元:C言語
[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の式を解いて来いといわれました
よろしくお願いいたします
763 :
691 :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つが今考えているところです。 やり方が分かる方、知恵を貸して頂けるとあり難いです。
764 :
デフォルトの名無しさん :2007/05/07(月) 22:20:57
内部処理は全てdoubleかなにか、適当な型でするとして、 atof()を使えば数値化できる。strtod()なら切り出しにも便利。 逆に文字列化するには、sprintf()で%.10gでもすればいいだろう。 あー、5桁小数点5桁か。それなら%12.5fで。負の値を扱わないなら%11.5fか。
[1] 授業単元:C言語 プログラミング [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] その他の制限: 走査にはポインタ変数を使用 文字列変換関数を用いない どうかよろしくお願いします。
767 :
デフォルトの名無しさん :2007/05/07(月) 22:31:20
[1] 授業単元: プログラミング演習
[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
>>763 既に数字に変換する方法は紹介されているようなので、その他の解説で
他にいい方法があるとは思いますが、なければ使ってやってください
数字に変換(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です
あ、桁数調べる方法忘れてました、申し訳ない 0消しをした後に小数点の位置を調べて、 先頭と小数点の間隔で整数部の桁数(符号に注意) 小数点と'\0'の間隔で小数部の桁数 が分かるはずです あと、以前に紹介した小数部の桁数を調べる方法ですが、 やはり誤差のせいで上手くいかないようです (double型の変数に適当な値を代入して%.30fなどで出力していただければわかるかと) なので、確実にいくなら文字列の状態のまま桁数を調べた方が上手くいきそうです
CじゃなくてPHPなんですがなんとか教えてもらえないでしょうか? 問題文は テキストファイルとして作成されたnews001.txt news002.txt...etcというファイルを読み込んで タイトルと内容を分かりやすいデザインで表示するphpプログラムを作成する。 演習を行う前にテキストファイルを置くディレクトリをつくりそこに次のような内容のファイルを置く Subject:任意 content:任意 作成順序 まずファイル名を読み込んで全て表示できるようにする。 それぞれを開いてsubject行を表示するプログラムにする 標題と内容を表示するスクリプトにする。 以上です。 PHPに手を出したのですが全く手がでないので途中まででも教えてもらえると嬉しいです。
>>764 #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;
}
>>766 #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;
}
776 :
774 :2007/05/08(火) 08:03:25
is cannot opennedごめんなさい
[1] 授業単元:C++ [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言語が全く手つかずにいます。 どうか、よろしくお願いします。
[1] 授業単元:C言語、MPI [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] その他の制限:特にありません
782 :
781 :2007/05/08(火) 14:30:47
>>781 の参考プログラムです。これをMPIを用いて並列化するらしいのですが、
やり方が分かりません・・。よろしくお願いします。
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 }
29 30 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 }
[1] 授業単元:C言語 プログラミング [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] その他の制限: 文字列操作にはポインタ変数を使用すること どうぞよろしくお願いします。
785 :
デフォルトの名無しさん :2007/05/08(火) 14:52:14
>>784 こうですか?わかりません ><;
#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; }
って、逆順に表示してただけで中身は逆順にしてなかった、スマソ。 ちとやり直してくる。
>>784 #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; }
>>784 786氏が解答してるけど、色々なコードを見た方が勉強になるかな
と思うので貼っとく、と言うか" "のテストしたいだけだったりして
#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';
}
>>789 printf(s) は s中に % あると誤爆するぜよ
あぁ〜〜、gets(ゲッツ!)やってもうた?ダンディ坂野のごとく消えてくで?
792 :
784 :2007/05/08(火) 16:55:08
>>788 >>789 #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
793 :
デフォルトの名無しさん :2007/05/08(火) 16:59:43
#include <stdio.h>〜int main的なプログラムを実行しても『プリコンパイルヘッダーを検索中に不明なEOFが見つかりました。’#include ”stdafx.h”’をソースに追加しましたか?』と表示されます。文は合います。どうすべきですか?ビジュアルスタジオ2005です。
794 :
784 :2007/05/08(火) 17:23:49
gcc -c reverse_string1.c gcc -c test_reverse.c gcc test_reverse.o reverse_string1.o -o test_reverse ってやったら >test_reverse /)`A'(/~otagira arigato~/('A`)/ 上手く取り込めたけど何か最後に変な文字が入ってました。 先生最後の変な文字を strip(str) とかで落としたいです…
>>793 プロジェクト(P)−>(プロジェクト名) のプロパティ(P)...
−>構成プロパティ−>C/C++−>プリコンパイル済みヘッダー−>プリコンパイル済みヘッダーの作成/使用
を"プリコンパイル済みヘッダーを使用しない"にする
>>794 初期化をこうするとか?
char str[256]="/)`A'(/~otagira";
>>794 ってか、文字列をputsやら書式を%sにしてその引数をchar型のポインタで指定する場合は
文字列の終わりを意味する\0が最後に入っていないとおかしな表示にはなるね。
799 :
784 :2007/05/08(火) 17:39:59
>>795 str[15] = '\0'; を追加したら上手くゆきました !
thx!
void rstring(char *str); int 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; } }
)`A'( ってなんか挟まれてつぶれそうな感じだな
802 :
デフォルトの名無しさん :2007/05/08(火) 18:19:09
[1] アルゴリズムとデータ構造 [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] リスト・スタック・キュー
>[3.3] どちらでも可 C++ だと STL 使って終わりみたいな題意外の解がきそうだな
804 :
デフォルトの名無しさん :2007/05/08(火) 18:22:58
>802訂正 [3.3] たぶんCのみだと思います。 すみませんでした。
806 :
デフォルトの名無しさん :2007/05/08(火) 19:20:05
>>805 表示は完璧でした。
あと、自分で入力した数値をスタック・キューで表示できればいいんですが。
>>779 積分のことだと意訳
#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;
}
誤差が……。
>>806 手抜きだけど、こんな感じでいいんジャマイカ
#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);
}
/* 以下略 */
809 :
デフォルトの名無しさん :2007/05/08(火) 19:42:14
>>808 うーん…ちょっとおかしくなっちゃったかな(汗)
バカな俺ですいません。
[1] 授業単元: プログラミング演習 [2] 問題文(含コード&リンク): 配列要素3のキュー構造を以下の実行結果になるように実現せよ。 実行結果は別に書きます。 [3] 環境 [3.1] OS: WindowsXP [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 5月10日 [5] その他の制限:特になし よろしくお願いします。
select no[1.in 2.out 3.end] > 2 (入力) EMPTY (入力) 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 (表示)
812 :
810 :2007/05/08(火) 20:35:19
すみません、outputの括弧内は入力でなく表示でした。 output > a (表示) output > b (表示) output > c (表示)
#include <stdio.h> int 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; }
>>813 ageinとも言ってほしいみたいだぞ。
見逃してた。 printf("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"); } に換えといて。
>>816 「建設的な突っ込み」じゃなくてただのチャチャだけど。
・printf()ならずっと出力整形が楽なのに乙だ
・ループでxに0.01ずつ加算していくと誤差が集積していくので、1を加算して
100で割ったほうが良いかも
・そこのうpろだへのリンクは、さすがにh抜かんでも良いと思う
>>810 #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;
}
819 :
デフォルトの名無しさん :2007/05/08(火) 21:44:45
FOX★公認!!!
俺たちのクリックで日本を一位にしようぜ!!
“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/
>>820 data.txtを作る処理
#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;
}
>>820 問1
#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;
}
>>820 問2 i が使えなかった……
#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;
}
824 :
デフォルトの名無しさん :2007/05/09(水) 13:50:47
次の10このデータを昇順に並び替えて 表示するプログラムを作成しなさい。 一次元配列とソートでお願いします。 15分以内にお願いします。 15 64 86 77 97 11 65 45 38
>>824 #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;
}
827 :
デフォルトの名無しさん :2007/05/09(水) 14:25:52
キーボードより入力した文字を変換(大文字→小文字 小文字→大文字)し表示しなさい 実行結果 文字入力==>A 変換後:a 文字入力==>n 変換後:N 文字入力==>S 変換後:変換できない この文問題わかる方がいましたら教えてください
[1] 授業単元:卒研の課題(shell作成) [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
>>827 もうちょっと詳しく書かないとわからないよ
831 :
デフォルトの名無しさん :2007/05/09(水) 15:59:25
[1] 授業単元:プログラミング実習[2] 問題文(含コード&リンク): 問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までお願いいたします。 必修の授業でプログラミングがあるのですが、毎回課題に苦労しています。 プログラミングを得意になるにはどうしたら良いでしょうか?
>>831 問1.
- int c;
+ static int c;
>>831 問2(flip()のみ)
int flip(void)
{
srand(time(NULL));
if (((rand()+1.0)/(RAND_MAX+1.0)) > 0.5)
return 1;
else
return 0;
}
>>831 問2 中学生なので間違ってたらゴメンなさい
#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;
}
>>833 それならこれの方が良いのでは?
#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;
}
>>835 rand()は多くの場合、線形合同法によって実装されている
その関係で下位ビットのみを使用する方法(剰余とか)では
非常に質の悪い乱数しか得られない
>>836 ご指摘ありがとうございます。勉強になりました
int flip(void){ return (int)((double)rand() / (RAND_MAX+1) * 2); } でいいじゃん。 いちいち関数呼び出すたびに乱数初期化すんのもな。
#include<stdio.h> #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); } のプログラムが動かないんですけど、どこが悪いのか教えていただけないでしょうか?
>839 ここはデバッグするところじゃねーぞ
>>839 fprintf(file_p,"%f ",u[0],);
最後の , コンマが不要
843 :
デフォルトの名無しさん :2007/05/09(水) 19:57:47
[1] 授業単元:プログラミング演習 [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] その他の制限: なし よろしくお願いします
844 :
691 :2007/05/09(水) 19:59:19
お礼の返事が遅れて申し訳ないです。アドバイス本当に有難う御座いました。 アドバイスの御陰で、現在電卓製造がほぼ終盤にさしかかってます。 最後一点だけ ・Ctrl+cが入力されたら、エラーメッセージを表示してから終了させる。 この処理だけが、色々検索かけて分からずじまいです。 通常はctrl+cを入れたらプロンプトでは「^C」が表示されて終了なんですが、 今回の場合はCtrl+cが入力されたということをプログラムに認識させて、その後printfで エラーメッセージ出力なんでしょうが、その認識させる方法がまだ見つかって ません。 方法についてアドバイス頂けませんでしょうか。
>>843 フラグがどうも……
#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;
}
>>844 Ctrl+Cの場合、プログラムにはSIGINTが送られる
これを捕捉してやればできなくはない
>>843 int 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;
}
>>844 力になれたか自信ないですが、とりあえずおめでとうございます
最後の一点についてですが、自分もわからなかったので、調べながら作ってみました
かなりのやっつけ仕事になっていますが、参考(になるか分かりませんが(^^; )にしつつ
いろいろ調べてみてください。
#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);
}
>>845 ,847
dです。
回答を参考にしたいと思います。
[1] 授業単元: ネットワーク系プログラミング [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言語一通り学習程度 自分でも今奮闘中ですが、お願いいたします。 あと、参考書も何か紹介していただけたらありがたいです。
一通り学習してそれなら辞めた方がいいんじゃ?
>>851 僕は、編入でプログラムは初めて。
しかし、単位取らないと卒業できないので…
C言語一通り学習程度向けの講義だそうです。
>>850 オプションの処理が面倒だったから手を抜いた。その実行例は上手く通る
#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;}
マクロで変数の名前を文字列で取得することは出来ますか? wchar_t[]で。
856 :
デフォルトの名無しさん :2007/05/09(水) 23:13:00
857 :
デフォルトの名無しさん :2007/05/09(水) 23:25:11
リンク先のソースをラベル(goto L1…)のないものに書き換えるのが課題です。
whileを使うのかなってところまでしかわかりません。
それと下記のものをコンパイルしようとすると
「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] その他の制限: 特になし
void tohex(int d){ for(;d >= 16;d = d/16)push(d); for(;putchar(hex[d%16]),!stackempty();d = pop()); } >どこか入力ミスでもしてるのでしょうか。 main関数より先にtohexを定義するよろし。
>>858 さん
どうもありがとうございました。
おかげでエラー原因もわかり、もとのものでもコンパイル成功しました。
また、858さんに教えていただいたfor文で書き換えることにも成功しました。
本当にありがとです。
すまない、軽くすれ違いかもしれないけど一応Cの問題なので・・・ 牛乳1パック買っても3パック分(200円)の料金となります。 この牛乳の料金を求める数式っていうのが全くわからない・・・ 本当に私事だけど急ぎで知りたいのですが教えていただけませんか??
言ってる意味がわからん
>>856 ではないけど
>>856 の課題。
iteratorがよくわかんなし・・・誰か助けて・・・
#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);
}
}
void INSERT() { 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(); }
else if (bangou == 1) { 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; }//もうだめぽ。
867 :
デフォルトの名無しさん :2007/05/10(木) 05:31:13
>862 牛乳3パックで1パックの値段になる特売の場合 牛乳の本数をn、合計金額をamountとすると、 amount = (n / 3 + n % 3) * 200; 1パックから3パックまですべて1パック分の値段の場合は amount = (n + 2) / 3 * 200;
868 :
656 :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] 制限:ポインタはまだ習っていません。 起きている方、どうかお願いします。
869 :
デフォルトの名無しさん :2007/05/10(木) 11:42:28
>>802 で、ポインタを利用して入力した数値を
スタックとキューで表示させるプログラムをお願いして、
>>806 のプログラムをやってもらったんですが、
この中のnodeというC言語は習っていないので、
nodeと使わずにするにはどうすればいいのでしょうか?
(int *)malloc(sizeof(int)という形にしたいんです。
よろしくお願いします。
870 :
デフォルトの名無しさん :2007/05/10(木) 12:55:34
習ってないものは使いたくない そしてポインタは習ってないのに(int *)malloc(sizeof(int))を使うとな・・・
872 :
829 :2007/05/10(木) 17:31:51
とりあえず「コマンドライン入力を受け付けて実行可能ファイルを実行できる」 という機能は実装できたのですが、その他がさっぱりです。 どなたかお願いします・・・
>>829 これは「宿題」の規模じゃねぇな・・・
金取る「仕事」のレベルだぞコレ
1年かけたらまぁ作れるレベルでもあるんだろうけどな
>>873 > 1年かけたらまぁ作れるレベルでもあるんだろうけどな
ねーよwwwどんだけ底辺なんだよw
まぁ、自力でできないなら卒業しちゃだめだろ。 来年もがんばれ。
まぁ俺は多分底辺ですよ もう3年の頃から全くついていけてないorz
881 :
810 :2007/05/10(木) 21:24:46
[1] 授業単元:C言語 2] 問題文(含コード&リンク): 二次の連立方程式 ・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日までにお願いします。
884 :
デフォルトの名無しさん :2007/05/11(金) 00:43:52
[1] 授業単元:C++ [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日 夕方
885 :
883 :2007/05/11(金) 00:56:16
883の訂正 ×クラメールの法則 ○クラメールの公式 俺自体がバグってるよ。 あと、変数の宣言のあとに以下の文を入れた方が親切だったな。 printf("ax+cy=e\nbx+dy=f");
> int型の絶対値を取る簡単な方法は無いですか? 簡単ってどの程度のことを言ってるの分からんけど、 fabs使うんなら普通にabs使えばいいんでないか。 libm も要らんしな。
>>886 ふつうの取り方じゃ駄目なんだろw
/*絶対値を返す*/
int myAbs(int in){
return ((in >> 30) | 1) * in;
}
888 :
デフォルトの名無しさん :2007/05/11(金) 01:43:19
[1] 授業単元:プログラミング実習 [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 お願いします。
大学1年です。 [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 お願いします。
>>888 #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;}
>>889 #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;
}
>>891 889です。大変早急にレスして頂いて本当にありがとうございました。
[1] 授業単元:情報実験 [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] その他の制限:申し訳ありませんができれば構造化設計言語でも作成をお願いします
894 :
デフォルトの名無しさん :2007/05/11(金) 04:37:14
>893 Cってなによ?
C言語です
896 :
デフォルトの名無しさん :2007/05/11(金) 04:47:10
カウントCってなによ?
すいません、問題間違ってました [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を表示する 本当にすいません
898 :
デフォルトの名無しさん :2007/05/11(金) 08:46:24
>>897 こんな感じ?
#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;
}
899 :
C言語 :2007/05/11(金) 11:57:43
FDにはいっている会員IDとPCの中にあるdatファイルの会員IDを照らし合わせて同じ会員IDの名前だけとりだすというプログラムをつくりたいんですが、どなたかおしえてください。 FDの中のデータは会員IDのみになっていて、1001がはいっています。PCのdatファイルには会員ID、名前、生年月日、住所の順に 1001 田中 19840908 千葉県 1002 高橋 19841203 埼玉県 1003 吉田 19840405 山形県 1004 佐藤 19841112 沖縄県 がはいっています。この二つを照らし合わせて1001のIDの田中の名前だけを表示させたいというプログラムです。空白はタブです。やさしいかたお願いします。
>>899 >1
つーか、向こうで相手にされなかったんだからいい加減諦めたら?
>>899 grep `cat FD` PCのdatファイル |awk '{print $2;}'
>>899 これならFDが壊れていても動作するよ!
#include<stdio.h>
int main(void){
puts("田中");
return 0;
}
>>899 その内容なら、Cよりperlとかのほうが良いのではないか?w
904 :
デフォルトの名無しさん :2007/05/11(金) 15:51:28
>>890 ありがとうございます。
あの・・・表示されないんですけど・・・
どなたか
>>888 をお願いします。
>>904 俺は >890 じゃねーけど、バグ取ってみた。
>>890 の、クラス内のRoll()を以下のように変えれば動くね。
int Roll(){ num = (rand() % side) + 1; return num; }
個人的には、SIDEを定義してるんだから、
宣言やd6の初期値にも渡せば良いような気がするけど。
まぁどうでもいいか。
>>904 >890試してみたけどちゃんと表示されるよ。
「表示されない」を詳しく。
どんだけ偏った乱数なんだよ!
[1] 授業単元:アルゴリズム [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といった基本的なこと。ポインタは少し。 今年からアルゴリズムを習い始めました。 スタックやキューの違いは理解できているのですがそれらをどうプログラムに直すかがわかりません。 よろしくお願いします。 ソースのほうに適宜、コメント等付け加えてもらえると有り難いです。
pc.datの中身を規定通りに記入しないとプログラムが終了しないっぽい orz
>>910 #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;
>>910 /* キューへエンキュー */
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);
}
>>910 /* ここからキュー */
puts("\nQueue:");
while (queue)
{
printf("%d ", queue->data);
/* デキュー */
pTmp = queue; /* スタックと一緒 */
queue = queue->next;
free(pTmp);
}
putchar('\n');
return 0;
}
エラー処理はしてないから勝手に追加してくれ
915 :
デフォルトの名無しさん :2007/05/11(金) 21:38:30
>>915 CodeGuardを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)
>>915 恐らく49行目のこのforループが怪しい。
forループは実数で回さず、整数で回して、ループ内でXの値を
計算で求めるようにするとよい。
> for(X=x[0]-1.0; X<x[S]+1.0; X+=0.1)
>>915 ・・・と思ったが、これがおかしいね。
x[S]
S=10で、xは[0..9]までしか確保されてないのだから、x[10]を
アクセスしようとしてエラーが出るのか。
mがNになってんのがまずいんじゃね?
> for(X=x[0]-1.0; X<x[S]+1.0; X+=0.1) この文でSが10だとまずいだろ。9までだぞ。
具体的には
for(X=x[0]-1.0; X<x[S-1]+1.0; X+=0.1)
でいいんじゃね?
>>915
>>916-921 早速の回答ありがとうございました。
指摘されている通り、for文での X < x[S]+1.0 がまずかったみたいです。
[S]を[S-1]にすることで正しく実行できるようになりました。
何度も見直したはずなのに、こんなところで凡ミスをしていたなんて・・・orz
>>898 ありがとうございます。
多分こんな感じでいいんだと思います。
924 :
デフォルトの名無しさん :2007/05/11(金) 23:03:49
[1] 授業単元:プログラミング実習 [2] 問題文(含コード&リンク) コインの種類C[0]からC[k-1],与えられた金額mに対して、コインの数を最小にするmの払い方を求めるプログラムを書け。 [4]提出期限 5月28日月 よろしくお願いします。
[1] 授業単元: プログラミング
[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)に対する
足し算・引き算・かけ算、割り算をする関数も作っていただけると幸いです
よろしくお願いします。
>>925 「コインの種類」って何か決まっているんじゃないの?
たとえば日本の通貨でいうとC[0] = 1、C[1] = 5、C[2] = 10 とか。(kは6未満)
勝手に決めていいものじゃないだろ。
そのへんを詳しく。
paddが悩ましい。
931 :
デフォルトの名無しさん :2007/05/12(土) 03:32:05
[1] 授業単元:プログラミング基礎 [2] 問題文(含コード&リンク): int型変数xとyがある。一時変数を使わずに演算のみでxとyの値を入れ替えよ。 [3] 環境 [3.1] OS:Windows [3.2] コンパイラ名とバージョン:VC ExpressEdition 2005 [3.3] 言語: どちらでも [4] 期限:無期限 [5] その他の制限: 一行でやれとのことです 宜しくお願いします。
なんかダメだ。 x = x - (y = (x = x + y) - y);
>>931 x ^= y;
y ^= x;
x ^= y;
これでテンポラリ無しでの交換は出来るが一行って制限が意味不明だな
x ^= y ^= x ^= y;とすりゃ一行にはなるし、一応動くが
直前の副作用完了点から次の副作用完了点までの間で同一変数への
書き込みを2度も行ってるからまともに動かない処理系があっても文句は言えん
次善策としてこれでもいいが見辛くなるだけ
x ^= y, y ^= x, x^= y;
結論としては一行なんて意味の無い制限を課した教官がアホ
934 :
925 :2007/05/12(土) 03:51:47
>>930 素早い回答ありがとうございます。
ですが、コンパイラが古いためか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);
}
}
}
にすると今度は数字が表示されなくなってしまいました。
恐らく無理矢理混ぜたことでおかしくなってるんだと思いますが、
原因が自分には分からないのでよろしくお願いします
>>933 これならどう?副作用に問題ある?
x ^=(y ^=(x ^= y))
>>935 ある。()を付けたところで副作用完了点になる訳じゃないから意味がない
疑問に思うならlintに掛けてみるといい。警告が出されるはずだから
938 :
925 :2007/05/12(土) 04:15:30
何度も本当にすみません。
6の方(1〜3+5+6)も1〜3を
>>934 のようにしてコンパイルし実行してみたところ、
同様に2の100乗は0、fib(100)は0と出力されました
お答えいただいたプログラムのまま6の方をコンパイルした場合も、
error LNK2019:未解決の外部シンボル _snprintfが関数_tobignumで参照されました。
faal error LNK1120:外部参照1が未解決です。
と出てコンパイルできません。
注釈をつけやすい方がいいので、お手数ですが
>>934 のプログラムのおかしい箇所を直していく方向でお願いします
939 :
デフォルトの名無しさん :2007/05/12(土) 04:21:31
>>932 ,933,935
おおお
ありがとうございます。
本来の課題にオマケとして付いてきた感じの課題で、「興味がある奴は考えてみると基礎的な部分の理解に繋がる」とか
そんなことを言われて、サッパリ分からずに質問したのです。
今ノートに書きつつ手で計算してビックリしました。
ありがとうございます。
[1] 授業単元:数値計算法 [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] その他の制限: 宜しくお願いします
942 :
デフォルトの名無しさん :2007/05/12(土) 12:03:15
[1] 授業単元:プログラミング基礎 [2] 問題文(含コード&リンク): X時0分0秒からの一時間を考える。Xを読み込んで、 時計の短針と長針が重なる時刻を○時×分△秒で表示する プログラムを作成せよ。ただし、秒数の表示においては秒よりも 一つ下位の桁を四捨五入によって丸めること。 [実行例]何時台ですか?3 短針と長針が重なるのは3時16分22秒です。 [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン:特になし [3.3] 言語: C++ [4] 期限: 5月14日 [5] その他の制限: 特になし 期限が短くて申し訳ないんですがお願いします。
1] 授業単元:プログラミング基礎 [2] 問題文(含コード&リンク): 2つの文字列の比較を行う関数を配列とポインタを用いて作成せよ。 また文字列が同じであれば1を、異なれば0を出力しなさい。 <実行例> 文字列@:English 文字列A:England 結果:0 [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン:特になし [3.3] 言語: C [4] 期限: 5月13日 [5] その他の制限: 特になし
944 :
943 :2007/05/12(土) 13:44:46
説明不足でした。作成する関数は配列とポインタそれぞれ1つずつです。
>>942 #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;
}
946 :
945 :2007/05/12(土) 13:53:31
>>942 言語指定が C++ だったので訂正
#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;
}
>>943 #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;
}
>>944 もしかして一つずつってこういう意味?
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;
}
949 :
943 :2007/05/12(土) 14:13:25
>>947 ありがとうございます。
文字列のEnglishと、Englandですが、実行例なので、数字や漢数字、半角英数も含めた任意の文字列の場合は、どうしたらいいでしょうか?
>>947 関数を2つ作ってそれぞれ別のファイルで1つずつ使用する問題です。
(配列を利用した関数とポインタを利用した関数の2つ)
>>949 スマン
>>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]);
}
少しは見なおしてから書き込め >オレ for(;a[i]!='\0';i++) ↓ for(i=0;a[i]!='\0';i++)
それのどこが配列を使っているのか詳細きぼんぬ。 それとも、演算子を換えただけで配列と言い張るのか? だとしたら、>943の出題者はとんでもないな。
953 :
デフォルトの名無しさん :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] その他の制限:特になし よろしくお願いします。
>>953 #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;
}
>>952 本人じゃないですが気になったので。
単に[]と*の二つの演算子の扱いを確認するための問題なんじゃないかなと思います。
問題文の時点で変な気がしますけど、そうじゃないとますます変な問題になりそうな・・・。
自分が未熟なだけかもしれませんが・・・。
>>941 公式が間違ってないか?
括弧とかきちんと書かないと計算結果が変になるぞ
(故意に計算間違いをする会計システムじゃあるまいし)
その公式でいいというのなら別だが…
>>941 #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;
}
958 :
デフォルトの名無しさん :2007/05/12(土) 15:55:57
>954 ありがとうございました!
>>956 すみません。
y=ax+bの一次関数でa、bを求めてからy=ax+bの式に入れて表示するプログラムです。
a、bの式はこれであってます。
[1] 授業単元:構造化プログラミング実習T・U [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進数まで変換できればよい 以上です。 よろしくお願いします。
>>962 追記です
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, };
を使いなさい
を忘れてた
すみません
} ;
964 :
デフォルトの名無しさん :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; } 範囲チェックとかは面倒だから割愛
もう見てないかも知れないが、
>>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;
}
[1] 授業単元:プログラミング言語C [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] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々) 制限は特にありません よろしくお願いします
>>966 int 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;
}
>>967 floatとdoubleで実行結果に差が出るのはなぜなんでしょうか?
>>968 小数点以下の精度の問題じゃね?0.01を2進数でどう表せる?考えてみ。
double型の方がfloat型より精度が高い。その精度の差が誤差として出てしまっている。
>>968 浮動小数ってのは簡単に言うと
○.○○×△^□
という形で数値を表す方法
んで、○の部分は桁数が、△は数値がそれぞれ固定、□にも上限下限がある
だから例えば○部分が3桁の場合
1.01*10^2になってる時に0.01を足しても影響が無くなる(つまり演算結果がおかしくなる)けど
もし、○が6桁だったとしたら
1.01000*10^2 + 0.01 = 1.01010*10^2という風にちゃんと表すことができる
これがdoubleとfloatで結果がずれる理由
#まぁ実際にはこんなに精度悪くはないんだけどな
#その辺はヘッダ参照の事
なんか、前にも小数を何回か足していって、if文である値になったら違った条件の計算をするといった 課題を見かけたけど、そんときゃ確かif文の中に指定した値に足していった値が一致しなくて if文の条件にある計算がされなかったという結果が出てたな。 要するに近似値が使われていると。小数点以下の精度が低くなればなるほど、その近似値にも 差が出るわけで。まぁ、最終的には小数点以下を2進数で表現したらどうなるか?そこにいきつくかと。
>>971 doubleだったかfloatだったかをループ変数にしてた奴だな
あれは余程の理由があって、またそれによる副作用(C的な意味じゃなくて普通の意味な)が
ちゃんと分かってる時以外は御法度だな
0.01を2進数にすると循環しちゃわない? ふと考えたらどうすればいいのかわからなくなってしまった オレもまだまだっていう証拠だな┐(´д`)┌
>>973 浮動小数で演算する以上は避けられない誤差として諦めるしかない
どうにかしたいっていうなら、BCD等で計算してくれるライブラリ・処理系を探してくるか
無いなら自分でそういうライブラリ作るしかない
>>973 まぁ、それが精度によって可能な範囲内で、指定した値を越えない近似値で処理されているみたいで。。。
976 :
910 :2007/05/13(日) 04:11:42
>>912 遅くなりましたが有り難うございます。
いろいろと弄ってみたのですがいくつか疑問が。
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; /* 末尾に追加 */
}
}
のように{}で囲むとキューの表示がおかしくなったので。
よろしくお願いします。
>>976 先ず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)
;
>976 {}で囲む範囲がおかしい。 つまりループの内容を全く理解していない。 理解してないんなら、余計なことはしないほうがいい。
【質問テンプレ】 [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文あたりまでしか習っていません。 先生の話によると変数の宣言はそのままに後半を少し変更するだけで 出来るらしいのですが・・・。
>>979 a[i]=1の時に100-1するとか、a[i]==0の時に+1するとか好きなようにしれ