1 :
デフォルトの名無しさん :
2010/05/26(水) 07:45:28 BE:94671825-S★(522522)
2 :
デフォルトの名無しさん :2010/05/26(水) 12:04:44
[1] 授業単元:プログラミング演習 [2] 問題文:単価と数量を入力するごとに金額を表示し、データ入力終了後合計金額と、千円札のみで払う場合の枚数と釣り銭を表示しなさい。なお、入力データのの終わりは単価0とする。 実行例 300 2 <ーーデータ入力 300*2=600円 <ー表示 250 5 250*5=1250円 100 1 100*1=100円 1500 2 1500*2=3000円 350 4 350*4=1400円 0 0 <ーーデータの終わり 合計金額 6350円 <ーー合計表示 1000円札 7枚 <ーー1000円札の枚数表示 釣り銭 650円 <ーー釣り銭の金額表示 [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン:gcc [3.3] 言語: C [4]期限:26日PM10:00 [5]その他制限: printf int while scanf float for 今まで習ったのはコレくらいです。今回もよろしくお願いします。
>>2 前スレまだ残っているが。0 0の時の出力はない方がいいなら、
if ( tanka != 0 )
を、小計出力の前に置けばいい。
int main()
{
int tanka, kosu, shokei; // 単価 個数 小計
int maisu, gokei = 0; // お札枚数, 合計
do {
scanf("%d", &tanka);
scanf("%d", &kosu);
shokei = tanka * kosu;
gokei += shokei;
printf("%d * %d = %d 円\n", tanka, kosu, shokei);
} while ( tanka != 0 );
printf("合計金額 %d円\n", gokei);
maisu = gokei/1000 + 1;
printf("1000円札 %d枚\n", maisu);
printf("お釣り %d円", maisu*1000 - gokei);
}
4 :
デフォルトの名無しさん :2010/05/26(水) 22:48:48
>>3 ありがとうございます!!
新レスについ、スレしてしまいました;;
[1] 授業単元: C言語 [2] 問題文(含コード&リンク): 以下の実行結果になるようおねがいします 文字列を入力してください adlkjgeiakdalf 確認したい文字を入力してください a 文字(a)の数は3文字です [3] 環境 [3.1] OS: Windows [3.2] gcc 3.4 [3.3] 言語:C [4] 期限:できる限り早くおねがいしますorz [5] その他の制限: 一次元二次元配列まで習いました
7 :
デフォルトの名無しさん :2010/05/27(木) 00:37:35
前スレで同じ質問したのですが 行列の積を計算するプログラムのコードを提出という課題が学校で出たのですが 前スレでは初期化していない事と添え字がずれていると指摘されたのですが、それを直しても下の実行結果でした n (n<=10) の値を入力して下さい。 2 行列aの1行1列の値を入力して下さい。 1 行列aの1行2列の値を入力して下さい。 2 行列aの2行1列の値を入力して下さい。 3 行列aの2行2列の値を入力して下さい。 4 行列bの1行1列の値を入力して下さい。 1 行列bの1行2列の値を入力して下さい。 2 行列bの2行1列の値を入力して下さい。 3 行列bの2行2列の値を入力して下さい。 4 c[0][0] = 10551303 c[0][1] = 4106 c[1][0] = 15 c[1][1] = 29
>>008 #include<stdio.h>
int main (void)
{
int i,j,k,n;
int a[10][10],b[10][10],c[10][10];
printf("n (n<=10) の値を入力して下さい。\n");
scanf("%d",&n);
for(i=1;i<=n;i++) { for(j=1;j<=n;j++) {
printf("行列aの%d行%d列の値を入力して下さい。\n",i,j);scanf("%d",&a[i-1][j-1]);}}
for(i=1;i<=n;i++) { for(j=1;j<=n;j++) {
printf("行列bの%d行%d列の値を入力して下さい。\n",i,j);scanf("%d",&b[i-1][j-1]);} }
// for(i=0;i<=n;i++) { for(j=0;j<=n;j++) { for(k=0;k<=n;k++){
for(i=0;i<n;i++) { for(j=0;j<n;j++) { c[i][j] = 0; for(k=0;k<n;k++){
c[i][j] += a[i][k] * b[k][j];}}}
// for(i=0;i<=n;i++){for(j=0;j<=n;j++){
for(i=0;i<n;i++){for(j=0;j<n;j++){
printf("c[%d][%d] = %d\n",i,j,c[i][j]);}}
return 0;
}
>>009 が、おせっかいな人=あわて者
982 が焦ったということで。
>>9 落ちてなければ次スレとして使えばいいさ
検索で飛んでくる人はどっちにいくか知らないけどw
12 :
デフォルトの名無しさん :2010/05/27(木) 18:16:43
RGBで虹色のグラデーションを作るプログラムを3行以内で教えてくだしあ><
13 :
デフォルトの名無しさん :2010/05/27(木) 19:16:30
虹色の7色っていうのは何らかの規則性があるのでしょうか 自分で1つ1つ色を指定していなかくてはいけないのですか??
国によって虹の色の考え方は違う
>>12 なんとか三行になったぞw
int f(int x){int y;x%=1024;y=x/256;z=x%256;if(y==0)return 0;if(y==1)return z;
if(y==2)return 255;return 255-z;}
long col(int x){if(x<0||896<x)return 0;return f(x+512)<<16+f(x+256)<<8+f(x);}
>>015 1/30 でバンドになるから、30*30で表示してみた。いいぞ。
#include <stdio.h>
int f(int x){
int y, z;
x%=1024;y=x/256;z=x%256;
if(y==0)return 0;
if(y==1)return z;
if(y==2)return 255;
return 255-z;
}
long col(int x){
if(x<0||896<x)return 0;
return (f(x+512)<<16) + (f(x+256)<<8) + f(x);
}
int main(void){
int i, j;
printf("Content-type: text/html\n\n");
/* ここから3行 */
printf("<html><body><table width=200 height=200>\n"); for(i=0;i<30;i++){ printf("<tr>\n");
for(j=0;j<30;j++) printf("<td bgcolor=\"#%06LX\"></td>", col(i*30+j));
printf("</tr>\n");} printf("</table></body></html>\n");
/* ここまで */
}
7行プログラムスレでやれw
20 :
9 :2010/05/28(金) 07:33:53
先日のうっかり者です。 ここはスレ立てに関していい意味で緩いようですので、再利用不可の単発でもないので残すことにいたします。 もしも落ちていなければ、次スレにでも隔離スレにでも何なりと使ってください。以上です。 質問メインのスレでお騒がせしいたしました。それでは失礼いたします。
いいってことよ
↑自演
スレタイって主以外でも変えられるのかな。できないとすると使い物にならないけど。
主が立てた人って意味なら主でも変えられないよ
なんかインターネット創成期みたいな会話だな
インターネット創成期にこんな高度な会話してる人がいたらびっくりするね
28 :
デフォルトの名無しさん :2010/05/29(土) 08:34:07
猫、以下の話だが↓この結果が #include<stdio.h> main(){ int i; for(i=1;i<6;i++) printf("%*d\n",i,i); } ↓こうなるように誰かお願いします。 @ @ @ @ @ @ @ @ @
// 描画 #include <stdio.h> #define N 6 int main(void){ int i; for(i=1; i<N; i++) printf("%*d\n", i, i); for(i-=2; i>0; i--) printf("%*d\n", i, i); return 0; }
無駄にループを一つにしてみた。 #include <stdio.h> int main(void) { int i, j = 1; for(i=1; i > 0; i += j) { if(i==5) j = -1; printf("%*d\n", i, i); } return 0; }
32 :
デフォルトの名無しさん :2010/05/29(土) 13:06:45
>29 >30 ありがとうございます。数字が@に変身すると、もっとありがとうなんですが。 がんばって立派な大学生になります。
>>31 【1】
(1) print_g(&t);
(2) x = (t->a.x + t->b.x + t->c.x) / 3;
(3) y = (t->a.y + t->b.y + t->c.y) / 3;
【2】
(1) return 1;
(2) return car(head) * fact(cdr(head));
>>32 printf("%*d\n", i, i) → printf("%*c", i, '@');
35 :
デフォルトの名無しさん :2010/05/29(土) 13:52:28
>34 まじ、ありがとうございました。
[1]授業単元:プログラミング演習 [2]問題文:たしてちょうど15になる7個の自然数の組合せをすべて列挙し、、 すべての組合せを表示し終えた後にそれらの組合せが全部でいくつあるの かも出力するプログラムを作れ。 [3] [3.1]OS:windows7 [3.2]コンパイラ名とバージョン:gcc [3.3]言語:C++ [4]期限:2010年6月1日まで [5]できればfor文orwhile文(他の文が一部混ぜっていてもいい) お願いします。
元のスレの答えで十分だろ
test
>>36 for文も使ってある
#include <stdio.h>
void hoge(int *count, int result[], int left_num, int min_num, int rest){
int i;
if(rest<=1)
{
result[0]=left_num;
for(i=0;i<7;i++) printf(" %d", result[i]);
printf("\n");
*count+=1;
return;
}
for(i=min_num;i<=left_num/rest;i++)
{
result[rest-1]=i;
hoge(count, result, left_num-i, i, rest-1);
}
}
int huga(void){
int count=0, result[7];
hoge(&count, result, 15, 1, 7);
return count;
}
int main(void){
printf("%d\n", huga());
}
43 :
デフォルトの名無しさん :2010/05/30(日) 00:27:48
>>43 5目並べなのか10目並べなのかはっきりしてほしい
どこをどう読んだら10目並べなんてものが出てくるのかw
>>45 これ
[step1]'十','−’,'|’などの文字を使って五目並べをするための10行10列の格子枠をキャラク
タモードで表示する。関数化(関数名waku)しておく。(注意:この格子枠を表示するのが
難しければ、列を表す最上端の数字1〜1Oと、各行の左端に行を現す数字1〜10を表示
すること)
1 2 ・・・・・10
+−−−+−−−+・・・
1 |
+
2 |
五目並べをする盤のサイズが10*10なだけにしか読めないが。
そうだな、ルールを勘違いしてた
AとBとでループ2つってのは微妙
51 :
デフォルトの名無しさん :2010/05/30(日) 16:08:01
>>49 斜めの判定の実装で悪戦苦闘しているうちに先越された!
くやしい! でも感じちゃう。
>>49 そう思ったなら自分で改造してみるのがプログラマってもんでしょう!
…負け惜しみじゃないですよ^q^
案外すぐ直せたので直しました void main() { int x, y, player = 1; char buf[32]; waku(0, 0, 0); for (;;) { do { printf("%sさん次の手を入力しなさい\n", koma[player]); fgets(buf, MAX_BUF, stdin); } while (inputToVector(buf, &x, &y)); waku(x, y, player); if (narabi(x, y, player)) { printf("%sさんの勝ち\n", koma[player]); break; } player = 3 - player; } }
質問1に答えやすくしてるのかと思ったけどそうじゃなかったのか
最初はそのつもりだったけど
>>50 に指摘された時点ではすっかり忘れてたw
[1] 授業単元:C言語プログラミング [2] 問題文:10進数を2進数に変換するプログラムをC言語でつくれ [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 明日の昼 [5] その他の制限: 制限はありませんが基本的な構造でお願いします
>>59 ありがとうございます。
制限に書き忘れましたができればビット演算子は無しでお願いします。
どこにビット演算子が
簡単な問題だとレスがたくさん付くなw
たくさんも何も一人しか答えてないんじゃ?
>>62 再帰呼び出しの必要のない時は使わないのが吉
>>64 そうそう、これが「4元1次方程式を解け」とか「ルンゲ・クッタ法で」とかだったら、とたんに放置されてしまうんですよね。
放置+void main()議論でごまかす
>>68 void main() 議論は宿題がでなかった時期に燃えたのでは?
>>69 よく見るとそうだな
でも、数独議論でごまかすはあったようなきがする
数独は英語が読めないバカだったかバブルソートも知らないアホだったかが スレを流そうとしてたんじゃねーの?w
C++の宿題出してくれ
自分自身を出力するソースコードをお願いします
ググればみつかるだろ
[1] 授業単元:C言語プログラミング [2] 問題文:コマンドライン引数に指定された文字列それぞれが 16進数表記で表された0以上100万以下の整数であ るをことをチェックした後、それを12進数に 変換したものを表示するプログラムをつくれ 16進数表記の先頭の0xはなくても良いがあってもエラーに してはならない。16進数表記になっていない、あるいは 指定された範囲に無い場合はその旨表示する。 [3] 環境 [3.1] OS: Windows XP [3.2] コンパイラ名とバージョン: Visual C++.NET 2008 [3.3] 言語: C [4] 期限: 明日の夕方 [5] その他の制限: stdio.hをincludeできる。 そこで定義されている関数のみ標準関数として使用できる 標準関数以外で定義して使用できるものは1個に限るものとする。 グローバル変数は使用してはならない 各関数のローカル変数は2個まで使用できる。配列は使えない。 構造体、共用体 else文を使ってはならない。
制限めんどくさくてやる気しないw
やってみようと思ったが制限が厳しすぎて一気にやる気がなくなった まぁ、可能なんだろうけど
意訳すると 「やる気がない」=「できない」
>標準関数以外で定義して使用できるものは1個に限るものとする。 これって自作関数1個しか作っちゃいけないってことか? メイン一つと自作関数一つ、それぞれローカル変数2個だけってかなり厳しくないか?
main定義したら終わりじゃね
仮引数ってローカル変数扱いだから、メインで他の変数宣言しちゃだめじゃんw
>>80 暗黙のうちに、main関数以外で自作できるのは1つだけ
でいいんぢゃね?
あと引数は、C言語教室的にはローカル変数とは区別されるだろ?
{}の中で定義される変数のことなんだろから
#include<stdio.h> int main(int argc, char *argv[]){ long x, y=0; if(argc<2){ printf("\nエラー:コマンドライン引数を指定してください\n"); return 1; } if(sscanf(argv[1], "0x%lx", &x)!=1){ if(sscanf(argv[1], "%lx", &x)!=1){ printf("\nエラー:十六進数ではありません\n"); return 2; } } if(x<0 || 1000000<x){ printf("\nエラー:値が範囲外です\n"); return 3; } y+=(x/(1*12*12*12*12*12))%12<<20; y+=(x/(1*12*12*12*12))%12<<16; y+=(x/(1*12*12*12))%12<<12; y+=(x/(1*12*12))%12<<8; y+=(x/(1*12))%12<<4; y+=(x/(1))%12; printf("%lx\n", y); return 0; }
ずいぶん厳しい制限だなぁこれ。
strtolってstdlibか まんどくせ
#include<stdio.h> long func(long x){ long y=0; y+=(x/(1*12*12*12*12*12))%12<<20; y+=(x/(1*12*12*12*12))%12<<16; y+=(x/(1*12*12*12))%12<<12; y+=(x/(1*12*12))%12<<8; y+=(x/(1*12))%12<<4; y+=(x/(1))%12; return y; } int main(int argc, char *argv[]){ long i, x; for(i=1;i<argc;i++){ if(sscanf(argv[i], "0x%lx", &x)!=1){ if(sscanf(argv[i], "%lx", &x)!=1){ printf("\nエラー:十六進数ではありません. %s\n", argv[i]); continue; } } if(x<0 || 1000000<x){ printf("\nエラー:値が範囲外です. %ld\n", x); continue; } printf("%s -> %lx\n", argv[i], func(x)); } return 0; }
sscanf()って前の一部が条件満たすと読み込めちゃうんだよな。
これが12進数じゃなくて8進数とか6進数とかだったら お手上げだな
先程はありがとうございました。 たびたび申し訳ありません。 [1] 授業単元:C言語プログラミング [2] 問題文:引数に与えられた10進数を2進数に変換し表示するするプログラムをC言語でつくれ [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 明日の昼 [5] その他の制限: 制限はありませんが基本的な構造でお願いします
[1] 授業単元:プログラミング演習
[2] 問題文(含コード&リンク):
n元連立1次方程式を解き,掃き出し法により求まる係数マトリクスの逆行列と解ベクトルを表示するプログラムを作れ。
[3] 環境
[3.1] OS:WindowsXP
[3.2] コンパイラ名とバージョン: Visual C++
[3.3] 言語:C++
[4] 期限: 2010年6月3日15:00頃まで
[5] その他の制限: 出来るだけ基本的な方法でお願いします。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10637.txt 時間がなくなってきたので質問させていただきました。
自分なりにC++を扱うホームページの逆行列のプログラムを参考に、あまり分からないながら作ったのが下のプログラムです。
メモリやn次元の定義等は講義中で習っていないので良くわからないのですが、解を代入して求める未知数ベクトルを算出する作業が思うようにいきません。
URLのプログラムをうまい具合に変えて問題文の条件を満たすプログラムにして頂けると助かります。
またinclude<iostream>やcout、cinは授業の方では扱っていないので
include<stdio.h>の形でprintfやscanfを用いて作って頂けたら幸いです。
C++の授業でiostreamでなくstdio.hを使わせるってのはどうなんだろう せめてstdio.hでなくcstdioじゃないかいな
>>103 ノートン先生のSONARが怒っているんだろ?
だったら自分のコンパイル環境に問題がないと信じているのなら、
それが吐いた実行ファイルも信頼してやれ。
最近のSONARは過剰反応しすぎだ。
>>104 最近じゃなく昔からだw
>>103 nに2以上が代入されたときにiのループの最初(i=2)はjのループを一回も回らない(j<i不成立)から
初期化されていないmと0とを比較しようとするので2が出力されるかどうかは運次第
110 :
デフォルトの名無しさん :2010/06/01(火) 17:03:02
[1] 授業単元:プログラミング演習 [2] 問題文(含コード&リンク):(1)x^2*cosx の0〜π/2までの積分 (2)(logx)^2 の1〜eまでの積分 [3] 環境 [3.1] OS: Windows [3.2] visual c++ [3.3] 言語: c++ [5] シンプソンの公式と台形公式を使っての数値積分をするプログラム
112 :
デフォルトの名無しさん :2010/06/01(火) 18:02:28
>>113 x-y 平面に展開せよ、とのことであるが、 x軸、y軸になにをわりあてるか、情報をください。
1) x: 時間t, y:θ(t)
2) x: 時間t, y:θ'(t)
3) x: θ(t), y:θ'(t)
どれもありそうです。
115 :
デフォルトの名無しさん :2010/06/01(火) 19:52:00
宿題っていうかプログラム作成依頼スレみたいなのって無い?
>>114 >>113 です。
3つのデータを作って、そのあとgnuplotで2つ選んでレポートを書くという課題です。
なので、3つのデータをファイルで書き出せるようにしたいです…。
説明不足ですいません…
それ、答えになってんの?
120 :
デフォルトの名無しさん :2010/06/02(水) 00:22:37
[1] 授業単元:プログラミング演習 [2] 問題文:整数nを入力し、以下のようになサイズnの”Z型の図形”を”*”で表示するプログラムを作成しなさい。 ただし、図形を表示するためのnの値は3以上とし、2以下の値が入力された場合は処理を終了する様にしなさい。 [実行例] 3 <-n入力 n=3 *** * *** 4 <-n入力 n=4 **** * * **** 8 <-n入力 n=8 ******** * * * * * * ******** 2 [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: [3.3] 言語: C [4]期限:6/2日PM10:00 [5]その他制限: printf int while scanf float for のみ使用、2重ループ必
#include <stdio.h> int main(void) { int i, j, n; while(1) { scanf("%d", &n); if(n <= 2) break; printf("n = %d\n", n); for(i=1; i<=n; i++) { for(j=0; j<n; j++) printf("%c", i==1||i==n||i+j==n ? '*' : ' '); printf("\n"); }} return 0; }
厳密にはcの宿題と言えないかもしれないんですが、宜しくお願いします。 cをコンパイルしてできたexeを起動して、プログラムの中で起きてる割り込みを調べるには どのようなコマンドや方法で調べればいいのでしょうか?
123 :
デフォルトの名無しさん :2010/06/02(水) 15:58:49
125 :
デフォルトの名無しさん :2010/06/02(水) 16:04:27
>>124 すみません、もっと大きな画像を貼れるアップローダを探してきます。
126 :
デフォルトの名無しさん :2010/06/02(水) 16:14:22
>>121 書いていただきありがたいのですが
制限がprintf int while scanf float for のみ使用、2重ループ必
なので、breakは使用できません。
説明が曖昧でスミマソ
ちょっと条件はっきりしないんだけど、nは入力するごとにプログラムが終了するのか、
>>121 みたいに2以下が入力するまで繰り返し入力するのか、どっち?
>>127 - if(n <= 2) break;
+ if(n <= 2) return 0;
2以下を入力するまで繰り返しです 何度もすっ見ません;
#include <stdio.h> int main(void) { int i, j, n; while(scanf("%d", &n)==1 && n > 2) for(i=1; i<=n; i++) for(j=0; j<=n; j++) printf("%c", j==n?'\n':i==1||i==n||i+j==n?'*':' '); return 0; }
printf("n=%d\n", n)忘れたw #include <stdio.h> int main(void) { int i, j, n; while(scanf("%d", &n)==1 && n > 2){ printf("n=%d\n", n); for(i=1; i<=n; i++) for(j=0; j<=n; j++) printf("%c", j==n?'\n':i==1||i==n||i+j==n?'*':' ');} return 0; }
いえいえ
またお前か
>>137 「ポインタ配列」ってなんですか?
”配列へのポインタ”ですか?
というあたりを出題者に問うてください。
ポインタの配列でしょう
>>137 [1]
#include <stdio.h>
int main(void)
{
int i, a[5] = {1,2,3,4,5}, b[5] = {6,7,8,9,10}, *p[2];
p[0] = a;
p[1] = b;
for(i=0; i<5; i++) printf("%f ", (p[0][i] + p[1][i]) / 2.0);
return 0;
}
void print(char **string, int n) { while(n--) puts(*string++); }
初期化は代入とは区別されるのが普通
>>138 =140は問題をどう解釈したのか気になる
>>138 配列はANSI Cでもまとめて扱うことはできない。
だから”配列へのポインタ”と言うのは存在しない。
”配列の先頭要素へのポインタ”なら存在する。
int (*p)[N]; pは要素数Nの配列へのポインタ
>>146 またそういう物議をかもすレスをする。いいんだけどさ。
>>102 やはり授業の延長だけでは難しいんですかね。
cstdioについて自分でも少し勉強してみます。
>>108 ありがとうございます。
動作に不具合はありませんでした。
こちらの要望にも沿ってお答え頂き大変助かりました。
>>144 ん、古いC ならば理解できますが、auto な変数への初期化が OK となっている現在では差異がわかりません。
でも C++ の話はなしね。
>>145 いや、間違って解釈していました。
ごめんなさい。
ほんと毎回毎回日本語読めない低脳だなw
ちゃんと謝ったら謝ったでこの扱いか。厳しいスレだなあ。同情する。
ささいなミスでも厳しく追求されるのがこのスレだぜ?w
なに、馴れてます。どうせ自分では宿題のひとつもとけない人でしょうし。
慣れる前に問題を正しく読めるようになってくれw
ん、精進します。
トリつけるんならレス全部につけてくれないかな。 NGしやすくなるし。
物性は専門ではないので、どう公式にあてはめればいいかわからないのです。ごめんなさい。
ん
一行以上の文章が読めない人なのかもしれない
学校の先生ってやっぱバカがやってんだな。。 scanfとか平気で使わせるし、第一曖昧すぎる。 mainから呼び出すだけならwhileも使えないしどうやってやれっての。
燕雀いずくんぞ鴻鵠の志を知らんや
>>167 sanf() はよく批判されていますが、危険性のない使い方であればいいと思います。
sed -e 's/sanf/scanf/'
>>167 グローバル変数使いまくれば出来るんだけど
引数や戻り値を持つ意味がなくなる
>>171 まったく。
なまじ分かる学生の方が悩むだろうな
[1] 授業単元:Cプログラミング [2] 問題文(含コード&リンク): 1、x[6]を宣言して、x[0]に5、x[1]に8、x[2]に6、x[3]に4、x[4]に1、x[5]に3を代入した後、ポインタを使って、x[0], x[2], x[4]の和と、x[1], x[3], x[5]の積を求めるプログラムを作成せよ。 2、与えられた文字数分だけ文字を一文字ずつ順に表示するprint関数を作成せよ。引数として文字列配列stringと整数nを用いること。ここで、stringは文字型配列の先頭アドレスを、nは表示する文字を意味する。 3、以下のmain分に従い、2つの文字列配列の中身を交換する関数exchangeを完成させよ。 int main(void){ char string1[] = "abcdefg"; char string2[] = "hijklmn"; printf("string1 = %s string2 = %s\n", string1, string2); printf("exchange(string1, string2)"); exchange(string1, string2); printf("string1 = %s string2 = %s\n", string1, string2); return 0; } [3] 環境 [3.1] OS:Win Vista [3.2] コンパイラ名とバージョン:VS 2008 [3.3] 言語:C [4] 期限:[2010年6月3日12:00まで] [5] その他の制限:問題文で指定されていること以外は無し よろしくお願いします
>>173 [1]
#include <stdio.h>
int main(void){
int x[6];
x[0]=5, x[1]=8, x[2]=6, x[3]=4, x[4]=1, x[5]=3;
printf("wa=%d\n", *(x) + *(x+2) + *(x+4) );
printf("seki=%d\n", *(x+1) * *(x+3) * *(x+5) );
return 0;
}
>>173 1
int main(int argc, char ** argv)
{
int x[6]={5,8,6,4,1,3};
int *p = x;
printf("sum = %d, mul =%d\n", (*p) + *(p + 2) + *(p + 4), *(p + 1) * (*(p + 3)) * (*(p + 5)));
return 0;
}
2は意味がまったく分からない。
文字列配列ってのは文字配列の事か?普通に考えるとchar**になるが、それだともっと意味が分からない。
void myprintf(int n, char * string)
{
int len = strlen(string);
while(len--)putc(n);
}
ほい。(ほんとか?)
3.
void exchange(char *str1, char *str2)
{
char buff[7];
memcpy(buff, str1, 7);
memcpy(str1, str2, 7);
memcpy(str2, buff, 7);
}
>>143 おいそれC++じゃないとコンパイルエラーになるぞ
>>137 の[3.3]にはCと書いてあるんだが
>>180 コンパイラは関係ない
int *p[2] = {a, b};
これがC++でしか通らない
Cなら
int *p[2];
p[0] = a;
p[1] = b;
と書かなければならない
>>179 おかしいですね。
gcc でも bcc32 でも cl でも駄目押しの lsi-c でも、コンパイルできましたが。
auto な配列への初期化は、最近の規格では OK ではないでしょうか。
gccをつかって細かいこと気にしすぎな人用のコンパイルオプションつけてコンパイルできたらそれでいいよ
187 :
184 :2010/06/03(木) 08:41:46
はい、拡張子は .c です。どのコンパイラでも問題なくコンパイルできます。
>>181 勘違いしてるぞ
Cは初期化の時はもう値が決まっている定数ならば何でもよい
関数の戻り値だけがC++で拡張された
>>188 なるほど、元のコードでは
static int a[] = { 0 };
static int b[] = { 0 };
int p[] = {a, b};
としてあり、 a, b, はコンパイル時には確定しているので auto な p への初期化は可能なんですね。
これを
int a[] = { 0 ];
int b[] = { 0 };
int p[] = {a, b};
とすると、a, b は実行するまではわからないから、コンパイルできないようですね。
> int a[] = { 0 ]; > int b[] = { 0 }; > int p[] = {a, b}; ・・・。 int *p[] = {a, b}; じゃないのか?
>>190 なんで神妙な感じでそこにつっこみいれたんだろ。
流れ見てたらそれはtypoだと予想できる
どうせなら]にも突っ込もうぜw
>>189 そんな感じだね
C++ではコンパイルできてしまうから、Cでも出来ると思いがちだが
実は無理だという。
特に俺の場合staticは関数の呼び出し毎に値が変わって欲しくない
変数にしか付けないので、余計にエラーが出やすい。
で、今回の場合はaとbがstaticであり、この場合にpをabで初期化することを咎めるのはありやなしや
>>194 標準のCでは問題ない、ということですね。
覚えたての格言や四字熟語を並べ立てて越に浸ってるやつなんなの
「悦に浸る」だった。Google IMEって誤用とかも変換候補にあるから使いづらい。
書き込み前に確認しなかった過失を棚に上げてGoogleIMEのせいにするやつってなんなの 使いづらいならやめればいいじゃん
これがゆとりの実態です 経験値を得ることでモンペへと進化します
GoogleでもIMEでもとにかく外人の作るソフトはウザイのがおおいな。 テキストボックスの中の文字列に編集を加えようとすると必ず全部選択する。 オレは神経をつかってカレットが狙ったところに来るようにクリックしてるんだがな!
>>201 コピーしたいのに全選択がめんどくさいというゆとりのための仕様だよ
っていうか、業務系だと日本でも多々ある、というか、そういう要望がでてくるよ
言われたことない?
#include<stdio.h> int main(void) { int array[5][4]; int i,j; for(i=0;i<4;i++){ for(j=0;j<3;j++){ printf("%d行%d列の要素を入力してください: ", i+1, j+1); scanf("%d", &array[i][j]); array[i][3] += array[i][j]; array[4][j] += array[i][j]; } }
for(i=0; i<5; ++i){ for(j=0; j<4; ++j){ printf( "%5d ", array[i][j] ); while(i==5){ printf( "%5d ", array[i][3] ); i++; while(j==4){ printf( "%5d ", array[4][j]); j++; } } } printf( "\n" ); } 「4行3列の配列をキーボードから読み込み、 各行、各列の和、及び配列全体の総和を求め、表示する プログラムを作成しなさい。」という問題です。 途中まで作りましたが、出力が↓のようになってしまいます。どうすればいいんでしょうか? 1 3 2 -858993454 4 5 6 -858993445 2 4 7 -858993447 11 13 15 -858993421 858993442 -858993435 -858993430 -858993460
言語はC++ 環境はvisual C++ です。 あさってまでに提出しなければなりません。
配列範囲外
>>206 配列範囲外とはどういうことでしょうか?
配列範囲内だが未初期化、というか、過大な領域を作っている
>>208 どこが悪いんですか?修正の仕方を教えてもらえるとありがたいです。
配列の範囲だっつってんだろ
>>209 int array[5][4]={{0}};
>>211 ありがとうございます。
おかげで総和以外は出力できました。
もう一つ、総和の計算と出力はどうすればいいんでしょうか?
>>209 自分で作ってないからわかんないんだよ
文字列のクセで1個余分に、ってしたのかもしれないけどさ。
あと一息だね ↓これが何してるのか知ってたらピンとくる array[4][j] += array[i][j];
ここって、プログラムができなくて授業についていけてない奴を、さらについていけなくさせるために プログラムを全部作ってあげるスレだと思ってたけど、意外とみんな優しいんだね
>>215 若い芽を摘むかのごとく、
全部教えて上げて、自分たちの食い扶持を維持するためのスレでもある。
[1] 授業単元:Cプログラミング
[2] 問題文(含コード&リンク):
下記のアップロードされたファイル(数字の羅列)を読み込み、並び替え方法(昇順/降順)で指定されたファイル(out.txt)
へ出力するプログラムを作成せよ
http://www1.axfc.net/uploader/He/so/280605 以下実行結果
並び替え方法をしていしてください(1:昇順、2:降順)
1
並び替えたファイルへ出力しました。
cat out.txt ←catコマンドで中身確認
1
3
3
3
[3] 環境
[3.1] OS:Win Vista
[3.2] コンパイラ名とバージョン:GCC
[3.3] 言語:C
[4] 期限:本日中
急で申し訳ないですがよろしくお願いします。
授業すらついていけない奴は競争相手にもならんが 死ぬほど足を引っ張ってくれるので成敗しておく
そもそもからして、C言語記述課題に対して「解答」という 用語が適切か?
>>220 頭を使わなくても解ける問題なら質問には来ない
すくなくとも回答ではない
>>220 もとい文法やライブラリなどの制限があるから完全に自由ではない
のだがそれでも結果が殆ど同一(例えば数字だけとかキーワードだけ
とか)というわけではないんで解答とは言わないほうが良いよな...
だから
>>221 の言う通り回答というのもおかしい。
強いて言えば模範文例ってところなんだろな
せっかく上げてくれた模範文例を貶すのはやはりマナー違反
間違ってても?
コンパイラが文法違反とかはチェックしてくれるんで 「間違っている」という文章があがることはあまりない 文法以外の明示的暗黙的問わず存在する構文制限や 課題の意図に沿った文章になっているかどうかについては 100%そうであるとも言えないのは当然だが
219を昇順・降順で実行して見てから言えよw
>>219 はコンパイルできるけど、「間違った」プログラムだぞ
[1] 授業単元:データベース論 [2] 問題文(含コード&リンク):サンプルデータから情報を取りだしその情報をstudents.txtとして出力するプログラムを組め Students.txtの例は以下の通り 1 tanaka A 2 sano B 3 hori C [3] 環境 [3.1] OS:WindowsVista [3.2] コンパイラ名とバージョン: Visual C++ [3.3] 言語:C++ [4] 期限: 2010年6月6日24:00 [5] その他の制限: サンプルデータの形式はSqlite3、名前はstudents.sqlite3です。studentsテーブルを持ちそのテーブルはID(id)、学生の名前(name)、学生のクラス(class)を持っています。よろしくお願いします。
SQLite3 DataBase
>>225 模範とならないものなら?
参考文例とでも読み替えておけばよいのかなー
リスクを気にせず間違えまくるアホはできれば回答しないで欲しいけどな
>>214 返答できなくてすいませんでした。
おかげで完成させることができました。
ありがとうございます。
間違った回答は叩けということでよろしいか
指摘が具体的ならいいんじゃないか
>>234 あんたは一生解答でけへんくせに、口だけは達者やなあ
>>237 お前は今まで何回間違えたか覚えてないの?
>>235 です。何度もすいません。
↓のように出力するにはどうすればいいでしょうか
1 4 5 10
4 5 6 15
5 8 7 20
10 10 10 30
20 27 28 75
歪んでしまったので、文章で書きます。 「行和、列和の前は少し空けるようにせよ」と書いてあります。
>>241 for(i=0; i<5; ++i) {
if(i==4) printf("\n");
for(j=0; j<4; ++j) printf("%*d", j==3 ? 10 : 5, array[i][j]);
}
ミスった for(i=0; i<5; i++) { if(i==4) printf("\n"); for(j=0; j<4; j++) printf("%*d", j==3 ? 10 : 5, array[i][j]); printf("\n"); }
>>240 何回宿題を解答したか覚えていないのと同じくらいに覚えていません。
そっか。 あんなバカな読み違いをする人間が他にも回答者面してんのか。
>>244 すいません。早速入力したんですが、↓のようになってしまいます。
5
4
5
14
6
4
3
13
5
6
7
18
6
5
5
16
22
19
20
61
if(i==4) を間違えて if(i=4) にしてない?
>>249 printf("%*d\n",...
ってしてない?
>>250-251 そのままコピペしたら出力できるんですが、{ で囲むとできなくなります。
255 :
250 :2010/06/04(金) 21:29:38
あー、そこだったかぁ。。。 for(j=0; j<4; j++) printf("%*d", j==3 ? 10 : 5, array[i][j]); printf("\n"); ? for(j=0; j<4; j++) { printf("%*d", j==3 ? 10 : 5, array[i][j]); printf("\n"); } ○ for(j=0; j<4; j++) { printf("%*d", j==3 ? 10 : 5, array[i][j]); } printf("\n"); エスパーにはなかなかなれないもんだな
>>255 ありがとうございます。
その通りでした。
>>248 で、あなたが回答者になったのはどれですか?恥ずかしがらないで教えてくださいよ。
258 :
デフォルトの名無しさん :2010/06/04(金) 22:35:02
strstr
>>223 は空白じゃないからお気に召さなかったんじゃないかな
>>258 #include<stdio.h>
#include<string.h>
int main(void)
{
char buf[256], keyword[256], *p, *q;
int start, end;
printf("文字列を入力してください。\n");
fgets(buf, sizeof(buf), stdin);
if((p=strchr(buf, '\n'))) *p='\0';
printf("検索文字列を入力してください。\n");
fgets(keyword, sizeof(keyword), stdin);
if((p=strchr(keyword, '\n'))) *p='\0';
printf("文字列「%s」は", keyword);
for(p=buf;(q=strstr(p, keyword));p=q+1)
{
start=q-buf;
end=start+strlen(keyword)-1;
printf("%d文字目から%d文字目に存在します。\n", start, end);
}
if(p==buf) printf("存在しません。\n");
return 0;
}
ま、ここの「回答」で期待されるのは 問題文の意味(文法寄りか応用寄りかとかでも区別)を極力 的確に汲み取りその意図に出来るだけ沿った正しいC文を 模範作文として上げること だろなw
266 :
265 :2010/06/04(金) 23:00:56
ごめん、これ無し。 「全て検索」に対応してない。
>>268 お前が読みそこなったのを一例に挙げただけだぞw
>>268 forの条件判断部に関数置くとか、最悪w
なぜならループごとに同じ返り値が帰ってくることを分かってるものを呼び出すのは無駄だから。
>>272 それもそうですねえ。
strlen() をそのまま書いたほうがよみやすくないですか?
こんなバカが他人に >がんばって中篇にも挑戦しましょう。 こんなこと言ってると思うと笑えない
>>275 素直に
「for文の前に
len_p=strlen(p);
len_q=strlen(q);
とあらかじめ代入しておけばよかった。」と言えばいいじゃないか。
>>276 その程度の基礎さえできてないアホが逆ギレするからウザいんだよw
結局、問題の根本を理解してないから言われたところを直せばいいとしか思わないんだろうなw
>>278 いや、それなおさなくていいよ。
他は見てないけど、少なくともそこの部分に関しては修正しなくていい。
心配なら速度を測ればよいよ。もしくはアセンブリを参照。
>>272 は基礎はできてるのかもしれないけど、そこから先の知識をまだ持ってないみたい。
最近のコンパイラって最適化でstrlen()が消えるの?
282 :
280 :2010/06/04(金) 23:48:07
ごめん、誤解を招くレスをした。 修正するかどうかはその後判断すればいいので、今そこを直すべきじゃないということ。
>>281 横レスすまん。
strlenは消えないが、ループの外に出すことは十分期待していいんじゃないかな
[1] 授業単元:プログラム演習A [2] 問題文:全30件の成績(0〜100点)をキーボードから 読み込み、0〜9点, 10〜19点,・・・, 90〜99点, 100点 の 11通りの区間にそれぞれ何人が入るかを調べなさい。 ただし、各区間に入る人数を溜めておく入れ物として 配列を利用すること。更に調べた人数に従って、各区間を ヒストグラムで表しなさい。 0点:*** 10点:***** 20点:**** ・ ・ 100点:* [3] 環境 [3.1] OS:Windows [3.2] コンパイラ名とバージョン:gcc [3.3] 言語:C++ [4] 期限:2010年6月7日まで
285 :
デフォルトの名無しさん :2010/06/04(金) 23:57:48
訂正 [3.2] コンパイラ名とバージョン: Visual C++
>>284 #include <iostream>
void main() {
int histogram[11] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
int score;
for (int i = 0; i < 30; ++i) {
score = 0;
do {
std::cout << "成績を入力しろ(0〜100)" << std::endl;
std::cin >> score;
} while (score < 0 || 100 < score);
++histogram[score / 10];
}
for (int i = 0; i < 11; ++i) {
std::cout << i * 10 << "点:";
for (int j = 0; j < histogram[i]; ++j) {
std::cout << "*";
}
std::cout << std::endl;
}
}
287 :
デフォルトの名無しさん :2010/06/05(土) 00:11:56
int main() でも return 0; は省略できるのにねえ
それなりにC++っぽいコード書いといてそこ落としたら突っ込まれるのしょうがない。
>>280 , 283
もっといいコンパイラなら strlen() を外にだしてくれるかもしれませんが、私の gcc 3.3.4 や bcc 5.5.1 では -O2 にしても
アセンブラリストを見る限りは、strlen() はループの中のままのようです。
そこから先の知識をもっていないのは私も一緒でしょう。
とにかく、しばらくこちらで今までのように鍛えていただくことにしました。
フォローありがとうございました。
そう思うんなら
>>278 の残りのstrlenもなんとかしろよw
>>291 strlen くらい残しても問題ないだろうに
余計なことするのが好きなんだな
すでにstrlen()で長さを求めて専用の変数に格納してるのに、 その長さをまたstrlen()で求めるのは無意味で無駄。 そんな無駄を許せる人間がプログラムをしてることが驚きだよw
>>284 0点:***
10点:*****
20点:****
・
・
100点:*
>>293 なんでメモリリークの可能性は許しちゃうの?
速度よりもそっちの方が大事だろ普通。
メモリリークを許せる人間がプログラムをしてるなんて心配になるよw
どこでメモリリークするのか◆QZaw55cn4cのために懇切丁寧に説明してあげてくれw
>>297 みたいに自分の意見を言わない人は嫌いだが、メモリリークする箇所あるか?
模範例文として推敲がどの程度行われるべきかは 状況依存としか言いようが無いです 推敲され過ぎてバグも無駄や文書としての矛盾も無い 状態が教育上好ましいかどうかは一概に言い切れま せん ただしその逆が問題になるのは、ネット環境でそれが 容易に複製され大量流布になり得るという観点からの みです。
バカの長文ほど邪魔なものはないな
短文を書けるのが賢いんだと思い込む人よりかアホやバカかも知れないが ナルシスティは小さいかもな
宿題丸投げするようなバカへの回答なんて何だって良いだろうが どうせこのスレでいい例を見せたって理解できるはずないだろ
segmentation fault core dumped.
>>298 malloc()/realloc()/free() のラッパを書いて確認してみました。
http://codepad.org/5lqkATcO ただ、ラッパ自身も malloc() / free() を使っているので、これが正しいかどうかを検証する方法がわからない。
ラッパのラッパを書くしかないのか‥‥‥。
>>302 宿題を丸投げする人は、このスレのお客様。
むしろコード書く人、そのコードを読む人が主人公かなあ。
さらしたコードを叩くな、という人がいますが、むしろコードを読んで叩いてくれる人がいるからこそ、書きがいがあるというものです。
ただで駄目なところ指摘してくれたり、より効率的な方法教えてくれるんだから ありがたいもんだよな。 変にプライドの高い人は逆ギレしちゃうけど。
>>306 コードさらす人は、意識していないかもしれませんが、そのプライドを自分で潰しに来ている、といっていいわけですから、コードをかかない人よりよっぽどましかと。
そうそう。ここでコード晒す側も 所詮、暇つぶしなんで、波風立たない方が嬉しいにこしたことはない。 ここ100レス余りの流れで宿題がこないから、 mixiの宿題コミュまで覗っちゃったじゃないか!
>>308 mixiのあのコミュはなにかしら投稿するとsock(ryとかいう人に叩かれるw
>>307 いいからお前はトリップを全部の発言につけろw
最近は嫌がらせ半分のふざけたコードに突っ込む人いなくなったなぁ。 そのまま提出した学生がその後どうなったのか気になるところだが。
>>313 他人をむやみに信用することの愚かさを痛感し、
自分で判断できる力を身につけようと努力し、偉人になったとか。
>>284 ですが、型が違うみたいでエラーがでます。
そこで少し変えたんですが、なんか違うようです。
#include<stdio.h> main(void) { int test[11] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; int i,j; int score; for (i=0;i<30;i++) { score = 0; do { printf("成績を入力しろ"); scanf("%d",&score); } while (score < 0 || 100 < score); test[score / 10]++; }
for (i=0; i < 11;i++) { printf("点:"); for (j=0; j<test[i];j++) { printf("*"); } } return 0; }
>>315 #pragma warning(disable:4996) // これを追加する
#include<stdio.h>
main(void)
{
早くお客様こないかなー
321 :
デフォルトの名無しさん :2010/06/05(土) 20:17:04
すいません
>>320 です。
問題文に「0〜9点, ・・・, 90〜99点, 100点」と書いてありました。
大変申し訳ないです。
0〜9点:***
・
・
・
100点:** とするには、どう手を加えればいいのですか?
>>321 for(i=0; i<11; i++) {
if(i==10) printf("100点:");
else printf("%d〜%d点:", i * 10 + i * 10 + 9);
>>321 「printf("点:");」→「if (i == 10) { printf("100点:"); } else {printf("%d〜%d", i*10, i*10+9);}」
>>322 2-A:char**
2-B:char[][MAXLENGTH]
2-C:char**day
2-D:char day[][MAXLENGTH]
329 :
デフォルトの名無しさん :2010/06/05(土) 22:33:28
文字と演算子を入力して四則計算するプログラムってどうやります? 例えば 3←入力 +←入力 4←入力 −←入力 ・←入力 ・ ・ = (計算結果)
330 :
329 :2010/06/05(土) 22:36:29
#include<stdio.h> int main(void){ int a,b; char c; while(a != '='){ scanf("%d",&a); scanf("%c",&c); if (c = '+')b += a; else b -= a; } } うまくいきません。
332 :
329 :2010/06/05(土) 22:58:00
>>331 そんな難しいのじゃなくていいです・・
とりあえずwhileとか使って
数字入力 演算子入力 数字入力・・・・=答え
みたいなのが作りたい。
333 :
デフォルトの名無しさん :2010/06/05(土) 23:51:35
>>258 です。ポインタを用いないバージョンもできないでしょうか。
scanf()はエラーも返すんだよね。
#include<stdio.h> int main(void){ int a=0, b=0, plus=1; char buf[80]; while(buf[0] != '='){ // fgets(buf,100,stdin); gets(buf); if(buf[0] == '+'){ plus = 1; b = a; } else if(buf[0] == '-'){ plus = -1; b = a; } else sscanf(buf, "%d", &a); } b = b + plus * a; printf("ans=%d\n", b); } /* 3 - 6 = ans=-3 */
337 :
デフォルトの名無しさん :2010/06/06(日) 01:34:19
こんなソフト作ってください(お代は払います)ってな感じのスレどっかにあったかなぁ? アイデアはあるけどオツムがないからどうしようもなく放置したまま早1年。 発注するから誰か受注して って頼みたいんだけど?
サンクス
>>333 #include <stdio.h>
int main(void)
{
char a[256], b[256];
int i, j, flg = 0;
printf("文字列を入力してください。");
scanf("%s", a);
printf("検索文字列を入力してください。");
scanf("%s", b);
printf("文字列「%s」は", b);
for(i=0; a[i]; i++) {
for(j=0; b[j]; j++) if(a[i+j]!=b[j]) break;
if(b[j]=='\0') {
if(flg++) printf(",");
printf("%d文字目から%d文字目", i, i + j - 1);
}}
printf("%s\n", flg ? "に存在します" : "は存在しません");
return 0;
}
>>333 折角書いたけど
>>341 の方がスマートでくやしい
#include <stdio.h>
int main()
{
char str[256], search[256];
int strIdx = 0, searchIdx = 0, found = 0;
printf("文字列を入力してください。\n");
scanf("%s", str);
printf("検索文字列を入力してください。\n");
scanf("%s", search);
while(str[strIdx]){
if(str[strIdx] == search[searchIdx]){
found = strIdx + 1;
while(search[++searchIdx]){
if(str[++strIdx] != search[searchIdx]){
found = 0;
break;
}
}
if(found) break;
}
++strIdx;
}
if(found == 0) printf("文字列「%s」は存在しません。\n",search);
else printf("文字列「%s」は%d文字目から%d文字目に存在します。\n",search, (found - 2), (found - 2) + (searchIdx-1));
}
しかもバグ入りという...
345 :
デフォルトの名無しさん :2010/06/06(日) 16:10:45
何故
>>330 はダメなのでしょうか?
>>344 ちゃんとつくらなくても
>>336 のプログラムの中身がすでに
理解できないんですが・・・
>>336 より簡単にできないんですか?
どんなプログラムも付け足せば何とかなるんですよね。
buf[]とstdin, fgetsなど全く意味がわかりません。
一応プログラム自体実行したら正しくいきます。
ただ宿題なので、今まで習ったことでやるしかないんです。
一応C言語です。
>>345 そういうのは最初に全部テンプレ使って言え
>>345 #include<stdio.h>
int main(void){
int a,b = 0;
char c=' ';
while(c != '='){
scanf("%d",&a);
scanf("%c",&c);
if (c == '+')b += a;
else b -= a;
}
}
これでどうだ
>>345 ちがった
#include<stdio.h>
int main(void){
int a,b = 0;
char c=' ';
while(c != '='){
scanf("%d",&a);
scanf("%c",&c);
if (c == '+')b += a;
else if(c == '-')b -= a;
}
printf("%d\n", b);
}
こうかな。
>>345 なぜダメかという理由を書くと
1.while(a != '=')となっている点。
aは数字だろ?演算子はcに入れたいんだろ?だからwhile(c!='=')が正しい。
2.if(c='-')となっている点。
=は代入。比較なら==を使う。たまに見かけるバグだな。
3.int a,b;となっていて、bを初期化していない点。
bに結果を入れたいのだろうが、最初に0で初期化していない。
初期化しないと値は不定。何が入ってるか分からないというわけ。
つまりコンパイラとしてはbに最初から0xCDCDCDCDを入れておいても仕様違反ではないというわけだ。
vc++のデバッグビルドならそうなる。
そこにプラスマイナスしても正しくならないよな。
4.else b-=a;となっている点。
これだと'='が来たときも引き算してしまう。だからese if(c=='-')にしないといけない。
5.whileに最初に入った時点でcは不定。
だから万が一cが'='だったらすぐ抜けてしまう。ここでは' 'を入れておけば絶対に問題が起きないのでおk。
現実問題として、滅多に起きないが、社会にでたらこれは立派なバグとして扱われるぞ。
こいつに理解させるのはまず無理だと思うけどな
俺に聞けスレで諦めた一人ですな
だからscanf()で文字を読むときは改行文字に気をつけろって言っただろ
int a=0 ,b=0; char c=0; scanf("%d%*c",&b); while(scanf("%c%*c",&c) && c != '='){ scanf("%d%*c",&a); if (c == '+')b += a; else if(c == '-') b -= a; else ; } printf("%d\n",b); それを修正してとなると↑のようになる(scanf削って縮めたいんだが、俺には限界)
355 :
349 :2010/06/06(日) 17:03:34
ああ、ごめん。 実際に動かしてみたら色々問題がまだあるね scanf("%c", &c);は改行コードを拾ってしまうな。
356 :
4 :2010/06/06(日) 18:52:56
>>356 命がけ、というのであれば、それを見せてほしいですね。現状では伝わってこないんです。
358 :
4 :2010/06/06(日) 18:58:23
>>354 優しすぎ、ありす。
まじで感謝してる。プログラミングの単位たぶん落とすと思うけど
2学期には間に合うようにするわ。
359 :
デフォルトの名無しさん :2010/06/06(日) 19:02:36
熟練のマである
>>355 でもエラー出すC言語ってどんだけむずいんだよ。
もっと簡単で寛容なC言語はないんかね。
いろいろと突っ込みどころがあるな
>>359 ちょっと上の方でコテが散々やっつけられていたのを見ましたか?
簡単で寛容な、というのは期待しないほうがいいかと。
>>363 <課題2>
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int i, j, k, n;
double *x, temp;
scanf("%d", &n);
x = malloc(n * sizeof(double));
for(i=0; i<n; i++) scanf("%lf", x + i);
for(i=n-1; i; i=k) {
for(j=k=0; j<i; j++) {
if(x[j] > x[j+1]) {
temp = x[j];
x[j] = x[j+1];
x[j+1] = temp;
k = j;
}}}
for(i=0; i<n; i++) printf("%f\n", x[i]);
free(x);
return 0;
}
ぐだぐだ言い訳されるのわかってても突っ込みたくなるなw
>>367 どうぞどうぞ突っ込んでくださいな。楽しみにしています。
実数と整数の区別もつかないアホ ソート部分がクソ
だからそれはバブルソートじゃないって言っただろw
それが言いたくてわざわざ効率の悪いほう使ったのかw
>>373 バブルソートは
for(j=0;j<n-1;j++){
for (i = 0; i < n - 1; i++) {
if (x[i] > x[i + 1]) {
t = x[i];
x[i] = x[i + 1];
x[i + 1] = t;
}
}
}
だろ。わざわざdo{} while()にしても比較回数が減ることはない。
>>373 だから全部読めって前も言ったよな?
Optimizing bubble sortのところで何でn := newn + 1ってなってると思ってるんだ?
>>376 Optimizing のところでは、長さを縮めていますが、そうでない実装も、やっぱり bubble sort でしょう?
計算オーダーが同じでも明らかに効率悪い方に拘る意味が分からんw
こだわっているんではなくて、計算効率がちょびっとよくなるか悪くなるかの差で、バブルソートとよんだりよばなかったりするのはおかしいといっているのです。
英語版 wiki にのっている実装もバブルソート、
>>375 のやりかたもバブルソートなんですよ。無論私のもバブルソート。
ん、バブルソートですね
知識とコードのアンバランスさから見て、どっかの大学講師かな。 実務経験があるようには見えないし、頭堅いのにプライドだけは高いし。
>>382 今は助教というのですよ。現在の大学教員の序列を知らないところから見ると、高校生かな?
高校生に負ける助教って・・・
どうりで高校生なら計算オーダーの話は理解できなくてもしかたありませんね。でも重要ですからよく勉強しておくように。
日本語まともに読めないクズの分際で、 なんで自分より下しか想像できないんだろうw
バブルソートでも色々あるんですよ。ひとつのパターンだけ決め付けてこれはバブルソート、あれは違う、などと見識の狭いことをいってはいけません。 もっと広い感覚で物事を理解することです。
実数と整数の区別もつかない盲が何言ってんだw
というか本当に助教なの?せいぜい院生くらいかと思ってたんだけど。 日本語の読めなさはやばいってレベルじゃねーだろw
小さなミスはその都度修正すれば済むこと。でもバブルソートがなにかを理解していなければ、ヒープソート、シェルソート、クィックソート、マージソート その他いろいろなソートでもつまづきますよ。これらの理論では計算オーダーが重要ですからよく勉強しておくことです。
なんで相手がそれらのソートを知らないことになってんだよw
>>382 で講師だろうといっていたくせに、
>>389 で院生くらいだとおもっていた、
とは随分とおっしゃることがころころかわるのですね。日本語が読める読めないというより、日本語を使って思考できないのではないですか?
ちょ、同一人物認定されたw
>>391 計算オーダーを理解していないようですからね。
すいません、できたら
>>362 お願い致します
流石に無理ですかね・・・
>>395 スレ違いな上に、金取るぞってレベルの話なんだがw
やっぱり無理ですよねw じゃあだめもとで他当たってきます ありがとうございました
大体フィルタだろ? フィルタのソースはAviUtilの作者とは違うだろ。
>>399 いや、AviUtlに問題があるわけではなくて
このフィルタに問題があるんですよね
フィルタの作者はAviUtlの作者ではないんで・・
でももしかしたらAviUtl側でなんとかできるかもしれませんね
ありがとうございます。
関係ないフィルタの不具合を報告されても困るだろw
まぁここはご覧の通り高校生レベルの議論なんで・・
高校生以下のおじさんもいるけどね
高校生だったころに戻りたいな
中学レベルの英語力すらない人が多いみたいだけどね
that's too mad.
all your base are belong to us
ポインタを使い1〜12までの数字を入力すると英語で月の名前が出力され、 そうでない場合はunknown month と出力されるプログラム作りで困ってます。 入力例 3 5 13 11 出力例 March May unknown month November ヒントでは、 char *month_name(int n)を書き入れる事 month_name(6)はJuneである事 static char *months[] = { "January","February","March", "April","May","June", "July","August","September", "October","November","December"}; を用いる事が書かれてます。 暇な人が居たらお願いします。
>>411 char *month_name(int n)
{
if (n < 1 || 12 < n) {
return "unknown month";
}
return months[n-1];
}
staticだから関数内にmonths[]置くんじゃないの?
じゃあそれで
途中経過を…プログラミングは下手ですがっ #include <stdio.h> static char *months[] = { "January","February","March", "April","May","June", "July","August","September", "October","November","December"}; int main(void) { int n; char *month_name(int n) {if (n < 1 || 12 < n) { return "unknown month"; }return months[n-1]; } scanf("&lf",&n); printf("%s",*months); return(0); } これでやるとどんな数字入れても出力がJanuaryになってしまうのですが、 どこらへんを変えればいいでしょうか?
scanf("%d", &n);
つーか関数内に関数置くな
残念な頭なのでmonth_nameの中に *months入れるのは思いつきませんでした…orz
>>421 慣れ、馴れ。数書くうちに体にしみこむ。
ケチ付けるわけではないけどif文はmainの中のほうがunkownのとき 関数を呼ばなくていいんじゃなかろうか。
424 :
9 :2010/06/07(月) 22:11:27
【質問テンプレ】 [1] 授業単元:C言語課題 [2] 問題文(含コード&リンク):2つの正の整数(aとb)の最大公約数をユークリッドの互除法を用いて表示するプログラムを作成せよ。ただし、0<b≦a≦32767とする。 ≪ユークリッドの互除法≫ ユークリッドの互除法による最大公約数(GREATEST COMMON DIVISOR:GCD)は、次のように求める。 @2数(aとb)の中で大きい値をl、小さい値をmとする。 Alをmで割り、あまりをrとする。 r=0ならば、mが最大公約数となる。 r≠0(0<r<m)ならばl←m、m←r として再びAの処理を行う。 [3] 環境 [3.1] OS:Windows [3.2] コンパイラ名とバージョン:main.c Visual Studio 2008 [3.3] 言語:C++ [4] 期限:2010年6月18日17:00まで [5] その他の制限:(まだ本当に初心者なので)do文やif文、for文まで習いました。 期限までは時間がありますが…宜しくお願いしますm(_ _)m
#include <iostream> int main() { int a, b, r; std::cin >> a >> b; while(r = a % b) a = b, b = r; std::cout << b; }
>>423 逆にその関数として、不正な値が渡された時はどういう挙動にしようか
for(i = 0 ; i < 5 ; i++){ printf("%d,", i ); } これで出力したら 1,2,3,4,5, みたいに最後にもカンマがついちゃうんでfor文の外側に printf("\b\n"); を付け加えたんだけどうまく最後のカンマが消えません その理由とどうすればいいのか教えてください
\bは書き込む位置が1文字分戻るだけだから スペースで上書きする必要がある printf("\b \n");
なるほど d
>>427 端末側がバックスペースをサポートしていない、と思われる。
仕方がないから、
#include <stdio.h>
#define N 5
int main()
{
int i;
for (i = 1; i <= N - 1; i++)
printf("%d, ", i);
printf("%d\n", i);
return 0;
}
でごまかすしかない。
431 :
430 :2010/06/07(月) 23:29:20
>>428 そのような手があったんですね。これでうまくいきました。(cygwin)
#include <stdio.h>
#define N 5
int main()
{
int i;
for (i = 0; i < N; i++)
printf("%d, ", i);
printf("\b\b \n");
return 0;
}
>>424 #pragma warning(disable:4996)
#include <stdio.h>
int main(void){
int a, b, l, m, r;
printf("整数 a と b を入力して下さい > ");
scanf("%d %d", &a, &b);
if(a>b) l=a, m=b; else l=b, m=a;
while(r = l % m) l=m, m=r;
printf("GCD = %d", m);
}
>>426 #include <stdio.h>
char *month_name(int n){
static char *months[]={"January","February","March",
"April","May","June","July","August","Septmber",
"October","November","December"};
return months[n-1];}
int main(void)
{
int n;
scanf("%d",&n);
if (n<1||n>12)printf("unkown month\n");
else printf("%s\n",month_name(n));
return 0;
}
不正な値が行く場合がわかりませんので教えて下さい。
434 :
430 :2010/06/07(月) 23:53:41
しっかし無駄なstaticだ
>>433 関数をライブラリとして提供した場合に、使う側に対して値チェックを強制するべきか、
それとも不正な値を渡された場合にunknown monthを返却する仕様とするのかという話。
で、使用者に対して値チェックを強制した場合、使用者の不手際により
不正な値が渡されることを考慮しなければならない。
その際、メモリアクセス違反で落ちるライブラリでよしとするのか?ということ。
例外機構があれば例外を投げるのも手だけれど、Cではどうするのか。
型をboolにし、out引数を追加するのもありだよね。
でも今回はプロトタイプが指定されている。
その上での考えを教えてほしい。
NULLを返却するのは? 結局関数の中で範囲チェックすることになるけど。
>>435 これstatic消したら関数抜けた時に戻り値のアドレスが破棄されるんじゃないの?
>>438 sizeof(months) == sizeof(char *) * 12
441 :
デフォルトの名無しさん :2010/06/08(火) 00:16:14
[1] 授業単元: 情報数学 [2] 問題文(含コード&リンク): 次の連立一次方程式をガウスザイデル法とSOR法で解け {2 , -1 , 0} {x1} {-1} {-1 , 2 , -1} * {x2} = {2} {0 , -1 , 2} {x3} {1} なお、反復回数を20、x1-3の初期値x1-3^0を0、SOR法の・をそれぞれ1.2と1.5で計算せよ。 [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 本日中、出来ればお昼までにお願いします。
>>440 要するに、予約語staticをつけなくとも、
monthsはその各々の要素が文字列リテラルの先頭へのポインタであるから
静的領域に確保されると。
それって規格で決まってたっけ? そうでなくても、いちいち呼ばれるたびに確保するような処理系なさそうだけどさ。
>>436 いろいろとありがとうございました。
今回は不正な値を渡された場合にunknown monthを返却する仕様のつもりです。
使用者に対しての値チェックのやり方はどれがいいかまだよくわかりません。
難しいですね。
>>442-443 文字列リテラルがstatic const char[]か?ならYes 6.4.5 文字列リテラル
文字列リテラルを指すポインタ非可変長配列がstaticか?ならchar const * const []であってもNo 6.2.4 オブジェクトの記憶域期間
>442>443 横レスだけど months自体は自動変数だから、スタックに置かれるよ。関数が返しているのは スタック変数を指すポインタではなく、静的領域に置かれている文字列リテラルの ポインタ。
447 :
443 :2010/06/08(火) 01:34:03
453 :
デフォルトの名無しさん :2010/06/08(火) 13:17:45
[1] 授業単元: 上級プログラミング [2] 問題文(含コード&リンク): 1、VisualC++2008のWindowsフォームアプリケーションのプロジェクトを作成し、DataGridViewを作成なさい。列は A,B,C の3列とする。 2、列Aに入力された4桁の数値を日付形式に変換し表示する様にしなさい(○月○日)。 3、sample.txtの内容を読み取り、その内容を使って列Bにオートコンプリートを実装しなさい。 sample.txtの内容は あいうえお abcde 12345 と言う様に、1行に1単語とする。 [3] 環境 [3.1] OS: Windows [3.2] VC++2008 [3.3] 言語: C/C++ [4] 期限: 6/12 [5] その他の制限:とくに制限はありません 1はできますが2以降がよくわかりません。 2はプロパティでCellStyleを設定しましたが動いてくれませんでした。 3は調べてみたのですが、C++での実装はのっていなかったので・・・ よろしくお願いします。
C++/CLIの宿題スレってないの?
(1) 【main 関数のみ】 int型配列 x[101] を定義し、キーボードから人数 N と N 人分の点数を入力し、平均点と 偏差値を計算し、結果を画面に出力するプログラムを作成せよ。 ◆ 条件 人数 N に負の値や101以上の値が入力されたときには、再入力するものとす る。 点数 x[i] に負の値や100点を超える値が入力されたときには、再入力する ものとする。 ◆ 偏差値 Ti の計算式 10( xi ) Ti 50 ただし N 1 x i N i 1 N 1 (x )2 i N i 1 ここに、N :データの数 xi :個々の点数 μ:平均 σx:標準偏差
実行例 Input N (0<N<101):0 ← 入力エラー Input N (0<N<101):5 Input x[1] (0<=x<=100):200 ← 入力エラー Input x[1] (0<=x<=100):30 Input x[2] (0<=x<=100):50 Input x[3] (0<=x<=100):-1 ← 入力エラー Input x[3] (0<=x<=100):60 Input x[4] (0<=x<=100):80 Input x[5] (0<=x<=100):90 平均点 62.0 No. 1 点数 30 偏差値 35.0 No. 2 点数 50 偏差値 44.4 No. 3 点数 60 偏差値 49.1 No. 4 点数 80 偏差値 58.4 No. 5 点数 90 偏差値 63.1
(2) 【平均点と偏差値を計算する関数の作成】 (1)のプログラムにおいて、平均点と学力偏差値を計算する部分を関数 seiseki に改 めたプログラムを作成せよ ◆ 条件 データの入力と結果の出力はmain関数で行う。 人数 N に負の値や101以上の値が入力されたときには、再入力するものと する。 点数 x[i] に負の値や100点を超える値が入力されたときには、再入力す るものとする。 main関数から関数seisekiに データの数 N N人分の点数 x[] を渡し、関数seisekiからmain関数に 平均点 μ 偏差値 T[] を受け渡す。 ただし、平均点は戻り値を用いて返す。
3)【ポインタを用いた平均点と偏差値の計算】 (2)で作成したプログラムの関数 seiseki の中 次のプログラム例を参考にして、 の配列要素をポインタを用いて表すプログラムを作成せよ。 #include <stdio.h> float average( int N, float *h); int main(void){ float ave, height[101]; int i,N; printf("Input N:"); scanf("%d",&N); for(i=1; i<=N; i++){ printf("身長 "); scanf("%f",&height[i]); } ave = average(N,height); printf("平均 %6.1f \n",ave); return 0; } float average( int N, float *h){ int i; float av, total=0.0; for(i=1; i<=N; i++){ total = total + *(h+i); } av = total/N; return av; }
>>459 問題文が日本語になっていない
コードも直接貼ってるから読みにくい
>>448 ありがとうございます。
セグメンテーション違反になりましたが、ここからは自分で頑張ってみます。
>>456-458 http://codepad.org/JjTL3Zwl (1)は input と main_q1関数だけ。
実行するときは、main_q1はmainに関数名を直すのが必要です。
(2)は コピペでも動く。main_q1関数は不要なので、消しても良い。
・偏差値はわからないから、wikipediaのを参考に。
・stdevの求め方は、2乗の平均 - 平均の2乗にした。
・データ入力の際に、avgも求められるが、題意から分けた。
配列サイズが101だから、iは1からなんじゃね?
勝手に例の表記や条件を変えるヤツってなんなの?
467 :
デフォルトの名無しさん :2010/06/08(火) 17:23:12
>>354 すげぇ、てか制御式の中にscanf入れることできるのかー。
>>348 の人は何故だめなのかな。
>>348 は
scanf("%c",&c);
で改行をよみこんでしまうから
後の条件式を総スルーしちゃう。
よってbは0で初期化されたまま
あと実際に動かすと
1
+
1
=
1
となってしまう。
これは
1
+
は計算するように書かれているけど
1
=
は計算するように書かれてないから。
>>348 を書き直すと
#include<stdio.h>
int main(void){
int a=0,b = 0;
char c=' ';
char prevc=' ';
while(c != '='){
scanf("%d%*c",&a);
scanf("%c",&c);
if (c == '+'){b += a; prevc='+';}
else if(c == '-'){b -= a; prevc='-';}
else if (c == '=')
{
if(prevc == '+' || prevc == ' ') b+=a;
else if(prevc == '-' || prevc == ' ') b-=a;
}
}
printf("%d\n", b);
}
470 :
デフォルトの名無しさん :2010/06/08(火) 18:00:42
>>468 頭良すぎワロタww
何故そのような分析ができるんだ。
C言語難しすぎ、どんだけ繊細なんだよ。
お前がバカすぎるだけだってまだわからないのかw
それほどでもないけどね
474 :
デフォルトの名無しさん :2010/06/08(火) 18:28:05
prevcってなんだ?見たことも聞いたこともない。 苦し紛れの技巧か? あと=''; ''の中は空白だな。
#include <stdio.h> int main(void) { int sum = 0, temp; char ch = '+'; do { scanf("%d", &temp); if(ch == '+') sum += temp; else if(ch == '-') sum -= temp; scanf(" %c", &ch); }while(ch != '='); printf("%d\n", sum); return 0; }
あげて古いの蒸し返してるのは:4 ◆nNHcoCEvyoだろ こいつに何かを理解させるのは無理だって
>>474 一個前のを取っておきたかったんだと思うよ。技巧ってほどじゃない
>>480 なにがココまではおkなんだか・・・
ありがとうございます
関係ないけどそのままだと数が大きくなるとオーバーフローしてしまう。 oira *= a; oira %= n; ってすれば数が大きくなっても対応可能。
>>482 まじでそこを聞こうと思ってたところです
ありがとうございます
>>482 度々悪いんですけど
なぜそうすればいいのか教えてもらえませんか?
自分で考えてもわかりませんでした
わからないのは
なぜ数が大きくなっても対応出来るのかではなく
なぜこの計算方法でも正しい結果が得られるのかです
めんどくさいからパス
そか(’・ω・`) oiraにnで割った余りを入れちゃったら 次a倍すると意図しない値になっちゃいそうなんだ 少なくとも俺のない頭はそう思っちゃうorz 一回一回a倍とnで割った余りをいれようとした根拠とか考え方とかをご教授願いたかった(’;ω;`)
これって高校数学の範囲じゃねーの?
もしかして俺の勘違いかもしれん
>>482 って
if(i == a){
printf("n = %2d, a = %2d", n, a);
oira = 1;
for(j = 0 ; j < count ; j++){
oira *= a;
oira %= n;
}
if((oira - 1) % n == 0){
printf(": verified\n");
}
else{
printf(": error\n");
}
}
みたいに直せって事だよな?
もしかして俺のバカさ加減に呆れてますか?(;ω;`)
少なくとも処理結果は正しいの?
a = n * b + cの形に変形してかけて見ればわからない? a * a = (n * b + c) * (n * b + c) =(n*b)^2 + 2 * n * b + c^2 (n*b)^2と2*n*bは明らかにnで割り切れるから、 a*aをnで割った余りはc^2をnで割った余りになる
それがoira-1をnで割ったあまりにどう応用できるのか、俺もわからないので
>>489 は一人で泣かなくていい
>>491 解説ありがとう
なんとなく考え方はわかったがまだしっくりこないのでもうちょい粘ってみる
>>492 気が楽になった
oira-1がnで割り切れる=oiraをnで割った余りが1
#include <stdio.h> #define NUMBER 5 int gcd(int a, int b) { return a % b ? gcd(b, a%b) : b; } int main(void) { int i, j, c, n, a, oira; for(n=1; n<=NUMBER; n++) { for(a=1; a<n; a++) { if(gcd(n, a)==1) { printf("n=%2d,a=%2d:", n, a); for(i=1,c=0; i<n; i++) if(gcd(n, i)==1) c++; for(i=0,oira=1; i<c; i++) { oira *= a; oira %= n; } if(oira == 1) printf("verified\n"); else printf("error\n"); }}} return 0; }
まだ関数と{? : }は習ってないから使っちゃいけないんだ あくまで標準入出力とfor, while, if だけで
使っちゃいけないという思い込み。 本当に使うなといわれた?
思い込みだな 使っちゃいけないことは無いだろうが使わないでできるならそれに越したことはないかと
そんなことしてる間に
>>491 >>494 のおかげで理解できました
理解できただけで次似たようなコード書くとき思いつくかどうかは別だけど
countを求めるのはnとaが互いに素であることがわかってからの方がいい。
[1] 授業単元:プログラミング [2] 問題文(含コード&リンク): int plot(int x,int y,int c);は座標(x,y)に色cを設定する関数である。 これが与えられているものとして コマンドラインから(x,y)の形で座標値が何個か与えられた時 (0<=x,y<=10000)これらに異なる色(選択は自由)を与える。 0<=x,y<=10000を満たす座標の各点についてその点から 最も近い点の色をその点に設定する(2つ以上の点から等距離 にある場合は、これらの点の中でコマンドラインで最初に指定 された点の色を設定) この処理を行うプログラムを記述する [3] 環境 [3.1] OS:Windows XP(Service pack 3) [3.2] コンパイラ名とバージョン:visual c++.net 2005 [3.3] 言語:C++ [4] 期限:6/11迄 [5] その他の制限: ヘッダファイルは使わない。extern宣言でplot関数を宣言した のちにpaint関数のコードを記述すること。 0<=x,y<=10000と仮定して良い。 plot関数を適当な名前の整数ファイルの1024*y+(x % 1024)番目 のレコードに値を設定する実装としたドライバコードを使って テストするとよい。
#include<stdio.h> #define NUMBER 5 int main(void) { int n, a, oira, c, i, j, k; for(n=1; n<=NUMBER; n++) { for(a=1; a<n; a++) { for(i=n, j=a; k=i%j; i=j, j=k); if(j!=1) continue; printf("n = %2d a = %2d :", n, a); for(c=oira=1; c<n; c++) { for(i=n, j=c; k=i%j; i=j, j=k); if(j!=1) continue; oira *= a; oira %= n; } if(oira==1) printf("verified\n"); else printf("error\n"); }} return 0; }
503 :
501 :2010/06/08(火) 22:00:45
問題文がちょっと抜けてました。訂正させてください。 ○この処理を行うプログラムのメイン処理を行う関数 void paint( int argc,char **argv); を記述する ×この処理を行うプログラムを記述する
>>500 助言d
それはその方が無駄にφ(n)(=count)を求めなくて済むからか?
だとしたらその通りかもしれないから今後の参考にするわ
あくまで好みだからそんなの自分の好きにしろとか言われるかもだが プログラム書くときスペースとか改行ってどのタイミングで入れてる? 学校では a = a + 1 って書く奴がいれば a=a+1 って書く奴もいるし for(i=0;i<5;i++)って書く奴がいれば for(i = 0 ; i < 5 ; i++)って書く奴もいるし こうしたほうが効率がいいとか後で見やすいってのがあるなら参考にしたい 今なら癖とかないから変えられるし
>>504 そう。
できるだけ必要のない無駄な処理はしないってのが大事。
何のIDE使ってるか知らないけど vs2008使ってる俺は適当に書いてから「編集→詳細→選択範囲のフォーマット」で整形してる
>>502 が理解できない
てか発想が秀逸すぎて手に負えない
最大公約数をループで求めてるだけ
とりあえず褒めとけばいいと思ってない?
>>501 0<=x,y<=10000を満たす座標の各点についてその点から
最も近い点の色をその点に設定する
ってあるけど
各々の座標の色はどう初期化するべきなの?
なにかしら初期化しておかないと最も近い点の色もなにもないと思うんだけど。
引数で与えられた点の色はこっちで好きに決めていいんだろ
516 :
430 :2010/06/08(火) 23:12:01
>>505 K&R にしておけば後ろ指をさされることはないかと。
ただし私は
int main() {
...
}
とかえている。
emacs(xyzzy) ではこのほうが便利だから。
#include <stdio.h> int main(void) { int i, j, n; while(scanf("%d", &n)==1 && n > 0) { printf("n=%d\n", n); for(i=0; i<n; i++) for(j=0; j<=n; j++) printf("%c", j!=n ? j==0||j==n-1||j==i ? n & 1 ? '*' : '+' : ' ' : '\n'); } return 0; }
521 :
9 :2010/06/09(水) 10:07:40
>>432 すごいです!!…学校で習った感じに少し、
書き直させて頂きました(>_<)
こんなに早く出来ると思ってなかったので
びっくりしました。
本当に助かりました!有難う御座いました☆
シルエット カーディガン レントゲン サンドイッチ
>>524 おまえ、5つの数字の列の取りうる範囲は0~99999の100,000個だぞ。
だから入れるバケツの大きさは100,000の配列にしてそこへ2000個のデータを
5桁の数字に対応するバケツに次々入れて、終わったら番号の小さいバケツから順番に
数字を取り出すようにしないとダメだぞ。
void sort(char data[][LENGTH+1], int size) { int *p = calloc(100000, sizeof(int)); int i, j, k; for(i=0; i<size; i++) p[atoi(data[i])]++; for(i=j=0; i<100000; i++) for(k=0; k<p[i]; k++) sprintf(data[j++], "%05d", i); free(p); }
void sort(char data[][SLENGTH+1], int size) { int i, j=0, k; char p5[6]; int *p = calloc(100000, sizeof(int)); for(i=0; i<size; i++) p[atoi(data[i])]++; for(i=0; i<100000; i++) { if(p[i]) { sprintf(p5, "%05d", i); for(k=0; k<p[i]; k++) strncpy(data[j++], p5, 5); } } free(p); }
>>522 申し訳ないですが、
||と条件文の中にさらに条件文は使用禁止なんです。
説明足りなくてスミマセン。
[printf("%c", j!=n ? j==0||j==n-1||j==i ? n & 1 ? '*' : '+' : ' ' : '\n'); ココと]
[while(scanf("%d", &n)==1 && n > 0)ココの部分です]
5つの数字が全部0って可能性はないのかな? もし0が入る可能性があるのならallocateされた領域の初期値が0じゃまずいかも。
data[000000]++;
>>529 何度もすみません
さっきの説明が分かりにくかったですね;
forの中にscanfとかを入れるのがダメなんです。
1行に付きscanf、forなどは1つです。
printf
int
while
scanf
float
for
のみの使用です。
それ以外は使用禁止です。
return
||
else
if
は使用禁止です。
536 :
デフォルトの名無しさん :2010/06/09(水) 20:33:58
[1] 授業単元:C言語 [2] 問題文(含コード&リンク): 次の仕様を満たすプログラムを作成せよ 「xy 平面内に任意の電荷量の点電荷を複数個配置する.xy 平面内の原点Oを中心とする4 m 四方(±2 m)の領域内において,位置r(x, y)に形成される電界Erや電位Φrを計 算する.」複数個の点電荷で形成される電界Erや電位Φrを,任意の位置r で計算する際は,重ね合わせの原理を用います 電界ベクトルの計算は, x 成分とy 成分に分けて行います [3] 環境 [3.1] OS: unix [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限:6月11日 [5] その他の制限: 特になし
学校でやってないところは使うなと 先生に言われました;;
エスパー無理
学校でやってないこと 使うなと 講師の先生(せんせ)に 言われたよ ――痴楽 綴り方教室
エスパーできないって言ってるんだが
≫534 すみません!! 番号うつの忘れてました。 ホントすみません;;
<iostream>とか<studio.h>って何が違うんですか?
>>546 STanDard InputOutput Headerな
定義されてる関数群がちがう。
548 :
デフォルトの名無しさん :2010/06/10(木) 00:33:37
もう本当に挫折しそうです。 関数を二つ pen()とqen()として作って int main()の中に呼びたいんですが この時pen()の実引数をqen()にしたいんですが これがうまくいきません、どうしたらいいですか? レス代行なので長いプログラムは書けません・すいません。 int main(void) a=pen(); qen(a); としてもpen()とqen()が別個に呼び出されるだけで一つの作業と なりません。
>>548 penの引数をqenの引数にしようとしているようには見えないので、いろいろおっちょこちょいな人なのかな。
関数ポインタをキーワードにいろいろ調べてみてください。
pen()の実引数をqen()にするなら pen(qen); だろ。
pen(void (*p)(void)); かなシグネチャは pen()の中で (*p)(); もしくは p(); として呼び出す
552 :
デフォルトの名無しさん :2010/06/10(木) 07:52:36
>>550 double a;
qen(a);
pen(qen);
ですか?普通に無理でしたが・・
pen(qen);だけでもまぁ無理でした。
>>551 pen((*p)(qen(a));ってことですか?これも無理でした。
553 :
デフォルトの名無しさん :2010/06/10(木) 07:55:25
関数ポインタってのあるんですが、馬鹿でした。で int mainの中で p= pen; qen((*p)pen());とかごちゃごちゃ色々なとこ変えて、 付け足して 90回くらい思考錯誤したけど全部だめした...... ちなみにpen()、qen()自体はそれぞれsin関数とcos関数 です。ポインタ関数理解したいのでこのままの構造でい きたいと思ってます。
何がしたいのかさっぱり伝わってこない
555 :
430 :2010/06/10(木) 08:09:29
>>553 #include <stdio.h>
#include <math.h>
double p(double (*f)(double), double a)
{
return sin((*f)(a));
}
double q(double a)
{
return cos(a);
}
int main()
{
double a, b;
a = 3.1415926;
b = p(q, a);
printf("%f\n", b);
return 0;
}
/* end */
cos()の返り値をsin()の引数にするってw
関数を関数の引数にするってことを理解できてないようにみえる
>>554 関数を2つ呼び出して、一つの関数をもうひとつの関数の
引数にしたいんです。ただそれだけです。
559 :
デフォルトの名無しさん :2010/06/10(木) 08:23:50
>>555 わざわざありがとうございます、doubleじゃなくてfloatでした。
この時も関数ポインタはfですね?
あとretrunっているのですか?どういう役割なのかなぁ....
それとa=3.1415926..とは?
色々ややこしいなぁ、簡単なプログラムなのにこんな複雑だとは....
>>558 もしかして
sin(cos(a));
か?この式に何の意味があるのかは不明だが
>>559 問題を適切に抜き出す能力が足りないだけ
少なくとも俺は
>>558 読んでもさっぱりわからん
>>560 それでオッケーなら>548でもオッケーだろ
こういう自分の勝手な解釈で嵌ってくアホ見ると、 余計なことしないで教科書のサンプルでも打ち込んでろって思うな
マゾなんだろ 簡単な事をわざわざ複雑怪奇に書いて苦しみ悶える事に快感を覚えるタイプ
565 :
デフォルトの名無しさん :2010/06/10(木) 08:39:27
>>561 いやめちゃくちゃ単純なんですが・・
合成関数のプログラムですよ。
sin(cos(a))ですよ。
関数が二つあるんだから、二つの関数呼び出す必要ありますよね。
全然意味不明じゃないですが・・・
x=cos(a); y=sin(x); 変数と代入から勉強だな。
>>565 それはcos(a)の返り値をsin()の実引数にするといい、
cos()をsin()の実引数にするとは言わない。
正しく用語を使えてないから、他人に正しく伝わらない。
>>565 まだわからない。
double sincos(double a)
{ return sin(cos(a)); }
ではどうだめなのか。
569 :
デフォルトの名無しさん :2010/06/10(木) 08:51:53
>>567 すいません。その通りです。返却値をsin()の実引数の実引数にしたいんです。
>>568 あぁ絶対言うかと思いました。
別に合成関数のプログラム作りたいわけじゃなくて、関数の呼び出しという
構造を学びたいだけで。それなら僕も考えてました。複雑なプログラムはそれ
じゃ無理です。
お前に複雑なプログラムの何がわかるってんだよw
572 :
553 :2010/06/10(木) 09:00:44
このスレにいる人は全員低脳ばっかりですね。
・質問者はなりすましを防ぐため、トリップを使ってください。 名前欄に、「好きな数字#...」に続けて任意の文字列
574 :
デフォルトの名無しさん :2010/06/10(木) 09:02:36
>>567 以後気をつけますんで、お願いします、どうしたらいいでしょう....
>>570 少し複雑になったら関数が必要だから。別にプログラムの何もわからないが。
576 :
◆mDrzcbRHP2 :2010/06/10(木) 09:04:48
578 :
9 :2010/06/10(木) 09:09:20
再び、お願いします(_ ) 【質問テンプレ】 [1] 授業単元:C言語 演習問題4-14 [2] 問題文(含コード&リンク):身長と標準体重を表示するプログラムを作成せよ。 なお、表示する身長の範囲(開始値、終了値、増分)は、整数値として読み込み、 標準体重は小数点以下2桁だけ表示すること。 [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: main.c Visual Studio 2008 [3.3] 言語: C++ [4] 期限: 22年6月18日17:00まで [5] その他の制限: do文やif文、for文までです file:///C:/Users/aika/Desktop/%E3%83%9E%E3%83%BC%E3%82%AF%E3%82%A2%E3%83%83%E3%83%97%E8%A8%80%E8%AA%9E/c.html 一応上記まで作り、実行も出来たのですが 実行時エラーで問題のように上手くいきません。 多分、水色で示したところが間違っているのだと 思うのですが…(p‥`) 手直し(?)という形で宜しくお願いします、
>>578 >file:///C:/Users/aika/Desktop/%E3%83%9E%E3%83%BC%E3%82%AF%E3%82%A2%E3%83%83%E3%83%97%E8%A8%80%E8%AA%9E/c.html
ふざけてんの?
aikaって名前?
スーパーハカーでもなきゃ、あんたのPCの中身はわからんよw
>>581 それはわかってんよ
実行時エラーとか水色で示した部分がこちらは知りたいわけ
>>548 >>552 >>559 #include <stdio.h>
#include <math.h>
/* double sin( double x ); */
/* double sin( double x ); */
float r(double (*p)(double), double (*q)(double), float a)
{
return (*p)((*q)(a));
}
int main()
{
printf("%f\n", r(sin, cos, 1.0));
return 0;
}
>578 は、AKBオタ。
仲間が見つかってよかったねw
>>616 % Prolog (その一)
バケツソート(_整列されたならび) :-
abolish('$temp'/2),
findall(S,(for(1,_,2000),ランダムな文字列の発生(S)),L),
バケツソート(L,_整列されたならび),!.
バケツソート(L,_整列されたならび) :-
バケツに吐き出す(L),
findall(X,(鍵候補値を昇順に発生させる(S),バケツから拾い上げる(S,X)),_整列されたならび).
数値文字候補ならび(['0','1','2','3','4','5','6','7','8','9']).
鍵候補値を昇順に発生させる(S) :-
数値文字候補ならび(L),
member(A,L),member(B,L),member(C,L),member(D,L),member(E,L),
concat_atom([A,B,C,D,E],S).
ランダムな文字列の発生(S) :-
数値文字候補ならび(L),
findall(A,(for(1,_,5),M is (random mod 10) + 1,list_nth(M,L,A)),L2),
concat_atom(L2,S),!.
589 :
9 :2010/06/10(木) 11:13:51
すみません…どう書いたらいいのか よく分からなかったもので。 #include <stdio.h> int main(void) { int i; int low, high, step; printf( "何cmから:" ); scanf( "%d", &low ); printf( "何cmまで:" ); scanf( "%d", &high); printf( "何cmごと:" ); scanf( "%d", &step); for(i=low; i<=high; i+=step) { printf( "%dcm %.2fkg\n", low, ((low += step <= high) - 100) * 0.9); printf( "%dcm\n", low += step); } return( 0 ); } 上記のfor{文}のところです。。。 本当にすみませんでした、 また宜しくお願いします。
589 の for 内 printf 1発目 副作用関連で鼻から悪魔コード じゃない? (関数引数での , は副作用完了点じゃないよな?)
591 :
587 :2010/06/10(木) 11:33:47
ごめんなさい。誤爆です。行方不明だと思ったらこんなところに書き込んでいたか。
>>590 本当やね
low2 = ((low += step <= high) - 100) * 0.9;
printf( "%dcm %.2fkg\n", low, low2);
とすればうまくいくはず
あ、だめだ low2 = ((low + step <= high) - 100) * 0.9; printf( "%dcm %.2fkg\n", low, low2); low += step <= high; か?
#include <stdio.h> int main(void) { int i; int low, high, step; printf( "何cmから:" ); scanf( "%d", &low ); printf( "何cmまで:" ); scanf( "%d", &high); printf( "何cmごと:" ); scanf( "%d", &step); for(i=low; i<=high; i+=step) { printf( "%dcm 標準体重=%.2fkg BMI(22)=%.2fkg\n", i, (i - 100) * 0.9, 22.0*i/100*i/100); } return 0; }
595 :
デフォルトの名無しさん :2010/06/10(木) 18:59:06
[1] 授業単元:プログラミング [2] 問題文(含コード&リンク): 以下のようにmain関数を定義し、mainの引数を合計するプログラムsumを作成せよ。ただし、引数の数は未定であり、実行時に決定されるものとする。 int main(int argc, char *argv[]) [3] 環境 [3.1] OS:Linux [3.2] コンパイラ名とバージョン:gcc [3.3] 言語:C [4] 期限:2010年6月15日まで [5] その他の制限: 端末上で ./sum 3.2 1.9 2.3 と入力すると 7.4000 と出力されるようにする。
#include <stdio.h> int main(int argc, char *argv[]) { int i; float tmp, sum=0; for(i=1; i<argc; i++){ sscanf(argv[i], "%f", &tmp); sum += tmp; } printf("%g\n", sum); }
597 :
デフォルトの名無しさん :2010/06/10(木) 19:56:13
#include <stdio.h> int main(int argc, char *argv[]) { printf(argv[1]) printf(argv[2]) } のようにするとき,コマンドからargv[]にデータを入れないとエラーがでます。 配列argv[]の初期値はどのように設定すればよいのでしょうか?
if(argc<=1) exit(1);
2つの自然数aとbの最大公約数gcd(a, b)を求め、それを出力するプログラムを作成せよ。 なお、m = a % b としたとき、gcd(a, b) は m≠0 の場合 gcd(b, m) に等しく、 m=0 の場合 b に等しい。 2つの自然数aとbを入力させ、a 人から b 人を選ぶ組み合わせ comb(a, b)を求め、それを出力するプログラムを作成せよ。 なお、comb(a, b) = comb( a-1, b) + comb( a-1, b-1) であり、 b==0 もしくは b==a のとき comb(a, b) = 1 である。 今週は2つありますが。。。よろしくお願いしますorz
>>597 argc == 1 の時はargvを調べないようにする
>>599 なお~~。の部分はプログラムのテストに使うくらいで、実際の問題とはなんの関連もないわな。
すいません。書き忘れましたが、・・・・の部分がわからないので教えていただけないでしょうか?
統計学で言うモードに相当するプログラムを書いてます まだ途中ですが次のように書いていました ですが書いている途中にエラーがででコンパイルできません Visual C++ でやってます エラーの理由とその解決方法を教えてください #include<stdio.h> int main(void) { int score[101], score, number; printf("input of number is "); scanf("%d", &number); for (int j = 0; j < 101; j++) { score[j] = 0; } for (int i = 0; i < number; i++) { scanf("%d", &score); if (0 <= score && score <= 100) { score[score]++; }else { break; } } return 0; }
score って変数を二つ宣言してるからじゃ?
エラーメッセージ書いておいてくれないと回答面倒だよ
scoreはscore[0]を表すってことを忘れてました すみません
(゚Д゚ )ハァ?
違うの? 配列名は配列の先頭要素のアドレスを表すってあるけど ポインタを詳しく理解してないからアドレスとはなんぞやって聞かれてもクエスチョンマークだけど
「配列名は配列の先頭要素のアドレスを表す」を 「配列名は配列の先頭要素を表す」こう解釈したんだろうけど 知らない言葉を無視して前後をくっつけて理解した気になってたら しょっちゅうトラブル起こるよ
613 :
9 :2010/06/11(金) 13:44:44
>>594 そうですね!!ありがとうございます!
理解出来ましたm(_ _)m
本当にありがとうございます!!!
BASIC上がりか
615 :
デフォルトの名無しさん :2010/06/11(金) 17:02:14
616 :
501 :2010/06/11(金) 17:13:24
>>604 ,501,523
どうもありがとうございました。参考にさせて頂きます。
ボロノイ図でググってみましたが関連が深そうです。
課題は「データベース構造設計、更新効率性と正規性のバランス」
がテーマの講座で出たものでした。
>>615 #include <stdio.h>
問一
int main(void)
{
int i,num[3]={0},t,j,k;
for(i=0;i<3;i++)
scanf("%d", num+i);
j=num[0]/num[2];
k=num[1]/num[2];
for(i=j;i<=k;i++){
t=num[2]*i;
if(num[0]<=t && t<=num[1] )
printf("%d*%d=%d\n",num[2],i,num[2]*i);
}
}
void q1() {
int a, b, c, t, i;
scanf("%d", &a);
scanf("%d", &b);
scanf("%d", &c);
t = a % c;
if (t != 0)
a += c - t;
for (i = a; i <= b; i += c) {
printf("%d, ", i);
}
}
>>617 初期値をループで求めるのはどうなのと思わなくもない
620 :
619 :2010/06/11(金) 18:00:00
621 :
デフォルトの名無しさん :2010/06/11(金) 18:38:41
【質問テンプレ】 [1] 授業単元:プログラミング演習 [2] 問題文 :関数ポインタの配列を使い、入力文字列によって各関数へ分岐させるプログラムを作りなさい。 [3] 環境 :C言語 [4] 期限 :2010/06/12 よろしくお願いします。
>>621 #include <stdio.h>
void foo() { printf("foo"); }
void bar() { printf("bar"); }
void buzz() { printf("buzz"); }
int main() {
char input[100];
void (*function_table[])() = {
foo, bar, buzz,
};
char* function_names[] = {
"foo", "bar", "buzz", 0,
};
int i = 0;
scanf("%s", input);
while (function_names[i]) {
if (strcmp(function_names[i], input) == 0) {
function_table[i]();
break;
}
i++;
}
return 0;
}
こんなん?
>>622 ありがとうございます。参考にさせていただきます。
624 :
デフォルトの名無しさん :2010/06/11(金) 19:39:27
>>622 function_table
function_names
↑この配列を一つにまとめるにはどうしたらよいですか?
625 :
622 :2010/06/11(金) 19:56:00
struct function { char name[100]; void (*call)(); }; int main() { char input[100]; struct function table[] = { { "foo", foo }, { "bar", bar }, { "buzz", buzz }, { "", 0 } }; struct function *p_table = table; scanf("%s", input); while (p_table->call != 0) { if (strcmp(p_table->name, input) == 0) { p_table->call(); break; } p_table++; } return 0; } こんなのしか思い浮かばなかった、参考程度に
626 :
デフォルトの名無しさん :2010/06/11(金) 21:09:03
>>595 です。
>>596 だと、出力結果が7.4となってしまうのですが、7.4000となるようにしたいです。
%g ではなく、%.4gに修正
628 :
596 :2010/06/11(金) 21:12:23
勢いで書いた printf("%g\n", sum); ↓ printf("%.4f\n", sum);
[1] 授業単元: プログラム演習 [2] バブルソートは、 配列がすでに適正な順序, あるいはそれに近い順序で並んでいても n-1回の走査をしなければならない。すなわち、 n*(n-1)/2回の比較が行われなければならない.。そこで、各回の走査の終わりに 交換が行われたか否かをチェックするようにし、交換が行われていなければそれ以上走査をしないのでソートを完了するようなプログラムを作成せよ [3] [3.1] Windows [3.2] Visual Studio 2008 [3.3] C++ [4] 期限:2010年6月15日
633 :
631 :2010/06/11(金) 21:46:15
634 :
デフォルトの名無しさん :2010/06/11(金) 22:02:03
635 :
デフォルトの名無しさん :2010/06/11(金) 22:07:10
>>628 出力結果が0.0000になってしまいますが…
636 :
596 :2010/06/11(金) 22:10:17
もいちど a.exe
637 :
デフォルトの名無しさん :2010/06/11(金) 22:18:12
#include <stdio.h> int main(void) { char str[100]; char a; int i; printf("文字列を入力してください:"); scanf("%s",str); for(i=1;str[i]!='\0';i++){ a=str[i]; str[i-1]=str[i]; str[i]=a; str[i-1]--; } printf("%s",str); return 0; } 1行入力しその文の正順と逆順を出力するようなプログラムにしたいです。 ここまでできました。神様助けて
>>638 #include <stdio.h>
#include <string.h>
int main(void){
char str[100];
char a;
int i, len, len2;
printf("文字列を入力してください:");
scanf("%s", str); /* 改行は含めない */
len = strlen(str);
len2 = len / 2;
for(i = 0; i < len2; i++){
a = str[i];
str[i] = str[len - i - 1];
str[len - i - 1] = a;
}
printf("%s\n",str);
for(i = len2-1; i >= 0; i--){
a = str[i];
str[i] = str[len - i - 1];
str[len - i - 1] = a;
}
printf("%s\n",str);
for(i = len2; i > 0; i--){
a = str[i-1];
str[i-1] = str[len - i];
str[len - i] = a;
}
printf("%s\n",str);
return 0;
}
>>640-641 すいません。出力しましたが、できません。
Today is Thursday..yadsruhT si yadoT ←のようになりません。
input string: Today is Thursday.
yadoT ←になってしまいます。
643 :
デフォルトの名無しさん :2010/06/11(金) 23:22:47
#include <stdio.h> だけでできるようにしたいんですが・・。
>>643 #include <stdio.h>
#define MAX_LENGTH 100
int main(void){
char str[MAX_LENGTH],*rev;
int i,len;
rev = str+MAX_LENGTH/2;
puts("文字列を入力して下さい。");
scanf("%s",str);
for(len=0;str[len]!='\0';++len) ;
for(i=len-1;i>=0;--i) rev[len-i-1] = str[i];
rev[len+1] = '\0';
printf("正順:%s, 逆順:%s\n",str,rev);
return 0;
}
645 :
デフォルトの名無しさん :2010/06/12(土) 00:00:24
>>644 文字列を入力して下さい。
oday is Thursday.
正順:Today, 逆順:yadoTフ
続行するには何かキーを押してください . . .
と出力されるんですが…
648 :
デフォルトの名無しさん :2010/06/12(土) 00:07:10
zipで
>>645 fgetsは使っていいのか、scanfだと厳しいと思うんだが
650 :
デフォルトの名無しさん :2010/06/12(土) 00:10:58
>>643 #include <stdio.h>
int main(void)
{
char str[256], *p, *q;
fgets(str, 256, stdin);
for(p = str; *p; p++) if(*p == '\n') { *p = '\0'; break; }
for(q = str, p--; p > q; p--, q++) {
char temp = *p;
*p = *q;
*q = temp;
}
puts(str);
return 0;
}
printf("%s", str);をループの前に追加で
>>639 #include<stdio.h>
#include"bmp.h"
int main(void) {
unsigned char image[256][256];
long hist[32] = {0};
char* filename = "gray.bmp";
int x, y, i, k;
LoadBMP(filename, image[0], 256, 256);
for (y = 0; y < 256; y++) {
for (x = 0; x < 256; x++) {
hist[image[y][x] / 8]++;
}
}
for (i = 0; i < 32; i++) {
printf("%02d | ", i);
for (k = 0; k <= hist[i] / 100; k++)
printf("*");
printf("\n");
}
}
Visual C++使ってるんだけど Tabキー押したときスペース2つ分入力されるような設定って出来ない?
>656 make_ary 戻り値が-1,-2になることに違和感がある。 int *make_ary(int size); プロトタイプを↑にして、エラー発生したら、NULLを返すようにする方がすっきり。 print_ary 配列の全要素に対して操作するような場合、常に for(i = 0;i < size;i++) { printf("%d, ", ary[i]); } のように書く方がよい。 get_numsはそのように書いてある。そろえること。
>>657 VC++ Express 2008だけど、
ツール>オプション>テキストエディタ>C/C++で
タブサイズ、インデントサイズが決められる。
>>656 表示形式が実行例と異なっている。
scanf()でnumに読み込んでからary[i]に代入するのは無駄。
>>651 を勝手に参考にさせていただきました。
#include <stdio.h>
int main(void)
{
char str[100], a_temp;
int i, j, len;
printf("文字列を入力してください:");
fgets(str, 100, stdin);
len = strlen(str);
if(str[len-1] == '\n')
str[--len] = '\0';
printf("%s", str);
if(len%2 != 0) j=len/2; else j=len/2-1;
for(i=len/2; str[i] != '\0'; i++, j--) {
/* printf("%d,%d\n",i,j); */
a_temp = str[i];
str[i] = str[j];
str[j] = a_temp;
}
printf("%s", str);
return 0;
}
663 :
デフォルトの名無しさん :2010/06/12(土) 11:36:37
プログラム自体じゃなく書き方の方針を教えて欲しいんだが [問題] 2次元以上の配列 画面上に基盤を書くプログラムを書け。基盤とは縦横19本ずつの線が等間隔に並んだ図形である。 18×18個の正方形あるいは長方形をぴったり詰め合わせた図形と言っても良い。 まだint型しか習ってないからcharとか使えないし a[18][18]とか置いてもその後の方針がわからん プログラム自体は書かなくていいんでヒントだけ誰か教えてください
2次元配列の使用例 int a[18][18]; int i, j; for (i = 0; i < 18; ++i) { for (j = 0; j < 18; ++j) { a[i][j] = 0; } }
それはわかすんです でもそれじゃ出力されるのは楕円だから基盤ぽくならないじゃないですか でも四角い数字なんてないし printfで縦線と横線を書いていくんだったら配列要らないし もうわけわかめです
こんな奴か ┏━┳━┳━┳━┳━┳━┳━┳━┓ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣━╋━╋━╋━╋━╋━╋━╋━┫ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣━╋━╋━╋━╋━╋━╋━╋━┫ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣━╋━╋━╋━╋━╋━╋━╋━┫ ┃ ┃ ┃ ┃○┃●┃ ┃ ┃ ┃ ┣━╋━╋━╋━╋━╋━╋━╋━┫ ┃ ┃ ┃ ┃●┃○┃ ┃ ┃ ┃ ┣━╋━╋━╋━╋━╋━╋━╋━┫ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣━╋━╋━╋━╋━╋━╋━╋━┫ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣━╋━╋━╋━╋━╋━╋━╋━┫ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗━┻━┻━┻━┻━┻━┻━┻━┛
楕円?
>>667 たぶんそんな感じに出力されればおkです
>>668 配列の全要素に0を代入してそれを出力しても
00000
00000
00000
みたいな感じにしかならないじゃないですか
楕円です
要素が 0 ってのは何もない「状態」を表してるだけであって、そのまま 0 を表示 しなきゃいけないって決まりはないよ
ではないも無い状態を使ってどのように書けば四角形を出力できますか? if (a[i][j] == 0) printf("□"); ってやると配列が無駄な気がして そもそもこの方法じゃ四角と四角の間に隙間ができて基盤ぽくならないですよね
>>664 "基盤"か"碁盤"か。
もし碁盤のつもりなら、交点を中心に円を描くから、
int a[19][19];
にして置かないと。
碁盤でした すいません
配列が無駄の意味がわからない
>>675 まだ習ってないんでfor, while, ifのみでお願いします
>>676 if (a[i][j] == 0) printf("□");
みたいにやるくらいなら
for(i = 0; i < 18; i++) {
for (j = 0; j < 18; j++) {
printf("□");
}
printf("\n");
}
で十分な気がするんです
配列を有効活用出来ないっていうか
使おうと思えば使えますけど無駄になるような気がして
' ' == 0 ━ ==1 ┃ ==2 ┣ ==3 ┫==4 ┻ ==5 ┳ ==6 ┏━ ==7 ━┓==8 ┗━ ==9 ━┛==10 座標ごとにみたいな感じで配列に数字入れといて初期化して 出力のための関数で if(a[i][j]==1) printf("━"); … みたいなのを作っていけばおk
座標ごとにみたいな→座標ごとに上記の表みたいな
なるほど それでやってみます
>>677 データと表示部分は分けるべき
enum{NONE,WHITE,BLACK}として
枠を書きつつ
if (a[i][j] == NONE) printf(" ");
else if(a[i][j] == WHITE) printf("○");
else if(a[i][j] == BLACK) printf("●");
else printf("?");
みたいに配列の内容によって表示を変えるようにした方がいい
>>681 ありがとうございます
でもenumってやつはまだ習ってなくてよくわからないです(´;ω;`)
>>682 #define NONE 0
#define WHITE 1
#define BLACK 2
でもいいよ
間違っても
>>678 みたいに配列に表示部分の数字を持たせるなよ
あとで石をいじるときに苦労するぞ
なるほど
#include <stdio.h> int main(void) { int i, j; char board[19][19] = {0}; char *mark[] = {"+", "○", "●"}; for(i=0; ;i++) { for(j=0; j<19; j++) printf(" |"); printf("\n"); if(i==19) break; for(j=0; j<19; j++) printf("―%s", mark[board[i][j]]); printf("―\n"); } return 0; }
686 :
デフォルトの名無しさん :2010/06/12(土) 20:05:40
687 :
デフォルトの名無しさん :2010/06/12(土) 20:30:31
[1] 授業単元:情報処理 [2] 問題文(含コード&リンク):フィボナッチ数列に出現する数字を順に並べた時(「1,1,2,3,5,8,13,21、・・・」を 「1,1,2,3,5,8,1,3,2,1、・・・」とみなす) 非常にランダムな動きをする。50番目の数字が何であるかを求めるプログラムをかけ。 [3] 環境 [3.1] OS:Linux [3.2] コンパイラ名とバージョン:よくわかんないですけどcentOSのGNOME端末でのコンパイル [3.3] 言語:C [4] 期限:できるだけ早くお願いします>< [5] その他の制限:#include<math.h>をつかわずに#include<stdio.h>のみのプログラムでお願いします。
void arr_rev1(int arr[], int n1, int n2) { while(n1 < n2) { int temp = arr[n1]; arr[n1++] = arr[n2]; arr[n2--] = temp; }} void arr_rev2(int *p1, int *p2) { while(p1 < p2) { int temp = *p1; *p1++ = *p2; *p2-- = temp; }}
>>687 #include <stdio.h>
int main(void)
{
int f1 = 1, f2 = 1, c = 2, i, j;
while(1) {
f1 += f2;
f2 = f1 - f2;
for(i = 0,j = 1; j < f1; i++, j*=10);
c += i;
if(c >= 50) {
for(i = c; i > 50; i--) f1 /= 10;
printf("%d\n", f1 % 10);
break;
}}
return 0;
}
690 :
デフォルトの名無しさん :2010/06/12(土) 20:49:35
>>688 さんありがとうございます
>>686 です
main文はどうなりますか?
計算時間を測定しなければならないんですが、よくわからないのでお願いします!
>>690 stdio.hに時間の測定をする関数は含まれてない
time.hが必要
#include <stdio.h> #include <time.h> void arr_rev1(int arr[], int n1, int n2) { while(n1 < n2) { int temp = arr[n1]; arr[n1++] = arr[n2]; arr[n2--] = temp; } } void arr_rev2(int *p1, int *p2) { while(p1 < p2) { int temp = *p1; *p1++ = *p2; *p2-- = temp; } } int main (void){ int t1 ,t2; double t0; t1 = clock(); ここがわかりません よろしくお願いします! t2 = clock(); t0 = (t2 - t1 + 0.0) / CLOCKS_PER_SEC; printf("%d %f\n",c,t0); return 0; }
694 :
デフォルトの名無しさん :2010/06/12(土) 21:33:13
[1] 授業単元:プログラム実習 [2] 問題文(含コード&リンク):2次元配列を使って2点を結ぶ線分を引くプログラムを書く [3] 環境 [3.1] OS:Windows vista [3.2] コンパイラ名とバージョン:Visual C++ [3.3] 言語: C [4] 期限: 無期限 [5] その他の制限:if, for, while, マクロ, 配列のみでお願いします 関数, ポインタ, swich, stdio.h以外のヘッダは使用不可です。
>>695 その"線"とやらは
*********
こんなアスタリスクの集合みたいなのでいいの?
697 :
デフォルトの名無しさん :2010/06/13(日) 00:15:02
問題文を満たせば何でもいいんでしょ。その発想力も試されてる。
もちろんデバイスコンテキストを使って良いんだよな?
>>696 たぶんそうです
>>698 デバイス・・・?
ごめんなさい
たぶん使わない方がいいと思います
>>699 windowsなら線はデバイスコンテキスト使ってウインドに描画するモノだ。
C言語自体に描画する標準手法はない。そういうものは言語の外の話だからな。
なんか教材で絵が描けるライブラリとか使ってないのか?
>>700 使ってないです
てか
>>697 の言うとおり正確な図を書くのではなく
その発送やら配列の使い方やらを学ぶための問題なので
問題文を満たすなんちゃってのプログラムが書ければそれでいいと思います
ごめんちょっとまちがえた。 ×canvas[y][i] = 1; ○canvas[i][y] = 1;
705 :
デフォルトの名無しさん :2010/06/13(日) 01:33:25
[1] 授業単元:オブジェクト指向プログラミング [2] 問題文(含コード&リンク):四則演算の記号の個数を入力すると、その個数に合わせた 文字列を表示するようにしなさい。 [3] 環境 [3.1] OS:Windows XP [3.2] コンパイラ名とバージョン:gcc [3.3] 言語:C [4] 期限:2010年6月14日まで 実行例: 記号の個数を入力 +: 4 -: 2 *: 3 /: 2 <===入力した文字列中に/記号は2個 結果 ++++--***// <===四則演算の記号のみで出力する
>>705 こんなかんじ?
int main(int argc, char ** argv)
{
int i, a, b, c, d;
printf("記号の個数を入力\n");
printf("+:");
scanf("%d", &a);
printf("-:");
scanf("%d", &b);
printf("*:");
scanf("%d", &c);
printf("/:");
scanf("%d", &d);
for(i = 0 ; i < a ; i++) putchar('+');
for(i = 0 ; i < b ; i++) putchar('-');
for(i = 0 ; i < c ; i++) putchar('*');
for(i = 0 ; i < d ; i++) putchar('/');
return 0;
}
>>695 ブレセンハムの直線を引くアルゴリズムでくぐれ
きもちわりーw
>>686 int mpow1(int a, int e, int m) {
int r = 1;
while(e--) r = (r * a) % m;
return r;
}
int mpow2(int a, int e, int m) {
int r = 1, p = a % m;
while(1) {
if(e & 1) r = (r * p) % m;
if(!(e >>= 1)) break;
p = (p * p) % m;
}
return r;
}
>>692 こんなんでいいかな?うちの環境では全部1秒未満で終了するので全部0になるけど。
int main(void)
{
int data[] = {1000000, 10000000, 100000000};
int i, *buf;
clock_t t0, t1, t2;
for (i = 0; i < (int)(sizeof(data) / sizeof(data[0])); i++) {
if ((buf = (int *)malloc(sizeof(int) * data[i])) == NULL) {
printf("メモリが足りません。\n");
exit(1);
}
t1 = clock();
arr_rev1(buf, 0, data[i] - 1);
t2 = clock();
t0 = (clock_t)((t2 - t1 + 0.0) / CLOCKS_PER_SEC);
printf("arr_rev1(n = %d): %f\n", data[i], t0);
t1 = clock();
arr_rev2(buf, &buf[data[i] - 1]);
t2 = clock();
t0 = (clock_t)((t2 - t1 + 0.0) / CLOCKS_PER_SEC);
printf("arr_rev2(n = %d): %f\n\n", data[i], t0);
free(buf);
}
return 0;
}
>>712 それからこうしないとnが偶数の時に実行時エラーになるか暴走する。
void arr_rev1(int arr[], int n1, int n2)
{
while (n1 <= n2) {
int temp = arr[n1];
arr[n1++] = arr[n2];
arr[n2--] = temp;
}
}
void arr_rev2(int *p1, int *p2)
{
while (p1 <= p2) {
int temp = *p1;
*p1++ = *p2;
*p2-- = temp;
}
}
何を言ってるんだ?
>>714 <=じゃなくて<でやってみろよ
Windowsだとエラーダイアログを吐いて落ちる
悪い俺の勘違いだった
>>713 は取り消して下さい(汗
何をどう勘違いしたんだ?
いや、 if ((buf = (int *)malloc(sizeof(int) * data[i])) == NULL) { を if ((buf = (int *)malloc(data[i])) == NULL) { と書いていて落ちたのを勘違いしてただけ 忘れてくれ
関数を全く理解してないってのは理解できた
は?何言ってんの?
なんだただの煽り屋の馬鹿か
722 :
デフォルトの名無しさん :2010/06/13(日) 11:55:17
[1] 授業単元: ハフマン符号 [2] 問題文(含コード&リンク): 文字とその確率を入力しそれに対するハフマン符号を文字に割当て 表示する [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン:gcc [3.3] 言語: C [4] 期限: (2010年6月14日 [5]
typedef struct { char b; int i; short s; double d; char c; } test; とあるプログラム文の一部で、 struct内のみいじって出来るだけ少ないメモリを使用するようにする。 という問題なのですが良く分かりません。 上から順にchar,char,short,int,doubleと並び替えても違いました。 文の中でchar bを使ってなかったので、そもそもchar b;は必要なのか?と思い消しても駄目でした。
>>724 の続き
int main() {
test a;
test many[10000];
printf("Address of char member: %p\n", &a.c);
printf("Address of int member: %p\n", &a.i);
printf("Address of short member: %p\n", &a.s);
printf("Address of double member: %p\n", &a.d);
printf("Difference between addresses of int and char: %d\n",
(int)&a.i - (int)&a.c);
printf("Difference between addresses of short and int: %d\n",
(int)&a.s - (int)&a.i);
printf("Size of char: %d\n", sizeof(char));
printf("Size of short: %d\n", sizeof(short));
printf("Size of int: %d\n", sizeof(int));
printf("Size of double: %d\n", sizeof(double));
printf("Size of test structure: %d\n", sizeof(test));
printf("Size of array of test structures: %d\n", sizeof(many));
return 0;
}
ヒント:test内の宣言の順番を入れ替える
並び替えたって書いてあるし。 もとの順番では32tyeで、char,char,short,int,doubleに並び替えたら16byteになるからOKでは?
>>723 関数の内容を吟味する前に実行してエラーが出たから勘違いしたんだよカス
その上で後から内容は見るつもりだったわ
お前みたいなヴォケに言われなくてもな
うわw
吟味しないで他人様のコードにケチつけるのは人としてどうかと思う
テッテレー
人のコードをろくに読まずに偉そうな口調でケチつけたあげくに逆ギレってw
>727 Byte数は分からないが C++ならcharは1、C言語ならcharは1 Byteで1 <= sizeof(char) <= sizeof(short int) <= sizeof(int) <= sizeof(double)は保証されているので、小さい順に(char, char, short, int, doubleの順に)並べれば少なくとも大きくはならない つまり、等しくなるか小さくなるかのどちらかである union使おうとしたのは内緒ね
構造体のアラインメントの問題じゃねーの?
小さい順でも大きい順でも、整列できてればいいような気もするが
>>735 パディングというものがあってだな・・・決め打ちはデータの送受信で死ぬ
>>734 注意をするなら言い方ってものがあるだろうが
お前らわざと逆ギレを誘うような言い方しやがって
分かってない馬鹿に馬鹿にされるのはものすごく腹が立つからしょうがない
やってみろよ、なんて偉そうに言っといて間違ってるから煽られるんだよw
注意するのに言い方とかw 会社で怒られたら出社拒否しそうだなw
>>731 それはハフマン符号ではなくてコンマ符号ではないのか
>>741 俺は言ってねえよ
馬鹿か
>>742 当たりめえだろ
物には言い方があるんだよ
覚えとけ
下手な注意はかえって相手の怒りを買うだけだ
小学生かw
だめでした… <<= 小学生か?
恥ずかしい間違いをした
>>713 ,715じゃないなら、なんでそんなに顔真っ赤なの?
>>743 コンマ符号ではなくハフマン符号のつもりだがどこか間違ってる?
俺は朝鮮人だ 文句あっか 火病を起こすのがデフォなんだよわかったか
>>731 ごめんコンマ符号ではないわ
一意に復元可能な符号で瞬時符号でもあるがハフマン符号ではない
<♯`Д´>ドッカーン !!
うわぁ朝鮮人だぁ
754 :
デフォルトの名無しさん :2010/06/13(日) 13:49:07
[1] 授業単元:オブジェクト指向プログラミング [2] 問題文(含コード&リンク):四則演算の記号を連続し入力すると、各々の文字列を入れると、 文字の個数を結果として表示するようにしなさい。 [3] 環境 [3.1] OS:Windows XP [3.2] コンパイラ名とバージョン:gcc [3.3] 言語: C [4] 期限:2010年6月14日 [5] int main(void){からスタート 実行例: 文字列を入力 ***-++/+-+/ <===四則演算の記号のみを入力する。 結果 +: 4 -: 2 *: 3 /: 2 <===入力した文字列中に/記号は2個
>>724 >>725 の問題文です。
The example program below defines a structure with several members of different types. Copy and run the program, and find out how much memory the test structure uses.
Change the order of the members in the test structure. Observe the changes in memory layout and memory usage.
Try to find the program version where the test structure uses as little memory as possible. Change only the structure definition, not the program itself.
>>748 どこが間違えかと言われると説明しにくいんだが
例えば、cat data2
8
A
50
B
20
C
10
D
8
E
5
F
4
G
2
H
1
が与えられたとき
「2元符号語で最小の確率を持つ葉から最も確率が近い葉同士を区別するのに1ビット使っていく」と
A:0
B:10
C:1100
D:1101
E:1110
F:11110
G:111110
H:111111
になるべきではないかと、木の作り方によって符号語は変わるけど、平均符号長は最小になるはず
この場合だと平均符号長L = 2.2で、試しにソースプログラムで符号化した符号ではL = 2.22になった
よって、ハフマン符号とは言えない
>>754 #include <stdio.h>
int main(void)
{
char str[256], *p, sign[] = "+-*/";
int i, cnt[256] = {0};
printf("文字列を入力\n");
scanf("%s", str);
for(p = str; *p; p++) cnt[*p]++;
printf("結果\n");
for(i = 0; i < 4; i++) printf("%c:%d\n", sign[i], cnt[sign[i]]);
return 0;
}
>>756 なるほど手抜きせずにちゃんと木構造作らないとダメってことか
木構造か C++が使えるならstd::mapを使って簡単に組めるんだが
In C, arrays and pointers are almost equivalent. This means that a program written with array[index] can be converted to using (almost) no [ and ]. Convert the program below. The only place where you need [ and ] is for the declaration of the data structure (student marks[10]). Before starting, save the output of the program for later checking. Then work in very small steps. After each step, recompile your program and check (using diff) that it is still working correctly (i.e. still produces the same output). #include <stdio.h> typedef struct { int english; int math; } student;
>>761 続き
int main(void) {
int i, english_total=0, math_total=0;
student marks[10] = {
{45, 69},
{68, 80},
{57, 75},
{35, 50},
{60, 71},
{80, 74},
{78, 80},
{32, 46},
{48, 56},
{100, 100}
};
printf("英語\t数学\t平均\n");
for (i=0; i<10; i++) {
printf("%3d\t%3d\t%5.1f\n",
marks[i].english, marks[i].math,
(marks[i].english+marks[i].math)/2.0 );
}
for (i=0; i<10; i++) {
english_total += marks[i].english;
math_total += marks[i].math;
}
>>762 続き
printf("%5.1f\t%5.1f\t%5.1f\n",
english_total/10.0, math_total/10.0,
(english_total+math_total) / 20.0);
return 0;
}
Hint:
For various parts of your program, use the following steps:
Step 0) Compile and run the above program, and save the output for later tests using diff.
Step 1) Change array[i] to *(array+i). If necessary, add some more parentheses.
Step 2) Define variables p and endp, both pointers to the student structure.
Initialize endp so that it points to the location after the marks array.
Step 3) In each for loop, initialize p to point to the start of the marks array.
To do two initializations, link them with a comma (e.g. i=0, j=0).
Step 4) In each for loop, increment p in addition to incrementing i.
To do two increments, you can again use a comma (e.g. i++, j++).
Step 5) Change (marks+i) to p.
Step 6) Change (*pointer).member to pointer->member .
Step 7) Use the endp variable in the end condition of the for loop, comparing p and endp.
Step 8) Remove the integer loop variable i.
Remove unnecessary parentheses.
英語で問題だしてくるなんておハイソな学校に通ってらっしゃるのね。 [ ] 使わずにポインタにしろって問題?
>>764 そんな感じです。
先生がGAIJINさんなもので、どうしても英語になります。
とりあえず書き換えたところだけ。ヒントは読んでない。 student *p; for (p=marks; p<marks+10; ++p) { printf("%3d\t%3d\t%5.1f\n", p->english, p->math, (p->english+p->math)/2.0 ); } for (p=marks; p<marks+10; ++p) { english_total += p->english; math_total += p->math; }
訳すと C言語ではポインタと配列はほぼ同じである。 これは配列array[index]を使用したプログラムは[と]を使わないプログラムに書き換えられるという事である。 下のプログラムを書き換えよ。 [と]を使って良いのは構造体データ(student marks[10])の宣言だけとする。 始める前に後で比較するために最初のバージョンを保存しておけ。 そして少しずつ変更を加えよ。 変更を加える度にdiffで比較し、再コンパイルしてまだ動作することを確認しながら進めろ。 だな。
>>766 p < marks+10
↓
student *endp = marks+10;
p != endp
769 :
デフォルトの名無しさん :2010/06/13(日) 16:52:37
[1] 授業単元:オブジェクト指向プログラミング [2] 問題文(含コード&リンク):実行例のように入力した文字列を文字型配列に代入し、 規則に従った文字列を出力するようにしなさい。 [3] 環境 [3.1] OS:Windows XP [3.2] コンパイラ名とバージョン:gcc [3.3] 言語: C [4] 期限:2010年6月14日 [5] int main(void){からスタート 実行例: 文字列を入力 *3-2*4n+5 <===「*3」は*を3回表示するということ、 結果 「n」は改行ということ。 ***--**** *3-2*4n+5は、*を3回表示した後、-を2回、*を4回 +++++ 表示し、改行した後、+を5回するという意味
>>767 大体そんな感じでいいと思うがdiffでの比較対象が明らかになってないので
動作確認は変更後の出力結果が変更前のそれとdiffで一致するかどうかね
>>767 を読んだとき、diffの対象がソースコードに思えたので一応言っておく
>>770 それにしても、出来上がったのを提出しろとか、だれかにやらせろとか、
または途中経過も、とかは英語では言ってないの?
772 :
デフォルトの名無しさん :2010/06/13(日) 17:07:48
722です ハフマン符号お願いします
[1]Cプログラミング(中級者コース) [2] f(1)=1 f(2)=12-34=-22 f(3)=123-894+765=-6 f(4)=1234-1213145+1116156-10987=-106742 f(5)=12345-161718196+152425207-142322218+131211109 ...... 規則性を見いだしてf(n)を計算するプログラム(n<=1000迄は最小限対応) 全桁正確に計算すること [3] WIndows XP sp3/Visual C++2008/C言語 [4] 6/30迄 [5] stdio.hのみ#include。stdio.hで定義されている関数や定数 を利用出来る。それ以外は自分で定義して使うこと
>>774 ここまで分かった
f(1)=1
f(2)=12
-34=-22
f(3)=123
-894
+765=-6
f(4)= 1 2 3 4
-121314 5
+111615 6
-10 9 8 7=-106742
f(5)= 1 2 3 4 5
-16171819 6
+15242520 7
-14232221 8
+13121110 9
>>761-
>>763 やりかけです。エラーが…
#include <stdio.h>
typedef struct {
int english;
int math;
} student;
int main(void) {
english_total=0, math_total=0;
student *p = {
{45, 69},
(略)
{100, 100}
};
student *endp=p;
p!=endp;
printf("英語\t数学\t平均\n");
for (p=marks; p<endp; p++) {
printf("%3d\t%3d\t%5.1f\n",
*p.english, *p.math,
(*p.english+*p.math)/2.0 );
}
for (p=marks; p<endp; p++) {
english_total += *p.english;
math_total += *p.math;
}
printf("%5.1f\t%5.1f\t%5.1f\n",
english_total/10.0, math_total/10.0,
(english_total+math_total) / 20.0);
return 0;
}
時計回りに回ってるな
>>776 演算子の優先順位
*p.english
(*p).english
f(n)の第一項は1,12,123,1234って増え続ける そのほかわからん。
2項目の先頭文字のルールは 4*(n-1) かな? f(n) = 1 2 ... n-1 -[4*(n-1)] ? +[4*(n-1)-1] ? -[4*(n-1)-2] ? :
>>775 あー。なるほど。渦巻き状いにまわるのか
f(2)=12-43 じゃないのが謎
n<=1000 まで対応 となると 1000x1000 の空間用意して 渦巻き状に埋めてから 筆算のように演算しないと厳しいか?
>>774 f(2)=12-43=-31
の間違いじゃね?
>>783 筆算しようとすると1000 x 4000いらないか?
n=1000のときは最底辺は29982997...1999だぜ。
>>761--
>>763 途中
#include <stdio.h>
typedef struct {
int english;
int math;
} student;
int main(void) {
int p,endp,english_total=0, math_total=0;
student *p{
{45, 69},
(略)
{100, 100}
};
printf("英語\t数学\t平均\n");
for (p=marks; p<endp; p++) {
printf("%3d\t%3d\t%5.1f\n",
p->english, p->math,
(p->english+p->math)/2.0 );
}
for (p=marks; p<endp; p++) {
english_total += p->english;
math_total += p->math;
}
printf("%5.1f\t%5.1f\t%5.1f\n",
english_total/10.0, math_total/10.0,
(english_total+math_total) / 20.0);
return 0;
}
あと少しで完成しそうですが…
pとendpをどのように定義するかで悩んでます。
Step どこまでできた?(diffで結果を比較して)
790 :
458 :2010/06/13(日) 20:21:14
>>787 Step 2) Define variables p and endp, both pointers to the student structure.
>>766 みたいにすればいいよ
792 :
デフォルトの名無しさん :2010/06/13(日) 20:35:28
>>789 - #define s 10
+ #define s 8
何ここってもしかして教師がアルバイトで回答者やってんの?
>>774 とんでもない桁の計算になる気がするんだが
>>794 金がもらえるんならありがたいけどな。
ちなみに俺はコーディングがしたくてIT企業に入ったのにできないからここで欲求不満を解消してるだけ
N=1000までだから、多倍長演算が必要だと思う。 Nが1000の場合、どんだけ桁数になるんだろ。
>>798 行ごとに交互に減算と加算をするから対して大きな数にならないはず
行ごとに2893〜4000桁になるから計算できなくない?
801 :
799 :2010/06/13(日) 21:08:17
5000〜6000桁くらいじゃね?
>>798 stdio.h 以外は include 不可だから、f("1234","-5678") -> "-4444"みたいな関数が必要?
みんなお目々キラキラ
>>761 >>762 >>763 で相変わらず悩んでます
#include <stdio.h>
typedef struct {
int english;
int math;
} student;
int main(void) {
int english_total=0, math_total=0;
student marks[10]{
{45, 69},
(略)
{100, 100}
};
student *p;
student *endp;
p!=endp;
printf("英語\t数学\t平均\n");
for (p=marks; p<endp; p++) {
printf("%3d\t%3d\t%5.1f\n",
p->english, p->math,
(p->english+p->math)/2.0 );
}
for (p=marks; p<endp; p++) {
english_total += p->english;
math_total += p->math;
}
printf("%5.1f\t%5.1f\t%5.1f\n",
english_total/10.0, math_total/10.0,
(english_total+math_total) / 20.0);
return 0;
}
>>766 と
>>768 を参考にしましたがうまくいかないです。
809 :
デフォルトの名無しさん :2010/06/13(日) 21:30:14
>>808 15行目の「p!=endp;」は、書く場所が違うというかいらない。ifとかforじゃないのに変数の比較してて変だって思わなかった?
>>768 は
>>761 の「for (p=marks; p<marks+10; ++p) {」の「p < marks+10」を書き換えろって意味。
それはもうやってるけど、比較する前にendpに何らかの値を代入しなければいけないよね?それがmarks+10。
813 :
810 :2010/06/13(日) 22:36:56
814 :
デフォルトの名無しさん :2010/06/13(日) 23:01:48
>>769 #include <stdio.h>
int main(void) {
char buffer[100], c, *buffer_pos, pattern = 0;
int i;
buffer_pos = buffer;
printf("input string:");
scanf("%s", buffer);
while (c = *(buffer_pos++)) {
if (c == 'n') {
printf("\n");
pattern = 0;
continue;
}
if (!pattern)
pattern = c;
else {
for (i = 0; i < c - '0'; i++)
printf("%c", pattern);
pattern = 0;
}
}
return 0;
}
エラーチェックとかは一切考慮してない
817 :
デフォルトの名無しさん :2010/06/13(日) 23:25:39
>>769 #include <stdio.h>
int main(void){
int i=0, j, rep;
char buf[100], c;
printf("Command > ");
fgets(buf, 100, stdin);
while((c = buf[i++]) != '\0') {
/* printf("in=%c\n",c); */
switch(c){
case '*':
case '-':
case '+':
rep = atoi(&buf[i]);
for(j=0; j<rep; j++) putchar(c);
/* printf("rep=%d\n",rep); */
break;
case 'n':
putchar('\n');
c = '\0';
break;
default:
c = '\0';
}
}
}
>>813 N=11以降違うっぽいから3桁以上の数字の扱いがおかしいのかも
>>774 勝手に
>>806 を利用
#include <stdio.h>
int main(void){
int n, i, j, k, t, ns[1000] = {0}, tmp, digit[2] = {0}, f, d;
char a[2][6000] = {0}, temp[6000] = {0};
printf("n=");
scanf("%d", &n);
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) ns[j] += ((j < n / 2) ? 1 : -1);
tmp = (n - 2 * i);
tmp *= tmp;
for (j = i - 1; j < n - i; j++, tmp--) if (j >= 0) ns[j] = tmp;
tmp = ns[n - i - 1];
for (j = n - i - 1; j <= i; j++) ns[j] = tmp++;
tmp = n * n;
for(j = n - 1, k = 0; j >= 0; j--) for(t = tmp - ns[j]; t; t /= 10) temp[k++] = t % 10;
for(j = 0; j < k || a[i&1][j]; j++) {
a[i&1][j] += temp[j];
if(a[i&1][j] >= 10) { a[i&1][j+1]++; a[i&1][j] -= 10;}}
if(digit[i&1] < j) digit[i & 1] = j;
for(j = 0; j < k; j++) temp[j] = 0;}
d = digit[0] > digit[1] ? digit[0] : digit[1];
for(i = d - 1; i >= 0; i--) {
if(a[0][i] > a[1][i]) { f = 0; break;}
if(a[0][i] < a[1][i]) { f = 1; break;}}
for(i = 0; i < d; i++) {
a[f][i] -= a[1-f][i];
if(a[f][i] < 0) { a[f][i+1]--; a[f][i] += 10;}}
while(a[f][d]==0) d--;
if(f) putchar('-');
while(d >= 0) printf("%d", a[f][d--]);
return 0;}
823 :
810 :2010/06/14(月) 00:48:21
連携プレイに泣いた すごいなこのスレの住人…
>>824 ほんとスゴイよね。
スゴイC使いも時々はBASICとか他のプログラミング言語も
勉強してるって良く聞くけど効果あるのかな?
C言語初心者です。ポインタの問題で詰まっています。 以下のプログラムの実行結果を記述せよ。 また、”//重要ポイント”とした行の動作について説明せよ。 main(){ int j; short *ip; short ii[6]; ip=ii; *ii=128; *ip++; //重要ポイント *ip++=256; ii[2]=512; *ip++; *ip++=1024; //重要ポイント ii[4]=2048; *ip++; *ip=4096; (*ip)++; //重要ポイント for(j=0;j<6;j++) printf("ii[%d] = %d ",j,ii[j]); printf(" Adress of ii[0] is %04x.",ii); printf(" Adress of ip is %04x.",ip);} ただし、short型は2バイト。ii[0]のアドレスを0x00010000。 主記憶の1アドレスに対する単位を1バイトとする。処理系によっては警告が出る可能性もある。 とりあえずプログラムを書いて実行してみたのですが、「ii[0]のアドレスを0x00010000」とあるので間違っている気もします。 一応以下が実行結果です。 ii[0] = 128 ii[1] = 256 ii[2] = 512 ii[3] = 1024 ii[4] = 2048 ii[5] = 4097 Adress of ii[0] is 12ff3c. Adress of ip is 12ff46. 実行結果を見て、iiのアドレスをipに入れてii[奇数]に関してはipに入っているアドレスに値を代入、というふうに解釈しています。
混乱させるためだけに必要のないところ*をつけるような問題はゴミだな
本当に意味のない問題だな…… 詰まってるとこに関してだが 「ii[0]のアドレスを0x00010000」と仮定してprintfで何が出力されるか予想しなさいということだろう。 プログラム上で実行しても合うはずがない。
>>827-828 ありがとうございます。ただ、必要のないところ、というのが見極められないですね。
printf(" Adress of ii[0] is %04x.",ii);
printf(" Adress of ip is %04x.",ip);
ここに関してですが、たぶんipのアドレスはii[0]のアドレスに対して10増えていると思うので、
Adress of ii[0] is 10000. Adress of ip is 1000A.
でいいのでしょうか?“%04x”の“04”を考慮した書き方が分からないです。
4桁で書くということだと思うのですが、そもそも5桁目まであるので。
830 :
デフォルトの名無しさん :2010/06/14(月) 05:11:05
libsamplerate-0.1.7 win32をコンパイルして頂けませんか?
>“%04x”の“04”を考慮した書き方が分からないです。 ちゃんとリファレンス読め
>>831 すみません。
ググッてみましたがリファレンスというものがなんなのかわからないです。
>>833 ありがとうございます。
仕様というかそういうのをもっとよく理解しろということでしょうか。
まあ、なんとか自分で実験しておそらく「少なくとも4桁で足りないところには0を入れる」という意味ではないかと納得しました。
ヒントを与えてくれた方々ありがとうございました。
Details When using fgets, the client program has to prepare a buffer for input. Create a wrapper function (call it getline) for fgets that allocates a buffer using malloc and returns a pointer to the buffer. Return NULL when there is no more data to read (end-of-file reached). Assume that lines are at most 100 bytes long (including a terminating null byte). Also, assume that input is always from stdin. Create a main program that reads in up to 100 lines. Output the lines in reverse order. Use an array of pointers to store the pointers to each line. You do not have to free the memory used. Test Data Test input: 09C1_in.txt ; test output: 09C1_out.txt . Submit your program to the Programm Checking System. Hint: To use malloc, you need to include stdlib.h. Hint: Because the length of the buffer and stdin are constant, and you do not need to pass the buffer to the function, the signature of your function should be char *getline(void). Hint: A wrapper function is a function that wraps another function to make it easier to use.
>>835 #include <stdio.h>
#include <stdlib.h>
char *getline(void)
{
char *p = malloc(100);
return fgets(p, 100, stdin);
}
int main(void)
{
int i;
char *p[100];
FILE *fp;
for(i = 0; i < 100; i++) if((p[i] = getline()) == NULL) break;
fp = fopen("09C1_out.txt", "w");
while(i--) fprintf(fp, "%s", p[i]);
fclose(fp);
return 0;
}
844 :
デフォルトの名無しさん :2010/06/14(月) 20:16:24
[1] 授業単元:プログラミング応用 [2] 問題文(含コード&リンク):西暦を年号に変換するプログラムを作成する。 ただし、入力できるのは、1868年以降からであり、2008年以降も平成とする。 明治元年、大正元年、昭和元年、平成元年は、各々、1868年,1912年,1926年,1989年である。 下記を参考にプログラムを作成しなさい。 int gannen[]={1989, 1926, 1912, 1868}; char nengou[][8]={"heisei", "syouwa", "taisyou", "meiji"}; [3] 環境 [3.1] OS:Windows XP [3.2] コンパイラ名とバージョン:gcc [3.3] 言語:C [4] 期限:2010年6月14日 [5] その他の制限:int main(void){から始まる
#include <stdio.h> #include <stdlib.h> int gannen[]={1989, 1926, 1912, 1868}; char nengou[][8]={"heisei", "syouwa", "taisyou", "meiji"}; int main(void){ int i, nen; char buf[20]; do { printf("seireki>=1867 > "); fgets(buf, 20, stdin); nen = atoi(buf); } while (nen < 1868); for(i=0; ;i++) { if(nen >= gannen[i]) { printf("%s %d nen\n", nengou[i], nen-gannen[i]+1 ); break; } } }
1867になってるとこがあるぞw
847 :
デフォルトの名無しさん :2010/06/14(月) 20:49:58
#include <stdio.h> int main(){ int num,sum=0; while(1){ scanf("%d",&num); if(num==0) break; sum+=num; } printf("%d",sum); return 0; }
849 :
838 :2010/06/14(月) 21:10:11
>>847 この程度の問題が分からないってどんな授業受けてんの?
昔先輩から聞いた話だが、 情報系の専門学校出たヤツをPGとして雇ったら 「コンパイルって何ですか?」って聞かれたそうな。
ぷよぷよだろ
[1] プログラミング言語 [2] if (head == NULL) head = stup;//一個目を入力 else if (head->st_id >= stup->st_id) { /*?? (5) リストのhead側(先頭)にstupを追加する処理を記述する */ /*?? (6) headの中身を現在の先頭のものに入れ替える */ } else { spt = head; while (spt->next != NULL ) { if (spt->next->st_id >= stup->st_id){ break; } /*?? (7) sptを次に操作するデータ用に更新する処理を記述する*/ } stup->next = spt->next; spt->next = stup; } [3] 環境 [3.1] Windows [3.2] Visual Studio 2008 [3.3] C++ 106 taka 65 80 90 100 101 kubo 50 85 70 65 103 hanako 70 75 65 80 104 akane 60 95 80 75 102 tarou 90 80 85 65 105 nara 80 70 50 95 ↑これが 左端の番号順になるように(5)〜(7)になんてプログラム書き込めばいいんでしょうか
857 :
デフォルトの名無しさん :2010/06/14(月) 21:51:51
[1] 授業単元:プログラミング実習U [2] 問題文(含コード&リンク):図と同じASCII文字を表示するプログラムを作成しなさい。 ただし、プログラム中にちゃんと改行を行うこと。<==改行をしなくても勝手に改行されて表示されるため。 [3] 環境 [3.1] OS:Windows XP [3.2] コンパイラ名とバージョン:gcc [3.3] 言語:C [4] 期限:2010年6月15日 [5] その他の制限:int main(void){から始まる 図 0x30; 0 0x31; 1 0x32; 2 0x33; 3 0x34; 4 0x35; 5 0x36; 6 0x37; 7 (省略) 0x78; x 0x79; y 0x7a; z 0x7b; {
#include <stdio.h> int main(void){ int i, j; // for(i=0x20; i<0x80; i++) for(i=0x30; i<0x7c; i++) { printf("0x%2x; %c ", i, i); if(i%4 == 3) printf("\n\n"); } }
(47) : error C2440: '=' : 'void *' から 'student_t *' に変換できません。
>>849 .cpp ⇒ .c
861 :
デフォルトの名無しさん :2010/06/14(月) 23:36:13
#include<stdio.h> #include<math.h> #define MAXITER 50 #define EPSILON 1e-10 #define X0 3.0 #define Y0 2.0 double f (double x, double y) { return x*x+x*y*y*y-9; } double fx(double x, double y) { return 2.0*x; } double fy(double x, double y) { return -1.0; } double g (double x, double y) { return 3*x*x*y-y*y*y-4; } double gx(double x, double y) { return 2.0*x; } double gy(double x, double y) { return 2.0*y; } /*--- Iteration method ---*/ void iteration(void) { int k; double x0, y0; double x1, y1; double af, ag; x0=X0; y0=Y0; af=fabs(f(x0,y0)); ag=fabs(g(x0,y0)); printf("%-2s %-16s %-16s %-10s %-10s %-10s\n", "#k", "x", "y", "|f(x,y)|", "|g(x,y)|", "|f|+|g|"); printf("%2d %16.13f %16.13f %10.4e %10.4e %10.4e\n", 0, x0, y0, af, ag, af+ag); for(k=1; k<=MAXITER; k++){ x1=x0-f(x0,y0)/fx(x0,y0); y1=y0-g(x0,y0)/gy(x0,y0); x0=x1; y0=y1; af=fabs(f(x0,y0)); ag=fabs(g(x0,y0)); printf("%2d %16.13f %16.13f %10.4e %10.4e %10.4e\n", k, x0, y0, af, ag, af+ag); if(af+ag<EPSILON) break; } }
862 :
デフォルトの名無しさん :2010/06/14(月) 23:40:50
/*--- Method of Successive displacement ---*/ void displacement(void) { int k; double x0, y0; double af, ag; x0=X0; y0=Y0; af=fabs(f(x0,y0)); ag=fabs(g(x0,y0)); printf("%-2s %-16s %-16s %-10s %-10s %-10s\n", "#k", "x", "y", "|f(x,y)|", "|g(x,y)|", "|f|+|g|"); printf("%2d %16.13f %16.13f %10.4e %10.4e %10.4e\n", 0, x0, y0, af, ag, af+ag); for(k=1; k<=MAXITER; k++){ x0=x0-f(x0,y0)/fx(x0,y0); y0=y0-g(x0,y0)/gy(x0,y0); af=fabs(f(x0,y0)); ag=fabs(g(x0,y0)); printf("%2d %16.13f %16.13f %10.4e %10.4e %10.4e\n", k, x0, y0, af, ag, af+ag); i f(af+ag<EPSILON) break; } } /*--- Newton's method (NEWTON HOU) ---*/ void newton2(void) { int k; double x0, y0, x1, y1; double f0, fx0, fy0, g0, gx0, gy0; double af, ag, dj; x0=X0; y0=Y0; af=fabs(f(x0,y0));ag=fabs(g(x0,y0)); printf("%-2s %-16s %-16s %-10s %-10s %-10s\n", "#k", "x", "y", "|f(x,y)|", "|g(x,y)|", "|f|+|g|"); printf("%2d %16.13f %16.13f %10.4e %10.4e %10.4e\n", 0, x0, y0, af, ag, af+ag); for(k=1; k<=MAXITER; k++){ f0 =f (x0,y0); fx0=fx(x0,y0); fy0=fy(x0,y0); g0 =g (x0,y0); gx0=gx(x0,y0); gy0=gy(x0,y0); dj =fx0*gy0-gx0*fy0; x1=x0+(-f0*gy0+g0*fy0)/dj; y1=y0+(-g0*fx0+f0*gx0)/dj; x0=x1; y0=y1; af=fabs(f(x0,y0)); ag=fabs(g(x0,y0)); printf("%2d %16.13f %16.13f %10.4e %10.4e %10.4e\n", k, x0, y0, af, ag, af+ag); if(af+ag<EPSILON) break; } }
864 :
838 :2010/06/14(月) 23:48:34
>>863 //ここで表示
for(j=0;j<M;j++){
printf("%2d人目:",j+1);
for(i=0;i<N;i++){
printf("%4d ",data[j][i]);
}
printf("\n");
}
866 :
デフォルトの名無しさん :2010/06/14(月) 23:52:54
int main(void) { puts("# Iteration method:"); iteration(); putchar('\n'); puts("# Method of Successive displacement:"); displacement(); putchar('\n'); puts("# Newton's method:"); newton2(); return 0; } [3] 環境 [3.1] OS:linux [3.2] コンパイラ名とバージョン:gcc [3.3] 言語:C [4] 期限:2010年6月15日 [5] その他の制限:長々と申し訳ございません。861,862です。 PCの調子が悪いせいかアップロータにアップできませんでした。 それで問題なのですが、反復法、順次置換法、Newton法の収束 を求めるもなのですがfx,fy,gx,gyの数値がどのように定義すれば よいかわからず質問させていただきました。 ぜひよろしくお願いいたします。
>>865 ありがとうございました
なるほど桁をとってやればいいんですね!
ありがとうございます
後、できればソート前の合計点とソート後の合計点もお願いしてもいいでしょうか
>>868 int main(){
int i,j,temp,data[M][N],goukei[M]={0};
unsigned int seed;
seed=time(0); /* <-- 任意の正整数を入力 ここでは97を入力 */
srand(seed);
/* 1〜100の乱数を、M×N個作成 */
for(j=0;j<M;j++)
for(i=0;i<N;i++){
data[j][i]=1+rand()/(RAND_MAX/100);
goukei[j]+=data[j][i];
}
printf("\n\n合計点(ソート前):");
for(j=0;j<M;j++)
printf("%4d",goukei[j]);
/* バブルソート */
for(j=1;j<M;j++)
for(i=1;i<=M-j;i++)
if(goukei[j] < goukei[j-1]){
temp = goukei[j-1];
goukei[j-1] = goukei[j];
goukei[j] = temp;
}
printf("\n合計点(ソート後):");
for(j=0;j<M;j++)
printf("%4d",goukei[j]);
}
バブルソートなし
/* バブルソート */ for(j=1;j<M;j++) for(i=1;i<=M-j;i++) if(goukei[i] < goukei[i-1]){ temp = goukei[i-1]; goukei[i-1] = goukei[i]; goukei[i] = temp; }
a(){}[EOF]
874 :
デフォルトの名無しさん :2010/06/15(火) 01:42:17
[1] 授業単元:C言語プログラミング [2] 問題文(含コード&リンク):モンテカルロ法で円周率を求めるプログラムを作れ。 [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 本日の昼 [5] その他の制限: 使いそうな関数としてsrandom(unsigned long seed),random(),aq rt(double x),pow(double x, double y)が挙げられている コンパイル時には-lmオプションをつける お願いします。
>>872 いまさら突っ込むべきかどうか悩むがその名前欄はトリップのミスなの?
#include <stdio.h> #include <stdlib.h> int main(void) { double x, y; int i, c; srand(time(NULL)); for(i = c = 0; i < 1000000000; i++) { x = (double)rand() / RAND_MAX; y = (double)rand() / RAND_MAX; if(x * x + y * y <= 1) c++; } printf("%f\n", c * 4.0 / 1000000000); return 0; }
>>873 えっと・・すいませんちょっと意味がわかりません・・・・・・
あの初心者なもので・・・
できればもっとかみ砕いて教えてもらえるとうれしいです
>>875 普通に?つけるの忘れてました・・・
なんか適当にキーボード叩いてみたらこうなったです・・
>>872 62行目ってどこだよ
ソースそのままじゃないだろ
最後に } が多いんだとは思うが
噛み砕くも何も。エラー読めよ。
>>878 ほんとでした最後の中カッコが余計でした
ありがとうございます!
>>879 絶対おかしいとは思ったのですが、試しに}の前に;付けてみたのですがやっぱ無理でした・・・・
てかよく考えれば一番上のエラーを読めばいいんですね!
ちゃんと構文エラーって書いてました・・・
ありがとうございました
助かりましたー
[1] 授業単元:C++
[2] 問題文(含コード&リンク):
http://www.bohyoh.com/Books/MeikaiCPP/download.html 9章クラス=17章までのの全演習です
[3] 環境
[3.1] OS:Windows
[3.2] コンパイラ名とバージョン:
[3.3] 言語:C++
[4] 期限: 2010年6月16日
[5] その他の制限:初心者です
著者がホームページ持ってるし、後で写しておこうと思ってたんですが
別の著書のみでこの本の解説はありませんでした
出来る限りググったりしてみたんですが見つけられず
厳しいかと思いますが、どうかよろしくお願いします・・・orz
884 :
883 :2010/06/15(火) 13:51:26
追記です 11-3までの演習はどうにかキャッシュなどに残っている模様です 11-4以降でお力を貸して頂けないでしょうか
>>883-884 URLみたけど、そこに演習問題は載ってないし、
1章, 9章以外PDFへのリンクが見えないのだが……。
886 :
883 :2010/06/15(火) 16:54:28
すみません、参考書がPDF形式になっておりまして・・・ 9章以降のPDFに演習問題というのがある形です・・・
>>886 横着しないで問題文書いてよ。どれやるのか探させる時点で見る気がなくなる
長いならテキストに起こしてアップローダにあげればいい
888 :
883 :2010/06/15(火) 17:01:36
分かりました 少々時間かかりますがいいでしょうか? あと・・・恥ずかしながらアップローダの使い方が分からないのです ご教授いただけませんか?
別にあなたを待っているわけじゃないから時間がかかろうがなんだろうが関係ない。 後者はスレ違い。
>>821 無理に1レスにおさめる為に詰め込んだみたいだなw
しかしそれをやる価値のある問題とはとても思えない件w
891 :
883 :2010/06/15(火) 19:56:51
892 :
デフォルトの名無しさん :2010/06/15(火) 20:21:52
[1] 授業単元:オブジェクトプログラミング [2] 問題文(含コード&リンク):入力した文字列を文字型配列に代入し、アルファベットの大文字、 小文字、四則演算を回数分表示できるようにしなさい。尚、改行記号を\nとし、四則演算、アルファベット、 改行記号以外の文字を含む場合と、アルファベットまたは記号の後に数字が来ない場合、各々、エラーを表示するようにしなさい。 [3] 環境 [3.1] OS:Windows XP [3.2] コンパイラ名とバージョン:gcc [3.3] 言語:C [4] 期限:2010年6月15日 [5] その他の制限:int main(void){から始まる 実行例1: 文字列を入力 a3-2*4\n+5B2 結果 aaa---**** +++++BB 実行例2: 文字列を入力 a3-2*4\n+5ba2 結果 順番間違いエラー 実行例3 文字列を入力 a3-@*4\n+5b2 結果 記号間違いエラー
最近見た気がする・・・
896 :
883 :2010/06/16(水) 00:33:22
899 :
デフォルトの名無しさん :2010/06/16(水) 10:55:44
900 :
880 :2010/06/16(水) 14:41:34
>>896 13-2
Type& Peek() {
if (ptr <= 0)
throw EmptyErr(this);
return stk[ptr];
}
int Capacity() {
return size;
}
bool IsFull() {
return (ptr == size);
}
bool IsEmpty() {
return (ptr == 0);
}
903 :
デフォルトの名無しさん :2010/06/16(水) 20:05:59
期限6月21日18時 よろしくお願いします。 3次元の実数ベクトルを、要素がfloat型で要素数3の配列を用いて表すものとする。 二つの3次元ベクトルに対して、それらの和、差、内積、外積を求める関数を定義する。 和、差、内積、外積を計算する関数はそれぞれaddvec、subvec、innervec、outervecとし、 それぞれの関数定義の頭部は void addvec(const float x[3], const float y[3], float z[3]) void subvec(const float x[3], const float y[3], float z[3]) float innervec(const float x[3], const float y[3]) void outervec(const float x[3], const float y[3], float z[3]) とする。 プログラムの動作は、二つの3次元ベクトルaとbの各成分をじゅんじに入力して、それらの和、差、内積、外積を求めて出力する。 以上の説明に沿ったプログラムをC言語を用いて書け。
void addvec(void addvec(const float x[3], const float y[3], float z[3]) { int i; for(i = 0; i < 3; i++) z[i] = x[i] + y[i]; } void subvec(const float x[3], const float y[3], float z[3]) { int i; for(i = 0; i < 3; i++) z[i] = x[i] - y[i]; } float innervec(const float x[3], const float y[3]) { int i; float ip = 0; for(i = 0; i < 3; i++) ip += x[i] * y[i]; return ip; } void outervec(const float x[3], const float y[3], float z[3]) { int i; for(i = 0; i < 3; i++) z[i] = x[(i + 1) % 3] * y[(i + 2) % 3] - x[(i + 2) % 3] * y[(i + 1) % 3]; }
これベクトルの要素数完全に決め打ちなんだなw
wをつける要素が見つからない
そんなことより配列名の方が気になる。
見た目のよい局所関数名?をつけるにはやっぱり英語勉強しないとだめですかね?
スレチ
見た目の良いフォントを使えばいいだけじゃないかな。
>>905 ありがとうございます。
実行すると2行目にエラーがでてしまいます。
自分で直そうとしてもわからなかったので、よかったらどう直すのか教えてください。
void addvec(void addvec(const float x[3], const float y[3], float z[3]) これくらいわかるだろ。
わかるわけないじゃん。 ここに依頼するやつが構文を理解しているわけがない。 構文はおろか、全角スペースなんてどうやって見つけるんだよ!とか切れてるやつもいたろ?
>>915 全角スペースは使ってるエディタによっては見つけるのは面倒
検索機能のついていないエディタを探す方が難しくね?
[1] 授業単元:Cプログラミング演習 [2] 問題文(含コード&リンク): 問題1:文字列"Computer1Programing2Communication3Electro4"を、"test.txt"に書き込むプログラムを作成せよ。 問題2:ファイル"test.txt"から文字列も読み込み、並びを逆にしてファイル"sample.txt"に出力するプログラムを作成せよ。("test.txt"は問題1で作成したものを使用すること。) 問題3:ファイル"sample.txt"から大文字だけを画面に表示させるプログラムを作成せよ。("sample.txt"は問題2で作成したものを使用すること。) [3] 環境 [3.1] OS:Windows Vista [3.2] コンパイラ名とバージョン:VB 2008 [3.3] 言語:C [4] 期限:2010年6月17日中 [5] その他の制限:無し よろしくお願いします
その条件だと作るのは無理なので、もう一度見直してくだされ。
>>918 1:
#include <stdio.h>
int main(void) {
FILE *fp = fopen("test.txt", "w");
fprintf(fp, "%s", "Computer1Programing2Communication3Electro4");
fclose(fp);
return 0;
}
2:
#include <stdio.h>
void f(FILE *fin, FILE *fout) {
int ch = fgetc(fin);
if(ch == EOF) return;
fputc(ch, fout); }
int main(void) {
FILE *fin = fopen("test.txt", "r"), *fout = fopen("sample.txt", "w");
f(fin, fout);
fclose(fin);
fclose(fout); }
3:
#include <stdio.h>
#include <ctype.h>
int main(void) {
FILE *fp = fopen("sample.txt", "r");
int ch;
while((ch = fgetc(fp))!=EOF) if(isupper(ch)) putchar(ch);
fclose(fp);
return 0;
}
2: void f(FILE *fin, FILE *fout) { int ch = fgetc(fin); if(ch == EOF) return; f(fin, fout); fputc(ch, fout); } だった
>>913 >>914 流石にvoid addvec( が余分についてるのはわかります
それをとってソースファイルをつくってもコンパイルしようとするとエラーがでます
>>923 コンパイラはなんて言ってるのか書かないと分からん。
error LNK:未解決の外部シンボル _main が関数_tmainCRTStartupで参照されました。 fatal error LNK1120:外部参照1が未解決です。
926 :
デフォルトの名無しさん :2010/06/17(木) 00:47:46
main文ねーだろ
In function `_start': undefined reference to `main'
それはコンパイルエラーじゃなくてリンクエラーという。 main関数が書かれていないから発生する。 ちゃんとmain関数かいたか?
3. 答える人間のことを考えないこと 「教えてクン」は、孤高の戦士である。 相手のことを考えるようでは教えてクン失格というものだ。 以下のような行動が、望ましい。 初心者であることを高らかに宣言し、初心者向けの丁寧で分かりやすい説明を強要する。 専門用語の使用を禁じておくとさらに効果的である。 簡潔な説明を禁じられたヲタクどもは、同じ内容を説明するのに、何倍もの労力を強いられる。 自分は努力せず、相手には多大な努力をさせることこそが「教えてクン」の真骨頂である。マルチポストも有効である。 そのBBSを信用していないことを明確に示せる。 「どうせ、お前らじゃ分からんだろう。」という意志表示として高く評価できる。 もちろんマルチポストの非礼をあらかじめ詫びてはならない。 それでは、単なる「急いでいる人」になってしまう。 それは、教えてクンではない。質問のタイトルは、「教えてください。」で良い。 タイトルを読んだだけでは「何に関する質問」か全く分からない。 そういう努力は、答える人間にさせれば良いのだ。 とにかく、答える人間が答えやすいように気を使って質問してはならない。 傲慢で不遜な態度が必須である。「聞きたいことがあります。」など、プロの仕事であろう。 最後に、言うまでも無いことだとは思うが、答えてくれた人達に礼の言葉を返すなど言語道断である。 せっかく「教えてクン」を貫いてきたのに、最後にお礼を言っているようでは、画竜点睛を欠いていると言わざるを得ない。 質問だけしておいて、後はシカトが基本である。 上級テクニックとして、「そんなことはもう試しました。」とか、「そこまで初心者じゃありません。」などと言って、回答者の神経を逆なでしておけば完璧である。 以上のことを踏まえて質問すれば、君も立派な「教えてクン」である。 ビバ!教えてクン! 教えてクンに栄光あれ!!
#include<stdio.h> int main(void) { int kion[12] = {4,6,11,15,18,30,28,30,24,19,10,3}; int i,ave,max,min; max = -1000; min = 1000; ave = (kion[0]+kion[1]+kion[2]+kion[3]+kion[4]+kion[5]+kion[6]+kion[7]+kion[8]+kion[9]+kion[10]+kion[11])/12; (省略 max,minはfor関数を使って参照) printf("2000年の月平均気温(摂氏、括弧内は華氏)\n"); for(i=0;i<12;i++) { printf("%d月:%d(%d)\n",i+1,kion[i],9*kion[i]/5+32); } printf("-----------------\n"); printf("平均:%d(%d)\n最高:%d(%d)\n最低:%d(%d)\n",ave,9*ave/5+32,max,9*max/5+ 32,min,9*min/5+32); return 0; } 上のような年間平均気温を配列に格納して表示するプログラムで、 華氏の表示を自作関数を定義してそれを用いよという課題が出たんですが、 自作関数の計算式でmaxやmin,ave,kion[i]をまとめて扱う方法が分かりません。 よろしくお願いします
>>933 >max = kion[1], min = kion[1];
0にしてループを1からにするのが普通なのに、わざわざこうする意味がわからないw
>>841 をどなたかお願いします。。
期限過ぎてしまってやばいんです・・
これはファイルからデータを読み込むの? それともキーボードからデータを入力?
>>936 キーボードからデータを入力だと思います。
よろしくお願いいします。
>>939 問題が解けないのでなんら関係のないURLを貼ってみる香具師乙
ベクトルを規格化する関数 normal 2つのベクトルの差の大きさを返す関数 dist を作成せよ。 よろしくお願いします
942 :
デフォルトの名無しさん :2010/06/17(木) 21:18:24
#include <stdio.h> int main(void) { static int a[] = { 31, 41, 59, 26, 53, 58, 97, 93, 23, 84, 62 }; int flag; do { flag = 0; for (int i = 0; i < sizeof(a)/sizeof(a[0]) - 1; i++) { if (a[i] > a[i + 1]) { swap(a[i], a[i + 1]); flag = 1; } } } while (flag > 0); for (int i = 0; i < sizeof(a)/sizeof(a[0]); i++) cout << a[i] << ", "; cout << endl; return 0; }
943 :
デフォルトの名無しさん :2010/06/17(木) 21:21:13
配列のデータがすでに適正な順序,それに近い順序で並んでいてもn-1回の走査をしなければならない。 すなわち、n(n-1)/2回の比較が行われなければならない。 そこで, 各回の走査の終わりに、 交換が行われたか否かをチェックするようにし、交換が行われていなければそれ以上走査の必要はないので ソートを完了するようなプログラムにしなさい。 「バブルソート」の問題なんですが、いい解答例がありません。 解答例をもらえないでしょうか?
944 :
デフォルトの名無しさん :2010/06/17(木) 21:22:24
各回の走査の中で行われたの交換の様子が分かるよう1回の交換が行われる度に、そのとき配列に入っているすべての値を出力させるようにもしなさい。
>>941 normalを呼ぶ側で宣言及び初期化された,長さ n の配列 a と宣言のみされた長さ n の配列 b の先頭アドレスを受け取り,1次元配列(ベクトル) a の大きさを1に規格化し、それを配列 b に格納する。
>>946 問題が解けないので、それらしき日本語を書いてみる香具師乙
948 :
デフォルトの名無しさん :2010/06/17(木) 22:56:12
scanfを使用してキーボード入力した文字列を、fgets(buffer,sizeof(buffer),stdin)で読み込みこれを繰り返したい。 #include <stdio.h> #include <stdlib.h> int main(void){ char buffer[80],txt[80]; FILE * fp;//←stdinは標準入力ストリームであるのでファイル型へのポインタにする必要がない。 int i; for(i=0;i<5;i++){ fp = fopen("./text.txt","w");//相対パス scanf("%s",txt); fprintf(fp,"%s",txt);//配列には&をつけない fclose(fp); stdin = fopen("./text.txt","r");//相対パス fgets(buffer,sizeof(buffer),stdin);//指定したファイルの一行を読み込んでbufferに格納する。 fclose(stdin); printf("%s\n",buffer); printf("end of loading\n"); } } としたところ、scanfがfor文の最後から戻る度に実行されると思ったのですが実際には、 ssss ssss end of loading ssss end of loading ssss end of loading ssss end of loading ssss となってしまいました。どのようにしたらscanf()が繰り返し呼び出されるのでしょう?
>>947 そうじゃなくて多分コード書くのがめんどいだけじゃないかね。
俺もたまにそうする
952 :
デフォルトの名無しさん :2010/06/17(木) 23:07:58
>>950 例えば,どのようにすればよいのでしょうか?
>>948 >scanfを使用してキーボード入力した文字列を、fgets(buffer,sizeof(buffer),stdin)で読み込みこれを繰り返したい。
これって何をしたいの?
tee コマンドもどき?
>>948 #include <stdio.h>
#include <stdlib.h>
int main(void){
char buffer[80], txt[80];
FILE *fp;
int i;
for(i=0; i < 5; i++){
fp = fopen("text.txt", "w");
scanf("%s", txt);
fprintf(fp, "%s", txt);
fclose(fp);
fp = fopen("text.txt", "r");
fgets(buffer, sizeof(buffer), fp);
fclose(fp);
printf("%s ", buffer);
}
}
955 :
デフォルトの名無しさん :2010/06/17(木) 23:34:06
956 :
デフォルトの名無しさん :2010/06/17(木) 23:40:05
>>954 ありがとうございます。
scanfを使わずにfgetsとstdinを使用して同様なことはできないでしょうか?
>>956 スレタイを読んでくれ。
それでもどうしてもここでやりたいのなら何度もやり取りしなくていいように伝える努力をしてくれ。
958 :
デフォルトの名無しさん :2010/06/17(木) 23:47:26
>>955 void sort2(struct data *d1, struct data *d2)
{
//ここのプログラムを作成
if(d1->point > d2->point){
struct data tmp = *d1;
*d1 = *d2;
*d2 = tmp;
}
}
959 :
デフォルトの名無しさん :2010/06/17(木) 23:51:51
>>956 scanf("%s", txt);
↓
fgets(txt, sizeof(txt), stdin);
>>956 fgets(txt, sizeof(txt), stdin);
ijo
962 :
デフォルトの名無しさん :2010/06/18(金) 01:36:28
何をするの?
暗号化されているプログラムを読んで、暗号化の規則を見いだし、 符号化・符号解除するプログラムをつくれってことだろ ・#,<,.など記号は暗号化されない。 ・最初のincludeが暗号化されていないので、 単語単位で暗号化される、と推測できる。 ・暗号化を進めていく過程で符号化の情報が変化してゆくと推測できる。 (例えばxorを取る値が+1されていくとか。) ・数字は符号化されない?または符号化されてもアルファベットには置換されない ・文字数は増減しない。 このヘンはガチ?
文字数ふえてそうに見えるよ。 増えてないところもあるみたいだけど。
・2353,4行目をみると、 mwb n; fYv (o = 2; p < xw; q++) { となっているので、 一文字の変数がn->o->p->qとなっていることから 多分変数名は登場する度に+1されていくんだろうか?
>>961 こんな問題出す講師なんて全国でも片手で数えられるほども居ない筈
なんで、どこの誰だかわかってしまう件
当然ここで正解が出てそれを提出しても、額面通り無条件に単位を
くれるのかどうかもアヤスイ件
久しぶりに面白そうな問題きた
>>965 たしかに、zX AY BZと出現するたびに各文字が1ずつ増えてるんだが
intと思しき、luY→mwbは各文字ごとに123と増えている
先頭行はinclude <stdio.h>とみなして予想をいろいろしているんだけど、実はmain関数が見つかっていない
暗号化はわかったけど、複合化どう書いていいものやら
すげえなあ。さっぱりだわ。
最初の行は、#include <linuxkernel.h>だと思うんだが、暗号化間違ってないか?
linux/kernel.h
てか、期限がかなり先だから急がなくてもいいんじゃね?
>>972 なるほど。
次の問題は、基本ルールはiiii --> ijk なんだろうけど
元がijkだった場合との区別かな。
飽きたら忘れそうだからな
iii -> jkl と jjj -> jkl の区別が付かない気がする。
>>976 間違い。
ijk -> jkl と
iii -> jkl との区別、だった。
文字chが最初に現れたらテーブルtbl[ch-'A']=ch それ以降は++tbl[ch-'A']で置き換える、でおk? でも層だとすると、linux/kernel.hで、なぜ/がlになるのかわからんな。
そこは普通のkとiのkとの区別でklになってるのかと思った
#include <linux/kernel.h> #include <linux/ ↓いまわかってるアルゴリズムで暗号化 #include <mjovx/kfrpgn.h> #kqdoweh <plrxy/ なるべき結果 #include <mjovxklfrpgn.h> #kqdoweh <plrxys /の扱いが分かればどうにかなるのかもね。
難しすぎなのかアホ過ぎなのかはよくわからんかったけど 眠いんで寝るぽ
でもこれ、確かに復号化が難しいような。 なんか思いつくかなぁー
>>980 /k -> kl
のように、次の桁の文字をcopyだと思う。
16行目以降にも、mn,pq,xyという連続文字部分がある。
984 :
デフォルトの名無しさん :2010/06/18(金) 03:51:58
まあ多分複合にはハフマンテーブルみたいな情報をくっつける必要がある。。 だからそこは勝手に仕様決めてつくれば課題達成だろう。 ただし問題で与えられたソースは複合できないけど。。
2個目のヘッダファイルなにorz
考古学者のロゼッタ石暗号解読みたいだなw
自分ではさっぱり解けなかったが暗号化はできるようになった
989 :
985 :2010/06/18(金) 04:24:49
出来そうな気がしてきた。 一文字ずつ暗号化してゆき、一文字毎に置換表を更新し、 それをつかって、次の文字を復号し、複合化した文字でまた置換表を更新し、・・・ ってすすめば可能かな?
>>986 <linux/syscalls.h>かな
>>991 むはー。8文字だったのね!ずっと7文字と勘違いしてた俺のばかー
#include <linux/kernel.h>
#include <linux/syscalls.h>
↓
#include <mjovx/kfrpgn.h>
#kqdoweh <plrxy/syteaqru.i>
[ターゲット]
#include <mjovxklfrpgn.h>
#kqdoweh <plrxystyueaqrv.i>
ちょっぴり違うのは/の影響かなぁ
#include <linux/kernel.h>
#include <linux/syscalls.h>
#include <linux/fs.h>
#include <linux/
↓
#include <mjovxklfrpgn.h>
#kqdoweh <plrxystyueaqrv.i>
#msfsyfi <tntzzfgw.j>
#ouguagj <vpvba
になった。小文字の次は大文字になるっぽい。けど、これまた次のヘッダがわからないという。
kk.hなんてないよねぇ
役に立つかどうか分からないけど、今のコードを貼って寝ます。
http://codepad.org/btlbxg97
#include<linux/kernel.h> #include<linux/syscalls.h> #include<linux/fw.h> #include<linux/mo.h> #include<linux/percpu.h> 合ってる?
ああ、すごく汚いコードです。ごめんなさい。
>>994 #include<linux/fw.h>
↓
#include<linux/fs.h>
percpu.hってなんじゃろうとおもったら /usr/src/kernels/2.6.18-164.15.1.el5-x86_64/include/linux なんてところががが。初めてのぞきました mo.hは同じところにあるmm.hかもです。
#include <linux/kernel.h> #include <linux/syscalls.h> #include <linux/fs.h> #include <linux/mm.h> #include <linux/percpu.h> #include <linux/slab.h> #include <linux/
>>998 iはincludeで使われてるから違うだろ
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。