>>950 良く分からんかったからバブルソートにしたw
#include <stdio.h>
#define N 10
main(){
int a[N];
int n=0;
int i,j,x,b;
printf("データを入力 データ数の上限は10、下限は1\n");
printf("終了時は CTRL+d を押下\n");
while(n<N && scanf("%d",&a[n])!=EOF) ++n;
for(j=n;j>=1;j--){
for(i=0;i<j-1;i++){
if(a[i]<a[i+1]){
x=a[i+1];
a[i+1]=a[i];
a[i]=x;
}
}
}
for( b=0; b<n; b++ ) printf("value[%d] = %d\n", b, a[b]);
}
一応動くけど、書き方悪いと思うから推敲してね
>>950 どう入力をしたらどう出力された?
それが無いとわからん。
ただ、scanf()はあまり使わんほうがいいよ。
簡単にバッファオーバーフローするから。
>簡単にバッファオーバーフローするから。 ほほ~ 実例希望。
どうせ学校の宿題なんだろうし、特に指定が無い限りscanf使った方が楽でいい
>>925 DOSの方はプログラムに何かバグがあるんだろう。
Windowsの方は、仮想記憶があるので物理RAMがいくらだろうと1プロセス
で2GBぐらいまでmalloc()できる。でも、もちろんたくさんメモリ確保す
ると著しくパフォーマンスが落ちる。
プログラムを実行したときの関数呼び出しを全てログに取る方法ってないでしょうか? 要するにすべての関数の中に printf("関数名\n"); を入れればいいのですが、それを簡単にやる方法はないでしょうか。 コンパイラはgccなのでgdbを使ってもいいんですが。 よろしくお願いします。
>>957 cc -c foo.c -p
cc foo.o -p
./a.out
gprof
system(" ")の中身を標準入力から指定できますか? 例えば./a.out data.txtとしてdata.txtを表示させたいときには system("cat ???");どうすればいいですか?
>>960 sprintf()でも使って繋げばよろしかろ。
962 :
957 :2007/11/30(金) 16:03:31
文字列を逆にして返す関数を作りたいのですが どうやったら逆にコピーできるんですか? 誰か教えてください
同じchar配列を書き換えていいのなら、 void rev(char *buf) { int i, len = strlen(buf); char c; for (i = 0; i < len / 2; i++) { c = buf[i]; buf[i] = buf[len - 1 - i]; buf[len - 1 - i] = c; } } int main() { char buf[64]; strcpy(buf, "abcdef"); printf("%s\n", buf); rev(buf); printf("%s\n", buf); return 0; }
966 :
デフォルトの名無しさん :2007/11/30(金) 17:39:37
日本語判定が無髄
そうか。Cでするときはどうするんだろうね。 チマチマ頑張るのか、それ用の何かがあるのか。
>>965 なるほど~ありがとうございます。
ただちょっと自分頭が弱いみたいで
for (i = 0; i < len / 2; i++)
この部分が完全に理解できてないです。
確かに実行するとちゃんと逆にコピーしてくれますが何故 len/2なのでしょうか?
ずっとlenだと思ってて、だけど半分しか逆にならないっていう感じでした…
入れ替えてるから半分でいいんだろ 最後までって、単にコピーしてたんじゃ 後半は前半コピーしたやつを書き戻すだけだから半分にみえるだろうな
>>968 最終的には、前の半分を後ろの半分と置き換えてるんです。
前から0番目と、後から0番目を交換、
前から1番目と、後から1番目を交換、
:
:
前からlen/2番目と、後からlen/2番目を交換、
ここまでで達成しており、len番目まで交換すると、
どうなるでしょうか。元に戻ってしまうことがわかります。
訂正: 前からlen/2 - 1番目と、後からlen/2 - 1番目を交換、 ここまでで達成しており、len - 1番目まで交換すると、
課題なら馬鹿ソートでいいじゃん
ボゴソートがなんだって?
>>969-970 詳しく解説ありがとう
「交換してた」ってことだったんですね!
確かに交換してるなら半分で交換を止めないと残り半分は元通りに戻っちゃいますね
どうりでおかしかったわけだ 親切にどうもです
前から0番目に後から0番目をコピー
前から1番目に後から1番目をコピー、
:
:
こう考えてしまってました・・・
char* pStr = "123456"; これを2バイトずつ分割して、char型の1バイト10進数値(12,34,56) に変換したいのですが、 先頭から2バイト取出し(適当な配列へ格納) ↓ atoi関数でint型整数へ変換 ↓ これを、char型へキャストして、最終的に格納したいchar型配列へ ↓ 次の2バイト文字へポインタ移動 ↓ ここまでのフローをあと2回繰り返し 自分としては、こういった処理を考えています。 これでも出来るとは思うのですが、ほかにスマートな方法等あれば 教えてください。
スマートじゃねーけど、 sscanf(pStr, "%2d%2d%2d", &a,&b,&c); とか
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> int main() { char *pStr = "123456"; char tmp[3] = {}; int i=0; do { memcpy(tmp, (pStr+i), 2); printf("%s\n", tmp); i+=2; } while (*(pStr+i+1) != '\0'); }
returnするの忘れてた この方法ならpStrの文字数が偶数であるなら 何文字でも可能 forならもっとスマートになるかも
>>796 さんの案をパクッて、
int main() {
char *pStr = "123456";
char charvalue, *p, *tail = pStr + strlen(pStr);
int intvalue;
for (p = pStr; p < tail; p += 2) {
sscanf(p, "%2d", &intvalue);
charvalue = (char)intvalue;
printf("%d ", charvalue);
}
return 0;
}
一旦、atoi関数でint型へ変換してからchar型へキャストするのが、
どうもすっきりしないでいました。
>>977 さんのサンプルだと、memcpy関数を使えば、char*型のみでコピー
できますね。
文字列は、14バイト(NULL文字含むと15バイト)固定なので、2バイトずつ
ポインタ移動しながらmemcpyを繰り返していけると思います。
皆さん、ありがとうございました。
マクロ名について質問させてください。 除算は「DIVISION」ですが 除算しないは何て記述するのが一番適切ですか?
あっ除算しないじゃなくて、除算以外でした・・・
>>977 それだったらmemcpyしなくても、printf("%.2s\n", pStr + i)で十分じゃないか?
985 :
983 :2007/11/30(金) 20:34:23
あっすいません 解決しました・・・
986 :
977 :2007/11/30(金) 21:05:33
>>984 表示するだけならね
でも、スマートにコピーする方法というのが今回の問題点
987 :
890 :2007/11/30(金) 21:26:22
890ですが他で聞いてみます。 904さん考えていただきありがとうございました
>>938 事前に定義できるならunion(共用体)。
まあ配列程度なら普通に定数なりとかけ合わせて位置取る方が楽だろうけど
char cBuf[2]; char c; for( n=0; n<strlen(pStr); n+=2 ) { strncpy( cBuf, pStr+n, 2 ); c = (char)atoi(cBuf); printf( "%d", c ); } ???
990 :
デフォルトの名無しさん :2007/12/01(土) 00:37:40
BCC developerを使ってるんですが、線を描画するライブラリとかりますか? ある座標からある座標に線を引きたいんです
MoveToEx と LineTo
992 :
デフォルトの名無しさん :2007/12/01(土) 02:33:33
共用体って何か意義あるの? 構造体で十分な気がするけど……?
IPアドレス
994 :
904 :2007/12/01(土) 04:24:17
>>890 ,987
多分今度こそコレでいい……はず。
#include <stdio.h>
#define NumMax 100
void print_numbers(int *numList)
{
int i = 0,len;
while(numList[i++] != 0) ;
len = i-2;
for(i = 0;i < len;i++) printf("%d,",numList[i]);
printf("%d\n",numList[i]);
}
995 :
904 :2007/12/01(土) 04:24:51
>>994 の続き
void foo(int *numList,int n,int limit,int targetIndex,int len,)
{
int tempList[NumMax] = {0};
if(limit >= n || targetIndex >= len) return;
memcpy(tempList,numList,sizeof(int)*n);
if(tempList[targetIndex] < limit && len >= 1){
if(targetIndex < 1 || tempList[targetIndex] < tempList[targetIndex-1]){
tempList[targetIndex]++; tempList[len--] = 0;
print_numbers(tempList);
foo(tempList,n,2,targetIndex+1,len);
}
}
foo(tempList,n,limit+1,targetIndex,len);
}
996 :
904 :2007/12/01(土) 04:25:43
>>995 の続き
int main(void)
{
int i,n,numList[NumMax+1] = {0};
printf("INPUT:");
scanf("%d",&n);
if(n > NumMax) n = NumMax;
for(i = 0;i < n;i++) numList[i] = 1;
numList[i] = 0; /* 12:1,1,1,1,1,1,1,1,1,1,1,1 */
foo(numList,n,1,0,n-1);
return 0;
}
駄目だったらゴメンナサイってことで。
>>992 そもそも共用体と構造体は使用目的が違うので比較すること自体が無意味
だから、「構造体で十分・・・」はない
怪人二十面相のようなデータ
あるときはint、あるときはfloat、はたまたあることは構造体A、そしてあるときは構造体B
こんなデータを参照するときに使う
そんなデータがあるかって!?
なにそのvariant型
999
1000
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。