C言語なら俺に聞け(入門篇) Part 19
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2007/09/21(金) 11:43:13・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
前スレ
C言語なら俺に聞け(入門篇) Part 18
http://pc11.2ch.net/test/read.cgi/tech/1187213990/
教えて欲しいのではなく丸投げしたいならこちらへ
C/C++の宿題を片付けます 96代目
http://pc11.2ch.net/test/read.cgi/tech/1190331997/
0951デフォルトの名無しさん
2007/10/15(月) 00:52:09950
なるほど!ありがとうございました
0952デフォルトの名無しさん
2007/10/15(月) 00:58:230953デフォルトの名無しさん
2007/10/15(月) 01:04:13未だに理解できん・・・
0954デフォルトの名無しさん
2007/10/15(月) 01:04:47何度もすみません p_ptrってなんですか?
0955デフォルトの名無しさん
2007/10/15(月) 01:31:30単に何かの変数名なんじゃないの
0956デフォルトの名無しさん
2007/10/15(月) 01:36:00>955
そうなんですかΣ
ありがとうございました
0957デフォルトの名無しさん
2007/10/15(月) 01:36:12と表示された時はどこを調べたらよいですか?
0958デフォルトの名無しさん
2007/10/15(月) 01:39:50継承はC++から入るより、いったんJavaやったほうが理解しやすいと思う。
んで、一言でいうのはむずいなあ。。 個人的な意見な。
0959デフォルトの名無しさん
2007/10/15(月) 01:42:57たぶんどこかで括弧とかコメントとかを閉じ忘れてる
0960デフォルトの名無しさん
2007/10/15(月) 01:53:47一部抜粋です
//探索
for(p = data ; *p !='0' ;p++)
{
if(*p == key[0])
{
printf("文字%cは、%d番目にあった\n",key[0],p - data);
}
}
//探索ってのは/*探索*/とは別なんですか?
*p == key[0]の=ってなんで2つもいるんですか?
誰か教えてください
0961デフォルトの名無しさん
2007/10/15(月) 01:55:28== は比較
なぜってそう決まってるから
//〜 はコメントで /*〜*/ と一緒
0962デフォルトの名無しさん
2007/10/15(月) 01:58:29>>961
そうなんですか!!ありがとうございました
0963デフォルトの名無しさん
2007/10/15(月) 06:26:57//〜 は1行コメントで /*〜*/ は複数行コメント(1行でもOK)
初級C言語の本とかには絶対書かれてるから読んだほうがいいよ
0964デフォルトの名無しさん
2007/10/15(月) 08:22:56if((c >= 'a' )&&( c <= 'z'))
&&ってどういう意味ですか?
0965デフォルトの名無しさん
2007/10/15(月) 08:25:02本を買った方が早い
買いに行けないのなら初心者講座してるサイトでも探した方がいい
0966デフォルトの名無しさん
2007/10/15(月) 08:43:31{1,2,3,200},
{1,3,3,200},
{2,2,3,200},
};
ってどういう意味ですか?値の初期化はできてますか?
0967デフォルトの名無しさん
2007/10/15(月) 15:11:35m 以上 n 以下の整数のうち 3 で割り切れるものの和を求めるプログラムを作成せよ。
という問題ですが、以下のプログラムだと、mが「3の倍数+2」、nが「3の倍数+1」のとき
正しい値が出力されません。どこがおかしいか教えてほしいです。
よろしくおねがいします。
#include <stdio.h>
int main(void)
{int m,n,X,total;
printf("数値を入力してください");
scanf("%d",&m);
printf("今入力した数値以上の数値を入力してください");
scanf("%d",&n);
total = 0;
X = 0;
if(m%3 == 0)
{total = total + m;
{while(m<=n)
m = m + 3;}
printf("%d",total);}
else if(m%3 == 1)
{while(m<=n)
{total = total + m;
X = m + 2;
m = m + 3;}
printf("%d",total);}
else
{while(m<=n)
{total = total + m;
X = m + 1;
m = m + 3;}
printf("%d",total);}}
0968デフォルトの名無しさん
2007/10/15(月) 15:22:23[]の中に何もかかれてなければ、その初期化のときに必要な
領域が自動的につくられる。よって初期化はできてる
0969ごめんこっち
2007/10/15(月) 15:26:52int main(void)
{int m,n,X,total;
printf("数値を入力してください");
scanf("%d",&m);
printf("今入力した数値以上の数値を入力してください");
scanf("%d",&n);
total = 0;
X = 0;
if(m%3 == 0)
{total = total + m;
{while(m<=n)
m = m + 3;}
printf("%d",total);}
else if(m%3 == 2)
{while(m<=n)
{total = total + X;
X = m + 1;
m = m + 3;}
printf("%d",total);}
else
{while(m<=n)
{total = total + X;
X = m + 2;
m = m + 3;}
printf("%d",total);}
}
0970デフォルトの名無しさん
2007/10/15(月) 15:27:58#include <stdio.h>
int main(void)
{
int m, n, total;
printf("数値を入力してください");
scanf("%d", &m);
printf("今入力した数値以上の数値を入力してください");
scanf("%d", &n);
total = 0;
m=(m+2)/3*3; // m を 3 の倍数にする ※ここ重要
// while(m%3!=0) m++; でも可
while(m <= n)
{
total = total + m;
m = m + 3;
}
printf("%d", total);
return 0;
}
0971デフォルトの名無しさん
2007/10/15(月) 15:31:05m=(m+2)/3*3; // m を 3 の倍数にする ※ここ重要
ここで例えば4なら6、8なら9という操作をしてるんですね?
サンクスです。
よかったら>>969で変な値が出た理由を教えてほしいです。
0972デフォルトの名無しさん
2007/10/15(月) 15:36:57下のように置換すれば分かると思うよ
total = total + X;
↓
total = total + X;
printf("debug total=%d\n", total);
0973デフォルトの名無しさん
2007/10/15(月) 15:39:19うーむ、初心者なんで少し難しいっすね。
まぁ参考になりましたありがとうございます!
0974デフォルトの名無しさん
2007/10/15(月) 15:43:19int main() {
int i, m, n, total = 0;
printf("数値を入力してください");
scanf("%d",&m);
printf("今入力した数値以上の数値を入力してください");
scanf("%d",&n);
for (i = m; i <= n; i++) {
total += i % 3 == 0 ? i : 0; // m 以上 n 以下の整数のうち 3 で割り切れるものの和
}
printf("%d",total);
return 0;
}
0975デフォルトの名無しさん
2007/10/15(月) 16:01:33int begin = n/3, end = m/3;
return 3 * (end + begin) * (end - begin + 1) /2;
}
これでも、あってますか?
0976デフォルトの名無しさん
2007/10/15(月) 16:05:20>if(m%3 == 0)
> {total = total + m;
> {while(m<=n)
> m = m + 3;}
> printf("%d",total);}
↑ここは入力ミス(ブロックのくくりミス)だと思うからとりあえず置いといて
>else if(m%3 == 2)
> {while(m<=n)
> {total = total + X;
> X = m + 1;
> m = m + 3;}
> printf("%d",total);}
ちゃんと脳内トレースすれば分かると思うけど、
ループ条件のチェックが"足す前"に行われている。
Xにm+1が代入されて、それが足される前にm+=3して条件チェックしちゃってるから、
m+1 <= n < m+3
になってると、while条件でXが足される前にループ抜けちゃう。
さらにいえば、ここでの条件チェックはm+1<=nとかX<=nとかすべき
(mがn以下であるからといってm+1がn以下とは限らない)
一例としては、
else if(m%3 == 2){
while(m+1 <= n){
total += m + 1;
m += 3;
}
printf("%d",total);
}
まあ、for使った方が分かりやすいかもね。
0977デフォルトの名無しさん
2007/10/15(月) 16:05:26っ n=4, m=6
0979デフォルトの名無しさん
2007/10/15(月) 16:11:40int func1_c(const int n, const int m) {
int begin = (n+2)/3, end = m/3;
return 3 * (end + begin) * (end - begin + 1) /2;
}
0980デフォルトの名無しさん
2007/10/15(月) 16:13:200981デフォルトの名無しさん
2007/10/15(月) 17:05:04int main(int argc, char *argv[])
{
int k = 0; ← こっちが前?
for (int i = 0; i < 10; i++) {
k += i;
}
printf("こたえ=%d", k); ← こっちが前?
}
0982デフォルトの名無しさん
2007/10/15(月) 17:10:020983デフォルトの名無しさん
2007/10/15(月) 18:06:42とりあえずマージする部分のマクロはできました。
分割マクロの再帰→マージマクロ再帰でできるかなあと考えています。
でも与えられた配列を分割を繰り返して
要素数1にするという行程のプログラムをどうしても考え付きません。
どなたか教えて下さい。。マージマクロはこのままで使える方向で作りたいです。
void merge(int data1[], int n1, int data2[], int n2, int data3[]){
int index1, index2, index3, i;
index1 = index2 = index3 = 0;
printf("merge_sort\n");
while(index1 < n1 || index2 < n2){
if(index1 < n1 && index2 < n2){
(data1[index1] >= data2[index2])?(data3[index3++] = data1[index1++],)
:(data3[index3++]=data2[index2++]);
for (i=0; i<(2*N) ;i++)
printf("%d,", data3[i]);
printf("\n");
}
else if(index1 < n1){
for (;index1 < n1 ;index1++)
data3[index3++] = data1[index1]; }
else {for( ; index2 < n2 ; index2++)
{data3[index3++] = data2[index2];}}
}
}
0984デフォルトの名無しさん
2007/10/15(月) 18:19:040985デフォルトの名無しさん
2007/10/15(月) 18:22:32で、自分で作ってみようと頑張っているのか?
0986デフォルトの名無しさん
2007/10/15(月) 19:54:32○関数
郷に入りては郷に従え
0987デフォルトの名無しさん
2007/10/15(月) 19:58:51決してC言語の #define の事を言っているのでは無い。
それくらい文脈でわかりそうなもんだが、答えられないような難しい質問がくると
質問の本質とは関係ない部分で叩く煽る罵倒するのが、Cヲタの特徴。
0988デフォルトの名無しさん
2007/10/15(月) 20:07:33>それくらい文脈でわかりそうなもんだが
その甘さが数々の用語の誤用を招き
破壊と混乱をもたらしたのだ
何より先駆者に対する敬意が感じられない
0989デフォルトの名無しさん
2007/10/15(月) 20:11:540990デフォルトの名無しさん
2007/10/15(月) 20:17:200991デフォルトの名無しさん
2007/10/15(月) 20:32:110992デフォルトの名無しさん
2007/10/15(月) 20:49:51//全体の流れ
//無限ループ
//数値の入力、失敗したらピリオドであるかを判定。
//ピリオドなら終了if(getchar)=='.')break;
//ピリオドでなかったら入力間違いのメッセージを出して再入力。fflush(stdin);
//if文で正負0を判定して表示
//以上を繰り返す。
main()
{
int a;
printf("数値aを入力してください");
while(scanf("%d",&a)!='.'){
?????????????????????
if(getchar()=='.'){
break;
}
?????????????????????
if(a>0){
printf("PLUS\n");
}else if(a<0){
printf("MINUS\n");
}else if(a==0){
printf("ZERO\n");
}
}
}
2箇所、分かりません。よろしくお願いします。
0993デフォルトの名無しさん
2007/10/15(月) 20:56:51http://pc11.2ch.net/test/read.cgi/tech/1191937213/
こちらへ
0994デフォルトの名無しさん
2007/10/15(月) 20:57:21C/C++の宿題を片付けます 97代目
http://pc11.2ch.net/test/read.cgi/tech/1191937213/
↑こちらへどうぞ
しかし変なプログラムですなあ、scanfの戻り値を'.'と比較とは……
0996デフォルトの名無しさん
2007/10/15(月) 21:50:49その数値をに二次元配列にいれるとして
そこの二次元配列の最初の領域確保はどうするべきですか?
できるだけ領域を使わないとすると。
0997デフォルトの名無しさん
2007/10/15(月) 21:53:47検査データのファイルを使って処理をするようなプログラムがたくさん
のってるC言語の本とかありませんかね?
ソフトウェアテストの本とかいいって聞いたんだけど。
ファイルを実際に読み込み書き込みを使ってるプログラムを
書いてる本って少ないんだよなー
0998デフォルトの名無しさん
2007/10/15(月) 21:54:40fopenで、セグメンテーションフォルトが起きて困ってます。
古いバージョンのiccが入ってるマシンでは問題なく走ります。
考えられる原因は何なんでしょうか?
0999デフォルトの名無しさん
2007/10/15(月) 22:06:461000デフォルトの名無しさん
2007/10/15(月) 22:17:0110011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。