1 :
デフォルトの名無しさん :
2009/05/18(月) 23:06:51
刀、 , ヘ
/´ ̄`ヽ /: : : \_____/: : : : ヽ、
,. -‐┴─‐- <^ヽ、: : : : : : : : : : : : : : : : : : : : : : }
/: : : : : : : : : : : : : :`.ヽl____: : : : : : : : : : : : : : : : : : /
,. -──「`: : : : : : : : : :ヽ: : : : : : : : :\ `ヽ ̄ ̄ ̄ フ: : : : :/
/: :.,.-ァ: : : |: : : : : : : : : :\: : : : :: : : :ヽ \ /: : : :/
 ̄ ̄/: : : : ヽ: : : . . . . . . . . . . .、 \=--: : : :.i / /: : : : :/
/: : ∧: \: : : : : : : : : : ヽ: :\: : : 〃}/ /: : : : :/ 、
. /: : / . : : :! ヽ: : l\_\/: : : : :\: ヽ彡: : | /: : : : :/ |\
/: : ィ: : : : :.i: : | \!___/ ヽ:: : : : : : :\|:.:.:.:/:! ,': : : : / |: : \
/ / !: : : : :.ト‐|- ヽ \: : : : : l::::__:' :/ i: : : : :{ |: : : :.ヽ
l/ |: : :!: : .l: :| \: : : l´r. Y {: : : : :丶_______.ノ: : : : : :}
l: : :l: : :ト、| 、___,ィ ヽ: :| ゝ ノ '.: : : : : : : : : : : : : : : : : : : : : : /
|: : :ト、: |: :ヽ ___,彡 ´ ̄´ ヽl-‐' \: : : : : : : : : : : : : : : : : : イ
!: :从ヽ!ヽ.ハ=≠' , ///// ///u /  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
V ヽ| }/// r‐'⌒ヽ イ〉、
ヽ、______ー‐‐' ィ´ /:/:7rt‐---、 こ、これは
>>1 乙じゃなくて
ィ幵ノ ./:/:./:.! !: : : : :!`ヽ ポニーテールなんだから
r‐'T¨「 |: | !:.∨:/:./: :| |: : : : .l: : : :\ 変な勘違いしないでよね!
/: : .|: :| !:.!ィ¨¨ヾ、:.:/ !: : : : l: : : : : :.\
[1] 授業単元: 中級C++
[2] 問題文(含コード&リンク):
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9209.zip [3] 環境
[3.1] OS: ウィンドウズ
[3.2] コンパイラ名とバージョン: ビジュアルC++
[3.3] 言語: C++
[4] 期限: 2009年5月21日朝まで
[5] その他の制限:
「もともと」ディレクトリは提供されたオリジナルのファイルです。
(1)は自力で出来ましたので一応添付しています。わからないのは(2)以降です。
具体的にどのようなアウトプットを求めているのか、問題の意味もあまりよくわかりません。
(3)、(4)になるとますます何を求めているのかわからないのですが、とりあえずいつも
問題が曖昧な先生なのでそれっぽいことをコードで示せば許してもらえます。
という訳で適当な感じでも構わないので(2だけでも結構ですので)よろしくおねがいします
6 :
6 ◆tr.t4dJfuU :2009/05/20(水) 18:06:23
【質問テンプレ】
[1] 授業単元: プログラミング言語
[2] 問題文(含コード&リンク):
http://d.pic.to/vrk8t ・2つの数xとyはint型で定義し、キーボードから入力すること。
・掛けられる数(*の左側)はx,…,x+3まで変化させること。
・掛ける数(*の右側)はy,…,y+14まで変化させること。
・出力形式は写真実行例をそっくり真似ること。
・xとyの値の範囲は−9以上9以下とする。
・どんな値を入力しても桁がそろうようにすること。
[3] 環境
[3.1] OS: Windows
[3.2] コンパイラ名とバージョン: VC++2008
[3.3] 言語: C++
[4] 期限: ([2009年5月20日23:59まで]
[5] その他の制限: scanf,printf,forを使ってやるようにとのことです
お願いします
問題がzipだと見る気がしないでござる
>>6 #include <stdio.h>
int main(){
int x, y;
printf("x="); scanf("%d", &x);
printf("y="); scanf("%d", &y);
for(int i = y; i <= y+14; ++i){
for(int j = x; j <= x+3; ++j)
printf("[%2d]*[%2d]=[%4d],", j, i, i*j);
printf("\n");
} return 0;
}
よろしくお願いします。 授業単元ソフトウェア製作実習 osソラリス コンパイラgcc 言語c 高さhが2で上底aと下底bが次のような値の台形4つの面積の合計を求めるプログラムをfor文を使って作成せよ。 表示形式 台形(1)a=0、b=4、h=2 面積= 台形(2)a=4,b=16h=2面積= 台形(3)a=16、b=36、h=2面積= 台形(4)a=36、b=64 h=2 面積= 4つの台形の面積の合計=
>>994 課題1
#include <stdio.h>
#include <unistd.h>
int rm(char *file)
{
int ret;
ret = unlink(file);
if (ret < 0){
perror(file);
}
return ret;
}
int main(int argc, char *argv[])
{
while (--argc > 0)
rm(*++argv);
return 0;
}
#include <stdio.h> int main(void) { int a, b, i, area, total_area = 0; for(i=1; i<=4; i++) { a = (i-1) * (i-1) * 4; b = i * i * 4; area = a + b; printf("台形(%d)a=%2d、b=%2d、h=2 面積=%d\n", i, a, b, area); total_area += area; } printf("4つの台形の面積の合計=%d\n", total_area); return 0; }
>>010 0/4=0, 4/4=1, 16/4=4, 36/4=9, 64/4=16, .... なるほど感心するわ。
// gcc --input-charset=cp932 --exec-charset=cp932
#include <stdio.h>
int main() {
int i;
float daikei[][3] = {
0,4,2,
4,16,2,
16,36,2,
36,64,2,
}, menseki, goukei = 0.0;
for(i=0; i<sizeof(daikei)/sizeof(daikei[0]); i++) {
menseki = (daikei[i][0] + daikei[i][1]) * daikei[i][2] / 2.0f;
goukei += menseki;
printf("a=%.0f b=%.0f h=%.0f 面積=%.0f\n",
daikei[i][0], daikei[i][1], daikei[i][2], menseki);
}
printf("合計面積=%.0f", goukei);
return 0;
}
14 :
5 :2009/05/21(木) 01:56:09
15 :
デフォルトの名無しさん :2009/05/21(木) 01:59:13
16 :
デフォルトの名無しさん :2009/05/21(木) 08:31:11
そのソース、どこかのコピペやなw
18 :
4 :2009/05/21(木) 09:56:52
期限過ぎてしまいましたが、どなたかお願いできないでしょうか?(o*。_。)oペコッ
[1] 授業単元:プログラミング演習 [2] 問題文(含コード&リンク): 整数を入力していき、「0」が入力されたらその1 つ前までに入力された数値の 平均値を求めるプログラムを、while 文を用いて作成せよ。 ここでは最低1 つの0 以外の数値が入力されるとしてよい。 平均値は小数点以下2 桁まで表示すること。 [3.1] OS: Windows XP [3.2] コンパイラ名とバージョン: Visual Studio 2005 [3.3] 言語: C++ [4] 期限:2009/5/21 [5] その他の制限:
1] 授業単元:情報処理 [2] 問題文(含コード&リンク): 正の整数nを入力し、1 から100 までの間にあるnの倍数をすべて表示す ると共に、それらnの倍数の和を表示するプログラムを作成せよ。 例えば25を入力したら,その倍数である25, 50, 75, 100とそれらの和で ある250が表示されることになる。 [3] 環境 [3.1] OS:WindowsXP [3.2] コンパイラ名とバージョン gcc [3.3] 言語:C [4] 期限: 2009年5月22日0:00まで [5] その他の制限:以前にも書き込んだのですが、私の書き込みにミスがありましたのでもう一度書きます。よろしくお願いします。
21 :
デフォルトの名無しさん :2009/05/21(木) 11:23:13
>>19 #include <iostream>
#include <iomanip>
int main(void)
{
int i, n, sum;
n = sum = 0;
while(1)
{
std::cin >> i;
if (i == 0)
break;
sum += i;
n++;
}
std::cout << std::fixed << std::setprecision(2) <<
(double)sum / n << std::endl;
return 0;
}
22 :
デフォルトの名無しさん :2009/05/21(木) 11:26:13
>>20 #include <stdio.h>
int main(void)
{
int n, i, sum;
printf("正の整数nを入力せよ: ");
scanf("%d", &n);
sum = 0;
for(i = 1; i <= 100; i++)
{
if (i % n == 0)
{
printf("%d\n", i);
sum += i;
}
}
printf("%d\n", sum);
return 0;
}
[1] 授業単元: 社会情報入門 [2] 問題文(含コード&リンク): 次の無限等比級数の和を、各項を順に加算していくことにより求めるプログラムを書け。 1+(1/3)+(1/9)+(1/27)+..... ただし、0.00001以下となる項を加えた時点で加算を終了することとする。 [3] 環境 [3.1] OS:WindowsXP [3.2] gcc [3.3] 言語: C [4] 期限: 2009年5月22日12:50まで [5] その他の制限:なし よろしくお願いします。
>>16 相当直さないと動かないぞ。
createData()見ただけでも、メモリ確保とかポインタの使い方が変。
25 :
19 :2009/05/21(木) 12:08:08
>>21 #include <iostream>
#include <iomanip>
std::cout << std::fixed << std::setprecision(2) <<
など習ってないことが多いのでもう少し簡単にできないでしょうか?
#include <stdio.h>で書いてもらえるとありがたいです
追記で
実行例
整数を入力: 9
整数を入力: 3
整数を入力: 8
整数を入力: 10
整数を入力: 7
整数を入力: 3
整数を入力: 0
平均値は 6.67
>>25 #include <stdio.h>
int main()
{
int d, count = 0, sum = 0;
while (1) {
printf("整数を入力:"); scanf("%d",&d);
if (d == 0) break;
sum += d; count++;
}
printf("平均値は%.2lf\n",(double)sum/count);
return 0;
}
>[3.3] 言語: C++
って書いたら、当然C++で回答が書かれます
回答者に無駄な作業をさせないように依頼して下さい。
>>24 メモリ確保の仕方だけで構いませんので、教えていただけないでしょうか?
30 :
デフォルトの名無しさん :2009/05/21(木) 13:12:50
[1]C++言語初心者コース [2]問題文: C++コードではiostream、iomanipを必ず使わなければならないことを 示す例を作れ。無い場合はその旨50字以内に日本語仮名交じり文で 記述せよ [3]OS:Windows/コンパイラ:GCC on CygWin/言語C++ [4]本日中 困ってます。よろしくです。
>>29 確保の仕方だけ教えたところで
ポインタ理解してなきゃ結局全部聞く羽目になるぞ
つか今ソース見たが、確保というより格納の仕方と言ったほうが正しいのかもしれん
>>30 アバウトすぎ
前後に問題あればそれも出した方が
問題の意図がわかるかもしれんが
>>29 Create *Data;
Data = (Create *)malloc(sizeof(Create));
for(i=0;;i++){
Data[i].id = ID;
ID++;
glob_DB[i] = Data[i];
free(Data);
}
これが変だという事が理解できないと、どこから説明したらいいのかなと思う。
動的に確保するのではなく、固定で大きな配列を用意し、
動くプログラムを書く位の力はあるかい?
>>32 mallocをループの中に入れた後、stdlib.hをインクルードしたところ警告は消えたのですが、
やはりそんなレベルの問題ではないのでしょうか?
>>28 ありがとうございます。
以後気をつけます
>>33 実行してみ?
PCが壊れる、ってことはないとは思うが自己責任でw
押し売りせずに信頼を得て、油外収益は地域トップクラスです。 油外おいしいです^^
>>33 >mallocをループの中に入れた後、stdlib.hをインクルードしたところ警告は消えたのですが、
警告が出ているうちは、間違いを指摘してくれているので良いが、
警告が消えたからって、正しく動く訳じゃない。正しいロジックで書いてないと動きません。
createData()を例にとれば、
Data[i].id = ID;←これはまずい。確保した領域は一つしかない。ワープします。
glob_DB[i] = Data[i];←これもまずい(左右とも)
free(Data); ←せっかく格納したデータは何処へ行くだろうか?
「添え字を使ってアクセス」が何を意味し、何処を指すのかを理解する必要があるよ。
入力したデータは何処に格納するのか。関数内の一時的格納か、それとも処理終了まで保持するのか。
格納領域はどのタイミングで確保するのか。確保した格納データはどうやって管理するのか。
確保した領域は、どのタイミングで解放するのか。この辺をちゃんと考えてみる必要がある。
動的に領域確保するのが難しいなら、glob_DBで1000件程度配列で確保し、
正常に動くプログラムをまず作ってみると良い。
CRUD操作の意味がわからん^^
39 :
デフォルトの名無しさん :2009/05/21(木) 16:18:31
>>39 #include<stdio.h>
#include<math.h>
int main(void)
{
double si_1, si, x;
printf("実数 x : ");
scanf("%lf", &x);
si_1=1;
do
{
si=si_1;
si_1=(si+x/si)/2;
}
while(fabs(si_1-si)>=0.00001);
printf("sqrt(%f)=%f\n", x, si);
return 0;
}
>23 #include <stdio.h> int main() { double sum = 0.0; double e = 0.00001; int x = 1; double a; while (1) { a = 1.0 / x; sum += a; if (a < e) break; x *= 3; } printf("%.15lf\n", sum); return 0; }
>>38 Create Read Update Delete
よろしくお願いします。 授業単元アルゴリズム実習 osソラリス 言語 c コンパイラ gcc 高さhが2で上底aと下底bが次のような値の台形4つの合計を求めるプログラムをfor文を使って作成せよ。 表示形式 台形(1)a=0、b=2^2、h=2、面積= 台形(2)a=2^2、b=4^2、h=2 面積= 台形(3)a=4^2、b=6^2、h=2 ,面積= 台形(4)a=6^2、b=8^2 h=2 面積= 4つの台形の面積の合計=
>>43 #include <stdio.h>
int main(void)
{
int i, temp, s = 0;
for(i=0; i<4; i++) {
temp = 4 * i * i + 4 * (i+1) * (i+1);
printf("台形(%d)a=%d%s,b=%d^2,h=2,面積=%d\n", i+1, i*2, i?"^2":"", 2*(i+1), temp);
s += temp;
}
printf("4つの台形の面積の合計=%d", s);
return 0;
}
47 :
デフォルトの名無しさん :2009/05/21(木) 20:29:37
>>45 わかってます。今度のは二乗の計算をしなくてはいけないので。。。
表示が違うだけで計算内容は同じだけどな。
マルチになってしまいますが、後になってこちらのスレの存在に気付いたので 再び質問させていただきます。 以下のコードの流れについて知りたのですがよく分かりません。 行ごとに簡単に解説してくれると助かります。よろしくお願いします。 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { Animations:nil context:nil]; [UIView setAnimationDuration:0.7]; [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:selfcache:YES]; if ( enabled ) [[UIApplication sharedApplication] sendAction:@selector(buttonPushed:) to:target from:self forEvent:event]; [UIView commitAnimations];
50 :
デフォルトの名無しさん :2009/05/21(木) 20:53:59
>>51 確かにそうなのですが、マイナーなので他に聞く場所がありません。
ここなら分かる方もいるのではないかと思い質問させていただきました。
せめて適当なうpローダーにきちんとインデントを付けたコードをうp してくれればObjective-C/C++でもある程度は答えてくれる奴が 居そうな感じだが読みにくいコードベタ張りは論外。基本的には 専用スレがありそこが過疎ってなければそちらのほうで聞くのが無難
BCDライブラリ書かないと誤差がすごくて・・・
59 :
デフォルトの名無しさん :2009/05/21(木) 22:13:31
[1] 授業単元:情報処理 [2] 問題文(含コード&リンク): (1)キーボードから2整数を読み込んで読み込んだ順に標準出力にそれらの 値の10進数表現をスペース文字で区切って、1行に書き出し改行する。 読み込んだ1番目の整数の値が1000でなければ、次の2整数を読み込み 同様に書き出す。1番目の値が1000のときプログラムの実行を終了する。 このような仕様を満たすプログラムを作成せよ。(do-whileループで作成) (2)キーボードから3整数を読み込み、小さい順に出力するようなプログラム を作成せよ。(目的が達成されればどのようなプログラムでも構わない。) [3] 環境 [3.1] OS:XP [3.2] コンパイラ名とバージョン:gcc [3.3] 言語:C [4] 期限:5月22日 13:00まで [5] (2)はなるべく簡単なものでお願いいたします。できたら数パターン 教えてくだされば幸いです。
60 :
デフォルトの名無しさん :2009/05/21(木) 22:23:49
>>59 (2)
#include <stdio.h>
int main(void)
{
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
if(a < b) {
if(c < a) printf("%d %d %d", c, a, b);
else {
if(b < c) printf("%d %d %d", a, b, c);
else printf("%d %d %d", a, c, b);
}}
else {
if(c < b) printf("%d %d %d", c, b, a);
else {
if(c < a) printf("%d %d %d", b, c, a);
else printf("%d %d %d", b, a, c);
}}
return 0;
}
62 :
この板でいいの? :2009/05/21(木) 22:39:58
プログラミングは全くの初心者(CもJavaもなにも分からない)です。 質問があります。 ある資格試験の自動学習ソフト(将来的には自動学習ホームページ)を 作りたいと思っています。 そのための資料は既にあります。 A4で300頁程度で表、図もあります。 これを、 (1)順々に質問文をユーザに見せてから、回答ボタンをクリックすると答画面を示すモード (2)樹系図的に内容を表示するモード (3)画面の印刷を行うモード を有して学習するソフトを作りたいのですが、どうしたらよいでしょうか? とりあえず、試行的にテキストを貼り付けるだけで、質問画面と回答画面を表示できるソフトを 簡単に作れるようなものはないでしょうか? ソフトを作れる人に作成を依頼するとどのくらい費用はかかるでしょうか? よろしくお願いします。
63 :
◆1xScF1fQr2 :2009/05/21(木) 22:51:13
>>62 HTML+JavaScriptが一番簡単そう。
そしてもしそうするならスレ違い。
65 :
123to :2009/05/21(木) 23:10:53
はじめたばかりです [1] 授業単元: C言語 [2] 問題文(含コード&リンク): 課題 0〜100の範囲で画面から入力された複数の数値の中で、最大値と最小値を 表示するプログラムを作成する。 ○ソフトウェア構成要求 最大値と最小値はmain関数以外の一つの関数の中で求める(サブルーチン化する)。 ○動作要求仕様 -1が入力された場合は入力の終わりとする。 入力された数値を記憶する配列の要素数は10とし、 10個まで入力された場合は-1を入力されなくても最大値と最小値を出力する。 [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン:Borland C++ Compiler 5.5 [3.3] 言語: C [4] 期限: 2009年5月25日12:00まで [5] その他の制限:できるだけ簡単なもの
>>63 もしかして、その課題の後に自由課題ある?
>>62 有料なら考えてもいいが?
問題はどうやって連絡を取るかなんだが。
>>63 >>63 #include <stdio.h>
#include <math.h>
#define PI 3.14159
double power(double x, long int n);
double sine(double x);
long int kaijou(long int n);
int main(void){
double sinx,sinf,x=0.0,dif;
printf("+-------------------------------------+\n");
printf("| x | sine(x) | sin(x) | dif |\n");
printf("+-------------------------------------+\n");
do{
sinx=sine(x);
sinf=sin(x);
dif=sinx-sinf;
printf("| %.4lf | % .4lf | % .4lf | %.4lf |\n",x,sinx,sin(x),dif);
x+=PI/8;
}while(x<2*PI);
printf("+-------------------------------------+\n");
}
long int kaijyou(long int n){ //再帰処理 if(n==0){ return 1.0; } else{ return n*kaijyou(n-1); //再帰処理実行 } } double sine(double x){ long int i, n=5; double ans=0.0; for(i=0;i<n;++i){ ans+=power(-1,i)*power(x,2*i+1)/kaijyou(2*i+1); } return ans; }
dif=sinx-sinf; printf("| %.4lf | % .4lf | % .4lf | %.4lf |\n",x,sinx,sin(x),dif); x+=PI/8; }while(x<2*PI); printf("+-------------------------------------+\n"); } long int kaijyou(long int n){ //再帰処理 if(n==0){ return 1.0; } else{ return n*kaijyou(n-1); //再帰処理実行 } }
double sine(double x){ long int i, n=5; double ans=0.0; for(i=0;i<n;++i){ ans+=power(-1,i)*power(x,2*i+1)/kaijyou(2*i+1); } return ans; } double power(double x, long int n){ //再帰処理 if(n==0){ return 1.0; } else{ return power(x,n-1)*x; //再帰処理実行 } }
度数表示がないからやり直し
ごめん、微妙に作ったのと違った。
>>63 #include <stdio.h>
#include <math.h>
int fac(int i) { return i == 1 ? 1 : i * fac(i-1); }
double mypow(double x, int n) { return n == 0 ? 1 : x * mypow(x, n-1); }
double sine(double x)
{
int i, flg = 1;
double ret = 0;
for(i=0; i<5; i++, flg *= -1) ret += mypow(x, i*2+1) / fac(i*2+1) * flg;
return ret;
}
int main(void)
{
int i;
puts("+----------+----------+----------+----------+----------+");
puts("|x(degree) |x(radian) | sine(x) | sin(x) | dif |");
puts("+----------+----------+----------+----------+----------+");
for(i=0; i<=360; i+=15) {
double r = i * M_PI / 180;
double s1 = sine(r), s2 = sin(r);
printf("|%-10d|%8.4f |%8.4f |%8.4f |%8.4f |\n", i, r, s1, s2, fabs(s1-s2));
}
puts("+----------+----------+----------+----------+----------+");
return 0;
}
>>43 // gcc --input-charset=cp932 --exec-charset=cp932
#include <stdio.h>
int main() {
int i;
float daikei[][3] = {
0,2,2,
2,4,2,
4,6,2,
6,8,2,
}, menseki, goukei = 0.0;
for(i=0; i<sizeof(daikei)/sizeof(daikei[0]); i++) {
menseki = (daikei[i][0]*daikei[i][0] + daikei[i][1]*daikei[i][1]) * daikei[i][2] / 2.0f;
goukei += menseki;
printf("(%d)a=%.0f^2 b=%.0f^2 h=%.0f 面積=%.0f\n",
i, daikei[i][0], daikei[i][1], daikei[i][2], menseki);
}
printf("合計面積=%.0f", goukei);
return 0;
}
76 :
デフォルトの名無しさん :2009/05/21(木) 23:40:32
>>63 へ
>>68-
>>71 は19年度の同じような課題で教授が殆ど作ったやつ。
>>77 ほんとだC言語応用 マクローリン展開でみつかった。
意外と簡単に見付かるんだね。
80 :
79 :2009/05/21(木) 23:58:13
でも年代が違う問題が出てくるんやね。
スレチだが マクローリン展開って2radぐらいまでならそんなに誤差無いんだな 意外だった
膜ろりン展開
>>79 「sinxの近似値を5項程度によるマクローリン展開で求める関数」でぐぐったら
2つめに今年のが出てきた
>>81 浮動小数点は積み残し誤差があるから計算して出たそれぞれの
項をソートして小さい方から順に足した方が誤差が少ないぞ
やってみ
そんな手間かけるならsin(x)使うわ 欲しいのは高速動作だ
いやそりゃそうだが x86FPUにもFSINあるしな ここは宿題スレだからマクローリン展開をコンピューターに やらせてみましょうって事なんじゃない?
>>62 お手軽にするならゲームツクール系でいいと思う
>>87 メイン関数のループが迂遠な感じだな、77のは。
>>65 >できるだけ簡単なもの <それなりに>
#include <stdio.h>
void max_min(int *data, int num, int *max, int *min){
int lmax = 0, lmin = 100;
for(num--; num >= 0; num--) {
if(data[num] > lmax) lmax = data[num];
if(data[num] < lmin) lmin = data[num];
}
*max = lmax;
*min = lmin;
}
int main() {
int i, max, min, data[10];
for(i=0; i<10; i++) {
printf("%d:",i+1);
if(scanf("%d", &data[i]) != 1) {
scanf("%*s"); i--; continue;
}
if(data[i] == -1) break;
if(data[i] < 0 || data[i] > 100) i--;
}
max_min(data, i, &max, &min);
printf("max=%d min=%d\n", max, min);
return 0;
}
91 :
kenco :2009/05/22(金) 03:06:33
[1] 授業単元:数値計算法 [2] 問題文(含コード&リンク):非線型方程式 f(x)=x^n-a=0 を考える。nは学生番号の下一桁の数字に2を加えたもの。aは誕生日の西暦の下2桁とする。 f(x)=0の実数解の近似値xを以下の条件を満足させる精度でニュートン法を用いて求めよ。 |f(x)-0|<1.0*10^(-8) [3] 環境 [3.1] OS: Windows vista [3.2] コンパイラ名とバージョン: C-Compiler [3.3] 言語: どちらでも可 [4] 期限: 23日まで [5] その他の制限: なるべく簡単なもので作ってください。
93 :
デフォルトの名無しさん :2009/05/22(金) 04:21:56
[1] 授業単元:プログラミング [2] 問題文(含コード&リンク): 行列A={{0,1,2},{3,4,5},{6,7,8}} 行列B={{100,200,300},{400,500,600},{700,800,900}} のとき、A+Bを表示するプログラムを作れ [3] 環境 [3.1] OS:WindowsXP [3.2] コンパイラ名とバージョン:visual studio [3.3] 言語:C++ [4] 期限: 5月25日 [5] その他の制限: 初心者に分かりやすいようにお願いします
>>91 #define N (8.0 + 2.0)
#define A 82.0
#define EPS 1e-08
#define LIMIT 50 /* 計算打ち切り回数 */
#include <stdio.h>
#include <math.h>
double f(double x)
{
return pow(x, N) - A;
}
double g(double x)
{
return N * pow(x, N - 1.0);
}
int main(void)
{
double x = 1.0, dx;
int i;
for (i = 0; i < LIMIT; i++) {
dx = x;
x -= f(x) / g(x);
if (fabs(x - dx) < fabs(dx) * EPS) {
printf("解 = %.8f\n", x);
break;
}
}
if (i == LIMIT)
printf("収束しませんでした\n");
return 0;
}
96 :
44 :2009/05/22(金) 10:16:33
97 :
デフォルトの名無しさん :2009/05/22(金) 14:46:03
[1] 授業単元:C言語プログラミング [2] 問題文:10以上の種類の品物(果物など)を、その数が多い順にソートするプログラムを 「バブルソート」を用いて作成せよ。 ソート結果の表示にはどの品物が何個かも表示させること。 品物の種類・個数は任意とするが、なるべくばらけさせること。 品物が同じ個数だった場合の順番は特に指定しない。 [3] 環境 [3.1] Linux [3.2] gcc [3.3] 言語:C [4] 期限:2009/5/25まで [5] その他の制限:特に無し
98 :
デフォルトの名無しさん :2009/05/22(金) 16:04:42
>>97 #include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define numberof(s) (sizeof(s) / sizeof(s[0]))
typedef struct { char *name; int number;} ITEM;
ITEM item[] = {
{"めんたい味", 0},{"コーンポタージュ味", 0},{"なっとう味", 0},{"チーズ味", 0},{"テリヤキバーガー味", 0},
{"サラミ味", 0},{"やさいサラダ味", 0},{"チキンカレー味", 0},{"とんかつソース味", 0},{"エビマヨネーズ味", 0},
{"たこ焼味", 0},{"チョコレート味", 0},{"キャラメル味", 0},{"ココア味", 0},{"ぶたキムチ味", 0},{"牛タン塩味", 0}
};
int main()
{
int i, j;
srand(time(NULL));
for (i = 0; i < numberof(item); i++) {
item[i].number = (int)((rand() / ((double)RAND_MAX+1.0f)) * 99) + 1; printf("%s, %d\n",item[i].name,item[i].number);}
printf("---------------------------------------------------\n");
for (i = 0; i < numberof(item) - 1; i++) {
for (j = numberof(item) - 1; j > i; j--) {
if (item[j].number > item[j - 1].number) {ITEM tmp = item[j]; item[j] = item[j - 1]; item[j - 1] = tmp;}
}
}
for (i = 0; i < numberof(item); i++) printf("%s, %d\n",item[i].name,item[i].number);
return 0;
}
10種類以上の果物名、思い付かん
アルプス乙女,ぐんま名月,ゴールデンデリシャス,シナノスイート,ジョナゴールド, ジョナゴールド,つがる,デリシャス,ふじ,旭,王林,紅玉,国光,秋映,祝, 世界一,千秋,北斗,陽光,陸奥 20種類、ごく一部を除いて、どんなリンゴかはわからないw
ジョナゴールドが2個あるんすけど。
>ジョナゴールドが2個あるんすけど。 見逃した。済まない。 ー1 +7 さんさ,高嶺,スターキングデリシャス,ハックナイン,新世界,藤牧,シナノレッド
クイックソートなんですが
>>98 はバブルソートじゃないか
何を寝ぼけた事を言ってんの?
[1] 授業単元:
ヒューマンインターフェースとプログラミング
[2] 問題文(含コード&リンク):
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9224.txt [3] 環境
[3.1] OS: (Windows/Linux/等々)
Windows
[3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等)
Visual C++ 2008 Express Edition
[3.3] 言語: (C/C++/どちらでも可 のいずれか)
C++
[4] 期限: ([yyyy年mm月dd日hh:mmまで] または [無期限] のいずれか)
5/25
[5] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々)
なし
よろしくおねがいします。具体的にあげられてる修正ポイントだけでもかまいません。
猫でもわかるキー入力www
>>110 気づいた一点だけ。
そこまでコンソールのgetsにこだわる必要は無いと思う。
たとえばトリガーキーを押すとモードメニューに入って、モードを選んで、開始。
そんな感じにならないかねぇ。
MYGETSがちょっと不細工に感じるのはまちがってるかなぁ。。。
あとプロポーショナルフォントを使うのは筋違いだと思う。
こんなとこかな。
MyGetsに入る前にその前の入力メッセージは棄てなあかんね。 WM_DESTROYでfpのnullチェックしてないので、モードに入る前に終了すると例外。 WM_QUITを受け取ったGetMessageは0を返すので、MyGetsはTRUEを返し、再びメッセージ待機(Windowがないので終われない)。 基本的に待機するような処理は別スレッドに作るべき。 また待機スレッドのSleepは本物のSleepではなくEventをWaitし、終了要求などではそのEventをシグナル状態にする。 じゃないとSleepが完了するまで終われなくなる。
114 :
113 :2009/05/23(土) 00:08:34
>MyGetsに入る前にその前の入力メッセージは棄てなあかんね。 ちょっと書き方おかしかったかも。要は反応待ちに入る以前のキー押下は棄てないかんってこと。
[1] 授業単元: [2] 問題文 今テキストファイルAが1つとBが10個あるとする。 Aには haru natsu aki fuyu とかかれ Bにはそれぞれのテキストに以下のような文字列がかかれている wheiowfjhoiejwio2121oij3io12ji2oj3io2j3oijo iouaiojoiajwioejio121j3oi1j2iojlajia これらをまとめ テキストCに aki[tab]wheiowfjhoiejwio2121oij3io12ji2oj3io2j3oijo[改行] natsu[tab]iouaiojoiajwioejio121j3oi1j2iojlajia[改行] になるようなプログラムをかけ ただし。Bのそれぞれのテキストは非常に長くても大丈夫にせよ。 [3] 環境 [3.1] OS:linux [3.2] gcc [3.3 C [4] 期限: 5/23
>>115 問題文が意味不明
まとめ方のルールを明確にしないと誰も解けないよ
テキストCに haru\tBのテキスト1つ目の中身\n natsu\tBのテキスト2つ目の中身\n aki\tBのテキスト3つ目の中身\n のように書き込んでほしいのですが。 Bのテキストが非常に長いんです。1テキストファイル20kバイトくらいでして
>>117 Bのテキストファイルが10個ある、と言うことなら、B01〜B10ってしていいかい?
Aのテキスト1行目と、B01の全体をタブで繋いで1行にし、Cに出力。
Aのテキスト2行目と、B02の全体をタブで繋いで1行にし、Cに追記。
これをB10まで繰り返す。これであってる?
要はBの1行がバッファサイズをオーバーするくらい長いってことじゃん?
テキストのサイズはそれほど重要ではないよ。 要は、何をして欲しいかを明確にする事。
>>115 後、期限が今日なら、締切時間も書いておいた方が良いかな。
>>117 だ〜か〜ら〜、〜のようにっていう表現は問題文にならないって。
テキストAとやらには4行しかないのにテキストBとやらは延べ10行あるんだろ?
5行目以降はどう纏めるんだい?
>>110 精度を上げるには「timeBeginPeriod〜timeEndPeriod」や「QueryPerformanceCounter」を使う手がある。
ビジーループにしてGetAsyncKeyStateでキー状態を検知すればメッセージ処理のオーバーヘッドは避けられると思う。
スレッドの優先度を上げるという方法もあるといえばある。
>>118 そうです。
Bのテキストは長いんですけど1行です。
一番最後に改行がはいるだけです。
>>124 ファイル名は適当に決めておいていいかい?
>>122 の指摘する危惧だけど、Aには10行データがある前提でいいかい?
Aには4行としまして Bは1行に10行分くらい文字列がならんでるとおもってください。 で、Bは4ファイルあるとすればちょうどいいかと。
>>126 なんというか、まあ、久しぶりに絶句させてもらったよ。
課題が出されたんだよな?
それを一字一句変えずに、「全部」書けよ。
お前の頭の中ではちょうどいいかも知れんが、
お前が今までのやり取りではっきりさせたのは
ファイルAとやらが4行あるってことだけだぞ?
なんか杜撰な課題だな。ちゃんと投げられないだけか?
Bのテキストファイルが普通にコピーできないほどの長さだから 説明しにくい。
Bの長さはどうとにでもなってさっきから言ってるんだからから、 そこを無視して説明しろよ氏ね。
20KBで?
>>129 は?お前の説明は要らない。
課題をそのまま書き出せよ。
あとな、1行の長さなんてどうだって良いんだよ。
「一行の長さは不定です」
「あ、っそ」
で済むことなんだよ。
重要なのは、
「プログラムの実行前にどんなデータがあって」
「プログラムの実行後にどんなデータがあるか」
ってことなんだよ。
ファイルAには
>>115 にあるように4行分のデータがある。
これは分かった。
んでファイルBってのはなんだよ?
1行にコピーできないくらいの長さの文字列がある
ダメだこりゃ
何だ、Bは4つになったのかw
>>126 1行に10行分文字列があるって意味がわからんが。
2000文字位あると勝手に理解するけどいいね。
ソースをコンパイルして実行する環境はあるのか?
136 :
132 :2009/05/23(土) 02:19:24
>>134 俺は
>>133 は
>>115 でないって信じたいw
>>133 とりあえず、問題を明らかにしようか。
ファイルBは何個か存在する。
だからここでは後ろに番号をつけるとする。
例えば、ファイルBが3つある場合、
ファイルBのそれぞれをB1,B2,B3としよう。
そして、ファイルBの行番号をアンダースコアの後に数字をつけることで表そう。
例えばB1の1行目はB1_1、2行目はB1_2となる。
ついでにファイルAの一行目はA_1と表すようにしよう。
んで、ここからが本題。
ファイルCを作るにあたって、
A_1と同じ行になるファイルBの行は何か?選択肢から選べ
選択肢1:
A_1 B1_1
A_1 B2_1
A_1 B3_1
・・・
A_1 Bi_1
選択肢2:
A_1 B1_1
A_1 B1_2
A_1 B1_3
・・・
A_1 B1_j
選択肢3:上二つは違います。
ツンデレだねぇ。なんか後出しがあると思うけど
>>115 今の内に課題の条件をキチンと説明しておかないと
誰かが早とちりしてプログラムを書いてしまって後出しで
条件を付けても誰も相手にしてくれないかもしれんぞ
今までそういう事が何回もあった
後出し条件というのは相当嫌われる
短いファイルでこれくらいです これが60kバイトくらいです 最大で778kバイトくらいまで
>>140 だ〜か〜ら、長さはどうだっていい。
ファイルBは全部でいくつある?
ファイルB全ては1行しかないんだな?
そうです。
2行目にも答えろよwwwwwwww
っていうか、正確に言うとAの行数とBのファイル数は一致してるのか? 一致してるなら可変か固定か? 固定なら何個だ?
これって釣りだよね? と、思いたい。割と本気で。
もういいわ
>>139 Bが10個あると書いてあるのになんで一つだけなんだ?
10個ともまとめて貼れよ
Aはわかったらか
エスパーするとAの行数4つでBのファイル数が4つ。
Bは全て1行(改行一つ)だが、
>>115 主観で言うと通常の1行の10倍あるよ。
まぁ、エスパーするだけして違ってたらイヤだから手はつけんが。
すいません。Bを最後読み込み表示してAの単語をいれてを4回まわしたらいいだけでしたね
>>115 1つだけ聞かせてくれ。
これは、学校の講義で宿題として出されたものなのか?
自分がこういうことをやりたいだけなのか?
Aの単語表示\tBのファイルの全ての文字を読み込んで表示 を4回繰り返してテキストにとる
つまりBは10個あると書いてあるけど一個しかないんだね
>>145 もうあれだ、system関数でシェルスクリプト呼んじゃえ。
cat B0[1-4] | paste A - > C
でお望みのものができるから。
157 :
デフォルトの名無しさん :2009/05/23(土) 04:03:23
158 :
デフォルトの名無しさん :2009/05/23(土) 04:06:05
>>95 ありがとうございました
この問題もわからないので教えてください
[1] 授業単元:プログラミング
[2] 問題文(含コード&リンク):
(1)[0,1]の一様乱数x,yを発生させるプログラムを作れ
(2)[0,1]の一様乱数x,yを発生させ、x^2+y^2<1となる確立を求めろ
(一様乱数を発生させる試行を繰り返し、(上式を満たす回数)/(試行回数)から確立を求める)
またπの数値を求めろ
[3] 環境
[3.1] OS:WindowsXP
[3.2] コンパイラ名とバージョン:visual studio
[3.3] 言語:C++
[4] 期限: 5月25日
宜しくお願いします
>>059 (1) 提出期限過ぎてるけど、2整数か?の突っ込みは無しで。
#include <stdio.h>
int main() {
int n, c;
printf("2進数を1つ以上入力してください:最後は1000\n");
do {
for(n = 0; ;) {
c = getchar();
if (c == '0' || c == '1') {
n <<= 1;
n |= (c == '1') ? 1 : 0; /* 1/0 を入力 */
} else if (c == EOF)
return 1;
else
break;
}
printf("%d ", n);
if(c == '\n') puts("");
} while(n != 0x8); /* 1000 (binary) */
return 0;
}
問題を誤読してる気がする。
[1] 授業単元: 情報リテラシー [2] 問題文: 10から110までの乱数を100個作り、 同時ににアスキーコードで文字に変換して小文字だけを大文字にせよ [3] 環境 [3.1] OS:Windows XP [3.2] コンパイラ名とバージョン: 富士通 [3.3] 言語:C言語 [4] 期限:[2009年05月26日h:16:30まで] [5] その他の制限: アスキーコードやら何やら今一良く分かりません。 よろしくお願いします。
>>162 珍しいコンパイラwww
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
int main(void)
{
int i, x;
int max=110, min=10;
for(i=0;i<100;i++)
{
x=rand()%(max-min+1)+min;
if(islower(x)) x=toupper(x);
printf("%c", x);
}
return 0;
}
京大?
Faithless C compiler とか
>>163 種蒔かんで良いのか?
166 :
110 :2009/05/23(土) 13:05:38
>>112 >>113 >>123 アドバイスありがとうございます。
課題中で具体的に示されてある修正点だけでいいので、どなたかプログラムを修正してもらえないでしょうか?
提出期限は明後日なのですが、実際にプログラムを動かして色々と考察を書かないといけないので・・
よろしくお願いしますm( _ _)m
後だしでなく必ず勝つ。 x=rand()/(RAND_MAX+1.0)*(max-min+1)+min;
>>151 // Usage: my_paste a1 b1 b2 b3 b4 ... > c1
// a: 行数はb(max)行 bの数と一致しない場合は途中まで処理する。
// b: 行数は1行のみ。改行で終わる。サイズは大きくても良い。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[]) {
FILE *inA, *inB, *outC = stdout;
char bufA[80]; // ファイルA読込用(1行を読込めるサイズが必要)
char bufB[256]; // ファイルB読込用(複数回に分けて読み込むので適当で良い)
int i, readsize;
if(argc < 3) return -1;
inA = fopen(argv[1], "r");
if (inA == NULL) { fprintf(stderr, "Can't open %s\n", argv[1]); exit(1); }
for (i = 0; i < argc-2; i++) {
inB = fopen(argv[i+2], "r");
if (inB == NULL) { fprintf(stderr, "Can't open %s\n", argv[i+2]); break; }
// Aを1行読込み、改行を取り除き、末尾にTabをつけてCに出力
if(fgets(bufA, sizeof(bufA), inA) == NULL) { fclose(inB); break; }
bufA[strlen(bufA) - 1] = 0;
fprintf(outC, "%s\t", bufA);
// Bをバッファサイズ単位で読込み、Cに追記する(必要な回数繰返す)
while ((readsize = fread(bufB, 1, sizeof(bufB), inB)) > 0) {
fwrite(bufB, 1, readsize, outC);
}
fclose(inB);
}
fclose(inA);
return 0;
}
[2] 問題文(含コード&リンク):
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9228.c [3] 環境
[3.1] OS: (Windows/Linux/等々) linux
[3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等) gcc
[3.3] 言語: (C/C++/どちらでも可 のいずれか) C
[5] その他の制限
問題文のプログラムはls -aslを実行するプログラムである。これを参考にオプション -a -F -l -dを引数とした場合に
lsコマンドと同じ動作をするようなプログラムmylsを作れ。
・statシステムコールではなくlstatシステムコールを用いる
・オプションは-aといった引数に続けて指定、-aFl、-laといった複数オプションにも順不同に対応
・myls - aといった場合にはUsageを表示する
・UID、GIDは数字のままでいい
オプション指定にgetopt関数を使って
while((option = getopt(argc, argv, "aFld")) != -1){
switch (option){
case...
って書こうとしてるんだけど、case 'a':を書こうとした時に下にあるvoid関数のどの部分で
ls -aと同じ動作をしているのかが分からない。どなたかお願いします。
171 :
162 :2009/05/23(土) 17:48:45
172 :
デフォルトの名無しさん :2009/05/23(土) 18:58:19
173 :
デフォルトの名無しさん :2009/05/23(土) 19:13:25
[1]授業単元:アルゴリズム [2]問題文(含コード&リンク) 問7-6 12x12のセルを持つ迷路がある。 スタートからゴールまでの最短経路を探したい。 (1)フローチャートを書け。 (2)実際に最短経路を調べ、表示するプログラムを書け。 ヒント 迷路は二次元配列で出来ている。 スタートやゴールのセル、壁のセルは最初は分からないようになっている。 手順としてはスタート地点の探索→経路の探索→バックトレースによる最短経路の探索、と行えばいい。 [3]:環境 [3.1]OS:XPsp2 [3.2]コンパイラ名とバージョン:gcc [3.3]言語:C [4]期限:5月26日8:00 [5]その他の制限:ソースコードにはしっかりコメントを記述すること、と言われました。 また迷路を生成するプログラムは無くても良いそうです。 C言語に関しては配列を学んだ所までです。(構造体やポインタはまだやってません。) 最悪フローチャートだけでも構いません。よろしくお願いします。
迷路探査は、ネット調べればソースごとあるぞ。
>>172 Part125_146
#include <stdio.h>
#include <float.h>
#include <math.h>
int main() {
double e1, e2;
unsigned int n;
e1 = 1.0;
printf("%.15e %.15e\n", DBL_MIN, DBL_EPSILON);
for(n=1; n<4294967295u; n++) {
e2 = e1 / 10.0;
if(1.0 == (1.0 + e2)) break;
e1 = e2;
}
printf("%.15e %d\n", e1, n-1);
}
176 :
173 :2009/05/23(土) 19:35:12
>>174 言葉足らずで申し訳ありません……
迷路探索のソースはいくつか探すことが出来たのですが、
更に最短経路を探すものが見つからなくて今回お願いしました……
>>176 普通の迷路なら経路はただ一つなんじゃない?
経路が複数あるって、巡回路の最適解を求めるような問題?
178 :
173 :2009/05/23(土) 19:57:20
>>177 上手く言えませんが壁の配置によっては経路が複数あります
袋小路とかも含めて総当たりで経路を調べる、のだとしたら巡回路の問題なのかもしれません
すみません、あまりよくわかってません……
>>173 再起関数で、深さをカウントしていって、144段(縦*横)以上になったら打ち切れば良いよ。
で手数をへらして検索。
>>173 最短経路が必要な場合は、2DRPGの最短移動アルゴリズムを使えばいいよ。
12x12の配列Aをワークとして用意する。型はintでいいや。
Aはすべて-1で初期化しておく。
まずスタート地点の決定。これは総当たりだから省略。
現在の探索深度を示すワーク int depth を用意して0に初期化する。
さて探索だけど、
1.スタート地点を現在値nowPositionに設定して、それに対応するAに0を代入する。
2.Aを全探索して、値がdepthになっているものがあれば、
その上下左右(斜めも移動できるなら斜めも)に移動可能かどうかを
調べる。移動可能で、かつその位置に対応するAが-1なら、その位置に
depth+1を書き込む。
移動可能な位置がゴールなら終了。4へ。
3.A全体を操作し終わるまで調べて、ひとつもdepthがなければ終了。ゴールには到達できない。
1つでもdepthがあれば、++depthして、2を繰り返す。
4.ここからが最短経路探索。
まずゴールには到達しているから、ゴールのdepthは分かってる。
そこから 上下左右のAの値が depth-1 になっている位置が最短経路。
複数ある場合の処理は好きなようにすればいいが、今回は単純に最初に
みつかった場所へ移動すればいいだろう。
5.これを繰り返してスタートに到達するまで続ける。なおスタートには必ず到達できる。
>>180 すまん
×1.スタート地点を現在値nowPositionに設定して、それに対応するAに0を代入する。
○1.スタート地点に対応するAに0を代入する。
ちなみに医学部の卒業研究見学したけど、怖かった。 犬を生きたまま仰向けで四肢を固定し、毛を剃って電気メスで腹を切る。 肋骨をノコギリで切って、心臓にいろいろな電気信号を与えて生体の反応を調べる。 もちろん全身麻酔はしてるけど、生体の反応を損ねないようにギリギリの量にしてるから、ピクピク動いてた。
>>179 >>173 >手順としてはスタート地点の探索→経路の探索→バックトレースによる最短経路の探索、と行えばいい。
を満たせなくね?
スタート地点も探索で見つけないといけない? 予め指定がないと、何処から始めたら良いものやら。
多分出題者が間違ってるんだろうが、バックトレースじゃなくてバックトラックだろうな。
186 :
デフォルトの名無しさん :2009/05/23(土) 21:35:20
流石にスタート地点は総当たりじゃないかなあ そうでなかったらうーん
>>187 「構造体やポインタはやってない」の制限にひっかかってるよw
189 :
185 :2009/05/23(土) 22:22:45
ごめん。オレが勘違いしてたようだ。
バックトレースって、ゴールから逆にたどるって意味だなきっと。
>>180 のやり方で良さそうだね。
190 :
187 :2009/05/23(土) 22:24:36
191 :
172 :2009/05/24(日) 00:24:38
192 :
175 :2009/05/24(日) 01:02:49
>>172 間違い。1.0!=1.0+εとなる最小のεではなかった。
#include <stdio.h>
#include <float.h>
#include <math.h>
int main() {
double e1, e2;
unsigned int n;
e1 = DBL_MIN;
printf("%.15e %.15e\n", DBL_MIN, DBL_EPSILON);
for(n=1; n<4294967295u; n++) {
e2 = e1 * 10;
if(1.0 != (1.0 + e2)) break;
e1 = e2;
}
printf("%.15e %d\n", e1, n-1);
}
193 :
172 :2009/05/24(日) 11:56:33
wwwwwww うけたwwwww
一行伝えるのに資源使いすぎw
宿題スレで分岐限定法の課題はあったでしょうか? あったのであれば、教えてもらいたいです。
>>196 ろだにあげておくとweb検索で引っかかりにくいし、
どういう問題を依頼したかスレのログに残らないから。
そんな事も分からないのに問題解けるのかよw
[1] 授業単元:プログラミング演習2
[2] 問題文(含コード&リンク):
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9233.txt [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まで] または [無期限] のいずれか)
5/26日午前9時
[5] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々)
ポインタ配列まで習ってます
PCで規制が掛かっていたので携帯からの書き込みで申し訳ありません
>>201 課題1
my_sort_strings()は、どうやって並べ替える文字列を取得すれば良いですか?
引数を何にするのかも問題のうちだろ、jk
>>203 並べ替えの対象となるポインタ配列はmainのローカル変数
my_sort_strings()は引数なし
>>204 なんでそうなるんだ?
> 課題1
> 文字配列のソートを行って出力する以下のプログラムを完成させよ
> ただし、my_sort_stringsはポインタ配列とそのよう素数を因数として、
> 登録されている文字配列を昇順に並べ替える関数である。
因数は引数の間違いで
関数プロトタイプはこうなるだろ
void my_sort_strings(char **p,int n);
アホか、問題文では省略されてる引数を補って書くんだよw
わかるとは思うが206は204あてな
プロトタイプまで書かれていても、それを書き換えても良いのかね? 私なら、まず確認のためにどうするか聞くが。
そんなことより課題2を読む限り 課題1は先頭の一文字だけでソートするべきなのか?
みたいだね。 2見る前に書いたらmin_index()がまんま2の仕様になってたw
C++始めたばかりのド素人なんですが質問させてください。 「数直線上で4つの整数を入力して二種類の区画を指定し、その区画が重なるか否かを 判定するプログラム」 【出力結果例 区画A:2 5 区画B:1 3 重なる 】 となるプログラムを作成してみたんですが、↓のでいいでしょうか? 正確な問題文や細かい所は都合により今は見れないので、不明瞭な点もあるかと思いますが、 よければ添削お願いします。あと、使うのはIf文のみでお願いします。
#include <iostream> using namespace std; int main() { int x1,x2,x3,x4; cout << "区画A:”; cin >> x1 >> x2; cout <<"区画B:”; cin >> x3 >> x4; If(x4<x1 && x3<x1 && x4<x2 && x3<x2){ cout<<"重ならない”<<endl; If(x2<x3 && x1<x3 && x2<x4 && x1<x4){ cout<<"重ならない”<<endl; } else{ cout<<"重なる”<<endl; } return 0; }
テンプレに沿っていないので正規の質問とはみなされていない故 オブジェクション。 これは断じてC言語やC++言語の問題ぢゃなく、論理(ロジック) の問題。
If文は使えないな
失礼しました。
授業単元:基本プログラミング
問題文:
>>211 OS:Windows
コンパイラ名:g++
言語:C++
期限:明日の午後6時まで
その他の制限:If文のみ使用
です!
ロジックも含めて、文法が合ってるかや無駄な部分がないかなどの意見も頂けたらと思い
質問させて頂きました、スレ違いでしたら申し訳ないありませんでしたorz
1の右端が2の左端より大きくて1の左端が2の右端より小さいとき重なる
>>216 の言うとおり、重なるときを考えた方がわかりやすい
あと、本当にx1<x2,x3<x4になってるか入力値のチェックも欲しい
218 :
211 :2009/05/24(日) 22:30:14
>>216 >>217 なるほど…
そっちのやり方も今試してみたんですが、x1x2x3x4の値はそれぞれ自由なので、
例えば出力結果
区画A:15 6
区画B:7 −8
重なる
にもなるようにしないといけないので、整数の入力値の場合分けがかなり面倒になって
プログラムが
>>211 より長くなってしまうかなと思ってるんんですがどうでしょう…
といっても、
>>211 のプログラムとロジックで矛盾や穴などが無いかも自分では自信が無いのですが…
なにぶん今はプログラムを実行できる環境にいないので机上の空論状態なんですorz
>>211 区間の両端の数値は区間の中なのか外なのかが決まってないと
区間A:1 4
区間B:4 6
のとき重なっていると見なすかどうかが決められない。
区間A:1 1
区間B:1 6
も同様。両端の値は区間の中なの?外なの?
>>218 x1,x2とx3,x4をそれぞれ小さい順に並べ替える
if ((x3 < x1 && x1 < x4 || x3 < x2 && x2 < x4) ||
(x1 < x3 && x3 < x2 || x1 < x4 && x4 < x2)) {
重なっている
}
>>218 先に大小みて入れ替えるほうが簡潔でわかりやすいと思うが
if(x1 > x2) { int temp = x1; x1 = x2; x2 = temp;}
if(x3 > x4) { int temp = x3; x3 = x4; x4 = temp;}
if(x1 < x4 && x2 > x3) cout << "重なる";
else cout << "重ならない";
>>219 あ、言葉足らずでごめんなさい、端が点と点で重なってる場合も重なってるとみなされます
>>221 おお、なるほど
それだとif文も一つで済んでいいですね!
参考になりました、ありがとうございます!
>>222 ごめんなさい、まだ授業でtempを習ってないもので…
でも後学のためになりました、ありがとうございます
すべての数が不一致であることを前提とする。4つの数で 最大の元が属する区画名をA,最小の元が属する区画名をBとする。 A=Bの時は重なる A<>Bの場合、区画Aで4数最大のものでないものをy 区画Bの元で4数最小でないものをzとする。 重なるのはy<zの場合のみ 上のことをコーディングすれば良いんぢゃ? (変数は常に値渡しされるとは限らないから関数内で 勝手に変更することはC++では許されない。念の為)
>>220 >>211 数値の型がわかんなかったのでテンプレで。数値の入力部分は好きにどうぞ。
#include <iostream>
template <class T> class Range {
public:
Range() {}
Range(const T& v0, const T& v1) { create(v0, v1); }
Range(const Range<T>& s) { *this = s; }
virtual ~Range() {}
const Range<T>& operator=(const Range<T>& s) { min_ = s.min_; max_ = s.max_; return *this; }
void create(const T& v0, const T& v1) { if(v0 < v1) { min_ = v0; max_ = v1; } else { min_ = v1; max_ = v0; } }
bool isIntersect(const Range<T>& s) const {
if(min_ <= s.min_) {
return max_ >= s.min_; // 接するのも交わりと見なす
//return max_ > s.min_; // 接するものは交わりとは見なさない
} else {
return s.isIntersect(*this);
}
}
private:
T min_;
T max_;
};
int main()
{
Range<int> r0(2,5);
Range<int> r1(1,3);
if(r0.isIntersect(r1)) {
cout << "重なる" << endl;
} else {
cout << "重ならない" << endl;
}
}
沢山のアドバイスありがとうございました! 色々と参考になりました お陰様でいっぱしの形になって提出できそうです これからも精進します(`・ω・´)
>>221 >>222 うっ、if文のみ使用って、判定にswitchとかを使うなという意味じゃないのか・・・
ごめん。
>>201 min_index() を使ってない my_strcmp() の使い方が分からなかったので strcmp() と同じだと仮定
課題1
void my_sort_strings(char **p,int n)
{
int i, j;
for(i=0;i<n;i++)
{
for(j=0;j+1<n-i;j++)
{
if(*p[j]>*p[j+1]) swap_strings(p, j, j+1);
}
}
}
課題2
void lexicograhic_sort(char **p,int n)
{
int i, j;
for(i=0;i<n;i++)
{
for(j=0;j+1<n-i;j++)
{
if(my_strcmp(p[j], p[j+1])>0) swap_strings(p, j, j+1);
}
}
}
自由課題:可憐な カレン ダーを作ってくれ
【質問テンプレ】 [1] テキストファイル [2]Write a program to parse words onto separate lines; that is, locate and write each word to its own line.(課題文は英文で与えられている) [3] 環境 [3.1] OSWindows [3.2]VisualC++ [3.3] 言語:C [4] 期限: (2009年5月26日9:30) [5] 制限はなし
>>232 合ってるかどうか分からんけど
#include<stdio.h>
int main(void){
char buf[100+1];
while(scanf("%100s", buf)==1){
puts(buf);
}
return 0;
}
>>232 に追加 テキストファイルを作成する必要がある。
1111 aaaa ddd dddd-dfgg ddddd 9999. 2222 dddd ggg, gggg 444-
444 sss ddddd ccc -
ddd rrrr345 333 444.
>>232 #include <stdio.h>
int main(){
int c, cr = 1, minus = 0;
while( (c = getchar()) != EOF ){
if(c == ' ' || c == '\t') {
if(minus == 1) ; /* minus_space_return */
else if(cr != 0) putchar('\n'); /* space_minus_return */
cr = 0;
} else if(c == '\n') {
if(minus == 1) ; /* minus_return */
else if(cr != 0) putchar('\n');
cr = 0;
minus = 0;
} else if(c == ',' || c == '.') {
if(minus == 1) putchar('-');
if(cr != 0) putchar('\n');
cr = 0;
minus = 0;
} else if(c == '-') {
minus = 1;
} else {
if(minus == 1) putchar('-'); /* minus_not return */
putchar(c);
cr = 1;
minus = 0;
}
}
}
236 :
デフォルトの名無しさん :2009/05/25(月) 13:12:58
237 :
194 :2009/05/25(月) 17:15:46
資源を使いすぎた者ですが、num_putファセットどなたか分かる方いませんか? ぐぐっても日本語の文献がほとんどヒットしません。英語のは見つかりますがどれも例がめちゃ難しいのしかないです 問題の意味は、このファセットを使って230764530を出力すると1000単位でコンマをつけて出力するようにしろとのことです なので「230,764,530」になるといいです よろしこおねがいします
std::locale locale_; OutIt outit; std::ios_base& format = ; std::num_put<charT, OutIt>& hoge = std::use_faset<std::num_put<charT, OutIt>(locale_); hoge.put(outit, format, char, value); こんな感じで後は自分で設定すればいいよ
>>237 MSDNに載ってるじゃないか。英語だけど、丸写しでもうごいたぞ??
#include <iostream>
//
ttp://msdn.microsoft.com/ja-jp/library/31fhezza.aspx //230764530
int main(){
long Val = 230764530;
std::locale Loc("japanese");
std::cout.imbue(Loc);
std::use_facet<std::num_put<char>>(Loc).put(std::basic_ostream<char>::_Iter(std::cout.rdbuf()),std::cout,' ',Val);
return 0;
}
240 :
194 :2009/05/25(月) 18:33:33
>>239 すみません
エラー: ‘_Iter’は‘std::basic_ostream<char, std::char_traits<char> >’のメンバではありませんという
コンパイルエラーになるのですが何かわかりますでしょうか
>>240
_Iterはイテレータをtypedefしたものだと思うのだが、最初にアンダースコアが入ってるからベンダ定数かもしれん。
俺の使ってるコンパイラはVC9EE(VC2008)なんだが、おまいさんはなにをつかってるんだい?
うちではちゃんと通るし230,764,530とでる。
で、ちょっと改変してみた。これで動かなかったら俺の範疇外だ。
#include <iostream>
//
ttp://msdn.microsoft.com/ja-jp/library/31fhezza.aspx //230764530
int main(){
long Val = 230764530;
std::locale Loc("japanese");
//std::locale::global(std::locale("japanese"));
std::cout.imbue(Loc);
//std::use_facet<std::num_put<char>>(Loc).put(std::basic_ostream<char>::_Iter(std::cout.rdbuf()),std::cout,' ',Val);
std::use_facet<std::num_put<char>>(Loc).put(std::ostreambuf_iterator<char>(std::cout.rdbuf()),std::cout,' ',Val);
return 0;
}
242 :
194 :2009/05/25(月) 19:13:16
>>241 大変失礼しました。
最初にVisualStudioを使っていますと書いておきながらg++でコンパイルしていました。
上記のコードも試したのですが
terminate called after throwing an instance of 'std::runtime_error'
what(): locale::facet::_S_create_c_locale name not valid
Abort trap
というエラーになりました。しかし、VC++2008で試したところ問題なく動いたので、これで十分です。
ありがとうございました。
244 :
デフォルトの名無しさん :2009/05/25(月) 20:05:55
248 :
デフォルトの名無しさん :2009/05/25(月) 21:21:24
またフィボナッチ…
250 :
デフォルトの名無しさん :2009/05/25(月) 22:21:20
>>247 さん、ありがとうございます。
ただ、(2)のプログラムの
#include <iterator>
#include <algorithm>
という2つのインクルードを初めてみました。これはどういう場合に使うのでしょうか?
やはりこれを使わないとプログラムは難しくなってしまうんですか?
ぐぐれ
>>250 ソート処理をstd::sort、出力をstd::ostream_iteratorに丸投げしているため。
これらを見たことないとなるとソートは自分で書きなさいってことなのかね
254 :
デフォルトの名無しさん :2009/05/25(月) 23:16:31
256 :
243 :2009/05/26(火) 00:12:33
257 :
デフォルトの名無しさん :2009/05/26(火) 00:15:55
>>252 >>253 ありがとうございます。調べてみたんですが、便利ですね・・・
今までこんな話は聞いたことなかったし、ソートの問題は自分で書いてました。
今回の問題でもソート・出力は自分でやったほうがいいかと思ってます。
でも、ひとつ勉強になりました。ありがとうございました。
>>230 ありがとうございます
もしまた頼る時があったらよろしくお願いします
おっと誤爆だったみたいだ
263 :
248 :2009/05/26(火) 09:30:23
(5_3)
void binary(int n)
{
if(n>1) binary(n
>>1 );
printf("%d", n & 1);
}
265 :
デフォルトの名無しさん :2009/05/26(火) 10:13:22
[1] 授業単元:プログラミング [2] 問題文(含コード&リンク):ゼロで初期化したint型変数,float型変数,double型変数をそれぞれ3個ずつ用意し,それぞれに1,0.1,0.01を1000回加えてそれぞれの結果を画面に出力するアルゴリズムを考え,それにしたがってプログラムを作成せよ. [3] 環境 [3.1] OS:Windows [3.2] コンパイラ名とバージョン:秀丸 [3.3] 言語:C言語 [4] 期限:5月28日 [5] その他の制限: 関数はまだ習っていません。本当に基礎をやっています。
#include <stdio.h> int main(void) { int i, a = 0, b = 0, c = 0; float fa = 0, fb = 0, fc = 0; double da = 0, db = 0, dc = 0; for(i=0; i<1000; i++) { a += 1; b += 0.1; c += 0.01; fa += 1; fb += 0.1; fc += 0.01; da += 1; db += 0.1; dc += 0.01; } printf("%d %d %d\n", a, b, c); printf("%f %f %f\n", fa, fb, fc); printf("%f %f %f\n", da, db, dc); return 0; }
267 :
デフォルトの名無しさん :2009/05/26(火) 11:47:50
>>262 ありがとうございます。
非常に助かりました。
269 :
デフォルトの名無しさん :2009/05/26(火) 15:35:04
>>269 getline(cin,s)使ってみたら?
271 :
デフォルトの名無しさん :2009/05/26(火) 16:46:56
>>270 ありがとうございました
できました
簡単なトコでのミスだったんですね
272 :
デフォルトの名無しさん :2009/05/26(火) 16:49:57
>>268 お疲れ様です。本当にありがとうございました!
273 :
daigaku1nen :2009/05/26(火) 18:26:48
プログラミングの授業で a,b,c,d,eを cin でキーボードから読み取り {a÷(b×c)+d×(b+3)}÷(e×2) の計算の答えを出力するプログラミングをつくる課題が出たのですが、 演算子の優先順を考慮すると、どう変換して書けばいいのか全く分かりません。 助けてください。 提出期限は今日の0時までです。。。
>>273 #include <iostream>
int main()
{
double a,b,c,d,e;
std::cout << "a:"; std::cin >> a;
std::cout << "b:"; std::cin >> b;
std::cout << "c:"; std::cin >> c;
std::cout << "d:"; std::cin >> d;
std::cout << "e:"; std::cin >> e;
std::cout << (a/(b*c)+d*(b+3))/(e*2) << std::endl;
return 0;
}
275 :
棚大生 :2009/05/26(火) 18:51:13
C++の課題なのですが、教えてください。 提出期限は 5/28午前0時 です。 昨日、一昨日と2日間粘りましたがチンプンカンプンです。 問題は下記の通りです。 @ int i=99;と設定されていたら、 i/3 と i/3. では結果が異なる。 プログラミングを作成することによって、i/3 と i/3.を評価せよ。 (a,bを実数としてi/3 と i/3.をa,bに代入することとする。) A a=10, b=3, c=2 として !aかつb>cの戻り値、!aまたはb>cの戻り値を求めるプログラムを作成せよ。 B a=1,b=10,c=100のとき c<b && b<a と c<b<a は同じものではない。 上記のことをプログラム化して確かめよ。 C i=100で a=i++, a=++iの値を確かめるプログラムを作成せよ。 D 1から10までの和を計算するプログラムをインクリメント演算子を用いて、作成せよ。 デクリメント演算子を用いて、nCmを計算するプログラムを作成せよ。但し、n,mは cin を使って キーボードから読み取ること。 お願いします!!!
276 :
daigaku1nen :2009/05/26(火) 18:59:50
>>274 本っっっっ当にありがとうございます。
また分からない課題が来たらここで質問しにきていいですか??
>>276 次からは質問テンプレ使ったほうがいいよ
cinというキーワードがあったからC++とわかったけど
ぜんぜん違う回答になってた可能性があるからね
>>276 丁寧に質問すれば、誰かが答えてくれる。
280 :
棚大生 :2009/05/26(火) 19:37:04
すいません!!! 101でした。
>>275 @
#include <iostream>
int main()
{
int i = 101;
double a = i / 3;
double b = i / 3.;
std::cout << "101 / 3 = " << a << std::endl;
std::cout << "101 / 3. = " << b << std::endl;
return 0;
}
>>275 @〜C
#include <iostream>
int main()
{
// A
int a=10,b=3,c=2;
std::cout << "\"!a && b > c\"=" << (!a && b > c) << std::endl;
std::cout << "\"!a || b > c\"=" << (!a || b > c) << std::endl;
// B
a=1;b=10;c=100;
std::cout << "\"c<b && b<a\"=" << (c<b && b<a) << std::endl;
std::cout << "\"c<b<a\"=" << (c<b<a) << std::endl;
// C
int i=100; a=i++;
std::cout << "a=i++:" << a << std::endl;
i=100; a=++i;
std::cout << "a=++i:" << a << std::endl;
return 0;
}
>>275 D-1
#include <iostream>
int main()
{
int i =1, sum = 0;
for (i = 1; i <= 10; i++) // インクリメント演算子
sum += i;
std::cout << "sum:" << sum << std::endl;
return 0;
}
>>275 D-2
#include <iostream>
int comb(int n, int r)
{
if (r == 0 || r == n) return 1;
n--; // デクリメント演算子
return comb(n, r - 1) + comb(n, r);
}
int main()
{
int i, n, r;
long x;
std::cout << "n:"; std::cin >> n;
std::cout << "r:"; std::cin >> r;
std::cout << "nCr=" << comb(n, r) << std::endl;
return 0;
}
こんなんで良いのかな。違うような気もするが。
286 :
棚大生 :2009/05/26(火) 20:55:34
>>282 ありがとうございます!!!
面倒だと思いますが、A〜Dもお願いします。
287 :
棚大生 :2009/05/26(火) 21:04:38
>>286 はすいません書き込むのが遅れました
>>283 ABに関してなんですが、coutでなぜ"\"というのが出てくるのですか?
288 :
棚大生 :2009/05/26(火) 21:10:12
>>285 重ね重ねすいません。
D-2で、できれば combを使わない方法でお願いしたいのですが。。。
注文の多い料理店
>>275 D-2 (combを使わない)
#include <iostream>
int main()
{
int i, n, r;
int x = 1;
std::cout << "n:"; std::cin >> n;
std::cout << "r:"; std::cin >> r;
for (i = n; i >= n - r + 1; i--) //デクリメント演算子
x *= i;
for (i = r; i >= 1; i--) //デクリメント演算子
x /= i;
std::cout << "nCr=" << x << std::endl;
return 0;
}
オーバーフローは全く考慮してないので注意。
291 :
デフォルトの名無しさん :2009/05/26(火) 22:01:42
[1] 授業単元:プログラミングT [2] 問題文(含コード&リンク): 1!〜53!を計算して、それらの計算結果の一の位、十の位、…をそろえて(つまり右揃えで) 出力するプログラムを作成せよ。但し、その際 ・適切にモジュール化、機能分割する ・53!≒4.27*10^69であることを考慮して階上値を入れる配列の大きさを決める [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン:gcc [3.3] 言語: C [4] 期限: あさって [5] その他の制限: ・配列の添え字がメモリ確保した配列要素の範囲を超えてはならない ・乗算を上の桁から行ってはいけない。 ・53!の計算、出力の際に最初から1*2*3*...*53という風に、極端に 処理効率を悪くしてはいけない。
はぁ?
>>291 多倍長整数の乗算の実装をしろってことでおk?
制限の2つ目からもそんなニオイが感じられるし
3つ目の制限は 53!=52!(直前に計算済み)x53をしろってことかな
295 :
真面目に質問! :2009/05/26(火) 22:41:55
【授業】:C++ 【問題文】: @以下のプログラムを実行した際,戻り値として何が表示されるか。 #include <iostream> int main() { int a,d,e; a = 10; d = a ==10; e = a < 10; cout << e <<"\t"<< d <<endl; } Aa=10,b=3,c=4とすると、c>aかつc>bの戻り値、c>aまたはc>bの戻り値を出力するプログラムを作成せよ。 BAのプログラムを実行した際,戻り値として何が表示されるか。 【期限】:09.05.27 12:00 何の事を言っているのかサッパリです。。。 よろしくお願いします。
296 :
棚大生 :2009/05/26(火) 22:45:00
>>290 どうもありがとうございました。
なんとかなりそうです。
>>291 なんとか1レスに納めた。修正ヨロ
#include<stdio.h>
#define MB_UNIT 10000
#define MB_SIZE 18
typedef struct tag_mb_t{ long data[MB_SIZE]; }mb_t;
mb_t mb_mul(mb_t a, int n){
long i, tmp, carry=0;
for(i=0;i<MB_SIZE;i++){
tmp=a.data[i]*n+carry;
a.data[i]=tmp%MB_UNIT;
carry=tmp/MB_UNIT;
}
return a;
}
int mb_sprint(char buf[MB_SIZE*4+1], mb_t a){
char i, *p=buf;
for(i=MB_SIZE-1;i>0 && a.data[i]==0;i--);
p+=sprintf(p, "%ld", a.data[i]);
for(i--;i>=0;i--) p+=sprintf(p, "%04ld", a.data[i]);
return p-buf;
}
int main(void){
char buf[MB_SIZE*4+1], i, len53;
mb_t x[54]={{{1}}};
for(i=1;i<=53;i++) x[i]=mb_mul(x[i-1], i);
len53=mb_sprint(buf, x[53]);
for(i=1;i<=53;i++){
mb_sprint(buf, x[i]);
printf("%*s\n", len53, buf);
}
return 0;
}
298 :
◆XjTlXLIlH2 :2009/05/26(火) 23:10:11
[1] 授業単元: プログラミング演習 [2] 問題文(含コード&リンク): めもりのついていない4リットルの容器と、3リットルの容器があり、これらを使って4リットルの容器に2リットルをはかるプログラムをC言語で書く。 [3] 環境 [3.1] OS:Linux [3.2] コンパイラ名とバージョン:gcc [3.3] 言語:C [4] 期限:明日まで [5] その他の制限: forやwhileなどを主に使ったプログラムにしたいのですがよくわからなかったのでよろしくお願いします。
>>298 4 0
1 3
1 0
0 1
4 1
2 3
>>299 0 3
3 0
3 3
4 2
0 2
2 0
>>295 (1) 0 1
(2)
#include <iostream>
int main()
{
int a,b,c,d,e;
a = 10; b = 3; c = 4;
d = c>a && c>b;
e = c>a || c>b;
cout << e <<"\t"<< d <<endl;
}
(3) 1 0
よほどおかしな環境でない限りはこうなるとは思うが、
コンパイラ/OSが書いてない以上実行結果は妄想。
>>291 #include <stdio.h>
#include <stdlib.h>
typedef struct tag_LINT{
int sz_array;
int* value;
} LINT;
LINT* create_lint(int keta){ // size:桁
LINT* lint = (LINT*)malloc(sizeof(LINT));
lint->sz_array = keta / 4 + 1;
lint->value = (int*)calloc( sizeof(int), lint->sz_array);
return lint;
}
LINT* copy_lint(LINT* lint){
LINT* copy = (LINT*)malloc(sizeof(LINT));
copy->sz_array = lint->sz_array;
copy->value = (int*)calloc( sizeof(int), lint->sz_array);
return copy;
}
LINT* mul_lint_int(LINT* l_num, int r_num){
int carry = 0;
//for (int i=l_num->sz_array-1; i>=0; i--){
for (int i=0; i < l_num->sz_array; i++){
int tmp = l_num->value[i] * r_num + carry;
l_num->value[i] = tmp % 10000;
carry = tmp / 10000;
}
return l_num;
}
>>303 に続く
>>302 の続き
void print_lint(LINT* l_num){
for (int i=l_num->sz_array-1; i>=0; i--){
printf("%04d", l_num->value[i]);
}
printf("\n");
}
int main(void){
LINT* n = create_lint(70); // 53!≒4.27*10^69
n->value[0] = 1;
for (int i=1; i<=53; i++){
mul_lint_int(n, i);
printf("%2d!= ", i);
print_lint(n);
}
return 0;
}
リロード忘れてて
>>297 で答えてたなorz
でもとりあえずw
+ ; * ☆_+ : , xヾ:、__,..-‐‐:、、,へ.........._ く '´::::::::::::::::ヽ /0:::::::::::::::::::::::', free議論が始まる前にf逃げて〜!!! = {o:::::::::(;´Д`):::} ':,:::::::::::つ:::::::つ = ヽ、__;;;;::/ し"~(__)
>>304 スマソw
>>302-303 の修正
1. // size:桁 -> 消し忘れ
2. copy_lint関数 -> 使ってないから消して
3. 追加
LINT* delete_lint(LINT* lint){
free(lint->value);
free(lint);
}
4. 変更
main関数のreturn前に
delete_lint(n);
を追加
5. 出力部分で先頭部分を空白にするならfor文を
bool f=true;
for (int i=l_num->sz_array-1; i>=0; i--){
if (f && (0!=l_num->value[i])) f=false;
printf( (f? " ": "%04d"), l_num->value[i]);
}
に変更
【質問テンプレ】 [1] 授業単元:C言語 [2]問題1 テキストファイルにある文字列を空白で区切って一行ごとに表示する 例 I have a pen とテキストファイルにかかれていたらほかのファイルに I have a pen と表示する 問題2 問題1で1行ごとに表示した文字列の4行目の文字列をほかのファイルにコピーする 例の場合はpenをコピーし、また別のファイルにpenと出力させる。 問題3 問題1で作った文字列で区切る物を利用してアルファベット、スペース、数字の数を数えるプログラム 例 as 123 rtd xxとファイルに入力されていたらアルファベットは3こ、数字は2こ、スペースは3個と表示 1,2,3はそれぞれ別のプログラムですが2,3では1のものを利用します。 [3] 環境 [3.1] OS: Windows [3.2] VisualC++ [3.3] 言語: C [4] 期限:5月29日まで
307 :
デフォルトの名無しさん :2009/05/27(水) 01:23:07
>>306 問題1--------------------
#include <stdio.h>
int main(void)
{
int c, last;
for (; (c = getchar()) != EOF; ) {
if (c == ' ')
if (last == ' ') ;
else putchar('\n');
else
putchar(c);
last = c;
}
return 0;
}
>>306 問題2--------------------
#include <stdio.h>
#include <string.h>
#define MAXBUF 1000
int main(void)
{
unsigned char buf[MAXBUF];
int count = 0, continued = 0;
while (fgets(buf, sizeof(buf), stdin) != NULL) {
if (!continued) count++;
if (count == 4)
fputs(buf, stdout);
if (strlen(buf) == MAXBUF - 1 && buf[MAXBUF - 2] != '\n')
continued = 1;
else
continued = 0;
}
return 0;
}
>>306 問題3--------------------
#include <stdio.h>
#include <ctype.h>
int main(void)
{
int c;
int found_digit = 0, found_alpha = 0;
int numeric_count = 0, alpha_count = 0, line_count = 0;
while((c = getchar()) != EOF) {
if (c == '\n') {
line_count++;
if (found_digit) numeric_count++;
if (found_alpha) alpha_count++;
found_digit = 0;
found_alpha = 0;
}
if (isdigit(c)) found_digit = 1;
if (isalpha(c)) found_alpha = 1;
}
printf("アルファベットは%d個、数字は%d個、空白は%d個です\n",
alpha_count, numeric_count, line_count - 1);
return 0;
}
315 :
馬路 :2009/05/27(水) 03:30:09
お願いします。 【授業】:プログラミング(C++) 【問題文】: @以下のプログラムを実行した際,戻り値として何が表示されるか。 #include <iostream> int main() { int a,d,e; a = 10; d = a ==10; e = a < 10; cout << e <<"\t"<< d <<endl; } Aa=10,b=3,c=4とすると、c>aかつc>bの戻り値、c>aまたはc>bの戻り値を出力するプログラムを作成せよ。 BAのプログラムを実行した際,戻り値として何が表示されるか。 【期限】:09.05.27 12:00
>>319 #include <iostream>
using namespace std;
int passMinutes(const int start, const int end) { return end - start; }
int main()
{
const int MIN_INADAY = 24*60;
int h1, m1, h2, m2;
cout << "開始時間(0-23):"; cin >> h1;
cout << "開始分(0-59):"; cin >> m1;
cout << "終了時間(0-23):"; cin >> h2;
cout << "終了時間(0-59):"; cin >> m2;
// 入力は省略。h1:m2 > h2:m2 の場合、h2:m2は翌日の時間だと判断する
// endは27:00等の入力も受け付けるが、startは、00:00〜23:59の範囲に丸められる
int start = h1*60+m1;
int end = h2*60+m2;
if(start < 0) {
start = 0;
h1 = 0;
m1 = 0;
} else if(start >= MIN_INADAY) {
start = MIN_INADAY - 1;
h1 = 23;
m1 = 59;
}
int tm = (start <= end) ? passMinutes(start, end) : passMinutes(start, MIN_INADAY) + passMinutes(0, end);
cout << h1 << "時" << m1 << "分から" << h2 << "時" << m2 << "分までの時間" << endl;
cout << (tm / 60) << "時間" << (tm % 60) << "分です" << endl;
return 0;
}
>>319 ごめ。endが負の数になる場合のチェックを入れ忘れてた。
#include <iostream>
using namespace std;
int passMinutes(const int start, const int end) { return end - start; }
int main()
{
const int MIN_INADAY = 24*60;
int h1, m1, h2, m2;
cout << "開始時間(0-23):"; cin >> h1;
cout << "開始分(0-59):"; cin >> m1;
cout << "終了時間(0-23):"; cin >> h2;
cout << "終了時間(0-59):"; cin >> m2;
// 入力は省略。h1:m2 > h2:m2 の場合、h2:m2は翌日の時間だと判断する
// startは、00:00〜23:59の範囲に丸められるがendは最小値だけが00:00に丸められる。
int start = h1*60+m1;
int end = h2*60+m2;
if(start < 0) {
start = h1 = m1 = 0;
} else if(start >= MIN_INADAY) {
start = MIN_INADAY - 1;
h1 = 23;
m1 = 59;
}
if(end < 0) { end = h2 = m2 = 0; }
int tm = (start <= end) ? passMinutes(start, end) : passMinutes(start, MIN_INADAY) + passMinutes(0, end);
cout << h1 << "時" << m1 << "分から" << h2 << "時" << m2 << "分までの時間" << endl;
cout << (tm / 60) << "時間" << (tm % 60) << "分です" << endl;
return 0;
}
>>312 ワンペアの判定結果を使う。
ツーペア判定関数の引数に、最初に見つけたワンペアカードを追加する。
ツーペア判定関数は、ワンペア以降から二組目のセットを見つけ、あればそのカード番号を返す。
ワンペアがなければ、そもそも呼ぶ必要もなさそう。
324 :
◆UlBEcxSSxE :2009/05/27(水) 09:58:29
325 :
デフォルトの名無しさん :2009/05/27(水) 10:04:19
すみません。 急ぎで知りたいことがあります。 unsigned int 型の数字が、ランダムで生成されて すでに生成済みか、未生成かを知りたいです。 高速で省メモリにするにはどうしたらいいですか?
r(0), r(1), r(2), ... みたいに自然数からの関数rを使って「乱数列」を与える ことができて、さらにrの逆関数が作れれば簡単。でもそんな乱数列は あるのかなあ。 そうでなければ、生成した乱数を適当な集合を表すデータ構造(ハッシュか 何か)に突っ込んでおくという愚直な方法しか思いつかないや。でもこれだと 省メモリにはならないかも。
327 :
325 :2009/05/27(水) 10:15:59
数字はたくさんあり、メモリに保存するとしたら数ギガになる場合がしりたいです。 メモリはたかだか30Mの使用で処理したいです。
>>325 30M*8bit=240M=240,000,000 MAX
330 :
デフォルトの名無しさん :2009/05/27(水) 10:37:29
>>326 ランダムの数字って言うのは、すでにハッシュ値(CRC,SHA)のことなんです。
質問のため言い換えました。
重複ファイルや重複URLを検出したいのですがいい方法ないかなとおもいました。
ググたところ、パトリシア トライ、ダブル配列あたりが使えそうなのでこのあたりでいってみます。
331 :
デフォルトの名無しさん :2009/05/27(水) 11:41:58
bitデータの2分木で、子がある1、子がない0として記録しておけばかなり縮む。探索は木の左からと決める。 一次元の配列に格納したらデータの更新が難しいが。 追加する部分以降を移動しなければいけない。
お願いします。 授業単元ソフトウェア製作実習 osソラリス コンパイラ gcc 言語 c 制限 台形の面積を求めるのに(上底+下底)*高さ/2を使ってください 。できればいかにも初心者が書いたようなプログラムにしてくれる と助かります。 高さhが2で上底aと下底bが次のような4つの合計を求めるプログラムをfor文をつかって作成せよ。 台形(1)a=0b=2^2h=2面積= 台形(2)a=2^2b=4^2h=2面積= 台形(3)a=4^2b=6^2h=2面積= 台形(4)a=6^2b=8^2h=2面積= 四つの台形の面積の合計= 以上でお願いします。
336 :
初心者 :2009/05/27(水) 15:48:34
C++で #include <iostream.h> main() { int a=10,b=3,c=2,d=0,e=0; d = !a && b>c; e = !a || b>c; cout << d <<"\t"<< e <<endl; } を実行した結果はどうなりますか?
実行してみりゃいいだろw
339 :
初心者 :2009/05/27(水) 16:00:09
>>337 いま環境が悪くて実行できないので、すいません。
お願いします。
あと1時間後に答えるからそれまで待ってろ
>>336 iostream.hとか存在しないからコンパイルエラー
>>341 それはない
環境依存ではあるが古い記述方法であることであるのは事実
intに対して論理否定やboolをintに入れているのはいががなモノかと
main()のintは省略してはならない、ゆえにnon-void関数である
cout, endlは、このスコープで定義されていない
344 :
初心者 :2009/05/27(水) 16:19:06
#include <iostream> int main() { int a=10,b=3,c=2,d=0,e=0; d = !a && b>c; e = !a || b>c; cout << d <<"\t"<< e <<endl; } となればいいんですか? 結果はどうなるんですか??
>>344 ネームスペースがおかしいから、コンパイルエラー。
346 :
初心者 :2009/05/27(水) 16:26:15
#include <iostream> int main() { int a=10,b=3,c=2,d=0,e=0; d = !a && b>c; e = !a || b>c; cout << d << e <<endl; } ですか? 締切が18:00までなので結果だけでも教えてください。
336のままならコンパイルできる環境もあるが、344だとコンパイルできない。
>>334 レスありがとうございます。申し訳ありませんが
台形(1)a=0,b=2^2,h=2面積=
台形(2)a=2^2,b=4^2,h=2面積=
台形(3)a=4^2,b=6^2h=2面積=
台形(4)a=6^2,b=8^2h=2面積=
四つの台形の面積の合計=
という表示形式でお願いできないでしょうか?
350 :
◆XjTlXLIlH2 :2009/05/27(水) 16:46:03
>>318 すごく助かりました、ありがとうございました!!
351 :
334 :2009/05/27(水) 16:54:43
353 :
デフォルトの名無しさん :2009/05/27(水) 18:04:25
354 :
デフォルトの名無しさん :2009/05/27(水) 18:27:30
[1] C言語 [2] 問題文(含コード&リンク): [3] 環境 [3.1] Windows [3.2] すみません、わかりません [3.3] C [4] 明日まで 入力された文字列をリストに格納し、 そのリスト自体を入れ替えて辞書順に並べる関数を作っています。 その際先頭・最後尾・次のリストのアドレスを変えなくては ならないのですが、その処理をどうやったらいいか悩んでいます。 (strcmpの下の行からがよくわかりません) void jisyo(struct B *fp, struct B *ep, int list_sum){ //前からリストの先頭アドレス、リストの最後尾アドレス、リストの数 です。main関数でjisyo(a.front_p, a.back_p, a.list_sum)と 呼び出しています。 int n, i, m; struct B *p;
355 :
デフォルトの名無しさん :2009/05/27(水) 18:28:50
>>354 の続きです
for(n = 1; n < list_sum; n++){
pb = fp;
pb_b = ep;
for(i = 0; i < list_sum-1; i++){
if(strcmp(pb->str_p, pb->next_p->str_p) >= 1){
p = pb;
pb = pb->next-_p;
pb->next_p = p;
356 :
デフォルトの名無しさん :2009/05/27(水) 18:29:31
>>355 の続きです
if(fp != pb){
fp = fp->next_p->next_p;
fp->next_p->next_p = fp->next_p;
fp->next_p = fp->next_p->next_p->next_p;
}else if(ep != pb_b){
ep = ep->next_p;
ep->next_p = ep->next_p->next_p->next_p;
ep->next_p->next_p->next_p = ep->next_p;
}else{
pb = pb->next_p->next_p;
pb->next_p = pb;
pb->next_p->next_p = pb->next_p;
}
}
pb = pb->next_p;
}
}
for(m = 0; m < list_sum; m++){
printf("%s\n", pb->str_p);
pb = pb->next_p;
}
}
>>307 (9255) Vector勉強になった。 それとついでに
>>324 (9269) >>(9271) N-Queenを解くプログラム
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <time.h>
using namespace std;
struct student {
string name;
int score;
};
bool operator<(const student& x, const student& y) {
return x.score < y.score;
}
int main(void) {
int i;
char buf[50];
student s, t;
vector<student> vecStudent;
vector<student>::iterator theIterator;
srand((unsigned)time(0));
for(i=0; i<20; i++) {
sprintf(buf, "名前.%02d.名前", i+1); s.name = buf; s.score = rand() % 101;
vecStudent.push_back(s);
}
for (theIterator = vecStudent.begin(); theIterator != vecStudent.end(); theIterator++)
cout << theIterator->name << ":" << theIterator->score << endl;
cout<<endl; sort(vecStudent.begin(), vecStudent.end());
for(i=0; i<20; i++)
t = vecStudent[i], cout<<t.name<<":"<<t.score<<endl;
return 0;
}
359 :
デフォルトの名無しさん :2009/05/27(水) 20:32:00
>>358 ありがとうございます。
でもコメントが文字化けしていて
どんな処理をしているのかわかりませんでしたorz
構造体は
struct A a{
struct B *front_p;
struct B *back_p;
int list_sum;
}
struct B b{
char *str_p;
struct B *next_p
}
です。
書き忘れすみません。
よろしくお願いします。
>>358 構造体は予想どおりだったか。
コメントの文字化けは知らんがな。
UTF-8だから、nkfかiconvでSJISにでもしてみてね。
それか、サクラエディタかnotepad++で読み込むとか。
私の考えでは、別にリストのポインタを入れ替えていく必要はないと。
つまり、文字列(char *)だけ入れ替えてやるだけで済むと。
ソートしたい対象が文字列(char *)なのにリストのポインタを替えていくなんて無駄な処理でしょ。
だから、文字列(char *)だけソートしたものが
>>358 なのよ。
362 :
デフォルトの名無しさん :2009/05/27(水) 21:11:55
>>360 文字列のみの入れ替えは完成していたのですが、
講師からリスト自体を入れ替えろと言われました…。
あとコメント見れました。
>>364 print関数だけ。
void print(int a[],int N,int n)
{
int i;
int head;
printf("%2d! = ",n);
head = 0;
for(i=N-1; i>=0; i--) {
if (head)
printf("%07d",a[i]);
else if (a[i]) {
printf("%7d",a[i]);
head = 1;
}
else
printf(" ");
}
printf("\n");
}
367 :
デフォルトの名無しさん :2009/05/28(木) 00:45:29
>>366 ありがとうございます。
0は消えたんですが右揃えになりません。
>>366 すいません。なりました。本当にありがとうございました
>>367 greater()をstructの後に移動
if(a.point>b.point)
[1] 授業単元:C言語 [2] 問題文(含コード&リンク):線形検索を使用して配列内の最大の要素を検索せよ。 [3] 環境 [3.1] OS:Linux [3.2] コンパイラ名とバージョン:gcc [3.3] 言語:C [4] 期限:来週火曜日 [5] その他の制限:制限はありません まずアルゴリズムが全く思いつきません。 よろしくお願いします。
372 :
デフォルトの名無しさん :2009/05/28(木) 01:06:17
>>370 ありがとうございました。
昨日から悩んでいたのがやっと解決しました
373 :
デフォルトの名無しさん :2009/05/28(木) 01:19:43
374 :
デフォルトの名無しさん :2009/05/28(木) 01:39:22
[1] 授業単元:情報処理 [2] 問題文(含コード&リンク): (1)1からn番目までの奇数2n-1までの和をn=1からn=50まで求め、n,和(sum), n~2の値を出力せよ。また、プログラムの中でsum=0;およびn--;が 必要な理由を答えよ。 (2)原点を中心とした半径2の円を描くプログラムを作成せよ。 [3] 環境 [3.1] OS:XP [3.2] コンパイラ名とバージョン:gcc [3.3] 言語:C [4] 期限:今週金曜日 [5] (2)についての条件 @半径2の値はconst型で初期化しておき、実数型とする。 A円の方程式は平面極座標(r,φ)を用いてforループでφを0から 2πまで変化させてガウス座標(x,y)を出力する。 Bforループの制御変数はint型とする。 長くなってしまいすいません。よろしくお願いいたします。
[1] 授業単元: 情報処理入門 [2] 問題文(含コード&リンク): キーボードから実数 x を入力し、ニュートン法と呼ばれる次のような反 復の式を用いて、近似的に x の平方根を求めるプログラムを作成せよ。 -- xの平方根は、次の計算を| s(i+1)-s(i) | < ε, i=1,2,...となるまで繰 り返すことによって求めることができる。εは収束判定数である。 s(i+1) = ( s(i) + x / s(i)) / 2 ただし、s(1) = 1 とする。 なお、ε=0.00001として計算すること。 [3] 環境 [3.1] OS: WindowsXP [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 2009年5月29日00:00まで [5] その他の制限: なし よろしくお願いします。
>>364 void print(int a[],int N,int n) {
int i;
printf("%2d! = ",n);
for(i=N-1; i>=0&&a[i]==0; i--) printf("%7c",' ');
printf("%7d",a[i]);
for(i--; i>=0; i--) printf("%07d",a[i]);
printf("\n");
}
381 :
243 :2009/05/28(木) 06:36:52
>>374 問題文(1)の中の「n~2の値」、何を出力すればいい?
383 :
sage :2009/05/28(木) 10:11:18
[1] 授業単元:C言語 [2] 問題文(含コード&リンク):番兵を利用して配列内の最大の要素を検索するプログラムを作りなさい [3] 環境 [3.1] OS:Linux [3.2] コンパイラ名とバージョン:gcc [3.3] 言語:C言語 [4] 期限:6月2日 [5] その他の制限:制限はありません お願いします
指数関数e^xの近似値を返す関数expon(x, n)をつくります。第1引数は浮動小数点数xで,第2引数はexをTaylor展開で展開する際の最大次数nになります。n次項までのTaylor展開の式は下に示す通りです。 さらに,浮動小数点数yと正の整数mを引数とし,yの小数点m桁より下を切り捨てて出力する関数trunc(y, m)をつくりなさい。 次に,これらの2つの関数を用いて,e^xの近似値を小数点以下の桁数を指定して出力するプログラムをつくりなさい。 [1] 授業単元:C言語 [2] 問題文(含コード&リンク): 指数関数e^xの近似値を返す関数expon(x, n)をつくります。第1引数は浮動小数点数xで,第2引数はexをTaylor展開で展開する際の最大次数nになります。n次項までのTaylor展開の式は下に示す通りです。 さらに,浮動小数点数yと正の整数mを引数とし,yの小数点m桁より下を切り捨てて出力する関数trunc(y, m)をつくりなさい。 次に,これらの2つの関数を用いて,e^xの近似値を小数点以下の桁数を指定して出力するプログラムをつくりなさい [3] 環境 [3.1] OS:Linux [3.2] コンパイラ名とバージョン:gcc [3.3] 言語:C [4] 期限:5月30日 [5] その他の制限:なし
すいません
>>384 はミスです。
[1] 授業単元:C言語
[2] 問題文(含コード&リンク):
指数関数e^xの近似値を返す関数expon(x, n)をつくります。第1引数は浮動小数点数xで,第2引数はexをTaylor展開で展開する際の最大次数nになります。n次項までのTaylor展開の式は下に示す通りです。
さらに,浮動小数点数yと正の整数mを引数とし,yの小数点m桁より下を切り捨てて出力する関数trunc(y, m)をつくりなさい。
次に,これらの2つの関数を用いて,e^xの近似値を小数点以下の桁数を指定して出力するプログラムをつくりなさい
関数truncは,trunc(-3.141593, 3) と呼び出すと,-3.141のように画面に出力する。但し,printf("%.*f", m, y); は用いないで定義すること。
[3] 環境
[3.1] OS:Linux
[3.2] コンパイラ名とバージョン:gcc
[3.3] 言語:C
[4] 期限:5月30日
[5] その他の制限:なし
[1] 授業単元: ソフトウエア科学 [2] 問題文(含コード&リンク): 4桁の10進数の各桁を千の位からd3,d2,d1,d0で表すと、 ((d3*10+d2)*10+d1)*10+d0という計算をすることにより、元の10進数を得ることができる。 4桁の10進数の各桁を、まず、大きさ4のint型配列に1桁ずつに入力し、 その後、上記の計算法により、元の10進数にして表示するプログラムを書け。 ただし、上記の計算部分はfor文による繰り返しにより記述すること。 例;入力が4536ならば、((4*10+5)*10+3)*10+6=4536の計算をして表示する。 [3] 環境 [3.1] OS:Windows [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 2009年5月29日12:50まで [5] その他の制限:特になし お願いします。
389 :
デフォルトの名無しさん :2009/05/28(木) 11:47:24
もうちょっと面白い問題プリーズ
390 :
デフォルトの名無しさん :2009/05/28(木) 12:09:18
>>389 Windowsのフリーセルの最小手順検索はいかが?
ここで最小手順とは人間が操作を行う回数のこと
列移動も一回として数える
>>365 さん
入力した内容を暗号化(置き換え)してファイルに保存する方法が分からないです
よろしくお願いします
>>363 修正。ID、名前の数字は置換しない。
void angouka(char *s) {
for(; *s != '\0'; s++)
if(*s < '0' || *s > '9') (*s)++;
}
>>389 難易度が高くて未回答の問題が幾つもあるだろ。解いてみろ。
>>398 スタック
#include <stdio.h>
#include <stdlib.h>
#define n 100 /* nは外部変数でなく定義とした */
/* スタック処理の関数,外部変数の定義*/
char stack[n];
int size;
void push(char c){
stack[size++] = c;
}
char pop(){
return stack[--size];
}
/*main*/
main(){
char buf[n+1], *pbuf;
/* scanfで文字列取得(略)*/
scanf("%s", buf);
/*スタック初期化(略)*/
size = 0;
for(pbuf=buf; *pbuf !='\0'; pbuf++){
/*1文字ごとの処理(略)*/
if(*pbuf == '/') printf("%c", pop());
else push(*pbuf);
}
printf("\n");
}
>>398 キュー。実行結果は自分で出してくれ。
#include <stdio.h>
#include <stdlib.h>
#define n 100 /* nは外部変数でなく定義とした */
/* キュー処理の関数,外部変数の定義*/
char queue[n];
int size;
int head;
void push(char c){
queue[size++] = c;
}
char pop(){
return queue[head++];
}
/*main*/
main(){
char buf[n+1], *pbuf;
/* scanfで文字列取得(略)*/
scanf("%s", buf);
/*キュー初期化(略)*/
size = 0;
head = 0;
for(pbuf=buf; *pbuf !='\0'; pbuf++){
/*1文字ごとの処理(略)*/
if(*pbuf == '/') printf("%c", pop());
else push(*pbuf);
}
printf("\n");
}
>>401 9287.txtの10行目のが正しいようだね
【質問テンプレ】
[1] 授業単元:Cプログラムの基礎
[2] 問題文(含コード&リンク):
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9290.txt [3] 環境
[3.1] OS: (WindowsXP
[3.2] コンパイラ名とバージョン:borland C++
[3.3] 言語: (C言語】
[4] 期限: ([2009年05月29日00:00:00まで]
[5] その他の制限: 一通り習っていますが、リンク先にある書きかけのソースを
補完して、完成したいです。
今は解らなくても、理解できるようになりたいです。
その為にも、一度正常に動くソースを見てみたいです。
みなさんの力を貸してください、お願いします!
404 :
デフォルトの名無しさん :2009/05/28(木) 21:13:43
>>374 (1)sum=0 は初期化する必要があるが、n-- は必要な理由が見あたらない
#include <stdio.h>
int main()
{
int n, sum;
sum = 0; // 集計のため0に初期化する
for (n = 1; n <= 50; n++) {
sum += (2 * n - 1);
printf("n = %3d sum = %4d n^2 = %5d\n", n, sum, n*n);
}
return 0;
}
(2)
#include <stdio.h>
#include <math.h>
const double r = 2.0;
const double PI = 3.14159;
int main()
{
int i; double rad;
for (i = 0; i <= 100; i++) {
rad = PI * 2 / 100 * i;
printf("φ=%.6f x=%.6f y=%.6f\n", rad, r * cos(rad), r * sin(rad));
}
return 0;
}
>>378 #include <stdio.h>
#include <math.h>
int main(void) {
double x, s, t;
double eps = 0.00001;
scanf("%lf", &x);
s = 1.0; /* 初期値 */
do {
t = s; /* 前回の値 */
s = (s + x / s) / 2; /* 反復式 */
} while (fabs(s - t) >= eps);
printf("%f\n", s);
return 0;
}
408 :
デフォルトの名無しさん :2009/05/28(木) 22:47:50
[1] C [2] 1.英数字からなる文字列内の全ての数字文字を削除する。 2.文字列Aの中に文字列Bがいくつ含まれているかカウントする。 3.配列中の10個のデータを降順に並べ替える。 [3] 環境 [3.1] Windows [3.2] わかりません [3.3] C [4] 明日 [5] 3問あります。よろしくお願いします。
>>408 3の問題、もう少し詳しく書いて。
配列は文字列?それとも数字?例題があればそれを。
>403をお願いします!
411 :
デフォルトの名無しさん :2009/05/28(木) 23:15:27
>>409 特に指定はないのでとりあえず文字列にしようかなと思っています。
412 :
デフォルトの名無しさん :2009/05/29(金) 00:03:40
内容: [1] 授業単元: 制御工学 [2] 問題文: ルンゲクッタ法を用いて 微分方程式 dy/sx=(1-y)/15を初期条件x0=0,y0=0でxmax=100まで解く [3] 環境 [3.1] OS: OS: WindowsXP [3.2] コンパイラ名とバージョン: 解かりません [3.3] 言語: C++ [4] 期限: 2009年05月29日午前09:00まで [5] その他の制限: プログラミングと言う物を今まで使った事が無かったので正直お手上げです どうかご助力お願いします
>>412 ルンゲクッタ法に限らず刻み値も条件として与えられているはずだが。
h=0.01ほど?
415 :
398 :2009/05/29(金) 00:17:42
わざわざお答えくださってありがとうございます。
>>401 すみません,Eを書くのを忘れてしまいました。ご指摘ありがとうございます
またお聞きするかもしれませんが,よろしくお願いします。」
>>416 厳密解 1.0-exp(-x/15.0)と較べた結果ほぼあってるね
信じておk
>>416 >>419 有難うございます
ちなみに刻み値が1つでh=0.01だった場合
double h[3]を1に、{5.0,1.0,0.5}を0.01にすればいいんですか?
差し出がましくてすいません
>>420 いくつか修正しなければならないが
h[3]をh=0.01に、h[i]をhに、それからfor文でiを0から2まで
回す必要なし
このプログラムがややこしい配列を使っているのは汎用の
ルンゲ=クッタ法のプログラムを流用したためで、n階微分
方程式も解けるようになっているため
1階専用ならもっと単純に書ける
お前ら、そろそろ気づこうや。Cなんて、Cまでやっちゃうなんて エッチなのは(ry
>>417 Input_Data関数が糞すぎる。。変更不可なのか。。
だいたい
void Input_Data(char *InputKey){
int Cnt = 0;
while( InputKey[ Cnt - 1] != '\n'){
引数の配列のインデックス値が負数になるなんて(ry
>>422 なるほど凡庸をを流用してn階微
分も解ける用にしてるんですか凄いですね。
お手数で無ければ、今後の為に一階専用
も見てみたいですが駄目でしょうか?
>>417 麻呂のクソースが発動しかけたでおじゃるが、却下でおじゃる
>>424 そうなんです、仕様の制限が厳しくて
>>426 お疲れ様です。
ありがとうございます、参考にさせて頂きます。
>>434 どのような配列か(何を最大とするか)、また、番兵は何かがわからないから無理だよもん。
>>435 説明不足ですいません。int型の配列で単純に数値比較をして最大のものということです。
申し訳ありませんが「番兵は何かがわからない」という意味が私にはわからないのですが。
>436 番兵って要するに余分な配列って事でしょ 何に使うの?
データ軒数が予め判らない時に、「ここまでだ」と教える様な約束をした値。 データが正数なら、マイナス1とかね。 特に指示がなければ、そういう配列を用意しておいて、最大数を表示するプログラムを書けばいいのではないかな。
439 :
436 :2009/05/29(金) 16:45:38
ここでいう番兵は配列の末尾に自分で設定した値を入れて そこでループを終了させる、といった類で使うものです この番兵を利用しての最大数を検索するうまい書き方がわからなかったので書き込みをしました 色々説明不足ですみません。
int getmax(int *m){ /* ここを埋めて引数配列mの要素の最大値(複数の場合は一番若いもの) を求めるコードを書けm[0]は自由に番兵として使用して良い */ } ってことだね。優秀なここの回答者なら必ず回答してくれる筈
>>440 m[0]じゃまずいだろ
要するに配列の大きさを渡さずに最大の要素を探せというわけだから
配列の最後が番兵の方が良い
ところで型はint?double?それとも他の型?問題に何も書いて
ないから答えようがないんだけど
それから配列の中身は乱数で初期化するの?どっかから読み込むの?
>>441 m[0] にかかれている値が番兵であり
m[1] 〜 m[i] までアクセス可能で m[i] == m[0] で終端 という意ではなかろうかと
>>442 >ここでいう番兵は配列の末尾に自分で設定した値を入れて
>そこでループを終了させる、といった類で使うものです
とあるから配列の末尾が番兵だろ
>>439 それで配列の大きさはどうやって与えるのですか?
配列の大きさがわからなければ番兵もまた配列の終端に
置く事が不可能なんですけど
>>443 そうなると、「何の値をもって番兵とするか?」 はコード上で知っていないといけない形なわけだね
で
>>440 出題では無理な話になっちゃう
446 :
436 :2009/05/29(金) 17:08:11
m[n]とあったときにm[n+1]を設定するということです
>>441 intです。
配列の中身はどこからか読み込んでもいいし乱数で初期化してくださっても結構です。
>>446 配列の取りえる値の範囲が int の取りえる値の範囲 と同じ場合 には番兵使えないよ?
配列終端を意味する値 なのか 正規の値 なのか 区別つかないもの…
空気読まず投下。 #include <stdio.h> #define Banpei -1 #define Max(A,B) (((A)>(B))? A:B) int GetMax(int* Array){ int max= *Array; while(1){ if(*Array == Banpei) return max; max=Max(max,*Array); Array++; } } int main(){ int Ary[]={8,3,8,8,6,1,Banpei}; int result=0; result = GetMax(Ary); printf("Max = %d\n", result); return 0; }
>>446 配列の中身に拘らないのであれば、
「0から100までの乱数を生成する。0が生成されたら、生成を打ちきる。」
というのでどうかね。
番兵は0となる。
>435だが、 番兵は何かがわからないとは、番兵をどのように定義していくかってことね。 番兵自体知ってるよん。 intなら、INT_MAXとかINT_MINにでもしておけばいいかしら。 正数しか扱わないのなら、負数(-1)にでもするとかとか。 非ゼロの整数しか扱わないのなら、ゼロ(0)にするとかとか。 使われない値にしないといけないけどよん、 大抵番兵を使うときは、ポインタの配列で最後をNULLとかとか。 envpは、これだよもん。exec*()でも使われてるよん。 文字列終端のNUL('\0')くらいのモノだよもん。
451 :
残問題 :2009/05/29(金) 19:08:14
>>450 珍しいところで 文字列ペアを指し示す都合 \0\0 で終端 ってのが WinAPI にはあるな
"hoge\0pair\0" って渡す変則番兵
[1] 授業単元:情報処理T [2] 問題文(含コード&リンク):@for文を用いてある元金を預けた時の元利合計を算出するプログラムを作成し、 プログラムを作成しなさい。入力するデータは、元金、金利、年数である。(結果に「元金は〜」というように表示させること。) A9個ずつ改行する以下のような九九の表のプログラムを作成しなさい。 1*1=1 1*2=2・・・・・1*9=9 2*1=2 ・・・・ [3] 環境 [3.1] OS:WindowsXP [3.2] コンパイラ名とバージョン:わかりません [3.3] 言語:C++ [4] 期限:2009年05月31日まで [5] その他の制限:特になし よろしくお願いします。
授業単元:C言語演習 問題文:プログラムを実行すると「何人ぶんのデータですか?」と表示されるので人数を入力、すると「一人目の国語の点数は?」 と表示されるので一人目の国語の点数を入力 次に「一人目の英語の点数は?」と表示されるので一人目の英語の点数を入力、算数も同様に入力 この手順が人数分繰り返され、全員の国語、英語、算数 の得点を入力し終えると各科目の最高得点とその得点をとった学生が何人目だったか、また合格者の人数と各科目合格者平均点を表示する ただし三科目の内二科目以上で80点以上のときに合格とする また人数が0のときは「ただしい人数を入力してください」と表示する
続き 環境 OS:windowsvista コンパイラ名 VisualC++2008 言語 C++ 期限:2009 6月 6日 その他の制限 プログラムの流れの繰り返しまで習いました 配列はならっていません よろしくお願いします
457 :
デフォルトの名無しさん :2009/05/29(金) 23:13:15
1] 授業単元:C言語 [2](1) 学生の体重データweight(小数第1位)を一件ずつ入力し、人数n と体重の合計kei,heikin,max,minを求め。空欄をうめよ、ただし人数は不明としデータが なくなった場合0を入力し終了する。また1件目のデータをmax,minの初期値とする int main(void) { float weight, kei=(@), n=0, heikin, max, min; while(A){ printf("体重データを入力して下さい:"); scanf("%f",&weight); if(B)break; (C); n++; if(n==1){ D; E; } if(F) max=weight; if(min>weight) G; } H; printf("合計:%6.1f\n人数:%6.0f\n平均:%6.1f\n最大:%6.1f\n最小:%6.1f\n", kei,n,heikin,max,min); return 0; }
458 :
デフォルトの名無しさん :2009/05/29(金) 23:15:50
続き (2)正の整数nを入力し1〜nの階乗kaijo表示するプログラムを空欄をうめて完成させよ。 int main(void) { int kaijo=@, i=1, n; printf("n!を求めます.nを入力して下さい:"); scanf("%d", &n); while(A) B; printf("%d! = %d\n" ,i, kaijo); C; } return 0; } [3.1] OS:XP [3.2] コンパイラ名とバージョン: turbo c 5.01 [3.3] 言語: c++ [4] 期限:今週の日曜日まで [5] その他の制
461 :
デフォルトの名無しさん :2009/05/30(土) 00:05:26
[1] 授業単元:アルゴリズムとデータ構造 [2] 問題文(含コード&リンク) 木の幅優先探索について考える。 以下の?に何かをいれればプログラムは完成する。 なお、以下のコードはあくまでも参考として使用してよい (?以外の場所を書き換えて動作させてもよい) ただし、キューはリングバッファにしなければならない。 #include <stdio.h> #include <stdlib.h> #define QUEUE ? typedef struct{ int child_left; int child_right; } NODE; int left = ? /* RING */ int right = ? /* RING */ void enqueue (int queue[], int d){ queue[right] = d; right++; if(?){ printf("Over flow: Queue is full\n"); exit(1); } ? }
462 :
デフォルトの名無しさん :2009/05/30(土) 00:06:39
続き int dequeue(int queue[]){ int x; if(?){ printf("Underflow: Queue is empty\n"); exit(1); } else ? } int main(){ int queue[QUEUE]; /*キュー*/ int visit; /* 探索対象ノードnumber */ NODE node[] = { {1,3}, {2,4}, {-1,-1}, {7,5}, {8,10}, {6,9}, {-1,-1}, {-1,-1}, {-1,-1}, {-1,-1}, {-1,-1} }; visit = 0; enqueue(queue, visit); while(?){ visit = dequeue(queue); printf("%d -> ", visit); if( ? ) /*右の子をキューへ */ if( ? ) /* 左の子をキューへ */ } printf ("END\n"); return 0; } [3] 環境 Linux、gcc、言語はC [4] 期限: 2009/06/01(月) おねがいします
>>457 ,
>>458 (1)
@0
A1
Bweight==0
Ckei+=weight
Dmax=weight
Emin=weight
Fmax<weight
Gmin=weight
Hheikin=kei/n
(2)
@1
Ai<=n
Bkaijo*=i
Ci++
(2)while(A)の行末に、"{"がもれてない?
468 :
# :2009/05/30(土) 13:01:22
470 :
デフォルトの名無しさん :2009/05/30(土) 15:41:31
[1] アルゴリズムとデータ構造 [2] 以下の雛型、資料を参考にマージソートを行う関数テンプレートを作り、適当な main 関数でテストせよ。 template < typename Itr > void merge_sort( Itr begin, Itr end ) { typedef typename iterator_traits<Itr>::value_type VT; int const cutoff = 1; // データ数が cutoff 以下の時は再帰呼出をやめる。 int n = end - begin; // これでデータ数がわかる。 if ( n <= cutoff ) { ... } else { // 入力データ列を適当に2つに区切って、それぞれをソート ... merge_sort( .... ); merge_sort( .... ); // 作業用にベクターを用意し、そこに2つのソートされた列をマージする。 vector<VT> x(n); ... // 最後に x から入力データ領域にコピーする。 ... // vector x は「局所変数」なので、自動的に破棄される。 } } [3] Linux gcc C++ [4] 2009年6月1日 [5] insartion_sortを途中で呼び出す よろしくおねがいします
[1] 授業単元:C++ [2] 問題文(含コード&リンク): char x1,x2;としてこれをwhileで繰り返し、if文でx1==x2 or x1!=x2の判定を しながら、文字列のランレングス符号化をせよ。出力はaaaであれば、a3とせよ。 [3] 環境 [3.1] OS:UNIX [3.2] コンパイラ名とバージョン: g++でバージョンはわかりません。 [3.3] 言語: C++ [4] 期限:2009年6月1日 [5] その他の制限: 繰り返し文(for,while)、if文、変数、インクリメント、デクリメント で書くよう制限されました。 お手数おかけしますが、よろしくお願いします。
>>471 復号できない場合があるぞ
#include<stdio.h>
int main(void){
char x1=0, x2=0;
int x, count=0;
while((x=getchar())!=EOF){
x2=x1;
x1=x;
if(x1==x2){
count++;
}else{
if(count>1) printf("%d", count);
printf("%c", x1);
count=1;
}
}
return 0;
}
475 :
474 :2009/05/30(土) 18:53:49
>>471 >>474 の修正
#include<stdio.h>
int main(void){
char x1=0, x2=0;
int x, count=0;
while((x=getchar())!=EOF){
x2=x1;
x1=x;
if(x1==x2){
count++;
}else{
if(count>1) printf("%d", count);
printf("%c", x1);
count=1;
}
}
if(count>1) printf("%d", count); //
>>474 にこの行を追加した
return 0;
}
>>474 ありがとございます。
複合の件は
一応、問題文にあったんで出題者の間違いだと思います。
すいません。
477 :
デフォルトの名無しさん :2009/05/31(日) 00:06:07
478 :
デフォルトの名無しさん :2009/05/31(日) 00:10:57
[1] 授業単元 アルゴリズムとデータ構造: [2] 問題文(含コード&リンク) ノードの中身を表示しながらトラバースする関数 void preorder(NodePointer node); void inorder(NodePointer node); void postorder(NodePointer node); を再帰を使って書きなさい 。以下のプログラムの関数部分を作れ。 実行例: % ./a.out preorder: + 1 * 2 3 inorder: 1 + 2 * 3 postorder: 1 2 3 * + #include <stdio.h> #include <stdlib.h> struct node { struct node *right; char key; struct node *left; }; typedef struct node * NodePointer; void treeinitialize(void); NodePointer makenode(char c); void preorder(NodePointer node); void inorder(NodePointer node); void postorder(NodePointer node); NodePointer head, tail;
479 :
デフォルトの名無しさん :2009/05/31(日) 00:13:18
つづき int main(){ treeinitialize(); /* テスト用の木を作成 */ head->right=makenode('+'); head->right->left=makenode('1'); head->right->right=makenode('*'); head->right->right->left=makenode('2'); head->right->right->right=makenode('3'); /* トラバース */ printf("preorder: "); preorder(head->right); printf("\n"); printf("inorder: "); inorder(head->right); printf("\n"); printf("postorder: "); postorder(head->right); printf("\n"); return 0; }
480 :
デフォルトの名無しさん :2009/05/31(日) 00:14:55
つづき void treeinitialize(void){ head=makenode(-1); tail=makenode(-1); head->right=tail; head->left=tail; } /* * ノードを作成し、そのノードへのポインタを返す。 */ NodePointer makenode(char c){ NodePointer x; x=malloc(sizeof(struct node)); x->key=c; x->right=tail; x->left=tail; return x; }
481 :
デフォルトの名無しさん :2009/05/31(日) 00:15:51
void preorder(NodePointer node){ } void inorder(NodePointer node){ } void postorder(NodePointer node){ } : [3] 環境 [3.1] Solaris: [3.2] gcc バージョンはわかりません [3.3] C [4] 期限:2009年6月3日9:00まで おねがいします
>>477 ソースでCommonImageIO.hていうのをインクルードしてるけど、
提供されているなら、よろしく
>>465 全くの初心者で申し訳ないのですが、回答いただいたものをビルドしてもエラーとなってしまいます。
何が問題なのかご教授願えないでしょうか?
>>484 "cpp"や"c"にしてみましたがやはりエラーが出ます。
scanfの宣言を確認してください、構文エラーとでているのですがどうすればいいのでしょうか?
よろしければご教授お願いいたします。
コンパイラはvisual C++ 2008 Express Editionというものを使用しました。
>>485 (2)の所でエラーになるならば、全角スペースでエラー出してると思われ
全角スペースを全部半角スペースに置き換えてビルドしてみてください
>>487 1も2も置換してみましたが、今度は全て
構文エラー : '{' が ':' の前にありません
といった内容になってしまいます。
今回はscanfとは出ませんでした。
>>488 つ 修正したヤツ
拡張子cpp にしてコンパイルしれ
#include <iostream>
#include <iomanip>
using namespace std;
int main(){
for(int i = 1; i <= 9; ++i){
for(int j = 1; j <= 9; ++j){
if( j != 1){
cout <<" ";
}
cout <<i <<"*" <<j <<"=" <<setw(2) <<i*j;
}
cout <<endl;
}
return 0;
}
>>489 何とか無事にできました。(1)の方はもうよくわからないのでこのまま提出しようと思います。
お手間を取らせてしまい申し訳ありませんでした。ありがとうございました。
[1] 授業単元:情報システム [2] 問題文: 以下の実行結果を元に、float型変数 f に与えた実数の、 実際に格納されているビット列を表示するプログラムを作成してください。 実行結果: Size of Float : 4 byte Size of Int : 4 byte f=0.500000000000000 00111111000000000000000000000000 [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン:VC 6.0 [3.3] 言語: C/C++ [4] 期限: 2009年06月01日まで お願いします。
492 :
465 :2009/05/31(日) 15:30:28
>>489 フォローさんくー。
(1)はWin2000のVC6のソースをそのまま上げたんだけどなんだろ?
489で直ったってことは、「using namespace std;」をmainの外に出したらいいのかな?
試そうと思ったら、VC2008は2000じゃ無理と言われてインストールできなかったw
>>491 #include <stdio.h>
int main()
{
float a = 0;
int i, *b = (int*)&a;
scanf("%f", &a);
for (i = sizeof(a) * 8 - 1; i >= 0; --i) {
printf("%d", *b & (1 << i) ? 1 : 0);
}
printf("\n");
return 0;
}
aに何かを入れとかんと浮動小数点を扱うライブラリがリンクされないらしい。
495 :
デフォルトの名無しさん :2009/05/31(日) 17:45:56
>495 ファイル名とキーワードはコマンドライン引数にしたほうがいいの?
入力し、〜出力せよ だから、cinで良いんじゃないの?
行番号が表示可能なファイルだと、テキストファイルなんだろうな。 Windows標準入力で入力可能な文字コードを想定すれば、足りるんじゃ。
500 :
デフォルトの名無しさん :2009/05/31(日) 19:56:38
502 :
デフォルトの名無しさん :2009/05/31(日) 20:17:09
>>498 文字コードはUnicodeでお願いします
503 :
162 :2009/05/31(日) 20:20:32
[1] 授業単元:情報の基礎 [2] 問題文(含コード&リンク): 林檎が10個以下だと100円。 11個〜100個まで90円。100個以上だと70円。で、買いたい個数を入力して計算せよ。 [3] 環境 [3.1] OS: (Windows/Linux/等々) XP [3.2] コンパイラ名とバージョン: 不明 [3.3] 言語: C言語 [4] 期限: 6月2日まで [5] その他:ここまで出来ました。 #include <stdio.h> int main() { int nedan; printf("林檎を何個買いますか?\n"); scanf("%d", &nedan); if(nedan<10)nedan=100*nedan; { printf("林檎の値段は%d円です。\n"); } if (11<nedan<100)nedan=1000+90*(nedan-10);{ printf("林檎の値段は%d円です。\n"); } if(101<nedan)nedan=9100+70*(nedan-100); { printf("林檎の値段は%d円です。\n"); } } 条件の変え方が今一分かりませんでした。 よろしくお願いします。
>>503 10個で100円=1000円
11個で90円=990円
こうなって良いかい?
505 :
504 :2009/05/31(日) 20:28:25
あ、違うようだな。すまん。
506 :
504 :2009/05/31(日) 20:48:22
>>503 #include <stdio.h>
int main()
{
int kosuu,nedan;
printf("林檎を何個買いますか?\n"); scanf("%d", &kosuu);
if(kosuu<=10) {
nedan=100*kosuu; printf("林檎の値段は%d円です。\n",nedan);
} else if (10<kosuu && kosuu<=100) {
nedan=1000+90*(kosuu-10); printf("林檎の値段は%d円です。\n",nedan);
} else if(100<kosuu) {
nedan=9100+70*(kosuu-100); printf("林檎の値段は%d円です。\n",nedan);
}
return 0;
}
何個買うかの個数と、値段は別の変数にした方が良い。
「11個〜100個まで」の様に範囲を指定する時の比較式に注意
セミコロン";"が変なところにあった。
507 :
503 :2009/05/31(日) 20:54:49
>>506 ありがとうございました。
変数は2つでも大丈夫なんですね。勉強になります。
509 :
デフォルトの名無しさん :2009/05/31(日) 23:29:04
あ
510 :
489 :2009/05/31(日) 23:33:33
>>492 VC2008だと「using 〜」をmainの外に置かないとエラー出るみたいだな
511 :
デフォルトの名無しさん :2009/05/31(日) 23:36:04
1000Mバイト、一行1000バイト以下のテキストファイルをソートするプログラム。 メモリ使用量は30Mバイトまで。 高速な方がよい。
すみません、こんな問題でレスするのも気が引けたんですが、最近始めたばかりでわからないんです・・・誰か教えて下さい 以下のプログラムの◆の部分を埋めて完成させてください 掛け算の九九の偶数の段を表示するプログラム #include<stdio.h> int main(void) { int i, j; for(i = 2; ◆; i ◆ 2) { for(j = 1; j <= 9; ◆) printf("%d*%d=%2d ", ◆, ◆, i * j); putchar('\n'); } return 0; } 足し算、引き算、掛け算、割り算、余りの計算、表示するプログラム #include<stdio.h> int main(void) { printf("100 + 200 = %3d\n", ◆); printf(" 35 - 24 = %3d\n", ◆); printf(" 10 * 7 = %3d\n", ◆); printf(" 72 / 8 = %3d\n", ◆); printf("127 %% 17 = %3d\n", ◆); return 0; }
掛け算の九九の偶数の段を表示するプログラム #include<stdio.h> int main(void) { int i, j; for(i = 2; i<=9; i += 2) { for(j = 1; j <= 9; j++) printf("%d*%d=%2d ", i, j, i * j); putchar('\n'); } return 0; } 足し算、引き算、掛け算、割り算、余りの計算、表示するプログラム #include<stdio.h> int main(void) { printf("100 + 200 = %3d\n", 100+200); printf(" 35 - 24 = %3d\n", 35-24); printf(" 10 * 7 = %3d\n", 10*7); printf(" 72 / 8 = %3d\n", 72/8); printf("127 %% 17 = %3d\n", 127%17); return 0; }
>>514 ありがとうございます!本当に助かりました:;
あとすみません、2つ目の問題間違いました・・・
確認せずに書き込んじゃってすみません
変数に代入したデータを計算、表示するプログラム
#include<stdio.h>
int main(void)
{
int a = 10, b = 20, ◆;
kotae = ◆ + ◆;
printf("%d + ◆ = %d\n", ◆, b, kotae);
return 0;
}
ちゃんと勉強しないと・・・
>>511 面白そうだね。ああっ、興奮しちゃうね、これは。
もう少し詳しく聞かせてもらえないだろうか。
そのテキストファイルが、どのようなモノなのか。ファイルをheadした結果を貼ってもらってもいい。
比較関数は用意されているのか。それともこちらが用意するのか。
用意する場合は、どのような条件で大小あるいは等しいを決めるのか。
サンプルとして、1000MBのテキストファイルを提供していただけるのか。
言語は、C言語(ANSI X3.159 1989, ISO/IEC 9899 : 1999 (E)のいずれか準拠)が良いのか。C++が良いのか。
私は、C言語でないとやる気はしないけどね。
517 :
デフォルトの名無しさん :2009/06/01(月) 00:42:26
たとえば X・・・・、Y・・・・ (X,、Yは1バイト)ならば、(unsigned char)X < (unsigned char)Y のときX・・・の方が先になります。 途中まで一致する場合。 たとえば XとXYZならば、X00とXYZの比較をします。足らない桁は数字の0で埋めます。 言語はCでもC++でも可です。 テキストはうpは無理なので改行(\n)区切りのどんなテキストでも読み込め速いほど良いです。
>>517 X一文字の行とX000の行は区別が必要ですよね。
この辺はどうしますか?
strcmpに準じた比較にしますか?
>>518 つ「足らない桁は数字の0で埋めます。 」
やるなら再帰版のクイックソートで作りたい気がするが スタックがあふれそうだ。
521 :
デフォルトの名無しさん :2009/06/01(月) 01:39:07
0はバイナリの0です。最も小さい値です。テキストファイル中には出現しない物とします。
【質問テンプレ】 [1] 授業単元:C演習 [2] 問題文(含コード&リンク): (1) 適当な初期値を代入した整数型の5行5列の行列 A に対して、その転置行列 (行と列を入れ替えたもの)を B とする時,AB を求めよ。 但し、A の初期値を変えた場合も利用できる汎用的なプログラムであること。 (転置行列の各要素・ABの結果の値を直接代入するのはダメという意味) (2) 大きさ 5 の文字列配列を定義して、適当な文字列5つを代入し、代入した全ての 文字を1文字ずつ表示せよ。全ての文字とは、例えば、"Sunday" と "Monday" を代入した時は、 'S', 'u', 'n', 'd', 'a', 'y', 'M', 'o', 'n', 'd', 'a', 'y' をさす。 [3] 環境 [3.1] OS:Linux [3.2] コンパイラ名とバージョン:gcc [3.3] 言語: C [4] 期限: 6/1 17:00 [5] その他の制限: 配列、ポインタのところでのレポートでした。多分配列とかポインタを使うんだと思います。 基本的な事は一通り習いました、特に制限は無いです。よろしくお願いします
>>515 変数に代入したデータを計算、表示するプログラム
#include<stdio.h>
int main(void)
{
int a = 10, b = 20, kotae;
kotae = a + b;
printf("%d + %d = %d\n", a, b, kotae);
return 0;
}
麻呂の校門、封鎖できません!クソースが漏れそうです!
>>522 (2)
#include <stdio.h>
#include <string.h>
#define N 5
#define MAXLEN 128
int main(void)
{
char str[N][MAXLEN];
int i, j;
puts("文字列を5つ入力して下さい");
for (i = 0; i < N; i++) {
fgets(str[i], MAXLEN, stdin);
str[i][strlen(str[i]) - 1] = '\0'; /* 改行文字を取る */
}
for (i = 0; i < N; i++) {
for (j = 0; j < strlen(str[i]) - 1; j++)
printf("'%c', ", str[i][j]);
printf("'%c'\n", str[i][j]);
}
return 0;
}
[1] 授業単元:C言語入門 [2] 問題文(含コード&リンク):正の整数を入力させその整数以下の偶数を昇順で表示するプログラム [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: 不明 [3.3] 言語: C言語 [4] 期限: 6月1日24時まで [5] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々) #include <stdio.h> int main(void) { int i,no; printf("正の整数を入力してください:"); scanf("%d",&no); i=0; while(i<=no); printf("%d",i++); putchar('\n'); return 0; } 偶数ではなくすべての正の整数のところまではやったのですが 偶数限定にする方法がわかりません。
>>527 奇数だったら printf しない
もしくは
偶数だったら printf する
をループの中に埋め込むだけだが…
>>527 while 直後にセミコロンいて 正常に動作しないコードだぞw
極力元コードを保存した書き方だと
while (i<=no) {
if ((i%2) == 0) printf("%d", i);
i++;
}
こんなもん
# なお 0は偶数に含まれる としている
>>528 さんありがとうございます!
なぜかwhile文から書き込みがあったように変えたのですが
i++の列で不正な文字’ ’と表示されてしまいます;;
そのまんまコピペした? 全角スペース使ってるから 半角スペースとかTABとかにおきかえれ
置換ね^^
>>527 #include <stdio.h>
int main(void)
{
int i,no;
printf("正の整数を入力してください:");
scanf("%d",&no);
for(i=1;i<=no;i++){
if(!(i%2))
printf("%d \n",i);
}
return 0;
}
10 'main 20 dim i,no 30 input "正の整数を入力して下さい",no 40 for i=1 to no 50 if( i mod 2<>0)then print i 60 next i
>>528 すごく単純なことでした
それなのに丁寧なレスありがとうございした!
>>532 さんもありがとうございました!
このスレは連続で他の課題も聞いていいんですかね?
良いんじゃね
[1] 授業単元:C言語入門 [2] 問題文(含コード&リンク):整数値を入力して,その整数回「私の名前は○○です(1 回目) として,改行するプログラム.1回 目の1 は,2回目,3 回目と増やし,名前の部分は自分の名前にすること [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: 不明 [3.3] 言語: C言語 [4] 期限: 6月1日24時まで [5] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々) #include <stdio.h> int main(void) { int no; printf("正の整数を入力してください:"); scanf("%d",&no); while(no-->0) putchar('*'); putchar('\n'); return (0); } ※印を整数文表示させるプログラムまではできましたが 文字列をいれると「文字列定数は 1 文字か 2 文字でなければならない」とでてしまうことと 改行ができません;;
537 :
デフォルトの名無しさん :2009/06/01(月) 14:29:42
538 :
デフォルトの名無しさん :2009/06/01(月) 14:31:21
>>536 #include <stdio.h>
int main(void)
{
int no,count=0;
printf("正の整数を入力してください:");
scanf("%d",&no);
while(count++<no)
printf("私の名前は○○です(%d回目)\n",count);
return (0);
}
[1] 授業単元: 情報処理 [2] 問題文(含コード&リンク): 一人のデータが 学番 名前 国語 数学 英語 であるとき、不特定多数のデータを入力して、 各教科ごとの平均値、各人の成績計、その平均値を表示する。 入力データもまとめて後で表示する。 [3] 環境 [3.1] OS:WindowsXP [3.2] コンパイラ名とバージョン:TurboC++ [3.3] 言語: C++ [4] 期限: 2009年6月3日 [5] その他の制限:カウンターなるもの
>>539 の続きです。
#include<stdio.h>
#include<conio.h>
void main(void)
{ float x, s=0.0, aver;
int i, z, c=0;
for(i=0;i<100;i++)
{ z=scanf("%f",&x);
if(z==EOF)goto flag1;
s=s+x;
c=c+1;
}
flag1:
printf("データの個数は%d個",c);
printf("\nデータの合計は%f",s);
aver=s/(float)c; // この方法は一時的に型を変更する手法でキャストという
printf("\nデータの平均値は%f",aver);
getchar();
getchar();
}
このような形にして提出させるのが教授の意図のようです。
よろしくお願いします。
[1] 授業単元:Cプログラミング
[2] 問題文(含コード&リンク):
http://www.dotup.org/uploda/www.dotup.org85093.zip.html [3] 環境
[3.1] OS:Windows
[3.2] コンパイラ名とバージョン:VC 6.0
[3.3] 言語:C
[4] 期限:2009/06/12
[5] その他の制限:ポインタ・構造体まで使用可
パスワードは「c」です,お手数をおかけしてすみません.
課題内容についてはダウンロードしたファイルを見てください.
課題は全3題で,自分なりに考えてはみたのですが(やったところまでのファイルも入ってます),結局何をすればいいのか分からずに全くダメでした.
かなり面倒な課題だと思うのですが,よろしければお願いします.
>>541 no.1
#include <iostream>
using namespace std;
#define N_INPUT 5
int main()
{
int id;
int height;
int maxHeight = 0;
int maxHeightId = 0;
for(int i=0; i<N_INPUT; i++) {
cout << i+1 << "人目の学籍番号を入力:"; cin >> id;
cout << "身長を入力(cm):"; cin >> height;
if(maxHeight < height) {
maxHeight = height;
maxHeightId = id;
}
}
cout << endl;
cout << "一番背が高いのは" << maxHeightId << endl;
return 0;
}
>>541 no.1
>>543 は問題をちゃんと読んでなかった。OTZ
でもこれじゃ配列意味ないね。
#include <iostream>
using namespace std;
#define N_INPUT 5
int main()
{
int data[N_INPUT][2];
int maxHeight = 0;
int maxHeightId = 0;
for(int i=0; i<N_INPUT; i++) {
cout << i+1 << "人目の学籍番号を入力:"; cin >> data[i][0];
cout << "身長を入力(cm):"; cin >> data[i][1];
if(maxHeight < data[i][1]) {
maxHeight = data[i][1];
maxHeightId = data[i][0];
}
}
cout << endl;
cout << "一番背が高いのは" << maxHeightId << endl;
return 0;
}
>>541 no.2
#include <iostream>
#include <iomanip>
using namespace std;
#define N_INPUT 3
int main()
{
int data[N_INPUT][2];
float BMI[N_INPUT];
int i=0;
for(i=0; i<N_INPUT; i++) {
cout << i+1 << "人目の身長を入力(cm):"; cin >> data[i][0];
cout << "体重を入力(kg):"; cin >> data[i][1];
BMI[i] = ((float)data[i][1] * 10000) / (data[i][0] * data[i][0]);
}
cout << endl;
cout.width(6); cout << "番号";
cout.width(6); cout << "身長";
cout.width(6); cout << "体重";
cout.width(8); cout << "BMI" << endl;
cout.setf(ios::right, ios::adjustfield);
cout.setf(ios::showpoint);
for(i=0; i<N_INPUT; i++) {
cout.width(6); cout << i;
cout.width(6); cout << data[i][0];
cout.width(6); cout << data[i][1];
cout.width(8); cout << setprecision(4) << BMI[i] << endl;
}
return 0;
}
546 :
541 :2009/06/01(月) 20:21:56
>>544-
>>545 すみません。
どちらもなんですが、
2行目のusing namespaceという関数は習ってないのでもう少しシンプルになりませんでしょうか。
また、最初は#include<stdio.h>で始めていただけますでしょうか。
547 :
デフォルトの名無しさん :2009/06/01(月) 20:30:18
548 :
デフォルトの名無しさん :2009/06/01(月) 20:47:11
549 :
初者 :2009/06/01(月) 20:49:20
よろしくお願いします。 [1]C++ [2]締切:6/3 13:30 [3]問題文 @2つの4行4列の行列が与えられたとき、 その積を計算するプログラムをwhileループとインクリメント演算子を用いて作成しなさい。 (※ヒント whileループは行列をキーボードから入力するためにも用いる) A3項演算子として __ ? __ : __ が存在する。この演算子を用いて次のプログラムを作成しなさい。 (1)変数a,bをキーボードから入力し、小さいほうを出力するプログラム (2)変数a,b,cをキーボードから入力し、最小値を出力するプログラム Bwhileループと複合代入演算子を用いて、等差数列 1+3+5+7+・・・・・・+9999を計算するプログラムを作成しなさい。 CBのプログラムを実行した結果はいくらになるか? D型変換として、算術演算子のオペランドの一つがdoubleで、片方がintであれば、 int型のオペランドはdouble型に変換されて、計算される。 下記は例である。 int a; float b; a=(int)b また、下記のようにすると、 int a=5,b=3; float c,d; c=a/b; d=a/(float)b で値が異なる。 この値が異なることをプログラムを組むことによって確かめなさい。 Dに関して言うと問題文の意味すら理解不能なので、解説も頂けると幸いです。
>>546 ありえないとは言わないが、本当にC++なのか?
>>550 講義名をC++と銘打って入出力にstdio.hなんてよくあることだろ
駄目な理由があるのか?
>>541 no.1
#include <stdio.h>
#define N_INPUT 5
int main()
{
int data[N_INPUT][2];
int maxHeight = 0;
int maxHeightId = 0;
int i;
for(i=0; i<N_INPUT; i++) {
printf("%d人目の学籍番号を入力:", i+1);
scanf("%d", &data[i][0]);
printf("身長を入力(cm):");
scanf("%d", &data[i][1]);
if(maxHeight < data[i][1]) {
maxHeight = data[i][1];
maxHeightId = data[i][0];
}
}
printf("\n");
printf("一番背が高いのは%d\n", maxHeightId);
return 0;
}
552 :
鳥取の砂人 :2009/06/01(月) 21:03:58
【1】C++ 【2】締切:6/10 【3】問題文↓ T:2つの4行4列の行列が与えられたとき、その積を計算するプログラムをforループを用いて作成せよ。 (行列の成分はキーボードから入力するものとする) U:n!とnCmを計算するプログラムをdo while文とデクリメント演算子を用いて作成せよ。 (n!の変数n、nCmの変数n,mはキーボードから入力するものとする) よろしくです。
>>541 no.2
#include <stdio.h>
#define N_INPUT 3
int main()
{
int data[N_INPUT][2];
float BMI[N_INPUT];
int i=0;
for(i=0; i<N_INPUT; i++) {
printf("%d人目の身長を入力(cm):", i+1);
scanf("%d", &data[i][0]);
printf("体重を入力(kg):");
scanf("%d", &data[i][1]);
BMI[i] = ((float)data[i][1] * 10000) / (data[i][0] * data[i][0]);
}
printf("\n");
printf("番号");
printf(" 身長");
printf(" 体重");
printf(" BMI ");
printf("\n");
for(i=0; i<N_INPUT; i++) {
printf("%4d", i+1);
printf("%6d", data[i][0]);
printf("%6d", data[i][1]);
printf(" ");
printf("%.2f", BMI[i]);
printf("\n");
}
return 0;
}
10 option base 0:N_INPUT=3 20 dim Data(N_INPUT,2),BMI(N_INPUT) 30 for i=0 to N_INPUT-1 40 print i+1;"人目の身長を入力(cm):";:input "";data(i,0) 50 print "体重を入力(kg):";:input "";data(i,1) 60 BMI(i)=(data(i,1)*10000)/(data(i,0)*data(i,0)) 70 next 80 print 90 print "番号";:print "体重";:print("BMI") 100 for i=0 to N_INPUT-1 110 print using "#### ###### ######";i+1,data(i,0),data(i,1),BMI(i) 120 next
>>552 改行変だけど
#include <stdio.h>
#define LENGTH 4
void GetMatrix(int matrix[LENGTH][LENGTH]){ int x, y;
for (y=0; y<LENGTH; y++){
for (x=0; x<LENGTH; x++){
printf("x = %d, y = %d: ", x, y);
scanf("%d", &matrix[x][y]);
}
}
}
void PrintMatrix(int matrix[LENGTH][LENGTH]){ int x, y;
for (y=0; y<LENGTH; y++){
for (x=0; x<LENGTH; x++) printf("%d\t", matrix[x][y]);
printf("\n");
}
}
void MultiplyMatrix(int a[LENGTH][LENGTH], int b[LENGTH][LENGTH], int out[LENGTH][LENGTH]){ int x, y, z;
for (y=0; y<LENGTH; y++)
for (x=0; x<LENGTH; x++){
out[x][y] = 0;
for (z=0; z<LENGTH; z++) out[x][y] += a[z][y] * b[x][z];
}
}
void main(){ int matrixA[LENGTH][LENGTH] = {0};int matrixB[LENGTH][LENGTH] = {0};int matrixOut[LENGTH][LENGTH] = {0};
printf("行列Aを入力: \n"); GetMatrix(matrixA);
printf("\n行列Bを入力: \n"); GetMatrix(matrixB); printf("\n\n");
MultiplyMatrix(matrixA, matrixB, matrixOut);
PrintMatrix(matrixA); printf("*\n");
PrintMatrix(matrixB); printf("=\n");
PrintMatrix(matrixOut);
}
>>552 階乗
#include <stdio.h>
void main()
{
int n, i, v;
printf("階乗: ");
scanf("%d", &n);
i=1;v=1;
while (i<=n){
v*=i;
i++;
}
printf("%d! = %d", n, v);
}
[1] 授業単元:プログラミングC [2] 問題文(含コード&リンク): 無限ループを用い、1〜50までの数値を任意に10個入力し、その度数分布を求めよ。但し、度数分布は10等分(例;1〜10に4個, 11〜20に3個, 21〜30・・・41〜50に0個)して表示せよ。 [3] 環境 [3.1] OS:linux [3.2] コンパイラ名とバージョン: 不明 [3.3] 言語:C [4] 期限:6/4 [5] その他の制限:1〜50以外の数字が入力されたときの処理は考えなくていいそうです
558 :
鳥取の砂人 :2009/06/01(月) 22:13:02
>>555 ,556
printf,scanfを使わない方法でお願いしします。
cout,cinでお願いします。
>>552 組み合わせ
#include <stdio.h>
int CalcPermutation(int n, int m)
{
int i, v;
v = 1;
i = n;
while (i>m) {
v *= i;
i--;
}
return v;
}
void main()
{
int n, m, c;
printf( "n: " );
scanf( "%d", &n );
printf( "m: " );
scanf( "%d", &m );
c = CalcPermutation(n, m) / CalcPermutation(n - m, 1);
printf("%dC%d = %d", n, m, c);
rewind(stdin);
getchar();
}
>>558 記述方法に指定があるんなら始めから書いとけよ
561 :
545 :2009/06/01(月) 22:16:51
>>551 だめな理由はないが、先に書いておいてくれないと、
とても思いつかないな。
情報の後だし禁止って大分前に周知したつもりだったが、人が変わって忘れられたのかなぁ。
と、思ったら
>>1 に書いてあるじゃない。
>>・後から問題に付け足しするのはコラー!!です。付け足しは作業を無駄にしがちです。
気をつけようね♪
>>549 D
int同士の計算は整数なので小数点以下は切り捨てられる
5/3=1
10/3=3
計算のどちらか片一方がdoubleだと、doubleとしての計算になるから
5/3.0=1.6666666666666....
10/3.0=3.333333333333.....
上と比べて端数の分だけ値が違う
>>547 1
#include <stdio.h>
int main()
{
int i, n, max, sum;
printf("n: "); scanf("%d", &n);
printf("max: "); scanf("%d", &max);
sum = 0;
for(i=n;i<=max&&sum<=100;i+=n){
sum += i;
}
if(sum<=100) printf("sum=%d, less than 100\n", sum);
else printf("from %d to %d, sum=%d\n", n, i-n, sum);
return 0;
}
>>547 2
#include <stdio.h>
int main()
{
int i, j, n;
printf("n: "); scanf("%d", &n);
for(i=1;i<=n;i++){ for(j=0;j<i;j++) putchar('*'); putchar('\n');}
return 0;
}
/* putchar('*');がだめならprintf("*")に替えても可 */
568 :
567 :2009/06/01(月) 23:19:34
よろしくお願いします。
>>571 ただ単位量を足したり引いたりするだけの時は、前置演算子を使う癖を付けた方がいいよ。
最近入出力がprintfやscanfなのかcout、cinなのかを後出しするのが目立つ気がする C++だと両方とも使えるから質問テンプレにどっちなのかを書かせたほうがよくないか?
>>551 ,
>>553 有難うございます!
この前習った形に限りなく近いです。助かりましたm(_ _)m
575 :
123to :2009/06/02(火) 00:43:45
>>573 いいと思う。cout、cinってなに?な人向けになるだろうから
習ったのは#include <stdio.h>か#include <iostream>か書かせるほうがいいかも
さすがに#include <iostream.h>を教えてるところはもうないよな?
>>572 後置演算子になれてしまって修正が大変ですなぁ。
>>569 こんな感じで。動作は保障しない。
#include <stdio.h>
#include <string.h>
int main(){
char buf[1024];
char *p=NULL;
int Val[1024]={0,};
int V=0;
FILE *fp = fopen("seiseki.txt","rt");
if(fp ==NULL){
puts("can't open file");
return -1;
}
while(fgets(buf,1024,fp) != NULL){
p=strtok(buf," \n");
while(p!= NULL){
sscanf(p,"%d",&V);
//printf("%d ",V);
Val[V/10]++;
p=strtok(NULL," \n");
}
}
fclose(fp);
printf("30以上40未満 => %d個\n",Val[3]);
printf("70以上80未満 => %d個\n",Val[7]);
return 0;
}
>>564 #include<stdio.h>で始めてprintfやscanfを使用した形にしてはいただけないでしょうか?
後から制限を付け加える形になってしまい申し訳ありません。
よろしくお願いします。
580 :
547 :2009/06/02(火) 01:24:57
582 :
デフォルトの名無しさん :2009/06/02(火) 01:33:05
583 :
渋谷 :2009/06/02(火) 01:54:56
[1]C++ [2]締切:6/3 13:30 [3]問題文 以下の問題はprintf scanfを用いらず、cin coutを使用しなさい @2つの4行4列の行列が与えられたとき、 その積を計算するプログラムをwhileループとインクリメント演算子を用いて作成しなさい。 (※ヒント whileループは行列をキーボードから入力するためにも用いる) A3項演算子として __ ? __ : __ が存在する。この演算子を用いて次のプログラムを作成しなさい。 (1)変数a,bをキーボードから入力し、小さいほうを出力するプログラム (2)変数a,b,cをキーボードから入力し、最小値を出力するプログラム Bwhileループと複合代入演算子を用いて、等差数列 1+3+5+7+・・・・・・+9999を計算するプログラムを作成しなさい。 CBのプログラムを実行した結果はいくらになるか? D型変換として、算術演算子のオペランドの一つがdoubleで、片方がintであれば、 int型のオペランドはdouble型に変換されて、計算される。 下記は例である。 int a; float b; a=(int)b また、下記のようにすると、 int a=5,b=3; float c,d; c=a/b; d=a/(float)b で値が異なる。 この値が異なることをプログラムを組むことによって確かめなさい。 よろしくお願いします。
>>581 丁寧な説明までつけて下さって助かります。ありがとうございました。
[1] 応用クラス [3] 環境 [3.1] OS: Windows XP [3.2] Borland C++ Compiler 5.5 [3.3] Cのみ [4] 2009年06月04日16:00まで [5] 特になし ----- [2] アルファベットの置換 char x[2][26] = { "ETAOINSRHLDUCFMWYGPBVKXJQZ", // x "LCQEBFVXGAMHSPUJWYORTDZINK" // f(x) }; char a[] = { "(英文)"}; ランダムなアルファベットのデータ2つを使い、 全単射の変換をするのがプログラムの目的です。 (xの関係を用いてaを置換する。) 1対1の置換はうまくいくのですが、 うまく表全体を対応関係にすることが出来ません。 どうしたらうまく対応させて変換が出来ますか? よろしくお願いします。
ええ〜い、カレンダーの課題はまだでおじゃるか?
C++指定でstd::cin, std::coutを使わないという入出力制限は分かるが、 C++指定で #include <stdio.h> は普通に考えておかしくないか? せめて #include <cstdio> だろ?
>>585 #include <stdio.h>
#include <ctype.h>
void translate(unsigned char a[], const unsigned char from[26], const unsigned char to[26])
{
unsigned char map[256];
int i;
for(i=0;i<256;i++) map[i]=i;
for(i=0;i<26;i++) map[toupper(from[i])]=toupper(to[i]);
for(i=0;i<26;i++) map[tolower(from[i])]=tolower(to[i]);
for(i=0;a[i];i++) a[i]=map[a[i]];
}
int main(void)
{
char x[2][26] = {
"ETAOINSRHLDUCFMWYGPBVKXJQZ", // x
"LCQEBFVXGAMHSPUJWYORTDZINK" // f(x)
};
char a[]="This is a pen.";
puts(a);
translate(a, x[0], x[1]);
puts(a);
translate(a, x[1], x[0]);
puts(a);
return 0;
}
>>588 普通に考えてそのように勝手に標準化することがオカシイ
591 :
デフォルトの名無しさん :2009/06/02(火) 08:40:34
592 :
デフォルトの名無しさん :2009/06/02(火) 09:43:19
[1] 授業単元:プログラミングT [2] 問題文(含コード&リンク):本学の成績のつけ方は60点未満が「F」,70点未満が「C」,80点未満が「B」,90点未満が「A」,100点以下が「S」となる.キーボードから入力した点数に応じて画面に成績を出力するプログラムを作成せよ. [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: gcc 3.4 [3.3] 言語: C [4] 期限: 2009年6月5日9時まで [5] その他の制限: if else文とelse if文の2パターンをお願いします。 よろしくお願いします。
>>592 チェックしてないクソース
#include <stdio.h>
#include <stdio.h>
char seiseki( char *tokuten){
int n;
if(tokuten==NULL) exit(0);
n=atoi(tokuten);
if(n<60) return 'F';
if(n<70) return 'C';
if(n<80) return 'B';
if(n<90) return 'A';
return 'S';
}
int main(void){
char s[256];
for(;;) printf("%c",seiseki(fgets(s,256,stdin)));
return 0;
}
10 goto 90 20 if len(s)=0 then end 30 n=val(tokuten) 40 if n<60 c='F' :return 50 if n<70 c='C' :return 60 if n<80 c='B' :return 70 if n<90 c='A':return 80 c='S':return 90 input "";s:gosub 20:print c;:goto 90
if(n<60) return 'F'; else if(n<70) return 'C'; else if(n<80) return 'B'; else if(n<90) return 'A'; else return 'S'; でも動くよ
[1] 授業単元 C言語 [2] テキストファイルの4行目の文字を別のファイルに表示 例 テキストファイルに asdfg werty zxcvb ertyu ojh とあったら別のファイルに ertyuと表示 [3] 環境 [3.1] Window [3.2] VisualC++ [3.3]C [4] 期限: 6月3日
598 :
デフォルトの名無しさん :2009/06/02(火) 11:52:25
>>596 #include <stdio.h>
int main(void)
{
char buf[1024];
FILE *inf, *outf;
inf = fopen("file1.txt", "r");
fgets(buf, 1024, inf);
fgets(buf, 1024, inf);
fgets(buf, 1024, inf);
fgets(buf, 1024, inf);
outf = fopen("file2.txt", "w");
fprintf(outf, "%s", buf);
fclose(outf);
fclose(inf);
return 0;
}
>>599 課題1
void sort(int *a, int *b)
{
int tmp;
if(*a<*b){
tmp=*a;
*a=*b;
*b=tmp;
}
}
>>599 課題2で mult と mlut ってあるけど打ち間違いかな
>>601 すいません
打ち間違えましたmlutでお願いします。
>>600 どうもありがとうございます。
助かりました。
>>599 課題2
#include <stdio.h>
int mult(int *,int *);
int main(void)
{
int a[4]={1,2,3,4}, b[4]={4,3,2,1};
int i,sum=0;
for(i=0; i<4; i++)
{
sum+=mult(&a[i],&b[i]);
}
printf("答え:%d",sum);
return 0;
}
int mult(int *x,int *y)
{
return *x * *y;
}
604 :
デフォルトの名無しさん :2009/06/02(火) 13:32:35
[1] 授業単元: 数値解析プログラミング [2] 問題文: 以下の時に最小2乗法によりm次の多項式近似を行うプログラムを作成せよ プログラムにより得られた近似式についてはデータと合わせてプロットした グラフも作成する x=−2のときy=3.02 x=−1のときy=0.98 x=0のときy=1.22 x=1のときy=2.16 x=2のときy=2.61 [3] 環境 [3.1] OS: WindowsXP [3.2] よく分かりません [3.3] 言語: C [4] 期限: 6月5日まで [5] その他の制限: 特にありません よろしくお願いします
605 :
デフォルトの名無し :2009/06/02(火) 14:15:29
[1] 授業:C++ プログラミング [2]問題文: T.2つの4行4列の行列が与えられたとき、 その積を計算するプログラムをwhileループとインクリメント演算子を用いて作成しなさい。 (※ヒント whileループは行列をキーボードから入力するためにも用いる) U.3項演算子として __ ? __ : __ が存在する。この演算子を用いて次のプログラムを作成しなさい。 (1)変数a,bをキーボードから入力し、小さいほうを出力するプログラム (2)変数a,b,cをキーボードから入力し、最小値を出力するプログラム [3]環境 OS:WindowsXP 言語:C++ [4]期限:6/4 01:00 [5]その他の制限:printf scanfではなくcout cinでお願いします。
606 :
デフォルトのnanasisan :2009/06/02(火) 14:25:11
[1]授業:プログラミング [2]問題文: T.whileループと複合代入演算子を用いて、 等差数列 1+3+5+7+・・・・・・+9999を計算するプログラムを作成しなさい。 U.Tのプログラムを実行した結果はいくらになるか? [3]環境 1.OS:WindowsXP 2. 3.言語:C++ [4]期限:6/3 16:00 [5]その他の制限:printf scanfではなくcout cin
>>606 #include <iostream>
#include <iomanip>
int main(void){
int sum=0,i=0,n=0;
while( (n=2*(i++)+1)<=9999 ) sum+=n;
cout << sum <<endl;
return 0;
}
こんなの動かすまでもなく
1+3+5+7+...+9999
=
9999+9997+....+1
和の2倍=(1+9999)+(3+9997)+(5+9995)+...(9999+1)
=10000*5000/2=25000000
int sum=0,n=1; while( (n=n+2)<=9999 ) sum+=n; としなかったのは趣味の問題
おまっ、糞って書いちゃ駄目だろ・・・あくまでもソースにクを付けて そことなく言い回すから良いんじゃねーかYO!
610 :
デフォルトのnanasisan :2009/06/02(火) 16:10:10
>>606 ありがとうございます。
もう一つお願いします。
[1]授業:プログラミング
[2]問題文:
型変換として、算術演算子のオペランドの一つがdoubleで、片方がintであれば、
int型のオペランドはdouble型に変換されて、計算される。 下記は例である。
int a;
float b;
a=(int)b
また、下記のようにすると、
int a=5,b=3;
float c,d;
c=a/b;
d=a/(float)b
で値が異なる。 この値が異なることをプログラムを組むことによって確かめなさい。
[3]環境
1.OS:WindowsXP
2.
3.言語:C++
[4]期限:6/3 16:00
[5]その他の制限:printf scanfではなくcout cinで
611 :
591 :2009/06/02(火) 16:15:23
>>610 こういうこと?
#include <iostream>
using namespace std;
int main()
{
int a = 5;
int b = 3;
float c, d;
c = a/b;
d = a/(float)b;
cout << "c is " << c << endl;
cout << "d is " << d << endl;
return 0;
}
>>605 II-(1)
#include <iostream>
using namespace std;
int main()
{
int a,b;
cout << "input a=";
cin >> a;
cout << "input b=";
cin >> b;
cout << "小さいのは" << ((a < b) ? "a=" : "b=") << ((a < b) ? a : b) << "です" << endl;
return 0;
}
II-(2)
#include <iostream>
using namespace std;
int main()
{
int a,b,c;
cout << "input a=";
cin >> a;
cout << "input b=";
cin >> b;
int minValue = (a < b) ? a : b;
cout << "input c=";
cin >> c;
minValue = (c < minValue) ? c : minValue;
cout << "最小値は" << minValue << "です" << endl;
return 0;
}
614 :
デフォルトのnanasisan :2009/06/02(火) 16:55:29
>>612 ありがとうございます。
もう一つだけお願いします。605に全く同じ問題がありますが。。。
[1]授業:プログラミング
[2]問題文:
T.2つの4行4列の行列が与えられたとき、
その積を計算するプログラムをwhileループとインクリメント演算子を用いて作成しなさい。
(※ヒント whileループは行列をキーボードから入力するためにも用いる)
U.3項演算子として __ ? __ : __ が存在する。この演算子を用いて次のプログラムを作成しなさい。
(1)変数a,bをキーボードから入力し、小さいほうを出力するプログラム
(2)変数a,b,cをキーボードから入力し、最小値を出力するプログラム
[3]環境
1.OS:WindowsXP
2.
3.言語:C++
[4]期限:6/3 16:00
[5]その他の制限:printf scanfではなくcout cinで
616 :
デフォルトのnanasisan :2009/06/02(火) 17:17:58
>>615 型??分かりません。
課題のプリントには『配列と呼ばれる箱を用いると便利である。』と書いてありますが。。。
>>614 I
#include <iostream>
using namespace std;
#define N 4
typedef int ELEMENT;
void matXmat(ELEMENT result[N][N], ELEMENT a[N][N],ELEMENT b[N][N]) {
int i = 0;
while(i<N) {
int j = 0;
while(j<N) {
int k = 0;
while(k<N) {
result[i][j] += a[i][k] * b[k][j];
++k;
}
++j;
}
++i;
}
}
void initMatrix(ELEMENT target[N][N]) {
int j = 0;
while(j<N) {
int i = 0;
while(i<N) {
target[i][j] = 0;
++i;
}
++j;
}
}
>>614 I 続き
void createMatrix(ELEMENT target[N][N]) {
int j = 0;
while(j<N) {
int i = 0;
while(i<N) {
cout << "element(" << i << ", " << j << "):"; cin >> target[i][j];
++i;
}
++j;
}
}
void printMatrix(ELEMENT target[N][N]) {
int j = 0;
while(j<N) {
int i = 0;
while(i<N) {
cout.width(6);
cout << target[i][j];
++i;
}
cout << endl;
++j;
}
}
>>614 I これで終わり。全部で3つ。
int main() {
ELEMENT result[N][N], matrixA[N][N], matrixB[N][N];
initMatrix(result);
cout << "行列Aの入力" << endl; createMatrix(matrixA);
cout << "行列Bの入力" << endl; createMatrix(matrixB);
matXmat(result, matrixA, matrixB);
printMatrix(result);
return 0;
}
計算結果については確認してないのでちゃんと確認して下さい。
型が分からないと言うことでしたので、typedefで書いておきました。
intじゃなくてdoubleなら、typedef のint をdoubleにすればOKです。
621 :
デフォルトのnanasisan :2009/06/02(火) 19:17:19
614です。 Uをお願いします。。。。。
622 :
デフォルトの名無しさん :2009/06/02(火) 19:21:36
>>614 >>621 U(1)
#include <iostream>
using namespace std;
void main() {
int a, b, min;
cout << "a: ";
cin >> a;
cout << "b: ";
cin >> b;
min = a < b ? a : b;
cout << min;
}
U(2)
void main() {
int a, b, c, min;
cout << "a: ";
cin >> a;
cout << "b: ";
cin >> b;
cout << "c: ";
cin >> c;
min = a < b ? a : b;
min = min < c ? min : c;
cout << min;
}
625 :
デフォルトのnanasisan :2009/06/02(火) 20:44:33
>>623 ありがとうございました。
失礼します。
>>621 605に同じ問題があるといいながら、その解答は見ないのか・・・
627 :
585 :2009/06/02(火) 22:42:22
>>589 回答ありがとうございます。
1回ずつ置換するのではなく、
対応mapを作った後に一気に置換するとは…。
非常に参考になりました。
待っとれ〜麻呂が
>>585 に別解のクソースをしんぜよう
ていうか、問題文のコレ char x[2][26] = { "ETAOINSRHLDUCFMWYGPBVKXJQZ", // x "LCQEBFVXGAMHSPUJWYORTDZINK" // f(x) }; 終端の\0が溢れてないか?
>>629 \0は入らないし、この使い方なら要らない。
というのは嘘っぽくて、処理系依存だと思う 文字列リテラルを文字配列初期化に使えるというのは便法というかシンタックスシュガー。 調子に乗って使い回してると落とし穴がありそうなんで、 char x[]={'a','b','c,','d','¥0'}; とか一文字一文字丁寧に初期化したいもの。 (漢字仮名まじりの場合は苦労するが)
>>631 この記述が文法上許されなくなると、
困るところが大量に出てくるな。
>>632 JavaとかC#とか新し系の言語では使えると明記されており
心配は無さそうだし、Cでもこれが使えないコンパイラは先ず
普通は使われないだろなw(使えるとしても
>>629 のような
場合で終端の¥0を巧く解釈してくれるのかどうかは確証でき
ないが)
組み込み系とかのマイナーでConservativeなC処理系では
ひねくれた(が、本当はこっちがまともなのかも知れない)
解釈に固執してて困惑するかも知れないと思ってついつい
説教地味ちまったが気にしないでくれ
634 :
デフォルトの名無しさん :2009/06/03(水) 00:07:54
635 :
デフォルトの名無しさん :2009/06/03(水) 00:09:53
宿題がむずかしくて、、、 [1] 授業単元: プログラミング [2] 問題文(含コード&リンク):コマンドライン上の括弧文字列を読み込んで、左括弧と右括弧が釣り合ってるか(整合しているか)どうかを判定し、釣り合っている場合には 対応する括弧対に番号付けして出力するようなプログラムを作成せよ。 例: 入力 [ [ ] [ [ ] ] ] [ ] 出力 [ 1[2 ]2 [3 [4 ]4 ]3 ]2 [5 ]5 ヒント:右括弧、左括弧それぞれに対して各スタック操作(プッシュ、ポップ)を対応させる。 文字入力にはgetchar()もしくはそれと同様な関数を呼び出す。 [3] 環境 [3.1] OS:Linux [3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等) [3.3] 言語:C [4] 期限: 2009年6月3日AM6:00まで [5] その他の制限:特になし 今スタックやリストを習っているので、それらを使うのかなと思います、、、 自分がそれらをよく理解できてないのもあるのですが、、、 お願いします!!!!
char x[26] memcpy(x, "ETAOINSRHLDUCFMWYGPBVKXJQZ", 26); 文法上正しいのはこうか?
色々と実験して試してみるのが一番かと... パイオニアな言語はいい意味でも悪い意味でも 後付けで色々と規則が修正されることが多く、規則と現実が合わない ことのほうが多いだろうから...
>>635 stackて書いてあるからC++でやってみたけど
Cで自分でstack作れって課題なのかな
#include <iostream>
#include <stack>
#include <sstream>
using namespace std;
int main(int argc, char* argv[])
{
if (argc!=2) return 1;
ostringstream buf;
char* src = argv[1];
int count = 1;
stack<int> countStack;
while (*src!='\0') {
buf << *src;
if (*src=='[') {
buf << count;
countStack.push(count);
count++;
}
else if (countStack.size() > 0 && *src==']') {
buf << countStack.top();
countStack.pop();
}
src++;
}
cout << buf.str();
return 0;
}
641 :
デフォルトの名無しさん :2009/06/03(水) 01:21:40
>>628 麻呂の校門、封鎖されてクソースが漏れません!
ということで麻呂の奇麗なソースを期待
644 :
585 :2009/06/03(水) 02:01:47
>>628-633 >>636-638 >>642-643 なんかいろいろと波紋をよんでおりますねw
あまりNULL文字まで深く考えていませんでしたが、
一応当環境では正常に動作しているようです。
mapを要素数26個まで小さく出来ましたが、
プログラムが小汚くなりました(´・ω・`)
スマートなプログラムを書くのは難しいなぁ。
645 :
635 :2009/06/03(水) 02:13:53
これもわからないのですが、、、 [1] 授業単元: プログラミング [2] 問題文(含コード&リンク):1方向線上リストを使って、スタックを実現せよ。ただし、各記憶要素xは整数値をとるもの とする。 要素xをプッシュするpush(int x)、ポップしてその値を返すpop()、スタックが 空かどうかを判断し真偽値を返すempty()、ならびに現在のスタック内容全体を表示するshow()を用意する。 [3] 環境 [3.1] OS:Linux [3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等) [3.3] 言語:C [4] 期限: 2009年6月3日AM3:00まで [5] その他の制限:特になし
>>645 #include <stdio.h>
#define STACK_SIZE 100
int Stack[STACK_SIZE], StackDepth;
int push(int x){
if(StackDepth>=STACK_SIZE) return 0;
return (Stack[StackDepth++]=x,1);
}
int pop(void){
return (StackDepth<=0)?-1:Stack[--StackDepth];
}
void show(void){
int i;
for(i=StackDepth-1;i>=0;i--) printf(" %d", Stack[i]);
printf("\n");
}
int empty(void){
return (StackDepth<=0);
}
int main(void){
int i;
for(i=0;i<10 && push(i);i++);
show();
for(i=0;i<5 && !empty();i++) printf("pop()=%d\n", pop());
show();
while(!empty()) printf("pop()=%d\n", pop());
show();
return 0;
}
647 :
635 :2009/06/03(水) 03:09:47
>>646 ありがとうございます(T_T)
さっそくコンパイルしてみます!!
>>643 体力の限界を感じて、麻呂は引退するでおじゃっ
649 :
639 :2009/06/03(水) 07:06:41
へいよ #include "stdio.h" #define STACK_SIZE 100 int posStack = 0; int stack[STACK_SIZE]; void push(int val) { stack[posStack++] = val; } int pop() { return stack[--posStack]; } int main() { char c; int count; count = 1; while (true) { c = getchar(); if (c == '\0' || c == '\n') break; printf( "%c", c ); if (c=='[') { if (posStack >= STACK_SIZE) return 1; printf( "%d", count ); push(count); count++; } else if (posStack > 0 && c==']') { printf( "%d", pop() ); } } return 0; }
>>644 ヒント:
int f[];
for(i=0;x[0][i];i++)f[x[0][i]-'A']=i;
for(i=0;a[i];i++) a[i]=x[1][ f[a[i]] ];
がコアな処理
651 :
デフォルトの名無しさん :2009/06/03(水) 11:03:32
[1] 授業単元:Cプログラミング [2] 問題文(含コード&リンク):キーボードより文字列aと文字列bを入力し、 比較する(どちらが辞書並びで先かを表示する)プログラムを作れ。ただし、strcmp関数を用いてはならない 上記の出力結果及び検討も書け。 [3] 環境 [3.1] OS:WindowsVistaSP2 [3.2] Visual stdio2008 [3.3] 言語: C [4] 期限:2009年6月3日17時まで [5] その他の制限: できるだけ基本で
652 :
デフォルトの名無しさん :2009/06/03(水) 11:25:15
>>651 #include <stdio.h>
int main(void) {
char a[1024], b[1024];
char *p, *q;
int f;
printf("a: "); scanf("%s", a);
printf("b: "); scanf("%s", b);
p = a; q = b; f = 0;
while(*p && *q) {
if (*p < *q) { f = -1; break; }
if (*p > *q) { f = 1; break; }
p++; q++;
}
if (!f) {
if (!*p && *q) f = -1;
else if (*p && !*q) f = 1;
}
if (f < 0) printf("aが先\n");
else if (f > 0) printf("bが先\n");
else printf("aとbは同じ文字列\n");
return 0;
}
>>644 >>650 エコヒント
#include <stdio.h>
int main(void)
{
char x[2][27] = {
"ETAOINSRHLDUCFMWYGPBVKXJQZ", // x
"LCQEBFVXGAMHSPUJWYORTDZINK" // f(x)
};
char a[]="This is a pen.";
int i, f[27];
puts(a);
for(i=0; x[0][i]; i++) // 2 19 12 10 0 13 17 8 4 23 21 9 14 5 3 18 24 7 6 1 11 20 15 22 16 25
f[x[0][i]-'A'] = i;
for(i=0; a[i]; i++) {
if(a[i]>='A' && a[i]<='Z')
a[i] = x[1][ f[a[i]-'A'] ];
else if(a[i]>='a' && a[i]<='z')
a[i] = x[1][ f[a[i]-'a'] ]-'A'+'a';
}
puts(a);
return 0;
}
if (条件) .....; if( 条件 ) .....; はなるべく if (条件) ....; else if(条件) .....; ..... と加工 前者のほうがスマートでカッコイイかも知れないが、共有コードでは 不用意に(順序を変えられたりして)弄られるとトラブルを起こしやすい
>>652 ブレークするからOK。括弧Eとか関係ない。
if (条件A) .... if (条件B) .... 条件A、条件Bが両方とも同時成立する可能性がある場合 単純に else if に置き換えれば良い ってものでもないから注意
if(条件A && 条件B) .... else if(条件A && !条件B) ... else if(条件B && !条件A) .... としたいものだが さすがにプライベートなプログラミングメモ レベルでする奴は居ないだろw
>>657 if(条件A){
if(条件B) ...
else ...
}
else if(条件B)...
って書けよw
>>570 Del_Dataはまだ実装されてないですよね。それと、Add_Data、Change_Dataは、このままだと動かないと思います。
例えば、メニュー表示から「電話帳追記」を選んでも、既存のデータを読み込んでいない(あるいはデータが無い)。
だから、このままだとAdd_Dataは失敗しますね。
それで、基本的なロジックの組立て方について提案します。頻繁に行うファイルの入出力は一カ所にまとめた方が良いです。
例えば、このような関数を作り、ファイル操作はここで集中して処理する。
int ReadDataFile(TPbook teldata[10]);(戻り値は読込レコード数が都合が良い)
int WriteDataFile(TPbook teldata[10], int kensu);
Disp_Dataなどファイルから読込んでいる部分は、この関数呼出に変える。
Add_Dataでは、配列ではなく入力用のTPbook構造体を追加し、Input_Dataをその構造体に対して行う。
'Y'を選択したとき、全レコード読込をReadDataFileを介して実行する。
読み込んだTPbook構造体配列の有効レコードの次に、入力した構造体をコピーする。
登録レコード数+1を新たなレコード数とする。
有効なTPbook構造体配列をWriteDataFileによりファイル出力する。
Change_Dataでは、Add_Data同様に入力用構造体を用意する。Input_Dataをその構造体に対して行う。
'Y'を選択したとき、全レコード読込をReadDataFileを介して実行する。
読み込んだTPbook構造体配列の更新対象のレコードに対して、入力したTPbook構造体を上書きする(構造体同士の代入で可能)。
登録レコード数は変わらないので、そのまま。有効なTPbook構造体配列をWriteDataFileによりファイル出力する。。
Del_Dataでは、選択したレコード詳細を表示する。'Y'を選択したとき、全レコード読込をReadDataFileを介して実行する。
読み込んだTPbook構造体配列の更新対象のレコードに対して、削除指定したレコード以降に対して、次レコードを上書きしていく。
登録レコード数を−1する。有効なTPbook構造体配列をWriteDataFileによりファイル出力する。
>>570 続き
Change_DataやDel_Dataを実行した場合は、レコードを再度読み直すようにしないと
データの表示内容が不正になるかもしれません。
その他気になること。処理自体には関係ないかもしれませんが、綴り誤りは直しておいたほうがいいですね。
adless[MAX_ADDLESS]とか、 namber
入力値チェック、任意ファイル名で出力は、改めて質問してください。
>>657 が一番正規性が高い。コードの共有度が高い(=不特定多数に晒す)
場合の書き方はこれが基本
次いで
>>658 の書き方。
if単文の連接で書く(再利用性の高い)コードは、本来は(相手の
レベルを見ずに)晒すべきコードじゃない
662 :
デフォルトの名無しさん :2009/06/03(水) 12:55:53
>>511 は、一番時間かかりそうなのは、ソートよりもディスクアクセスだな。
シーケンシャルリードで、情報収集してそのデータを使い大まかなソートして
そのあと、ランダムアクセスして並び替えを完了したいところだが
ランダムアクセス(とデータの書き込み)の部分が相当かかる。
663 :
デフォルトの名無しさん :2009/06/03(水) 12:59:04
n行目は、どこに配置するか調べておき、シーケンシャルリード、ランダムライトする方が早そう。 ライトの方はキャッシュに蓄えられるだろうという考え。 ランダムリードだと実際にデータが入ってこなければ進めない。
>>552 (C++) n!とnCmを計算する。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9320.txt >>557 #include <stdio.h>
//#include <stdlib.h>
#define N 10 /* 入力するデータの個数 */
int main() {
int i, r;
int dosuu[10];
// srand((unsigned int)time(0));
for(i=0; i<10; i++) dosuu[i] = 0;
for(i=0; i<N; i++) {
scanf("%d", &r);
// r = rand()%50 + 1; /* 1 〜 50 */
dosuu[(r-1)/10]++;
}
puts(" 度数分布");
for(i=0; i<10; i++) printf("%2d〜%2d:%2d 個\n", i*10+1, (i+1)*10, dosuu[i]);
return 0;
}
>>511 をやる人がいるならオレも参加する
とりあえずデータ生成はこれでいってみる
#include<stdio.h>
#include<stdlib.h>
#define FILESIZE_MAX (1<<30)
int main(void){
long filesize;
char buf[1000+1];
int i, len;
char *filename="1000MB.txt";
FILE *fp;
fp=fopen(filename, "w");
if(fp==NULL) return 1;
for(filesize=0;filesize<FILESIZE_MAX;filesize+=len+2){
len=rand()%1000+1;
for(i=0;i<len;i++) buf[i]=rand()%(0x7d-0x21+1)+0x21;
buf[i]='\0';
fprintf(fp, "%s\n", buf);
}
fclose(fp);
return 0;
}
667 :
567 :2009/06/03(水) 17:23:58
>>622 サービス問題 問3
#include <iostream>
using namespace std;
int main(int argc, char *argv[]) {
int l1, l2;
if(argc != 3) {
cout <<"Argument Error: Usage: prog1 string1 string2\n";
return 1;
}
l1 = strlen(argv[1]);
l2 = strlen(argv[2]);
if(l1 > l2)
cout <<argv[1] <<endl;
else if(l1 < l2)
cout <<argv[2] <<endl;
else
cout <<"There are same length:" <<l1 <<endl;
return 0;
}
6/2 19:21 => 6/3 12:00 (あと2問もあるのに半日も時間がない)
>>657 ってAとBがともに真なとき以外は
>>658 の書き方より真偽の判定回数多くなると思うんだけど、
そういうのが正規的な表現なの?
670 :
665 :2009/06/03(水) 18:34:34
>>511 できた
1073742119 bytes のファイル
CPU CoreDuo T2400 1.83GHz
HDD 2.5" 60GB SATA HDD
OS WindowsXP SP3 32bit
コンパイラ gcc3.4.5 (mingw special)
にて 807秒 かかった
CPU使用率はさほど高くなくIO律速だと思われる
どう考えても 判定回数が最小になるように、同じ判定が複数個所に散らばらないように書くよな if(条件A && 条件B) .... else if(条件A && !条件B) ... else if(条件B && !条件A) ↑ これとか完全に無駄な判定あるし if(条件A && 条件B) .... else if(条件A) ... else if(条件B) せめてこうだろ
673 :
デフォルトの名無しさん :2009/06/03(水) 18:51:12
>>670 コード貼り付けないとわからん。 適当な事書いてるのと変わらない
675 :
665 :2009/06/03(水) 18:56:28
>>673 他の人がやってくれたらソースも貼るよ
ヒープ使用は 30MB 未満
中間ファイルのサイズは元ファイルの二倍
676 :
デフォルトの名無しさん :2009/06/03(水) 18:57:46
>>666 ありがとうございます。
けっこう大量に問題があるのでピンチなんです・・・
677 :
デフォルトの名無しさん :2009/06/03(水) 19:02:06
[1] 授業単元:プログラミング [2] 問題文(含コード&リンク):キーボードから英数字、記号の系列を入力し、 文字とその文字が連続する回数(文字−連続する回数)の系列に変換するプログラム。 [3] 環境 [3.1] OS:UNIX [3.2] コンパイラ名とバージョン:g++ [3.3] 言語:C++ [4] 期限: 6月5日まで [5] その他の制限: 入出力はcout、cinを用いる。 入力の終了は、改行してEOF。 スペースは無視されるものとする。 使える型はint、char。使えるincludeはiostreamのみ。 使える文は、for、while、ifのみ。 自分で書いたところまでは載せますので追記、改変してくださっても結構です。 宜しくお願いします。
>>678 #include <iostream>
using namespace std;
int main()
{
char a,b=EOF;
int i=1,j=0;
while(1){
if(j != 0){
cout << b << '-' << i << ' ';}
while(1){
cin >> a;
if(a = b)i++;
if((a != b) && (j!=0)){
b=a; i=1; break;}
if(j==0){
j==1; b==a; }}}
cout << "Completed" << endl;
return 0;
}
こんな感じに考えたのですが、EOFしても何もおきませんし、多分スペースまでカウントされてしまう・・・。
どなたかお願いします。
宣言文使っちゃいけないんですか!
#include <iostream> using namespace std; int main() { int set[256]; for ( int i = 0; i != 256; ++i ) { set[i] = 0; } char in; while( cin >> in ) { ++set[in]; } for ( int i = 0; i != 256; ++i ) { if ( set[i] != 0 ) { cout << "'" << static_cast< char >( i ) << "'*" << set[i] << "\t"; } } return 0; } // cin はもともとスペースやタブなんかの区切り文字を無視するから特別な処理はいらないよ★ // っていうか、もともとスペースは英数字や記号に入ってないからカウントしないしー
ところで、マジックナンバーつかっちゃった★ 先頭で const int maxheart = 256; とでも書いて、 256 のところは全部 maxheart に置き換えてね♥
>>678 なんか問題文がイマイチわかりにくいんだけど
RunLengthみたいな読み方すれば良いって事?
aaaabbccccc
↓
a-4 b-2 c-5
みたいに
678あたりだともうそろそろコードが上がってきても良い頃なのだが...
>>683 はい、ランレングスです。
表記もまさにその通りです。
#include <iostream> int main() { int i, j; char str[256]; std::cin >> str; for(i=0; str[i];) { char temp = str[i]; for(j=1; str[i+j]==temp; j++); std::cout << temp << '-' << j << std::endl; i += j; } }
[1] C初心者コース [2] コマンドラインからN(1~99)の数値文字列を与える。(指定ない場合 異常な場合は5と解釈)下のような数のトグロを表示するプログラム を作れ。右回り、左回りの両方とも出るようにする。 L=1 R=1(N=1) 12 21N=2) 43 34 123 321(N=3) 894 498 765 567 01020304 04030201(N=4) 12131405 05141312 11161506 06151611 10090807 07080910 [3]Windows XP/Visual C++6.0/C 制限:再帰呼び出し(間接を含む)は使用禁止だそうです。 [4]明日中 難しくて手が出ません。Help!!です
689 :
687 :2009/06/03(水) 20:56:03
まだあった制限を書き忘れました。 制限:出力する文字をメモリに記憶しておいてから出力する方式は禁止 だそうです。
記憶できないと一気に難易度あがるな
691 :
687 :2009/06/03(水) 21:55:00
自己解決しました。 皆で手分けしてN=99までファイルにテキストエディターで回答テキストファイル (solution_xx.txt xxはNを2桁で表したもの) を作り、単にそれをコンソール出力するだけでOKだと、先輩の情報筋から 情報を得ました。(要するにトンチだそうです。) お騒がせしました。
なんだよ、せっかく記憶なしで書けそうだったのにw
>>678 #include <iostream>
using namespace std;
#define BUF_SIZE 8192
void main()
{
int count = 1;
char line[BUF_SIZE];
while(true){
if (!cin.getline(line, BUF_SIZE)) break;
char* cur = line;
while (*cur) {
char* next = cur + 1;
if (*cur != ' ' && *cur != '\t') {
if (*next == '\0' || *cur!=*next) {
cout << *cur << '-' << count << ' ';
count = 1;
}
else {
count++;
}
}
cur++;
}
cout << endl;
}
cout << endl << "Completed" << endl;
}
うーん。
>>686 のやり方の方がスマート。
Accelerated C++にも同じ手法が出てきたけど
内部の for 文で外の for 文のインデックス値を動かすという定石パターンですな。
表記のスマートさと価値観がマッチするのはCPU周辺部分だけ。 大抵の場合スマートに表記されているコードはコンピュータの場 合有害無益な処理であることが多い。
一般的にはごもっともない件だけど
>>693 は一時変数が多い分、
>>686 よりもイマイチなのは確か。条件分岐も多い。
なにより、C++で何ゆえdefine…。サッター先生が全力でしごけって怒ってるw
>>687 頑張ってみた
#include<stdio.h>
#include<stdlib.h>
int get_num(int n, int x, int y){
int dx, dy, d, i, offset=1, ret=-1;
dx=(x>n-1-x)?n-1-x:x;
dy=(y>n-1-y)?n-1-y:y;
d=(dx>dy)?dy:dx; // (x,y) は d 周目上にある
for(i=0;i<d;i++){
offset+=(n-1)*4; // offset は d 周目渦巻きの左上の数値
n-=2;
}
x-=d; y-=d; // (x,y) を d 周目左上 (d,d) からの相対座標に変換
if(y==0) ret=offset+x; // 上辺
else if(x==n-1) ret=offset+(n-1)+y; // 右辺
else if(y==n-1) ret=offset+(n-1)*3-x; // 底辺
else if(x==0) ret=offset+(n-1)*4-y; // 左辺
return ret;
}
int main(int argc, char *argv[]){
int n=5, fmt_width, x, y;
char tmp[20];
if(argc==2) n=atoi(argv[1]);
fmt_width=sprintf(tmp, "%d", n*n);
for(y=0;y<n;y++){
for(x=0;x<n;x++) printf("%0*d", fmt_width, get_num(n, x, y));
printf(" ");
for(x=n-1;x>=0;x--) printf("%0*d", fmt_width, get_num(n, x, y));
printf("\n");
}
return 0;
}
つーか
>>686 細かい要件満たして無いじゃん
EOF判定して無いじゃん
スペース無視がスペースまでの処理になってんじゃん
256とかマジックナンバー使ってんじゃん
各(x, y)はO(1)で求められないとなぁ
してないね。
読み出し部分は
>>693 で、集計部分は
>>686 だろな。
あと、#defineはconstで置き換える。
結論としては、こまけーことは…
前にここで投稿したやつでもいいなら for(i=0;i<d;i++){ offset+=(n-1)*4; // offset は d 周目渦巻きの左上の数値 n-=2; } でも、ここ等差数列の和の式に直せばO(1)になるね
今日のスレは熱いですねw
>>622 問1 期限過ぎたようだ。
#include<iostream>
#include<string>
using namespace std;
class Student {
string name;
int math;
int sci;
int eng;
public:
Student(string n, int m, int s, int e);
string getname();
double calAverage(int s);
friend double calMathAverage(int s, Student sta[]);
};
Student::Student(string n, int m, int s, int e){
name=n; math=m; sci=s; eng=e;
}
string Student::getname(){
return name;
}
double Student::calAverage(int s){
return (math+sci+eng)/(float)s;
}
double calMathAverage(int s, Student sta[]){
int i, t=0;
for(i=0; i<s; i++)
t += sta[i].math;
return t/(float)s;
}
//(3)ここを埋めて、Studentクラスの配列starray[]に3人の学生データを格納せよ。
Student starray[size] = {a, b, c};
712 :
デフォルトの名無しさん :2009/06/04(木) 01:03:32
>>668 >>711 ありがとうございます!!
今日、自分で考えても結局わからなくて、何気なく来てみたら・・・感謝です。
期限過ぎましたが、まだ提出はできるので、あと1問力を貸していただけるとありがたいです。
714 :
デフォルトの名無しさん :2009/06/04(木) 01:18:55
[1] 授業単元:情報処理 [2] 問題文(含コード&リンク): 以下のような九九表を出力するプログラムを作成せよ。 1 2 3 4 5 6 7 8 9 2 4 ... ... 9 18 27 ... 81 [3] 環境 [3.1] XP [3.2] コンパイラ名とバージョン: gcc [3.3] 言語:C [4] 期限:明日
715 :
デフォルトの名無しさん :2009/06/04(木) 01:22:17
>>714 です。
すいません、表なのに書き方がまずかったです;
81が上の9のちょうど下になるようにするべきでした;
>>714 #include <stdio.h>
int main(int argc, char* argv[])
{
int i, j;
for (i = 1; i <= 9; i++) {
for (j = 1; j <= 9; j++) {
printf("%3d ", i*j);
}
printf("\n");
}
return 0;
}
719 :
デフォルトの名無しさん :2009/06/04(木) 03:34:52
[1] 授業単元: 情報処理 [2] 問題文(含コード&リンク): 2次元配列に格納されている4次正方行列A=[aij](i,j=0,1,2,3;要素は実数)において、 a00+a11+a22+a33 及び、a03+a12+a21+a30 を求めて表示せよ。 ただし、上記の和はfor文による繰り返しにより記述すること。 計算に先立ち、行列の各要素の値はキーボードより、以下のように入力すること。 a00・・・a03=1.02.03.04.0 a10・・・a13=5.06.03.12.0 a20・・・a23=1.32.59.04.3 a30・・・a33=1.32.59.04.3 [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: Visual C++ [3.3] 言語: C [4] 期限: 2009年6月5日12:30まで [5] その他の制限: なし。 お願いします。
>>720 #include <stdio.h>
int main()
{
int i, j;
double a[4][4];
double sum;
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
scanf("%lf", &a[i][j]);
}
}
sum = 0.0;
for (i = 0; i < 4; i++) {
sum += a[i][i];
}
printf("a00+a11+a22+a33 = %f\n", sum);
sum = 0.0;
for (i = 0; i < 4; i++) {
sum += a[i][3-i];
}
printf("a03+a12+a21+a30 = %f\n", sum);
return 0;
}
+--------------------------------------+ | 今から個人データを入力してもらいます | +--------------------------------------+ 入力する人数を設定してください(1〜10)> 1 *** 1人目のデータを入力してください *** ・苗字を入力してください(半角ローマ字)> asdsd_sad ・名前を入力してください(半角ローマ字)> dds_dsd ・年齢を入力してください(整数)> 24 ・身長を入力してください(小数第1位まで[160.5など])> 123.4 ・体重を入力してください(小数第1位まで[52.3など])> 67.4 +++ 個人データを確認します +++ [1人目] 氏名:asdsd_sad dds_dsd 年齢:24歳 身長:123.4cm 体重: 67.4kg BMI :44.3 [ レッツエクササイズ! ] *** 何かキーを押してください ***
BMI=18.5 以下、やせてます BMI=18.5 超え 25.0 未満、普通です BMI=25.0 以上、レッツエクササイズ! 式:BMI=体重(kg)/身長(cm)/身長(cm)*10000 >ではヨロシクお願いしますwww.
729 :
デフォルトの名無しさん :2009/06/04(木) 14:47:32
>>718 遅くなりましたが、どうもありがとうございます。とても助かりました。
730 :
デフォルトの名無しさん :2009/06/04(木) 15:08:48
732 :
デフォルトの名無しさん :2009/06/04(木) 15:20:10
>>730-732 replace呼ぶだけ
if(forallchar(str, isalpha)){
replace(str, str);
printf("%s\n", str);
...
734 :
デフォルトの名無しさん :2009/06/04(木) 15:28:15
735 :
723 :2009/06/04(木) 16:28:35
どなたかよろしくおねがいします
736 :
デフォルトの名無しさん :2009/06/04(木) 16:43:28
737 :
736 :2009/06/04(木) 16:45:26
[1] 授業単元:情報理論 [2] 問題文: 半角英数字及び半角の記号からなるテキストデータalice.txtがある。 このデータについて以下の計算をせよ。 アルファベット(半角英字で大文字(A-Z)と小文字(a-z)の区別なしで、a-zの26文字)の生起確率P(X)を計算しなさい。ただし、アルファベット以外の数字やその他の記号・空白は無視して詰めること。これを情報源Sとする。 更に情報源SのエントロピーH(S)を計算しなさい。また、26文字の生起確率が等確率である場合のエントロピーと値を比較しなさい。 [3.1] OS:Windows/Linux [3.2] コンパイラ名とバージョン:gcc [3.3] 言語:C [4] 期限:6/8 12:00 [5] その他の制限:特になし 宜しくお願いします。
739 :
デフォルトの名無しさん :2009/06/04(木) 17:29:06
[1] 授業単元:プログラミング演習 [2] 問題文(含コード&リンク): 1〜256文字の文字列を引数とし、最初の単語の文字数を返す関数wordを作成する(スペースはカウントしない)。 main関数においてターミナルから1〜256文字の文字列を読み込み、word関数を使って文字列Sの最初の単語を出力するプログラムを作成しなさい。 但し、スペースで区切れている箇所を単語の区切りとする。 [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン:gcc [3.3] 言語:C [4] 期限:6月10日 8:00 [5] その他の制限: 関数wordのプロトタイプは、int word(char *)とすること。 入力する文字列に2つ以上の連続したスペースはないとする。 入力する文字列の最初と最後はスペースでないとする。
>>723 (1)
double const pai = 3.141592653;
enum {
R_PERMISSION = 1,
W_PERMISSION = 2,
E_PERMISSION = 4,
S_PERMISSION = 8
};
inline int dbl(int x) // doubleは予約語なのでdblとしてあります
{
return x * 2;
}
(2)
double(3+4)は、2*3+4と展開され、10という誤った結果を得る。
正しくは
#define dbl(x) 2*(x)
741 :
デフォルトの名無しさん :2009/06/04(木) 17:43:42
[1] 授業単元:プログラミング演習 [2] 問題文(含コード&リンク):1〜256文字の文字列Sと単語Wを入力し、文字列Sの最初の単語がWであるときは文字列Sの先頭に*を付けたものを出力し、そうでないときはSをそのまま出力するプログラムを作成しなさい。 [3] 環境 [3.1] OS:Linux [3.2] コンパイラ名とバージョン:gcc [3.3] 言語:C [4] 期限:6月10日 8:00 [5] その他の制限:2つの単語が等しいときは1を、等しくないときは0を返す関数int compare(char *, char *)を作成して用いること。 入力する文字列に2つ以上の連続したスペースはないとする。 入力する文字列の最初と最後はスペースでないとする。
[1] 授業単元:C言語
[2] 問題文
このプログラムを実行しても結果がおかしくなります。修正をお願いします
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9349.txt [3] 環境
[3.1] OS: Windons
[3.2] コンパイラ名とバージョン:VisualC++
[3.3] 言語:C
[4] 期限:6月5日
[5] その他の制限:1次元配列を2次元配列にするものです。
たとえば 配列の要素数 4
配列の要素 1,2,3,4
行数 2
と入力したら
2次元配列{{1,2、}、{3,4}}となるようにするものです。
また 配列の要素数 6
配列の要素 {1,2,3,4,5,6、}
行数 2と入力したら
{{1,2,3、}、{4,5,6}}の2次元配列を作ります。
>>742 未確認だけど、ループへの再突入で初期化してないUFO.
for(i=0;i<gyou;i++){
/**/ tempretu=0;
for(j=0;j<retu;j++){
tempA++;
b[i][j]=a[tempA];
tempretu++;
}
tempgyou++;
}
744 :
つづき :2009/06/04(木) 18:10:38
for(i=0;i<gyou;i++){ for(j=0;j<retu;j++){ // tempA++; // b[i][j]=a[tempA]; b[i][j]=a[tempA++]; // tempretu++; } // tempgyou++; } for(i=0;i<gyou;i++){ // for(j=0;j=retu;j++){ for(j=0;j<retu;j++){ // printf("i行j列=%d\n",b[i][j]); printf("%d行%d列=%d\n",i+1,j+1,b[i][j]); } }
>>736-737 #include <stdio.h>
int main(void)
{
int i;
int a[10];
for (i = 0; i < 10; i++) {
scanf("%d", &a[i]);
}
for (i = 0; i < 10; i += 2) {
int tmp = a[i];
a[i] = a[i+1];
a[i+1] = tmp;
}
for (i = 0; i < 10; i++) {
printf("%d ", a[i]);
}
return 0;
}
>>687 >>689 >>691 >>700 やったよO(1)かつバッファ無し
#include <stdio.h>
#include <math.h>
int Project(int x, int y, int N) {
int dx, dy, ax, ay, length, level, side, phase, value;
dx = x * 2 - (N - 1); // 偶数奇数の差を吸収するために2倍の座標系
dy = y * 2 - (N - 1); // かつ対象領域の真ん中に原点
ax = abs(dx); ay = abs(dy);
length = ax > ay ? ax : ay; // 現階層の一辺の半分
level = (N + 1) / 2 - length / 2 - 1; // 何階層目か
if ( dy == -length ) { // 上
side = 0; // 何番目の辺か
phase = dx + length; // 辺の中の位置
}
else if ( dx == length ) { // 右
side = 1;
phase = dy + length;
}
else if ( dy == length ) { // 下
side = 2;
phase = length - dx;
}
else { // 左
side = 3;
phase = length - dy;
}
value = (N * N - (N-2*level) * (N-2*level)) * 2; // 現階層の初期値
value += side * length * 2 + phase + 2; // 階層内の移動
return value / 2; //1倍の系に戻す
}
747 :
デフォルトの名無しさん :2009/06/04(木) 18:37:51
[1] 授業単元:プログラミング演習 [2] 問題文(含コード&リンク):1〜256文字の文字列Sを入力し、それから単語Wを1つ入力する。 文字列Sが単語Wを含むとき、その単語の前にあるスペースに*を挿入するプログラムを作成しなさい。 但し、検索する単語Wが文字列Sの先頭にあるときは、S全体を1文字ずつずらし先頭に*を付ける。 [3] 環境 [3.1] OS:Linux [3.2] コンパイラ名とバージョン:gcc [3.3] 言語:C [4] 期限:6月10日 8:00 [5] その他の制限: 入力する文字列に2つ以上の連続したスペースはないとする。 入力する文字列の最初と最後はスペースでないとする。
748 :
746 :2009/06/04(木) 18:39:29
続き void main() { int x, y, N, digit; char format[] = "%_d"; scanf( "%d", &N ); if ( N<=0 || N>99 ) N = 5; digit = (int)log10((double)(N * N)) + 1; format[1] = '0' + digit + 1; // 表示桁数の指定 for (x=0; x<N; x++) { for (y=0; y<N; y++) { // x, y入れ替えると逆回り printf( format, Project(y, x, N) ); //printf( "%3d", Project(x, y, N) ); } printf("\n"); } }
>>741 #include <stdio.h>
int compare(char *s1, char *s2){
for(;*s1 && *s2 && *s1==*s2; ++s1, ++s2) ;
return !*s1 && !*s2 ? 1 : 0;
}
int main(){
char s[256+1] = {0}, w[256+1] = {0};
char *p, *pp = 0;
printf("文字列:");
scanf("%[^\n]", s);
printf("単語:");
scanf("%s", w);
for(p = s; *p; ++p){
if(*p == ' '){
*p = '\0';
pp = p;
break;
}
}
if(compare(s, w)) printf("*");
if(pp) *pp = ' ';
printf("%s", s);
return 0;
}
750 :
743 :2009/06/04(木) 19:02:23
[1] 授業単元: C言語 [2] 問題文:C言語で入力した年月日からその日の曜日を求めよ。 1980年以降から9999年まで 判定を行えるようにコーディングすること [3] 環境 [3.1] OS: WindowsXP [3.2] VB6 [3.3] C言語 [4] 期限: 2009/06/07まで [5] その他の制限: Zellerの定理は使わないこと。 stdio.h以外はinclude禁止 機能は細分化を行い関数化すること
752 :
743 :2009/06/04(木) 19:24:40
>>713 関係ない人は見なくてよろしい。差分のソース。
// char Id[5];
char Id[5+1];
//void add_student(List *ptr_ptr, char Id, int Eng, int Math, int Jap,int Total);
void add_student(List *ptr_ptr, char *Id, int Eng, int Math, int Jap,int Total);
// char identifier[5];
char identifier[5+1];
// add_student(&head, identifier[5], numE, numM, numJ, numT);
add_student(&head, identifier, numE, numM, numJ, numT);
//void add_student(List *ptr_ptr, char Id, int Eng, int Math, int Jap, int Total)
void add_student(List *ptr_ptr, char *Id, int Eng, int Math, int Jap, int Total)
// new_student->Id[5] = Id;
new_student->Id[0] = Id[0];
new_student->Id[1] = Id[1];
new_student->Id[2] = Id[2];
new_student->Id[3] = Id[3];
new_student->Id[4] = Id[4];
new_student->Id[5] = Id[5];
// int sumE,sumM,sumJ,sumT;
int sumE=0,sumM=0,sumJ=0,sumT=0;
753 :
デフォルトの名無しさん :2009/06/04(木) 19:24:51
>>751 > [3.2] VB6
> [3.3] C言語
・・・VB?
>>738 #include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <math.h>
int main(void) {
FILE *fp = fopen("alice.txt","r");
int c , s = 0 , str[26];
double e = 0;
memset(str,0,sizeof(str));
while(EOF != (c = fgetc(fp))) {
if(isalpha(c)) {
str[tolower(c) - 'a'] += 1;
s += 1;
}
}
fclose(fp);
for(c = 0; c < 26; ++c) {
printf("%c:%f\n",'a'+c,(double)str[c]/s);
if(str[c]) e += log2((double)s/str[c]);
}
printf("%f\n",e/s);
return 0;
}
>>751 VB6では動かんだろうけどw
#include <stdio.h>
int getDayOfYear(int m, int d){
int i, sum = 0, M[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
for(i = 1; i < m; ++i ) sum += M[i];
return sum+d;
}
int getLeapYearCount(y1, y2){
int y, sum = 0;
for(y = y1; y <= y2; ++y) if(!(y%4) && (y%100 || !(y%400))) ++sum;
return sum;
}
int getDayOfWeek(int y, int m, int d){
int dy = getDayOfYear(m,d);
int ly = getLeapYearCount(1980, m <= 2 ? y-1 : y);
return ((y-1980)*365 + ly + dy-1 + 2) % 7 ; // 1980/01/01は火曜日
}
int main(){
int y, m, d;
char* w = "日\0月\0火\0水\0木\0金\0土";
printf("日付(yyyy/mm/dd): ");
scanf("%d/%d/%d", &y, &m, &d);
printf("%d/%02d/%02dは%s曜日です\n", y, m, d, &w[getDayOfWeek(y, m, d)*3]);
return 0;
}
760 :
743 :2009/06/04(木) 20:48:33
>>739 最初の単語の文字数を返す関数wordを作成する
#include <stdio.h>
int word(char *);
int main() {
int size;
char buf[256+1];
fgets(buf, 256+1, stdin);
size = word(buf);
printf("word length=%d\n", size);
buf[size] = '\0';
printf("word string=<%s>", buf);
}
int word(char *s) {
int size = 0;
while(*s && *s != '\n') {
if(*s++ == ' ') break;
size++;
}
return size;
}
762 :
デフォルトの名無しさん :2009/06/04(木) 20:55:16
>>511 はどうなったの? ソートより
その後のランダムアクセス(並び変えたデータを書き込む)で時間くいますか?
【質問テンプレ】 [1] 授業単元:C [2] 問題文(含コード&リンク): ファイル(TEST.TXT)を読み込み、句読点が現れた時点で改行し表示するプログラムを作成せよ。 [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: gcc 3.4 [3.3] 言語: C [5] その他の制限: 無し よろしくお願い致します。
764 :
デフォルトの名無しさん :2009/06/04(木) 21:22:24
765 :
デフォルトの名無しさん :2009/06/04(木) 21:31:11
767 :
743 :2009/06/04(木) 23:06:14
>>728 関数sort(int,int)を用いて,これらの変数の値を並び替えてx≧y とする。
#include <stdio.h> // 問1.
void sort(int *,int *);
int main() {
int x, y;
printf("x,y を入力しなさい\n"); scanf("%d %d", &x, &y); printf("(x,y)=(%d,%d)\n", x, y);
sort(&x, &y);
printf("(x,y)=(%d,%d)\n", x, y); return 0; }
void sort(int *a, int *b) {
int tmp;
if(*a < *b) tmp = *a, *a = *b, *b = tmp; }
#include <stdio.h> // 問2.
void sort(int *, int *, int *);
int main() {
int x, y, z;
printf("x,y,z を入力しなさい\n"); scanf("%d %d %d", &x, &y, &z); printf("(x,y,z)=(%d,%d,%d)\n", x, y, z);
sort(&x, &y, &z);
printf("(x,y,z)=(%d,%d,%d)\n", x, y, z); return 0; }
void sort(int *a, int *b, int *c) {
int tmp;
if(*a < *b) tmp = *a, *a = *b, *b = tmp;
if(*b < *c) tmp = *b, *b = *c, *c = tmp;
if(*a < *b) tmp = *a, *a = *b, *b = tmp; }
#include <stdio.h> // 問題:問3.
int mult(int *, int *);
int main() {
int i, sum; int a[4] = {1,2,3,4}, b[4] = {4,3,2,1};
sum = 0;
for(i=0; i<4; i++) { sum += mult(&a[i], &b[i]); }
printf("sum=%d\n", sum); return 0; }
int mult(int *a, int *b) {
return *a * *b; }
>>768 問題が意味不明
何の「文字コード」なのか詳しく
入力データがあるなら入力形式と、それに対応する出力形式が分からないとどうしようもない
>>768 #include <stdio.h>
int main()
{
int ch, i;
while ((ch=fgetc(stdin)) != EOF) {
i++;
printf("%02x%c", ch, ((i % 16) == 0)? '\n': ' ');
}
printf("\n");
return 0;
}
妄想で補完
おぉう、iが初期化されてないよ。
774 :
772 :2009/06/04(木) 23:57:51
イカーンm(__)m i=0;に直してね
>>770 適当なテキストファイルをバイナリダンプみたいに
16進数表示しろって話じゃないのかな
違うかな
777 :
585 :2009/06/05(金) 00:11:16
2008年5月27日 2008年5月27日 計算機システム1(eof) sample-utf8.txtの中身はこうかな
>>772 それはテキストモードでNGだわ。バイナリモードにするC標準の方法ってなんだっけ?
_setmodeは"_"がMS独自っぽい気がするなぁ。ただいまぐぐり中。
fread
781 :
724 :2009/06/05(金) 00:28:53
すみませんboostの型特性とか難しくて全くわからないです どなたかお願い出来ないでしょうか?
>>780 それは試した上で言ってる? オレもそう思って試したらだめだったから言ってんだけど。
"_"なしバージョンはVS2005では呼ぶなって書いてあるドキュメントは見つけた。
とりあえずVSなら
>>772 に以下を付加すればOK。C標準かどうかはしらん。
#include <io.h> /* #include<stdio.h>の下 */
#include <fcntl.h>
:
_setmode( _fileno( stdin ), _O_BINARY ); /* whileの前 */
Windows以外にはそもそもテキストモードとかバイナリモードとか無いわけだが
ホントかて。UNIX系にないのは知ってるが「Windows以外(のあらゆる環境)にはない」とは知らんかったわ。 ま、質問者はXPのVSなんで、>782を付けんとまずい可能性は高いだろうね。
#include <stdio.h> int main(int argc, char *argv[]) { FILE *fp; int i=0; unsigned char ch[1]; if (argc !=2) { fprintf(stderr, "引数にファイルを指定\n"); return 1; } fp = fopen(argv[1], "rb"); if (fp == NULL) { fprintf(stderr, "ファイルを開けなかった\n"); return 1; } while (fread(ch, 1, 1, fp) > 0) { i++; printf("%02x%c", ch[0], ((i % 16) == 0)? '\n': ' '); } printf("\n"); fclose(fp); return 0; } Windows以外だと"b"は無視だったかな
課題をエスパると標準入力っぽい。
標準入力だと、VCは0x1aが現れるとファイルの終わりにしてしまうよね。 他のソフトでは、終わりにしないのもあるんだけど。
>>787 ファイルでも標準入力でもバイナリモードにしておけば0x1aで終了しないと思う
>>724 #include <boost/type_traits.hpp>
template<class T>
int f(T t)
{
return boost::is_signed<T>::value ? 0 : -1;
}
1] 授業単元: 情報処理 [2] 問題文(含コード&リンク):サブルーチンを使用した簡単なプログラムの作成。(例は成績処理のプログラムだそうです。) ですがサブルーチンを使用していればどんなプログラムでも良いそうです。 [3] 環境 [3.1] OS:WindowsXP [3.2] コンパイラ名とバージョン:TurboC++ [3.3] 言語: C [4] 期限: 2009年6月6日 [5] その他の制限:#include <stdio.h>で始めてprintfやscanfを使用した形でお願いします。 サブルーチンというものがどんなものかわかりませんがそれを使用したプログラム(成績処理など) を作っていただきたいです。どうかお願いいたします。
[1] 授業単元: プログラミング演習
[2] 問題文(含コード&リンク): 1~100の任意のN個の整数値を一次元配列に読み込み、その合計値と平均値を求め、
80~100,70~79,60~69,59以下の個数をそれぞれ出力するプログラムを作りなさい。
(1)入力データ数(Nは10以上とする)
(2)入力データ値(配列より読み出し、同じ値は使わない)
(3)入力データの合計値、平均値
(4)入力データについて各ランクの個数
(1)~(3)まではできたのですが、(4)がわかりません。。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9352.txt ↑これの続きにお願いします!
[3] 環境
[3.1] OS: Windows Vista
[3.2] コンパイラ名とバージョン: VS 2008
[3.3] 言語: C
[4] 期限: 2009年6月8日(月)14:00
[5] その他の制限: if,do,while,for,配列などです。
(例)各ランクでの個数の結果
80-100:5
70-79:3
60-69:1
59以下:3
このような感じでお願いします。
793 :
724 :2009/06/05(金) 02:24:10
>>789 すみません、僕のアップした問題と例文が矛盾していました
(signed型なら-1、Tがunsigned型なら0の誤りでした)
とりあえず教えてもらったのは正しく動作しました。有り難うございました
(こんなに短い宿題だったんだ。。)
794 :
723 :2009/06/05(金) 02:34:11
>>792 コンパイラにも通してないんで、考え方だけ。
int rank[4] ={0,0,0,0};
//sum+=seisu[i];の直下に
rank[ (seisu[i] >= 60) + (seisu[i]>=70) + (seisu[i]>=80) ]++;
//最後に
printf("80-100:%d\n", rank[3]);
printf("70-79:%d\n", rank[2]);
printf("60-69:%d\n", rank[1]);
printf("59以下:%d\n", rank[0]);
>>795 コンパイルし実行した結果、うまくいきました!
ありがとうございました!
素直に if(seisu[i] < 60) rank[0]++; else if(seisu[i] < 70) rank[1]++; else if(seisu[i] < 80) rank[2]++; else rank[3]++; にしとけよw
>>784 質問者がsample-utf8.txtを読むって課題出してんのに
標準入力から読もうとしてるのが間違いの発端だろ
Windowsの標準入力でバイナリモードって何がやりたいのよ
Windowsにはパイプなんか無いんだぞ
>>785 でいいでしょ
>>787 入力が一旦フラッシュされるだけ
改行とファイルの終わりは別だよ
WidnowsではCtrl+zでファイルの終わりを入力できる
>>798 標準入力で fread() 使いたいバージョン
>>657 条件式が副作用を持つ関数の場合はその方法は使えない。
(概してそういうコードは多い)
副作用を持たない関数あるいは関数呼び出しを伴わない条件式の場合は
その方法は使える。速度が必要ならコメントアウトすればいいのだから.
そのコードを他人に使わせるのならロジック部分は冗長に書いても損す
ることは少ないと思う。ただしよほど奇麗に書かないと「読みづらい」
と文句言われるだろうが
A,B,Cは副作用を持つ関数呼び出しを含まない条件式
if(条件A)
else if(条件B)
else if(条件C)
==>
if (条件A)
else if( 条件B /*&& 条件A*/)
else if(条件C /*&& 条件A && 条件B*/)
....
てな感じ
803 :
802 :2009/06/05(金) 11:35:55
ahoなミスに気づいた if (条件A) else if( 条件B /*&& !条件A*/) else if(条件C /*&& !条件A && !条件B*/) に置き換えてね
>>802 だからといって
char *string:
if( strcmp(string,"文字列1") ==0)
....
else if ( (strcmp(string,"文字列2")==0) /*&& (strcmp(string,"文字列1") !=0) */)
....
なんてやるとコメントが付けてても怒られるぞw
コメントの事言うなら。 (銅) if(条件A && 条件B) ... else if(条件A && !条件B) ... else if(条件B && !条件A) ... (銀) if(条件A && 条件B) ... else if(条件A) ... else if(条件B) ... (金) if(条件A){ if(条件B) ... else ... }else if(条件B) ... (特別賞) if(条件A) { if(条件B) { ... } else { ... }} else if(条件B) { ... }
>>763 (期限は無いのですか。)
ファイルの文字コードは何ですか。
例えば句読点は半角のピリオドとカンマとか、また漢字ならUnicodeかShift-JISなど。
>>687 BASIC言語だけど麻呂のクソースくらえ
10' C言語の宿題片付けます 126 Res:687
20 input "N=";N: if(N<0)or(N>99)then N=5
30 for y=1 to N
40 for x=1 to N:gosub 110:next
60 print " ";
70 for x=N to 1 step -1:gosub 110:next
80 print
90 next y
100 end
110 ' draw
120 dx=1:dy=1:m=0:ori=0:right=N:left=1:top=2:bottom=N
130 while(m<=N*N)
140 m=m+1:if(dx=x)and(dy=y)then gosub 200:return
150 if(ori=0)then dx=dx+1:if(dx=right)then ori=1:right=right-1:goto 190
160 if(ori=1)then dy=dy+1:if(dy=bottom)then ori=2:bottom=bottom-1:goto 190
170 if(ori=2)then dx=dx-1:if(dx=left)then ori=3:left=left+1:goto 190
180 if(ori=3)then dy=dy-1:if(dy=top)then ori=0:top=top+1:goto 190
190 wend
200 ' print
210 keta=1:while(10^keta<N*N):keta=keta+1:wend
220 mm$=str$(m):while(len(mm$)<keta):mm$="0"+mm$:wend
230 print mm$;:return
810 :
◆sUfWYz9MSA :2009/06/05(金) 16:03:01
[1]授業:データ構造 [2]問題文: (1)再帰を使用して完全2分岐の「深さ」優先探索を行う。 行きがけ順、帰りがけ順、なぞりがけ順、それぞれの関数を作成し結果を出力させること。 各ノードに整数データを入れて、次の出力結果が得られる事を確認せよ。 行きがけ:5,3,1,4,7,6,9 なぞりがけ:1,3,4,5,6,7,9 帰りがけ:1,4,3,6,9,7,5 (2)次に再帰を使用せずにスタックを用いて同様の結果が得られる事を確認せよ。 [3]環境:C、Linux [4]期限:(1)2009/6/8 (2)無期限 [5]その他の制限:問題文はテンプレートであり各自参考として使用してよい <以下問題文テンプレート> /* ?に何か入るかもしれない */ #include <stdlib.h> #include <stdio.h> #define NUM_NODE 7; void ikigake (int t[], int i) { if( i==? ) return; ??? printf("3d ->", t[i]); ??? }
811 :
◆sUfWYz9MSA :2009/06/05(金) 16:04:38
続き void nazorigake(int t[], int i) { if(i==?) return; ??? printf("%3d ->", t[i]); ??? } void kaerigake(int t[], int i) { if(i==?) return; ??? printf("%3d ->", t[i]); ??? main() { int tree[???] = {???}; printf("\nIKIGAKE\n"); ikigake(); ?? printf(" END\nNAZORIGAKE\n"); nazorigake(); ?? printf(" END\nKAERIGAKE\n"); kaerigake(); ??
812 :
デフォルトの名無しさん :2009/06/05(金) 16:09:57
>>809 通った場所と、現在位置を記録し、すでに探索済みのところはのぞいたらいいと思うよ。
反転と回転の同一視で1/8に探索が減る。
10 '
>>808 >>687 トグロ
#include <stdio.h>
#include <math.h>
int n, keta, x, y;
void draw();
int main() {
printf("N="); scanf("%d",&n); if(n<0 || n>99) n=5;
keta = log10((double)n*n);
for(y=1; y<=n; y++) {
for(x=1; x<=n; x++) draw();
printf(" ");
for(x=n; x>=1; x--) draw();
puts("");
}
return 0;
}
void draw() {
int dx=1,dy=1,m=0,ori=0,right=n,left=1,top=2,bottom=n;
while(m <= n*n) {
m++; if(dx==x && dy==y) { break; /* return; */}
if(ori==0) { dx++; if(dx==right) { ori=1; right--; continue; } }
if(ori==1) { dy++; if(dy==bottom) { ori=2; bottom--; continue; } }
if(ori==2) { dx--; if(dx==left) { ori=3; left++; continue; } }
if(ori==3) { dy--; if(dy==top) { ori=0; top++; continue; } }
}
switch(keta){
case 0: printf("%01d", m); break; // 3*3 = 9
case 1: printf("%02d", m); break; // 9*9 = <99
case 2: printf("%03d", m); break; // 31*31 = <999
case 3: printf("%04d", m); break; // 99*99 = <9999
}
}
814 :
デフォルトの名無しさん :2009/06/05(金) 17:34:17
>>809 1*1
3*3
5*5
7*7
には解があるが、8*8はないだろ
8*8が簡単
[1] 授業単元: プログラミング演習 [2] 問題文(含コード&リンク): 数字の列を入力すると、値が 重複するものを削除するプログラムを作成せよ。 ただし数列の長さは最大でも100とする。プログラムの実行の流れは 以下のようになる。 はじめに「数列のサイズは?(最大100)」と表示されるので、入力する数字の個数を入力する。次に「?番目の正の数を入力してください:」と表示されるので、整数を入力する。 ?に何番目か表す数字が入る。この入力処理をはじめに入力したサイズ分繰り返す。 入力し終えると、入力された数字のうち重複するものが削除されたデータが表示される。 たとえば、1,2,3,4,5,5という数字を入力されると表示される数列は1,2,3,4,5と表示される。 [3] 環境 [3.1] OS: (Windows/vista [3.2] コンパイラ名とバージョン: VisualC++2008 Express Edition [3.3] 言語:C++ [4] 期限: (今日から〜2009年6月11日まで] [5] その他の制限: 配列は習いました。 ・サイズは0個でも‐5でも101個でもおかしなことが起こらず適切な処理がされている。たとえば「サイズがおかしいです」と表示して終了する。 ・正しく重複をなくすことができている プログラム中に何個目か、しっかり表示されている。 ・プログラム実行中に表示される文字のうち意味不明なものが存在しない。 お願いします〜
トグロ大人気だな
>>798 課題のリンク先を見てないだろ?
> ファイル名<sample-utf8.txt
これをどう解釈するかだが、ファイル名はEXEのファイル名で標準入力のリダイレクトと解釈するのが不自然だとは思わん。
>>817 拡張子を見て、テキストファイルだと判断し、
制御コードがないと想定するのも、
不自然ではないよね。
問題文に無いことについてはどうするのかだな。
改行コードを0d 0aと出すことも読み取れる。 (1) _setmodeを授業でやった直後 or 教える目的 (2) リダイレクトでない(出題者のミス or 質問者のミス) (3) 0d 0aでない(出題者のミス or 質問者のミス) 上の順でいずれかかなぁ?
>>815 #include <stdio.h>
int main(void)
{
int i, j, k, n, a[100];
printf("数列のサイズは?(最大100)");
scanf("%d", &n);
if(n<1 || 100 < n) {
printf("サイズがおかしいです\n");
return 0;
}
for(i=0; i<n; i++) {
printf("%d番目の正の数を入力してください:", i + 1);
scanf("%d", a + i);
}
for(i=0; i<n; i++) {
int temp = a[i];
for(j=i+1; j<n; ) {
if(a[j] == temp) {
for(k=j; k<n-1; k++) a[k] = a[k+1];
n--;
}
else j++;
}
}
for(i=0; i<n; i++) printf("%d ", a[i]);
return 0;
}
>>814 >8*8はないだろ
+−+−+−+−+−+−+−+−+
|01|38|55|34|03|36|19|22|
+−+−+−+−+−+−+−+−+
|54|47|02|37|20|23|04|17|
+−+−+−+−+−+−+−+−+
|39|56|33|46|35|18|21|10|
+−+−+−+−+−+−+−+−+
|48|53|40|57|24|11|16|05|
+−+−+−+−+−+−+−+−+
|59|32|45|52|41|26|09|12|
+−+−+−+−+−+−+−+−+
|44|49|58|25|62|15|06|27|
+−+−+−+−+−+−+−+−+
|31|60|51|42|29|08|13|64|
+−+−+−+−+−+−+−+−+
|50|43|30|61|14|63|28|07|
+−+−+−+−+−+−+−+−+
???
>>820 tempで保存する方法と○--の表現を使わないで表すことはできるでしょうか?
3*3は?
824 :
デフォルトの名無しさん :2009/06/05(金) 21:22:38
すまん 3つずつ移動するから、1ます余って無理かと思った。
825 :
デフォルトの名無しさん :2009/06/05(金) 21:28:31
ある程度の大きさ以上ならいつでも解はあるの?
829 :
813 :2009/06/05(金) 22:37:25
コンパイルのエラーメッセージが、何か出てます?
>>826 通信プロトコルは何を使えとか指定ある?
つーか
>>813 よ。どしてこんなクソプログラムにいちいちループ内不変定数計算
外出しみたいな姑息な最適化をするんだw
(多分反射的生理的な操作とみた)
>>830 SSHです。
あと忘れていたのですが、select(),system(),fork()の使用がこの課題では認められていません。
後付で申し訳ありません。
>>832 sshのポートを使ってサバクラ作れって事?
それともssh使ってサーバーにログインし、動かすプログラム?
>>833 sshのポートを使ってという意味です。
>>812 >反転と回転の同一視で1/8に探索が減る。
プログラムの出力結果とにらめっこして
ようやく意味がわかった・・・ ^^;
>>834 若いボート番号を横取りするのは不味いんじゃないかな
意図が良く分からない
>>827 質問者です
>>809 です。
先ほどから確認をとろうと立ち上げているのですが、肝心なvistaが動かず。。xpを立ち上げるもコンパイラするソフト??が入っておらず、フリーで配布してあるところを探しているのですが、
3時間ばかしダウンロードがいっこうに進まず何も出来ない状態です;;
このままだと出力結果を知らぬまま提出することになりそうです。
本当に申し訳ないのですが
出力結果をお教え頂けないでしょうか??
プログラムも組んでもらってこんなこと聞くのはおかしな話ですが
本当に本当によろしくお願いします><
別のコンパイラ入れれば? 小さいやつ
>>837 もしどうしてもダメなら、codepadを使ってみたら?
codepad
http://codepad.org/ 真ん中のテキストボックスにコードを入れて、
Language => C, Run codeにチェックを入れてSubmitを
押すと、コードをコンパイルして実行してくれる
>>808 210 行目を、20 行目の後ろに持っていくことに問題ある?
20 input "N=";N: if(N<0)or(N>99)then N=5
25 keta=1:while(10^keta<N*N):keta=keta+1:wend
:
200 ' print
220 mm$=str$(m):while(len(mm$)<keta):mm$="0"+mm$:wend
今日のGoogleはテトリスの画像だなwww
>>840 BASICはスレ違いだし、もう処理系が存在しないに等しい言語。しっしっ
UB32、結構便利
Windows 7以降はDOS互換モード廃止の為ネィティブでは非動作につき
>>842 それはもったいないな。どこかにないかな。
>>839 そんなサイトがあったんですか
ありがとうございます。そこから結果を観ることができました。
レポートも間に合いそうです。
みなさんありがとうございます!!><
ただBASIC処理系の場合(VB系は度外視)、ライブラリに相当する組み込み関数や機能が豊富でも無い限り ていの良い超高級アセンブラシミュレータである件については よーく理解してから信仰しても良いと思います。 見た目のコードの美しさも今後は非常に重要な時代でC系の記号美溢れるコードが主流である状況は続くでしょう。
list 10 X=1 20 for I=1 to 50 30 X=X*I 40 next 50 print X run 30414093201713378043612608166064768844377641568960512000000000000 OK to 1000 でも桁溢れしない。こういう所、捨てがたい魅力があるんだな。 動作するなら別にwindowsでなくてもいいから、誰かやってくれないか。
>>848 それはベーシックにかぎったはなしではなく、
C系列でも実現可能で多倍長整数とか言われてるやつです。
桁が多くなると計算にものすごい時間がかかるようになるから、
高速な多倍長演算は重宝されますです。
C言語で関数のオーバーロードは出来ないんですか?
できるんだったらabs, fabsとかもうちょっとマシになってるよな・・・
無理やり総称をやるなら、引数を「データへのポインタ」と「データのサイズ」にして、 関数内で適切にデータアクセスを行うようなプログラムかな。 ポインタとサイズをまとめた構造体を使うという手もある。 いずれにしても、コンパイラは何も面倒は見てくれない。
ポインタとサイズの組み合わせより、ポインタと列挙型の方がマシじゃね?
XEventみたいにするのか?適切な処理にまわすためには、そのための約束事が必要だね。
C言語のprintf(const char*,. .....);ってやつオーバーロードしてんじゃないの? いくつ引数として読み込むか設定してないし
可変長引数でggr
>>856 最後の ... はスタックがある限り(かな??)引数を食わせれる宣言。可変長引数。
取得も普通の引数より手数を食う。
859 :
856 :2009/06/06(土) 14:24:41
860 :
デフォルトの名無しさん :2009/06/06(土) 14:59:43
[1] 授業単元:プログラミング演習 [2] 問題文(含コード&リンク):要素数3のint型配列2つを引数とし、要素ごとの足し算、引き算、掛け算の結果を出力するvoid型のope3関数を作成する。 main関数においてターミナルから3つの整数a[0], a[1], a[2]を読み込み、更に 3つの整数b[0], b[1], b[2]を読み込み、 ope3関数によって、a[i]+b[i], a[i]-b[i], a[i]*b[i]を出力するプログラムを作成しなさい。 但しope3では配列を用いない。 [3] 環境 [3.1] OS:Linux [3.2] コンパイラ名とバージョン:gcc [3.3] 言語:C [4] 期限:6月11日 8:00 [5] その他の制限:関数ope3のプロトタイプはvoid ope3(int *, int *)とすること。
[1]C言語上級 [2] C言語(C89を基準)の長所と短所を分析し箇条書きに纏めよ。(100個以上挙げること) 例: 項番 長所/短所区分 内容 1 長所 大文字と小文字が区別されるので識別子衝突のリスクが小さい 2 短所 大文字と小文字が区別されるので識別子のミスタイプや取り違えが起こりやすい。 ※他のプログラミング言語群よりも抜きん出て高い性質を挙げること ※特定のプログラミング言語を名指ししないこと [3]Windows/Linux他 /C89処理系 [4]無期限
>>861 ・すでに枯れていて使える人間自体が多いこと。
・ライブラリが貧弱なこと。逆に個人でも実装できるレベルの標準ライブラリ。
などなど。
863 :
デフォルトの名無しさん :2009/06/06(土) 15:27:38
[1] 授業単元:プログラミング演習
[2] 問題文(含コード&リンク):1〜256文字の文字列を入力し、その単語数を出力するプログラムを作成せよ。
[3] 環境
[3.1] OS:Linux
[3.2] コンパイラ名とバージョン:gcc
[3.3] 言語:C
[4] 期限:6月10日 8:00
[5] その他の制限:
>>739 で作成したword関数を用いること。
入力する文字列に2つ以上の連続したスペースはないとする。
入力する文字列の最初と最後はスペースでないとする。
[1] 授業単元:プログラミング [2] 問題文(含コード&リンク): テストの点数を入力し、90 以上なら‘S’、90 未満80 以上なら‘A’、80 未満70 以上なら‘B’、70 未満60 以上なら‘C’、60 未満なら‘D’、この範囲以外の数値が入力されたらエラーを表示する関 数judge を作成せよ。 ただし、関数原型宣言を用いて、この関数をmain 関数より後に記述すること。 さらに実際にその関数を用いて、実行例のように表示するプログラムを作成すること。 実行例 テストの点を入力: 75 成績: B [3] 環境 [3.1] OS:Windows XP [3.2] コンパイラ名とバージョン:Visual Studio 2005 [3.3] 言語: C [4] 期限: 6/12 [5] その他の制限:
>>863 お前が作成したword関数とやらはどこにあるんだよ
867 :
デフォルトの名無しさん :2009/06/06(土) 17:33:09
>>865 これでいいのかな?
#include<stdio.h>
int tensuu;
void judge(void);
int main(void){
printf("テストの点を入力\n");
scanf("%d",&tensuu);
judge();
return 0;
}
void judge(void){
if(tensuu>100||tensuu<0){
printf("エラー");
}
else if(tensuu>=90){
printf("成績:S");
}
else if(tensuu>=80){
printf("成績:A");
}
else if(tensuu>=70){
printf("成績:B");
}
else if(tensuu>=60){
printf("成績:C");
}
else if(tensuu<60){
printf("成績:D");
}
return;
}
>>861 文法において、長所は同時に短所でもあり、逆も成り立つ
C89の欠点 1.古い 2.古すぎ 3.もうC99だっつーの。 4.なめんな
「調べたけど見つかりませんでした」 じゃだめなのかな?w
C(C89を基準)の欠点 1.もう20年以上も前からまったく進化していない 2.せっかく10年前にC99が出たのにいまだに乗換えが進まない 3.っていうか学校教育でくらいC99教えろよ 4.おまえだよおまえ 5.何をいまさらC89とか学生に教えてんだよ 6.やめちまえよ
とりあえず気になるのは //が使えないこと
C99なら // 使えるよ
知ってるよ
やたら古いと言われてるが、実際C99使われてる(使える)ケースってあんまりなさそうだが //コメントやbool、ブロックの先頭以外で変数宣言可あたりは実用的だけど
配列周りは今まで出来なかったことが「微妙に」出来るようになってて、 下手に新機能を使うとバグが分かりにくくなりそう。 困憊らが対応しているのかどうかもあわせて検討しなきゃならんし。
C99(ISO/IEC 9899 : 1999 (E))に準拠したコードを書くのは素人。 玄人は移植性を考慮してC89(ANSI X3.159-1989)またはC90(ISO/IEC 9899:1990)に準拠したコードを書く。 が、実際は、完全には準拠できなかったりする。 C99C99と言っている人がいるが本当に規格書を読んでいるのか。 私はC++コンパイラでコンパイルする気は無いが、 誰かがソースをC++コンパイラでコンパイルするかもしれないから、 C89準拠にこだわっている。 ただの古い知識をもっているC言語ハッカーのぼやきと思ってくれ。 制限があるから進化する。
というか、C++はCと互換性を持たせた言語として作ったのに、 その直後にそれに反する文法作ったC99は、存在そのものが不思議
もう10年も前にC99が発表されてるのに いまだにC89にこだわったり、K&Rにこだわったり… 未来のない言語ですね
未来がないのはどの言語も一緒 むしろCほど長生きする言語はもう今後でないだろ
K&R、なにそれ、おいしいの。
さすがにK&Rはもう駆逐されていい、危険過ぎる。
ああそうか、
>>880 は、C++マンセーの人か。
C言語マンセーな私とは道理で意見が合わないわけだ。
これ以上は、スレ違いなので止める。リーナスがなんかいていたスレを思い出したよ。
でも、完全互換なんて幻だって、みんな知ってるんだよね。
未来の無い言語=共通認識が得られる言語 ではないだろうか? 変化しすぎで それどの仕様での話? なんて確認が不要だもの
>>884 結局のところ、C言語だってC89なのかC99なのか確認する必要があるんじゃない?
gccのように一部取り入れている環境の場合は特に厄介なことに。
いっそ最初からまったくC99に準拠しないVCの方が話はシンプル。
>>882 >>880 じゃないが、早くリタイアしておくれ^^
>>884 今のところその仕様はC99?とか聞かれたことはなく、
C言語といえば暗黙の了解でC89だな
>>885 VC6はひどかったがw
というか、今のVCは明示的にC99と指定しないと厳密に判定してくれるのか?
887 :
デフォルトの名無しさん :2009/06/06(土) 19:24:17
アジャイル・プラクティス p.37、「新しきを学び、古きを捨てましょう」
891 :
デフォルトの名無しさん :2009/06/06(土) 20:30:55
>>890 ふたつめの問題はこれでいいのかな、ひとつめの問題よりかなり難易度が低いから、何か見落としてる気がするが・・・
#include<stdio.h>
int main(void)
{
int a[1];
int b;
printf("整数1を入力\n");
scanf("%d",&a[0]);
printf("整数2を入力\n");
scanf("%d",&a[1]);
if(a[0]<a[1]){
b=a[0];
a[0]=a[1];
a[1]=b;
}
printf("%d,%d",a[0],a[1]);
return 0;
}
>>868 A
@ {{50,85,70,65},{90,80,85,65},{70,75,65,80},{60,95,80,75}};
A for (i = 0; i < PERSON_NUM; i++) {
B for (i = 0; i < PERSON_NUM; i++) {
C personalAverage[i] += record[i][j];
D for (j = 0; j < SUBJECT_NUM; j++) {
E subjectAverage[j] += record[i][j];
B
@ for( i = 0; i < stn; i++) {
A st[i].student_id,st[i].name,st[i].m_english,st[i].m_math,st[i].m_chemistry,st[i].m_physics);
B st[i].student_id,st[i].name,st[i].m_english,st[i].m_math,st[i].m_chemistry,st[i].m_physics);
C personalAverage[i] = (double)(st[i].m_english+st[i].m_math+st[i].m_chemistry+st[i].m_physics)/SUBJECT_NUM;
D subjectAverage[0] += st[i].m_english;
E subjectAverage[1] += st[i].m_math;
F subjectAverage[2] += st[i].m_chemistry;
G subjectAverage[3] += st[i].m_physics;
>>891 確かに少し簡単すぎるので何か欠けてる気がします。
テーマには「配列変数の要素を操作する関数」とあるのですが、何とかなりませんでしょうか。
C99、C99とわめいている奴は素人かただの趣味グラマ 実際C99の案件なんか一つもねーっつーの コンパイラもIntel C++ぐらいでしょ100%対応してるのは
>>894 何回答者につられてるんだ。
関数にしろって書いてあるのに、少しは自分の頭を考えろ。
897 :
つづき :2009/06/07(日) 10:13:54
>>890 問2の答
#include <stdio.h>
int b[2];
int min_max(int **a);
int main(void) {
int *data;
min_max(&data);
printf("%d,%d", data[0], data[1]);
return 0;
}
int min_max(int **a) {
int temp;
*a = b; // Rent from global area not malloc().
if(*a == NULL) return 1;
printf("整数1を入力:");
scanf("%d", &(*a)[0]);
printf("整数2を入力:");
scanf("%d", &(*a)[1]);
if((*a)[0]<(*a)[1]){
temp=(*a)[0];
(*a)[0]=(*a)[1];
(*a)[1]=temp;
}
return 0;
}
>>897 申し訳ありません。
Rent from global area not malloc().
↑この関数はまだ習っていないのでもう少し簡単にしていただけ無いでしょうか?
>>897 どう見ても朝釣りです。ありがとうございました。
// *a = bって*a = &b[0]じゃないとエラー出ると思うんだが
>>899 897じゃないけど、でないよ
むしろ何でエラーだと思うか疑問だ
ポインタ記号とか&, []とか意味ちゃんとわかってるか?
カオスw
//もっと簡単に書いてやりなよ #include <stdio.h> int min_max(int a[2]); int main(void) { int b[2]; printf("整数1を入力:"); scanf("%d", &b[0]); printf("整数2を入力:"); scanf("%d", &b[1]); min_max(b); printf("%d,%d", b[0], b[1]); return 0; } int min_max(int a[2]) { int temp; if(a[0]<a[1]){ temp=a[0]; a[0]=a[1]; a[1]=temp; } return 0; }
ごもっとも
>>902 有難うございます。
これなら問題ありません。
課題1はできますでしょうか?
>>902 じゃないけどやってみた
#include <stdio.h>
#define MAX 5
int main(void)
{
int a[5],sum=0,i;
for(i=0; i<MAX; i++){
printf("整数%dを入力:",i+1);
scanf("%d",&a[i]);
}
for(i=0; i<MAX; i++)
sum+=a[i];
printf("平均値は %f",(double)(sum/MAX));
return 0;
}
>>905 ・配列変数内の数値の平均値を実数型で返す関数aveを作成せよ。
・constを用いて、関数内で配列変数の中身が書き換えられないようにすること。
この2つの条件が満たされていないみたいです。
申し訳ありませんが、修正を加えていただけませんでしょうかorz
十数行程度のプログラム読んで、 数行追記するぐらいやろうとは思わんの? int ave(int array[]){ int i; for(i = 0; i < MAX; ++i){ }
>>908 有難うございます。
助かりました。
復習して自分で書けるように頑張ります。
Shit+Enterで書き込みになるのか(´・ω・`) そして遅れをとる(゚д゚)
911 :
908 :2009/06/07(日) 12:41:14
>>909 mainのしょっぱなの宣言の int a[5],i; → int a[MAX],i; に変更しておいてくれ
>>893 が列挙してくれた宿題、
依頼人は回答を待っている?
[1] 授業単元:プログラミング [2] 問題文(含コード&リンク):整数を読み込んでその約数を表示しろ [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: [3.3] 言語: C [4] 期限: 今日中 [5] その他の制限:do-whileまで(while文for文は使用不可) よろしくお願いします
914 :
デフォルトの名無しさん :2009/06/07(日) 14:24:27
>>913 #include<stdio.h>
int main(void){
int a,b=1;
printf("数値を入力してください\n");
scanf("%d",&a);
do{
if(a%b==0){
printf("%d\n",b);
}
b++;
}while(b<=a);
return 0;
}
>>914 ありがとうございます
そこにb++を置かなきゃいけなかったのか
>>916 どういうエラー?
そのままコピペで通ったけど。(end_mainはコメントアウトした)
[1] 授業単元:情報リテラシ [2] 問題文(含コード&リンク) 1〜100の擬似乱数を発生させ、 自分で入力した任意の数字が何回目で同じになったのかと、 それまでの乱数の合計を求め画面に 表示させ終わらすプログラムを作りなさい。 [3] 環境 [3.1] OS: Windows XP [3.2] コンパイラ名とバージョン:不明 [3.3] 言語: C [4] 期限:6月9日13時まで [5] その他の制限: 特になし よろしくお願いします。
C言語翻訳乙といいたいところだが、得体の知れない応用分野をコーディングするのには それなりに注意が必要だからな。
>>918 > それまでの乱数の合計を求め画面に
ここがよく分からない。乱数の合計とは、具体的に
どのように合計されたもの?
>>917 end_mainをはずしていなかったため、予期せぬEOFが検出ということでした。
ありがとうございます
>>921 合計と言うからには通常、足されたものだろう。
数値入力 n
乱数合計 ar
乱数発生 r
rとnが同じなら終了。違うなら ar += r;
ってことだろ。
924 :
918 :2009/06/07(日) 16:11:19
>>921 こんな感じです
入力した数が5だったとしたら
3 1 2 10 4 2 5
合計27って感じです。
乱数は入力毎に違うものにするのかな?
926 :
デフォルトの名無しさん :2009/06/07(日) 16:20:51
>>918 こういうことかな?
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int GetRandom(int min,int max);
int main(void)
{
int a,b,c=0,d=0;
srand((unsigned int)time(NULL));
printf("数値を入力してください\n");
scanf("%d",&a);
while(a!=b){
b=GetRandom(1,100);
c=c+b;
d++;
}
printf("%d回目で一致しました。乱数の合計値は%dです。",d,c);
return 0;
}
int GetRandom(int min,int max)
{
return min + (int)(rand()*(max-min+1.0)/(1.0+RAND_MAX));
}
928 :
◆p3KE2pR6J6 :2009/06/07(日) 16:36:25
929 :
デフォルトの名無しさん :2009/06/07(日) 16:41:26
[1] 授業単元:グラフアルゴリズム [2] 問題文(含コード&リンク): トポロジカルソートの正当性を述べよ。つまり、アルゴリズムによって 正しくソートできていることを示せ。 [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 6月8日17:00まで [5] その他の制限: アルゴリズム グラフGに対して深さ優先探索を行い、各頂点uの終了時間f[u]を計算し、 頂点uのすべての隣接頂点に対する操作の終了直後にuをソート用の線形リストの先頭に挿入する。 グラフは有効アサイクリックグラフです。
>>860 要素ごとの足し算、引き算、掛け算の結果を出力する
#include <stdio.h>
#define N 3 /* 要素数 */
void ope3(int *, int *);
int main() {
int i, a[N], b[N];
for(i=0;i<N;i++) {
printf("a[%d]: ", i);
scanf("%d", &a[i]);
}
for(i=0;i<N;i++) {
printf("b[%d]: ", i);
scanf("%d", &b[i]);
}
ope3(a, b);
}
void ope3(int *data1, int *data2) {
int i;
printf("\n足し算=");
for(i=0; i<N; i++)
printf("%d ", *(data1+i) + *(data2+i));
printf("\n引き算=");
for(i=0; i<N; i++)
printf("%d ", *(data1+i) - *(data2+i));
printf("\n掛け算=");
for(i=0; i<N; i++)
printf("%d ", *(data1+i) * *(data2+i));
}
931 :
918 :2009/06/07(日) 17:42:33
>>926 作っていただき有難うございます。
家だとコンパイラソフトが無いので、明日学校で試してみます。
本当にありがとうございました。
932 :
918 :2009/06/07(日) 17:43:28
>>927 乱数は毎回ランダムで変わり、重複の可能性もありです。
933 :
デフォルトの名無しさん :2009/06/07(日) 17:47:04
>>931 ごめんなさいdの初期値は0じゃなくて1のほうが正しいかも
934 :
デフォルトの名無しさん :2009/06/07(日) 18:04:48
>>931 int a,b,c=0,d=0;
do {
b=GetRandom(1,100);
c=c+b;
d++;
} while(a!=b);
printf("%d回目で一致しました。乱数の合計値は%dです。",d,c);
C++で半角文字列の構文解析をしたいのですが 何か参考になるサイトなどは知らないでしょうか? [0-9] [a-Z] [{()}.,] {改行\n空白スペース\t] 最低限この文字は認識させたく思っています.
>>936 boost::spiritとか?
使ったことないから詳しくは知らないけど
>>928 >>542 あー、それやろうと思ったけど確かにファイル削除されてるんだよね…
…
…
って、ボケ〜
ファイル無いの確認しておいて、待ってます、だぁ〜?
淡い思い出に期待して待ってるのさ
>>940 void color_to_gray(UCHAR gray[][DIM2], UCHAR data[][DIM2][DIM3], int n_gyou, int n_retu)
の高速化
gray[g][r]=(UCHAR)(tmp/3.0+0.5); /* 平均値を四捨五入 */
↓
gray[g][r]=(UCHAR)((tmp*2+1)/6); /* 平均値を四捨五入 */
>>943 すみません、もちろん最初はそちらにアップロードしようと思ったのですが、容量が100KBまでなのでアップロードできなかったんです。
あー。それはすまんかった。
>>940 >>942 で多少は高速化できている。
プロファイル取ったら、70%はedge_to_colorに費されているので、
こちらを高速化した方が効果があると思う。
具体的には、違和感のあるインデントの部分とかのループを展開したり、
ジャンプ(switchやif-else)を無くせるとことは無くしたり、
変数をレジスタに割り当てたり(使い過ぎ注意な)、配列の次元を下げたり、
何度も参照されている配列の要素をレジスタの一時変数にに変えたりすれば、
若干速くなると思う。-O2は、ループの展開はしないらしい。
947 :
942 :2009/06/07(日) 23:48:43
>>942 は間違ってたので訂正
void color_to_gray(UCHAR gray[][DIM2], UCHAR data[][DIM2][DIM3], int n_gyou, int n_retu)
{
int i, size;
UCHAR *s, *d;
size=n_gyou*n_retu;
s=(UCHAR*)data;
d=(UCHAR*)gray;
for(i=0;i<size;i++){
d[i]=(((int)s[0]+s[1]+s[2])*2+3)/6; // この部分は +3 が正解
s+=3;
}
}
948 :
864 :2009/06/07(日) 23:51:15
949 :
942 :2009/06/07(日) 23:52:17
>>940 >>947 とこれの併用で所要時間は 1/5 弱になった
void edge_to_color(UCHAR ans[][DIM2][DIM3], UCHAR gray[][DIM2], int keisuu, int n_gyou, int n_retu)
{
int g,r,m;
int edge[2]; /* edge[0]:横方向勾配値,edge[1]:縦方向勾配値 */
int val[3]; /* 出力画像の画素値算出に利用する配列 */
for(g=1;g<n_gyou-1;g++) /* 1画素ずつ処理する */
for(r=1;r<n_retu-1;r++) /* ただし,画像の最外周部は算出しない(画素値は0となる) */
{
edge[0]=-gray[g-1][r-1]+gray[g-1][r+1]-gray[g+1][r-1]+gray[g+1][r+1]+(-gray[g][r-1]+gray[g][r+1])*2;
edge[1]=gray[g-1][r-1]+gray[g-1][r+1]-gray[g+1][r-1]-gray[g+1][r+1]+(gray[g-1][r]-gray[g+1][r])*2;
val[0]=val[1]=val[2]=0;
if(edge[0] > 0) /* 勾配値の符合に応じて画素値に勾配値を加減算 */
val[RED] += edge[0];
else
{
val[BLUE] -= edge[0];
val[GREEN] -= edge[0];
}
if(edge[1] > 0)
val[GREEN] += edge[1];
else
{
val[RED] -= edge[1];
val[BLUE] -= edge[1];
}
#define CLIP(x) ((x)<256?(x):255)
for(m=0;m<3;m++) ans[g][r][m]=CLIP(val[m]*keisuu);
}
}
950 :
デフォルトの名無しさん :2009/06/07(日) 23:56:45
[1] 授業単元:Cプログラミング [2] 問題文(含コード&リンク):ポインタ配列 char *month[ ] = { "None", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" }; を用いて1〜12の数値を入力してJanuary〜Decemberを返す関数GetMonthを作成せよ. [3] 環境 [3.1] OS:WindowsVistaSP2 [3.2] Visual stdio2008 [3.3] 言語: C [4] 期限:2009年6月8日13時まで [5] その他の制限: できるだけ基本で
>>950 こんな感じで。動作は保障しない。
#include <stdio.h>
char* GetMonth(int M){
static char* month[] = { "None", "January", "February", "March", "April", "May", "June",
"July", "August", "September", "October", "November", "December" };
if(M<1) return month[0];
if(M>=13) return month[0];
return month[M];
}
int main(){
int i=0;
for(i=0;i<14;i++){
printf("%s\n",GetMonth(i));
}
return 0;
}
>>542 >>941 え〜と、俺パワポ持ってないからワードの内容でやっつけて良いのか?
と言うか、俺は会社のライブラリやら3Dソフトのプラグイン扱ってるから
レンダラー作る感覚で面白いから手間かけてやっても良いが…
この内容で人のパクリだと、キミの立場がやばいんじゃねw
そんなの気にする奴はここには来ない
955 :
950 :2009/06/08(月) 00:54:33
>>951 実行すると数字打つまでもなく全部表示されちゃいます・・・
>>951 >動作は保障しない。
ワロタw
とはいえ、修正するのは2行程度だろ
>>952 そのまま出すことはないと思うので、大丈夫です(参考にさせて欲しいので)。あと、もし可能ならで構わないのですが、可能な限り簡単なプログラムにして欲しいです。よろしくお願いします!
>>954 はい、かなり面倒なプログラムになります。サイトを探して頂きありがとうございました、後で見させてもらいます。
>>951 横から質問だけど
文字列を static にしてるのは何か理由があるの?
どっちかというと const な気がするけど(速度面を見ても)
Cにはconstないんじゃね?
961 :
952 :2009/06/08(月) 02:16:58
>>957 すまんが、俺も夜な夜なの暇つぶしでやるんで本格的にやるつもりは無いw
課題の条件を満たせば、面倒な3Dの処理は固定値や固定処理ではしょるかも知れん
えーと、週末までだったね、多分、次スレになるな
あとCSGモデルってWEBで探して勝手に解釈するけど定義ってあるの?
俺のイメージだと、drawSphere(引数は球の各指定値...)見たいにすると
ポリゴンで出来た球がレンダリングされるって感じだけど…合ってる?
962 :
デフォルトの名無しさん :2009/06/08(月) 07:10:03
>>951 じゃないけど
>>958 その関数が何回か呼ばれることを想定してるんじゃないの?
同じ値を何度もセットするのは無意味だからね。
ただ、問題(
>>950 )の制約上、monthがポインタ(リテラル文字列のアドレス)の配列として宣言されてるからconstは付けるべきだと思う。
ところでconstだと速度面にどう関係するの?
>>959 いつの仕様だ?
>>958 は関数内のstatic知らなくて質問してるんじゃないかな。
これは
>>950 と速度変わらないと思うけど。
#include <stdio.h>
const char* month[] = { "None", "January", "February", "March", "April", "May",
"June", "July", "August", "September", "October", "November", "December", "None" };
const char* GetMonthName(int M) {
return month[M<=0?0:(M>=13?13:M)];
}
int main(){
int i;
scanf("%d",&i);
printf("%s\n", GetMonthName(i));
return 0;
}
966 :
デフォルトの名無しさん :2009/06/08(月) 13:00:00
>>958 , 965
この程度の処理で速度云々なんて語れない気がするが、
とりあえず "%s\n" なんて形でprintf使うならputsにしろといっておく。
-O4 つけてコンパイルすれば puts に変えてくれると思うが。
>>950 の [5] に反する気がする気がするけど scanf も消してみた。
#include <stdio.h>
inline const char* GetMonth(int n){
static const char *month[] = {"None", "January", "February", "March", "April", "May",
"June", "July", "August", "September", "October", "November", "December"};
// if(n < 1 || 12 < n) return month[0];
return month[n];
}
int main(){
int n = 0;
gets((char*)&n);
n = (n%85-2)%46;
puts(GetMonth(n));
return 0;
}
968 :
951 :2009/06/08(月) 13:51:41
>>955 あー、文章読み違えた見たいだ。すまんね。不安なら
>>965 の人のやつ使ってくれ。
>>static云々。
なんとなくテンポラリアドレスを返さないように気分でつけただけです。
文字列リテラルは大丈夫だった気がしたんですけど、まぁ、気分ですねぇ。
いろんな憶測が飛んで面白いです。
969 :
デフォルトの名無しさん :2009/06/08(月) 15:20:57
[1] c++ [2](1)一次元配列 a[1]〜a[50]に、0〜100点までの点数を入力した後、60点 以上点数のみをa[35]=65,a[45]=67のように表示しなさい。 (2)また前問で今度は60点以上の点数をb[1]〜b[50]に格納してからb[35]=65,a=[45]=47 と表示しなさい。 [3.1] OS:XP [3.2] コンパイラ名とバージョン: turbo c 5.01 [3.3] 言語: c++ [4] 期限:今週の日曜日まで [5] 配列まで習った。
970 :
デフォルトの名無しさん :2009/06/08(月) 15:35:25
>>969 ひとつめ
#include<stdio.h>
int main(void){
int a[50];
int i,j;
for(i=1;i<=50;i++){
printf("点数を入力してください\n");
scanf("%d",&a[i]);
}
for(j=1;j<=50;j++){
if(a[j]>=60){
printf("a[%d]=%d,",j,a[j]);
}
}
return 0;
}
おいw
972 :
デフォルトの名無しさん :2009/06/08(月) 15:45:41
ふたつめ #include<stdio.h> int main(void){ int a[50]; int b[50]; int i,j,k; for(i=1;i<=50;i++){ printf("点数を入力してください\n"); scanf("%d",&a[i]); } for(j=1;j<=50;j++){ if(a[j]>=60){ b[j]=a[j]; } } for(k=1;k<=50;k++){ if(a[k]>=60){ printf("b[%d]=%d,",k,b[k]); } else{ printf("a[%d]=%d,",k,a[k]); } } return 0; }
これはひどい
974 :
デフォルトの名無しさん :2009/06/08(月) 15:54:48
>>974 問題@
#include <stdio.h>
int compare(int x,int y);
int main(void)
{
int x,y;
printf("x:");
scanf("%d",&x);
printf("y:");
scanf("%d",&y);
switch(compare(x,y)){
case 1:
printf("x > y");
break;
case 0:
printf("x = y");
break;
case -1:
printf("x < y");
break;
}
return 0;
}
int compare(int x,int y){
if(x>y) return 1;
else if(x==y) return 0;
else if(x<y) return -1;
}
divがintのわけねーだろw
[1] 授業単元:プログラムの基礎 [2] 問題文(含コード&リンク):scanf)関数により数字を文字列として受け取り、それを小さい桁から表示するプログラムを書け.([例]12345と入力すると54321と表示する) [3] 環境 [3.1] OS:Linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語:C言語 [4] 期限: ([6月8日17:00まで]
979 :
デフォルトの名無しさん :2009/06/08(月) 16:35:39
[1] 授業単元:プログラミング演習 [2] 問題文(含コード&リンク):ターミナルから英字だけからなる1つの文字列Sと2つの文字c0,c1を読み込む。 文字列Sがc0を含むときc0をc1に入れ替えるプログラムを作成しなさい。 なお、文字列の長さは256文字までとする [3] 環境 [3.1] OS:Linux [3.2] コンパイラ名とバージョン:gcc [3.3] 言語:C [4] 期限:6月10日 0:00 [5] その他の制限:ポインタを使うこと。 aaabbbccc /*文字列*/ a A /*文字2つ*/ AAAbbbccc /*実行結果*/
980 :
デフォルトの名無しさん :2009/06/08(月) 16:38:43
>>974 >>976 の
double div(int x,int y){
return (double)x/y;
}
を
double div(int x,int y){
return (double)x/y;
}
に変更それにあわせて6行目、22行目も変更してくれorz
13!>2^32>12!だから32ビットOSでは13以上の階乗を直接扱えない
>>980 階乗使わないで加算の再帰にすれば大きな数字でもいけるが、
計算時間が半端じゃなくかかるようになる。
>>980 factorial 作れ、という時点で整数では溢れるからしょうがないのでは。
factorial 経由しなければもうちょっとは行けるだろうけど。
long int 使っても状況は変わらんだろうし。
985 :
デフォルトの名無しさん :2009/06/08(月) 16:52:19
>>983 しかしこれでは実用性が低いから完全とは言えなさそうだと思う
20個の中から15個とか、そういう計算もできないとダメって言われそう
まあ問題文の要件は満たしてるからOKなんかな
BCDを使えば10万桁とかでも計算できるぞ^^ めんどいからやらんが。
988 :
デフォルトの名無しさん :2009/06/08(月) 17:08:07
[1] c++ [2]a[1]〜a[50]順次数字1〜50までを格納したあとa[1]=1・・・a[50]=50と表示しなさい。 ただし横に10列に表示しなさい。 [3.1] OS:XP [3.2] コンパイラ名とバージョン: turbo c 5.01 [3.3] 言語: c++ [4] 期限:今週末まで
>>978 #include <stdio.h>
#include <string.h>
int main(void)
{
char str[256],tmp;
int i,j,len;
printf("数字入力:");
scanf("%256[^\n]%*c",str);
len=strlen(str);
for(i=0; i<len-1; i++)
for(j=i+1; j<len; j++)
if(str[i]<str[j]){
tmp=str[i];
str[i]=str[j];
str[j]=tmp;
}
printf(str);
return 0;
}
990 :
デフォルトの名無しさん :2009/06/08(月) 17:20:30
>>988 #include<stdio.h>
int main(void){
int a[50];
int i,j;
for(i=1;i<=50;i++){
a[i]=i;
}
for(j=1;j<=50;j++){
printf("a[%d]=%d,",j,a[j]);
if(j%10==0){
printf("\n");
}
}
return 0;
}
>>990 それだめでしょ。a[51]にしとかないと index が overrun してる。
この問題自体 index 1〜50 ってところがかなりセンス悪いとは思うが。
あと、 c++ っぽくした方が良いのかな。整形してない(列そろうように)
#include <iostream>
using namespace std;
int main(){
const int N(50);
int* a = new int [N+1]; // ← index が気分悪い
for(int j=1; j<=N ; ++j)
a[j] = j;
for(int j=1; j<=N ; ++j){
cout<<"a["<<j<<"]="<<a[j]<<" ";
if( j%10==0 )
cout<<endl;
}
}
>>991 メモリの開放忘れてますよ。
最後に delete [] a;
>>993 サンクス。忘れてた。普通 vector 使ってるからなぁ。
ただ、この場合は STL 使わん方が良いかと思って配列使ってしもうた。
vector を使うなら、ぜひ生成は generate で、表示は copy で(重いだけ)
>>985 こういう風にすればオーバーフローが起こりにくいけど、factorialを使ってないからダメか。
int combination (int n, int r) {
int a = 1, k = 1;
r = min(r, n - r);
while (k <= r) {
a *= n--;
a /= k++;
}
return a;
}
32ビットintの場合、30C14はいけるけど、30C15は途中でオーバーフローして駄目。
結果はオーバーフローしないんだけどね。
ksk
ksk
ksk
1000なら皆平和
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。