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

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
あなたが解けないC言語/C++言語の宿題を片付けもらうスレッドです。気に入らない質問やその他や発言はスルーの方向で。

【質問者へ】
回答者の便宜のため、質問の際は以下を行うことを推奨します。
・質問は【質問テンプレ】を利用してください。
・問題文は、出題されたまま全文を書いてください。
・計算問題は数式をあげ、どのような計算をするのか詳しく説明してください。
・エラーは、その詳細と発生した行を書きましょう。エラーメッセージはコピペしてください。
・後から問題に付け足しするのはやめましょう。付け足しは作業を無駄にしがちです。
・なりすましを防ぐため、トリップを使ってください。名前欄に、「#」に続けて任意の文字列を入力して投稿すると、その文字列を知らない他人に騙られることを防ぐことができます。

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

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

【前スレ】
C/C++の宿題を片付けます 85代目
http://pc11.2ch.net/test/read.cgi/tech/1175129517/
2デフォルトの名無しさん:2007/04/20(金) 00:35:55
2
3デフォルトの名無しさん:2007/04/20(金) 00:36:15
ANSI、ISO準拠など標準スタイルの話は禁止!した奴は罰金ね
4デフォルトの名無しさん:2007/04/20(金) 00:36:42
>>前スレ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;
5デフォルトの名無しさん:2007/04/20(金) 00:37:01
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("不可 ");}}
7デフォルトの名無しさん:2007/04/20(金) 00:37:55
>>1
8945:2007/04/20(金) 00:40:02
>>4>>5>>6
ありがとうございました。
9デフォルトの名無しさん:2007/04/20(金) 00:41:49
あーしまった入力はファイルではなくて配列に決め打ちしてよかったのか
10デフォルトの名無しさん:2007/04/20(金) 00:44:02
>>9
よぉ、俺!!
11デフォルトの名無しさん:2007/04/20(金) 00:45:28
前スレの余韻が冷めやらん
ビールでも買ってくるか('A`)
12デフォルトの名無しさん:2007/04/20(金) 00:45:37
>>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デフォルトの名無しさん:2007/04/20(金) 00:46:43
>>3ルールの徹底を求む。
14デフォルトの名無しさん:2007/04/20(金) 00:47:24
>>13
>>1
> 気に入らない質問やその他や発言はスルーの方向で。
15デフォルトの名無しさん:2007/04/20(金) 08:13:11
ttp://www.geocities.jp/ky_webid/cpp/library/index.html
っつーかね、CよりC++の方が扱いが楽だわ。
16デフォルトの名無しさん:2007/04/20(金) 14:03:56
[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デフォルトの名無しさん:2007/04/20(金) 21:15:08
たかし!宿題が出てるよ
早くやっちゃいな
18デフォルトの名無しさん:2007/04/20(金) 21:19:25
>>17
かーちゃん、俺たけしだってばぁ
たかしは弟だろ〜
19デフォルトの名無しさん:2007/04/20(金) 21:25:07
ccmath.h のdeqsy関数の使い方さえわかれば解ける!
誰か教えてくれ!
20デフォルトの名無しさん:2007/04/20(金) 21:44:38
21デフォルトの名無しさん:2007/04/20(金) 21:46:19
偏微分方程式の専門知識はないから、せめて連立一次方程式への
変形まではやってくれぇ。
22デフォルトの名無しさん:2007/04/20(金) 22:20:43
[1] 授業単元:C言語
[2] http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3846.txt
[3] 環境
 [3.1] OS: Windows
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C
[4] 期限:月曜朝7時まで
[5] 制限:なし。
よろしくお願いします。


2316: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]
と各々の格子点の値を求めます。
2416: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
2516: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) 
です。



2616: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])
となります。
2716:2007/04/20(金) 23:34:21
2816:2007/04/20(金) 23:39:26
プログラムとしては、

xの値を決める→yの値を決める→x,y方向の分割数Nを決める
→出来た連立一次方程式をガウスの消去法を用いて解く

だと思います…。

正直、自分には全く作れるような気がしません…よろしくお願いします・・・。
29デフォルトの名無しさん:2007/04/20(金) 23:41:28
>>20
それです
30デフォルトの名無しさん:2007/04/20(金) 23:43:19
>>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;
}
31デフォルトの名無しさん:2007/04/20(金) 23:53:36
>>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;
}
3231: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);
}
33デフォルトの名無しさん:2007/04/21(土) 00:17:02
>>30-31
どうもありがとうございました。助かります。
34デフォルトの名無しさん:2007/04/21(土) 00:52:47
[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);
> }
関数を使ったプログラムにしてください。


↑この関数を使ったプログラムって何ですか?><わかりません
訂正してください><
36デフォルトの名無しさん:2007/04/21(土) 12:01:43
>>16
具体的な数値は質問者に任せてガウス法(掃き出し法のほうだよね?)だけ
でも実装しようかと思ったが、自分がすっかり退化していることに気づ
いた。添え字がゴチャゴチャしてどっちが行でどっちが列だか分からな
くなるぅ。
37デフォルトの名無しさん:2007/04/21(土) 12:37:13
>>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);
}
38デフォルトの名無しさん:2007/04/21(土) 13:37:20
>>37
おお、ちゃんと計算できるけど何やってるのか全然わかんねえw
39デフォルトの名無しさん:2007/04/21(土) 14:24:43
[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言語で中置記法から後置記法に変換する
一番スマートなやり方ってどんなのがありますか?
41デフォルトの名無しさん:2007/04/21(土) 15:29:28
>>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] その他の制限: 特にありませんが初歩的な関数で書いていただけると
有難いです。
44デフォルトの名無しさん:2007/04/21(土) 21:41:33
>>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; }
45デフォルトの名無しさん:2007/04/22(日) 03:53:10
46デフォルトの名無しさん:2007/04/22(日) 04:19:29
>>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);
}
47デフォルトの名無しさん:2007/04/22(日) 12:39:08
[1] 授業単元:C言語
[2] 問題文(含コード&リンク):
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3853.c
問題はこちらに書いてあります。よろしくお願いいたします。
[3] 環境
 [3.1] OS: Windows
 [3.2] コンパイラ名とバージョン: gcc 3.4
 [3.3] 言語: C
[4] 期限: [2007年4月23日00:00(深夜)まで]
48デフォルトの名無しさん:2007/04/22(日) 16:31:42
プログラマーにとってEditorの操作が重要
49デフォルトの名無しさん:2007/04/22(日) 23:48:25
>>47
これは同じ問題をやったことある香具師じゃなきゃ無理だろ。
参考URLとかもってきてくれ。
50デフォルトの名無しさん:2007/04/23(月) 01:25:16
>>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)って言われたんですけど・・・
52デフォルトの名無しさん:2007/04/23(月) 03:06:51
>>51
int main , void main についてはすでに前スレでどういうことなのかについての結論は出ている。

ttp://www.kouno.jp/home/c_faq/c11.html
ttp://kbs.cs.tu-berlin.de/~jutta/c/c-faq/c-5.html
ttp://hpcgi1.nifty.com/MADIA/Vcbbs/wwwlng.cgi?print+200211/02110028.txt
ttp://his.luky.org/ML/linux-users.a/msg00056.html

世界的な標準を決めている団体、ANSI、ISO準拠だと、プログラムの開始のfunctionは
mainと名づけられていて、その戻り値はint型とされている。
個人の報告によれば、void mainでコンパイルエラーを起こした開発環境があっても
int main(最後にreturn (int型変数);でエラーが起きたという報告は皆無。
自分が使っている環境でvoid mainが通るならそれでも良いが、値を返す関数じゃないからといって
void mainという理由を通すなら、それはもはやANSI、ISOに従ったmainではないということになるが。
53デフォルトの名無しさん:2007/04/23(月) 03:13:16
>>51
char *Gakusei2 = {"ABCDEFGHI"};   < こうですか?それとも
char Gakusei2[9] = {"ABCDEFGHI"};  < こうですか?わかりません ><;
54デフォルトの名無しさん:2007/04/23(月) 03:23:59
>>51
授業で習ったものに、文字配列の初期化や格納について参考になるものはない?
出来るのにそれじゃダメとか言い出す講師は、ただ単にそういうんじゃなくて
どういうことに則って記述するのか、ちゃんと聞いてみるしかないかと。
55デフォルトの名無しさん:2007/04/23(月) 03:33:05
>>52<<53
すいません。無知なんで詳しいことがよくわかんないんですけど
charってのは使わないみたいです。あとはfor構文を使うとしか聞いていません。
56デフォルトの名無しさん:2007/04/23(月) 03:45:21
前スレには

すいませんでした。
A  B  C  D  E  F  G  H  I 
90 73  55 60  45 88  66 75  40
です。

実行結果が下のようになるようにお願いします。
A  B  C  D  E  F  G  H  I
優 良 不可 可 不可 優  可 良 不可

と書いてあるけど、文字配列を使っちゃダメならA〜Iを何で表示しろと?
まさか↓のようにやれと?
for(i=65; i<=73; i++) printf("%c  ",i);
57デフォルトの名無しさん:2007/04/23(月) 04:46:37
誰に言われたんだろう
TAか教授か・・・
58デフォルトの名無しさん:2007/04/23(月) 05:17:16
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;
}

ここまではできたのですが表がどうしても左詰めになってしまいます。
どこがいけないんでしょうか?それ以外にも直したほうがいいところ
があればおねがいします。
61デフォルトの名無しさん:2007/04/23(月) 05:28:48
>>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
>>61
表示されないんですけど・・・
63デフォルトの名無しさん:2007/04/23(月) 05:41:03
>>62
> printf(" "); /* 半角の空白3つ分を出力 */
この中に半角の空白をあと2つ足して3つに汁!
64デフォルトの名無しさん:2007/04/23(月) 05:42:15
>>62
printfの中を半角のスペース3つにしといて。
2ch投稿時にまとまったスペースはひとつにされてしまう。
65デフォルトの名無しさん:2007/04/23(月) 05:43:53
    < どうだぁ
6664:2007/04/23(月) 05:46:23
ええ、べつにいいんです。
なじられるのにはなれてますから。
67デフォルトの名無しさん:2007/04/23(月) 05:49:37
&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; }
68デフォルトの名無しさん:2007/04/23(月) 05:50:45
printf("%*c",t,NULL); でも良いかな。戯言すまそ。
69デフォルトの名無しさん:2007/04/23(月) 05:54:31
表示できました。ありがとうございました。
ただputs(""); っていうのをまだ習ってないんですけど
これを使わずに表示することはできないんですか?
70デフォルトの名無しさん:2007/04/23(月) 05:55:19
int main論議なんかよりも、>>67 >>68みたいな情報をもっと書いて欲しい。
71デフォルトの名無しさん:2007/04/23(月) 05:55:54
>>69
printf("\n");に置き換えて
72デフォルトの名無しさん:2007/04/23(月) 12:43:14
>>68
NULLを%cで表示ってバカ?
73デフォルトの名無しさん:2007/04/23(月) 15:15:41
どうせやるなら、printf("%*s", t, "")だな。
7442:2007/04/23(月) 16:27:31
42です。どなたかお願いできないでしょうか?
75デフォルトの名無しさん:2007/04/23(月) 16:32:53
>>72
http://www.psl.ne.jp/perl/pdojo00b.html
バカじゃないだろ、ちゃんとコードに割り当てられているし
単に文字が無いんではなく、空文字として存在してんだよぉ〜
無知は黙ってろ、クソカス低学歴(プ
お前は一生void mainに0^0=1を使ってろw
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, "")だな。
77デフォルトの名無しさん:2007/04/23(月) 16:40:06
>>73
""が示す文字、すなわち空文字=NULLじゃねーかYO!
7873:2007/04/23(月) 17:12:16
>>76>>77
やってみれば判るけど、"%s"に""を渡しても何も出力しないが
"%c"にNULLを渡すとナル文字が出力されるのよ。
つまり、非可読文字が出力されちゃうわけ。判る?
#あ、標準出力をリダイレクトしてodするなんて知恵も無いDozerには理解できるわけ無いか。
7973:2007/04/23(月) 17:13:37
おっと、>78を若干訂正。

×>>76>>77
>>75>>76>>77
80デフォルトの名無しさん:2007/04/23(月) 17:29:43
>>78
> #あ、標準出力をリダイレクトしてodするなんて知恵も無いDozerには理解できるわけ無いか。
> Dozerには理解できるわけ無いか。
> Dozer
さすがにこれはどうかと思うぞ。
関係ない人間にまで喧嘩売ってるとしか思えん。
81デフォルトの名無しさん:2007/04/23(月) 17:33:35
全てのDozerが理解できないのではなくて、知恵の無いDozerが理解できないのだろうよ。
82デフォルトの名無しさん:2007/04/23(月) 17:34:58
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
85デフォルトの名無しさん:2007/04/23(月) 17:36:54
端から見てりゃ>>76>>78も同類。同じ馬鹿だよ。
脳みそ硬化してる連中はどっかよそへいけ。
86デフォルトの名無しさん:2007/04/23(月) 17:40:29
>>84
> 文字列じゃねーだろ "" はw あっ、お前の場合ダブルクォートが文字列のつもりか?w
どうみても0文字以上の文字を含む文字列では?
87デフォルトの名無しさん:2007/04/23(月) 17:42:05
誰かまとめ頼む!
88デフォルトの名無しさん:2007/04/23(月) 17:44:09
各自であぼーんして無かったことにするのが吉。
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;
}
90デフォルトの名無しさん:2007/04/23(月) 17:50:54
ナルターミネートされて出力されないことと、ナル文字が出力されることの区別がつかない香具師数名。
91デフォルトの名無しさん:2007/04/23(月) 17:51:18
>>85はぁ?一緒?そりゃやっていることは一緒だろうけどさぁ、考え方は明らかに
>>73の方が浅はか、無知、知ったかw
実証してみりゃ結論が出るのに、やらずに勝手な自論を持ち出して相手の不適切を
  指  摘  し  た  つ  も  り  が  
自分がやったことが相手のやったことの違うやり方だったことに過ぎないという
お間抜けなことに気づかないアホw
やれやれ、ここはやたらとint mainにかみついたり、C言語スタイルで記述したソースを
C++コンパイラでコンパイルできればそれもC++のソースとか平気で言っちゃう香具師らが多いなんて
もはや終わってんなここw 所詮、プロのプログラマーになれなかった落ちこぼれ
負け組みの集団だろ?俺なんて趣味でやっている程度だが、確実にボケ老人より知識は上だなw
経験はまだ浅いが、いずれプロにも匹敵するくらいにはなるぜw
92デフォルトの名無しさん:2007/04/23(月) 17:56:14
>>91
で、出力結果は? 勿論、出力をリダイレクトしてダンプしてね。
93デフォルトの名無しさん:2007/04/23(月) 17:57:46
>>92
出力結果を聞くなんておかしいね?お前がコンパイルしてやってないってことは
結局""も脳内コンパイルか?脳みそこねこねコンパイルw
94本日のボケ老人:2007/04/23(月) 17:58:32
72 名前:デフォルトの名無しさん 投稿日:2007/04/23(月) 12:43:14
>>68
NULLを%cで表示ってバカ?


73 名前:デフォルトの名無しさん 投稿日:2007/04/23(月) 15:15:41
どうせやるなら、printf("%*s", t, "")だな。

↑こいつら死刑なw
95デフォルトの名無しさん:2007/04/23(月) 18:02:28
#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
9642:2007/04/23(月) 18:07:57
論争で流れてしまったみたいなので。

お願いします。どなたか>>42の課題をやっては戴けないでしょうか?
97デフォルトの名無しさん:2007/04/23(月) 18:10:27
>>96
残念、参考資料が両方とも流れてしまっている。
9842:2007/04/23(月) 18:14:04
補足画像とヒントコードが流れてしまっているみたいなので、

画像:ttp://www.uploda.org/uporg784837.jpg.html
   ttp://user.ftth100.com/log/up/log/4352.jpg

ヒントコード:ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3854.txt
99デフォルトの名無しさん:2007/04/23(月) 18:15:04
printf("\"\" : \"%c\" / %d \n","","");
これやったらおかしな数値が表示されたぞ?
10042:2007/04/23(月) 18:18:54
>>97
アップをしました。

ヒントコードの方、文字化けをしているみたいなのでもう一度アップしました。

ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3856.txt
10142:2007/04/23(月) 18:20:01
>>98のヒントコード、誤爆ですorz
スレ汚しすいません。
102デフォルトの名無しさん:2007/04/23(月) 18:35:28
>>91
ここがどこだか言ってみろ?
空気読めない奴はマに向かないぞ。
103デフォルトの名無しさん:2007/04/23(月) 18:48:00
>>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;
}
10442:2007/04/23(月) 18:56:33
>>103
ありがとうございます。早速、動作確認の方、完了しました。
2問目もよろしくお願いします。
105デフォルトの名無しさん:2007/04/23(月) 19:19:26
二匁。
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;
}
10642:2007/04/23(月) 19:46:23
>>105
ありがとうございました。どちらも動作確認いたしました。
早速、提出してきます。
本当にありがとうございました。
10747:2007/04/23(月) 20:52:56
>>47はさすがに無理ですか?
自分でもいろいろ調べてみたのですが難しくて...orz
スレ汚しすみません
108デフォルトの名無しさん:2007/04/23(月) 21:32:54
CとLの定義くらい書いてよ。
グラフ理論(?)の授業さぼったならそれは助けようがない。
109デフォルトの名無しさん:2007/04/23(月) 21:57:18
>>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] その他の制限: 現在、制御文、配列、文字と文字列まで習っています。
よろしくお願いします
111デフォルトの名無しさん:2007/04/23(月) 23:07:58
[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] 制限: 特になし
112デフォルトの名無しさん:2007/04/24(火) 00:13:44
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
お願いします。
114デフォルトの名無しさん:2007/04/24(火) 03:52:16
>>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;
  }
}
115デフォルトの名無しさん:2007/04/24(火) 04:43:14
>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] その他の制限:
117デフォルトの名無しさん:2007/04/24(火) 05:07:55
>>116
読み込むCSVファイルの中身と出力結果の例をきぼんぬ
118デフォルトの名無しさん:2007/04/24(火) 05:17:26
>>111
両方とも正の整数と仮定していいの?
119デフォルトの名無しさん:2007/04/24(火) 06:45:49
>>116
それなんて業務?
120デフォルトの名無しさん:2007/04/24(火) 08:28:08
>>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;
}
121デフォルトの名無しさん:2007/04/24(火) 16:12:55
>>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
業務ではありません。データベース基礎の演習です。
122デフォルトの名無しさん:2007/04/24(火) 17:33:00
>>91
VIPでやれ
123デフォルトの名無しさん:2007/04/24(火) 18:23:36
>>121
> 3.動的配列をcsv形式ファイルとして書き出す関数。
いや、モロに「出力」に該当する部分があるんだが・・・出力って何も画面に表示ってだけじゃないぜ?
出す力と書いてウンコのごとく(ry いやすまん、今のはジョークだ。要するにファイルに出力だろ?
124デフォルトの名無しさん:2007/04/24(火) 18:28:10
[1] 授業単元:プログラミング
[2] 問題文(含コード&リンク):
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3858.txt
[3] 環境
 [3.1] OS:Windows
 [3.2] コンパイラ名とバージョン:VC++ 2005
 [3.3] 言語: C++
[4] 期限:4/25 水 17:00
[5] その他の制限:問題文リンクの方をお願いします

よろしくお願いします
125デフォルトの名無しさん:2007/04/24(火) 18:35:23
>>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
[1] 授業単元:C言語
[2] http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3865.txt
[3] 環境
 [3.1] OS: Linux
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C
[4] 期限:明後日
[5] 制限:なし。
よろしくお願いします。
129デフォルトの名無しさん:2007/04/25(水) 00:25:40
>>123
今、帰宅しました。
空白を入れずに各項目を","で区切ったテキスト形式でOKです。
130デフォルトの名無しさん:2007/04/25(水) 00:34:53
>>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;
}
131デフォルトの名無しさん:2007/04/25(水) 00:35:45
>>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;
}
132デフォルトの名無しさん:2007/04/25(水) 00:39:10
>>131の問1は取り下げで……
133デフォルトの名無しさん:2007/04/25(水) 00:44:50
>>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;
}
134デフォルトの名無しさん:2007/04/25(水) 00:59:55
>>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;
}
135127:2007/04/25(水) 01:07:06
>>130, >>131, >>133
ありがとうございます!
助かりました!
136デフォルトの名無しさん:2007/04/25(水) 01:51:06
>>134
ありがとうございました 感謝です
137デフォルトの名無しさん:2007/04/25(水) 08:30:17
新学期始まって、色々と宿題投げる人が増えてきて
投げる人はあれだが、このスレ的には盛り上がって良いなww

解答をじっくり噛み砕いて、次こそ自分で解けるようにね^^
138デフォルトの名無しさん:2007/04/25(水) 09:51:38
提出した次に同じ問題はこない。学校によって違うかもしれんが、定期試験とかはなく
レポート提出になるだろうけど、そのときもまたここで質問するんだろうね・・・( ´д`)
139デフォルトの名無しさん:2007/04/25(水) 12:58:20
学生はいいや。
それよりも研修の問題丸投げしてる奴を想像して……。
140デフォルトの名無しさん:2007/04/25(水) 13:44:04
それはけなげなサボタージュだな。
しっかり破壊工作にいそしんでくれ。
141デフォルトの名無しさん:2007/04/25(水) 14:26:42
2次元配列kukuの各要素に九九の各計算を格納し
表示するプログラムを作成してくれませんか?
至急おねがいします。
142デフォルトの名無しさん:2007/04/25(水) 14:35:13
#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");
}
}

何時までにとか何分以内にとか言ってくれたほうが
くだらない問題でも無駄にやる気が出る。(百マス計算とかと一緒)
143デフォルトの名無しさん:2007/04/25(水) 14:42:50
そういや
return 0;
を忘れてた
144デフォルトの名無しさん:2007/04/25(水) 18:17:54
すみません >>124 のお願いします
145デフォルトの名無しさん:2007/04/25(水) 20:22:52
[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] 制限:なし。

 結構厳しい先生なのに見た感じ楽勝の課題だと思ってたら、やっぱり
 初心者には簡単に解けない引っかけのような点があって詰まってます。

 くだらない問題でしょうがお願いします。

 自分なりにやってみて詰まった点は下のレスに書きます。
146デフォルトの名無しさん:2007/04/25(水) 20:27:12
#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です。他は上で書いたのと同じです。
よろしくお願いします。
147デフォルトの名無しさん:2007/04/25(水) 20:48:02
>>146
実数の小数部分は2進数では正確に表せない物がある。
そういう場合は具体的には小数を使わない工夫をする。

例えばa=10.0としておき1.0ずつ引いていき、a==6.0の時に
処理を分岐すれば正しい動作になる。
148デフォルトの名無しさん:2007/04/25(水) 21:05:01
>>147

ありがとうございます。2進数の章の課題なのでやっぱり2進数が関わってくる
とは思っていましたが・・・勉強になりました。

しかし、

>>
a=10.0としておき1.0ずつ引いていき、a==6.0の時に
処理を分岐すれば正しい動作になる。

これ、今やってみましたがやはり結果は6.0と4の乗算になってしまいました。
すみません。
149デフォルトの名無しさん:2007/04/25(水) 21:10:10
すみません >>124 のやつマジでお願いします
150デフォルトの名無しさん:2007/04/25(水) 21:10:42
>>147

すみませんよく見たらちゃんと出来てました。ただ、そうすると課題本来の
「1.0から0.1を引いていく」場合には少数を使って正しく分岐する方法は
無い、ということですか?
151デフォルトの名無しさん:2007/04/25(水) 21:14:48
>>150
十進化二進数を使っているような処理系の場合うまくいく。
つまり処理系依存としか言えない。

どうしても小数を使いたいなら、0.6と比較するのではなくて
0.599と0.601の間に入ったら、みたいに条件を緩めるしかない。

IEEE754で正しく表せる小数は、0.5, 0.25, 0.125, 0.0625,....のような
列とその足し合わせた小数のみ。それ以外は必ず誤差がある。
152デフォルトの名無しさん:2007/04/25(水) 21:16:01
×十進化二進数
○二進化十進数
153デフォルトの名無しさん:2007/04/25(水) 21:22:49
#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

となり、ごくわずかだが誤差がある事がわかる。
154デフォルトの名無しさん:2007/04/25(水) 21:26:11
>>151
>>153

本当に勉強になります。ありがとうございます。なるほど、誤差がある
ということを勉強させる課題だったわけですね。具体的な解答はまだ
思いつきませんが、誤差について調べて金曜まであがいてみます。
155デフォルトの名無しさん:2007/04/25(水) 21:29:41
ひょっひょっひょ、詰まる話が 0.5 0.25 0.125 すなわち 2^-nの話か。
ちうか小数点以下きらーーい(ゆとり教育世代じゃないが)w
156デフォルトの名無しさん:2007/04/25(水) 21:32:32
C言語の場合はループカウンタに実数を使わずに整数を
使うのも同じ理由だよね。
157デフォルトの名無しさん:2007/04/25(水) 21:33:32
0.5 0.25 0.125 0.0625 0.03125 0.015625 0.0078125 0.00390625
158154: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] その他の制限:

お願いします!
160デフォルトの名無しさん:2007/04/25(水) 22:46:16
>>159
問1は降べきにソートして最初の要素を出力すればいいのかな
161デフォルトの名無しさん:2007/04/25(水) 22:48:40
>>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));
}
162デフォルトの名無しさん:2007/04/25(水) 22:50:59
>>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
はい!最初の数字だけを出力すればいいそうです。
164デフォルトの名無しさん:2007/04/25(水) 23:03:57
>>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;
}
165デフォルトの名無しさん:2007/04/25(水) 23:07:53
[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桁の値を配列に格納する方法が調べてもググってもわかりません…
お願いします!
166デフォルトの名無しさん:2007/04/25(水) 23:08:48
>>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;
}
167デフォルトの名無しさん:2007/04/25(水) 23:11:25
>>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);
}
ごめん、ちょっとやってみたかっただけ。
168デフォルトの名無しさん:2007/04/25(水) 23:13:00
>>167
それは反則だろ。三項演算子はif文と同等とみなされると思って
俺は使わなかった。
169デフォルトの名無しさん:2007/04/25(水) 23:13:22
>>166
a[sz]=x;をfscanf(stdin,"%d",&x); の下に
170デフォルトの名無しさん:2007/04/25(水) 23:14:20
>>159です。
素早い返答ありがとうございました(^0^)
171デフォルトの名無しさん:2007/04/25(水) 23:18:23
>>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;
}
172デフォルトの名無しさん:2007/04/25(水) 23:18:35
>>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
ネタ回答なんで気にしないでください。
173デフォルトの名無しさん:2007/04/25(水) 23:22:32
>>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;
}
174デフォルトの名無しさん:2007/04/25(水) 23:31:26
>>171さん>>173さん
素早いご回答ありがとうございます!
すごいです尊敬します
175デフォルトの名無しさん:2007/04/25(水) 23:33:34
尊敬するのは良いが、提出する前にちゃんと中身を検証しとけよ
176デフォルトの名無しさん:2007/04/25(水) 23:37:57
>>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;
}
177165:2007/04/25(水) 23:44:12
あら、エラーでした
でも少しわかってきたような気がします。
178デフォルトの名無しさん:2007/04/25(水) 23:44:25
>>176
俺もさ、数値で入力しようとしたんだけど10桁だとint 超えるよね
で、いま考え中
179デフォルトの名無しさん:2007/04/25(水) 23:45:15
にしてもCで書くと3者3様のプログラムになるねー。
自由度が大きい言語だからだね。BASICとかだと似たりよったりになる。
180デフォルトの名無しさん:2007/04/25(水) 23:46:16
>>178
あちゃあそうか。だとやっぱし>>173みたいにいきなりcharの配列に
入れさせるのが正しいのかもな。
181デフォルトの名無しさん:2007/04/25(水) 23:48:12
意外と難しいな
182デフォルトの名無しさん:2007/04/25(水) 23:49:54
>>180
うん、ただ気になったのが>>173だとたとえば1桁目を表示とした場合(1を入力)上位桁が表示されるわけだけどまずくない?
いや、俺は今考え中だよ、もちろん
183デフォルトの名無しさん:2007/04/25(水) 23:51:15
>>178
そこでそこでlong long(ry
184デフォルトの名無しさん:2007/04/25(水) 23:51:14
>>182
そしたら入力された文字列を前後ひっくり返しておけばいいのでわ?
185デフォルトの名無しさん:2007/04/25(水) 23:53:04
[1] 授業単元:プログラミング
[2] 問題文(含コード&リンク):
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3870.txt
[3] 環境
 [3.1] OS:Windows
 [3.2] コンパイラ名とバージョン:VC++ 2005
 [3.3] 言語: C++
[4] 期限:4/26 17:00
[5] その他の制限:

よろしくお願いします
186デフォルトの名無しさん:2007/04/25(水) 23:54:12
[1] 授業単元:C言語
[2] http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3869.txt
[3] 環境
 [3.1] OS: WindowsXP
 [3.2] コンパイラ名とバージョン:gcc
 [3.3] 言語: C
[4] 期限:金曜日。
[5] 制限:なし。
よろしくお願いします!

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;
}
188178: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;
}
189デフォルトの名無しさん:2007/04/26(木) 00:06:14
[1] 授業単元:C言語基礎
[2] 問題文:
任意の文字列を入力し、入力後に再度任意の文字列を入力し
最初の文字列と2回目の文字列が結合されて出力されるように作成せよ

[3] 環境
 [3.1] OS:Windows
 [3.2] コンパイラ名とバージョン:VC++
 [3.3] 言語: C
[4] 期限:4/26
[5] その他の制限:

さっぱりです・・・
よろしくお願いします
190デフォルトの名無しさん:2007/04/26(木) 00:07:10
>>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;
}
191デフォルトの名無しさん:2007/04/26(木) 00:14:07
訂正
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] 制限:なし。
お願いします!
193178: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;
}
194デフォルトの名無しさん:2007/04/26(木) 00:25:49
>>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のは基礎らしいから長くなっても
もっと初歩的な感じにしないとならなくないんかい?
使用する関数のみでやったほうがいいんかな
まぁもう寝るけど
196178: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使って役に(勉強に)なるのかなぁ?
あーおやすみです

俺も寝ますね
197デフォルトの名無しさん:2007/04/26(木) 00:38:17
>>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;
}
198192:2007/04/26(木) 00:57:57
夜遅くにありがとうございました!
助かりました♪
199デフォルトの名無しさん:2007/04/26(木) 02:41:53
>>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;}
200デフォルトの名無しさん:2007/04/26(木) 05:24:39
201200:2007/04/26(木) 05:29:12
ああああああああああああああああああああああああああああああああ
4文字以上のものかああああああっ
202200:2007/04/26(木) 05:38:55
203200:2007/04/26(木) 05:46:23
int kがおかしいな……
しにたい。
204165:2007/04/26(木) 07:57:58
皆様どうもありがとうございました。
少し素人っぽい感じに直して提出したいと思います(笑)
205デフォルトの名無しさん:2007/04/26(木) 12:12:47
C言語の勉強をするならエクリプスと
VisualStudioのどっちがいいの?
206デフォルトの名無しさん:2007/04/26(木) 12:16:08
本の付録でいいよ
207178:2007/04/26(木) 12:16:42
>>204
ども、正解とされるソースを先生が出してきたら教えて欲しいな
なぜこの問題でswitch case なのかが分からない、気になる
208デフォルトの名無しさん:2007/04/26(木) 12:17:52
>>206
ほんの付録というとBORANDのやつになっちゃうけど、
できれば統合開発環境がいいです!!
209デフォルトの名無しさん:2007/04/26(木) 12:21:29
BORANDのだって統合開発環境だと思うが
昔、本の付録についてたC++Builder3で勉強した
210デフォルトの名無しさん:2007/04/26(木) 12:25:04
borandのやつでも統合開発環境があるんですね。
VisualStudioだと一度ビルドしないと実行できないのが気に入りません。
普通はeclipseのJavaならビルドなしで実行できますよね?
でも、eclipseでCだとビルドの必要がありそうですね。
どうなんでしょうか?
211デフォルトの名無しさん:2007/04/26(木) 12:29:02
CとJavaを一緒にしないで欲しいけどな
eclipseってのは知らないがその場合インタプリタ方式で実行されているんじゃないか
BORANDにしたってビルドは必要だぞ
212デフォルトの名無しさん:2007/04/26(木) 12:29:13
なぜインタプリタにこだわるのかわからん。

CPad
ttp://hp.vector.co.jp/authors/VA017148/pages/cpad.html

を使えば、コマンドラインコンパイラでもエディタ→すぐ実行ができるのに。
213デフォルトの名無しさん:2007/04/26(木) 12:30:02
>>210
いや、ビルドって作業にはコンパイル作業も含まれるわけで、
インタプリタ言語で無ければ(名前と手間は兎も角)必ず必要になるのだが。
214デフォルトの名無しさん:2007/04/26(木) 12:33:56
>>212
そんなのがあったのですかこれならすぐに実行できるのかな?

>>213

eclipseだとソースを書いて保存するだけで、自動にコンパイルしてくれるのだと思います。
書いて保存するとすぐにエラーがあるラインが表示されますので
215デフォルトの名無しさん:2007/04/26(木) 12:35:51
>>214
>>212には似たような物がたくさん出てるが個人的にはCPadが一番
使いやすいと思う。

ソースを入れて右▼ボタンを押すだけで自動的にコンパイル・リンク・実行
をまとめてやってくれるしDOS窓は実行後にすぐに閉じたりしないし。
216デフォルトの名無しさん:2007/04/26(木) 12:40:43
>>215
なるほど。ありがとうございます
217デフォルトの名無しさん:2007/04/26(木) 12:50:34
スレ違いな議論をしないで宿題を出せYO!
218デフォルトの名無しさん:2007/04/26(木) 12:58:11
[1] 授業単元:C言語
[2] 問題文(含コード&リンク): 次のような、左上を直角とし「+-」からなる三角形図を作りなさい
+-+-+
+-+-
+-+
+-
+
[3] 環境
 [3.1] OS: Windows XP
 [3.2] コンパイラ名とバージョン: Visual Studio .NET
 [3.3] 言語: C
[4] 期限:5月2日

お願いします
219回答一番乗りw:2007/04/26(木) 13:02:55
>>218
#include <stdio.h>
int main()
{
printf(
"+-+-+\n"
"+-+-\n"
"+-+\n"
"+-\n"
"+\n");
return 0;
}
220デフォルトの名無しさん:2007/04/26(木) 13:03:23
#include <stdio.h>

int main()
{
printf("+-+-+\n+-+-\n+-+\n+-\n+");
return 0;
}
221デフォルトの名無しさん:2007/04/26(木) 13:05:29
>>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');
 }
}
222218:2007/04/26(木) 13:07:35
みなさんありがとうございます
223回答一番乗りw:2007/04/26(木) 13:10:00
// 一応真面目な方も貼っとく
#include <stdio.h>
#include <stdlib.h>

void trigon(unsigned len)
{
for (int ic = 0; ic < len; ++ic) {
for (int lc = 0; lc < len - ic; ++lc) {
putchar((lc % 2) ? '-' : '+');
}
putchar('\n');
}
}

int main(int argc, char ** argv)
{
int len = 5;
if (argc > 1) {
len = atoi(argv[1]);
}
trigon(len);
return 0;
}
224回答一番乗りw:2007/04/26(木) 13:11:46
>219-223
225デフォルトの名無しさん:2007/04/26(木) 13:22:25
>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;
}
226デフォルトの名無しさん:2007/04/26(木) 13:26:22
うはぁ、なんで内側の二つ目もループにするよ。チェックだけでいいんだからifでいいでしょよ。
227デフォルトの名無しさん:2007/04/26(木) 13:28:20
ifを使いたくなかったら、わざとforにした。
反省はしていない。
228デフォルトの名無しさん:2007/04/26(木) 16:14:52
実数を入力し小数点以下第1位で四捨五入し整数部を表示しなさい
実行画面
実数入力==>10.4
四捨五入:10

実数入力==>10.5
四捨五入後: 11
になるプログラムを作成しなさい
この問題わかる方がいましたら教えてください(T_T)
229デフォルトの名無しさん:2007/04/26(木) 16:19:21
>>228
>>1 のテンプレ読んで書きなおし
230デフォルトの名無しさん:2007/04/26(木) 16:19:34
>>228
0.5を足して整数部表示
書くのメンドイから後は自分でしてね
231デフォルトの名無しさん:2007/04/26(木) 16:22:24
何方か教えてください(ノ_<。)以下に示す変数をもとに商を求め,実行画面のように編集しなさい
int a=10;
int b=7;
doule syo;
実行画面
syo:1.43
何方かわかる方が居ましたら教えてください(ノ_<。)
232デフォルトの名無しさん:2007/04/26(木) 16:23:33
>>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;
}
233228の者ですが:2007/04/26(木) 16:24:52
229>それが問題集に書かれてるのはこれだけなんですよ(・_・;)
234デフォルトの名無しさん:2007/04/26(木) 16:25:14
>>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;
}
235デフォルトの名無しさん:2007/04/26(木) 16:25:48
>>205
Cならborlandをお勧めするのだけど(手軽だから)、
C++とかをやるようになると、eclipseとかの新しいコンパイラの方が良い。
ただし、微妙に安定しない。

VisualStudioも良いのだけど、#include<stdafx.h>とかの特殊な部分が含まれるから、微妙に抵抗は感じる。
standard editionとかなら、VisualStudioを使うのもいい。重いけど。
ただし、VisualStudioは初学者向けではない。
236デフォルトの名無しさん:2007/04/26(木) 16:25:56
>>232
round()はc99だな。って、コメントの間違いか。
237デフォルトの名無しさん:2007/04/26(木) 16:26:38
>>235
Eclipseはいつからコンパイラになりましたか?
238デフォルトの名無しさん:2007/04/26(木) 16:27:14
>>237
ごめんなさい。
gccですね。
239デフォルトの名無しさん:2007/04/26(木) 18:40:43
VC++Toolkit2003最強伝説
ごめんなさい。言ってみたかっただけです。
240デフォルトの名無しさん:2007/04/26(木) 19:38:24
[1] 授業単元: C言語
[2] 問題文(含コード&リンク):
番号(整数型)、氏名(20字以内)、年齢(整数型)、血液型(文字列)を
一組とした構造体配列(要素数2人分)を用意する。
キーボードからの2人分のデータを入力し構造体配列へ格納後表示しなさい。
氏名はfgetsを用いブランク(空白)を含む入力も可能とすること。
入力部分、表示部部は関数を用い関数の引数にはポインタを使用すること。
[3] 環境
 [3.1] OS: WindowsXP
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C
[4] 期限:2007年4月28日まで
[5] その他の制限: 特になし

よろしくお願いします。
241デフォルトの名無しさん:2007/04/26(木) 20:40:38
[1] 授業単元:C言語
[2] http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3875.txt  >>22の問題(>>30-31さんに書いていただいた)ものの機能拡張です。
[3] 環境
 [3.1] OS: Windows
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C
[4] 期限:金曜17時まで
[5] 制限:なし。
よろしくお願いします。

242デフォルトの名無しさん:2007/04/26(木) 21:51:42
1] 授業単元: C言語
[2] 問題文(含コード&リンク): http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3877.txt
[3] 環境
 [3.1] OS: Windows
 [3.2] コンパイラ名とバージョン
 [3.3] 言語:C
[4] 期限:出来るだけ早めでお願いします。無理言ってすいません。
[5] その他の制限: 現在習っているのが制御文、配列、文字と文字列、関数です。初心者なのでよろしくお願いします。
243デフォルトの名無しさん:2007/04/26(木) 22:15:20
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個でもソートできるようなマージソート関数をお願いします。
再帰かけるとスタックオーバーフローの恐れがあるので非再帰版も作ることにしました。
よろしくお願いします
245243:2007/04/26(木) 22:37:19
あしもた、calculate関数にしないとだめなのね。ちと待て。
246243:2007/04/26(木) 22:42:09
>>242
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3880.txt

ごめん、他の作業をしていたので気を取られてた。
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を使っております。

よろしくお願いします。 
248デフォルトの名無しさん:2007/04/26(木) 23:07:58
1000個でも少数とは……
一体どれだけあれば気が済むんだ?
249デフォルトの名無しさん:2007/04/26(木) 23:11:02
>>248
いや少数じゃなくて小数の間違いだと思うよ
250デフォルトの名無しさん:2007/04/27(金) 00:31:11
>>244
書いてみたけど何か遅いな。こんなものなのかな
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3881.txt
251デフォルトの名無しさん:2007/04/27(金) 00:38:55
>>250
すごく・・・早いです・・・


どうもありがとうございます
読んでみます
252デフォルトの名無しさん:2007/04/27(金) 00:44:58
理論的にはマージソートはクイック・ソートの1/2程度の速度は出る
はずなんだが、このプログラムは標準関数qsort()の1/10程度の
速度しか出てないような気がする。もっと改良できるはずなんだが
253デフォルトの名無しさん:2007/04/27(金) 00:47:12
マージでぇ?
254デフォルトの名無しさん:2007/04/27(金) 01:17:25
255デフォルトの名無しさん:2007/04/27(金) 01:24:02
>>253
http://www.codereading.com/algo_and_ds/algo/merge_sort.html

たとえばこれ。再帰版なんだが、>>250より遥かに高速だ。
>>250は元々シーケンシャルアクセスしかできないデバイスに適用できる
アルゴリズムで、コピーの回数が相当多いため遅くなっているのだと思う。
256デフォルトの名無しさん:2007/04/27(金) 23:10:56
おいっ、どうした?もっと宿題を出せゴルァ!
257デフォルトの名無しさん:2007/04/27(金) 23:24:18
>>256
ちょwwww
お前コテとトリップつけてこのスレに居座ってくれ。
俺はGW中は答える暇がないと思うので。
258デフォルトの名無しさん:2007/04/27(金) 23:27:42
宿題を○投げする奴もGWの終わりギリギリに
ならないと投げてこないと思う。

まさにゆとり。
259デフォルトの名無しさん:2007/04/27(金) 23:28:35
だな。
260デフォルトの名無しさん:2007/04/27(金) 23:36:26

[1] 授業単元:cプログラミング
[2] 問題文(含コード&リンク):
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3883.txt
 [3] 環境
 [3.1] OS:Windows xp
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語:C
[4] 期限: G.W明け
[5] その他の制限:特になし。 お願いします。
261デフォルトの名無しさん:2007/04/27(金) 23:37:10
どうせGW終わり頃にスレ探すだろうから今言ってもしょうがないけど、
俺GW暇だからちょっと難しい問題でもがんばっちゃうYO



といっても休みはカレンダー通りだけどな・・・ orz もっと寝ていたい
262デフォルトの名無しさん:2007/04/28(土) 00:08:29
>>260
fflush(stdin);は環境依存かも
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3884.txt


お酒の見ながらやったから間違ってても気にしない
263デフォルトの名無しさん:2007/04/28(土) 00:15:49
printfの位置がなんか間違ってるな
まぁそこらへんは自分で工夫してちゃんと表示されるようにがんばれ
264デフォルトの名無しさん:2007/04/28(土) 00:54:15
265デフォルトの名無しさん:2007/04/28(土) 00:57:29
[1] 授業単元:プログラミングU
[2] 問題文(含コード&リンク):
 http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3885.txt

 weather_3.datの中身↓
 http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3886.txt

 [3] 環境
 [3.1] OS: Linux
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語:C
[4] 期限: なるべく早く、お願いします。できれば朝までにお願いします。
[5] for文でお願いします。なるべく簡単にお願いします。

すみません、問題が多いですがよろしくお願いします。
266デフォルトの名無しさん:2007/04/28(土) 01:55:37
おい、お前ら、出番です。ぎりぎりちゃんがきましたよ?


「なるべく早く」やれって
267デフォルトの名無しさん:2007/04/28(土) 02:06:16
>>265
weather_3.datのEOFは最後のデータ(その場合117)の後ろかい?
出来れば最後のデータの後ろには改行コードを入れてくれれば良いのだが・・・
268デフォルトの名無しさん:2007/04/28(土) 02:22:00
>>265
とりあえず練習1、配列でって言ってるしweather_3.datの中身固定ってことで決め打ちしたからな
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3889.c
練習2の上記の操作ってどれよ?
269268:2007/04/28(土) 02:25:05
あ、ゴミ入れたままでやんの、適当に消しといて
270265:2007/04/28(土) 02:43:31
>>266
ごめんなさい。
>>267
たぶんそうだと思います。
>>268
ありがとうございます。
すみません、weather_3.datの中身は本当はわからない状態で出すんです。
あとweather_3.datは端末エミュレータから入力して
やっているんです。
emacs ~~.c > weather_3.dat 見たいな感じで…
あとARRAY_SIZEってなんでしょうか?

ごめんなさい。こんな時間に…
271デフォルトの名無しさん:2007/04/28(土) 02:59:01
>>270
練習3
練習2の処理を行ったあと,もう一度別のループで奇数番目のデータを配列bの残り部分に移動せよ.
結果が正しいことを確かめよ.

> 配列bの残り部分
とはなんぞや?何が残り?
272268:2007/04/28(土) 03:05:15
>>270
こういうことでいいのか?C89では配列の要素数は定数でしか指定できないから
C99では変数でもできるけどやったことないので他の人に頼んでください
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3891.txt

練習1と2の違いは何ぞや?
273デフォルトの名無しさん:2007/04/28(土) 03:16:08
>>265
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3892.txt
自分でもなんだかよく分からず、きんもぉ〜〜〜☆なソースになったがw
274デフォルトの名無しさん:2007/04/28(土) 03:19:44
並び替えは、要するに基本選択法ってことか?並び替えも課題だよな・・・
275268:2007/04/28(土) 03:29:59
配列でってあるからrealloc使わなかった俺の立場なんてどうでもいいですよね(´・ω・`)
276デフォルトの名無しさん:2007/04/28(土) 03:33:24
ってか、出題者のレベルが低そうな気がしてならんのだが・・・
277デフォルトの名無しさん:2007/04/28(土) 03:34:08
出題者というのはここで質問している人の授業の担当者という意味ね
278デフォルトの名無しさん:2007/04/28(土) 03:36:38
んー、どっちかというと多分この問題の出し方だと生徒の
全体の実力に合わせて問題作っている感じがするんだけど。

専門学校かも?
279デフォルトの名無しさん:2007/04/28(土) 03:42:48
Cの講義やり始めたばっかならこの時期の問題としては考え難いし
一年以上経ってるなら逆に心配になってくる
280デフォルトの名無しさん:2007/04/28(土) 07:42:59
誰か無視されてる問題もやってやれよ。
281デフォルトの名無しさん:2007/04/28(土) 08:44:36
>280
お前がやってやればいいだろ。
282265: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
だけなんです。
前回の配列部分も休んでしまってわからないんです。
だからそれ以外はさっぱり…です…


283デフォルトの名無しさん:2007/04/28(土) 09:57:59
>>282
そんな態度だから単位落すんだよ。休んだから配列が分らないだ?
教科書を読めば分るだろ。黄金週間中に教科書を頭から読んで
練習問題やりまくれば何とかなるよ。あと、問題文が凄く分りにくいから
出題者に文句言って、分りやすく作り直してもらった方が良さげ
284265:2007/04/28(土) 11:44:03
確かにそうですね...
授業でてないからってそれじゃあだれですよね.

そこでプログラミングC言語の専門書買って最初から勉強しようと思うのですが
おすすめの専門書ありませんか?
285デフォルトの名無しさん:2007/04/28(土) 11:49:57
教科書は無いの?
専門書なんか買っても金の無駄だと思うけど
できれば単位取るのを諦めて、他の道へ進むのを考えるのがオススメ
286265:2007/04/28(土) 12:05:37
>>285
教科書はありますが,少しわかりにくくて...

最近,大学やめることを悩んだんですよね...
今の勉強がおもしろくないし,ついていけてない.
いろんな人に相談して,やりたいことないのにやめるのは
やっぱりよくないということで,通い続けているんです.
特にプログラミングがついていけてなくて...
関係ないレスになってしまってすみません.
287デフォルトの名無しさん:2007/04/28(土) 12:08:08
>>286
さっさとやりたいことを見つけてやめればいいだろ
プログラミングを勉強するより、そっちに努力しろ
288デフォルトの名無しさん:2007/04/28(土) 13:08:47
>>282
問題文は順を追ってプログラムを完成させるような感じみたいだが・・・
それほど難しいもんでもないと思うが・・・。関数だって難しいもんは使ってへんよ?
アルゴリズムが分からんだけじゃね?
289デフォルトの名無しさん:2007/04/28(土) 14:25:06
>それほど難しいもんでもないと思うが・・・
何を作れと指示されているのかの解釈が難しいんだよね

・「配列aに読み込み,別の配列bにデータが逆順となるよう入れ替えよ」とは
 配列aから配列bにコピー、ってこと?
・「配列bに上記の操作をしてデータを移動せよ.」とは
 むーぶ?
 例えば配列aから配列bにコピー後、配列aの内容を0クリア、でいい?
・「もう一度別のループで奇数番目のデータを配列bの残り部分に移動せよ.」
 上に倣って、元の要素が配列のサイズの半分以下という条件で、
 配列bの奇数番目のみをコピーしつつ0クリア、でいい?

あまりに問題に抜けが多くて想像して作ってもいいけど難易度高すぎ
(...ひょっとして授業中に前提となるものが提示済みなのか?)
290デフォルトの名無しさん:2007/04/28(土) 14:37:31
泳げない奴は(ry
291デフォルトの名無しさん:2007/04/28(土) 15:05:33
浮き輪でもビート版でも使って泳げば良いのさ。パンがないならケーキを(ry
292デフォルトの名無しさん:2007/04/28(土) 15:10:51
>ビート版
ハリウッド板南極物語は、動物のお医者さん犬だったorz
293デフォルトの名無しさん:2007/04/28(土) 15:25:15
>>291
じゃ、君がビート版に
294デフォルトの名無しさん:2007/04/28(土) 16:40:40
>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");
295デフォルトの名無しさん:2007/04/28(土) 17:07:01
番兵は、

・検索対象の値そのものを配列の末尾に加えておく。
・すると、ループの最後まで行けば必ず見つかるので、終了判定はいらない。
・見つかったのが目標物なのか番兵かは、添え字がどこまで進んだかで判定。

というものだな。
296デフォルトの名無しさん:2007/04/28(土) 17:14:30
条件判定の数を削減するために置くダミーのデータ
297デフォルトの名無しさん:2007/04/28(土) 17:17:48
298デフォルトの名無しさん:2007/04/28(土) 17:20:18
>>297
英語のほうを見ると1.の用法(¥0で文字列終了とか)しか書いてないな。
299デフォルトの名無しさん:2007/04/28(土) 17:53:36
>>286
好きなことで分からないなら何故調べようとしない?
配列が分からないなら分からないなりに簡単なコード書いてみて
それいじくるところから始めてもう一度教科書読めよ
関数名くらいぐぐれ
300デフォルトの名無しさん:2007/04/28(土) 17:58:24
ttp://www.bohyoh.com/CandCPP/C/Library/index.html
漏れはここを参照している
301デフォルトの名無しさん:2007/04/28(土) 18:00:23
>>299
よく読むだ、しむらぁ〜
「やりたいこと」ではなく「やりたいことない」だぁ
302デフォルトの名無しさん:2007/04/28(土) 18:09:32
>>241
消してしまったか。
303デフォルトの名無しさん:2007/04/28(土) 18:16:34
>>301
それで結局授業出てないならやめるべきだな…
304デフォルトの名無しさん:2007/04/28(土) 18:21:18
金の無駄
やりたいことないからとりあえず大学って
うらやましぃ〜
大学卒業したかったよorz
305デフォルトの名無しさん:2007/04/28(土) 18:52:52
306デフォルトの名無しさん:2007/04/28(土) 18:57:36
feofっていうのはなんて便利なんだ……
307デフォルトの名無しさん:2007/04/28(土) 19:12:14
数値データ以外に英数文字が入ってたり 113a みたいな数値+文字とか入ると
scanfの書式設定で%dとint型変数の指定はいただけない
308デフォルトの名無しさん:2007/04/28(土) 19:13:32
>>302 再うpしました。よろしくお願いします。

[1] 授業単元:C言語
[2] http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3895.txt
>>22の問題(>>30-31さんに書いていただいた)ものの機能拡張です。
[3] 環境
 [3.1] OS: Windows
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C
[4] 期限:
[5] 制限:なし。
よろしくお願いします。


309デフォルトの名無しさん:2007/04/28(土) 20:06:11
fscanfもfgetsとsscanfに代えるべき?
310デフォルトの名無しさん:2007/04/28(土) 20:07:35
fscanf?
311デフォルトの名無しさん:2007/04/28(土) 20:15:01
文字データが数値を扱う型の変数に入るような状況を避ける措置がしてありゃおkかと。
まぁ、細かいことを言ってたらキリがなくなるんで、あとは個人で追求するだけ追及かね。
宿題は目的が果たせていりゃとりあえずおk。
312デフォルトの名無しさん:2007/04/28(土) 20:39:29
そっかfscanf(stdin,...)と変わらないんだったな…
じゃあとりあえずはfgetsとstrtol使っとけばおk?
313デフォルトの名無しさん:2007/04/28(土) 21:03:02
314デフォルトの名無しさん:2007/04/28(土) 21:22:08
315265: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] その他の制限:なし
317デフォルトの名無しさん:2007/04/28(土) 22:55:52
(0≦m<n) なんとなく顔に見えた、すまそ。 (0>m<0)
318316: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の意味がよく分からないので解説していただけると有難いです。
319デフォルトの名無しさん:2007/04/28(土) 23:08:30
>>318 入れ替えをした範囲の両端の文字じゃない?
320316:2007/04/28(土) 23:25:41
実行例を間違えていました。
Swapped: Goelgo agreed to its largest acquisition yesterday,reaching a deal to purchase DoubleClick.
321デフォルトの名無しさん:2007/04/28(土) 23:27:26
外側から入れ替えていって最後に入れ替えたペアのことだろ。
322316:2007/04/28(土) 23:32:24
>316さん、321さん
有難う御座います。助かりました。
できれば、どの様なコードになるか教えていただけませんか?
323デフォルトの名無しさん:2007/04/28(土) 23:37:27
316は自分だろうと
324316:2007/04/28(土) 23:41:59
すみません間違えました。
>319さん
有難う御座いました。
あと、自己解決できました。
皆様、有難う御座いました。
325デフォルトの名無しさん:2007/04/28(土) 23:43:28
>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;
}
326デフォルトの名無しさん:2007/04/29(日) 00:22:05
[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; }
を元に作ってください。本当に失礼しました
330デフォルトの名無しさん:2007/04/29(日) 00:48:41
>>326
およそ3
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] その他の制限:特に無し
332デフォルトの名無しさん:2007/04/29(日) 01:14:03
>>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;
}
333デフォルトの名無しさん:2007/04/29(日) 01:44:56
334デフォルトの名無しさん:2007/04/29(日) 02:05:09
335デフォルトの名無しさん:2007/04/29(日) 02:13:09
>>331
アルゴリズムが分からん……。
正方形に分割してやれば、おのずと合同な三角形にはなるのかな?
336デフォルトの名無しさん:2007/04/29(日) 03:39:51
[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;
}
という風に作るやり方がよくわからないのでそれだけでもご教示願えたら
物凄く有難いです。
337デフォルトの名無しさん:2007/04/29(日) 12:04:00
>>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構造体の関係と、何を聞きたいのかが不明確かな。

リストというデータ構造を調べてくると良い。
338デフォルトの名無しさん:2007/04/29(日) 12:13:14
二分木と線形リストは参考としてあるのかな?

しかし、リストの中にリストがあるというのが解釈するのに難しい。
例えば、市内に存在する学校のリストがある。
そして、学校のノードにはその学校に在学する学生のリストがある。
――という解釈でいいのか?

そもそも、二分木と線形リストは自分でできたということだから、
>>336が分からないというのは、char *nameの扱いのみということでいいのか?
339デフォルトの名無しさん:2007/04/29(日) 13:18:49
>>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の扱いだけでもヒントかなにか貰えたら
物凄く助かります。
340デフォルトの名無しさん:2007/04/29(日) 16:23:52
>>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;
}
341デフォルトの名無しさん:2007/04/29(日) 16:25:28
strdup()使うと楽なんだけどな
342デフォルトの名無しさん:2007/04/29(日) 16:34:34
>>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);
とかいう落ちってことはないよな・・・
343デフォルトの名無しさん:2007/04/29(日) 16:37:03
こんな感じか。
#include <stdio.h>
#include <string.h>

#define BUF_SIZE 256

int main()
{
    char *p, buf[BUF_SIZE];

    scanf("%s", buf);
    p = strdup(buf);

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

    free(p);

    return 0;
}

つーか、>>340
sizeof(char)*(strlen(buf)+1)
じゃないとダメか。
344デフォルトの名無しさん:2007/04/29(日) 16:43:11
うpロダ使ってくれい
345339:2007/04/29(日) 18:23:13
返事が遅くてすいません。
大学のlabから串の関係か書き込みができなかったので。
これから先教えて貰えるかどうかはわからないですが
進捗状況だけアプロダにおいときました。
これからまた大学に戻って続きをするので
レスが遅くなったりするので先に謝罪をさせていただきます。
すいません。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3903.zip


>>340,343
考え方の参考になりました。ありがとうございます

>>342
とりあえずそんな感じで作ってました
charで作るのが初めてだったので。
初歩的質問ですいません。
方向的な確認はできたので、
ものすごく助かります。ありがとうございます


346デフォルトの名無しさん:2007/04/29(日) 18:45:08
>333 >334
遅くなって申し訳ありません。
本当にありがとうございました。
347デフォルトの名無しさん:2007/04/29(日) 21:39:57
>>332
線形合同法でできますか??
348デフォルトの名無しさん:2007/04/29(日) 21:55:21
[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まで] または [無期限] のいずれか)月曜日まで
349デフォルトの名無しさん:2007/04/29(日) 21:57:39
350332:2007/04/30(月) 00:34:40
>>347
こうですか? よくわかりません!
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3904.txt
351デフォルトの名無しさん:2007/04/30(月) 01:08:03
[1] 授業単元:プログラミング
[2] 問題文(含コード&リンク): ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3905.txt
[3] 環境
 [3.1] OS: (Windows/Linux/等々) XP
 [3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等) VC
 [3.3] 言語: (C/C++/どちらでも可 のいずれか) C
[4] 期限: ([yyyy年mm月dd日hh:mmまで] または [無期限] のいずれか) 月曜の午後三時までです。
352デフォルトの名無しさん:2007/04/30(月) 01:13:09
ワロタ
353デフォルトの名無しさん:2007/04/30(月) 10:01:18
>>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が間違ってる気がする。
354デフォルトの名無しさん:2007/04/30(月) 10:08:06
問2
Person family[N];
int count = 0;
for(i=1; i<=N; i++){
if(family[N].sex == female) && family[N].marstatus == single) {count += 1;}}
355デフォルトの名無しさん:2007/04/30(月) 10:14:38
> char** name; char** fastname;
これはchar* name; char* fiastname;だな。
二重に恥ずかしい間違いだ。
356デフォルトの名無しさん:2007/04/30(月) 10:43:45
>>353

返事が遅れてしまい申し訳ありません。
助かりました。これを元に一から考え直してみようと思います。
ありがとうございました。
357デフォルトの名無しさん:2007/04/30(月) 11:19:37
>355
fiastの方が恥ずかしいだろ
358デフォルトの名無しさん:2007/04/30(月) 11:40:36
>>348
>>349
おねがいしますorz
359デフォルトの名無しさん:2007/04/30(月) 15:15:40
計算式は分かったけど、針が平行線に交わった回数の数え方が分からん
360デフォルトの名無しさん:2007/04/30(月) 15:51:04
簡単のため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);
}
361デフォルトの名無しさん:2007/04/30(月) 15:51:45
[1] 授業単元:C言語
[2] http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3907.txt
[3] 環境
 [3.1] OS: WindowsXP
 [3.2] コンパイラ名とバージョン:gcc
 [3.3] 言語: C
[4] 期限:
[5] 制限:scanfは使わない
よろしくお願いします!
362デフォルトの名無しさん:2007/04/30(月) 15:53:55
>>348
y座標をランダムに振る必要もないし、角度を使うと標準の円周率に頼らざる得ないし、
まあ、てきとうです。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3906.txt
363デフォルトの名無しさん:2007/04/30(月) 15:55:20
かぶったか……
364デフォルトの名無しさん:2007/04/30(月) 15:56:47
>>361
このスレのどこかにある。
365デフォルトの名無しさん:2007/04/30(月) 16:05:24
>>364
仕様の部分やエラー処理で不具合があったので
再度掲載させていただきました。よろしくお願いします。
366デフォルトの名無しさん:2007/04/30(月) 16:18:45
>>361
期限が書いてないぞ
367デフォルトの名無しさん:2007/04/30(月) 16:29:36
>>366
期限は1日〜遅くて7日です。
368デフォルトの名無しさん:2007/04/30(月) 16:36:50
あ、円周率使ってよかったんだ…
369デフォルトの名無しさん:2007/04/30(月) 17:16:18
>>365
どのへんに問題あったのか書いてくれないの?
一から作るのめんどい
370デフォルトの名無しさん:2007/04/30(月) 17:19:24
>>369
解凍後の表示がされないのと、エラー処理の2つ目です。
よろしくお願いします。
371デフォルトの名無しさん:2007/04/30(月) 17:28:01
>>367
「期限」の意味わかってる?
普通は「遅くても5/7まで」とか書くんだよ?
372デフォルトの名無しさん:2007/04/30(月) 19:43:19
>>361 自分でも汚いソースだと思うが結果は出ていると思う
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3908.txt
373デフォルトの名無しさん:2007/04/30(月) 19:52:56
あぁ〜すまん、*に続いて数字の部分がなってなかった。*が入ってたらエラーになってるから
*の後ろに数字が来たらという条件に直しておいて
374デフォルトの名無しさん:2007/04/30(月) 19:56:09
って、さらに*****が続いたときの解凍がうまく出来ていないや・・・ちと書き直してくるw
375デフォルトの名無しさん:2007/04/30(月) 20:01:31
376デフォルトの名無しさん:2007/04/30(月) 20:19:31
>>375
ありがとうございました!
377デフォルトの名無しさん:2007/04/30(月) 20:19:57
[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まで] または [無期限] のいずれか) 今日中
378デフォルトの名無しさん:2007/04/30(月) 21:26:51
まず、用語がむずいんだよな。
379デフォルトの名無しさん:2007/04/30(月) 21:31:10
>>362
あー針の下端が針に一番近いラインより下にあれば交わってるってことか、面白いなぁ
380デフォルトの名無しさん:2007/04/30(月) 21:46:05
>>379
boostのmt19937を使ったけど一向に収束しねえなw
381デフォルトの名無しさん:2007/04/30(月) 22:07:07
>>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
382デフォルトの名無しさん:2007/04/30(月) 22:25:47
パンッ!
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--がなくても正常な結果がえられると言うのですが僕にはそのプログラムが作れません。
どうか、作ってはいただけませんか?? お願いします。
384デフォルトの名無しさん:2007/04/30(月) 23:07:33
>>381
その公式どおりやるとPkが4294815800程度になるので
√(1-Pk^2)の部分がエラーになっちゃうんだけど
385デフォルトの名無しさん:2007/04/30(月) 23:18:19
>>383
すげー醜い、すれ違い、清書したものをうpロダにうpして出直し!
386デフォルトの名無しさん:2007/04/30(月) 23:21:13
>>383
初心者でもこれは酷すぎる
改行インデントくらいしろ
俺も初心者だけど、ここまで酷いソースにはできない
387デフォルトの名無しさん:2007/04/30(月) 23:22:49
>>386
またお前か、それについてgdgd言うけど、ここに書く際に改行を省略しただけだろ。うるせーんだよ
ろくに答えもしないくせにソース批判しかしないボケは
388デフォルトの名無しさん:2007/04/30(月) 23:24:33
いや、ここに書くことを踏まえてもこいつはひどすぎる
389247:2007/04/30(月) 23:36:23
254様 ありがとうございます。

今まで書き込みが規制中やらで書き込みができませんでした。
390デフォルトの名無しさん:2007/04/30(月) 23:41:29
>>383
while( j==n ){P[i]=0;j=P[--i];Q[i][j]=0;P[i--]++;}
こういうこと?
391初心者:2007/05/01(火) 00:02:19
すいません。
書き直しました
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3911.txt

>390
それで実行できますかね??
一応きれいなものをupしました
392362:2007/05/01(火) 00:04:12
>>362
get_floorがダメだ。
return n*floor(x/n);
に直しといて。
393362:2007/05/01(火) 00:05:42
>>391
j == n になることってあるのか?
394デフォルトの名無しさん:2007/05/01(火) 00:07:42
>>391
確認だけど、今現在は正しい結果が得られるの?
で、ループの中からi--を消せばいいの?
あとスレ違いなんだけどそこは理解できた?
395デフォルトの名無しさん:2007/05/01(火) 00:11:23
>393
理屈ではありえないとは思うんですが、実際に条件をn-1にすると実行できません

>394
一応正しい結果は出てます。
二番目のwhile文のなかのi--を消したいのですが
スレ違いですか、すいません
396デフォルトの名無しさん:2007/05/01(火) 01:07:31
>一応正しい結果は出てます。
とりあえず以下3点、気になる事があるんだが
int success(int Q[N][N],int n)中の
 done==1;の==。
int main(void)中の
 P[i]=j;の次の行。
 if(success(Q,n)==1);{の;。

>i--を消したいのですが
goto使えば出来るんじゃない?
それかfor(i=0;i<n;i++)のi++を最後に書いてcontinueとか
397デフォルトの名無しさん:2007/05/01(火) 01:12:24
>>383
なんだこれ
398デフォルトの名無しさん:2007/05/01(火) 01:22:04
>>397
抽象化した結果表現されるものは、設計者が想定した概念やイメージだ。しかし、
実在するものそのものではなく、人が考えたものであるために、このイメージは
非常に脆く、不安定だ。外部からの影響をもろに受け、形を変え易い。個々人が
持つイメージの些細な相違から認識のずれが生じ易い。扇風機の使い方は人に
よって異なることはないが、人がイメージしたものは、その生成から、破棄に至る
まで、非常に不安定な状態になり易い。それを防ぐには、イメージそのものをなる
べく強固なものにし、インターフェースに一貫性と整合性をもたせ、外因による影響
を受けに難くく、壊れ難くするための技術を見につけ、理解を深めておくしかない。

仮想化とは対象物を不完全ながらもその性質や姿を模倣し現出させることだ。
対して抽象化は、対象物のある特徴的な側面を抽出し概念化することだ。
仮想化で抽象化の技術が使われることはあるだろうが、その逆は考え難い。
コンピュータを使い、扇風機やコタツを抽象化することはできても、仮想化する
ことはできないのだ。少なくとも今の技術では無理だ。コンピュータがその姿形
を変えることはできないのだから。コンピュータが仮想化できるものは、コンピュー
タそのものが直接扱うものだけだ。例えば、仮想メモリ、仮想ネットワーク、仮想
マシン、仮想キーボードといったものだ。
399デフォルトの名無しさん:2007/05/01(火) 01:32:51
>>398
死ねよカス
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に入れる。

お願いします。

401デフォルトの名無しさん:2007/05/01(火) 02:16:00
#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;
}
402デフォルトの名無しさん:2007/05/01(火) 02:19:41
>>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;}
403401:2007/05/01(火) 02:21:54
そうか、C++か。
>>401はなかったことに……。
404デフォルトの名無しさん:2007/05/01(火) 02:31:42
C言語スタイルで記述したソースもC++コンパイラで通るのであれば
拡張子をcppにしてコンパイルすればC++のソースとして使える
だっておーー(バンバンAA略)
405デフォルトの名無しさん:2007/05/01(火) 02:40:08
もういいよ荒れるから・・・
406デフォルトの名無しさん:2007/05/01(火) 02:41:47
実際その通りだろ。
それがスタンダードかどうかは別として。
407デフォルトの名無しさん:2007/05/01(火) 02:43:24
いや、すまん、要約すると そのソースをC++として扱え と遠まわしに言っただけでつ orz
408デフォルトの名無しさん:2007/05/01(火) 02:55:24
また基地外K○s○k○b○が来るからやめよーぜ
409デフォルトの名無しさん:2007/05/01(火) 02:59:20
ようわからんけど、キモメンメガネデヴピッツァ?
410デフォルトの名無しさん:2007/05/01(火) 03:08:39
よく覚えてないけど>>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] その他の制限:特にありません。

丸投げでよろしくお願いします。
412デフォルトの名無しさん:2007/05/01(火) 16:58:21
413デフォルトの名無しさん:2007/05/01(火) 17:11:56
414デフォルトの名無しさん:2007/05/01(火) 17:20:06
>>384
公式は教科書のだから合ってると思うんですがorz
[0,1]の乱数でそうなっちゃいますか??
415gost :2007/05/01(火) 17:47:37
符号なし 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 を加算してはなりません。
416デフォルトの名無しさん:2007/05/01(火) 17:54:20
ヒント:移項
417デフォルトの名無しさん:2007/05/01(火) 18:31:13
0xFFFFFFFF - a < b
ではいかんか?
418デフォルトの名無しさん:2007/05/01(火) 19:40:11
[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] その他の制限: 特にありません。

まったく覚えていないので、誰かお願いします
419デフォルトの名無しさん:2007/05/01(火) 22:09:21
>>418
k術とか1術数値ってなんですか?
420デフォルトの名無しさん:2007/05/01(火) 22:41:25
よくわかりません。
#include <stdio.h>
int main()
{
    int i, r = 0, n[100], k = 0, T[100];
    while((n[k] = getchar()) != '\n')
        n[k++] -= '0';
    for(i = 0; i < k; i++)
        r = (10*r + n[i])%3;
    if(r == 0)
        printf("3の倍数\n");
    else
    printf("3の倍数ではない\n");
    return 0;
}
421デフォルトの名無しさん:2007/05/01(火) 22:46:19
T[100]は蜃気楼です。
422デフォルトの名無しさん:2007/05/01(火) 23:11:53
3の倍数なら
for(i=0,r=0; i<k; i++) r += n[i];
if(r%3==0) ……
ってした方が簡単じゃね?
423デフォルトの名無しさん:2007/05/01(火) 23:15:00
3の倍数って不思議だな
424418:2007/05/01(火) 23:17:15

http://www-ui.is.s.u-tokyo.ac.jp/~takeo/course/2005/algorithm/note-1.pdf#search='%EF%BC%93%E3%81%AE%E5%80%8D%E6%95%B0%20%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0'

ここの 3ページの 3の倍数の判定 ってところの表を配列でプログラミング
すればいいと思うのですが自分にはさっぱりです
425デフォルトの名無しさん:2007/05/01(火) 23:33:16
#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;
}

426デフォルトの名無しさん:2007/05/01(火) 23:40:04
>>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;
}
427デフォルトの名無しさん:2007/05/01(火) 23:43:36
>>426
なるほど。
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
お願いします

429デフォルトの名無しさん:2007/05/02(水) 00:24:34
>>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;
}
430デフォルトの名無しさん:2007/05/02(水) 00:29:19
突っ込みどころのある解答をする奴は荒らしを呼びたいの?
431デフォルトの名無しさん:2007/05/02(水) 00:31:00
ジャニーズじゃあるまいし
432429: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;
}
433デフォルトの名無しさん:2007/05/02(水) 00:57:51
434デフォルトの名無しさん:2007/05/02(水) 01:04:25
>>377
>>381
おねがいしますorz
435デフォルトの名無しさん:2007/05/02(水) 01:12:42
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
よろしくお願いします。
437デフォルトの名無しさん:2007/05/02(水) 01:46:07
>>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;
}
438デフォルトの名無しさん:2007/05/02(水) 01:49:01
>>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;
}
439438:2007/05/02(水) 01:49:49
limits.hはいらないわ。
駄目すぎだ……(´・ω・`)
440デフォルトの名無しさん:2007/05/02(水) 01:52:44
>>438
バブルソートも掛けてるのか。律儀だなw
しばらくlimits何処で使ってるんだ?と悩んだ
441デフォルトの名無しさん:2007/05/02(水) 01:54:07
>>429>>435ありがとうございますところでiostreamとかcmathは習ってないんですがstdio.hとかmath
じゃできないでしょうか?
442デフォルトの名無しさん:2007/05/02(水) 01:54:35
>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;
}
443デフォルトの名無しさん:2007/05/02(水) 01:57:36
>441
>[3.3] 言語: C++
どういうことよw
444デフォルトの名無しさん:2007/05/02(水) 01:58:19
だれもintの配列だなんていってないから
みんな不正解です^^
445429:2007/05/02(水) 01:58:59
うわああああああああああああああああああああん。
寝る。
>>441のことは任せた。
446デフォルトの名無しさん:2007/05/02(水) 02:00:40
哀れすぎる…
447デフォルトの名無しさん:2007/05/02(水) 02:05:43
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3881.txt

ここでやっていただいたソースなんですが、
int型の変数fの動きと役目がよくわかりません。
どなたか解説していただければ…
448デフォルトの名無しさん:2007/05/02(水) 02:07:30
>>443え?Visual Studio6.0 Visual C++ってのを使ってんですけど見たこと無いもんで…
iostreamとかcmathは使わないとできない問題ですか?
449デフォルトの名無しさん:2007/05/02(水) 02:19:27
450436: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;}}}}
453デフォルトの名無しさん:2007/05/02(水) 03:23:39
>>452
sizeof(*Alpha)→sizeof(Alpha)/sizeof(*Alpha)
454デフォルトの名無しさん:2007/05/02(水) 03:33:42
>>453
おれならこう書いちゃうな
(前略)
Sort(Alpha, ARRAYSIZE);
(中略)
for (k = 0; k < ARRAYSIZE; k++)
(後略)
455デフォルトの名無しさん:2007/05/02(水) 03:34:49
>>435
Pk = 12/n×Σ(Xi × Xi+k) -3

書き方悪かったですか??
公式は確認しましたorz
456デフォルトの名無しさん:2007/05/02(水) 03:35:41
>>454
スマン、よく見てなかった
457デフォルトの名無しさん:2007/05/02(水) 07:14:02
>>453, 454
書き込みThanks.
458デフォルトの名無しさん:2007/05/02(水) 08:29:15
昨日の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++です。

皆さん、どうかお力添えよろしくお願いします。
460デフォルトの名無しさん:2007/05/02(水) 13:54:43
>>455
式が良く分りません。こうですか?
ttp://www.borujoa.org/upload/source/upload11425.pdf
461デフォルトの名無しさん:2007/05/02(水) 14:00:29
テーマ:判断処理(if文)
2人の得点を入力し勝者を表示しなさい
実行画面
aさんの得点==>200
bさんの得点==>150
aさんの勝ち

aさんの得点==>100
bさんの得点==>250
bさんの勝ち

aさんの得点==>120
bさんの得点==>120
引き分け

何方かわかる方がいましたら教えてください(ノ_<。)
462デフォルトの名無しさん:2007/05/02(水) 14:11:23
>>455
多分、Pk < 1 にならなきゃいかんと思うのだけど、
その公式じゃ、n = 2000000 で k = 1〜10 だと Pk < 1 になってくれない。
463デフォルトの名無しさん:2007/05/02(水) 14:25:50
@学生番号、英語、数学、国語の点を二次元配列sに格納する
A3教科の合計点を計算す。
B合計点の大きい順に順位をつける
intを指定したあとのプログラミングお願いしまず
5分以内でお願いします。
464デフォルトの名無しさん:2007/05/02(水) 14:29:00
>>460
多分Σの括弧の中はi番目のXとi+k番目のXを掛けてるんじゃないかな
465デフォルトの名無しさん:2007/05/02(水) 14:31:13
>>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;
}
466デフォルトの名無しさん:2007/05/02(水) 14:31:17
>>460
すいません。
こんな感じです↓
ttp://www.borujoa.org/upload/source/upload11426.pdf
467465:2007/05/02(水) 14:35:25
468411:2007/05/02(水) 16:53:39
>>411です。
どなたかやってはいただけないでしょうか?
469デフォルトの名無しさん:2007/05/02(水) 17:15:23
>>412 >>413でファイルの表示は分かったが、ファイルとディレクトリの違いが
どこにどのように情報が格納されているか分からん・・・
検索してみたら、DOSのdirやUNIX系OSのlsコマンドを自作する内容の書かれた本はあるみたいだが・・・

ttp://www.cbook24.com/bm_detail.asp?sku=4839919844
Chapter18[十八日目] dirコマンド
7 dirコマンド
これを見てみようかと思ってはいるが、本の値段が・・・
これから本屋に行って、あったら見てこようかとは思ったのだが・・・
レスの期限には間に合いそうにないかな・・・スマソ
470デフォルトの名無しさん:2007/05/02(水) 19:36:32
>>459
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3916.cpp

>>461>>463
天麩羅、じゃなくてテンプレを確認して下さい。
471デフォルトの名無しさん:2007/05/02(水) 20:22:14
>>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;
}
472デフォルトの名無しさん:2007/05/02(水) 20:33:13
[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枚が最小になる、
みたいな場合があるのでどうすればいいのか分からないです><
473デフォルトの名無しさん:2007/05/02(水) 21:53:29
>>411
ttp://homepage3.nifty.com/aokura/src/myls.html
これを解析してディレクトリも表示させて (d) をつける仕様に出来れば・・・
普通に実行したらディレクトリは無視したファイルが表示されたが
実行コマンド -a のオプションをつけたらディレクトリも表示された。
その辺の仕組みを変えてやれば何とかできるかも?
474411:2007/05/02(水) 22:07:00
>>473
具体的にどうやれば良いのでしょうか…

初心者ですいません。
475デフォルトの名無しさん:2007/05/02(水) 22:09:43
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 があるんで、これはこれで自分でこのヘッダの中にある
ライブラリを実装する必要性があるかも?
476デフォルトの名無しさん:2007/05/02(水) 22:11:33
あぁ、あとファイル名は拡張子を抜いて8文字までとか、拡張子が3文字とか言う制約もあったかなぁ・・・
>>411 が授業でどんな内容を習っているか分かれば、それもヒントになると思うのだが
やったことのない俺にとっては、どのように情報を探してアプローチすりゃ良いかさっぱり・・・
477デフォルトの名無しさん:2007/05/02(水) 22:35:18
>>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
↑↑↑↑↑↑テキストファイルの終わり(上の行まで)↑↑↑↑↑↑
480411:2007/05/02(水) 22:43:28
481デフォルトの名無しさん:2007/05/02(水) 22:43:39
>>478
問題の意味が分からん
>>479の内容をテキストファイルとして出力すりゃいいのか?
482デフォルトの名無しさん:2007/05/02(水) 22:48:25
>>480
うひゃっ、Linux板で質問したほうが良いかも
483デフォルトの名無しさん:2007/05/02(水) 22:49:58
>>482
宿題をLinux板に持ち込むのは流石にダメだろw
484411:2007/05/03(木) 00:00:44
>>480
LinuxでやるC言語のクラスなので、Linuxのシステムプログラムよりな課題が多いです。
学部が経営情報学部なので必修で最低2個はプログラミングのクラスを取らないといけないのですが、
前期はJava入門を取り、後期はあいてるクラスが今のクラスしかなかったので取ったのはいいのですが、
アルゴリズム、スタックやスレッドの知識がある事を前提で授業が行われているので、半文系の自分にはきついですorz
485デフォルトの名無しさん:2007/05/03(木) 00:13:12
>>484
あるファイルがただのファイルなのか、それともディレクトリなのかというのは
こいつを使えば判定できるがLinux限定な
ttp://www.linux.or.jp/JM/html/LDP_man-pages/man2/stat.2.html
486デフォルトの名無しさん:2007/05/03(木) 00:23:13
参考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;
}
487411:2007/05/03(木) 00:43:25
>>486
ありがとうございます。確認してみます。
488デフォルトの名無しさん:2007/05/03(木) 01:51:40
>>411
何年生か知らないけど、4年生じゃないなら急いで単位取る必要無いんじゃない。
その講義捨てて来年か次の学期にJava入門の続きか簡単そうな講義取ったほうが良さげ
変な所でエネルギーと時間を浪費せずに、自分の将来の為にエネルギーと時間を使いなよ。
とここでエネルギーと時間を浪費して他人の宿題を解いているNEETが言ってみる。
489411:2007/05/03(木) 02:03:49
>>488
これが最後の課題なので、どうにか… といったところです。

>>486
コードを入れてみたのですが、上手く動きませんorz
490デフォルトの名無しさん:2007/05/03(木) 02:07:38
>>489
うまく動かないってのはどういう風に動かないんだ?
491デフォルトの名無しさん:2007/05/03(木) 02:25:34
最後の課題ってまだ五月になったばっかりだぞ・・・
492デフォルトの名無しさん:2007/05/03(木) 02:27:53
集中講義とかなんでないの
493デフォルトの名無しさん:2007/05/03(木) 02:29:03
GW中の?
大変だな・・・
494459:2007/05/03(木) 09:14:17
>>470

ありがとうございます。
大変に役に立ちました。
495デフォルトの名無しさん:2007/05/03(木) 09:16:28
[1] 授業単元: プログラミング
[2] 問題文(含コード&リンク): http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3918.txt
[3] 環境
 [3.1] OS: Linux
 [3.2] コンパイラ名とバージョン: gcc -o
 [3.3] 言語: C
[4] 期限: 5月3日午後2時

どうしても、うまく動きません。main関数に問題があるのかもしれませんが、分かりません
main関数を作り変えてもいいので、よろしくお願いします。
496デフォルトの名無しさん:2007/05/03(木) 09:18:50
495ですうpしたものが間違っていたので、もう一度うpします
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3919.txt
497デフォルトの名無しさん:2007/05/03(木) 10:00:39
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 度も使われていません。
498デフォルトの名無しさん:2007/05/03(木) 10:05:53
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のほうが賢いな
499デフォルトの名無しさん:2007/05/03(木) 10:09:04
>>495
main関数以外は作り変えちゃダメ?
500478 479(ぶる):2007/05/03(木) 10:14:03
>>481
はい、そうです。
そしてそのテキストファイルの拡張子を「.net」に変換して出力するプログラムを作りたいんで(ノд`)
501デフォルトの名無しさん:2007/05/03(木) 10:20:00
>495
条件に合うのであれば作り変えてもらってもかまいません。
502デフォルトの名無しさん:2007/05/03(木) 10:31:11
>>495
条件にあっている場合はかまいません
503デフォルトの名無しさん:2007/05/03(木) 10:32:05
>>499
条件に合っている場合はかまいません
504デフォルトの名無しさん:2007/05/03(木) 11:17:45
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--;
}
}

でいいんぢゃねの?
505デフォルトの名無しさん:2007/05/03(木) 12:27:04
[1] 授業単元:数値シミュレーション
[2] 問題文(含コード&リンク):
ttp://www.saiensu.co.jp/book_support/4-7819-0855-1/snln.txt
を改変して、x*x+y*y=4 x*y=1、の連立非線形方程式をニュートン法でなく修正ニュートン法で解を求める
[3] 環境
 [3.1] OS:WinXP
 [3.2] コンパイラ名とバージョン:VC++ 2002
 [3.3] 言語:C言語
[4] 期限: 2007年05月10日まで
[5] その他の制限:[2]のものを改変した形でないといけない

ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3920.txt
↑は与えられた文から自分で、関数を読み込むようにして
32行目jacob関数内の式をニュートン法のものから修正ニュートン法のものに変えてみたものです
改変だったので関数内はあまりいじらなくていいと思ったのですが、この状態でビルドするとエラーが出てしまいます
32行目の式を元のニュートン法のものにしても同じエラーが出るため
もっと基本的な、方程式の定義の仕方あたりに原因があると思うのですが…
わかる方いらっしゃったらお願いします
506411:2007/05/03(木) 12:32:59
今日中に提出すれば10点マイナスで良いと言われました。
どうしても分からなかったので、ヒントを貰ってきたのですが、
さらに分からなくなってしまっていますorz

戴いたヒントです。:
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3921.txt

>>491,492,493
おっしゃるとおり、集中講義のようなものです。
今、4年なのですが開講されているコースの関係でこのクラスをパスしないと、
留年しそうなのです…orz
507デフォルトの名無しさん:2007/05/03(木) 12:34:39
留年がかかってるとか言われると逆にやる気無くなるな
バレたときの責任とかとれないし
508411:2007/05/03(木) 12:37:42
>>490
[root@network root]# ./two d (この場合、ディレクトリです。)

とコンソールで入力しても

"path" is file or something else

と表示されます。
この課題の場合、ディレクトリ名を入力した場合、
中のファイルがすべて表示されると同時に、サブディレクトリも表示されるように作らなくてはいけないので、
そうなってくると、ちんぷんかんぷんです…。
509デフォルトの名無しさん:2007/05/03(木) 12:43:01
>>504
おれは495じゃないけど
その変更だと何も表示されなくなったぜ?

配列の添え字にマイナス突っ込んでる状態は改善されたが
510411:2007/05/03(木) 12:44:25
>>507
海外の大学なのでその辺りは大丈夫です。
511デフォルトの名無しさん:2007/05/03(木) 12:51:31
海外だとGW関係なしか 大変そうだな
512デフォルトの名無しさん:2007/05/03(木) 12:55:02
欧米か!
513デフォルトの名無しさん:2007/05/03(木) 12:57:59
>>495
>>396
後は再度checkするやり方がある。
514デフォルトの名無しさん:2007/05/03(木) 12:58:24
海外ってどうせ北海道とか九州の話なんだぜ
515411:2007/05/03(木) 12:58:56
>>511
はい。授業が後二日で終わるのでそれを過ぎたら0点になってしまうのですorz
「留年」といった具体的な概念はないのですが、これが出来ないと5月半ばに卒業する予定が、
冬になってしまうので正直、かなり焦っています。

>>512
欧米ですね。
516デフォルトの名無しさん:2007/05/03(木) 13:24:28
break life;
517デフォルトの名無しさん:2007/05/03(木) 14:01:01
なんでかわからないけど「代理受験」って言葉が浮かんだ。
518デフォルトの名無しさん:2007/05/03(木) 14:05:27
今日中って何時まで?
519デフォルトの名無しさん:2007/05/03(木) 16:08:20
【質問テンプレ】
[1] 授業単元: C++プログラミング
[2] 問題文(含コード&リンク):
        |1 2 3|      |9 2 7|
配列 [i][j] = |4 5 6|  を  |4 5 6|
        |7 8 9|      |3 8 1|
(array[i][j] = [0][0] の位置に [2][2]、[2][2] の位置に [0][0]、[0][2] の位置に [2][0]、[2][0] の位置に [0][2])
となるように並べ替えるプログラムを、forループを使って作成しなさい。

[3] 環境
 [3.1] OS: WindowsXP
 [3.2] コンパイラ名とバージョン: gcc 3.4
 [3.3] 言語: C++
[4] 期限: 5月4日4:00まで
[5] その他の制限: 特に無し。

よろしくお願いします。
520デフォルトの名無しさん:2007/05/03(木) 16:37:46
[1] 授業単元: プログラム演習
[2] 問題文(含コード&リンク):
下記の仕様に沿った数字判定プログラムを作成しよ。
・入力文字列の最大文字数が10文字とする。
・数字か、文字かの判定ができる。(入力に1つでも数字以外のものがあれば数字とみなす)
・数字の場合は正数か負数かの判定もする。
・文字入力関数、入力判定関数を作成、判定結果はmain関数で表示する。
・入力エラー時(文字数オーバー、何も入力されていない)は、再入力を促す。

[3] 環境
 [3.1] OS: WindowsXP
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C
[4] 期限: 2007年5月5日
[5] その他の制限: 特になし

よろしくお願いします。
521デフォルトの名無しさん:2007/05/03(木) 16:42:46
>>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;
}
522デフォルトの名無しさん:2007/05/03(木) 16:43:21
>>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;
}
523デフォルトの名無しさん:2007/05/03(木) 16:43:20
#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++だったことに気付く、と。
524デフォルトの名無しさん:2007/05/03(木) 16:44:44
>>520
>・数字か、文字かの判定ができる。(入力に1つでも数字以外のものがあれば数字とみなす
「数字とみなす」でいいの?
525523:2007/05/03(木) 16:47:34
>>521-522
やーいやーいあわてんぼさん
526>>521-522:2007/05/03(木) 16:49:20
>>525
べ、べつにわかってたんだからねっ
あんたなんかと一緒にされるぐらいなら死んだ方がマシよ!!
ばかばかばかー!
527デフォルトの名無しさん:2007/05/03(木) 16:49:52
>>472もお願いします
528519:2007/05/03(木) 16:49:57
>>521-523
ありがとうございます。
Cは使ったことないのでよく分かりませんが、調べてやってみます。
529デフォルトの名無しさん:2007/05/03(木) 16:51:14
>>411の課題は意図が解せんから何か作る気が起きないんだよな
入力例とかをみるに、引数として指定されたディレクトリ一つ一つに対して
それぞれスレッドを作って処理しろって事なんだろうが
そんなことしたら表示が無茶苦茶になると思うんだがな
530デフォルトの名無しさん:2007/05/03(木) 16:55:40
1ディレクトリにつき1スレッドってことかな
表示する順番は同期とれってことだろう
と出題者になったつもりで名推理してみる
531523:2007/05/03(木) 17:10:19
制限なしなら各ディレクトリでsystem("ls -a");とかw
>>528
本当はswap使うべきところを無駄に混乱させる為に
心を鬼にしてXOR交換にしたから、頑張ってくれ
532デフォルトの名無しさん:2007/05/03(木) 17:15:40
>>472はむずいぞ。
昨日から考えてるけどサッパリ。
533デフォルトの名無しさん:2007/05/03(木) 17:23:43
>>472
計算量がでかくなっても良いならやりようはあるんだけどな
534デフォルトの名無しさん:2007/05/03(木) 17:24:31
>>533
どんなやり方ですか??
535デフォルトの名無しさん:2007/05/03(木) 17:38:28
>>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) 最小の枚数となっている物を↑の結果から選ぶ
536504:2007/05/03(木) 17:40:26
クイーンの数を入力しなさい
8
10000000
00001000
00000001
00000100
00100000
00000010
01000000
00010000

それらしく動いてる気がする
537519:2007/05/03(木) 18:06:47
>>521-523
プログラムを理解するのに時間かかりましたが、何とかできました。
ありがとうございました。
538デフォルトの名無しさん:2007/05/03(木) 18:06:58
>513
再度checkする方法ではどうプログラムすればいいですか??
539デフォルトの名無しさん:2007/05/03(木) 18:08:48
>>520
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3922.txt
きんもぉ〜☆なソースかもしれないけど、どぞ。
符号は + , - の指定が出来るが符号なしの数字のみを入力したら正とみなす。
あと、先頭の符号以外に数字以外の文字が入っていたら文字とみなすようにしてありまつ。
540デフォルトの名無しさん:2007/05/03(木) 18:09:53
>>520
って、よく見たら
> 文字入力関数、入力判定関数を作成
これやってなかった・・・適当に自分で分けて作っておいて orz
541デフォルトの名無しさん:2007/05/03(木) 18:30:23
>>520 文字入力関数、入力判定関数を作成してみた
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3923.txt
542デフォルトの名無しさん:2007/05/03(木) 18:31:43
>>535
なるほど・・・
自分は、n番目のコインをとれるだけとって、残りのn-1枚で再帰
     n-1番目のコインをとれるだけとって、残りのn-2枚で再帰
n番目から取ったときとn-1番目から取ったときで比較し、少ないほうを採用
次にそれとn-2番目から取ったときと比較…

って感じでやる方法しか思いつかなかったのですが、
これ上手く書けるのかなぁ…とか思ってました。(しかもこれで最小になるのか?)


もしよろしければ、そのプログラム書いていただけますか?><
543504: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;
}
}
544デフォルトの名無しさん:2007/05/03(木) 19:08:20
>>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を入れたときコインの最小枚数を求めるプログラムを書け。


色々考えたけどなかなか思いつきません
日本のコインなら大きいものから順番に取ればいいと思うんですが…

よろしくおねがいします

546デフォルトの名無しさん:2007/05/03(木) 19:29:57
x(総金額?)を満たす最小の枚数を
n種類から選べって事?
547デフォルトの名無しさん:2007/05/03(木) 19:31:16
素因数分解を応用すればいいんだよ
548デフォルトの名無しさん:2007/05/03(木) 19:31:21
>545
>472
549デフォルトの名無しさん:2007/05/03(木) 19:45:06
たとえば1、10、25って3種類のコインがあって、44と入力すれば8を答えとして返すということ?
(10*4+1*4=44)
550デフォルトの名無しさん:2007/05/03(木) 20:10:58
>>549
472ですけど、そういうことです。。
549さんと同じとこだったりしてw
551デフォルトの名無しさん:2007/05/03(木) 20:27:43
>>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
553デフォルトの名無しさん:2007/05/03(木) 20:30:01
数学はエレガントなのにC言語の泥臭さときたら……
554デフォルトの名無しさん:2007/05/03(木) 20:30:49
ベタに全解探索して、その中から最小枚数の解を求めるしかないんじゃないかな。
555デフォルトの名無しさん:2007/05/03(木) 20:32:48
最小値だけ保存すればいいし大きいほうから検索すれば結構刈れるだろうから(その時点の最小値を越えた場合はそこで終われる)
宿題レベルとしては十分だろうね
556デフォルトの名無しさん:2007/05/03(木) 20:34:24
>>472
ごめ、配列名見落としてた
main 関数の中の kind を全て A に置換しておいてちょ
557デフォルトの名無しさん:2007/05/03(木) 20:36:36
AつかCね。スッパプログラマも読み違えるんだなぁ
558デフォルトの名無しさん:2007/05/03(木) 20:46:01
>>551の腕前に嫉妬
559472:2007/05/03(木) 20:50:02
>>551
ありがとうございます><
560デフォルトの名無しさん:2007/05/03(木) 21:01:33
>>551
coin_check内のforの処理が頭いいなー。
561デフォルトの名無しさん:2007/05/03(木) 21:09:47
>>551
うわぁー。すごいけど、プログラム超初心者なのでなにをやってるのかよくわかんないんです><
議事コードで説明してくれる人いたら教えてください
562561:2007/05/03(木) 21:11:07
擬似コード でした
563472:2007/05/03(木) 21:12:03
>>561
マジで同じ大学かも・・・
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);
}
どこが間違えているか教えてください!!
565デフォルトの名無しさん:2007/05/03(木) 21:32:33
pi += sizeof(int);

pi++;
566デフォルトの名無しさん:2007/05/03(木) 21:32:55
>>564
mainが無い
567デフォルトの名無しさん:2007/05/03(木) 21:34:20
ボケる前に答えるなよヽ(`Д´)ノ
568デフォルトの名無しさん:2007/05/03(木) 21:35:25
stido.h
569520:2007/05/03(木) 21:37:06
>>539-541
ありがとうございました。
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 );
}
571デフォルトの名無しさん:2007/05/03(木) 21:42:54
>>570
free(pi) を関数の最後に移動
572デフォルトの名無しさん:2007/05/03(木) 21:43:10
>>570
int *pi = (int *)malloc( sizeof(int));

int 1個分しか確保してない
int *pi = (int *)malloc( sizeof(int):*100);
にする
573ぺこちゃん:2007/05/03(木) 21:43:32
あーなるほど、大変助かります。
574デフォルトの名無しさん:2007/05/03(木) 21:43:44
見間違えた
>>572は水に流して
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);
}
}
576デフォルトの名無しさん:2007/05/03(木) 21:51:01
>>575
残り2問はまとめてうpろだにあげろ
分割する意味がわからん
577デフォルトの名無しさん:2007/05/03(木) 21:56:53
>>505
戻り値の値をきちんと返せばOKっぽい。
もしくはdoubleではなくvoidにするか。
578デフォルトの名無しさん:2007/05/03(木) 21:58:47
>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;
}
580デフォルトの名無しさん:2007/05/03(木) 22:01:17
575ってメモリリークじゃないの?
581ぺこちゃん:2007/05/03(木) 22:02:45
問題はプログラムの誤りを修正することなのですが、さっぱりわからないので・・・
解説していただけたら助かります。。。すいません。。。
582デフォルトの名無しさん:2007/05/03(木) 22:03:38
>>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]);
}
}
584デフォルトの名無しさん:2007/05/03(木) 22:11:24
>>579
UPPER[nUpperldx] = toupper( *pc );

Upper[nUpperldx] = toupper( *pc );

こうですか?
585デフォルトの名無しさん:2007/05/03(木) 22:12:22
>>583
j<SIZE-1

j<SIZE
586ぺこちゃん:2007/05/03(木) 22:18:17
PGの世界ではこのくらい朝飯前くらいでしょうか??
PGになりたくて独学していますが、どのような勉強方法が
最適かわからないので、是非教えて下さい。

>>584は「入力ミスでした。申し訳ありません」
587デフォルトの名無しさん:2007/05/03(木) 22:21:17
最適な勉強法:こういうところに丸投げしないで自分で考える。
588デフォルトの名無しさん:2007/05/03(木) 22:25:19
ヒント:あきらめる
589デフォルトの名無しさん:2007/05/03(木) 22:25:42
>>471
ありがとうございます!!
590デフォルトの名無しさん:2007/05/03(木) 22:25:52
ちゃんと仕様書に目を向ける、なるべくANSI、ISO準拠の参考書を見る
591デフォルトの名無しさん:2007/05/03(木) 23:04:25
>>586
Cの勉強だけじゃダメですよ。アルゴリズムやデータ構造もやるべきですよ。
プログラムが出来ない人は、アルゴリズム、つまり問題を解く手順を
考えずにやってるから、プログラムが組めないんだと思う。
プログラムする上で重要な事が詰まってるから以下のページの
プログラミング講座を一読して欲しい。
ttp://www.smg.co.jp/seminar/techsquare/index.html
592デフォルトの名無しさん:2007/05/03(木) 23:19:42
[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] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々)
593デフォルトの名無しさん:2007/05/03(木) 23:21:01
>>586
マジレスするとコミュニケーション能力。

594デフォルトの名無しさん:2007/05/03(木) 23:50:23
代筆家とプログラマは違うと思う
595デフォルトの名無しさん:2007/05/04(金) 00:04:44
>>593
またお前か。相手と意思通じがうまくても自分が基本を理解する能力がなきゃ
「プログラマー」となるのは難しいぞ。
596デフォルトの名無しさん:2007/05/04(金) 00:06:57
プログラマ職で雇用されても雑用しかやらないもんな
プログラム組みたいならやっぱ生産性の高さとなにより他の人に出来ない事が出来るってのが武器だよ
597デフォルトの名無しさん:2007/05/04(金) 00:09:05
ぶっちゃけ、相手との意思通じが重要なのは複数でプロジェクトを組むときだろ。
各々の割り当ては与えられた課題を理解することが重要。
自分が作ったライブラリないしモジュールは、汎用性があれば他人のソースの一部に
目的がきっちりと果たせていればそのまま引用できるし。変な使用や汎用性がない
ソースだと、それに応じて書き直さなきゃならんぞ。
598デフォルトの名無しさん:2007/05/04(金) 00:18:15
コンピュータとのコミュニケーション力がまず必要。
599デフォルトの名無しさん:2007/05/04(金) 00:19:55
コミュニケーション能力さえあればなんとかやっていけるさ
教えたがりがどこにでもいるからな
600デフォルトの名無しさん:2007/05/04(金) 00:21:06
>>598
うまい、座布団10枚で海外旅行の懸賞を与えよう
601デフォルトの名無しさん:2007/05/04(金) 00:56:48
>>538
>再度check
上の方でやったcheckを再度やるんだ。単にコピペするだけ。
同じの2回書くからあんまりいいコードじゃ無いんだけど。
よくわからなかったらgoto使うやり方でいいんじゃない?
変更が最小限で済むし。
602デフォルトの名無しさん:2007/05/04(金) 03:12:39
[1] 授業単元:ツェラー
[2] 問題文(含コード&リンク):万年歴の作成
[3] 環境
 [3.1] OS:XP
 [3.2] コンパイラ名とバージョン:VS2005
 [3.3] 言語: C

お願いします
603デフォルトの名無しさん:2007/05/04(金) 03:37:58
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] その他の制限: 特になし

お願いします
605デフォルトの名無しさん:2007/05/04(金) 07:42:35
>>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;
}
606478: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
607デフォルトの名無しさん:2007/05/04(金) 13:57:43
>606
以前の誰かの繰り返し質問になるかもだが、
いったん 〜.txt としてデスクトップに出力しないといけないのか?
最初から 〜.net としてデスクトップに出力するのではなく?
608デフォルトの名無しさん:2007/05/04(金) 14:43:53
>>605
ありがとうございます!
609デフォルトの名無しさん:2007/05/04(金) 17:23:42
[1] 授業単元:プログラミング
[2] 問題文(含コード&リンク):http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3926.txt
[3] 環境
 [3.1] OS:Linux
 [3.2] コンパイラ名とバージョン:gcc
 [3.3] 言語: C言語
[4] 期限: 2007年5月6日24:00まで
[5]その他の制限:特になし
自分なりに考えてはみましたがさっぱり分かりません
ご迷惑かもしれませんが、よろしくお願いします
610デフォルトの名無しさん:2007/05/04(金) 17:34:36
[1] 授業単元: プログラミング
[2] 問題文(含コード&リンク): *****の部分を埋めてハノイの塔のプログラムを作成せよ。ただし再帰的関数を使ってはならない。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3927.txt
[3] 環境
 [3.1] OS: Linux
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C
[4] 期限: 2007年05月08日17:00
[5] その他の制限: 再帰的関数を使ってはならない。
再帰的関数を使うのは分かったのですが、これはさっぱり…よろしくお願いします。
611デフォルトの名無しさん:2007/05/04(金) 17:36:15
URLに関西2ちゃんねらーとかジョイフルとか
いろいろと恥ずかしくないか?
612478:2007/05/04(金) 17:45:35
>>607
すいません、俺の理解不足だったかも…
要はテキストで「.net」ファイルを開いた時にその内容のものが書けてればOKなんです。
上の内容の「.net」で出力出来れば大丈夫です。
613デフォルトの名無しさん:2007/05/04(金) 19:34:04
>>478
おまえ、まだ理解できてないだろ
614デフォルトの名無しさん:2007/05/04(金) 21:41:19
[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;

のこりは下です
615デフォルトの名無しさん:2007/05/04(金) 21:42:39
}
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}
616デフォルトの名無しさん:2007/05/04(金) 22:50:13
>>592
を・・・・・
617デフォルトの名無しさん:2007/05/04(金) 22:55:05
pdfめんどくせえwww
618デフォルトの名無しさん:2007/05/04(金) 23:17:07
>614
ちゃんと写せてる?
619デフォルトの名無しさん:2007/05/04(金) 23:17:12
>>592
とりあえず大学で数学を真面目に学んでかつプログラミングもできる勇者をゆるりと待て
620デフォルトの名無しさん:2007/05/04(金) 23:25:17
621505:2007/05/04(金) 23:54:05
>>577
遅くなりましたが、そちらのヒントを見てからしばらくやってみたところできました
一つ前の課題でずっと関数はdoubleを使っていたので、今回もそのままdoubleを使ってしまい全く気づかず悩んでいました
ありがとうございました
622デフォルトの名無しさん:2007/05/05(土) 02:35:54
>>592
とりあえず、用語と手法の説明が必要。nとかRとかが何を表すのかも。
623デフォルトの名無しさん:2007/05/05(土) 04:15:02
[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] その他の制限: とくになし
625デフォルトの名無しさん:2007/05/05(土) 07:26:03
>>624
>>605
double f(double x){return x*x*x-4*x+1;}

double f(double x){return x*x-5;}
に変更
626デフォルトの名無しさん:2007/05/05(土) 07:36:03
>>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);
}
627デフォルトの名無しさん:2007/05/05(土) 07:38:15
>>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;
}
628sage: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;
}
629デフォルトの名無しさん:2007/05/05(土) 08:25:14
>>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;
}
630626:2007/05/05(土) 12:34:32
>>627-629
ありがとうございます。
ハルヒというのが気になるのですが
名前はなんでもいいのでしょうか?
631デフォルトの名無しさん:2007/05/05(土) 13:01:45
[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] その他の制限: 特にありません

お願いします
632デフォルトの名無しさん:2007/05/05(土) 13:05:29
>631
複数ってのは最低3つ?
閉じてない場合はどうすんの?
633デフォルトの名無しさん:2007/05/05(土) 13:14:39
最低3つでいくつ入力するかもプログラム実行時に入力させる形です
閉じてないっていうのがよくわからないけど
それを考えることで複雑になるようなら飛ばしても大丈夫だと思います
634デフォルトの名無しさん:2007/05/05(土) 13:17:19
交点の意味がいまいちわからん。
直線に囲まれた領域の格子点を求めるってことじゃないの?
635デフォルトの名無しさん:2007/05/05(土) 13:34:25
>>634
それぞれの直線ごとの交点を出して不等式に合ったやつを出力するって感じかな?

図にするとこんな感じ
ttp://up2.viploader.net/upphp/src/vlphp054344.jpg
即興でつくったから間違ってたらすまない
636デフォルトの名無しさん:2007/05/05(土) 13:43:07
もしくは、領域内に存在する“点”のことジャマイカ?
637636:2007/05/05(土) 13:43:50
整数の点ということで。
638デフォルトの名無しさん:2007/05/05(土) 13:51:26
交点の座標を出力するということでした、
>>635の図だと
(0.000 , 2.000)
(0.000 , 3.000)
(0.600 , 0.800)
    ・
    ・
    ・
という感じに
説明不足ですみません
639デフォルトの名無しさん:2007/05/05(土) 15:14:25
[1] 授業単元:プログラミング
[2] 問題文(含コード&リンク):
15パズルを作る。
ランダムでピースを配置する。
パズルの完成も判定せよ。
キー入力関数は提供するモノ(15p.cpp内の関数)でOK。
[3] 環境
 [3.1] OS: Windows
 [3.2] コンパイラ名とバージョン: VC 2005
 [3.3] 言語: C
[5] その他の制限:
ピースをランダムに配置
完成を判定
キー入力関数は提供するモノ良い

先生、おながいします
640デフォルトの名無しさん:2007/05/05(土) 15:29:24
>>639
15p.cppて
641デフォルトの名無しさん:2007/05/05(土) 15:39:42
エスパーの登場が期待される
642デフォルトの名無しさん:2007/05/05(土) 15:48:45
一度でいいから3pやってみたい
まだ童貞だけど
643デフォルトの名無しさん:2007/05/05(土) 16:06:36
>>638
だとすると不等号は全然関係なくて、
3つ以上の直線の交点を全て列挙する
→ 3つ以上の方程式のうち、任意の2つを
  連立したものの解をすべて列挙する
ってことなのかな?
644デフォルトの名無しさん:2007/05/05(土) 16:21:27
>>643
えっと、連立不等式だから領域が出ると思うんだけど
交点のうちでその領域にある(不等式の条件を満たす)点の座標を出力するという形だと思います
645デフォルトの名無しさん:2007/05/05(土) 16:31:47
>>644
あ、理解。
>>643で列挙した点のうち、与えられた不等式をすべてみたすものだけ
出力すればいいってかたちになるのね。
646デフォルトの名無しさん:2007/05/05(土) 16:45:00
>>645
そういうことです
説明下手ですまんかった
647デフォルトの名無しさん:2007/05/05(土) 17:31:28
>>622
急ぎ過ぎてて忘れてました。すいません・・・
1は、hit or missモンテカルロ積分についての問題です。
nは標本数で、多分Aの近似値を出せば良いんだと思いますorz
2は、Rは繰り返し数で多分10000は十分大きいので多重積分の中の関数(問題ではexp)
の平均値が多重積分のIと近似されると解釈すればいいんだと思います・・・。
ttp://www.borujoa.org/upload/source/upload11469.pdf
648デフォルトの名無しさん:2007/05/05(土) 18:09:29
催促するようで申し訳ありませんが
>>609の課題が分かる方いましたら
よろしくお願いします><
649デフォルトの名無しさん:2007/05/05(土) 21:08:22
そういや、前スレだか前々スレだかに
催促したい人は未回答問題のリストを作れ、とかいうルールがあったな。
今はなくなったのかな?
650デフォルトの名無しさん:2007/05/05(土) 21:42:12
解答する方としては未回答問題のリストを作って貰えると嬉しいけど
そんなルール作っても守る奴居ないよな。正直、催促してもらえるだけでも
見逃した未回答問題に気付く事が出切るからありがたい。
まあ、回答が無い問題と言うのは、難しい専門用語に説明が無かったり
重要な式、情報が抜けてたりして回答しようにもムリポな事が多いから
催促する前に、十分な情報を提供したか確かめて、情報不足くなら
解説付けるとか参考になるリンクを貼って欲しい。
と言うか、問題を投稿する時に十分な情報を出せ!!
651デフォルトの名無しさん:2007/05/06(日) 01:53:06
[1] 授業単元:プログラミングT
[2] 問題文(含コード&リンク):
  http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3933.txt
[3] 環境
 [3.1] OS:Windows
 [3.2] コンパイラ名とバージョン:VC++ 2005
 [3.3] 言語: C++
[4] 期限:2007.5.7.
[5] その他の制限:出来るだけ初心者っぽくお願いします。
652デフォルトの名無しさん:2007/05/06(日) 02:08:52
>>651
stackを使って書かないといけない、ということを忘れてました。すみません
653デフォルトの名無しさん:2007/05/06(日) 02:25:35
654デフォルトの名無しさん:2007/05/06(日) 02:48:04
>>653
ありがとうございました。助かります。
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");}
657デフォルトの名無しさん:2007/05/06(日) 06:07:17
>>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;
}
658デフォルトの名無しさん:2007/05/06(日) 06:53:58
>>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;
}
659デフォルトの名無しさん:2007/05/06(日) 07:25:38
答えてるやつ同じ人じゃねーの?
660デフォルトの名無しさん:2007/05/06(日) 09:16:28
[1] 授業単元: プログラム演習
[2] 問題文(含コード&リンク):
テキストファイルを読み込み、TAB文字を除去したコピーファイルを作成する
プログラムを作成しなさい。
コピー元テキストファイルにTAB文字が使われていた場合、コピー先ファイルには
TAB文字をコピーしない。
main関数の引数として、コピー元ファイル名、コピー先ファイル名を入力させる。
コピー元ファイル名で指定されたファイルが正常に開けない場合
エラーメッセージを出力し、プログラムを終了する。
コピー先ファイル名で指定されたファイルがすでに存在する場合は上書きを行うか
否かを問い合わせる。この問いに対してユーザの入力が"y"か"Y"の場合は上書きを
それ以外は何も行わずプログラムを終了する。

[3] 環境
 [3.1] OS: Windows 
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C
[4] 期限: 2007年5月8日
[5] その他の制限:特になし

よろしくお願いします
661631:2007/05/06(日) 09:31:19
とりあえず交点を出すまでは自力で作ってみたのですが
汚い上不等式の条件を満たすかの判定がさっぱりわかりません…

http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3935.txt
662デフォルトの名無しさん:2007/05/06(日) 11:51:15
>>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;
}
663デフォルトの名無しさん:2007/05/06(日) 12:48:02
>>631
一応>>635の図だと合ってるっぽいけど、正しいかどうかはよくわからん。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3936.c
664デフォルトの名無しさん:2007/05/06(日) 12:51:45
665デフォルトの名無しさん:2007/05/06(日) 12:57:29
666デフォルトの名無しさん:2007/05/06(日) 13:59:57
[1] 授業単元: プログラミング
[2] 問題文(含コード&リンク):
あらかじめ用意された枠組みを利用して、リスト順次探索のプログラムを作成せよ。
詳細、元になるファイルはうpしました。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3939.zip
[3] 環境
 [3.1] OS:Linux
 [3.2] コンパイラ名とバージョン:gcc
 [3.3] 言語:C
[4] 期限:5/9
[5] その他の制限:番兵を使ってはいけないそうです。

よろしくお願いします
667デフォルトの名無しさん:2007/05/06(日) 14:04:01
[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つあります、よろしくお願いします
668デフォルトの名無しさん:2007/05/06(日) 14:10:56
>>665
ありがとうございました!
669デフォルトの名無しさん:2007/05/06(日) 14:28:51
>>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;
}
670デフォルトの名無しさん:2007/05/06(日) 14:39:32
>>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;
}
671デフォルトの名無しさん:2007/05/06(日) 15:16:21
[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}  },コ\   / 〉
673デフォルトの名無しさん:2007/05/06(日) 15:41:48
>>671
向こうでも聞かれてたが、表示するプログラムなのに表示しなくてもいいとはこれ如何に
674デフォルトの名無しさん:2007/05/06(日) 15:45:21
>>673
「表示するプログラム」、というより
「表示の前段階までを処理して実際の表示は行わないプログラム」

って意味で書いたつもりでした。
友人の友人の課題が私のところまで回ってきて、
課題文も原文のものではないので
かなり分かり難い表現になってしまって申し訳ないです。
675デフォルトの名無しさん:2007/05/06(日) 15:48:01
>>674
あぁそういうことね。けど全部表示するアルゴリズムって言っても1足して表示して、また1足してryしかない気がするけどな
676デフォルトの名無しさん:2007/05/06(日) 15:58:24
>>674
その友人は何で君に丸投げ?
俺できるよっとか言っちゃったクチ?

ようは整数を2進数表示させるアルゴリズムを考えろって事かな?
677デフォルトの名無しさん:2007/05/06(日) 16:02:34
適当に作ってみた
はやいかどうかは知らん
#include <stdio.h>
#define N 30
int main(void)
{
     int i, count = 0;
     char buff[N+1] = {0};

     while(count<N) {
          for(i=0; i<=count; i++) {
               if(buff[i]) {
                    buff[i] = 0;
                    if(i==count) count++;
               }
               else {
               buff[i] = 1;
                    break;
               }
          }
          for(i=N; i>=0; i--) putchar(buff[i]+'0');
          putchar('\n');
     }
     return 0;
}
678デフォルトの名無しさん:2007/05/06(日) 16:08:55
>>676
「俺できるよ」なんて事言って2chに投げるような真似は出来ないですorz
単純にプログラム少しでも触ってる人が俺くらいしか居なかったみたいです。
出来ないって言ってるのに中々諦めてくれなかったので、2chに投げてみた次第です。
友達はネット環境が無くて、自分でやらせることが出来なかったので。

整数を2進表示させるのに加えて、1〜2^30までの数値を全て表示(すると過程した処理)をするようです。

1 11 10 100 101 ・・・ 111111111111111111111111111111 みたいな感じで。
後はprintf等で表示する記述を書けば、上記のように全て表示されるってところまで作って、
10秒程度で実行できるように作らなきゃいけないみたいです。
679デフォルトの名無しさん:2007/05/06(日) 16:10:52
>>678
表示ありだとそれだけで10秒こえちゃいそうな予感
680デフォルトの名無しさん:2007/05/06(日) 16:11:01
>>676
>ようは整数を2進数表示させるアルゴリズムを考えろって事かな? 

なんか受信したんですか?
681デフォルトの名無しさん:2007/05/06(日) 16:14:17
>>677
putcharのfor部をコメント潰しして、私の環境で実行したところ、
8秒程度で処理が完了いたしました。
課題の要求を満たすことが出来たと思います。ありがとうございました。

>>679
実際の表示は行わず、処理だけを記述すればいいようです。
確かに表示を行うと数分かかってしまいますね。
682デフォルトの名無しさん:2007/05/06(日) 16:16:15
>>680
送信してきたじゃんか
683デフォルトの名無しさん:2007/05/06(日) 16:20:27
>681
2^30ってあるから1000000000000000000000000000000で終わるようにしたけどそれでいいの?
684デフォルトの名無しさん:2007/05/06(日) 16:22:45
>>680
どこか間違っているか?
685671:2007/05/06(日) 16:23:09
>>683
終了の数値の話は友人からしっかりと聞いていませんが、
1000000000000000000000000000000か、111111111111111111111111111111で終了させるかは、
比較演算子の書き換えですぐに変更できるので此方でその課題に合わせて直させます。
686デフォルトの名無しさん:2007/05/06(日) 16:25:45
[1] 授業単元:プログラミング
[2] 問題文(含コード&リンク):文字列Aの中に文字列Bが含まれいるか調べる関数
[3] 環境
 [3.1] OS: Windows
 [3.2] コンパイラ名とバージョン: VC++2005
 [3.3] 言語: C
[5] その他の制限: strcmpを自作
             異常へ対処すること

お願いします。
687デフォルトの名無しさん:2007/05/06(日) 16:42:56
>>666
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3940.zip
番兵の意味を考えずにやってしまった。objファイルが混じってるが気にするな。
688デフォルトの名無しさん:2007/05/06(日) 16:45:20
催促するやつは、ついでに回答されてない問題へのレスをリストにしてくれ。
689デフォルトの名無しさん:2007/05/06(日) 17:01:27
>>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型つかってる意味が理解できないけど
そのアルゴリズム(・∀・)イイネ!!
691デフォルトの名無しさん :2007/05/06(日) 17:07:21
内容:
[1] 授業単元:電卓プログラム
[2] 問題文(含コード&リンク):
+,-,*,/の四則演算。=入力で演算。e入力で終了。c入力でクリア、ce入力でクリアエントリー、Ctrl+cで強制終了。
プロンプト上入力で0003.0500と入力されたら、3.05と表示させる(0消し)。桁数は小数点以上5桁、以下5桁。
演算結果が小数点以下5桁を超えた場合、6桁目を四捨五入する。
[3] 環境 [3.1] OS:XP [3.2] コンパイラ名とバージョン: VisualStadio2005 [3.3] 言語: C言語のみ
[4] 期限: 2007/5/7
[5] その他の制限:なし
電卓の作成はここのwikiにあったのですが、もうちょっと細かいものを造るため
分からない部分をお聞きしたいです。
@入力された値が整数でも小数点でも可能のため、最初の変数宣言では何型がやりやすいか?(後々の演算や0消しに大きく影響すると思われるため、判断に迷ってます)。
整数同士の演算結果を5とか6と表示したい。double型にした時の様に6.000000ではなく。
A桁数判別するにはどうするのか?(小数点上5桁下5桁)
Bctrl+cが入力されたら時のプログラムの書き方はどうすればいいのか?
C問題文にある0消しのやり方
D6桁目を四捨五入するという処理はどうするのか?
E英字の「ce」が入力された場合の処理のやり方
初期画面は 今の値: 演算子: 入れたもの: 数値を入力しましょう>>
となります。それぞれ改行が本来されてますが、改行が多い為横書きにしてます。
・5を入力
今の値:5 演算子: 入れたもの: 演算子を入力しましょう>>
・+を入力
今の値:5 演算子:+ 入れたもの: 演算子又は数値を入力しましょう>>
・10を入力
今の値:5 演算子:+ 入れたもの:10 演算子を入力しましょう>>
この後ceを入力したら、+を入れた時の表示にしたいです。
こういう処理をするにはどのようにすればいいのか?

色んなサイトを見て廻ったのですが分からないため、書き込ませて頂きました。
書き込み自体初のため色々足りない部分あるかも知れませんが、どうか宜しくお願いします。
692デフォルトの名無しさん:2007/05/06(日) 17:15:50
アルゴリズムと関係ないところが多いね。
つまり、もっとライブラリの勉強をしなさい、ということだな。


> 整数同士の演算結果を5とか6と表示したい。double型にした時の様に6.000000ではなく。

それは型に関係なく printf("%g") を使えばオーケー。
double型変数 d が 6.00000 でも %g を使えば 6 と出力される。

> C問題文にある0消しのやり方
これも strtod() とかで読めば勝手に消える。

> Bctrl+cが入力されたら時のプログラムの書き方はどうすればいいのか?
何もしなくていいんじゃね?勝手に止まるだろ。

> D6桁目を四捨五入するという処理はどうするのか?
%.6g とかかな。


というわけで、ちゃんと読んでないけど、型はdouble型でやるのがいいと思うんだ。
693デフォルトの名無しさん:2007/05/06(日) 17:50:10
('A`) コマンドプロンプトツマンネ
694デフォルトの名無しさん:2007/05/06(日) 17:53:29
>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++;
  }
  //ここで表示
}
695デフォルトの名無しさん:2007/05/06(日) 18:01:07
>>693
API叩けばいいじゃない
696デフォルトの名無しさん:2007/05/06(日) 18:05:34
処理は速いのにputs使えなくて表示は遅いって悲しいのぅ
697デフォルトの名無しさん:2007/05/06(日) 18:10:43
>>669、670
ありがとうございました
698デフォルトの名無しさん:2007/05/06(日) 19:35:58
>>592 です
問題は↓なのでお願いします!!
http://www.borujoa.org/upload/source/upload11498.pdf
他に分からないところがあったら言ってください!
でも、正直資料とかあんまりないので何も言えない感じですがorz
>>622
>>647
699デフォルトの名無しさん:2007/05/06(日) 20:29:22
いつもROM専なのですが、少々気になったことがあるので、、、

>>691,692
%gを使ったことがほとんど無かったので少々調べて見たのですが
指数が-4より小さいとき(0.00001など)は%eの表示になるのと
%.6gだと小数部6桁ではなく全体で6桁になるようです
(%sの扱いに近い? でも小数点はカウントされてない、、、)

なので、調べた小数点以下の桁数をn、値をaとして
printf("%.*f",n,a)
としたらどうでしょうか
桁数判別の方法とかは考えてないので微妙かもですが
700デフォルトの名無しさん:2007/05/06(日) 20:52:25
ごめん忘れてた。

>>699に書いてあるように、小数の数値の場合は
6桁が基準で短い方が使われるんだった。


なので6桁にこだわるためには、小数桁を切り出さないといけないのね。

ちゃんとやるなら、sprintf(&tmp, "%f", value) するとかして、
tmpの中の '.' の位置とか '\0' の位置を検索して桁を判定して、
そのうえで四捨五入したりすることになるかな。
701デフォルトの名無しさん:2007/05/06(日) 21:07:14
[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日までにお願いします。
702デフォルトの名無しさん:2007/05/06(日) 21:37:19
#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
こんな感じですか?
703デフォルトの名無しさん:2007/05/06(日) 21:42:35
cahrまでマネせんでも。
704デフォルトの名無しさん:2007/05/06(日) 21:42:52
#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はコンパイルしてないんで間違ってたらごめんなさい
705デフォルトの名無しさん:2007/05/06(日) 21:43:26
>>703ではなく>>704でした
706デフォルトの名無しさん:2007/05/06(日) 21:44:18
[1] 授業単元: 応用C実習
[2] 問題文(含コード&リンク):
下図の全てのルートを出力するプログラムを作成しなさい
ttp://uproda11.2ch-library.com/src/114337.gif
[3] 環境
 [3.1] OS: WINxp sp2
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C
[4] 期限: 5月14日まで
707デフォルトの名無しさん:2007/05/06(日) 21:44:48
>>404
すみません課題を最後まで読んでませんでしたw
関数として記述するんですねw
708699: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を入力した時点で今の値を計算するのではなく、
次の演算子が入力された時点で計算すれば、値は保持されたままなので
演算子を入力した後の表示にもっていけばなるんじゃないでしょうか。

と、まぁ、こんな感じでどうでしょうか。。。
計算上の誤差とか無視してたり日本語妙だったりしますが、参考になってれば幸いです。
709デフォルトの名無しさん:2007/05/06(日) 22:14:17
#include<stdio.h>
int main()
710デフォルトの名無しさん:2007/05/06(日) 22:32:18
>>691
普通にdouble型で計算して
計算結果はsprintfかなんかで文字列に変換して出力すればいいんじゃね?
四捨五入は文字列変換前に0.000005足して、
文字列変換後に小数点以下6桁目をNULLで上書き。
(でももっといい方法あると思う)
Eについては何に困ってるのか良く分からんのでなんともかんとも。
711691:2007/05/06(日) 22:39:54
色々な参考意見有難う御座いました。
まだC始めて1ヶ月ぐらいなので、ぱっと頭の中にどう書いたら出来るかが出てこない
ですけど(汗)。
あと、strtodを使った0消しは、strtodは文字列をdoubleに変換なので、最初にdouble型で入れた数値は
文字列ではないので、一旦適当な配列を作ってそれに、double型として
いれた数値を入れてあげてから変換ということでしょうか?
配列にdouble型変数に入れてある数値を代入出来るかどうか分かりませんが。
712699:2007/05/06(日) 22:48:36
>>710
なるほどその手が、、、

よってさっきのを訂正、あくまで自分が紹介した方法でやるなら、だけど、、、
・値を10の5乗倍→0.5を足す→intでキャスト(切捨て)→10の5乗で割る
713デフォルトの名無しさん:2007/05/06(日) 22:51:01
負の数の四捨五入も忘れないでね。
714デフォルトの名無しさん:2007/05/06(日) 22:51:55
>>706
すべてのルートっていうのは任意の頂点から他の任意の頂点への経路ってことなのか?
715699:2007/05/06(日) 22:58:00
書いてる間に、、、orz

>>711
最初からdouble型で入力を受けたなら、
何もしなくても前後の0は勝手に消えてるかと思います、たぶん

>>713
なんかもう自分失敗しまくりですねホント、、、
先の計算ですが、絶対値で計算してから符号を元に戻せばなる、かな、、、
716デフォルトの名無しさん:2007/05/06(日) 23:21:49
>>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時

期限ギリギリで申し訳ありませんが
よろしくお願いします
718デフォルトの名無しさん:2007/05/06(日) 23:43:37
>>705
ありがとうございます!
719デフォルトの名無しさん:2007/05/07(月) 00:03:28
>>592 です。。
明日(5/7)の9時までです…
誰か
A=1/√(2π)∫exp(-x^2/2)dx(x=0~2)
のAをモンテカルロ法で出してください・・
そして
exp[-1/200 Σ(x_i - 50)^2](i=1~3)
の平均値を出してもらえると嬉しいです・・

まじでお願いしますorz
GWで先生に聞けなかったんで・・・

ttp://www.borujoa.org/upload/source/upload11498.pdf
>>622
>>647
>>698
720699: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);
}

こんな感じでどうでしょうか
アルゴリズムとか調べず直感で作ったので自信薄ですが
721デフォルトの名無しさん:2007/05/07(月) 00:22:55
>717
選んだものが当りの可能性が1/3で残ったほうが2/3なのは当たり前すぎて
どう書いていいのか分からん。
正直抜き取る処理なんて書くだけ無駄だろ。
722デフォルトの名無しさん:2007/05/07(月) 00:35:56
>>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;
}
723デフォルトの名無しさん:2007/05/07(月) 00:44:43
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] その他の制限:特にありません。

割当の設計がどうも上手く行きません。
どなたかよろしくお願いします。
725デフォルトの名無しさん:2007/05/07(月) 01:04:56
>>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の方が当たる確率は高い

ってことででどうでしょうか?
726725:2007/05/07(月) 01:08:20
あっ先に答えられてたorz
徒労に終わりましたね、俺・・・
もう寝よ
727699,720:2007/05/07(月) 01:09:16
>>706
720ですが、投稿時に全角スペースが混じった模様、
そのままではコンパイルできないので注意されたし。
あと、いちいち'\0'入れてますけど出力する前に入れたほうが良いことに気づきました
まぁ結果は変わらないですけど。。。
728699,720:2007/05/07(月) 01:13:42
すいません、一つ言い忘れ
配列str2ですが、pが5のときは参照されないので最後の要素は不要です
729デフォルトの名無しさん:2007/05/07(月) 01:16:32
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日まで


730デフォルトの名無しさん:2007/05/07(月) 01:49:50
>>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
731デフォルトの名無しさん:2007/05/07(月) 01:51:15
>>730
あきらかにcの値が変だな。すまない。
見直しはしていない。
732デフォルトの名無しさん:2007/05/07(月) 03:02:29
c = sqrt(pow(a, 2.0) + pow(b, 2.0) + 2 * a * b * cos(rad));
ここだな
powのあとのやつがマイナスだな
733デフォルトの名無しさん:2007/05/07(月) 03:09:04
>>724
cygwinでもclock()でいいのかな.不確定事項が多いので何かと適当.
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3943.cpp

>>730
とりあえず余弦定理の第三項はマイナス.
× c = sqrt(pow(a, 2.0) + pow(b, 2.0) + 2 * a * b * cos(rad));
◯ c = sqrt(pow(a, 2.0) + pow(b, 2.0) - 2 * a * b * cos(rad));
734デフォルトの名無しさん:2007/05/07(月) 05:53:10
[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関数を使った(モンテカルロ法を利用した円周率を求める)
バージョンを少しだけ作ってみました。
一応ちゃんとエラーなしで起動して、円周率を表示させられました。
正しい方向性かわかりませんが、下地にして頂けたらと思います。
735デフォルトの名無しさん:2007/05/07(月) 05:54:24
※上の続き
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
double i,imax,n;
double x,y,pi[10],ave,sum;
int a;
for(a=0; a<10; a++)
{
srand((unsigned)time(NULL)%32768);
n=0.0;
imax=10000.0; //乱数発生回数
for(i=0; i<=imax; i++)
{
x=rand()/(RAND_MAX+1.0); //範囲(0,1)の乱数発生
y=rand()/(RAND_MAX+1.0);
if((x*x+y*y)<=1.0) //0<=x,y<=1の範囲にある中心原点1の4分円内に入ればカウント
{
n+=1.0;
}
}
pi[a]=n/imax*4.0; //半径1の円の面積、すなわち円周率
}
for(a=0, sum=0; a<10; a++) //結果の合計
sum += pi[a];
ave=sum/10.0; //結果の平均
printf("π=%f\n",ave);
return 0;
}
736734: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関数を用いず自作する以外はありません。
よろしくお願いします
737デフォルトの名無しさん:2007/05/07(月) 06:02:11
>>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;
}
738デフォルトの名無しさん:2007/05/07(月) 06:04:19
>>737にミスがあった。使い方はこうな
x=myrand(); y=myrand();

-int myrand()
+double myrand()
-return r/b;
+return (double)r/(double)b;
739デフォルトの名無しさん:2007/05/07(月) 06:13:28
ミスしすぎだな・・・
>>738に追加

-static int x = 1;
-int r = a*(略)
+static int r;
+if (!r) r=1;
+r=a*(r%c) - d*(r/c);
740デフォルトの名無しさん:2007/05/07(月) 06:56:43
>>720 722

お二人のソース参考にしてなんとか仕上がりそうです。
どうもありがとうございます!
741734:2007/05/07(月) 14:44:13
>739
お手伝い、大変ありがとうございます!!
早速組み立ててみたのですが、エラーはでませんでした。
しかし、円周率が常に4.000400になってしまいました。
しかもcやdの値を変えても変化がありませんでした。
このアルゴリズムに乗っ取ると、こうなるのでしょうか…
組み立てたコードを示させていただきますので、 何か変なところ、
ここがこれだとダメでしょ などのご指摘があれば宜しくお願いします。
ちなみにr0は4119でお願いします。
742734: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; }
743デフォルトの名無しさん:2007/05/07(月) 15:02:46
乱数になってない
744デフォルトの名無しさん:2007/05/07(月) 15:03:14
>>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;
}
745デフォルトの名無しさん:2007/05/07(月) 15:15:19
>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();
746734: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個の標本値の平均と標準偏差を出しなさい。

というものです。最初に少し解釈しすぎて載せてしまったために、わかりずらくなってしまった
かもしれませんが、すみませんでした…。
747デフォルトの名無しさん:2007/05/07(月) 17:20:37
>>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;
}
748744:2007/05/07(月) 18:21:32
>>746
乱数の戻り値とpiの扱いが違うかも。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3948.txt
749デフォルトの名無しさん:2007/05/07(月) 19:06:24
>746
744と745はやってることはほぼ同じ。
ただ745はfor(i=0; i<=imax; i++)をfor(i=0; i<imax; i++)に修正すべきなのを見落としたから
結果が微妙に間違ってる。
そこを修正して744のrnを4119、i_maxを10000にすれば同じ結果になると思うよ。
750ges: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が開いていなければエラー→終了ってのをお願いします。
こんな説明で分かって頂けたら幸いです。
751デフォルトの名無しさん:2007/05/07(月) 19:48:51
つSendInput
752620: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);
}
753620: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");
754620: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;
}
755デフォルトの名無しさん:2007/05/07(月) 19:55:43
>>752
細かいことだが、fin=='\0'はどうかと思うな
そりゃ意図通り動くっちゃ動くが一瞬何事かと思うぞ

で、セグフォが出てる原因だが、char型のjudgeに読み込み指定子%sを使ってるのが悪い
%sは文字列であって、文字列を文字型に突っ込むのはァゥァゥ
756デフォルトの名無しさん:2007/05/07(月) 19:58:50
>>752
どーでもいいけど、お前さん>>660でないの?
>>620でなくて。
757デフォルトの名無しさん:2007/05/07(月) 20:29:09
>>752
引数が2コより少ない場合もsegvの可能性があるな。
引数の個数チェックはちゃんとやったほうがいいぞ。
758デフォルトの名無しさん:2007/05/07(月) 20:49:48
[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
自分の課題と関係ないやつもちょくちょく見てますが
ここは勉強になります
760660:2007/05/07(月) 21:09:53
>>755-757
ありがとうございました。
761デフォルトの名無しさん:2007/05/07(月) 21:30:06
>>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の式を解いて来いといわれました
よろしくお願いいたします
763691: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
[1] 授業単元:プログラミングU
[2] 問題文 (含コード&リンク) :
 http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3949.txt
 
 weather_3.dat↓
 http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3950.txt
[3] 環境
 [3.1] OS:Linux
 [3.2] コンパイラ名とバージョン:gcc
 [3.3] 言語:C言語
[4] 期限:2007年05月08日02:00くらいまでにお願いします。
[5] その他の制限:初心者でもわかるようにお願いします。
長くなってもかまいません。
765デフォルトの名無しさん:2007/05/07(月) 22:23:38
内部処理は全てdoubleかなにか、適当な型でするとして、
atof()を使えば数値化できる。strtod()なら切り出しにも便利。
逆に文字列化するには、sprintf()で%.10gでもすればいいだろう。
あー、5桁小数点5桁か。それなら%12.5fで。負の値を扱わないなら%11.5fか。
766デフォルトの名無しさん:2007/05/07(月) 22:27:15
[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
>>730
ありがとうございます!
768デフォルトの名無しさん:2007/05/07(月) 22:35:25
>>761
ありがとうございます!
769デフォルトの名無しさん:2007/05/07(月) 22:47:25
[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
770699,720:2007/05/07(月) 23:43:34
>>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です
771699,720:2007/05/08(火) 00:06:03
あ、桁数調べる方法忘れてました、申し訳ない
0消しをした後に小数点の位置を調べて、
先頭と小数点の間隔で整数部の桁数(符号に注意)
小数点と'\0'の間隔で小数部の桁数
が分かるはずです

あと、以前に紹介した小数部の桁数を調べる方法ですが、
やはり誤差のせいで上手くいかないようです
(double型の変数に適当な値を代入して%.30fなどで出力していただければわかるかと)
なので、確実にいくなら文字列の状態のまま桁数を調べた方が上手くいきそうです
772デフォルトの名無しさん:2007/05/08(火) 00:35:05
CじゃなくてPHPなんですがなんとか教えてもらえないでしょうか?
問題文は
テキストファイルとして作成されたnews001.txt news002.txt...etcというファイルを読み込んで
タイトルと内容を分かりやすいデザインで表示するphpプログラムを作成する。
演習を行う前にテキストファイルを置くディレクトリをつくりそこに次のような内容のファイルを置く
Subject:任意
content:任意

作成順序
まずファイル名を読み込んで全て表示できるようにする。
それぞれを開いてsubject行を表示するプログラムにする
標題と内容を表示するスクリプトにする。

以上です。
PHPに手を出したのですが全く手がでないので途中まででも教えてもらえると嬉しいです。


773デフォルトの名無しさん:2007/05/08(火) 00:42:56
>>772
スレ違いじゃんかよ。

とりあえずここ読め。
http://www.php.gr.jp/project/doc/
opendir
file
とかその辺調べろ。
774デフォルトの名無しさん:2007/05/08(火) 07:44:20
>>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;
}
775デフォルトの名無しさん:2007/05/08(火) 07:57:57
>>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;
}
776774:2007/05/08(火) 08:03:25
is cannot opennedごめんなさい
777デフォルトの名無しさん:2007/05/08(火) 08:33:57
>>775
ありがとうございました!
778デフォルトの名無しさん:2007/05/08(火) 12:36:18
>>774
ありがとうございました!
779デフォルトの名無しさん:2007/05/08(火) 13:31:18
[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言語が全く手つかずにいます。
どうか、よろしくお願いします。
780デフォルトの名無しさん:2007/05/08(火) 13:49:29
>>733
ありがとうございました!
781デフォルトの名無しさん:2007/05/08(火) 14:28:00
[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] その他の制限:特にありません
782781: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 }
783782の続き:2007/05/08(火) 14:33:10
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 }
784デフォルトの名無しさん:2007/05/08(火) 14:45:55
[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
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm

ここを管理している方は誰なのでしょうか?
786デフォルトの名無しさん:2007/05/08(火) 15:16:35
>>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; }
787デフォルトの名無しさん:2007/05/08(火) 15:23:08
って、逆順に表示してただけで中身は逆順にしてなかった、スマソ。
ちとやり直してくる。
788デフォルトの名無しさん:2007/05/08(火) 15:39:37
>>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; }
789デフォルトの名無しさん:2007/05/08(火) 15:41:28
>>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';
}
790デフォルトの名無しさん:2007/05/08(火) 15:45:08
>>789
printf(s) は s中に % あると誤爆するぜよ
791デフォルトの名無しさん:2007/05/08(火) 15:49:18
あぁ〜〜、gets(ゲッツ!)やってもうた?ダンディ坂野のごとく消えてくで?
792784: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です。
794784: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) とかで落としたいです…
795デフォルトの名無しさん:2007/05/08(火) 17:29:31
>>794
>>792 コードなら str[15] = 0; が抜けてる
796デフォルトの名無しさん:2007/05/08(火) 17:32:12
>>793

プロジェクト(P)−>(プロジェクト名) のプロパティ(P)...
−>構成プロパティ−>C/C++−>プリコンパイル済みヘッダー−>プリコンパイル済みヘッダーの作成/使用

を"プリコンパイル済みヘッダーを使用しない"にする
797デフォルトの名無しさん:2007/05/08(火) 17:37:29
>>794 初期化をこうするとか?
char str[256]="/)`A'(/~otagira";
798デフォルトの名無しさん:2007/05/08(火) 17:39:35
>>794
ってか、文字列をputsやら書式を%sにしてその引数をchar型のポインタで指定する場合は
文字列の終わりを意味する\0が最後に入っていないとおかしな表示にはなるね。
799784:2007/05/08(火) 17:39:59
>>795
str[15] = '\0'; を追加したら上手くゆきました !
thx!
800デフォルトの名無しさん :2007/05/08(火) 17:43:03
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;
}
}
801デフォルトの名無しさん:2007/05/08(火) 17:55:55
)`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] リスト・スタック・キュー
803デフォルトの名無しさん:2007/05/08(火) 18:21:38
>[3.3] どちらでも可
C++ だと STL 使って終わりみたいな題意外の解がきそうだな
804デフォルトの名無しさん:2007/05/08(火) 18:22:58
>802訂正
[3.3] たぶんCのみだと思います。
すみませんでした。
805デフォルトの名無しさん:2007/05/08(火) 19:03:36
806デフォルトの名無しさん:2007/05/08(火) 19:20:05
>>805
表示は完璧でした。
あと、自分で入力した数値をスタック・キューで表示できればいいんですが。
807デフォルトの名無しさん:2007/05/08(火) 19:21:03
>>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;
}

誤差が……。
808デフォルトの名無しさん:2007/05/08(火) 19:24:14
>>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
うーん…ちょっとおかしくなっちゃったかな(汗)
バカな俺ですいません。
810デフォルトの名無しさん:2007/05/08(火) 20:27:24
[1] 授業単元: プログラミング演習
[2] 問題文(含コード&リンク):
配列要素3のキュー構造を以下の実行結果になるように実現せよ。
実行結果は別に書きます。
[3] 環境
 [3.1] OS: WindowsXP
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C
[4] 期限: 5月10日
[5] その他の制限:特になし

よろしくお願いします。
811デフォルトの名無しさん:2007/05/08(火) 20:28:53
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 (表示)
812810:2007/05/08(火) 20:35:19
すみません、outputの括弧内は入力でなく表示でした。
output > a (表示)
output > b (表示)
output > c (表示)
813デフォルトの名無しさん:2007/05/08(火) 20:48:47
#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;
}
814デフォルトの名無しさん:2007/05/08(火) 20:51:15
>>813
ageinとも言ってほしいみたいだぞ。
815デフォルトの名無しさん:2007/05/08(火) 20:56:03
見逃してた。

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デフォルトの名無しさん:2007/05/08(火) 21:06:08
>>779
前進差分公式で数値微分してみた。
建設的な突っ込み大歓迎
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3955.cpp
817デフォルトの名無しさん:2007/05/08(火) 21:21:47
>>816
「建設的な突っ込み」じゃなくてただのチャチャだけど。
・printf()ならずっと出力整形が楽なのに乙だ
・ループでxに0.01ずつ加算していくと誤差が集積していくので、1を加算して
 100で割ったほうが良いかも
・そこのうpろだへのリンクは、さすがにh抜かんでも良いと思う
818デフォルトの名無しさん:2007/05/08(火) 21:28:33
>>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デフォルトの名無しさん:2007/05/09(水) 03:20:02
[1] 授業単元:プログラミング
[2] 問題文(含コード&リンク):http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3957.txt
[3] 環境
 [3.1] OS:Windows
 [3.2] コンパイラ名とバージョン:VC++ 6.0
 [3.3] 言語:C
[4] 期限:2007年5月9日23時まで。
[5] その他の制限:なし。


よろしくお願いします。
821デフォルトの名無しさん:2007/05/09(水) 06:03:13
>>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;
}
822デフォルトの名無しさん:2007/05/09(水) 06:03:48
>>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;
}
823デフォルトの名無しさん:2007/05/09(水) 06:07:41
>>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
825デフォルトの名無しさん:2007/05/09(水) 13:59:19
>>821-823
ありがとうございます!
826デフォルトの名無しさん:2007/05/09(水) 14:03:17
>>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
変換後:変換できない
この文問題わかる方がいましたら教えてください
828デフォルトの名無しさん:2007/05/09(水) 15:00:47
>>827
どうして'S'は変換できないの?
829デフォルトの名無しさん:2007/05/09(水) 15:12:22
[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
830デフォルトの名無しさん:2007/05/09(水) 15:32:58
>>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までお願いいたします。
必修の授業でプログラミングがあるのですが、毎回課題に苦労しています。
プログラミングを得意になるにはどうしたら良いでしょうか?
832デフォルトの名無しさん:2007/05/09(水) 16:01:43
>>831
問1.
- int c;
+ static int c;
833デフォルトの名無しさん:2007/05/09(水) 16:12:02
>>831
問2(flip()のみ)

int flip(void)
{
srand(time(NULL));
if (((rand()+1.0)/(RAND_MAX+1.0)) > 0.5)
return 1;
else
return 0;
}
834デフォルトの名無しさん:2007/05/09(水) 16:18:53
>>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;
}
835デフォルトの名無しさん:2007/05/09(水) 16:28:04
>>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;
}
836デフォルトの名無しさん:2007/05/09(水) 16:35:29
>>835
rand()は多くの場合、線形合同法によって実装されている
その関係で下位ビットのみを使用する方法(剰余とか)では
非常に質の悪い乱数しか得られない
837834-835:2007/05/09(水) 16:42:48
>>836
ご指摘ありがとうございます。勉強になりました
838デフォルトの名無しさん:2007/05/09(水) 16:43:08
int flip(void){ return (int)((double)rand() / (RAND_MAX+1) * 2); }
でいいじゃん。
いちいち関数呼び出すたびに乱数初期化すんのもな。
839デフォルトの名無しさん:2007/05/09(水) 18:57:46
#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);
}
のプログラムが動かないんですけど、どこが悪いのか教えていただけないでしょうか?
840デフォルトの名無しさん:2007/05/09(水) 19:07:57
>839
ここはデバッグするところじゃねーぞ
841デフォルトの名無しさん:2007/05/09(水) 19:08:39
>>839
悪いところが多すぎる。勉強し直せ
842デフォルトの名無しさん:2007/05/09(水) 19:12:57
>>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] その他の制限: なし

よろしくお願いします
844691:2007/05/09(水) 19:59:19
お礼の返事が遅れて申し訳ないです。アドバイス本当に有難う御座いました。
アドバイスの御陰で、現在電卓製造がほぼ終盤にさしかかってます。

最後一点だけ
・Ctrl+cが入力されたら、エラーメッセージを表示してから終了させる。
この処理だけが、色々検索かけて分からずじまいです。
通常はctrl+cを入れたらプロンプトでは「^C」が表示されて終了なんですが、
今回の場合はCtrl+cが入力されたということをプログラムに認識させて、その後printfで
エラーメッセージ出力なんでしょうが、その認識させる方法がまだ見つかって
ません。
方法についてアドバイス頂けませんでしょうか。
845デフォルトの名無しさん:2007/05/09(水) 20:18:14
>>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;
}
846デフォルトの名無しさん:2007/05/09(水) 20:21:28
>>844
Ctrl+Cの場合、プログラムにはSIGINTが送られる
これを捕捉してやればできなくはない
847デフォルトの名無しさん:2007/05/09(水) 20:34:01
>>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;
}
848699,720:2007/05/09(水) 20:51:02
>>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);
}
849デフォルトの名無しさん:2007/05/09(水) 21:30:44
>>845,847
dです。
回答を参考にしたいと思います。
850デフォルトの名無しさん:2007/05/09(水) 21:57:31
[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デフォルトの名無しさん:2007/05/09(水) 22:08:08
一通り学習してそれなら辞めた方がいいんじゃ?
852デフォルトの名無しさん:2007/05/09(水) 22:20:17
>>851
僕は、編入でプログラムは初めて。
しかし、単位取らないと卒業できないので…
C言語一通り学習程度向けの講義だそうです。
853デフォルトの名無しさん:2007/05/09(水) 22:28:25
>>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;}
854デフォルトの名無しさん:2007/05/09(水) 23:03:22
マクロで変数の名前を文字列で取得することは出来ますか?
wchar_t[]で。
855デフォルトの名無しさん:2007/05/09(水) 23:11:51
>>854
意味が分からんし、そもそもスレ違い
856デフォルトの名無しさん:2007/05/09(水) 23:13:00
[1] 授業単元:プログラミングT
[2] 問題文(含コード&リンク):
  http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3958.txt
[3] 環境
 [3.1] OS: Windows
 [3.2] コンパイラ名とバージョン:VC++2005
 [3.3] 言語: C++
[4] 期限: 2007/ 5/ 10/ 17:00
[5] お願いします
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] その他の制限: 特になし
858デフォルトの名無しさん:2007/05/09(水) 23:45:19
void tohex(int d){
for(;d >= 16;d = d/16)push(d);
for(;putchar(hex[d%16]),!stackempty();d = pop());
}

>どこか入力ミスでもしてるのでしょうか。
main関数より先にtohexを定義するよろし。
859デフォルトの名無しさん:2007/05/10(木) 00:02:36
>>858さん
どうもありがとうございました。
おかげでエラー原因もわかり、もとのものでもコンパイル成功しました。
また、858さんに教えていただいたfor文で書き換えることにも成功しました。
本当にありがとです。
860デフォルトの名無しさん:2007/05/10(木) 00:33:20
>>853
本当にありがとうございます。
861デフォルトの名無しさん:2007/05/10(木) 00:47:52
[1] 授業単元:ネットワークプログラミング
[2] 問題文(含コード&リンク):http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3960.txt
[3] 環境
 [3.1] OS: Linux
 [3.2] コンパイラ名とバージョン: gcc 3.4
 [3.3] 言語: Cだと思います
[4] 期限: 2007年5月10日 08:00まで
[5] その他の制限: 問題のとおりです

どうかお力をお貸し下さい。よろしくお願いします。
862デフォルトの名無しさん:2007/05/10(木) 02:24:01
すまない、軽くすれ違いかもしれないけど一応Cの問題なので・・・

牛乳1パック買っても3パック分(200円)の料金となります。

この牛乳の料金を求める数式っていうのが全くわからない・・・
本当に私事だけど急ぎで知りたいのですが教えていただけませんか??
863デフォルトの名無しさん:2007/05/10(木) 02:29:01
言ってる意味がわからん
864デフォルトの名無しさん:2007/05/10(木) 02:45:25
>>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);
}
}
865デフォルトの名無しさん:2007/05/10(木) 02:46:49
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();
}
866デフォルトの名無しさん:2007/05/10(木) 02:48:29
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;
868656: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
>>869
お前初めてかCは? 力抜けよ
871デフォルトの名無しさん:2007/05/10(木) 14:11:59
習ってないものは使いたくない
そしてポインタは習ってないのに(int *)malloc(sizeof(int))を使うとな・・・
872829:2007/05/10(木) 17:31:51
とりあえず「コマンドライン入力を受け付けて実行可能ファイルを実行できる」
という機能は実装できたのですが、その他がさっぱりです。
どなたかお願いします・・・
873デフォルトの名無しさん:2007/05/10(木) 18:23:12
>>829
これは「宿題」の規模じゃねぇな・・・
金取る「仕事」のレベルだぞコレ
1年かけたらまぁ作れるレベルでもあるんだろうけどな
874デフォルトの名無しさん:2007/05/10(木) 18:38:21
>>829 俺も勉強中ですが、、、

某入門書のサンプルソース (sh2.c - パイプとリダイレクトのみ実装)
http://www.loveruby.net/ja/linuxprog/
busybox (組込みLinux向けツール群) のソース
http://busybox.net/cgi-bin/viewcvs.cgi/trunk/busybox/shell/
875デフォルトの名無しさん:2007/05/10(木) 18:44:41
某入門書のサンプルソース
http://basepath.com/aup/ex/sh3_8c-source.html
876デフォルトの名無しさん:2007/05/10(木) 19:41:42
>>873
マジすか・・・
あと1ヶ月じゃやっぱり無理ですかね・・・

>>874>>875
dクス!
これ見てもうちょっとだけ頑張ってみます
877デフォルトの名無しさん:2007/05/10(木) 19:59:48
>>873
> 1年かけたらまぁ作れるレベルでもあるんだろうけどな
ねーよwwwどんだけ底辺なんだよw
878デフォルトの名無しさん:2007/05/10(木) 20:30:50
まぁ、自力でできないなら卒業しちゃだめだろ。
来年もがんばれ。
879デフォルトの名無しさん:2007/05/10(木) 21:06:13
まぁ俺は多分底辺ですよ
もう3年の頃から全くついていけてないorz
880デフォルトの名無しさん:2007/05/10(木) 21:23:38
>>879
院生にでもアドバイス貰ったら?
881810:2007/05/10(木) 21:24:46
[1] 授業単元:プログラミング技術V
[2] 問題文(含コード&リンク):
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3963.txt
[3] 環境
 [3.1] OS: WindowsXP
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C
[4] 期限: 2007年5月12日
[5] その他の制限: 特になし

よろしくお願いします。
882デフォルトの名無しさん:2007/05/10(木) 21:55: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日までにお願いします。
883デフォルトの名無しさん:2007/05/11(金) 00:34:19
>>882
クラメールの法則を使った。入力は整数のみだが、x、yの値が小数になる時には
分数で表示するようにしてある。無意味な機能を付けて複雑になったからバグが有るかもね。
所で、int型の絶対値を取る簡単な方法は無いですか?(unsigned)を使ったけど
ダメだったので(int)fabs((double)datA2)とかやって無理やり絶対値を取った。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3964.c
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日 夕方


885883:2007/05/11(金) 00:56:16
883の訂正
×クラメールの法則
○クラメールの公式
俺自体がバグってるよ。
あと、変数の宣言のあとに以下の文を入れた方が親切だったな。
printf("ax+cy=e\nbx+dy=f");
886デフォルトの名無しさん:2007/05/11(金) 01:11:45
> int型の絶対値を取る簡単な方法は無いですか?

簡単ってどの程度のことを言ってるの分からんけど、
fabs使うんなら普通にabs使えばいいんでないか。
libm も要らんしな。
887デフォルトの名無しさん:2007/05/11(金) 01:26:17
>>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

お願いします。
889デフォルトの名無しさん:2007/05/11(金) 02:30:52
大学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

お願いします。
890デフォルトの名無しさん:2007/05/11(金) 03:02:45
>>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;}
891デフォルトの名無しさん:2007/05/11(金) 03:11:55
>>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;
}
892デフォルトの名無しさん:2007/05/11(金) 04:03:36
>>891
889です。大変早急にレスして頂いて本当にありがとうございました。
893デフォルトの名無しさん:2007/05/11(金) 04:27:15
[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ってなによ?
895デフォルトの名無しさん:2007/05/11(金) 04:44:51
C言語です
896デフォルトの名無しさん:2007/05/11(金) 04:47:10
カウントCってなによ?
897デフォルトの名無しさん:2007/05/11(金) 04:53:31
すいません、問題間違ってました
[2] 問題文(含コード&リンク):入力テキストファイルを解析する問題を考える、
テキスト行には、T1、T2、T3という3つの型があり、それぞれのテキスト行の1文字目には
1,2,3と書いてあるものとする。このとき、次のような解析を行うプログラムを作成せよ。
・最初のT1行の前にある行の数を数える(これをカウントAと呼ぶ)
・最初のT1行を表示する
・最初のT1行の後に来るバッチ(1枚以上の連続したT1行の列または1枚以上の連続したT3行の列)
 の数を数える(これをカウントBと呼ぶ)
・最初のT1行の後に来るT1行の総数を数える(これをカウントCと呼ぶ)←ここ抜けてました
・最初のT1行の後に来るT3行からなるバッチの数を数える(これをカウントDと呼ぶ)
・最後の行を表示する(この行は必ず最初のT1行の後に来る最初のT2行でなければならないと仮定する)
・最後の行の表示直後にカウントABCDを表示する 

本当にすいません
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;
}
899C言語: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の田中の名前だけを表示させたいというプログラムです。空白はタブです。やさしいかたお願いします。
900デフォルトの名無しさん:2007/05/11(金) 12:22:01
>>899
>1
つーか、向こうで相手にされなかったんだからいい加減諦めたら?
901デフォルトの名無しさん:2007/05/11(金) 12:25:17
>>899
grep `cat FD` PCのdatファイル |awk '{print $2;}'
902デフォルトの名無しさん:2007/05/11(金) 13:30:44
>>899 これならFDが壊れていても動作するよ!
#include<stdio.h>
int main(void){
    puts("田中");
    return 0;
}
903デフォルトの名無しさん:2007/05/11(金) 14:28:23
>>899
その内容なら、Cよりperlとかのほうが良いのではないか?w
904デフォルトの名無しさん:2007/05/11(金) 15:51:28
>>890
ありがとうございます。
あの・・・表示されないんですけど・・・
どなたか>>888をお願いします。
905デフォルトの名無しさん:2007/05/11(金) 16:12:21
>>904
俺は >890 じゃねーけど、バグ取ってみた。
>>890 の、クラス内のRoll()を以下のように変えれば動くね。
int Roll(){ num = (rand() % side) + 1; return num; }

個人的には、SIDEを定義してるんだから、
宣言やd6の初期値にも渡せば良いような気がするけど。
まぁどうでもいいか。
906デフォルトの名無しさん:2007/05/11(金) 16:17:25
>>904
>890試してみたけどちゃんと表示されるよ。
「表示されない」を詳しく。
907デフォルトの名無しさん:2007/05/11(金) 16:20:25
rand()>>16したら0しか出ないよな。
908デフォルトの名無しさん:2007/05/11(金) 19:29:44
どんだけ偏った乱数なんだよ!
909デフォルトの名無しさん:2007/05/11(金) 19:34:44
>>899 こうですか?自分でもきんもぉ〜★なソースでわかりません ><;
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3965.txt
fd.datの中身(4桁の数字のみ、改行なしでもおk)
1001

pc.datの中身(値同士の区切りはTABかスペースでおk)
1001 田中 19840908 千葉県
1002 高橋 19841203 埼玉県
1003 吉田 19840405 山形県
1004 佐藤 19841112 沖縄県
910デフォルトの名無しさん:2007/05/11(金) 19:35:02
[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といった基本的なこと。ポインタは少し。

今年からアルゴリズムを習い始めました。
スタックやキューの違いは理解できているのですがそれらをどうプログラムに直すかがわかりません。
よろしくお願いします。
ソースのほうに適宜、コメント等付け加えてもらえると有り難いです。
911デフォルトの名無しさん:2007/05/11(金) 19:36:52
pc.datの中身を規定通りに記入しないとプログラムが終了しないっぽい orz
912デフォルトの名無しさん:2007/05/11(金) 20:01:26
>>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;
913デフォルトの名無しさん:2007/05/11(金) 20:01:58
>>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);
}
914デフォルトの名無しさん:2007/05/11(金) 20:02:52
>>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
[1] 授業単元:プログラミング実習
[2] 問題文(含コード&リンク): http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3966.txt
[3] 環境
 [3.1] OS: UNIX
 [3.2] コンパイラ名とバージョン: cc
 [3.3] 言語: C
[4] 期限: 5月13日
[5] その他の制限: 特になし

最小2乗法を用いて、データ点に対する近似多項式を求める問題
なのですが、上記のプログラムを実行するとセグメントエラーを
起こしてしまいます。何度も見直しましたが解決できませんでした。
間違っている部分を指摘していただけると助かります。
よろしくお願いします。
916デフォルトの名無しさん:2007/05/11(金) 21:43:22
>>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)
917デフォルトの名無しさん:2007/05/11(金) 21:44:28
>>915
恐らく49行目のこのforループが怪しい。
forループは実数で回さず、整数で回して、ループ内でXの値を
計算で求めるようにするとよい。

> for(X=x[0]-1.0; X<x[S]+1.0; X+=0.1)
918デフォルトの名無しさん:2007/05/11(金) 21:46:18
>>915
・・・と思ったが、これがおかしいね。

x[S]

S=10で、xは[0..9]までしか確保されてないのだから、x[10]を
アクセスしようとしてエラーが出るのか。
919デフォルトの名無しさん:2007/05/11(金) 21:49:44
mがNになってんのがまずいんじゃね?
920デフォルトの名無しさん:2007/05/11(金) 21:52:49
> for(X=x[0]-1.0; X<x[S]+1.0; X+=0.1)

この文でSが10だとまずいだろ。9までだぞ。
921デフォルトの名無しさん:2007/05/11(金) 22:00:35
具体的には

for(X=x[0]-1.0; X<x[S-1]+1.0; X+=0.1)

でいいんじゃね?>>915
922デフォルトの名無しさん:2007/05/11(金) 22:19:48
>>916-921
早速の回答ありがとうございました。
指摘されている通り、for文での X < x[S]+1.0 がまずかったみたいです。
[S]を[S-1]にすることで正しく実行できるようになりました。

何度も見直したはずなのに、こんなところで凡ミスをしていたなんて・・・orz
923デフォルトの名無しさん:2007/05/11(金) 22:22:13
>>898
ありがとうございます。
多分こんな感じでいいんだと思います。
924デフォルトの名無しさん:2007/05/11(金) 23:03:49
[1] 授業単元:プログラミング実習
[2] 問題文(含コード&リンク)
コインの種類C[0]からC[k-1],与えられた金額mに対して、コインの数を最小にするmの払い方を求めるプログラムを書け。
[4]提出期限 5月28日月

よろしくお願いします。
925デフォルトの名無しさん:2007/05/11(金) 23:41:14
[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)に対する
足し算・引き算・かけ算、割り算をする関数も作っていただけると幸いです

よろしくお願いします。
926デフォルトの名無しさん:2007/05/12(土) 00:05:02
>>925
「コインの種類」って何か決まっているんじゃないの?
たとえば日本の通貨でいうとC[0] = 1、C[1] = 5、C[2] = 10 とか。(kは6未満)

勝手に決めていいものじゃないだろ。
そのへんを詳しく。
927デフォルトの名無しさん:2007/05/12(土) 00:05:41
>>926>>924への問いね。
928デフォルトの名無しさん:2007/05/12(土) 00:06:56
>>924
このスレで既に回答されてる
929デフォルトの名無しさん:2007/05/12(土) 00:39:17
paddが悩ましい。
930デフォルトの名無しさん:2007/05/12(土) 01:47:30
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] その他の制限: 一行でやれとのことです

宜しくお願いします。
932デフォルトの名無しさん:2007/05/12(土) 03:43:38
なんかダメだ。
x = x - (y = (x = x + y) - y);
933デフォルトの名無しさん:2007/05/12(土) 03:46:20
>>931
x ^= y;
y ^= x;
x ^= y;

これでテンポラリ無しでの交換は出来るが一行って制限が意味不明だな
x ^= y ^= x ^= y;とすりゃ一行にはなるし、一応動くが
直前の副作用完了点から次の副作用完了点までの間で同一変数への
書き込みを2度も行ってるからまともに動かない処理系があっても文句は言えん

次善策としてこれでもいいが見辛くなるだけ
x ^= y, y ^= x, x^= y;

結論としては一行なんて意味の無い制限を課した教官がアホ
934925: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);
}
}
}
にすると今度は数字が表示されなくなってしまいました。

恐らく無理矢理混ぜたことでおかしくなってるんだと思いますが、
原因が自分には分からないのでよろしくお願いします
935デフォルトの名無しさん:2007/05/12(土) 04:04:59
>>933 これならどう?副作用に問題ある?
x ^=(y ^=(x ^= y))
936デフォルトの名無しさん:2007/05/12(土) 04:05:14
>>933
これイイ
937デフォルトの名無しさん:2007/05/12(土) 04:15:20
>>935
ある。()を付けたところで副作用完了点になる訳じゃないから意味がない
疑問に思うならlintに掛けてみるといい。警告が出されるはずだから
938925: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
おおお
ありがとうございます。
本来の課題にオマケとして付いてきた感じの課題で、「興味がある奴は考えてみると基礎的な部分の理解に繋がる」とか
そんなことを言われて、サッパリ分からずに質問したのです。

今ノートに書きつつ手で計算してビックリしました。
ありがとうございます。
940デフォルトの名無しさん:2007/05/12(土) 08:09:13
>>939
実際には、全く使えない技術だけどね。
941デフォルトの名無しさん:2007/05/12(土) 11:09:54
[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] その他の制限: 特になし

期限が短くて申し訳ないんですがお願いします。
943デフォルトの名無しさん:2007/05/12(土) 13:43:43
1] 授業単元:プログラミング基礎
[2] 問題文(含コード&リンク):
2つの文字列の比較を行う関数を配列とポインタを用いて作成せよ。
また文字列が同じであれば1を、異なれば0を出力しなさい。
<実行例>
文字列@:English
文字列A:England
結果:0
[3] 環境
 [3.1] OS: Windows
 [3.2] コンパイラ名とバージョン:特になし
 [3.3] 言語: C
[4] 期限: 5月13日
[5] その他の制限: 特になし
944943:2007/05/12(土) 13:44:46
説明不足でした。作成する関数は配列とポインタそれぞれ1つずつです。
945デフォルトの名無しさん:2007/05/12(土) 13:46:54
>>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;
}
946945: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;
}
947デフォルトの名無しさん:2007/05/12(土) 13:59:17
>>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;
}
948デフォルトの名無しさん:2007/05/12(土) 14:06:05
>>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;
}
949943:2007/05/12(土) 14:13:25
>>947
ありがとうございます。
文字列のEnglishと、Englandですが、実行例なので、数字や漢数字、半角英数も含めた任意の文字列の場合は、どうしたらいいでしょうか?
>>947
関数を2つ作ってそれぞれ別のファイルで1つずつ使用する問題です。
(配列を利用した関数とポインタを利用した関数の2つ)
950デフォルトの名無しさん:2007/05/12(土) 14:21:17
>>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]);
}
951デフォルトの名無しさん:2007/05/12(土) 14:22:29
少しは見なおしてから書き込め >オレ
    for(;a[i]!='\0';i++)

    for(i=0;a[i]!='\0';i++)
952デフォルトの名無しさん:2007/05/12(土) 14:30:56
それのどこが配列を使っているのか詳細きぼんぬ。
それとも、演算子を換えただけで配列と言い張るのか?
だとしたら、>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] その他の制限:特になし
よろしくお願いします。
954デフォルトの名無しさん:2007/05/12(土) 14:47:38
>>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;
}
955699,720:2007/05/12(土) 15:32:16
>>952
本人じゃないですが気になったので。
単に[]と*の二つの演算子の扱いを確認するための問題なんじゃないかなと思います。
問題文の時点で変な気がしますけど、そうじゃないとますます変な問題になりそうな・・・。

自分が未熟なだけかもしれませんが・・・。
956デフォルトの名無しさん:2007/05/12(土) 15:32:32
>>941
公式が間違ってないか?
括弧とかきちんと書かないと計算結果が変になるぞ
(故意に計算間違いをする会計システムじゃあるまいし)

その公式でいいというのなら別だが…
957デフォルトの名無しさん:2007/05/12(土) 15:50:48
>>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
ありがとうございました!
959デフォルトの名無しさん:2007/05/12(土) 16:19:05
>>956
すみません。
y=ax+bの一次関数でa、bを求めてからy=ax+bの式に入れて表示するプログラムです。
a、bの式はこれであってます。
960デフォルトの名無しさん:2007/05/12(土) 17:02:20
>>881
エレガントな方法が思いつかなかった
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3970.c
961デフォルトの名無しさん:2007/05/12(土) 17:12:52
>>769
x1, x2, x3 の内容は?
962デフォルトの名無しさん:2007/05/12(土) 23:14:18
[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進数まで変換できればよい
以上です。
よろしくお願いします。
963デフォルトの名無しさん:2007/05/12(土) 23:21:51
>>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;
}

範囲チェックとかは面倒だから割愛
965デフォルトの名無しさん:2007/05/13(日) 00:14:15
もう見てないかも知れないが、
>>934
10^hは10のh乗じゃ無くて10とhのxor

頭に#include <stdlib.h>を追加して、
struct bignum tobignum(int x){
struct bignum b;
int i;
ldiv_t r;
b.p=1;
b.sign=x<0?-1:1;
for(i=0;i<LIMIT;++i){
r=ldiv(x,10);
x=r.quot;
b.str[i]=r.rem*b.sign;
if(x) b.p++;
}
if(x) b.sign=0;
return b;
}
966デフォルトの名無しさん:2007/05/13(日) 01:30:20
[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] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々)
   制限は特にありません
   よろしくお願いします
967デフォルトの名無しさん:2007/05/13(日) 01:40:24
>>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;
}
968デフォルトの名無しさん:2007/05/13(日) 01:49:19
>>967
floatとdoubleで実行結果に差が出るのはなぜなんでしょうか?
969デフォルトの名無しさん:2007/05/13(日) 01:58:25
>>968
小数点以下の精度の問題じゃね?0.01を2進数でどう表せる?考えてみ。
double型の方がfloat型より精度が高い。その精度の差が誤差として出てしまっている。
970デフォルトの名無しさん:2007/05/13(日) 02:08:55
>>968
浮動小数ってのは簡単に言うと
○.○○×△^□
という形で数値を表す方法
んで、○の部分は桁数が、△は数値がそれぞれ固定、□にも上限下限がある

だから例えば○部分が3桁の場合
1.01*10^2になってる時に0.01を足しても影響が無くなる(つまり演算結果がおかしくなる)けど
もし、○が6桁だったとしたら
1.01000*10^2 + 0.01 = 1.01010*10^2という風にちゃんと表すことができる
これがdoubleとfloatで結果がずれる理由

#まぁ実際にはこんなに精度悪くはないんだけどな
#その辺はヘッダ参照の事
971デフォルトの名無しさん:2007/05/13(日) 02:58:37
なんか、前にも小数を何回か足していって、if文である値になったら違った条件の計算をするといった
課題を見かけたけど、そんときゃ確かif文の中に指定した値に足していった値が一致しなくて
if文の条件にある計算がされなかったという結果が出てたな。
要するに近似値が使われていると。小数点以下の精度が低くなればなるほど、その近似値にも
差が出るわけで。まぁ、最終的には小数点以下を2進数で表現したらどうなるか?そこにいきつくかと。
972デフォルトの名無しさん:2007/05/13(日) 03:02:23
>>971
doubleだったかfloatだったかをループ変数にしてた奴だな
あれは余程の理由があって、またそれによる副作用(C的な意味じゃなくて普通の意味な)が
ちゃんと分かってる時以外は御法度だな
973デフォルトの名無しさん:2007/05/13(日) 03:08:44
0.01を2進数にすると循環しちゃわない?
ふと考えたらどうすればいいのかわからなくなってしまった
オレもまだまだっていう証拠だな┐(´д`)┌
974デフォルトの名無しさん:2007/05/13(日) 03:14:26
>>973
浮動小数で演算する以上は避けられない誤差として諦めるしかない
どうにかしたいっていうなら、BCD等で計算してくれるライブラリ・処理系を探してくるか
無いなら自分でそういうライブラリ作るしかない
975デフォルトの名無しさん:2007/05/13(日) 03:24:57
>>973
まぁ、それが精度によって可能な範囲内で、指定した値を越えない近似値で処理されているみたいで。。。
976910: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; /* 末尾に追加 */
}
}
のように{}で囲むとキューの表示がおかしくなったので。

よろしくお願いします。
977デフォルトの名無しさん:2007/05/13(日) 04:39:24
>>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)
  ;
978デフォルトの名無しさん:2007/05/13(日) 07:23:45
>976
{}で囲む範囲がおかしい。
つまりループの内容を全く理解していない。
理解してないんなら、余計なことはしないほうがいい。
979デフォルトの名無しさん:2007/05/13(日) 09:01:16
【質問テンプレ】
[1] 授業単元:プログラミング技術1
[2]
main(){
int i,j;
int a[100];

for(i=1;i<100;i++)a[i]=0;

for(i=2;1<50;i++)
for(j=i+i;j<100;j=j+i){
a[i]=1;
}
for(i=2;i<100;i++){
if(a[i]==0)printf("%d\n",i);
}
}
上記ソースコードをベースに素数の表示と個数の表示をしろってプログラム
なのですが、素数の表示までは出来たのですが、個数のカウントをどうやるのか
漏れの頭では思い浮かびませんorz
何方か助けてください。


[3] 環境
 [3.1] OS:Linux
 [3.2] gcc ver不明
 [3.3] 言語:C
[4] 期限: ([2007年5月15日hh:mmまで] または [無期限] のいずれか)
[5] その他の制限: まだ習い始めたばかりでfor文あたりまでしか習っていません。
先生の話によると変数の宣言はそのままに後半を少し変更するだけで
出来るらしいのですが・・・。
980デフォルトの名無しさん
>>979
a[i]=1の時に100-1するとか、a[i]==0の時に+1するとか好きなようにしれ