C/C++の宿題を片付けます 79代目
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2006/12/13(水) 02:11:49【質問者へ】
回答者の便宜のため、質問の際は以下を行うことを推奨します。
・質問は【質問テンプレ】を利用してください。
・問題文は、出題されたまま全文を書いてください。
・計算問題は数式をあげ、どのような計算をするのか詳しく説明してください。
・エラーは、その詳細と発生した行を書きましょう。エラーメッセージはコピペしてください。
・後から問題に付け足しするのはやめましょう。付け足しは作業を無駄にしがちです。
・なりすましを防ぐため、トリップを使ってください。名前欄に、「#」に続けて任意の文字列を入力して投稿すると、その文字列を知らない他人に騙られることを防ぐことができます。
【質問テンプレ】
[1] 授業単元:
[2] 問題文(含コード&リンク):
[3] 環境
[3.1] OS: (Windows/Linux/等々)
[3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等)
[3.3] 言語: (C/C++/どちらでも可 のいずれか)
[4] 期限: ([yyyy年mm月dd日hh:mmまで] または [無期限] のいずれか)
[5] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々)
【アップローダー==ラウンジ】(質問が長い時はココ使うと便利 回答者もコードが長ければここに)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
【C 関数検索 man on WWW】
http://www.linux.or.jp/JM/index.html
【過去ログ検索】
http://chomework.sakura.ne.jp/
【wiki】
http://www23.atwiki.jp/homework/
【前スレ】
C/C++の宿題を片付けます 78代目
http://pc8.2ch.net/test/read.cgi/tech/1165190320/
【過去スレ一覧】
http://makimo.to/cgi-bin/search/search.cgi?q=C%2B%2B%82%CC%8Fh%91%E8&andor=AND&sf=0&H=&view=table&link2ch=on&shw=2000&D=tech
0153デフォルトの名無しさん
2006/12/14(木) 13:45:09問題2
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3191.c
0154デフォルトの名無しさん
2006/12/14(木) 14:52:05int guess(int n,int*w,int *h){
int width, height;
for( height=1; height<=n; height++ ) {
width = n / height;
if( width < height ) break;
if( n > width*height ) continue;
*w = width;
*h = height;
}
return 0;
}
int main(void){
int pixels;
int gw,gh;
printf("画素数:");
scanf("%d",&pixels);
guess(pixels,&gw,&gh);
printf("推定値 w:%d X h:%d\n",gw,gh);
return 0;
}
0155デフォルトの名無しさん
2006/12/14(木) 15:43:30そのプログラムで毎回最大値最小値をとっているところをヒープまたは二分木で
管理してやれば O(n log n) になる.これは >>146 のコードと本質的には同じ.
#include <iostream>
#include <set>
using namespace std;
int main() {
const double a[] = {6.05385, 8.52025, 15.8029, 15.2049, 10.5501,
11.904, 2.34999, 10.0731, 0.270519, 4.03088, 2.27745, 13.3459};
const int n = sizeof(a)/sizeof(a[0]);
const double h = 8.58708;
int I = 0, J = 0;
multiset< double, greater<double> > gS;
multiset< double, less<double> > lS;
for (int i = 0, j = 0; i < n; ++i) {
gS.insert(a[i]);
lS.insert(a[i]);
for (; *gS.begin() - *lS.begin() > h; ++j) {
gS.erase(gS.find(a[j]));
lS.erase(lS.find(a[j]));
}
if (i - j > I - J) {
I = i;
J = j;
}
}
cout << J << "," << I << endl;
}
0156デフォルトの名無しさん
2006/12/14(木) 16:01:320157デフォルトの名無しさん
2006/12/14(木) 16:11:27無理に解かなくても良いんだぜ
0158デフォルトの名無しさん
2006/12/14(木) 16:27:41凄いな。
見通しを持って理解してる人間の手にかかればここまで簡潔になるのか。
0159デフォルトの名無しさん
2006/12/14(木) 16:50:53[3] 環境
[3.1] OS: Unix
[3.2] コンパイラ名とバージョン: gccと打ってコンパイラしてます
[3.3] 言語: C
[2] 問題文: 1字ずつ入力を読み込んで、アルファベットの場合
小文字なら大文字に大文字なら小文字にして出力するプログラム。(数字や記号はそのまま出力)
おそらく大体はできていると思うのですが、どこが悪いのでしょうか?
今のままだと入力aの出力がAでなくそのままaと出てしまいますorz
#include <stdio.h>
#include <ctype.h>
void char_encoder(int a){
if (a >= 'a' && a <= 'z')
toupper(a);
else tolower(a);
putchar(a);
}
int main(void) {
int a;
while((a = getchar()) != EOF){
char_encoder(a);
}
return(0);
}
0160デフォルトの名無しさん
2006/12/14(木) 16:55:23toupperとtolowerの使い方が間違ってる
0161159
2006/12/14(木) 16:58:09a = toupper(a);でしたか。ありがとうございました。
0162159
2006/12/14(木) 17:09:07値を投げっぱなしの159の状態でもコンパイラって通ってしまうんですねorz
0163デフォルトの名無しさん
2006/12/14(木) 17:35:55いや…ここの宿題を演習問題代わりにしてたんだけど、最近のはエロイ人が答え見ても
0164デフォルトの名無しさん
2006/12/14(木) 17:37:11いや、そうなんだけどね。
俺、ここの宿題を演習問題代わりにしてたんだけど、最近のはエロイ人が出した答え見ても、数時間頭抱えてるような状態なんだよね。
センス無いみたい。
0165デフォルトの名無しさん
2006/12/14(木) 17:37:25関数の返値を何かに代入とかしないといけないわけじゃないからね。
例えばprintfとかの返値は普段使ってないでしょ?
0166デフォルトの名無しさん
2006/12/14(木) 17:38:06激しく吊ってくる…
0167デフォルトの名無しさん
2006/12/14(木) 17:47:49シンプルで綺麗なソースですね
setの使い方なども参考になります
0168デフォルトの名無しさん
2006/12/14(木) 18:28:54繰り返していればいずれ慣れるさ。
0169デフォルトの名無しさん
2006/12/14(木) 18:34:43[2] 問題文(含コード&リンク):
ファイル「kyotocity.txt」には、
京都市の区ごとの人口(人)と面積(平方キロメートル)が記述されている。
これらの情報を格納する構造体 struct division を宣言しなさい。
struct division {
char name[20];
int population;
double area;
}
struct division型の配列 kyoto[11]を用意し、
ファイルからデータを読んで、配列に入力しなさい。
入力した構造体の配列を調べて、以下の情報を出力しなさい。
人口が最大の区と最小の区の、名前と人口。
面積が最大の区と最小の区の、名前と面積。
人口密度が最大の区と最小の区の、名前と人口密度。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3192.txt 京都データ
[3] 環
[3.1] OS: XP
[3.2] visual studio2003
[3.3] 言語: C
[4] 期限: あさって
[5] その他の制限: 特になし
0170デフォルトの名無しさん
2006/12/14(木) 18:51:31昔みたな
0171デフォルトの名無しさん
2006/12/14(木) 18:55:35読み込む実数値は自分で入力します
結果はプログラム実行中の画面に出力って意味です
言葉が足りなくてすみません
0172デフォルトの名無しさん
2006/12/14(木) 18:58:00頑張れ
0173デフォルトの名無しさん
2006/12/14(木) 19:00:15整数なのか実数なのか
0174デフォルトの名無しさん
2006/12/14(木) 19:11:27#include <stdio.h>
#include <stdlib.h>
int comp(const void*a,const void*b){
return *(int*)a<=*(int*)b;
}
int main(void){
int i,a[5];
for(i=0;i<5;i++){
scanf("%d",a+i);
}
qsort(a,5,sizeof(int),comp);
for(i=0;i<5;i++){
printf("%d ",a[i]);
}
return 0;
}
0175デフォルトの名無しさん
2006/12/14(木) 19:15:38何回もすみません。。
整数です 正負は問いません
あと、50個自分で入力って自分もびっくりしてます
0176デフォルトの名無しさん
2006/12/14(木) 19:25:555のところは50に変えてね
0177デフォルトの名無しさん
2006/12/14(木) 19:27:41qsort に渡す関数って 負数 ゼロ 正数 の三種を返すべきでは?
0178デフォルトの名無しさん
2006/12/14(木) 19:34:11そうみたいだね。普段使わないから知らなかった。
ぶっちゃけネタ回答だし…qsortは反則でしょ
0179デフォルトの名無しさん
2006/12/14(木) 19:35:54禁止されているのはバブル整列法だけだから良いんじゃね?
0180デフォルトの名無しさん
2006/12/14(木) 19:42:37講師も人間であることを
考慮すると、qsortはは
なはだ疑問である。
0181デフォルトの名無しさん
2006/12/14(木) 19:55:54#define N 50
void q_sort(int numbers[], int left, int right){
int l_hold = left, r_hold = right, pivot = numbers[left];
while (left < right){
while ((numbers[right] >= pivot) && (left < right)) right--;
if (left != right){
numbers[left] = numbers[right];
left++;}
while ((numbers[left] <= pivot) && (left < right)) left++;
if (left != right){
numbers[right] = numbers[left];
right--;}}
numbers[left] = pivot;
pivot = left;
left = l_hold;
right = r_hold;
if (left < pivot) q_sort(numbers, left, pivot-1);
if (right > pivot) q_sort(numbers, pivot+1, right);}
int main(void){
int i,a[N];
for(i=0;i<N;i++)
scanf("%d",a+i);
q_sort(a,0,N-1);
for(i=0;i<N;i++)
printf("%d ",a[i]);
return 0;}
宿題の解答ならこんな感じか
0182デフォルトの名無しさん
2006/12/14(木) 21:02:34いろいろありがとうございます
明日やってみます
ちなみにq_sortってのは私はじめて見るんで
それ使わなくてもできるやり方はあるみたいです
暇でしたら参考に書いてください
0183デフォルトの名無しさん
2006/12/14(木) 21:11:35>>181がそうなんだがね。自分で書いてる。
0184デフォルトの名無しさん
2006/12/14(木) 21:22:31malloc or newで確保した3次元配列を指すポインタ
***prt
を関数の引数に取るにはどうすればよいのでしょうか。
単に
func(***ptr)では駄目らしいですが。
0185デフォルトの名無しさん
2006/12/14(木) 21:34:260186デフォルトの名無しさん
2006/12/14(木) 21:36:36二次元配列のポインタ *ptr
三次元配列のポインタ *ptr
0187デフォルトの名無しさん
2006/12/14(木) 22:46:46普通にいけると思うけど
どうしても無理なら>>186でおk
0188デフォルトの名無しさん
2006/12/14(木) 23:07:10質問が不明瞭だけど func( ***ptr ) って受け側?呼び側?
受け側なら func( 型*** ptr ) でOK。
呼び側なら func( ptr )
0189デフォルトの名無しさん
2006/12/14(木) 23:42:09C++で回答してる人がいるけど std 良く知らないので同じロジックだったら恥ずかしいけど。
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3193.txt
main() が2つあるけど、前の奴は 0〜100で乱数を1000個作って結果をcsv出力してる奴で、
後者が >>148 のデータを使用したもの。
0190デフォルトの名無しさん
2006/12/15(金) 00:05:29[2] 1)
N×Nマス目のフロアを前後左右に移動することができるロボットがある。
スタート地点は常に左上(x,y)=(0,0)であり、全マス目を一度だけ通り、通った順序を表示するプログラムを作りなさい。
フロアには障害物を置けるようにし、障害物は##で表せ。
2)
一筆書きで通れないものは2回目に通るマス目をできるだけ少なくし、 全マス目を少なくとも緯度は必ず通る探索経路を表示するプログラムを作成せよ。(2回通ったマスには2回目の探索順序を記載する)
[3] 環境
[3.1] Linux
[3.2] gcc 4.0
[3.3] 言語:C
[4] 期限: 一週間後
[5] その他の制限: 特になし。
どうかお願いします
0191c_cpp_cs ◆ew.HP.dat.
2006/12/15(金) 00:06:03http://www.geocities.jp/c_cpp_cs/
0192デフォルトの名無しさん
2006/12/15(金) 00:16:55#include <stdlib.h>
#include <time.h>
#define N 4
int main(){
int Number[N],In[N];
int i,j,hit,blow;
srandom((unsigned) time(0));
for(i=0;i<N;i++){Number[i]=random()%10;In[i]=0;}
do{
printf("%d桁の数を入力!:",N);
for(i=0;i<N;i++){if((In[i]=getchar()) ==EOF) break; // この部分 //
In[i]-='0';}
fflush(stdin);hit=0,blow=0;
for(i=0;i<N;i++){if(Number[i]==In[i]) hit++;}
for(i=0;i<N;i++){for(j=0;j<N;j++){if(Number[i]==In[j]) {
blow++;
break;
}}}
for(i=0;i<N;i++) printf("%d-",In[i]);
printf("(%dHit,%dBlow)\n",hit,blow-hit);
}while(hit!=N);
for(i=0;i<N;i++)printf("%d",Number[i]);
puts("\nComplete!!");
}
0193192
2006/12/15(金) 00:18:53[2] 問題文(含コード&リンク):上記のfor文で数を読み取る部分をscanfの型に直す。
今のままだと、getcharで取り込んだ数が不具合を起こして、入力した数が正常に表示されません。
このプログラムでは一回試行する毎にランダムの数が書き変わってしまいます。
数を言い当ててComplete!が表示されるまで、設定された数が書き変わらないようにしてください。
四つの数は全て異なっていなければなりません。
[3] 環境
[3.1] OS: Linux
[3.2] gcc -o
[3.3] 言語: C
[4] 期限: 2006.12.16
よろしくお願いします。
0194デフォルトの名無しさん
2006/12/15(金) 00:19:50>2回目に通るマス目をできるだけ少なくし
と2回目に限定してるけど、
2回通るマス目が2つあるのと、4回通るマス目が1つあるのでは、
どちらを優先すればよいのだろう?
マス目の数にこだわれば後者だし、無駄な回数にこだわれば前者だよね
0195デフォルトの名無しさん
2006/12/15(金) 00:23:40すいません。通れるのは最大2回までとなってます。
0196デフォルトの名無しさん
2006/12/15(金) 00:34:572回じゃ全マス通れない場合は?
□□□##
##□##
□□□□□
##□##
##□##
0197デフォルトの名無しさん
2006/12/15(金) 00:43:49「解なし」で大丈夫だと思います!
0198デフォルトの名無しさん
2006/12/15(金) 00:48:34[2] 問題文: ttp://ehoba.mydns.jp/phpuploader/img/pup1555.rar
[3] 環境
[3.1] OS:fedoracore6
[3.2] コンパイラ名とバージョン:gcc3.4
[3.3] 言語:C
[4] 期限:2006/12/20 (水)
[5] その他の制限:なし
よろしくお願いいたします。
0199デフォルトの名無しさん
2006/12/15(金) 00:51:04眠いので明日以降気が向いたらやるわ
0200122
2006/12/15(金) 00:51:19stdlib.hとstring.h加えたけどエラー数が悪化したorz
もうだめかもしれない・・・
0201デフォルトの名無しさん
2006/12/15(金) 00:57:17>[構成プロパティ]-[全般]-[文字セット]を 「マルチバイト文字セットを使用する」
この辺はやってる?
0202デフォルトの名無しさん
2006/12/15(金) 01:10:06http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3194.txt
割り算ちょっとひよった
0203デフォルトの名無しさん
2006/12/15(金) 01:14:18入力列がランダムのとき,O(n) で動くアルゴリズムだね.
これまでに同じアルゴリズムは出ていないけれど,
152,155 で最小値・最大値を更新するタイミングを最小値・最大値が
抜けたときだけにするものと本質的に同じものになる
(これが O(n) になるのは適度な演習問題).
しかし,最悪計算量の意味ではやはり O(n^2) であって,
例えば単調増加する n = 100000 くらいの列を食わせると終わらない.
155 とどちらがよいかは,状況によるところだと思う。
0204デフォルトの名無しさん
2006/12/15(金) 02:31:26http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3197.zip
0205デフォルトの名無しさん
2006/12/15(金) 02:45:19ミスった
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3198.zip
0206189
2006/12/15(金) 02:55:000(n) にまで減らないとは思うけどパッと考えたのはアレくらい。
単調増加/減少の場合、調査起点のスキップができないからなぁ。
うーん無理。
0207184
2006/12/15(金) 04:01:472次元配列の例で説明しますと,例えば
int array1 = [N][M];
と配列で宣言した場合,これを引数に取る関数funcでarrayの要素を使うためには,
func (int i, int j, int array[][M]) {
array[i][j]
}
と,あらかじめMを決めておかなければいけませんよね。
それに対して,
int **array2 = (int **)malloc(nrows * sizeof(int *));
for(i = 0; i < nrows; i++) {
array1[i] = (int *)malloc(ncolumns * sizeof(int));
}
とポインタのポインタで確保した場合,
func (int i, int j, int **array2]) {
array2[i][j]
}
と書いておけば,各要素[i][j]に正しくアクセスできるかどうか知りたいのです。
0208デフォルトの名無しさん
2006/12/15(金) 04:26:40なぜここでそんな話をしてるんだ
ここが宿題を片付けるスレだと分かってないのか?
0209デフォルトの名無しさん
2006/12/15(金) 04:56:25>と,あらかじめMを決めておかなければいけませんよね。
はい。
>と書いておけば,各要素[i][j]に正しくアクセスできるかどうか知りたいのです。
実験すればいいじゃない。
ということで
つ ttp://pc8.2ch.net/test/read.cgi/tech/1164376287/
0210デフォルトの名無しさん
2006/12/15(金) 07:34:03入力がランダムな場合,平均又はならし計算量の意味で O(n) になってるよ.
略証:nextP がどこまでいくかを評価する.入力はランダムと仮定する.
func で伸ばした区間の長さを m としたとき,nextP が区間の左から k 番目
である確率は 1/m.よって nextP の期待値は Σk/m 〜 O(m).
したがって毎回 func で伸ばした長さ分程度消費するので全体で O(n).
0211sage
2006/12/15(金) 07:40:04[2] 問題文(含コード&リンク): http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3199.txt
[3] 環境
[3.1] OS: XP
[3.2] コンパイラ名とバージョン: visual studio2003
[3.3] 言語:C
[4] 期限: 本日10時
[5] その他の制限: とくになし
よろしくお願いします・・・!
0212デフォルトの名無しさん
2006/12/15(金) 07:42:420213デフォルトの名無しさん
2006/12/15(金) 07:53:210214デフォルトの名無しさん
2006/12/15(金) 08:03:43数学の得点と物理の得点です
0215デフォルトの名無しさん
2006/12/15(金) 09:28:45ありがとうございます。
0216デフォルトの名無しさん
2006/12/15(金) 10:05:5010時過ぎたけど
int main(void)
{
int i, j, sum, ave[3] = {0};
int a[5][3] ={{70, 60, 80},{50, 60, 50},{70, 90, 100},{90, 100, 50},{40, 70, 80}};
printf(" ____________________________________________\n");
printf("|学籍番号| 英語 | 数学 | 物理 | 合計 |\n");
printf("| ̄ ̄ ̄ ̄| ̄ ̄ ̄ ̄| ̄ ̄ ̄ ̄| ̄ ̄ ̄ ̄| ̄ ̄ ̄ ̄|\n");
for(i=0; i<5; i++) {
printf("| %d ", i+1);
for(j=0, sum=0; j<3; j++) {
printf("| %3d ", a[i][j]);
sum += a[i][j];
ave[j] += a[i][j];
}
printf("| %3d |\n", sum);
printf("|________|________|________|________|________|\n");
printf("| | | | | |\n");
}
printf("| 平均 ");
for(i=0; i<3; i++) printf("| %3d ",ave[i]/5);
printf("| |\n|________|________|________|________|________|\n");
return 0;
}
0217デフォルトの名無しさん
2006/12/15(金) 10:39:10まにあいそうです!
超感謝です。ありがとうございました
0218デフォルトの名無しさん
2006/12/15(金) 11:01:38[2] 問題文(含コード&リンク)
1)直線回帰の式を導出せよ。
2)決定係数の式を導出せよ。
3)1)の式を用いて「汎用性の高い直線回帰を行うプログラム」を開発せよ。
4)3)で開発したプログラムに2)の決定係数を算出する式を加えよ。
[3.1] OS: XP
[3.2] コンパイラ名とバージョン: gcc3.4
[3.3] 言語:C
[4] 期限: 2006.12.18
[5] その他の制限: とくになし
お手数かもしれませんが、よろしくお願いします・・・!
0219デフォルトの名無しさん
2006/12/15(金) 11:08:100220デフォルトの名無しさん
2006/12/15(金) 13:07:48[2] 問題文
前スレで出した宿題なんですが。
コード&乱数生成の標準ライブラリ関数を利用し、150以上200以下の整数を10個生成して画面に出力しなさい。
という問題で下のプログラムを組んでもらったのですが、現在のコードでは150から200までの値を等しい確率で生成できません。
スライドを参考に作り直しましょう。
と、言われまして、修正お願いします。
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int i, air;
/*
scanf("%d", &air);
srand(air);
*/
printf("150?ȏ㲰0?ȉ??̗???\n");
for(i = 0; i < 10; i++){
printf("%d\n", 150+rand()%51);
}
return 0;
}
[3.1] OS: XP
[3.2] コンパイラ名とバージョン: visual studio2003
[3.3] 言語:C
[4] 期限: 2006.12.17
[5] その他の制限: とくになし
0221デフォルトの名無しさん
2006/12/15(金) 13:10:24>>220
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int i, air;
/*
scanf("%d", &air);
srand(air);
*/
printf("150以上200以下の乱数\n");
for(i = 0; i < 10; i++){
printf("%d\n", 150+rand()%51);
}
return 0;
}
0222デフォルトの名無しさん
2006/12/15(金) 13:18:10スライドは?
0223デフォルトの名無しさん
2006/12/15(金) 13:23:55常に同じ乱数が出力されるのを変更したいって事?
それとも rand() 以外の擬似乱数を実装しろって事?
0224デフォルトの名無しさん
2006/12/15(金) 13:24:31rand() % 10 とかで 0 〜 9 の乱数を生じると結構偏りが多いらしいから同じ理由かな。
150 + rand() % 51
の所を
150 + (int)( (double)rand() / (double)RAND_MAX * 51.0 )
に変えて試してみて。
0225デフォルトの名無しさん
2006/12/15(金) 13:35:36それだと201までにならない?
0226デフォルトの名無しさん
2006/12/15(金) 13:51:58けど、* 50.0 にしちゃうと 200 の出現確立が極端に低くなるよね。
つまり
150 + (int)( (double)rand() / (double)( RAND_MAX + 1 ) * 51.0 )
が正解か。
0227220
2006/12/15(金) 14:00:38プログラムは前スレで作ってもらったものです
150-200の数値を乱数で完全ランダムで10個出力するみたいです。
0228220
2006/12/15(金) 14:28:13ttp://www.borujoa.org/upload.php
の9381にアップしました。
PPTです
0229デフォルトの名無しさん
2006/12/15(金) 14:57:21FF4も確か0〜255までを返す乱数に対して%100して
パーセンテージを計算するというとんでもないことをやっていた
0230デフォルトの名無しさん
2006/12/15(金) 15:04:12????????????????
0231デフォルトの名無しさん
2006/12/15(金) 15:33:28余算式 % の事だと思われ
0232デフォルトの名無しさん
2006/12/15(金) 15:42:05スライド見たよ。>>226 で良かったみたいだね。
ちゅかあのスライド見れば解るだろうに...
重要なのは rand() がバラつきを保障するのは 0 〜 RAND_MAX での位置で有って、
下一桁とか二桁に着目したときのバラつきを保障してないって事だね。
特に rand() の下一桁はひどい偏りが有るらしい。
>>229
ちゅことは 0〜55がそれ以外の5割り増しで出るわけか。
クリティカルヒットの確立が有利だと気分は良いかも知れない。
0233デフォルトの名無しさん
2006/12/15(金) 18:00:33#include <string.h>
#define COLSIZE 80
#define NAMSIZE 20
int main(int argc, char *argv[])
{
char buffer[COLSIZE + 1];
char fname_in[NAMSIZE + 1];
FILE *fp;
fgets(fname_in, COLSIZE + 1, stdin);
fname_in[strlen(fname_in-1)] = '\0';
fp = fopen(fname_in, "r");
while(fgets(buffer, COLSIZE + 1, fp) != NULL){
printf("%s", buffer);
}
fclose(fp);
return 0;
}
これどこがへんですか教えてください
0234デフォルトの名無しさん
2006/12/15(金) 18:02:14fname_in[strlen(fname_in-1)] = '\0';
0235デフォルトの名無しさん
2006/12/15(金) 18:03:41+ fname_in[strlen(fname_in)-1] = '\0';
0236デフォルトの名無しさん
2006/12/15(金) 18:04:55下位の数ビットはシフトして捨てるといい。
0237デフォルトの名無しさん
2006/12/15(金) 18:08:152スレまえで同じような問題の質問があったけど絶対同じ学校のやつですね
0238デフォルトの名無しさん
2006/12/15(金) 18:36:43× fgets(fname_in, COLSIZE + 1, stdin);
○ fgets(fname_in, NAMSIZE + 1, stdin);
fgets() は最大 (size-1) のデータを読み込み終端に '\0' を追加するので、
fname_in[strlen(fname_in-1)] = '\0'; は無駄。
0239デフォルトの名無しさん
2006/12/15(金) 18:41:460240デフォルトの名無しさん
2006/12/15(金) 18:42:350241デフォルトの名無しさん
2006/12/15(金) 18:43:17[2] 問題文(含コード&リンク)http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3200.txt
[3] 環境
[3.1] OS: WindowsXP
[3.2] コンパイラ名とバージョン: visual studio2003
[3.3] 言語: C
[4] 期限: 12月19日
[5] その他の制限: 特になし
0243デフォルトの名無しさん
2006/12/15(金) 18:59:22あっても問題ない行とあるとおかしい行の区別はつけような
0244デフォルトの名無しさん
2006/12/15(金) 19:00:33丸投げスレ的には、>>238で十分だけど、致命的な間違いをしてる式を教えてあげておいたほうが親切だとオモ。
ってか、丸投げスレより、質問スレ向けなネタだね。
0245デフォルトの名無しさん
2006/12/15(金) 19:12:18[2] 問題文(含コード&リンク): 問題文 ttp://www.geocities.jp/c_prog2011/bitmap_1.txt
途中まで自分で作ったソース ttp://www.geocities.jp/c_prog2011/file_2.txt
[3] 環境
[3.1] OS: Windows XP Home Edition
[3.2] コンパイラ名とバージョン: Visual Studio 2005 Academic Edition
[3.3] 言語: Cのみ
[4] 期限: 2006年12月20日23:59
[5] その他の制限: ファイル操作に関しては習ったばかり。
よろしくおねがいします。
0246238
2006/12/15(金) 19:30:17fgets(fname_in, COLSIZE + 1, stdin);
これは致命的問題。
スタックが下から上に積まれる環境において、NAMSIZE + 4 以上の文字数が入力された場合、
fgets() からのリターンアドレスを失い暴走する可能性がある。
バッファオーバーランを起こすとあらぬ場所で落ちる(様に見える)から追うのが面倒なんだよなぁ。
0247デフォルトの名無しさん
2006/12/15(金) 19:32:12fgets(fname_in, sizeof(fname_in), stdin)
にしてくれると安心だ;
0249デフォルトの名無しさん
2006/12/15(金) 20:18:26[2] 問題文(含コード&リンク):
入力された2つの整数(負数も可)の差の絶対値を求める。
最大8桁、−の場合は−を含め9桁まで有効としそれ以降は無視する。
また次のプロトタイプ宣言を持ち、絶対値を戻す関数を使用すること。
int absolute( int n1, int n2);
<エラー仕様>
整数以外の入力 "整数以外の入力"
'-'のみまたは改行のみ "改行のみまたは'-'のみの入力"
[3] 環境
[3.1] OS: Windows XP Home Edition
[3.2] コンパイラ名とバージョン: Visual Studio 2003
[3.3] 言語: Cのみ
[4] 期限: 2006年12月22日
[5] その他の制限: ポインタはまだ習ってないです。
0250デフォルトの名無しさん
2006/12/15(金) 20:39:03何がどう違うのかはっきり説明しないと、ここでは相手にされないぞ。
0251デフォルトの名無しさん
2006/12/15(金) 20:41:48さすがにそれがわからないのはまずくないか?
0252デフォルトの名無しさん
2006/12/15(金) 20:45:53丸投げする側の人かな?
■ このスレッドは過去ログ倉庫に格納されています