乙
いつのまにか1000だった >>乙
というのも list={a, b, c, d, e} として、一番下の葉を(ab) として考えると、 list={(ab), c, d, e} として4要素の木について再帰的に行うことに なると思うのですが、 この木の作り直しをどうすればよいのか分からないのです。 list[0]=(list[0] と list[1] をくっつけたやつ) list[1]=list[2] list[2]=list[3] list[3]=list[4] て、効率悪いですよね?
全スレのやつはマトリックスといいたかったのか?
>>7 最終的に作りたいのは、根無し木なので、
((((ab)c)d)e) と (((ab)c)(de)) は同じとみなさなくてはいけないのですよ。
そのことを言っているのかと早とちりしてしまいました。
でも、これに対する対処は後から考えますので、その前に木の作り直しを、
・(list[0] と list[1]をくっつけたもの) を list に追加
・list[0] と list[1] を list から消去
だけでできるようにしたいのです。
list 構造を使うか、インデクスを使うことになると思うのですが、
よく分かりません。
>>6 とりあえずそれでやってみたら?
動くものをつくってから、効率云々考えてもいいんじゃない?
叩き台があったほうがアドバイスも出やすいと思うよ。
>>6 よくわからんが、
list[0]=(list[0] と list[1] をくっつけたやつ)
list[1]=list[4]
でどーよ。
何方か、以下のプログラムの修正部分等わかる方いましたらお願いします。 二つの正の整数を入力して、その整数と整数の間にある 素数を求めるというプログラムなのですが、以下で実行してみたところ ふたつめの整数がひとつめの整数よりも大きい場合には正しく動作したのですが ひとつめの整数がふたつめの整数より大きい場合に正しく動作してくれません。
#include<stdio.h> int main(void) { int i, a, b; do { printf("1つめの正の整数を入力してください:"); scanf("%d", &a); if (a < 0); { puts("正の整数を入力してください"); } } while (a < 0); do { printf("1つめの正の整数を入力してください:"); scanf("%d", &b); if (b < 0); { puts("正の整数を入力してください"); } } while(b < 0); printf("%dと%dの間にある素数を表示します。\n", a, b);
if (a < b) { for (a; a <= b; a++) { for (i = 2; i < b; i++) { if (a % i == 0) { break; } } if (a == i) { printf("%d\n", a); } } }
else if (a > b) { for (b; b <= a; b++) { for (i = 2; i < a; i++) { if (b % i == 0) { break; } } if (b == i) { printf("%d\n", b); } } } return(0); }
>>9 よくわらんが、それを一緒くたにしたら括弧関係なくならないか?
>>12 printf("%dと%dの間にある素数を表示します。\n", a, b);
if(a>b){i=a;a=b;b=i} // 取り敢えず、この1行を入れなはれ
>>10 とりあえず、ものはできました。
>>11 そうすると、対象性がぐちゃぐちゃになりますよね。
(c(ab)) が生成されることになる。これは ((ab)c) と一緒だから
作りたくないんですよ。
とりあえず、現状のものを見てもらうと、 void tree(struct ArraySeq array[], int Num){ char tmp[100]; char left[100]="("; char right[100]=")"; char comma[100]=","; int i=0; int j=0; int k=0; struct ArraySeq newarray[MaxNumLeaves]; if (Num == 1){ printf("%s\n", array[0].Seq); }else{ for (i=0; i < Num-1; i++){ for (j=i+1; j < Num; j++){ strcpy(tmp, left); strcat(tmp, array[i].Seq); strcat(tmp, comma); strcat(tmp, array[j].Seq); strcat(tmp, right); strcpy(newarray[i].Seq, tmp);
for (k=0; k < i; k++){ strcpy(newarray[k].Seq, array[k].Seq); } for (k=i+1; k < j; k++){ strcpy(newarray[k].Seq, array[k].Seq); } for (k=j; k < Num-1; k++){ strcpy(newarray[k].Seq, array[k+1].Seq); } } } } }
後半部分の k に関するループが新しい配列を作っている部分になります。 もう少し効率を上げたいので、この部分を何とかしたいのですが。 ちなみに最初の array が {A,B,C,E} とかだと、 (((A,B),C),D) (((A,B),D),C) ((A,B),(C,D)) (((A,C),B),D) (((A,C),D),B) ((A,C),(B,D)) (((A,D),B),C) (((A,D),C),B) ((A,D),(B,C)) ((A,(B,C)),D) ((A,D),(B,C)) (A,((B,C),D)) ((A,(B,D)),C) ((A,C),(B,D)) (A,((B,D),C)) ((A,B),(C,D)) ((A,(C,D)),B) (A,(B,(C,D))) とちゃんとできます。
あれ、よく見たら((A,B),(C,D)) とか2回出てきてますね。 これってどうやって除外しよう・・・。
なぜ2分木で作らない?
1.seisekiという構造体枠を宣言し、構造体配列gakusei[10]を定義して、 10名の学生の名前、得点、偏差値(数値は適当でよい)を入力し、出力しなさい。 ここで、構造体のメンバーの参照は、構造体ポインタ変数を用いた間接参照とする。 2.1.を改良し、最も得点の高い学生を選ぶプログラムにしなさい。 最大値を求める部分は関数にしなさい。
↓ここまでやってみたんですが・・・ #include "stdio.h" struct seiseki{ char name[10]; int tensu; float hensachi; }; main() { struct seiseki gakusei[10]; struct seiseki *p; int i; p=gakusei; printf("名前 点数 偏差値 を入力\n"); for(i = 0; i < 10; i++){ scanf("%s %d %f", p->name, &p->tensu, &p->hensachi); p++; } p=gakusei; putchar('\n'); for(i = 0; i < 10; i++){ printf("名前:%s \n点数:%d \n偏差値:%f \n\n", p->name, &p->tensu, &p->hensachi); p++; } return 0; }
>>25 -#include "stdio.h"
+#include <stdio.h>
-main()
+int main()
- printf("名前:%s \n点数:%d \n偏差値:%f \n\n", p->name, &p->tensu, &p->hensachi);
+ printf("名前:%s \n点数:%d \n偏差値:%f \n\n", p->name, p->tensu, p->hensachi);
29 :
デフォルトの名無しさん :03/06/19 18:13
木とはなにか.また,2分木とはなにか.説明せよ.
ポインターを使う課題なんですがおながいします。 1.円筒の表面積A及び体積Vを計算するプログラムを作りなさい なお以下のような構成にすること #include <stdio.h> #define PAI 3.14159 main() { GetInputs(&r,&h); /*scanfでr,hを読み込む関数*/ ComputeAandV(r,h,&A,&V); /*表面積及び体積を計算する関数*/ DisplayAnswers(A,V); /*解をファイルに書き出す関数*/ }
こんな感じに書きましたが動きません・・・ #include <stdio.h> #define PAI 3.14159 void GetInputs(double *rp, double *hp); void ComputeAandV(double r,double h, double *Ap,double *Vp); void DisplayAnswers(double A,double V); int main() { double r1,h1,A1,V1; GetInputs(r1,h1); ComputeAandV(r1,h1,&A1,&V1); DisplayAnswers(A1,V1); return(0); }
void GetInputs(double r,double h) { printf("半径rと高さhを入力してください。\n"); printf("r:"); scanf("%lf",&r); printf("h:"); scanf("%lf",&h); } void ComputeAandV(double r,double h,double *Ap,double *Vp) { *Ap=2*PAI*r*h; *Vp=PAI*r*r*h; }
void DisplayAnswers(double A,double V) { printf("表面積は%lfで体積は%lfです。\n",A,V); }
「動きません」じゃ分かりません
>>32 これじゃ、呼び出し元にr,hは渡らない。
>>31 GetInputs(r1,h1)とComputeAandV(r1,h1,&A1,&V1)の引数の使い方を比べてみよう
あともう少しだな
というかバグか void GetInputs(double *rp, double *hp)で宣言しておいて void GetInputs(double r,double h)と定義してる
>>34 すいません言い方が悪かったです
Null Reference なんとかというのが出てくるんです。
>>35 void GetInputs(double *r,double *h)
にすればいいんですか?
>>37 間違えました・・・
先ほどから頑張ってるんですが本見てもよく分かりません・・・
>>38 直接の答ではないけど、関数で変数を設定するにはこんな感じ。
#include <stdio.h>
void
substitute1(double *x)
{
*x = 0.1;
}
int main(){
double a;
substitute1(&a);
printf("%f\n", a);
return 0;
}
とうとうできました。 ありがとうございました。
41 :
デフォルトの名無しさん :03/06/19 19:25
void wait(int sec){ clock_t StartTime = clock(); while((int)((clock() - StartTime) / CLOCKS_PER_SEC) < sec) } 上の関数を利用して1秒毎にコンマ’.’を表示させたいんですが、 どうすればいよいでしょうか?
コンマじゃなくてピリオドでした・・・
void waitProt(int sec){ int i = 0; while(i++ < sec){ while(1){ clock_t StartTime = clock(); while((int)((clock() - StartTime) / CLOCKS_PER_SEC) < 1); break; } putchar('.'); } } これで一応成功したんですが、もっといい方法ってありますよね?
44 :
デフォルトの名無しさん :03/06/19 19:41
while(1)の部分がいらないですね、これ・・・
void wait(int sec){ int i = 0; while(i++ < sec){ clock_t StartTime = clock(); while((int)((clock() - StartTime) / CLOCKS_PER_SEC) < 1); putchar('.'); } } ここまで短くなりましたが、もっとスマートな方法ってありますかね?
main(){ while(1){ wait(1); printf("."); } }
>>46 はい、
>clock_t StartTime = clock();
>while((int)((clock() - StartTime) / CLOCKS_PER_SEC) < sec);
上の部分をうまく利用して、という意味です。
いや、別に利用しなくてもいいんですが、
思いつくのがこれしかなくて・・・。
#include <stdio.h> #include <time.h> void wait(int sec) { clock_t StartTime = clock(); while((int)((clock() - StartTime) / CLOCKS_PER_SEC) < sec); } int main() { for (;;) { putchar('.'); fflush(stdout); wait(1); } return 0; }
>>48 ありがとうございます!
おかげで思いつきました。
>while(i++ < sec)
はwhile(sec--)にできますね。
>>29 木とは階層をもつデータ構造で、親(要素)は複数の子(要素)を持つが、
子は1つの親しか持たない。
親がたかだか2つの子しか持たないような木を2分木という。
53 :
デフォルトの名無しさん :03/06/19 21:02
前スレからの粘着か?
56 :
デフォルトの名無しさん :03/06/19 21:22
57 :
デフォルトの名無しさん :03/06/19 21:24
他のmainから呼び出す関数内でmallocなどで領域を割り当てた時、mainの最後でその領域を開放するにはどのようにしたらいいのでしょうか? void *hoge(){ char *aho; aho = (char *)malloc(100); } void main(){ /* プログラム */ /*ahoを開放*/ }
58 :
ランランラン :03/06/19 21:31
たくさんあるので1つづつ書かせて頂きます。 6個とも何を計算するプログラムかを教えてください @void main() { int a,b,x,y,s=0; scanf("%d",&x),scanf("%d",&y); for(a=0;a<x;a++) { for(b=0;b<y;b++) s+=b; } printf("%d\n",s); }
59 :
ランランラン :03/06/19 21:31
Avoid main() { int a,b,x,s=0; scanf("%d",&x); for(a=0;a<x;a++) { for(b=0;b<y;b++) s+=b; } printf("%d\n",s); }
60 :
ランランラン :03/06/19 21:31
Bvoid main() { int a,x,s=0; scanf("%d",&x); while (x--) { s+=x; } printf("%d %d\n",x,s); }
>>57 それじゃ、解放できなくなる。普通は
------------------------------
char *create_hoge(void){
return malloc(100);
}
void delete_hoge(char *a){
free a;
}
main(){
char *aho;
aho = create_hoge();
//処理
delete_hoge(aho);
}
------------------------------
みたいにする。
62 :
ランランラン :03/06/19 21:32
Cvoid main() { int x,y=0; x=0; while (y<=200) { x++;y+=x; } printf("%d\n",x); }
63 :
ランランラン :03/06/19 21:33
Dvoid main() { int x,y=0,a; x=0; scanf("%d",&a); while (y<=a) { x++;y+=x; } printf("%d\n",x); }
プロセス終了時に開放されるのを期待して何もしないのもひとつ。 あるいは、free(aho); と書いてもよい。実害はない。益もないが。
解放
68 :
デフォルトの名無しさん :03/06/19 21:43
マージソートのプログラムなんですけど再帰を使ってこれを完成させて下さいませんか? #include <stdio.h> #include <stdlib.h> main() { int i, j, k; int a[8] = {3, 13, 45, 55, 30, 46, 74, 87}; int b[8]; printf("整列前\t"); for ( i = 0; i < 8; i++ ) { printf("%2d ", a[i]); } printf("\n"); printf("整列後\t"); for ( i = 0; i < 8; i++ ) { printf("%2d ", a[i]); } }
69 :
ランランラン :03/06/19 21:43
Evoid main() { int x,y=0,a,w; x=0; scanf("%d",&a); while (y<=a) { x++; for(w=1;w<=x;w++) y+=w; } printf("%d\n",x); } 以上です。お手数ですがお願いします
レスありがとうございます。本当は開放しなくてもいいものなんですか・・・
>>61 さんのも試してみたいと思います。
それから、もうひとつ似たようなもので質問よろしいでしょうか?
free()の引数にはアドレスが入ってそのアドレスのメモリを開放するんですよね?
ってことは
char *hoge(){
char *aho;
aho = (char *)malloc(100);
return aho;
}
void main(){
char *ahooo;
ahooo = hoge()
/*
プログラム
*/
/*ahoを開放*/
}
としたら、mainにfree(ahooo);としてもahoは開放されるってことなんでしょうか?
>>71 即答ありがとうございます!
これで何とかできそうです
ありがとうございました
でも、malloc-freeで対にしたほうがわかりやすいよ。 領域確保を関数内でするなら、それと対になった開放用の関数をつくった方がいい。
>>53 どういうことを付け足せばいいの?
というか詳しくないという判断がつく程度の知識があるなら、
自分で満足するものを書けばいいと思うが。
字数を増やして欲しいというのなら、
テキトーに足しますが…
75 :
デフォルトの名無しさん :03/06/19 22:09
#include <stdio.h> char mojic(char a[],char b[]) { char *pa,*pb,*ps,s[80]; pa=a;pb=b;ps=s; while((*ps=*pa)!='\0'){ ps++; pa++; } ps++; while((*ps=*pb)!='\0'){ ps++; pb++; } return(s); } main(void) { char a[80],b[80]; printf("Input strings 1?"); scanf("%s",a); printf("\nInput strings 2?"); scanf("%s",b); printf("\nOutput :%s",mojic(a,b)); return 0;} Cで文字列コピーの関数を作ったのですが 'return' : 'char [80]' から 'char' に変換することはできません。 この変換には reinterpret_cast, C スタイル キャストまたは関数スタイルのキャストが必要です。 というエラーがでてコンパイルできません。 どこを直せばいいのか検討がつかないのでご教授お願い致します。
>>75 char *mojic(char a[],char b[], char s[]){
//処理
return s;
}
main()
char a[80],b[80],s[80];
//a,bデータセット
printf("%s",mojo(a,b,s));
}
a,bが80ならs[160]だな。
78 :
デフォルトの名無しさん :03/06/19 22:25
関数を自作するってどういうことですか? atoiを作る〜とか。
>>74 本当は、図で示せば分かりやすいんだけどね。
標準出力関数fputcを用い、キーボードから入力した文字を1文字づつ ファイルfdataに書き込むプログラムを作成しなさい。ただし、入力の 終了は記号'/'の入力で判定を行うこと。
#include <stdio.h> int main() { int c; FILE *fp; fp=fopen("fdata","w"); // 失敗しない。絶対に失敗しない。しないったらしない。 while((c=getchar())!='/') fputc(c,fp); fclose(fp); return 0; }
すいません間違いました 標準入力関数fgetcを用い、コマンドラインからファイル名を指定した ときに、その次から1文字ずつ読み込み、ディスプレイに表示する プログラムを作りなさい。 ヒント:コマンドラインからファイル名を指定する方法に関しては、 以下を利用のこと。 int main(int argc, char *argc[]) { FILE *fp_r, *fp_w; if(argc == 1){ fp_r = stdin; fp_w = stdout; } else fp_r = fopen(argc[1],"r"); fp_w = stdout; } if(fp_r = NULL || fp_w == NULL) exit(-1); fclose(fp_r); fclose(fp_w); return 0; } お願いします
こんな中途半端な釣りがいる訳ないだろう
訂正します その次から→そのファイルから です。ごめんなさい
>>84 while((c = fgetc(fp_r)) != EOF)
{
fprintf(fp_w, "%c\n", c);
}
文字通りの初心者なんですが、fgetsがよくわかりません・・・ キーボードから文字を入力し、memo.txtの中を一行ずつ検索して 符合するかどうかを出力するプログラムなのですが改行コードを削ると どうしてもうまくいきません。コメント内の**で示してある個所をコメントアウト すると動くのですが、都合上改行コードは削っておきたいのです。 どうすればよいのでしょうか・・・(投稿時改行多すぎるといわれたので無理矢理行数削ったので見辛いですごめんなさい。) #include<stdio.h> #include<stdlib.h> #include<string.h> void main(){char word[256];char hikaku[256];int flag=0;FILE *fp;fp=fopen("memo.txt","r"); if(fp==NULL){printf("コマンドファイルが見つかりません。");exit(1);} printf("キーワードを検索します:"); fgets(word,256,stdin);word[strlen(word)-1]='\0';//ここと while(fgets(hikaku,256,fp)!=NULL)hikaku[strlen(hikaku)-1]='\0';//ここ if(strcmp(hikaku,word)==0)flag=1; if (flag==1)printf("見つかりました\n");else printf("見つかりませんでした\n"); printf("お疲れ様。\n");fclose(fp); } /* ---memo.txtの中身--- mona (´∀` ) */
>>93 改行コードを削ることが問題なのではありません
再度よーくコードを眺めてみてください
95 :
デフォルトの名無しさん :03/06/20 03:09
すいません、ややこしくなりましたが 改行コードを削りたいのは変数に改行を入れておきたくない、 ということです。(後の処理が面倒なので・・・) ここにソースを貼り付けてカキコしようとしたら、改行が多すぎると怒られたので 無理矢理ソースの改行を削った、という意味です。 「別の意味でいってんだバカ!('A`)」 だったらごめんなさい・・・
>>95 strcmp(hikaku,word) は何回評価されるのかな、という話かと
「別の意味でいってんだバカ!('A`)」 ほんとによーく眺めた? hikaku[strlen(hikaku)-1]='\0'をputs("bug")で置き換えてみ。 結果はどうなる?それともコピペミスかい?
98 :
アルジャーノン :03/06/20 03:55
('∀`)デキター 解決熟女しましたー。{}をつけていませんでした。ありがとうございます。やっと寝れる・・・。 じゃ彼女とぬっぽり寝てきます('∀`)マダキンヨウダヨー
>>95 >>96 ありがとうございました。プログラミングの知識も正しい日本語の使い方も
リロードの習慣さえも身についていないアルジャーノンをよろしく!('A`)
そのうえレス番までずらして自分にレスしまう知障のアルジャーノンをさらによろしく!('A`;)
おまけにくだらないレスで100ゲットしてしまったアルジャーノンをひたすらよろしく!(('A`;))ガクガク
アルジャーノンをよろしく
アルジャーノンに鼻糞を
104 :
デフォルトの名無しさん :03/06/20 08:35
木とはなにか.また,2分木とはなにか.説明せよ.
105 :
デフォルトの名無しさん :03/06/20 08:36
テキストファイルは名簿である.各行のデータを,ID,姓名,読み(ローマ字) の三つの要素をもつ構造体に格納するプログラムを書け
朝からネタ満載ですね
木とは分化した根・茎・葉を持つ大型の植物で茎が硬化して幹になったものである。 2分木とは近い距離で発芽した木の根元付近がつながり、二股に分かれているように見える木のことである。
通報しますた。
110 :
デフォルトの名無しさん :03/06/20 10:12
顔文字を生成するプログラムを作成せよ
#include <stdio.h> main(){ char *a = "(^^"; char *b = ")"; printf("%s,%s",aa,b); }
>>104 「木とはなにか」という問いだと、
「木とは〜である」という一文に収まる程度の答えをするのが普通で、
詳しい説明を期待していない問いだと思う。
それだから、
>>107 は「とは〜である」というように書いている。
残念ながら
>>52 は「とは〜である」というようには書いていないが、
それでも短くまとめた。
>>105 前スレの316はその三要素を構造体を格納するプログラムでもある。
レスを無視したりせず、レスに不満があるならその旨を書いてくれ。
そうしてくれないと対応し辛い。
>>110 #pragma warning(disable : 4305 4309)
#include <stdio.h>
int main(void)
{
  char str[256] = {
    0x20, 0x20, 0x81, 0xc8, 0x81, 0x51,
    0x81, 0xc8, 0x0a, 0x20, 0x28, 0x20,
    0x81, 0x4c, 0x81, 0xCD, 0x81, 0x4d,
    0x29, 0x81, 0x83, 0x20, 0x20, 0x82,
    0xca, 0x82, 0xe9, 0x82, 0xdb, 0x0a
  };
  printf("%s\n", str);
  return(0);
}
115 :
デフォルトの名無しさん :03/06/20 15:44
>>113 nbspのあとにセミコロンをつけろと何度言えば分かるんだこの馬鹿!!!
二分法を使って区間[0,1]における2*x*x*x+x*x-1=0の解を求めよ という問題がでて作ってみたんですがどうでしょうか?
#include <stdio.h> int main() { float l,h; //区間の設定 float y_l,y_h,y_m; //x=l,x=hのときのyの値 float x; //答えを代入 float p; //ループに使用する float m; //中点 printf("2*x*x*x+x*x-1=0の解を求める\n"); printf("区間を指定して下さい\n"); printf("l=");scanf("%f",&l); printf("h=");scanf("%f",&h); y_l=2*l*l*l+l*l-1; //f(l)を計算 y_h=2*h*h*h+h*h-1; //f(h)を計算 p=1;
while(p>0.00005) { if(y_l*y_h<0) //二分法を使える条件を満たしているとき { y_l=2*l*l*l+l*l-1; //f(l)を計算 y_h=2*h*h*h+h*h-1; //f(h)を計算 m=(l+h)/2; //区間lとhの中点を求める y_m=2*m*m*m+m*m-1; //f(m)を計算 if((y_m>0&&y_l>0)||(y_m<0&&y_l<0)) //f(m)とf(l)が同符号の時 { l=m; h=h; } else //f(m)とf(l)が異符号の時 { l=l; h=m; } p=p-0.00001; //カウンタ変数を少しずつ減らしていく }
else //二分法が使えないとき { printf("区間[%f,%f]において解が存在しません\n",l,h); break; } } x=(l+m)/2; //解となる区間の中点を求める printf("x=%f\n",x); return 0; }
>>117 ・なぜfloatを使う
・pの使い方が?
やっぱだめですか。自分でもよく分からない状態で作ったので なにかアドバイスあったらお願いします
124 :
デフォルトの名無しさん :03/06/20 17:40
floatイラネ 言語仕様からはずしちゃえ。
float使うのがダメなんですか?
floatは、SIMDとか、GPUとかでひょっこり顔を出すからなー
127 :
デフォルトの名無しさん :03/06/20 19:44
WindowsでC言語のプログラムをやりたいのですがどうしたらいいですか? 教えてください
>>126 SIMD, GPUで顔出すから何で使うのがダメなの?
132 :
デフォルトの名無しさん :03/06/20 22:19
@4行4列の行列に値を代入(各自適当な値でいい) ALU分解する [L][U] BA=LUとなることを確認する。(掛け算) C右辺bを与え、LとUをもちいて、AX=bの解であるxを求める[x] DAX=bが正しく計算できているか確認。 以上のようなプログラムを作成せよ。 どなたかおねがいします。
オレニマカセロ!
オマエニマカセタ!
(´ ▽`).。o○マッタリいこうよ・・・
138 :
デフォルトの名無しさん :03/06/21 03:35
誰か
>>132 の質問に答えてやれよ!
ちなみに、俺は分からないから。
139 :
デフォルトの名無しさん :03/06/21 03:36
| | ∧ |∀`) / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ |⊂ ) < まったくバカばっかりだな! | | \_________________ |_) | | | サッ |) 彡 | | |
「行列」 この時点でアウト
俺は 「LU分解」 この時点でアウト
オイラは 「132 :デフォルトの名無しさん :03/06/20 22:19」 この時点でアウト
おまいら数値解析習わなかったのか? 有限要素法とかやれば使いまくるだろう。 でも忘れたんだよね(´・ω・`)
私は、 「Internet Explorer起動」 この時点でアウト
高卒だし、高校では3年の時は数学とらなかったし
我輩は 「WINDOWSを起動しています・・・」 この時点でアウト
自分は 「夜遅くに家に帰り、妻に遅かったのねってにらまれた」 この時点でアウト
ぼくは オギャー この時点でログアウト
拙者は 「ドピュッ」 この時点で・・・もういいって!!
LU分解なんてその辺のホームページにでも わんさか出ているからわざわざやる気がしない
scanfに代わる安全な標準入力読み込み関数を作成せよ。 (麻布第一小学校 入試問題)
>>153 小学校でプログラミングか。時代が変わったな。
>>153 違う。入試問題と言う事は小学校に入る前だから幼稚園でってことか。
C言語の知識は日本人の常識だろ。
小学入試にしては漢字が難しいな。
creatのスペルの誤りを正せ。 (麻布第一小学校 追試問題)
kreat
スペルならcastでしょう。
制限説とtypo説のどっちが正しいかは不明 Ken Thompson was once asked what he would do differently if he were redesigning the UNIX System. His reply: "I'd spell creat with an e." - Brian Kernighan and Rob Pike
162 :
デフォルトの名無しさん :03/06/21 16:38
2分木を全て書き出すプログラムを作れ。 これどーなった?
>>162 名前とIDのやつだっけ?
以前C++のコードをラウンジにはっつけといたよ。
その後もう少しきれいに表示するコードも作ったけどUPしないでおわった。
>>162 あれは「プログラムを作れ」なんて依頼じゃなくて、
大まかな方針が知りたいだけだったんだから、
本人が何も言ってこない限りもう終了でしょう。
キーボードから文字列を与え、その文字列を逆から出力するプログラムを ポインタを使って作成せよ。 例 与えた文字列→ABCDE 出力結果→EDCBA C言語です。よろしくお願いします。
今までにも「キーボードから」っていう宿題が何度も出てるけど、 本当に問題にそう書いてあるんだろうか?
>>166 そう書いていないと「どうやって文字列を与えるんだ?」と聞きまくる香具師が
以前大発生した為と思われ
当然書いてあるだろ BIOSシステムコールくらい基本中の基本だ
二分木の書き出しで書き込んでいた者です。 まだできていなく、再度お伺いしたく思います。 結局、 tree(配列Array){ 配列Arrayを2つの配列array1とarray2に分けて、全ての分け方に対して、{ tree1=tree(array1); tree2=tree(array2); 全てのtree1の要素t1とtree2の要素t2に対して{ 配列Treeに"(t1, t2)"を加える } } return Tree; } と考えているのですが、関数の配列の受け渡しがうまくいきません。 まだちゃんと書いていませんが、これだと、 再帰で呼び出した関数内部で呼び出しもとのTreeを書き換えてしまうようです。 どなたか、こんな感じで(でなくてもいいので) 書いていただけたら助かります。 よろしくお願いします。
170 :
デフォルトの名無しさん :03/06/21 21:17
学校の課題なら「標準入力から〜」とか「標準出力へ〜」などと書かれているものこそ少ないだろう
>>165 #include <stdio.h>
int reverseline(FILE* fp)
{
char buf[BUFSIZ], *p;
int ret = 0;
if (fgets(buf, sizeof buf, fp) != NULL) {
for (p = buf; *p && *p != '\n'; ++p);
if (!(ret = *p == '\n'))
ret = reverseline(fp);
for (--p; p >= buf; --p)
putchar(*p);
}
return ret;
}
int main(void)
{
while (reverseline(stdin))
putchar('\n');
return 0;
}
8王妃問題です。 下記のプログラムを改良して、盤面を文字を用いて表示させてください。 たとえば、1行目と2行目を描くと・・・ - - - - Q - - - - - - - - - Q - このような感じです。 よろしくお願いします。
#include <stdio.h> int flag_a[8];/* 各行に王妃が配置済みか */ int flag_b[15];/* /対角線に王妃が配置済みか */ int flag_c[15];/* \対角線に王妃が配置済みか */ int pos[8];/* 各列の王妃の位置 */ /*--- 盤面(各列の王妃の位置)を出力 ---*/ void print(void) { int i; for (i = 0; i < 8; i++) printf("%2d", pos[i]); putchar('\n'); }
/*--- i列目の適当な位置に王妃を配置 ---*/ void set(int i) { int j; for (j = 0; j < 8; j++) { if (!flag_a[j] && !flag_b[i + j] && !flag_c[i - j + 7]) { pos[i] = j; if (i == 7)/* 全列に配置終了 */ print(); else { flag_a[j] = flag_b[i + j] = flag_c[i - j + 7] = 1; set(i + 1); flag_a[j] = flag_b[i + j] = flag_c[i - j + 7] = 0; } } } } int main(void) { int i; for (i = 0; i < 8; i++) flag_a[i] = 0; for (i = 0; i < 15; i++) flag_b[i] = flag_c[i] = 0; set(0); return (0); }
>>173 void print(void)
{
for (int row = 0; row < 8; row++) {
for (int col = 0; col < 8; col++) {
putchar(pos[row] == col ? 'Q' : '-');
}
putchar('\n');
}
}
>176さま、お返事ありがとうございます。 さっそく print関数を入れ替えてコンパイルしてみました。 ですが、 エラー E2188 5-7.c 15: 式の構文エラー(関数 print ) エラー E2451 5-7.c 15: 未定義のシンボル row(関数 print ) エラー E2379 5-7.c 15: ステートメントにセミコロン(;)がない(関数 print ) とエラーがでてしまいます。 15行目は for (int row = 0; row < 8; row++) { この行です。解決方法をよろしくお願いします。
Cなら変数の初期化をforの外に出せばOK
書き直してみました。 それらしい結果は出力されますが、 8行目で区切りが無く、正しいのか分かりません。 さらなる改良をよろしくお願いします。 void print(void) { int row,col; for (row=0; row < 8; row++) { for (col=0; col < 8; col++) { putchar(pos[row] == col ? 'Q' : '-'); } putchar('\n'); } }
すいません、できました。 void print(void) { int row,col; for (row=0; row < 8; row++) { for (col=0; col < 8; col++) { putchar(pos[row] == col ? 'Q' : '-'); } putchar('\n'); } putchar('\n'); }
bubble関数を修正してください。ほぼ正しいはずです。 #include <stdio.h> #define swap(type, x, y)do {type t = x; x = y; y = t; } while (0) /*--- 単純交換ソート ---*/ void bubble(int a[], int n) { int i, j; for (i = 0; i < n - 1; i++) { for (j = n - 1; j > i; j--) if (a[j - 1] > a[j]) swap(int, a[j - 1], a[j]); } } int main(void) { int i; int x[7]; int nx = sizeof(x) / sizeof(x[0]); printf("%d個の整数を入力せよ。\n", nx); for (i = 0; i < nx; i++) { printf("x[%d] : ", i); scanf("%d", &x[i]); } bubble(x, nx);/* 配列xを単純交換ソート */ puts("昇順にソートしました。"); for (i = 0; i < nx; i++) printf("x[%d] = %d\n", i, x[i]); return (0); }
こちらが修正して欲しいバージョンです。 比較、交換を先頭側から行いたいです。最大要素が、末尾側に移動するようにします。 void bubble(int a[], int n) { int i, j; for (i = 0; i < n - 1; i++) { for (j = 0; j < n - 1 - i; j++) if (a[j] > a[j++]) swap(int, a[j], a[j + 1]); } }
>>181 整数の場合に限り
#define swap(a,b) a^=b^=a^=b
が使える。
>>183 他の方法はございませんか?
182の改良をして欲しいです。煮詰まってしまいました。
#define swap(a,b) a^=b^=a^=b void bubble(int a[], int n) { int i,j; for(i=0;i<n;i++){ for(j=i+1;j<n;j++){ if(a[i] > a[j]) swap(a[i],a[j]); } } }
って、途中で書き込んでしまったが、、、 普通バブルソートって↑みたいにやるんでない?
すばやいレスありがとうございます。 ですが、 #define swap(a,b) a^=b^=a^=b は使わない方法が知りたいです。講義で習っていないので。 説明が足りなくて、お手数を掛けてしまいすいません。 よろしくお願いします。
練習問題なので普通じゃないのかもしれません。 異なった方法で求めさせる問題が多いのです。
#define swap(a,b) a^=b^=a^=b 未定義
191 :
デフォルトの名無しさん :03/06/22 00:19
誰か行列式を求めるアルゴリズムを教えて下さい。
>>190 どこら辺が未定義なのか
サンプルのコード出して解説きぼん。
>講義で習っていないので 俺もこんな言い訳したいよ。
STL使い出したら自前でソートの関数書くなんてことは ないんだがなー。
>>192 副作用完了点は不定
ビット演算の結果は常に処理系依存
一つの評価単位で変数が二度以上変更されると未定義
不定、処理系依存、未定義。トリプル役満
#define int_swap(a, b) {int tmp = (a); (a) = (b); (b) = tmp;}
>>196 define の後に()が付いてないのは頂けないし
swap(a,b++)とかしたら、どうすんだ?とも思うし
前の副作用完了点から次の副作用完了点までの間に
同一の変数が二度以上変更されると未定義だが
ビット演算の結果は常に処理系依存って言うのは、この場合関係ないだろ
処理が軽くなるわけでも読みやすくなるわけでも無いのに
使えるか使えないかは別として、 #define swap(a,b) a^=b^=a^=b こういうのって、なかなか思いつかないんだよな〜。
>>196 どうも。
>ビット演算の結果は常に処理系依存
>> or << のことと混同してない?
XOR演算が処理系依存なわけがないと思われ。
>一つの評価単位で変数が二度以上変更されると未定義
^= は右結合性だから、まともな処理系・コンパイラなら
(a^=(b^=(a^=b)))
と解釈されて大丈夫なはず。
とりあえず、ググって調べてみます。
>>200 だから、↓みたいにしないと駄目だって
#define swap(a,b) (a^=b^=a^=b)
>>201 まともであろうと、なかろうと、規格で未定義のものは使ったらアカンて
>>201 ビット演算の結果は常に処理系依存って言うのは
-1&1, -1|1, -1^1 …のように、
数値をビット演算した結果の数値が処理系依存って事だと思う
(ビット演算なんだから、当然な訳で…)
まぁ、この場合、全く関係ない事ですけどね
<<201 >> or <<のことと・・・ orも処理系依存?とか思ってしまった俺ってバカ?
>>201 >>> or << のことと混同してない?
>>や<<は2^nの乗除と同等と定められている
&,|,^などの動作は処理系依存として何も規定されていない。
(数値的にだけでなく、ビット列についても全く何も規定していない)
我々が数学的に想像する結果はISO規格としては保証しないということ。
>^= は右結合性だから、まともな処理系・コンパイラなら(a^=(b^=(a^=b)))
ISOの規格上で未定義。もちろん動作する処理系があっても何もおかしくない
不定は三回の代入の順番を決められないところ。最後のa^=のときにまだ
最初のa^=bの代入が終わっていないかもしれない。
必ずISO準拠な訳でもないし、処理系で保証しているならそれもいいんだが
そんなわけでa-=b,b+=a,a=b-aに一票
足し算です。"tasizan"が実行ファイル ・2つを足した場合 ./tasizan 10 20 30 ・3つ足した場合 ./tasizan 10 20 30 2つにしてください (2行目は出力結果) と表示させるにはどうしたらいいですか?
>>205 負の>>は処理系依存。
> そんなわけでa-=b,b+=a,a=b-aに一票
オーバーフローはどうする?
>>205 >ビット列についても全く何も規定していない
それは、聞いた事が無いけど、普通ビット演算と言ったら
0&0 -> 0, 0&1 -> 0, 1&0 ->0, 1&1 -> 1
0|0 -> 0, 0|1 -> 1, 1|0 ->1, 1|1 -> 1
0^0 -> 0, 0^1 -> 1, 1^0 ->1, 1^1 -> 0
なのだから、
1+0 -> 1, 1-1 -> 0, 1*1 ->1
規定するまでもなく、ビットの列は保証されてるんじゃないの?
言葉が抜けてたので訂正 1+0 -> 1, 1-1 -> 0, 1*1 ->1 等と同様に、規定するまでもなく、ビットの列は保証されてるんじゃないの?
>>207 >負の>>は処理系依存。
ついでに負数回およびbit幅以上のシフトは未定義
>オーバーフローはどうする?
自分で気をつける。まあ遊びだよ
>>208 ちょっと混同していた。Cではそうなってるね
何も書かれていないのはC++のほうだった。見落としかもしれないけど
え、そうなの? 例えば Standard C で 0&1 == 0 って保証されている?
特殊な処理系はほっといて、結論は inline void swap(int &a, int &b){ a^=b^=a^=b;} がマクロの罠回避で最強ということでよろしいか?
>>211 0は全てのビットが0である事が保証されている
また、0&1のビット演算に使用される型と==0の比較に使用される型は
等しいはすなので、その結果は0になると思われるけど…間違ってたらスマソ
>>211 いやそれは処理系依存だろうと思う。単に
each bit in the result is set if and only if each of the corresponding bits
in the converted operands is set
となっているだけだから。
ていうかお前らISO+IEC+9899-1999.pdf持ってないのか?
俺が超絶探査能力で見つけてやったぞ。有り難く思え
honors.tntech.edu/~will/iso_9899:1999.pdf
いいのかなあ?しーらないっと。
>>212 だから未定義だといっとるだろうが!!!!
>>213 探すの疲れたから代わりにやってくれ
>>214 Standard C
ttp://www-ccs.ucsd.edu/c/ では
Each bit of the result is set if the corresponding bits in both X and Y are set.
となってるわけだが、
>>213 > 0は全てのビットが0である事が保証されている
こっちを見つけることが出来なかった。
もちろん普段はプラットフォームが分かってるから仮定して書いてるけど、
仕様がどうなってるかは知っておきたいなあ。
>>215 単純にソースレベルでの整数の'0'は保証されてたはず…
ただ、-0が存在する処理系で例えば
((a-a)&1==0)
が、どうなるのかは分からない…
>>206 #include<stdio.h>
int main(int argc, char **argv){
int i,j;
if(!(argc==3)){
printf("二つにしてください\n");
return 0 ;
}
sscanf(argv[1],"%d",&i);
sscanf(argv[2],"%d",&j);
printf("%d\n",i+j);
return 0;
}
>217 ありがとうございます
パイを10000桁表示するプログラムお願いしますm(__)m
10000桁分文字として持つか、 多倍長計算でマチンの公式あたりで。
>>221 ちゃうで
なんとなく多倍長のやりかた知りたかったんで
宿題じゃないなら自分でやれ
誰かラウンジの宿題のソースの95の問いに答えてくれませんか?
オレニマカセロ!
う、制限書くの忘れてた 変数使用不可、標準ライブラリー関数3種類(4箇所で使う)でした 217さんごめんなさい
ラウンジの宿題のソースの95って何ぞや?
229 :
デフォルトの名無しさん :03/06/22 02:49
231 :
デフォルトの名無しさん :03/06/22 02:52
文字で足して'0'引くとか。
232 :
デフォルトの名無しさん :03/06/22 02:53
atoi
>>231 "文字列"も変数やて
それに、
>>206 はコマンドラインから入力を受け取ると思うのだが
argc と argv が使えないから、俺の頭では不可能
最近の若い者は標準入力も知らんのか… ./a.out < input.txt
argc, argvは使わないと出来ないだろう。
237 :
デフォルトの名無しさん :03/06/22 03:01
./tasizan 10 20 30
>>234 >>206 には、こう書いてあるのだが
>./tasizan 10 20
>./tasizan 10 20 30
確かに、
>>227 に入力方法を変えてはいけないと言う条件は無いな…
int main(const int argc, const char **argv) 変数じゃなくて定数・・・ ダメ?
>>239 グッジョブ
そのネタ、今日一番おもろかった
自分も考えたのですが …できませんTT 皆さんありがとうございました
>>206 ちょっと待て、
変数使用不可と言う条件が不可能なだけで
恐らく、この課題を出された時に、
無条件に全ての変数の使用不可とは言われてないはずだ
つーわけで、もう少し詳しい条件は無いのか?
あ、、 引数以外に変数を使わないこと。 って書いてあります。
245 :
デフォルトの名無しさん :03/06/22 03:23
int main(int argc, char **argv){ if(!(argc==3)){ printf("二つにしてください\n"); return 0 ; } printf("%d\n",atoi(argv[1])+atoi(argv[2])); return 0; }
#include <stdio.h> #include <stdlib.h> int main(int argc, char** argv) { if (argc != 3) { fputs("2つにしてください\n", stderr); return 1; } printf("%d\n", atoi(argv[1]) + atoi(argv[2])); return 0; }
じゃあ puts("2つにしてください");
みなさんありがとうございます だんだん分かってきました 自分まだまだ勉強不足です。もっと勉強します
>>249 stdinもstdoutもstderrも
全部freopen()出来なかったっけ?
なあみんな、よく問題の条件について不毛なやり取りがあるが、次スレから
>>1 に
「問題文は出されたそのままを書きやがれ。
てめえの足りねえ頭で解釈した内容を書くんじゃねえぞゴルァ」
ってかいといたほうがよくない? ま、それでも不毛なやり取りはなくならんだろうけど。
>>252 全文が長すぎる場合に、そのまま全て書かせるのもどうかと…
254 :
デフォルトの名無しさん :03/06/22 07:10
>>229 問題の意味がわからん。ファイアーエムブレムなどで移動できる位置が明青化する
けど、あれの事?
>>217 > if(!(argc==3))
なぜif(argc!=3)と書かないの?
>>256 A*アルゴリズムを使って、最短距離探索プログラムを
組んでくれって言ってるんじゃない?
正直、A*アゴリズムが分からないんです。グーグルだと、*が文字と識別 されないみたいだから、調べられないし。ファイアーエムブレムだと、 スタート:0,0 ゴール:4,0 コスト 草:1 森:2 山:4 \01234 0草草草草草 1山山山山草 2山草山森森 3山山森森草 4草草草草草 最短の道順は 0,1 1,1 2,1 3,1 4,1 4,0==12見たいにやるのですが。 惜しいのは、真下に行く==13、大きく回りこむ==13。
標準入力からEOFになるまでいくつか数字のデータを入力して、 そのデータを配列に格納したいのですが、 データがいくつ入力されるのか分からないので、 配列をどのくらいの大きさで宣言すればよいのか分かりません。 そこでmallocでまずメモリを動的に確保して、 データが入力されるたびにreallocでメモリを増やすことを考えたのですが、 1回1回データが入力されるたびにreallocを呼び出すので、 なんだか効率が悪そうで気分が良くありません。 これを解決する何かよいアルゴリズムはありませんでしょうか。 それとも諦めて、多少メモリの無駄遣いにはなりますが、 最初から大きめに配列の大きさを宣言しておくのが良いのでしょうか。 C言語でお願いします。
配列でなくてもいいならリストにするとか。
>>260 よく使われるのは足りなくなった時に現在の2倍reallocする方法
128,256,512,1024,...などなど
>>257 最初argc==3の時の処理を書こうと思ってすぐ思い直したら
自然にそうなってた。そういうことない?
質問させてください。 問題自体はよくある西暦・月・日を入力し、 その日の曜日を出力しなさいというプログラムなのですが、 配列や関数などは使わずにif・for・swich-case(breakを使って抜けてはいけない) と、言う制限がついています。 宜しければ、どなたかヒントをご教授いただけないでしょうか。 ちなみに言語はCです。 宜しくお願いします。
俺もわかりません。 関連ホームページみてもさっぱりです。 どなたか ば〜〜〜ん と答えお願いします。
> (breakを使って抜けてはいけない) すごいな
>配列や関数などは使わず 文字列定数はarray of charだがどうするんだ。 printfもscanfも使えないぞ。あっそれ以前に関数が使えないんだった
>>271 関数が使えないのだからprintfは最初っからつかえないのでokとか。
入出力どーすんだろね。
はっ、しまった…関数はOKです…_| ̄|○
switch-caseでbreak使うなというのもすごいな
制限が厳しすぎて俺には難しい オマエニマカセタ
276 :
デフォルトの名無しさん :03/06/22 17:33
break使うなとなると・・・・returnやgotoか?
関数の集まりのCで関数使うなってのは・・・
習ったif・for・swich-case-break文のみで出来るといわれたので…。 gotoは聞いた事がないので使ってはダメだと思います(^^;
オレニマカセルナ!
>>268 #include<stdio.h>
#include<ctype.h>
#include<locale.h>
#include<wchar.h>
int main(){
int c,y=0,m=0,d=0,day;
wchar_t wc=0;
setlocale(LC_ALL, "japanese");/*ここだけは駄目だった*/
for(;c=getchar(),isdigit(c);y*=10,y+=c-'0');
for(;c=getchar(),isdigit(c);m*=10,m+=c-'0');
for(;c=getchar(),isdigit(c);d*=10,d+=c-'0');
if(m<3) m+=12,y--;
day=(y+y/4-y/100+y/400+(13*m+8)/5+d)%7;
switch(day){
case 0: wc+=L'日'-L'月';
case 1: wc+=L'月'-L'火';
case 2: wc+=L'火'-L'水';
case 3: wc+=L'水'-L'木';
case 4: wc+=L'木'-L'金';
case 5: wc+=L'金'-L'土';
case 6: wc+=L'土';
}
putwchar(wc);
return 0;
}
ワイド文字まで持ち出してきたか・・・・
変な条件つけてやる宿題がはやってんのか? そんなことやったって意味無いだろうに。ご愁傷様。
>>268 main関数を「使って」いることにはならんのかな。
呼び出さなければ定義するのは問題ないのか?
>>285 さん
今までやってきた問題では、最初は
#include<stdio.h>
int main (void)
{
}
return 0;
と、言った感じでした。
って、これが質問の答えになっているかどうかわからないですが(汗
なんでそんなところにreturnが
>>281 曜日を表示したあとにreturnじゃだめなの?
「学校の宿題」って色々だな
曜日は英語でもいいんだからsetlocaleやワイド文字は必要ないと思う。
#include<stdio.h> #include<ctype.h> int main(){ int c,y=0,m=0,d=0,day; for(;c=getchar(),isdigit(c);y*=10,y+=c-'0'); for(;c=getchar(),isdigit(c);m*=10,m+=c-'0'); for(;c=getchar(),isdigit(c);d*=10,d+=c-'0'); if(m<3) m+=12,y--; day=(y+y/4-y/100+y/400+(13*m+8)/5+d)%7; switch(day){ case 0: putchar('S');putchar('U');putchar('N');return 0; case 1: putchar('M');putchar('O');putchar('N');return 0; case 2: putchar('T');putchar('U');putchar('E');return 0; case 3: putchar('W');putchar('E');putchar('D');return 0; case 4: putchar('T');putchar('H');putchar('U');return 0; case 5: putchar('F');putchar('R');putchar('I');return 0; case 6: putchar('S');putchar('A');putchar('T');return 0; } return 0; }
puts、printfを使っちゃダメなのか? swich-case-breakはOKなんだから、returnしなくてもいいし。
配列禁止
>>292 >>268 breakで抜けてはならない。
文字列定数は配列だから使用不可ということで。
あ、printfとscanfは勿論OKですー(汗
breakを使うなというのが、そもそもおかしな話だな。
>>296 同意。いくらなんでも〜の感が、おそらく釣りでしょう。
あ、すみません。 「絶対使うな」ではなく出来れば使うなでした…。 話をややこしくしてしまったすみませんでした(汗
むー…。 やはり無理でしょうか…。
だから問題は全文きちんと写せとあれほど・・・
見えますが…でも、上記のプログラムはstidio.h以外を使っているので…。 スレ汚しすみませんでした。
問題は 「西暦・月・日を入力し、 その日の曜日を出力しなさいというプログラムを 配列を使わずに、組め。」 だろ?違うのか?だったら>291でいいじゃん。 気に入らなきゃ、さっさと問題を直せ。
まあまあ #include <stdio.h> int main(){ int y,m,d,day; printf("year/month/date>"); scanf("%d/%d/%d",&y,&m,&d); day=(y+y/4-y/100+y/400+(13*m+8)/5+d)%7; switch(day){ case 0:printf("日曜日\n"); break; case 1:printf("月曜日\n"); break; case 2:printf("火曜日\n"); break; case 3:printf("水曜日\n"); break; case 4:printf("木曜日\n"); break; case 5:printf("金曜日\n"); break; case 6:printf("土曜日\n"); break; } return 0; }
swichが嫌ならテーブル使えよ
>>307 がんばって、配列を使わずにテーブルを作ってね
309 :
デフォルトの名無しさん :03/06/23 02:17
前スレの316が見たいけどもう見れない。 名前とIDのやつね。 だれか教えてくれ。
typedef struct { char* sun; char* mon; char* tue; char* wed; char* th; char* fri; char* sat; }TABLE; TABLE t = {"月曜日","火曜日","水曜日","木曜日","金曜日","土曜日"}; /* dayに0-6が入ってる */ char* p; p = (char*)&t + (day*sizeof(char*)) printf("%s"p);
日曜日入ってなかった
315 :
デフォルトの名無しさん :03/06/23 06:38
アラインメント以前に間違っている。
317 :
デフォルトの名無しさん :03/06/23 07:26
>>268 使ってくれ
#include <stdio.h>
int main(void)
{
int y,m,day,d;
scanf("%d/%d/%d",&y,&m,&day);
if (m == 1 || m == 2) {
y--;
m += 12;
}
d = (y + y/4 - y/100 + y/400 + (13*m+8)/5 + day) % 7;
switch(d){
case 0:
puts("日");
case 1:
if(d) puts("月"); d = 0;
case 2:
if(d) puts("火"); d = 0;
case 3:
if(d) puts("水"); d = 0;
case 4:
if(d) puts("木"); d = 0;
case 5:
if(d) puts("金"); d = 0;
case 6:
if(d) puts("土"); d = 0;
}
return 0;
}
318 :
デフォルトの名無しさん :03/06/23 07:29
関数使いたいプログラムの典型です。
switch意味無いところにワラタ
「関数使いたいプログラム」って何だろう
文字列は文字配列でつよ
性格悪いな
問題が悪いんだよ
>>291 ,306,317さん
ありがとうございます。
とても助かりましたー。
これで課題1はなんとかなりそうです。
それよりなんで低レベル関数を使うの?
328 :
デフォルトの名無しさん :03/06/24 02:01
与えられた文字列をコマンドラインを使って読み込み、 出力する宿題が出たのですが途中で改行が入っていて、うまく読み込むことができません。 どうすればいいのでしょうか? どなたか教えてください。
コマンドラインから
>>328 「コマンドラインから与えられた文字列を読み込み」ならわかるんだが・・・
与えられた文字列ってどこから与えられた文字列?標準入力でいいの?
333 :
デフォルトの名無しさん :03/06/24 02:36
途中で改行が入っていて上手く読み込めないって、どういう状況が良く分からないんだけど。
>>335 パイプから与えられるという意味では…
# 多分曲解
すいませんせ。 説明が悪かったです。 12345 67890 absde fghij klmno pqrst uvwxy z ↑をコマンドラインで読み込ませたいのですが、 うまくいきません。 どうしたらいいのでしょうか?
あなたはどういうプログラムを書いて、 どういう結果になったの?
あと、プログラムはどうやって実行させるのか。
何をやって、何を期待して、どう期待と違っていたのか君にはわかるのだろう。 しかし君だけわかっていてもわしらにわかるわけないぞ。
>>338 #include<stdio.h>
int main(int argc,char *argv[])
{
int i;
for(i=0;i<argc;i++)
printf("%s\n",argv[i]);
return 0;
}
実行結果は
% comandline 12345 67890
comandline
12345
67890
% absde fghij
absde: Command not found.
% klmno pqrst
klmno: Command not found.
% uvwxy z
と、なりました。
とりあえず 12345 67890 absde fghij klmno pqrst uvwxy z を data.txt っていうテキストファイルにして プログラムと同じディレクトリに置いて %commandline < data.txt と実行して味噌
あごめん、そのプログラムじゃ無理だった。 どーも、問題の理解の仕方がおかしいよ。 宿題の問題を全文書いて味噌。
>>342 % ./commandline '12345 67890
absde fghij
klmno pqrst
uvwxy z'
commandline
12345 67890
absde fghij
klmno pqrst
uvwxy z
%
>>343 % comandline < data.txt
commandline
%
と、なりました。
俺の中のエスパーによるとargvを全て表示しているようだ
結局、宿題じゃなかったということだな
#include <stdio.h> #include <stdlib.h> #include <io.h> #include <fcntl.h> #include <sys/types.h> #include <sys/stat.h> #pragma pack(push,1) typedef struct BITMAPFILEHEADE{ unsigned shortFileHeader; unsigned intFileSize; unsigned shortReserved1; unsigned shortReserved2; unsigned intOffset; }BITMAPFILEHEADER; typedef struct BITMAPINFOHEADER{ unsigned intStructureSize; signed intImageWidth; signed intImageHeight; unsigned shortPlaneCount; unsigned shortBitPerPixel; unsigned intCompression; unsigned intImageSize; signed intXPixelPerMeter; signed intYPixelPerMeter; unsigned intColorTable; unsigned intImportantColor; }BITMAPINFOHEADER;
typedef struct RGBQUAD{ unsigned charBlue; unsigned charGreen; unsigned charRed; unsigned charReserved; }RGBQUAD; typedef struct BITMAP{ BITMAPFILEHEADERBitmapFileHeader; BITMAPINFOHEADERBitmapInfoHeader; RGBQUAD*RGBQuad; }BITMAP; #pragma pack(pop)
うっぜーな。 先ず何がしたいのか書けよ。
boolLoadBitmapFile( BITMAP*Bitmap, char*FileName) {intFileHandle,X,Y,Index; RGBQUAD*Pallete; FileHandle= open(FileName,O_BINARY | O_RDONLY); read(FileHandle,&Bitmap->BitmapFileHeader,sizeof(BITMAPFILEHEADER)); read(FileHandle,&Bitmap->BitmapInfoHeader,sizeof(BITMAPINFOHEADER)); Bitmap->RGBQuad= (RGBQUAD*)malloc(sizeof(RGBQUAD) * Bitmap->BitmapInfoHeader.ImageWidth * Bitmap->BitmapInfoHeader.ImageHeight); switch (Bitmap->BitmapInfoHeader.BitPerPixel) { case 32: for (Y = 0; Y < Bitmap->BitmapInfoHeader.ImageHeight; Y ++) for (X = 0; X < Bitmap->BitmapInfoHeader.ImageWidth; X ++) read(FileHandle,&Bitmap->RGBQuad[Bitmap->BitmapInfoHeader.ImageWidth * Y + X],sizeof(RGBQUAD)); break; case 24: for (Y = 0; Y < Bitmap->BitmapInfoHeader.ImageHeight; Y ++) for (X = 0; X < Bitmap->BitmapInfoHeader.ImageWidth; X ++) { read(FileHandle,&Bitmap->RGBQuad[Bitmap->BitmapInfoHeader.ImageWidth * Y + X].Blue,sizeof(unsigned char)); read(FileHandle,&Bitmap->RGBQuad[Bitmap->BitmapInfoHeader.ImageWidth * Y + X].Green,sizeof(unsigned char)); read(FileHandle,&Bitmap->RGBQuad[Bitmap->BitmapInfoHeader.ImageWidth * Y + X].Red,sizeof(unsigned char)); Bitmap->RGBQuad[Bitmap->BitmapInfoHeader.ImageWidth * Y + X].Reserved= 0; if (X == Bitmap->BitmapInfoHeader.ImageWidth - 1 && Bitmap->BitmapInfoHeader.ImageWidth % 4) { switch (Bitmap->BitmapInfoHeader.ImageWidth % 4) { case 3: lseek(FileHandle,1,SEEK_CUR); case 2: lseek(FileHandle,1,SEEK_CUR); case 1: lseek(FileHandle,1,SEEK_CUR);}}} break;} close(FileHandle); free(Pallete); return true; }
新手の荒らしか?
intmain
intArgCount,
char*Argument[])
{
BITMAPBitmap;
if (ArgCount != 2) return 0;
LoadBitmapFile(&Bitmap,Argument[1]);
return 0;
}
やっぱりこっちに貼っておきます。
BMP画像を読み込もうとしていますが、動きません。
コンパイルはできるのですが・・・。
できるだけこれに近い状態で作りたいです。
>>327 ハイレベルでもC言語なら問題ないです。
>>352 申し訳ないです。
326への回答か?
>>357 このプログラムの実行結果はどうなるの?
>>358 問題が発生したためTest.exeを終了します。って出ます。
>>326 読み込むだけなら、いろいろ計算せずに、こんな感じでいけると思うんだけど。
BITMAPFILEHEADER fileHeader;
char *buff;
int bodySize;
BITMAPINFO* bitmapInfo;
RGBQUAD*rgbuad;
char* data;
// とりあえずヘッダーだけ読む
read(fh, &fileHeader, sizeof(fileHeader));
// 残りを読み込むバッファを確保
bodySize = fileHeader.FileSize - sizeof(BITMAPFILEHEADER);
buff = (char*) malloc(bodySize);
// 残りを一気に読み込む
read(fh, buff, bodySize);
// BITMAPINFO の開始位置を計算
bitmapInfo = (BITMAPINFO*) buff;
// RGBQUAD の開始位置は計算
rgpQuad = (RGBQUAD*) (buff + sizeof(BITMAPINFOHEADER));
// ビットマップデータの開始位置を計算
data = buff + fileHeader.Offset - sizeof(BITMAPFILEHEADER);
// あとは、bitmapInfo, rgbQuad, data を利用して好きに料理する
>>326 =353
Palleteを何も使ってないのにfree()に渡しているのが異常終了の原因。
#ふっ、出勤前の貴重な仮眠時間を消費しちまったぜ。
任意の3元連立1次方程式を与えPivot選択を考慮した Gaussの消去法を用いて解くCの宿題を教えてくれないか tu-ka自力じゃ全くワカンネ
>>362 >うまく読み込めてないです
とはどういう状態だ?
小さ目の画像でテストするとして、例えばLoadBitmapFile()内の
YとXのループがちゃんと必要な回数回っているか、
ループから抜けた時点でファイルポジションが予想通り進んでいるか、
などなど自分でチェックできることは山ほどあるだろ?
>>363 みたいな奴って、すごくムカツクんだけど・・・
全くとかさっぱりとか言ってる奴を相手する時は、 何一つ文句の付けようのない完璧な答を出しましょう。 さもないと粘着される恐れがあります。 皆さん気をつけましょう。
てか、回答を求めているのではなく「宿題を教えて」というのだから、 363に該当する例題文を教えてあげれば( ̄ー ̄)
>>371 ---
次のような宿題が出されたのですが、どうしてもやりかたが解りません。
もし良かったら、助けてもらえませんか?
・任意の3x3(X)と1x3(Y)の実数行列を与える。
・これを、Pivot選択を考慮して、Gaussの消去法による連立方程式のプログラムを作成せよ。
・なお使用する言語は、C言語(Machine C除く)とする。
よろしくおねがいします。
---
これでいいでしょーか?
ダメ :-P
実数値のデータの配列(a)と、それに含まれるデータ(実数値)の個数n(10以下の自然数) を受け取り、そのデータの平均値を返す関数average(a, n)を作れ。 また、average()を用い、データの分散を返す関数variance(a, n)を作れ。 更にvariance()を用い、データの標準偏差(standard deviation)を計算する関数SD(a, n)を作り、 まず 1. データの個数(10以下) 次に 2. 各データの値(実数値) を入力すると、そのデータの平均値、分散、標準偏差を表示するprogramを作りなさい。 Cでお願いします。
double average(a, n) { double s = 0; int i; for (i = 0; i < n; i++) { s += a[i]; } s /= n; return s; } めんどくせ
>>375 #include <stdio.h>
#include <math.h>
double average(double *a, int n)
{
double sum; int i;
for(sum=0,i=0;i<n;i++) sum+=a[i];
return sum/n;
}
double variance(double *a, int n)
{
double ave,sum; int i;
ave = average(a,n);
for(sum=0,i=0;i<n;i++) sum+=(a[i]-ave)*(a[i]-ave);
return sum/(n-1);
}
double SD(double *a, int n) { return sqrt(variance(a,n)); }
int main()
{
int n,i;
double *a;
printf("データの個数(10以下)>");
scanf("%d",&n);
a=malloc(n*sizeof(double));
for(i=0;i<n;i++){
printf("各データの値(実数値) [%d]>",i+1);
scanf("%lf",a+i);
}
printf("平均値:%f 分散:%f 標準偏差:%f\n",average(a, n),variance(a, n),SD(a, n));
return 0;
}
378 :
デフォルトの名無しさん :03/06/24 19:16
データは、ID,姓名,読み(ローマ字)である データの例 001,太郎,tarou/xxxx(xxxx)\n 002,次郎,jirou/xxxx(xxxx)\n 003,一郎,ichirou/xxxx(xxxx)\n 004,三郎,saburou/xxxx(xxxx)[EOF] データを格納した構造体を節点とする2分木を作成するプログラムをかけ.新しいデータを 一行ずつ構造体に読み込んで,木に追加していくこと.必ずポインタを使って木を実現し, データが増えても対処できるようにすること. また,すべての節点をなぞりながら,データ(ID,姓名,読み)を出力できるようにもせよ. その際できるだけ見やすい形に表示するよう工夫すること.
379 :
デフォルトの名無しさん :03/06/24 19:42
二つの変数の和と積を比較して、大きい値を表示させるプログラム を教えてください。
380 :
デフォルトの名無しさん :03/06/24 19:57
>>379 int test(int x,int y)
{
int t = x+y , j = x*y;
return t<j ? j : t;
}
381 :
デフォルトの名無しさん :03/06/24 19:57
rand()を使わずに、 乱数を返す関数を作るには時間を利用するしか手はないのでしょうか?
382 :
デフォルトの名無しさん :03/06/24 20:00
#include <stdio.h> int main(void){ int hensuu1,hensuu2,i,j; printf("整数を入力しやがれ\n"); scanf("%d",&hensuu1); scanf("%d",&hensuu2); i=hensuu1+hensuu2; j=hensuu1*hensuu2; if(i<j){ printf("%d",j); } else if(j<i){ printf("%d",i); } else{ printf("和も積も同じ値です"); } }
文字列として読み込まれた16進数を整数値に変換する関数int conv16(char str[])を作成しなさい。 例えば、main関数内で16進数字をscanfの形式で標準入力させ(A5と入力したとする)、 conv16(char str[])を実行するとその戻り値が165となる。 お願いします
384 :
デフォルトの名無しさん :03/06/24 20:26
3025を9で割ったあまりを表示するプログラム をお願いします。
>>383 #include <stdlib.h>
int conv16(char str[])
{
return strtol(str, NULL, 16);
}
>381 seedをどう決めるかという話なら、時間なり好きなものを使えばいい。 randの代替物がほしいなら、自分で線形合同法なりMTなりを 実装すればよろし。
>>384 #include <stdio.h>
int main(void)
{
int a;
a=3025%9;
printf("%d",a);
}
>>384 #include <stdio.h>
main(){printf("%d\n", 3025 % 9);}
>>384 #include <stdio.h>
main(){return printf("%d\n", 3025 % 9);}
391 :
デフォルトの名無しさん :03/06/24 20:48
データ3コa,b,cをキーボードより入力し もっとも大きい値を出力するプログラムを作れ。ただしif文を使うこと。 お願いします。
データはなんなのか・・・教えてエスパー
適当な整数です。すんません。
#define maxof(a,b) ((a)>(b)?(a):(b)) printf("%d", maxof(maxof(a,b),c)); // (・∀・)イイ!!
/:::::::::::::::::::::/ \::::::::::::::::::::::::: /::::::::::::::::::::/ \::::::::::::::::::::::: /:::::::::::::::::::/ \:::::::::::::::::::: /::::::::::::::::::/ ,,,,-―''`\:::::::::::::::::: |:::::::::::::::::/,,,,,, '' _ ヽ::::::::::::::::: . |::::::::::::::::/ ヽ ∠'-' ` \::::::::::::: |:::::::::::::::/ ,-、-、 l ヽ |::::::::::::::: . |::::::::::::::| `´ | |:::::::::::::::: ヽ,-―_| | __,- ) |:::::::::::_/ // ̄ヽ /⌒ リ \ |:::::::/ ̄\ / /:::糸工::\ _ _ ) /::::::/ / >'つ:::::::イ::::::::ヽ ヽ/,ー―-ヽ /::::/ / ( < \:::モ::/~~\(::::::::::_/ / ̄ / ) ̄ ̄ヽ:::/:::::::::::::::\⌒ / / \ ̄ ̄\ if文使いなさいよ♥
#define maxof(a,b) ((a)>(b)?(a):(b)) if (1) printf("%d", maxof(maxof(a,b),c));
398 :
デフォルトの名無しさん :03/06/24 21:15
入力された式を 入力された積分範囲で積分してその値を 返すプログラムを作れとのことです。 エキスパートの皆様お願いします。 提出が明日なので、なるべくはやいとうれしいのですが。
401 :
デフォルトの名無しさん :03/06/24 21:17
欲しがりません勝つまでは。
>>398 入力された式を解析して、関数として呼び出せるようにするプログラムを用意してくれたら作ってやる。
何だか今日は阿呆が多いですな
とかいいながら誰もわからないという罠w
遅くなりましたが、ありがとうございました。
>>398 実行時に式を入力するなら難。
そうでなければ
#include <iostream>
#include <math.h>
using namespace std;
double func(double x)
{
return x; // y = x
}
int main()
{
double sum = 0.0;
double a, b, dx; cin >> a >> b >> dx; // 入力のチェックはご自分でどうぞ。
for(double i = a;i<b;i+=dx)
sum += dx * func(i);
cout << "integral=" << sum << endl;
return 0;
}
@4行4列の行列に値を代入(各自適当な値でいい) ALU分解する [L][U] BA=LUとなることを確認する。(掛け算) C右辺bを与え、LとUをもちいて、AX=bの解であるxを求める[x] DAX=bが正しく計算できているか確認。 以上のようなプログラムを作成せよ。 どなたかおねがいします。
>>407 式のまんまふつーに積分できるプログラムが
出来たら特許が取れると思われ。
410 :
デフォルトの名無しさん :03/06/24 21:44
412 :
デフォルトの名無しさん :03/06/24 21:50
以下のデータを年号順にソートするのはどうやるのでしょうか・・・ 和暦,年,正・散,役職,正・従,位, ,公家名,家格,元家,名前,年齢,天皇,備考 天正,18,散,前権大納言,正,2, ,庭田,羽林家,源,重保,66,後陽成,按察使。 慶長,2,正,権中納言,正,2, ,水無瀬,羽林家,藤原,兼成,84,後陽成, 文禄,5,正,参議,従,3, ,高倉,半家,藤原,永孝,37,後陽成, 文禄,3,散,前左大臣,従,1, ,二条,摂家,藤原,昭実,39,後陽成,前関白。 文禄,3,正,権中納言,従,2, ,広橋,名家,藤原,兼勝,37,後陽成, 天正,15,正,権大納言,正,3, ,徳川,武家,源,家康,0,正親町,八月八日任同日従二位。 天正,15,散,非参議,従,3, ,大中,分類外,大中,時宣,84,正親町,春日社神主。 慶長,12,正,参議,正,3, ,六条,羽林家,源,有広,44,後陽成, 慶長,14,正,権大納言,正,2, ,花山院,清華,藤原,家熈,52,後陽成,
413 :
デフォルトの名無しさん :03/06/24 21:52
>>412 和暦を西暦に変換するテーブルをつくる
んで西暦をキーにしてソート
>>410 三角関数(sin, cos, tan)とか、指数・対数関数(log, ln, exp)が出てきても公式に当てはめるだけで
できるわけだな。
>>411 調べてみる。
416 :
デフォルトの名無しさん :03/06/24 22:16
誰か378お願いします
うんざり
過去ログで勘弁してくれ
>>132 #include <memory.h>
// LU分解のみを行う 結果を am に統合して出力
void LU44(double * am/* 4*4 */, double * m/* 4*4 */)
{
inti,j,k;
memcpy(m, am, sizeof(double)*16);
for(i=0; i<r-1; i++) for(j=i+1; j<4; j++){
am[j*4+i]=am[j*4+i]/am[i*4+i];
for(k=i+1; k<4; k++){
am[j*4+k]=am[j*4+k]-am[j*4+i]*am[i*4+k];
}
}
}
//LU分解され統合された行列 m と右辺列ベクトルである cm から連立一次方程式を解く
void mLUse(double * am/* 1*4 */, double * bm/* 4*4 */, double * cm/* 1*4 */)
{
inti, j;
memcpy(am, cm, sizeof(double)*4);// L*y=b: calc y
for(i=1; i<r; i++) for(j=0; j<i; j++){
am[i]=am[i]-m[i*4+j]*am[j];
}
for(i=r-1; i>=0; i--){
for(j=4-1; j>i; j--){
am[i]=am[i]-m[i*4+j]*am[j];
}
am[i]=am[i]/m[i*4+j];
}
}
ありゃ、中途半端な状態ではっちゃったわ。 また張りなおす。 じゃ、また。
422 :
デフォルトの名無しさん :03/06/24 22:39
>>418 >>420 ちゃんと表示できないのですが…もしよければ実行結果を書き込んでくださいませんか?
>>422 二週間前から同じ問題書きつづけて420まであるのに分からないとは
もうだめぽ
#include <memory.h> // LU分解のみを行う 結果を am に統合して出力 void LU44split(double * am/* 4*4 */, double * m/* 4*4 */) { int i,j,k; memcpy(m, am, sizeof(double)*16); for(i=0; i<4-1; i++) for(j=i+1; j<4; j++){ am[j*4+i]=am[j*4+i]/am[i*4+i]; for(k=i+1; k<4; k++) am[j*4+k]=am[j*4+k]-am[j*4+i]*am[i*4+k]; } } //LU分解され統合された行列 bm と右辺列ベクトルである cm から連立一次方程式を解く void LU44solve(double * am/* 1*4 */, double * bm/* 4*4 */, double * cm/* 1*4 */) { int i, j; memcpy(am, cm, sizeof(double)*4); for(i=1; i<4; i++) for(j=0; j<i; j++){// L*y=b: calc y am[i]=am[i]-bm[i*4+j]*am[j]; } for(i=r-1; i>=0; i--){ // U*x=y: calc x for(j=4-1; j>i; j--) am[i]=am[i]-bm[i*4+j]*am[j]; am[i]=am[i]/bm[i*4+j]; } } 多分これでいい(確認はしてない)。まえ〜に作った任意の行列用のものを適当に4*4にしたから 間違ってる可能性も高い。そこは何とかしてくれ。ちなみに上位三角行列と 下位三角行列(対角要素が1になるようにしている)で後者の対角要素が1なもんで これを一つにして am に出力している。ってことでL*U=Aの確認とかは適当にやってね。
LU44splitのほう memcpy(am, m, sizeof(double)*16); ね あと行列は行を1行目から4行目まで連ねてdoubleの配列にしているからね。 なんか俺、ちょろっと書いて済まそうと思ったのにずいぶん必死だよ〜
>>422 どう表示されない?
確かに%sの精度指定にバグがあった。
でも修正してからは、期待した通りに表示できてるぞ。
こちらが実行結果を書き込んだからといって、解決する問題じゃないと思うが…
それともソースを書き込んであるサイトが表示できんのか?
--R--とかいうのは横にのびすぎて見やすくないと思うからやらんぞ。
>>420 はやさしいな
アルゴリズムの本買えば例題として載ってるような問題なのに
>>424 for(i=r-1; i>=0; i--){ // U*x=y: calc x
ここのr は4だな
429 :
デフォルトの名無しさん :03/06/24 23:16
データファイルが以下のように与えられている。 -------------------------------- 1 sapporo 2 tokyo 3 osaka 4 fukuoka -1 1 2 894 1 3 1161 2 3 514 2 4 1041 -1 -1 0 ----------------------- このとき出力が sapporo→tokyo : 894 sapporo→osaka : 1161 tokyo→osaka : 514 tokyo→fukuoka : 1041 となるようなプログラムを作れ。 この問題が分かりません。誰か教えて下さい。
隣接リストつくってそこに蓄えろ
-1を目印にしてひたすら読め
問題くらいはちゃんと理解して提示してくれなけりゃ、 どうしようもないな。
1 サブ関数にポインタを使う 2 サブ関数に配列を使う 3 サブサブ関数を使う。 この3つに対してべつべつに組むか、一つにまとめるかは任意。 関数の中身は自由。 よろしくおねがいします
435 :
デフォルトの名無しさん :03/06/24 23:28
>>434 サブ関数とサブサブ(?)関数を1つにまとめたら
サブ関数の1つしか無くなるから、明らかに>3に反するだろ
サブ関数てのは関数内関数のことか?
>>437 サブ関数と言うのは関数名や変数名が
なにやら妖しげな単語に…コレ以上恐ろしいので勘弁
>>436 では、別々に組むしかないというわけですね。
>>437 おそらくそうだと思います。
講義中にはmain以外に、int subとか void subという文章が出現していたので。
では、別々に1つずつお願いします。
int やらないか?(char* str); やらないか?("ウホッ!いい男");
#include<stdio.h> int sub ( ) { return 1; } int main ( ) { printf("sub()= %d\n",sub()); return 0; } 自分なりにやってみました、これは434の1をみたしてますか? これを基準に他の二つを作れないでしょうか…?
>>441 ええ、それは、もう、標準なC等では無いです
何しろ、相手は…
>>442 こっちでした #include<stdio.h>
int sub (int *x)
{
*x=10;
return *x;
}
int main ( )
{
int a=5;
printf("a=%d,sub(a)=%d \n",a,sub(&a));
return 0;
}
subのアニキは何がしたいんだと
>>447 448
忠告ありがとうございます。
では、どのようにすればよいのでしょう?
Visual studio.net で、画像を表示させるプログラムをオリジナルで作らなきゃいけないんですが。 作っていただけますか? あと、参考プログラムの説明をするために、一行一行説明文を入れなきゃいけないんですよ。 で、それって、どこでお願いすればやっていただけるでしょうか? 昼までなんですけど。。。
>>450 どこかは知らないが、ここじゃないのは確か。
両方とも
えっと、他の所で聞いてみます。 マルチじゃないですよ。ではありがとうございました。
.NETスレで聞いたほうがいいかも ていうか画像を読んで表示なんて今時のクラスライブラリなら一発でできるかと
>>455 えっと、本当はVisual studioのCだったらなんでもいいです。
なんか手製で作れとのことですので・・・
「本当は」とか言ってあとからいろいろ条件を追加変更する奴は嫌いです。
458 :
デフォルトの名無しさん :03/06/25 02:12
正整数を第1引数として受け取り、その数の10の位と1の位の数を それぞれ第2、第3引数(アドレス渡し)に返す関数を作成せよ。 この関数を用い、いくつかの整数を入力し、それぞれの10と1の位の数を表示する。 入力データの終わりは0または負の数が現れたことで判定する。
>>458 Cには値渡ししかありませんが
#include <stdio.h>
void f(int n,int *a,int *b)
{
*a=n%100/10;
*b=n%10;
}
int main()
{
int n,a,b;
for(;;){
printf("正数を入力しる>");
scanf("%d",&n);
if(n<=0) break;
f(n,&a,&b);
printf("%d=[%d %d]\n",n,a,b);
}
return 0;
}
でも入門書にはよくかいてあるね ポインタのコピーが渡るだけなんだが
それをアドレス渡しって言うんじゃないの?
>461 Cでは「データのあるアドレス」の「値渡し」だ。
C以外ではそれとは違った「アドレス渡し」があるの?
>>459 をアドレス渡しと言う。これは渡したいものを主眼とした表現だ。
459,460,462は頓珍漢
FORTRANだと副関数への引数はアドレス渡しだったと思う。 記憶違いだったらスマソ。
>>463 fortranとかだと常にアドレス渡し。逆に値渡しはできない。
コンピュータ言語の歴史をしらないと
>>464 みたいになる。
>>466 FORTRANしらんのでどーもよく分からんのですが。
Cではポインタ引数にアドレスをコピーする。
FORTRANではどうやって渡すの?
「FORTRANではアドレス渡しだった」といわれても、C言語のような渡しかたしか思い浮かばないんだけど。
FORTRANでは「アドレス渡し」とは言わない。
コンピュータ言語を知らないと
>>466 みたいになる。
言葉の上での違いではなく、引数を渡すメカニズムの違いが知りたいのだが。 Cのポインタ渡しと、FORTRANの引数渡しは、どう違うの?
そもそも「アドレス渡し」ってのはマトモな教科書に載ってる言葉じゃない。
普通は call by value, call by reference, call by name だろう。
call by name ってのはあんまり見ないけどね。
ISO/IEC 9899:1999 には call by value しかのってない。
ま、元凶は
>>458 に問題を出したやつってことで。釣りだったのかもしれん。
ちなみにFORTRAN77に call by reference しかないというのは本当。
当然ながら実引数の値が変化しないことは期待できない。例をあげると
x=2
y=f(x)
write(6,*) x,y
end
function f(x)
f=x*x
x=3
return
end
これの実行結果は
3. 4.
つまり2行目で f(x) を読んだあと x は 3.0 に、 y は 4.0 になっている。
C++の参照渡しみたいなもんと思えばいいのかな? それなら分かる。
>>459 がアドレス渡しなのは正しいんだよ
他に整数渡し、浮動小数点渡し、構造体渡しなどがある
>>471 まあそうかも。上の function f だけコンパイルしてCから呼ぶ場合はこうなる。
float x,y;
extern float f_(float*);
x = 2;
y = f_(&x);
なお参照呼びといっても C++ の dereferene operator & のように
参照そのものを扱う方法はFORTRAN77には一切ない。
参照という概念はFORTRAN77ユーザーから隠されている。
またFORTRAN77ではメインルーチンが領域確保に関する一切の責任を持つ。
>>472 ちなみにその言葉はどの教科書に載っているの?なかなか興味深いのだが。
アドレス渡し、ポインタ渡しは慣用表現 十分通じる。実際459にも通じている
なるほど、正しい慣用表現ね。正しい慣用表現それ自体も興味深い概念だ。
まとめると 参照渡:伝統的にPascalの世界のVar渡という用語も良く使われている。 参照渡の引数には変数しか使用出来ない。定数は不可である。 関数・手続き内部で引数変数に与えた処理はすべて呼び出し側で引数と して与えた変数に施される。 一定以上の大きさを持った変数は、通常参照渡でしか渡せないことが普通。 値渡:それほど大きな変数でないプリミティブ型の変数・定数は関数の 引数に値渡で渡すことが出来る。 引数変数を引数で与えた定数・変数の値複製で初期化して関数を実行する ことになる。Pascalのようにstring型のように「大きな」変数も値渡が 出来るような例もある。値渡は、引数として与えるダミー変数の作成を 呼び出し側に義務付けることを強要させることの多い参照渡に較べ 呼び出し側の記述をコンパクトにすることが出来る。 C:引数へのポインタ渡=参照渡と意図的に混同して使われているが あくまでもポインタの値渡なので、取り扱いには通常の意味での参照渡に 加えて留意しなければならない点が増える。(初心者はポインタの演算と、 ポインタが指している内容の演算を混同し正常に動作しないプログラムを 作りがちである。) C++:参照渡(&渡)が存在し利用されている。この場合ポインタ渡と 区別されなければならない。通常の言語の参照渡とほぼ同じ意味になる。 しかしポインタ渡と参照渡では、結果的に生成コードは殆ど違いが無い。
だから〜 アドレス渡し(ポインタ渡し)は引数受け渡し方式の事ではなくて 文字通りの意味なんだってば
釣りじゃなければ、中途半端なつっこみは遠慮してほしい。
479 :
デフォルトの名無しさん :03/06/25 08:16
誰か378お願いします
>>472 アドレス渡し・構造体渡しは通じるが整数渡し・浮動小数点数渡しは微妙。
アドレスや構造体は特定の型に制限する名前じゃなくて引数に渡すときの方法を現してるが、
整数渡しと浮動小数点数渡しは引数の型に着目してるだけだからなぁ。
整数にキャストしたポインタを受け取る関数があったらポインタの整数渡しみたいな表現は出来るかも知れんが。
稀中の稀だし、前二つとは本質的に意味が異なる。
>>477 同意
日本語として、引数にアドレスを渡すからアドレス渡しと呼んで何が悪いって感じだな、
無理に専門用語として解釈する必要もあるまい。
>>476 > 参照渡の引数には変数しか使用出来ない。定数は不可である。
C++は定数でも渡せる場合があるけどね。
関数getchar()を用いて、標準入力からの入力に現れた数字文字 をカウントするプログラムを作成しなさい。 ただし、入力の終了はCtrl+Dによる。
カウントしたらどうすんの? その数だけ、BEEP音でも鳴らすんかな
最後の1行が余計だなぁ・・・
486 :
デフォルトの名無しさん :03/06/25 10:03
出力してください '0'=1,'1'=2,・・・・こういう風にです。
うわ、回数を出力するだろうとは思ったけど、 文字毎の回数を出力するとは思わんかったぞ(w
>3.141592 >'0':0,'1':2,'2':1.....こうですね
そうですね
ということにしt(ry
492 :
デフォルトの名無しさん :03/06/25 10:12
>>487 #include <stdio.h>
#include <stdlib.h>
int main()
{
int a[10]={0},s;
char d[2]={0};
int f;
while((s=getchar())!=EOF){
switch(s){
case '0': case '1':
case '2': case '3':
case '4': case '5':
case '6': case '7':
case '8': case '9':
d[0]=s;
a[atoi(d)]++;
}
}
for(f=0;f<10;f++)
printf("\'%d\'=%d,",f,a[f]);
putchar('\n');
}
テストしていないのであしからず
あ、return 0;を最後の行の前に加えて。
#include <stdio.h> int main() { int c; size_t count[10]={0}; while( ( c = getchar() ) != EOF ) if( '0' <= c && c <= '9' ) ++count[ c - '0' ]; for( c = '0' ; c <= '9' ; ++c ) printf( "'%c':%u " , c , count[ c - '0' ] ); printf( "\n" ); return 0; } '0'から'9'までの並びって保証されてなかったっけ? あと、size_tをprintfで出すのは%uで大丈夫だっけ?
497 :
デフォルトの名無しさん :03/06/25 10:35
>>497 数えるから、普通にsize_tにした。
printf使うときになって気になった。
おとなしくunsignedにしといたらいいのかな。
499 :
デフォルトの名無しさん :03/06/25 10:45
>>498 size_tは配列の大きさなんかを表すときに使うんじゃないか?
(unsigned long) intでいいと思う。
>>496 > '0'から'9'までの並びって保証されてなかったっけ?
文字セットに依存する。が、プログラミング言語C第2版によると、
「幸いこれは通常の文字セットすべてに当てはまる。」
そうだ。
501 :
デフォルトの名無しさん :03/06/25 10:50
>>487 処理系依存でよければ・・・(Ctrl+Dの部分)
#include <stdio.h>
int main(void)
{
int count[10] = {0};
int c;
int i;
do
{
c = getchar();
if((c >= '0') && (c <= '9'))
count[c-'0']++;
}
while(c != 0x00000004);
for(i = 0; i < 10; i++)
printf("'%d':%d,", i, count[i]);
putchar('\n');
return(0);
}
文字列として読み込まれた16進数を整数値に変換する 関数int conv16(char str[])を作成しなさい。 例えば、main関数内で16進数字をscanfの形式で標準入力 させ(A5と入力したとする)、conv16(char str[])を実行 するとその戻り値が165となる。 お願いします
504 :
デフォルトの名無しさん :03/06/25 10:57
>>503 #include <stdlib.h>
int conv16(char str[])
{
return strtol(str,NULL,16);
}
sizeofの型がsize_tなのだそうだ。 ってことで、496のプログラムには不適切、と。
回答が気に食わないなら、どこがどう気に入らないか書けばいいのに、
なぜ、こいつ(
>>479 )とかこいつ(
>>503 )はそれをしないのだろうか
509 :
デフォルトの名無しさん :03/06/25 11:07
2つ(以上)の jpeg 画像ファイルを入力とし、 横に連結した1つの jpeg 画像ファイルを出力するプログラムを書け。 また、指定した位置に連結できるようにもせよ。 なお、perl で書いてもよい。
あ・・・
>>509 どこまでが宿題の範囲だ?
まさかjpegの圧縮展開まで宿題だったら笑うぞ。
てか、C/C++スレで > なお、perl で書いてもよい。 は無いだろ禿(w
jpegのCライブラリってフリーでソースなかったっけ?
宿題を投げる時の決まり
(1)問題文を全て丸写ししてアップせよ。問題が長い時は
>>1 のラウンジを使う。どれが自分の考えや解釈で、どれが提示された文章なのかハッキリさせろ。
(2)自分の程度を示せ。バカと利口では教え方もかえなきゃならない。てっとりばやいのは自分の書いたソースをアップすることだ。
(3)何をどうしたいのか明確に。入力や出力のイメージをハッキリさせろ。
(4)データがあるならそれを書け。テキストファイルから読み込んで、とかいう曖昧なことを言わずに、そのテキストファイルの内容を晒せ。
(5)制限事項は明確にしろ。(1)を守れば問題ないはずだ。プログラムを書いてもらってからあーだこーだとリテイクさせるな。
(6)コメントをつけてくれという要望は却下。ソースを理解したければ勉強しろ。
516 :
デフォルトの名無しさん :03/06/25 14:22
3x^3-2x^2+x-11=0 この方程式を、ニュートン法を用いて解け。 精度は0.001より小さくなるまででよい。 初期値は10とする。 Cです。お願いします。
>>516 ずいぶんいやらしい程式だな
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
double
newton(double (*f)(double), double (*df)(double), double x, double h, int imax)
{
int c;
while (fabs(f(x))>h && c<imax){x -= f(x)/df(x); c++;}
return c>=imax ? 0.0/0.0 : x;
}
#define IMAX 1000000000
double f(double x){return 3*x*x*x - 2*x*x + x - 11;}
double df(double x){return 9*x*x - 4*x + 1;}
int
main(int argc, char **argv)
{
double x,y,h;
int i;
x = argc>1 ? atof(argv[1]) : 10;
h = argc>2 ? atof(argv[2]) : 0.001;
i = argc>3 ? atoi(argv[3]) : IMAX;
printf("x0 = %g; delta = %g; iter_max = %d;\n", x,h,i);
y = newton(f, df, x, h, i);
if (y == y) printf("%.10e\n", y); else printf("failed\n");
return 0;
}
>>511 任意のライブラリを用いてよいそうです。
>>512 perl でもよい、という課題だったのでそのまま書きました。
perl のプログラム板はないようですし。
よろしくお願いします。
519 :
デフォルトの名無しさん :03/06/25 15:03
ソースさらすだけ無駄なのに。
>>517 お疲れ様です。
520 :
デフォルトの名無しさん :03/06/25 15:04
521 :
デフォルトの名無しさん :03/06/25 15:08
>>519 いやあ、この方程式のいやらしさが分かったので儲けものだとしておこう。
重解にえらく近いから1億回のiterationでは許容誤差に到達できないんだな。
コードはこぴぺだが。
523 :
デフォルトの名無しさん :03/06/25 16:07
次の文を実行した後の*p、*q、**q の値を示せ ただし、 *(100)=200 *(200)=300 とする。 int *p, **q; p = 100; q = 100; という問題がありました。問題自体は解けましたが、 「この問題の解答確認プログラムを作れ」 といわれました。 **qの部分や、アドレス値の指定の仕方がよくわからないので、 どなたか御願いします。
無茶苦茶な問題だな
>>523 それは何の冗談でつか? (((( ;゚д゚)))アワワワワ
ふつーに int o=300; int *p = &o; int **q = &p; でいいような気もする。
530 :
デフォルトの名無しさん :03/06/25 18:12
>>523 警告でるけど気にしないで
int ret(int x)
{
return x + 100;
}
int test()
{
int x;
int *p,*q;
scanf("%d",x);
p = q = 100;
printf("%u ",p);
printf("%u ",ret(p));
printf("%u ",ret(ret(q)));
}
531 :
デフォルトの名無しさん :03/06/25 18:13
あ、scanf使うの忘れてた。
532 :
デフォルトの名無しさん :03/06/25 18:14
しかも使い方間違ってるし
533 :
デフォルトの名無しさん :03/06/25 18:25
データ3コa,b,cをキーボードより入力し もっとも大きい値を出力するプログラムを作れ。ただしif文を使うこと。 お願いします。
>>533 外出。
#define maxof(a,b) ((a)>(b)?(a):(b))
if (1) printf("%d", maxof(maxof(a,b),c));
>>533 #include <stdio.h>
int main(void)
{
int a, b, c;
int max;
scanf("%d%d%d", &a, &b, &c);
max = a;
if(b > max) max = b;
if(c > max) max = c;
printf("%d\n", max);
return(0);
}
>534 …if文の使い方がすばらしいね。 教授に殴られるかもね
まったく学習しない人が多いね
>>533 #include<iostream>
main(){
int a,b,c;
std::cin>>a>>b>>c;
if(std::cout<<std::max(std::max(a,b),c));
}
>537 いやいや分かってますって
>>534 ありがとうございます。
でもまだリターンをならってないのでできればリターンなしの文をお願いします。
>>542 どういたしまして!(・∀・)
return文とかつかってませんよ。
545 :
デフォルトの名無しさん :03/06/25 19:35
> きざみ幅 N=60でよろしくおねがいします。 ここにツッコミ入れるのもダメ?
547 :
デフォルトの名無しさん :03/06/25 20:33
プログラムはできたのですが以下の比較のことがわかりません。 素数を求めるプログラムを エラトステネスのふるいを用いて配列を使った時と、 配列を使わないで作成した時との コンピューターが必要とする変数の数、計算のかかる手間等の 違いはどのようなものですか?
int sei=0; cin >> sei; if(sei%4 == 0 && ( sei%100 != 0 || sei %400 == 0 ) ) { printf("閏年です\n"); } 何か?
549 :
デフォルトの名無しさん :03/06/25 22:13
約数を求めるアルゴリズムが思いつきません。 どうかお願いします
>>549 1から順にその数まで剰余が0かどうかを調べる
551 :
デフォルトの名無しさん :03/06/25 22:32
#include <stdio.h> int main(void){ int a,b,c; printf("整数を入力して。\n"); scanf("%d",&b); for(a=1;a<=b;a++){ c=a+c; } printf("1から%dまでの和は%dです。",b,c); } このソースおかしいっすか? あと、retorn文の使い道が分かりません
以下のプログラムを修正し、numで渡された単精度小数点数を2進数 で表現する関数void bindump(float num)を作りなさい。 ヒント:共用体を使えと言うことです。 お願いします #include<stdio.h> #include "bindump.h" void bindump(float num) { int i; int bits=sizeof(float)*8; for(i=bits-1;i>=0;i--){ printf("%d",(num & (1<<i))?1:0); if(i%8==0)printf(" "); } printf("\n"); }
寒気が・・・
#include <stdio.h> int main(void) { int n; printf("整数を入力して。\n"); scanf("%d", &n); printf("1から%dまでの和は%dです。", n, n * (1 + n) / 2); return 0; }
>>547 その作ったプログラムとやらを晒さない限り、
誰にも比較は出来ないと思われ
リトーン
>>550 その数の半分(余り切り捨て)まででいいだろう。
文字列が全て数値で構成されているかを調べる関数ってありませんか? 例えば、char ten[0]="abcde", ten[1]="123abc567", ten[2]="789"; として、それぞれのポインターを放り込むと、ten[1]とten[2]はprintf("数値じゃないです")、 ten[3]はprintf("789")と帰ってくるような。
>>560 お前がな。
こんなやつらに聞いた俺がバカだった。
563 :
デフォルトの名無しさん :03/06/25 23:23
>>559 int isdigit(const char *str){
for(int i=0;str[i]!=0;i++)
{
if('0' <=str[i] && str[i] <= '9') continue;
else return 1;
}
return 0;
}
>>554 をfor文に変えたら
どんなソースになるの?
お願いだよぉ
>>564 うぜ
#include <stdio.h>
int main(void) {
int n;
for (n = 0; n;) {
printf("整数を入力して。\n");
scanf("%d", &n);
printf("1から%dまでの和は%dです。", n, n * (1 + n) / 2);
}
return 0;
}
ってか、
>>551 のソースのどこがダメなのか分からん。
>>551 のほうが分かりやすいような・・・。
569 :
デフォルトの名無しさん :03/06/25 23:40
char *a[5] = {"apple", "lemmon", "net", "online", "neap"} このように宣言されている場合 a[0]のappleのleとa[1],a[2],a[3],a[4]それぞれの頭2文字と比較したいんですが どうしたらいいですか?
571 :
デフォルトの名無しさん :03/06/25 23:42
出力した文字列や数値をすべて消すには どうしたらいいですか?一部分を指定して消すのは可能ですか?
573 :
デフォルトの名無しさん :03/06/25 23:44
30秒経ったら終了させたいんですが、 どうやって時間を計るんですか? time.hをインクルードっすか? 詳しい記述方法をお願いします
レスどうもです。 appleの後ろ2文字、比較対照の頭2文字をどうやって指定したらいいんでしょ?
>>573 環境依存じゃない?
Winの窓アプリならSetTimer & OnTimerだが
他はしらね。
>>575 コンソールなんですがね〜。
そうですか。
どうもありがとうございます。
>>574 #include<stdio.h>
#include <string.h>
int main(void)
{
char *a[5] = {"apple", "lemmon", "net", "online", "neap"};
int i;
for(i=1;i<5;i++) {
if(strncmp(&a[0][3], a[i], 2) == 0) {
printf("%s\n", a[i]);
}
}
return 0;
}
578 :
デフォルトの名無しさん :03/06/26 00:10
わーい! UNIX/Cを10年以上やりつづけて最近プログラミングなんてしてなかったけど、 新しい仕事がWin/C++。これが久しぶりにプログラミングしたら面白いのよ! 自分好みのクラス作って華やかな画面で動かして。感動したね。 カーナビのソフト作ってるんすけど、新しい開発環境に慣れるより、 測量などの算術式とか出てきてわけわからん。文系の俺にはチト辛い。
おっさんスレ違いですよ
失礼しました〜。今年で30っす。
>551今更ながら。ヨーク自分のコードと見比べるように #include <stdio.h> int main(void){ int a,b,c=0; printf("整数を入力して。\n"); scanf("%d",&b); for(a=1;a<=b;a++){ c+=a; } printf("1から%dまでの和は%dです。",b,c); return 0; } とりあえずcを初期化しろってこった
(´・∀・`)幸せそうですな〜
>577 有難うございます。 申し訳ないですが、もう一つだけお願いします。 すべてに対してapple同様比較をしたいので以下のように考えたんですが c = strlen(a[i]);のところで強制終了受けるんですが何がまずいんでしょう? int i, t, c; for(i = 0; i < 5; i++){ c = strlen(a[i]); for(t = 0; t < 5; t++){ if(strncmp(&a[i][c - 2], a[t],2) == 0) } }
どうかお願します。 確か、system....だったような。 よく覚えてないんです
>>584 system("cls");で全部消せるよ
>>583 それであってる訳だが。VCとBCCでやったけど落ちなかったよ
589 :
デフォルトの名無しさん :03/06/26 01:18
連結リストpと整数Xを引数とし、pの要素の中でx以下の要素がxより大きい要素より すべて前に来るように並び替え、結果のリストを返す関数partitionを書け。mallocなどの メモリ割り当て関数を使ってはいけない。 typedef struct node{ int val; struct node* next; } *list; よろしくお願いします。 どういう風に並び替えていくのか、考え方も教えてください。
>>552 #include <stdio.h>
#include <limits.h>
#define LITTLEENDIAN 1
#define BIGENDIAN (!LITTLEENDIAN)
void bindump(float num)
{
int i, j = CHAR_BIT, endian = LITTLEENDIAN;
union {unsigned char c[sizeof(float)]; float f;} x;
x.f = num;
if (*(char*)&endian == 0) endian = BIGENDIAN;
for (i = 0; i < sizeof(float); i++, j = CHAR_BIT) {
unsigned char c = x.c[endian == BIGENDIAN ? i : sizeof(float)-i-1];
while (j--) putchar('0' + ((c >> j) & 1));
}
puts("");
}
>>590 list partition(list p, int x) {
list head, tail, t;
if (p == NULL) return NULL;
head = tail = p;
p = p->next;
while (p != NULL) {
t = p;
p = p->next;
if (t->val <= x) {
t->next = head;
head = t;
} else {
tail->next = t;
tail = t;
}
}
tail->next = NULL;
return head;
}
pの頭から要素を取り出し、x以下であれば新しく作るリストの頭へ、
そうでなければ尻尾へ加える。
リストを舐めていき、x以下の要素を発見次第、リストの先頭にもっていく。 node *partition( node *p, int x ) { node *p_first = p; if(!p) return 0; while( p->next ) { if( p->next->val <= x ){ node *move_p = p->next; p->next = p->next->next; move_p->next = p_first; p_first = move_p; }else p = p->next; } } return p_first; }
596 :
デフォルトの名無しさん :03/06/26 18:16
e(ネピアの定数)を求めるプログラムをC言語で作成してください。 初心者なのでなるべく簡単なわかりやすいプログラムがいいです。
597 :
デフォルトの名無しさん :03/06/26 18:20
expをマクローリン展開する。 多分いままでにでてきたと思う。
いいおっぱいの愛人はただひとり
( ´д)ヒソ(´д`)ヒソ(д` )ヒソ
文章を表示する回数を入力し、 その回数だけ文章を次のように表示させるプログラムを作成せよ 回数を入力>3 おはよう こんにちは こんばんわ おはよう こんにちは こんばんわ おはよう こんにちは こんばんわ
とりあえず 僕のソースです #include <stdio.h> void r(int); void main(void) { int val; printf("回数を入力>") ;scanf("%d",&val) ; r(val); } void r(int val) { printf("おはよう\nこんにちわ\nこんばんわ\n\n") * val ; }
また間違えたし・・・
8GEX ◆GEXGEXdRO6 なぜか8をGETすることに固執していた固定。 ギコ、しぃのエビフリャAAを好んで使い、エロゲーの曲を8GETの替え歌にして貼る。 最近はGETしていない模様。同じヲタのシャリバーンと仲がいいようだ。
>>607 貴重な時間をそんなことに使っちゃだめですよ
改行コードの変換関数を作りなさいとい課題です StrCnvで渡された文字列に含まれている改行コードをIntCRLFで指定された改行コードへ 変換し、変換された文字列を返す char Cnv_CRLF(StrCnv , IntCRLF) StrCnv : 変換対象の文字列 IntCRLF : 変換する改行コード 0=CR 1=LF 2=CRLF という課題です できればサンプルコードみたいに答えていただくとありがたいです よろしくお願いします
610 :
デフォルトの名無しさん :03/06/26 21:15
ビット処理は具体的にどのような用途があるか、考察せよ という課題が出されたのですが、わからないです(;´Д`) 教えていただけませんか?
マルチ氏ね
どなたか、この問題解決してもらえないでしょうか?
perlスレ逝け
614 :
デフォルトの名無しさん :03/06/26 21:48
>>612 画像をつなげるの?
ファイルをバイナリモードで読んでそれをつなげれば!
libjpegを使って良い、とかじゃないとやる気になりません
>> 612
どうすればいいんでしょうか??全く分からないので。
>>616 616 は私じゃないです。
ライブラリは適宜使ってよいということなので、
それを使って構わないと思います。
できそうですか?よろしくお願いします。
619 :
デフォルトの名無しさん :03/06/26 22:00
614案は?
END
621 :
デフォルトの名無しさん :03/06/26 22:02
622 :
デフォルトの名無しさん :03/06/26 22:05
画像1の横1列(ピクセル分)を読んで、画像2の横1列を読んでを 繰り返せば。
<img src="img1.jpg" /><img src="img2.jpg" /> これでどうよ
624 :
デフォルトの名無しさん :03/06/26 22:10
>>614 その案て。結局ヘッダのjpegしか表示できないのでは。
ライブラリ言ってもOSに拠るし。 せめて使うライブラリを指定してくれ。
>>614 具体的にどういうふうにするのですか?
バイナリをつなげるだけで、指定した位置にまで
連結できるようになるのでしょうか?
出題者の意図はjpegがどうとかかじゃなくて画像を連結しろってことじゃないの?
628 :
デフォルトの名無しさん :03/06/26 22:17
バイナリってなんだかわかりますか? バイナリストリームといってどんなデータでも読み出すことができるのです。 16進数で出てくるのでそれを画像1のピクセル分読んでその後に画像2を足して と続けるとか・・・ fopenかopen関数のどちらでも使えたと思うが調べて勝手に作ってくれ
bmpじゃないんだから・・・ そんなに素直に配置されてるわけないだろ
630 :
デフォルトの名無しさん :03/06/26 22:20
catをつかえ
EOIがでるまでマーカーをチェキ MCUを復号だ
632 :
デフォルトの名無しさん :03/06/26 22:38
ホントに初心者なんですが、ビット処理は具体的にどのような用途があるんですか??
>>632 しつこくマルチか?
それとも同じ学校なのか?
634 :
デフォルトの名無しさん :03/06/26 22:43
>>632 マルチじゃないです
この質問したの初めてです
>>509 libjpeg使っていいなら、xvのソースを入手してじっくり検討し給え。
いや、上のほうで同じ質問してる人いますね…。 同じ学校と思われます…。ちょっとビックリ(゚д゚) ホントわからないんですよ…。
>>632 この質問見るの今日で4回目なんだけど相当へたれの集まった学校なんだな・・
Cスレに答えが出てるぜ
大雑把な方針。 ・libjpegなどを使って画像イメージをメモリ上に展開する。 ・メモリ空間上で連結(合成?)処理を行う。 ・然るべきフォーマットでファイルに書き出す。 件の課題は、画像処理が主目的なのかCプログラミングが主目的なのか はっきりしない辺り課題としての評価は低いと言わざるを得ない。
>>640 Perlでも良い事からCプログラミングが目的で無いことは明らか
目的のために手段は選ばんあたりからより実践向けの講義なのだろう・・・
すでにあるプログラムを拝借していっても評価してくれそうだ
>>639 4回ですか!?ちょいとワロタよ…。
へたれ学校っすね…。精進しまふ…。
Cスレどれだろ?探してみまつ…。ありがとうございましたm(__)m
ImageMagickのmontageでも使っとけばいいような
助けてください・・・
>>603 void r(int val)
{
while ( val-- ) printf("おはよう\nこんにちわ\nこんばんわ\n\n") ;
}
>>645 即レスありがとうございます。
質問ですが、while( val-- )の部分が具体的にどのような処理を行っているのかがわかりません。
ループ条件を( )にいれると習ったのですが、。
理解したいのでよろしければ教えていただけませんか?
>>646 while ( val-- ) は while ( val-- != 0 ) と同じ
while ( ) や if ( ) で使われる条件は 0 以外が真で 0 だけが偽
>>647 ということは、ループするごとにvalから1を引き、valが0になったら偽になるので終了
ということですね。
ありがとうございました。
while ( val-- > 0 ) を推奨
コマンドラインから入力した文字列の、アルファベットの大・小文字変換のプログラムを、 replace (char *dest, char *str) という関数を定義して作成しなければならないんですが、 replaceの中身をどうすればいいのか、なかなか思い付きません。 どなたか御教授お願いします
#include <ctype.h> char *replace (char *dest, char *str) { char *save = dest; for (; *str; ++str) { if (islower(*str)) { *dest++ = toupper(*str); } else { *dest++ = tolower(*str); } } return save; }
652 :
デフォルトの名無しさん :03/06/27 11:51
653 :
デフォルトの名無しさん :03/06/27 12:08
>>651 '\0'文字が追加されてなかったりして。
あ、ほんまや
656 :
デフォルトの名無しさん :03/06/27 15:40
#include <stdio.h> class B{ public: int operator=(int n){ c = n; return 0; } private: int c; }; class C{ public: int Set(int n){ c = n; return 0; } private: int c; }; class B2 : public B{;}; class C2 : public C{;};
657 :
デフォルトの名無しさん :03/06/27 15:40
class A{ public: B Left; B2 Right; C Top; C2 Bottom; }; int main(int argc, char **argv){ A a; a.Left = 3; a.Right = 3; <--ここだけコンパイルとおらない a.Top.Set(3); a.Bottom.Set(3); return 0; } なんでですか?誰か教えてえらいひと!
演算子は継承されないん違ったか
659 :
デフォルトの名無しさん :03/06/27 16:01
660 :
デフォルトの名無しさん :03/06/27 16:04
661 :
デフォルトの名無しさん :03/06/27 16:28
入力 配列を使って 2 2 2 2 2 2 2 2 2 2 2 2 出力 合計 2 2 2 6 2 2 2 6 2 2 2 6 2 2 2 6 6 6 6 24 合計 2 2 2 2 平均
縦の合計は8じゃないのかい
>>660 実行結果は後者の勝率が約59%になったんですけど(引き分けはほとんど無い)
プログラムに間違いがあるかもしれないんで、指摘してもらおうと思ったんです。
>>659 そのソースで動くのか?
無限ループの予感。
666 :
デフォルトの名無しさん :03/06/27 16:59
>>659 ソース見てないけど普通に考えれば前者だよな。
どの辺りが問題ですか?BCCでは警告無しで動きましたけど。
668 :
デフォルトの名無しさん :03/06/27 17:02
>>659 人工知能プログラムでも作らないとその問題を
プログラム化するのは無理
>>659 濡れのPCがしょぼ過ぎて100000回ループに時間がかかっただけだった
スマソ
回線切っ(ry
>>668 この場合最長でも91ターンで戦闘が終わるので
パターン数はそれほど多くないと思います。
671 :
デフォルトの名無しさん :03/06/27 17:21
Cで現在時間(もちろんその地域の時刻)を取得し、 それを下のような形式で出力するプログラムをお願いします。 ただ今の時刻はa時b分c秒です
int GetTimeStr(void) { char *str_org = "ただいま%2d年%d月%2d日の%2d時%2d分%2d秒です"; time_t long_time; struct tm *now_time; time(&long_time); now_time = localtime(&long_time); sprintf(time_str, str_org, now_time->tm_year, now_time->tm_mon + 1, now_time->tm_mday, now_time->tm_hour, now_time->tm_min, now_time->tm_sec); return 0; }
>>659 ランダムでなくて確実に100回目に命中とかにしたら
int judge_hit_a(int num_attack) //命中判定
{
static int g_hit_a = 0 ;
int hit=0;
while(num_attack--){
g_hit_a ++ ;
if(g_hit_a >= 100){
hit ++ ;
g_hit_a -= 100 ;
}
}
return hit;
}
こんな感じ
>>671 #include <stdio.h>
#include <time.h>
int main(void)
{
struct tm *newtime;
time_t long_time;
time(&long_time);
newtime = localtime(&long_time);
printf("ただ今の時刻は%d時%d分%d秒です\n",
newtime->tm_hour, newtime->tm_min, newtime->tm_sec);
return(0);
}
>672,>674 ありがとうございます
676 :
デフォルトの名無しさん :03/06/27 17:45
>>659 いつも同時に打ち合うとしてBの打ち方は同じになるけど
Aは打つたびに打ち方に戦略を持ち込むことができるのに
このプログラムにそれがはない。
>>659 > if(rand() < percent_hit * (RAND_MAX+1))
ここの1を足しているところがまずそうだが…
なんかはずしているみたい…
>>678 いや、確実にまずい。
RAND_MAXがINT_MAXな場合オーバーフローする。
オーバーフローした時の動作は未定義だけど、負になる処理系だと
hitすることがないから、永久に外し続ける。
if(rand() < percent_hit * ((double)RAND_MAX+1)
ならいいですか?
>>676 敵全体に均等に攻撃して、出来るだけ命中のダブりを避けるという戦略なんですけど
一応自分ではこれが一番いいやり方だと思ってます。
681 :
デフォルトの名無しさん :03/06/27 20:45
#include <stdio.h> int main(void){ double a,b; printf("データを入れてちょうだいな"); scanf("%lf%lf",&a,&b); printf("和は%lf\n",a+b); printf("差は%lf\n",a-b); printf("積は%lf\n",a*b); printf("商は%lf\n",a/b); retorn 0; }
682 :
デフォルトの名無しさん :03/06/27 20:46
宿題で、とあるサイトの演習問題をコンパイルしろといわれたのですが、 全く同じにやってもエラーになります。 どこが違いますか?
683 :
681@682 :03/06/27 20:49
retorn
>>682 声が違う 年が違う 夢が違う ほくろが違う
retorn 0にはワロタ
>>682 #define retorn return
を追加
>>688 だめでした
#include <stdio.h>
int main(void){
double a,b;
printf("データを入れてちょうだいな");
scanf("%lf%lf",&a,&b);
printf("和は%lf\n",a+b);
printf("差は%lf\n",a-b);
printf("積は%lf\n",a*b);
printf("商は%lf\n",a/b);
retorn 0;
}
#define retorn return
#include <stdio.h> int main(void){ double a,b; printf("データを入れてちょうだいな"); scanf("%lf%lf",&a,&b); printf("和は%lf\n",a+b); printf("差は%lf\n",a-b); printf("積は%lf\n",a*b); printf("商は%lf\n",a/b); return 0; }
だからprintf()に%lfはダメだってば。
ちなみに%nはハックラされる可能性があるのでオススメできない
JFネタをここに書くか・・・
695 :
デフォルトの名無しさん :03/06/28 01:38
#include <stdio.h> #include <math.h> #define N 1000 int readarray(int n[]); void calculate(int n[], int i, float *sum, float *a, float *v, float *s); void printresult(float sum, float a, float v, float s); int main(void) { int i, n[N]; float sum, a, v, s; i = readarray(n); calculate(n, i, &sum, &a, &v, &s); printresult(sum, a, v, s); return 0; }
int readarray(int n[]) { int i = 0, x; printf("input integer (0=end):"); scanf("%d", &x); while(x != 0 && i <= N) { n[i] = x; i++; printf("input integer (0=end):"); scanf("%d", &x); } return i; }
void calculate(int n[], int i, float *sum, float *a, float *v, float *s) { int j; float sum1 = 0.0, sum2 = 0.0; for (j = 0; j < i; j++) { sum1 += (n[j]); sum2 += (n[j]) * (n[j]); } *sum = sum1; *a = (*sum) / i; *v = sum2 / i - (*a) * (*a); *s = sqrt(*v); } void printresult(float sum, float a, float v, float s) { printf("---------------------------\n"); printf("sum = %7.3f, average = %7.3f, variance = %7.3f, stddev = %7.3f\n", sum, a, v, s); }
>695〜697 ??
またエスパー召喚か?
> while(x != 0 && i <= N) ダウト!
IEを起動しようと、 system("C:/Program Files/Internet Explorer/iexplore.exe"); としたんですが、空白があるため起動出来ませんでした。 systemではこういう場合無理なのでしょうか? また、他に方法があればご教授お願いします。
702 :
デフォルトの名無しさん :03/06/28 03:41
>>701 system("C:/Program\\ Files/Internet\\ Explorer/iexplore.exe");
>>702 while(x != 0 && i < N)
かな?
>>701 system("\"C:\\Program Files\\Internet Explorer\\iexplore.exe\"");
707 :
デフォルトの名無しさん :03/06/28 18:48
708 :
( ゚∀゚)ノ ィョ―ゥ :03/06/28 18:55
お願いします・・・ 1.整数aを受け取り、その階乗a!を返す 関数を作成せよ。 2.整数引数の2乗を返す関数をつくり それを用いて1〜20までの2乗の 総和を返す関数を作成せよ。 3.1つのアルファベット(a,・・・z) と整数iを受け取り、そのアルファベット よりi個の後ろのアルファベットを返す 関数を作成せよ。ただし2の後ろはaであるものと する。 [例] ・cと4を受け取ったならgを返す ・yと5を受け取ったならdを返す 多いですがこの3つがどうもわからんのです どうぞお願いします
> ただし2の後ろはaであるものと zの後ろはaだろ、問題すら理解出来て無いのかよ
710 :
( ゚∀゚)ノ ィョ―ゥ :03/06/28 19:03
>709 スマソ。。。 問題の写し間違えですた ご指摘の通りzの後ろはaであるものとするに 訂正させていただきます
711 :
デフォルトの名無しさん :03/06/28 19:06
char *str = "ABC"; って*は必要なんですか? よく分かりません。お願します
>>711 必要です。
わかりましたか?お願します
*がどういう働きをしているのでしょうか?
ポインタ
char str[] = "ABC"; とは違うのでしょうか
違います
>>715 よーし、釣りだと分かっていてもマジレスしちゃうぞ。
char *str="ABC";はchar型へのポインタを定義して文字列定数ABCの先頭アドレスで初期化する。
char str[]="ABC";はABC+'\0'が丁度よくはいる大きさのchar配列を定義し、要素を"ABC"のそれぞれの文字で初期化する。
いつもマジレスしようとすると間違えるんだが。
sizeofとかやると違う.後は同じ.
全然違うわヴォケ
>>720 後者は(char *)ポインタの領域が確保されない。だから、
str = "DEF";
出来ない。だろ?
sizeofとかやると違う.あと,配列変数は書き込み不可.後は同じ.
sizeofとかやると違う.あと,配列変数は初期化時以外は書き込み不可.後は同じ.
725 :
デフォルトの名無しさん :03/06/28 19:38
>>724 前者は配列用の領域が確保されない。だから、
str[0] = 'D';
出来ない。だろ?
sizeofとかやると違う.あと,&とかやると後者は第0要素の&だが前者は違う.あと,配列変数は初期化時以外は書き込み不可.後は同じ.
>>725 構文としては問題ない。
でも何が起こるか分からない。
>725, 727 ?
>>728 constがついていないから書き換えようとすることは可能。
でも文字列定数を書き換えようとしたら何が起こるか分からないということ。
とにかくやっちゃだめ
>>708 問題1
int kaijou(int a)
{
return(a > 0 ? a*kaijou(a-1) : 1);
}
>>708 問題2
int nijou(int a)
{
return(a*a);
}
int nijou_souwa(void)
{
int i;
int total = 0;
for(i = 1; i <= 20; i++)
total = total + nijou(i);
return(total);
}
>>708 問題3
char arufa(char c, int a)
{
const char *str = "abcdefghijklmnopqrstuvwxyz";
const char *p = str;
int i;
for(i = 0; i < 26; i++){
if(*str++ == c)
break;
}
i = (a + i) % 26;
return(*(p+i));
}
*(p+i)なんて書き方をするくらいならp[i]と書こうよ。
>>733 ポインターで宣言したものは、ポインターでの書き方にしてる。
俺のチッポケなこだわり・・・
char rot(char c, int n) { return (c + n - 'a') % 26 + 'a'; }
>729 (゚Д゚)ハァ??
構文エラーにはならないということだ。
740 :
デフォルトの名無しさん :03/06/28 20:32
公共料金の計算をするプログラムを教えてください。 今回は携帯電話の料金で1分10円 基本使用料金は2000円の設定で お願いします。scanfで時間を入力した結果 実行結果で料金が表示される形です。
741 :
デフォルトの名無しさん :03/06/28 20:44
#include <stdio.h> int main(){ int min,yen; printf("携帯の使用時間を分単位で入力してください。\n"); scanf("%d",&min); yen=min*10+2000; printf("料金は%d円です。",yen); }
誰か反応してよっ!ヽ(`Д´)ノ
706見捨てないで下さいm(_)m お願いしますm(_)m
char str[]="ABC"; str[0] = 'D'; なぜこれがだめなんでしか?
745 :
デフォルトの名無しさん :03/06/28 21:56
>>744 誰がそんなこと言ったの?(^-^=)♪
>745 >729が言った。・゚・(ノД`)・゚・。
747 :
デフォルトの名無しさん :03/06/28 22:06
>>746 char *str="ABC";
str[0]='D';
これのことですが(^-^#)
748 :
デフォルトの名無しさん :03/06/28 22:09
eを1万桁まで求めるプログラムを作りなさい。 596にも似たのがあるんですけど、桁数の増やし方が わからないのでおねがいします。
>>706 時刻要素が複数あるけどarrival_timeでいいの?
Node *DeleteMin(Node *top)
{
/* 最小時刻を持つデータを線形リストより探して削除する */
Node *p,*q;
double arrival_time=top->arrival_time;;
for(p=top;p!=NULL;p=p->next){
q=p->next;
if((q != NULL) && (q->arrival_time < arrival_time))
arrival_time = q->arrival_time;
}
for(p=top;p!=NULL;p=p->next){
q=p->next;
if((q != NULL) && (q->arrival_time <= arrival_time)){
p->next = q->next;
free(q);
}
}
if(top->arrival_time <= arrival_time){
q=top->next;
free(top);
top=q;
}
return top;
}
>747 じゃぁこれはだめなのん? *str = 'D'; str[0] = 'D'; 同じじゃないの?コンパイラが勝手に領域を確保してくれてないのー?
752 :
デフォルトの名無しさん :03/06/28 23:01
なんか今日は一段とレベルが低いような・・・
753 :
>>744 :03/06/28 23:07
754 :
>>751 :03/06/28 23:09
すでに述べられ済みですが、行わないのが賢明ですね。
ありがd そしてゴメソ(´・ω・`)
756 :
>>749 :03/06/28 23:57
そうです。arrival_timeです。 本当に、ありがとうございましたm(_)m
757 :
デフォルトの名無しさん :03/06/29 00:02
C言語で 生まれた歳から現在までの年月日数の求め方と 現在までの総日数教えて下さい。
758 :
デフォルトの名無しさん :03/06/29 00:03
>>757 その前に、間違っていてもいいから、自分で作った
プログラムを晒して下さい。
>>757 生まれた歳から現在までの年月日数って何やんねん?
JAVAでいうfinalって、C++ではどのように指定すればよいのでしょうか。 スーパークラスでメソッドをfinal指定して、サブクラスでオーバーライドできない ようにしたいのですが・・・ JAVAのスーパークラスでの記入例はこんな感じです↓ public final void hogehoge();
762 :
デフォルトの名無しさん :03/06/29 00:22
さっきからポインタの話をしてる人らへ。 以下のコードをコンパイラオプションでコードサイズを最小にする場合と 特に最適化をしない場合で実行して比べてみ。 ただし、ものすごく環境(コンパイラ)に依るからうまくいかない人もいるかも。 ちなみに、VC++6.0のProfessionalでのコンパイラならcl /O1 "ソース名"でサイズの最適化 これの実行結果の違いがなぜかも分からんヤシはもっと勉強しませう。 #include "stdio.h" void fn(char*); int main() { char* s1 = "abc"; char* s2 = "abc"; char d1[] = "abc"; char d2[] = "abc"; fn(s1); fn(d1); printf("s1 = %s,s2 = %s\n",s1,s2); printf("d1 = %s,d2 = %s\n",d1,d2); return 0; } void fn(char* lpsz) { lpsz[0] = '!'; }
俺の出力 最適化なし s1 = !bc,s2 = abc d1 = !bc,d2 = abc コードサイズ最適化 s1 = !bc,s2 = !bc d1 = !bc,d2 = abc
#include "stdio.h"
定数リテラルのアドレスによる初期化は大抵のコンパイラでサポート はされているが、定数リテラルの記憶クラスがデータ領域なのかコード 領域なのかは、環境に依存する。コード領域の場合その領域に対するポ インタ変数媒介の操作はコード自己書き換えによる保護エラーを起す可 能性が高い。 コードの自己書き換えは禁止されなければならない必然性は無いがCPU アーキテクチャの単純化からそのようになっている場合が多い。
コード領域の自己読み取りすら禁止されている環境が存在する。
CPUアーキテクチャからだけでなく、プロセス間で共有できなくなるので禁止するOSは多い。
やっぱ、分かってる人には当たり前のようで。 んなわけで少しでも変更する可能性のあるデータの場合は、 char* s1 = "abc"; じゃなくて char d1[] = "abc"; のように書きましょうってことで。 こっちなら、きちんとデータ領域に確保してくれます。(あってるよな?) 1個目の場合でのメモリオーバランのエラーはものすごく怖いよ〜。 何のことか分からん人もとりあえず下のほうを使ったほうがいいと思います。
なんのことか判らんのならそもそも使うな。 と、思う恭子の頃。
>>770 >こっちなら、きちんとデータ領域に確保してくれます。(あってるよな?)
合ってます。auto記憶クラスのときはスタック(とは限らんけど)にその大きさの
配列をとって、そこに文字列をコピーして初期化してくれます。
# だからループから呼ばれる関数のときは気をつけないと性能ががた落ちになる
関数内のstatic記憶クラスのときはスコープが関数内部に限定されるだけで、
あとはグローバル変数とおんなじ。
ただの配列のときは初期化のタイミング関係ないんだっけ?
char d[]="abc" 定数リテラル"abc"(これをddと命名)はコード領域にあるか、データ領域 にあるかに関わらずコンパイラはその長さ(終端入れて)4を認識し、 char d[4]と解釈。初期化ルーチンにmemcpy相当のルーチンを挿入し、 dをddで初期化します。すなわちdは"abc"で初期化された状態であることが 保証される長さ4の文字変数の配列になります。
対して char *s="どこの馬の骨かわからない文字列"; は、コード領域にあるかデータ領域にあるかわからない、謎の文字列で sはそこへのポインタです。この場合注意が必要です。 strcpy(s,"短い文字列"); の場合でも、保護エラーで停止することもあります。 strcpy(s,"非常に長い文字列を複写するとはみ出して周囲のデータを破壊する"); などは環境に関わらず、ほぼ確実にシビアな事態を招くでしょう。 char *s2="どこの馬の骨かわからない文字列"; とし、「重複文字を纏める」最適化オプションでコンパイルした場合 s==s2 となったりすることがあります。 s!=s2を前提としてプログラムしていた人には、不可解な挙動と映り かなり悩ませることになるでしょう。
>>776 >保護エラーで停止することもあります。
例えば、どんな環境でなります?
>>748 #include <stdio.h>
#define M 10000 //求めたい桁数
#define N 10000 //10000もあれば恐らく十分
int a[N];
int main(){
int i,c,pc=0;
for(i=0;i<10000;i++)
a[i]=1;
a[1]+=a[0];
a[0]=0;
printf("%u.\n",a[1]);
do{
c=0;a[1]=0;
for(i=10000-1;i>=1;i--){
a[i]*=10;
a[i]+=c;
c=a[i]/i;
if(i!=1)
a[i]%=i;
}
printf("%u",a[1]);
pc++;
if(pc%50==0)
printf("(%u)\n",pc);
}while(pc<M);
return 0;
}
階乗進法で検索
> for(i=10000-1;i>=1;i--){ for(i=N-1;i>=1;i--){ に訂正
>>777 %uname -sr
FreeBSD 4.8-STABLE
%cat baka.c
int main(int argc, char * argv[])
{
char *s = "string";
*s = 'a';
return 0;
}
%gcc baka.c
%./a.out
zsh: bus error (core dumped) ./a.out
与えられた文字列の中に指定された文字列が存在するかどうかを調べる関数strfndを作成せよ。 int strfnd(s,t) char *s /*与えられた文字列の先頭アドレス*/ char *t /*指定された文字列の先頭アドレス*/ 戻り値は存在するときはその文字位置、存在しない時は-1とする。 例:"abcde"、"cd"と入力すると、関数は2を返して、存在しましたと出力する。 お願いします・・・。
>>781 #include <stdio.h>
#include <string.h>
int strfnd(char *s, char *t)
{
size_t i = strlen(s);
size_t j = strlen(t);
size_t k;
for(k = 0; k <= i-j; k++){
if(strncmp(s, t, j) == 0)
return(j);
s++;
}
return(-1);
}
int main(void)
{
char s[256];
char t[256];
scanf("%s", s);
scanf("%s", t);
if(strfnd(s, t) > 0)
puts("存在しました。");
else
puts("ありませんでした。");
return(0);
}
783 :
デフォルトの名無しさん :03/06/29 07:50
784 :
デフォルトの名無しさん :03/06/29 08:18
3次元空間内の4点を頂点とする四面体の体積を求める関数を vector.hを使ってお願いします
vector.hってなんだ?
>>785 C++のvectorクラスの事かな?
多分・・・
文脈からいって STLの<Vecotr>ではないようだ。 三次元ベクトル数のクラス class vector{...} のヘッダだろう。
789 :
デフォルトの名無しさん :03/06/29 10:51
790 :
デフォルトの名無しさん :03/06/29 10:52
よろしければ、※月※日と入力すると※曜日 とでるプログラムを教えて下さい。
791 :
デフォルトの名無しさん :03/06/29 10:53
誕生日がある程度古いときちんと動かないのは仕様 #include <stdio.h> #include <string.h> #include <time.h> int main() { struct tm bd,td; memset(&bd,0,sizeof bd); memset(&td,0,sizeof td); printf("YYYY/MM/DD形式で誕生年月日を入力してください : "); scanf("%d/%d/%d",&bd.tm_year,&bd.tm_mon,&bd.tm_mday); printf("YYYY/MM/DD形式で今日の日付を入力してください : "); scanf("%d/%d/%d",&td.tm_year,&td.tm_mon,&td.tm_mday); bd.tm_year-=1900; bd.tm_mon--; td.tm_year-=1900; td.tm_mon--; printf("誕生日から今日までの日数は%ld日です。\n",(long)((mktime(&td)-mkt ime(&bd))/86400)); return 0; }
コピペしたら関数名の途中で切れてしまったな・・・ #include <stdio.h> #include <string.h> #include <time.h> int main() { struct tm bd,td; memset(&bd,0,sizeof bd); memset(&td,0,sizeof td); printf("YYYY/MM/DD形式で誕生年月日を入力してください : "); scanf("%d/%d/%d",&bd.tm_year,&bd.tm_mon,&bd.tm_mday); printf("YYYY/MM/DD形式で今日の日付を入力してください : "); scanf("%d/%d/%d",&td.tm_year,&td.tm_mon,&td.tm_mday); bd.tm_year-=1900; bd.tm_mon--; td.tm_year-=1900; td.tm_mon--; printf("誕生日から今日までの日数は%ld日です。\n",(long)((mktime(&td)-mktime(&bd))/86400)); return 0; }
>>790 ツェラーの公式より。
#include <stdio.h>
int main(void)
{
int y, m, d;
char* week[7] = {"日", "月", "火", "水", "木", "金", "土"};
printf("年 : "); scanf("%d", &y);
printf("月 : "); scanf("%d", &m);
printf("日 : "); scanf("%d", &d);
if((m == 1) || (m == 2))
{
y--;
m = m + 12;
}
printf("今日は%s曜日です。\n",
week[(y + y/4 - y/100 + y/400 + (13*m+8)/5 + d) % 7]);
return(0);
}
795 :
デフォルトの名無しさん :03/06/29 12:30
age
796 :
デフォルトの名無しさん :03/06/29 12:39
CでAPIを使う≒CでWinアプリを作る?
797 :
デフォルトの名無しさん :03/06/29 12:46
APIはあるソフトウェアの機能を他のプログラムから呼び出せるようにするもの。
798 :
デフォルトの名無しさん :03/06/29 12:56
Cで文字色を変えたりするにもAPIを使うらしいけど、 これはCプログラマーには必須?
リンクのソース内の『最後尾のデータ削除』
をつくったのですが、下のではなぜいけないのでしょうか?
よろしければ、訂正お願いいたします。
==program==
Queue *q;
for(q=top;q->next!=NULL;q=q->next);
free(q);
return top;
==result==
p
c_id:3 a_time:4.000000
c_id:2 a_time:3.000000
c_id:1 a_time:1.000000
d
p
c_id:3 a_time:4.000000
c_id:2 a_time:3.000000
c_id:9437360 a_time:0.000000
c_id:9447552 a_time:0.000000
c_id:9437352 a_time:0.000000
とc_id:1の部分は消えるのですが、
余計なものがくっついて来ます。
僕の考えでは、forを使って、
qをリストの最後尾まで動かし、
qをfreeすれば、最後尾が消えるのではと思ったのですが。
ソース↓
ttp://acechannel.hp.infoseek.co.jp/wakaranai.c 実行結果↓
ttp://acechannel.hp.infoseek.co.jp/result.txt
リンクの要素を削除した場合、当然それを指していたポインタも 適当なものにしなければ狂うわな。
つまり、qの指すポインタを適当なものにするということですね? けれど、どうすればいいのでしょうか…。 もう少し具体的に説明していただけると幸いです。
間違いました。 qの指すポインタじゃなくて、qを指していたポインタでした。
リストの最後がfreeされるわけだが free(void *q) で qが指している領域を解放しmalloc等で再利用可能にする関数。 q自身を変更するわけではないことを考えると リストの最後のnextをfreeしても、その一つ前のリスト内のnext の値はそのままでfreeした結果無効な領域を指しているポインタ になっているね。
804 :
デフォルトの名無しさん :03/06/29 13:58
#define Free(p) (free(p),(p)=NULL) うーん・・・
805 :
デフォルトの名無しさん :03/06/29 14:00
#define Free(p) ((void)(free(p),(p)=NULL)) まちがった。こうだ。
うーん…
Queue *q,*r; for(q=top;q->next!=NULL;(),q=q->next); free(q);r->next=NULL; ()内にあるコードを埋め込めば良いがそれは考えましょう。
分かりました!!! なるほど!!! ありがとうございましたm(_)m
809 :
デフォルトの名無しさん :03/06/29 14:55
>>805 再帰的に変換はされないから
#define free(p) ((void)(free(p),(p)=NULL))
でいいんじゃないかな・・・・と、テストもせずに適当行ってみるテスト。
>>805 やってみましたが、うまくいきませんよ?
どうしてかは分からないのですが…。。
813 :
デフォルトの名無しさん :03/06/29 17:43
>>706 >for(q=top;q->next!=NULL;q=q->next);
>free(q);
おいおいNULL値フリー?
815 :
デフォルトの名無しさん :03/06/29 17:55
>>813 ( ゚д゚)ポカーン
q->nextがNULLなだけであって、qは非NULL
蛇足 posixではfree()はNULLを引数としても特に問題ない
817 :
デフォルトの名無しさん :03/06/29 18:49
820 :
デフォルトの名無しさん :03/06/29 18:54
fcloseもNULLを許可してくれたらよかったのに。
char *型で宣言したdataに データが入ってます。 dataの内容は G01B123/456 のという文字列です。 このデータを出力させる際 [G01B123/456] → [G01B 123/456] [G14A23/45] → [G14A 23/45] [B11C2/3] → [B11C 2/3] [G01B123:456] → [G01B 123:456] [G14A23:45] → [G14A 23:45] [B11C2:3] → [B11C 2:3] [B12G12345] → [B12G 123] [B12G12] → [B12G 12] のように、 頭4文字以降に半角スペースを入れ '/' または':'の前の数字を桁あわせをして 表示させるプログラムを作りたいんですが 最後の2例は、'/'も':'もない場合で、 この場合は、元のデータから7桁表示させ、 頭4桁+半角スペース+残り3桁となります。 ソース教えてください よろしくお願いします。
ん〜 桁あわせの例が・・ 頭4文字以降+半角スペースから'/' または ':'の 前のデータを 3桁に桁あわせして 頭うめとして 半角スペースを入れてください。
>>821 最後の例がこの文章と矛盾してる
>最後の2例は、'/'も':'もない場合で、
>この場合は、元のデータから7桁表示させ、
>頭4桁+半角スペース+残り3桁となります。
指定の文字列を指定のファイルから検索するプログラムを、クラスの継承を使用して作れ、という宿題なんですが、お願いできますか?
821です。 [B12G12] → [B12G 12] の例は省きます。すみません。
>>821 第2フィールドの / や : で桁あわせについて、桁の最大の長さが
決まっているのといないので実装の考え方が変わるんですが。
821です 第一フィールド?での、最大の桁数は13桁です。 第二フィールドでは、決まってません。 ’/’または’:’以下は、そのまま表示させてください。 本来は’/’または’:’以下は、5桁に桁そろえしたいのですが。
よくわからねぇでございます。
829 :
デフォルトの名無しさん :03/06/29 21:08
#include <stdio.h> int main(){ int *a b; b=12: a=&b; printf("%d",*a); }
830 :
デフォルトの名無しさん :03/06/29 21:11
戻り値がねーよ main を void にしろ 俺はreturn を書くのがめんどいといつもvoidでした。 自作はOKだがな!
831 :
デフォルトの名無しさん :03/06/29 21:16
#include <stdio.h> int main(){ int *a b; b=12: a=&b; return printf("%d",*a); }
832 :
デフォルトの名無しさん :03/06/29 21:16
int main(){} これでコンパイルされますが?
833 :
デフォルトの名無しさん :03/06/29 21:17
int *a,b;だろ
あぼーん
836 :
デフォルトの名無しさん :03/06/29 21:38
検索ってどうやってるんですか?
何の検索よ?
838 :
デフォルトの名無しさん :03/06/29 21:56
std::find
821です 難しいっす まったくわかりません・・・
840 :
デフォルトの名無しさん :03/06/29 23:36
>>821 な〜んか、質問がよく分からんからテキトウに作ってみたよ。
#include <stdio.h>
int main(void)
{
char *data[7] = {
"G01B123/456", "G14A23/45", "B11C2/3",
"G01B123:456", "G14A23:45", "B11C2:3",
"B12G12345"
};
int flags[7] = {0};
char *p;
int i, j;
for(i = 0; i < 7; i++){
p = data[i];
while(*p++ != '\0'){
if((*p == '/') || (*p == ':'))
flags[i] = 1;
}
}
続く・・・
>>821 続き
for(i = 0; i < 7; i++){
p = data[i];
for(j = 0; j < 4; j++)
putchar(*p++);
putchar(' ');
if(flags[i] == 1)
puts(p);
else
{
for(j = 0; j < 3; j++)
putchar(*p++);
putchar('\n');
}
}
return(0);
}
843 :
デフォルトの名無しさん :03/06/30 00:34
844 :
デフォルトの名無しさん :03/06/30 00:35
>>841 ウホッ!おれも。
>>821 にささげる。
const char* addsp(char *l,const char *r)
{
const char *t = l;
const char *re = r;
while(r != re+4) *l++ = *r++;
*l++ = ' ';
for(re = r;r != re+3;) *l++ = *r++;
for(re = r; *r && *r != '/' && *r != ':'; ++r);
if(*r == '/' || *r == ':'){
r = re;
while(*r) *l++ = *r++;
}
*l = '\0';
return t;
}
void test(void)
{
char s[]="G01E1234/5678";
char s1[] = "G01E123456";
char r[256];
printf("%s\n%s\n",addsp(r,s),addsp(r+80,s1));
}
845 :
デフォルトの名無しさん :03/06/30 00:37
戻り値の型が[const] char *・・・・
821です みなさんありがとぉ〜 (ノ△・。)
暇だから漏れも。。。 #include <stdio.h> #include <string.h> int main(void) { char *data[7] = { "G01B123/456", "G14A23/45", "B11C2/3", "G01B123:456", "G14A23:45", "B11C2:3", "B12G12345"}; char str[256],str2[256],str3[256]; int i; for(i=0;i<7;i++) { memset(str, 0, 256); memset(str2, 0, 256); memset(str3, 0, 256); strncpy(str, data[i], 4); if(strlen(data[i]) == strcspn(data[i], "/:")) strncpy(str2, &data[i][4], 3); else strcpy(str2, &data[i][4]); sprintf(str3, "%s %s", str, str2); printf("%s\n", str3); } return 0; }
すいません教えてください。 3.プログラムのソースファイルを開いて、/* */で囲まれたコメント部分を 別のファイルにかき出すプログラムを作成せよ。 考えたんですけど何をどうすればいいのか分かりません。教えてください。m(_ _)m
/* */はネストしないことになっているから簡単だろう でもまあ、ただ書き出すだけでなくて行番号やその前後に 明らかにコメントの示す内容があるならそれも出力する位はしたい
850 :
デフォルトの名無しさん :03/06/30 01:23
まず/*のぶぶんをさがす。 そして、そこから見つけたら*/までをファイルに書き込む。 ・・・・・おわり。・・・・・・・
>>850 それじゃたりんぞ。"/*"なんかは無視しなくちゃならん。
実はこれ、結構難しいんだよねぇ。
>>852 うん。難しい。というかややこしい。
単純に"が出たら"まで読み飛ばせばいいかというとさにあらず、
"\""なんてのもあるしね。
>>853 で、結論としてはプリプロセッサのソース…モガモガ
となるので、スレタイどおり宿題程度の回答でいいんではない?
>>854 そこまでややこしくなくてもいいんです。
文字列操作のところの宿題なんで、あくまでコメント部分を書き出せばいいんです。
よろしくお願いします。
>>855 ちょっとやってみてる。単純なのでも結構ややこしいw
/* 最初の「/*」を読んで、その次の文字はchにある */ do { while(ch != '*') ch = nextChar(); ch = nextChar(); }while(ch != '/'); コメントの読み捨てで、コンパイラの本のパクリでつ。 これを参考にすると出来るだろうか。
>>857 頭いいなあこのコード。おれが作ったのは何のひらめきも感じられないw
#include <stdio.h>
#include <string.h>
int main(int argc, char * argv[]) {
char line[1024], *p, *start;
int in_comment = 0;
while (fgets(line, sizeof(line), stdin)) {
if (!in_comment) {
if ((p = strstr(line, "/*")) != NULL) {
p += 2;
memmove(line, p, strlen(p) + 1);
in_comment = 1;
}
}
if (in_comment) {
if ((p = strstr(line, "*/")) != NULL) {
*p ='\0';
in_comment = 0;
}
fputs(line, stdout);
}
}
return 0;
}
制限として、 文字列中に/*が出てきてもコメントと見なす。 puts("/*");なんてのもコメントと思う。 同じ行にコメントが二度現れても最初しかコメントと思わない。 /* イイ */ /* ダメ */ なんてのはイイしか出ない。
860 :
デフォルトの名無しさん :03/06/30 02:57
配列で3453等と数字を並べて表示するには, for文を使ってprintf("%d",n)とやるしか無いのですか?
>>860 質問の意図がよくわからんが、多分そうだよ。
printf("%d %d %d %d", a[0], a[1], a[2], a[3]);はダメなんだろ?
862 :
デフォルトの名無しさん :03/06/30 05:02
別なスレで見たんだけどこれ面白くないかな? 47 :デフォルトの名無しさん :03/06/29 22:17 問A 自分自身と同じソースコードを出力するソースコード まちがっている例) int main() { printf("int main() {\n printf(\"ウホッ\");\n return 0;\n}\n"); return 0; } 環境依存になっちゃうと思うけどデバッグ情報があればソースパスも 拾えるはずだから可能だと思うんだけど…
#include <algorithm> #include <iostream> #include <fstream> int main() { std::copy( std::istreambuf_iterator<char>(std::ifstream(__FILE__)), std::istreambuf_iterator<char>(), std::ostreambuf_iterator<char>(std::cout)); return 0; } こういう奴か?
__FILE__みたいな飛び道具は面白くないな 古典 char*s="char*s=%c%s%c;main(){printf(s,34,s,34);}";main(){printf(s,34,s,34);}
『プログラムの説明』 1. 一クラス分の得点を繰り返し入力する。(最大20回) 2. 入力の終了は得点に999が入力されたときとする。 3. 得点は以下のような形式で入力する。 得点=入力[Enter] 得点=入力[Enter] : : 得点=999[Enter] ←入力の終了 4. 得点を入力するたびに0〜100の範囲の値かをチェックする。ただし999は範囲外エラーから除く。 5. チェックの結果、範囲外の時は、以下のメッセージを表示して、再入力する。 「得点が範囲(0〜100)外である。再入力してください。」 6.入力終了後、以下のように得点、順位の一覧を表示する。 得点 順位 1人目 90 2 2人目 70 5 3人目 95 1 4人目 80 3 5人目 80 3 7. 以下の処理を関数にする。 順位付けの処理 関数の定義 order01(ten,ten[i],n) 戻り値:順位 引数ten:得点が入っている配列の配列名 引数ten[i]:順位を求めたい得点 引数n:最後の得点が入っている配列要素の添字番号
867 :
866の続き :03/06/30 09:05
『表示処理部分のプログラム』 /* 表示処理 */ puts(" 得点 順位"); for(i=0;i<=n;i++) { printf("%2d人目",i+1); printf("%5d%5d\n",ten[i],order01(ten,ten[i],n)); } return (0); 『関数について』 関数名は、「order1」とする 表示処理プログラムのようにorder1関数を使用する order01関数の定義はmain関数より前で行う ↑この問題よろしくお願いします。
>>863 #include <iostream>
#include <fstream>
int main()
{
std::cout << std::ifstream( __FILE__ ).rdbuf();
return 0;
}
>>863 gcc -Wall -o self1 self1.c
self1.c:1:22: algorithm: No such file or directory
self1.c:2:21: iostream: No such file or directory
self1.c:3:20: fstream: No such file or directory
self1.c: In function `main':
self1.c:7: parse error before ':' token
self1.c:7: warning: label `std' defined but not used
ひょっとして環境依存?
871 :
デフォルトの名無しさん :03/06/30 10:26
俺の方どなたかよろしく(T_T)
873 :
デフォルトの名無しさん :03/06/30 10:41
>>872 得点=入力のうち、入力の部分だけでいいんだよな?(T_T)
つまりprintf("得点="); scanf("%d",pts+i);みたいな感じでいいんだよな?(T_T)
×入力の部分だけで ○ユーザーが入力するのは入力の部分だけで (T_T)
>>870-871 なんだ、C++か。間違ったプログラムがCで記述されてて、
俺、C++知らないから、これも何か特殊なCかと思いますた。
いや、マジで間違えた。スマソ。
879 :
デフォルトの名無しさん :03/06/30 10:59
>>878 得点入力時に数字以外が入力された場合はどうすればいいの?(T_T)
>>879 while(a < 0 || a > 100 && a!=999){
puts("得点が範囲(0〜100)外である。再入力してください");
scanf("%d",&a);}
たぶんすべてこんな感じで
数字0〜100以外のはすべて 「得点が範囲(0〜100)外である。再入力してください」 これで。
以下のソースでtest.name = "abc......."としている部分がありますが コンパイルエラーにならないのはどうしてでしょうか。 普通はstrncpyとかを使うのではないでしょうか。 また、配列の大きさが指定されていないので、 このソースはやばいと思うのですがどうでしょうか。 #include <stdio.h> typedef struct { char *name; } NAME; int main(void) { NAME test; test.name = "abcdefghijklmn"; printf("%s\n", test.name); return 0; }
883 :
デフォルトの名無しさん :03/06/30 11:18
>>882 ここで聞くべきじゃないね。
文字列定数("abc....n")はメモリ上のどこかに置かれ、その先頭アドレスをtest.nameに代入しているので問題ない。
もしもstrncpyを使ったらtest.nameが指す領域を確保していないので何が起こるか分からない。
>>883 あい、すいません。ここは宿題スレでしたね。間違えました。
別のスレで尋ねなおします。
>>885 いえ、まだ別に尋ねたいことがあったのですが、
それは別のスレでということです。
どうもすいませんでした。
あの、俺の方のどうなってますか??(T_T) エラー起こってても途中まででもいいので見せてください。
888 :
デフォルトの名無しさん :03/06/30 11:47
入力処理に手間取ってな #include <stdio.h> #include <stdlib.h> #include <string.h> int order01(int *ten,int tensu,int n) { int i; for(i=0;i<=n;i++) if(ten[i]==tensu) break; return i+1; } static int cmp(const void *xp,const void *yp) { const int *x=xp; const int *y=yp; return (*x==*y)?0:(*x<*y)?1:-1; }
int main() { int tensu[20]={0},ten[20]; int i,j,fail; char buf[1024]; for(i=0;i<20;i++){ do{ printf("得点="); fgets(buf,sizeof buf,stdin); if(sscanf(buf,"%d",tensu+i)!=1) fail=1; else if((tensu[i]<0||tensu[i]>100)&&tensu[i]!=999) fail=1; else fail=0; }while(fail&&printf("得点が範囲(0〜100)外である。再入力してください。\n")); if(tensu[i]==999) break; } memcpy(ten,tensu,sizeof(int)*i); qsort(ten,i,sizeof(int),cmp); printf("\n\n"); for(j=0;j<i;j++) printf("%2d人目 %5d%5d\n",j+1,tensu[j],order01(ten,tensu[j],i-1)); return 0; }
サンクス!!!!神様!(T_T)
qsort使うなと言われたら、自分でソート関数をつくって。 多分ソートしてから順位付けするのが一番だから。
894 :
デフォルトの名無しさん :03/06/30 12:02
よろしくお願いします(;´Д`) −−−−−−−−−−−−−−−−−−− 一辺10の立方体の内部に整数値を座標にした点を4つランダムに生成し、その4点を 頂点にした4面体の体積および4面体が立方体の中心を含むか含まないかを表示する プログラムを作成しなさい。 −−−−−−−−−−−−−−−−− と言う課題なのですが・・
895 :
デフォルトの名無しさん :03/06/30 14:21
struct HELI{ char gazou[20]; float Longitude; float Latitude; float Height; float Range; float Angle; }csv[80]; struct HELI *sp; sp=csv; このような構造体を作って、次のようにして、CSVファイルからデータを読み込もうとしたところ。 gazouという配列に一行全部読み込まれてしまいました。 fscanf(fp,"%s,%f,%f,%f,%f,%f",sp->gazou,sp->Longitude,sp->Latitude,sp->Height,sp->Range,sp->Angle) なにがいけなかったのでしょうか?どうか教えてください。よろしく願いします。 ちなみに、読み込みたっかたCSVは次のようなものです。 CRW_7536.jpg,145.302718,-34.389002,140.7,30.96,0 CRW_7537.jpg,145.302723,-34.388943,140.5,31.53,0
896 :
デフォルトの名無しさん :03/06/30 14:24
読み込んだファイル(標準入力)内の単語の出現回数を数えて表示する プログラムを実装せよ。ただし、出現回数が-nオプションで指定した回数 以上の単語だけを表示する(デフォルトで1回以上) ----------------------------------------------------- お願いします。
897 :
デフォルトの名無しさん :03/06/30 14:43
898 :
デフォルトの名無しさん :03/06/30 14:46
TOWN 4回 みたいなかんじです。
899 :
デフォルトの名無しさん :03/06/30 15:00
そういうのってハッシュで実装するものなの?
900 :
デフォルトの名無しさん :03/06/30 15:10
はい。
>>895 fscanfの区切り文字で有効なのはスペース、タブ、改行文字だけなのでカンマだとできません
char buf[1024];
int i;
fgets(buf, sizeof(buf), fp);
for(i=0;i<(int)strlen(buf);i++)
if(buf[i]==',') buf[i]=' ';
sscanf(buf,"%s %f %f %f %f %f",sp->gazou,&sp->Longitude,&sp->Latitude,&sp->Height,&sp->Range,&sp->Angle);
で、こんな感じでやればできるんだけど、構造体の中のfloatは精度の高いdoubleにしたほうがいいでしょう
903 :
デフォルトの名無しさん :03/06/30 15:51
>>895 構造体内のfloatをdoubleにする。
×fscanf(fp,"%s,%f,%f,%f,%f,%f",...);
○fscanf(fp,"%s%lf%lf%lf%lf%lf"...);
×CRW_7536.jpg,145.302718,-34.389002,140.7,30.96,0
○CRW_7536.jpg 145.302718 -34.389002 140.7 30.96 0
904 :
デフォルトの名無しさん :03/06/30 16:26
>>894 中心を含むかは俺のレベルじゃ無理。つーかめんどそう。
簡単なのかな?
それと正しい結果かはわかりませんからあしからず。
#include <math.h>
/* 法線ベクトル*/
void HV(int *p,int *q,int *r)
{
int i,t1,t2;
for(i=0; i<3; ++i){
t1 = (i+1) % 3;
t2 = (t1+1) % 3;
r[i] = p[t1]*q[t2]-p[t2]*q[t1];
}
}
double V(int *h,int *a,int *A)
{
double f=0,d=0;
int i;
for(i=0; i<3; ++i){
d += h[i]*A[i];
f += h[i]*a[i];
}
/*a→平面へのLと面積Sの打ち消しがある*/
return fabs(f-d) / (2*3);
}
905 :
デフォルトの名無しさん :03/06/30 16:26
int main(void) { int k[4][3],m[2][3]; int h[3]; int i,j; for(i=0; i<4; ++i){ if(scanf("%d,%d,%d",&k[i][0],&k[i][1],&k[i][2]) != 3) return ; } for(i=0; i<2; ++i){ for(j=0; j<3; ++j){ m[i][j] = k[i+1][j] - k[0][j]; } } HV(m[0],m[1],h); printf("%f",V(h,k[3],k[0])); return 0; }
>>895 fscanf(fp,"%[^,],%f,%f,%f,%f,%f",sp->gazou,sp->Longitude,sp->Latitude,sp->Height,sp->Range,sp->Angle);
どっちかと言えば、fgets()してからばらした方がいいかもね。
>>902 ,903,906
ありがとうございます!
出来ました!
マウスのカーソルが砂時計表示になる時間を計測し、1日ごとにログをとる プログラムをSDKで作りたいんですがどうすれば良いんですか? 方法としてはOSからカーソルを変更させる命令信号が出ると思うので それを監視すればいいのでは。と考えているんですが、考え方からして 間違っていますか?OSを監視してその信号をキャッチするAPIとか あるんでしょうか? 教えてください。よろしくおねがいします。
>>908 おまえはまず電波で信号をキャッチする方法から覚えたほうがいい。
マジレスするとスレ違い。
910 :
デフォルトの名無しさん :03/06/30 20:36
文字の集合を表す構造体Setを定義し、要素を追加する関数を定義し、その動作を確認しなさい。 追加した要素が 集合の新しい要素の場合1、既に存在していた場合0を返すとする。 int addset(Set &set,char a) わかりましぇん(;´Д`)
>>910 それだけじゃ、わかりましぇん(;´Д`)
912 :
デフォルトの名無しさん :03/06/30 20:39
913 :
デフォルトの名無しさん :03/06/30 20:43
おそらくそうだと思いましゅ。 私もこれだけの情報した与えられてないので・・・ 質問は受けないってゆうじじい教授でして・・・。(;´Д`)
914 :
デフォルトの名無しさん :03/06/30 20:44
915 :
(;´Д`) :03/06/30 20:45
C++です!
916 :
デフォルトの名無しさん :03/06/30 20:47
じゃあパス
917 :
デフォルトの名無しさん :03/06/30 21:06
すいません。C++の」宿題に行き詰ったので教えてください。まだまだ、完成度が低いんですがよろしくお願いします。 【プログラム内容】 おみくじプログラム(大吉、中吉、小吉、吉、末吉、凶、大凶)とその改良型を選んで実行できるプログラム #include <stdio.h> #include <stdlib.h> #include <time.h> void main (void) { int a; int b, su1, su2; printf("以下の三種類から選べ\n"); printf("1:普通のおみくじ\n"); printf("2:改良型\n"); rintf("3:おみくじプログラムを実行しない\n"); scanf("%d",&a); switch(a)
918 :
917のつづき :03/06/30 21:07
{ case 1: printf("おみくじプログラムを実行しますか?y:YES n:NO"); scanf("%d",&b); rewind(stdin); if((b == 'Y') || (b == 'y')); { srand((unsigned int)time(NULL)); su1 = rand(); su2 = su1 % 16; switch(su2) { case 0:printf("今日のおみくじは大吉です\n"); break; case 1: case 2:printf("今日のおみくじは中吉です\n"); break; case 3: case 4: case 5:printf("今日のおみくじは小吉です\n"); break;
919 :
917のつづき :03/06/30 21:07
case 6: case 7: case 8: case 9:printf("今日のおみくじは吉です\n"); break; case 10: case 11: case 12:printf("今日のおみくじは末吉です\n"); break; case 13: case 14:printf("今日のおみくじは凶です\n\n"); break; case 15:printf("今日のおみくじは大凶です\n"); } } else { printf("おみくじプログラム実行しませんでした"); } break; case 2: 以下省略(ってか未完成)
920 :
デフォルトの名無しさん :03/06/30 21:09
C++なのですか?
921 :
917のつづき :03/06/30 21:12
↑のをビルドするとエラーが起きてしまうんです。 「else文とif文が一致しません」とでてしまうのですが、どこがどう間違えてるのかさっぱり解からないので 間違えてる所を教えてください。おねがいします
922 :
デフォルトの名無しさん :03/06/30 21:14
私にはCに見えるのですが。
923 :
917のつづき :03/06/30 21:15
>>920 はい。そうです。
明日が提出日なのでかなり焦ってしまってます。
プログラム板独自のマナーとか無視して書いてしまったのならごめんなさい。
C++です。
ソフトは、マイクロソフトのビジュアルC++6.0を使ってます。
>>923 CとC++の違いも解かってない。
全然駄目じゃん。
925 :
917のつづき :03/06/30 21:26
省略してるとこが間違ってんのかな
927 :
917のつづき :03/06/30 21:33
>>926 省略の先は
case2:
printf("おみくじ(改良型)プログラムを実行しますか?y/n");
scanf("%d",&c);
}
}
までしか出来てません…。やべぇ
928 :
デフォルトの名無しさん :03/06/30 21:33
まず、printfからして・・・
}これ一個削除してみてみて case2: printf("おみくじ(改良型)プログラムを実行しますか?y/n"); scanf("%d",&c); }
改良ってどこ改良するの?
>>929 削除しましたがエラーは変わりません。
case1の
普通のおみくじの中で何か間違えてるのかなと思うのですが…
なんで、y or Y 以外を入力した場合は実行しませんでしたとメッセージが出るという風にしたはずなのに…
932 :
917のつづき :03/06/30 21:40
ここなら親身に教えてくれるって聞いて来ました…。
933 :
デフォルトの名無しさん :03/06/30 21:42
>>910 #include <string>
#include <iostream>
using namespace std;
struct Set{
char ch[256];
string str[256];
};
int addset(Set *set,char a);
int main(){
char a='k';
Set set;
int i;
cout<<"要素操作みたいな・・・\n";
i=addset(&set,a);
cout<<"要素"<<i;
return 0;
}
int addset(Set set,char a){
int i=0;
while(set->ch[i]!='null'){
i++;
}
return i;
}
このままじゃえらー出るよ
後は自分で!
俺は風呂に入ってくる!
934 :
デフォルトの名無しさん :03/06/30 21:43
↓よろしくお願いします。 複数の文字列を読み込み、これをリストに格納し、出力するプログラムを作成しなさい。 ここで入力とは逆の順序のリストと入力順のリストの2通りを作成しなさい。
>>917 switch(a)
{
case 1:
/* ここから
printf("おみくじプログラムを実行しますか?y:YES n:NO");
printf("おみくじプログラム実行しませんでした");
} ここまで*/
break;
case2:
printf("おみくじ(改良型)プログラムを実行しますか?y/n");
scanf("%d",&c);
}
ここからここまでコメント入れてコンパイル通ったら、一行ずつコメント外して繰り返せ
>>930 ふつうのおみくじにループをつけてdo while文使おうと思ってます。
y、n、Y、N以外はエラー表示でまた入力の所に戻るってのをしようと思ってます
937 :
デフォルトの名無しさん :03/06/30 21:48
>>934 それはリストと言うよりスタックとキューだね。
>rintf("3:おみくじプログラムを実行しない\n"); これかな?
>>858 どうもありがとうございました・・・
ってこれだけじゃ動かないんですけども
他に何か書き加えるんですか?
教えてください。
941 :
デフォルトの名無しさん :03/06/30 22:00
>>934 #include <stdio.h>
struct Set{
char ch[256][256];
};
int search(char *ch);
int main(){
char ch[256];
int i;
printf("なんな入力すれば・・・\n");
gets(ch);
i=search(&ch);
printf("%d",i);
}
int search(char *ch){
int i=0;
struct Set set;
while(set.ch[i][0]=='NULL'){
i++;
}
/*引数chをなんかする*/
return i;
}
あと、よろしく!
>>938 あ、すいません。それはこのスレへの記載ミスです。ごめんなさい。
今一文一文やり直してるのですがcase15まではなんの問題も起きませんでした。
if文って文末に「;」いるんですか?
>>938 あ、すいません。それはこのスレへの記載ミスです。ごめんなさい。
今一文一文やり直してるのですがcase15まではなんの問題も起きませんでした。
if文って文末に「;」いるんですか?
default
945 :
デフォルトの名無しさん :03/06/30 22:31
複素数がわかってないのか実装方法がわかってないのか・・・ 11-2とか簡単だろ ヒントという名の答えがかいてあるし
なんとか、エラーは出なくなりました。新しく作ったら直った…なんで? けど、Y押してもy押しても「おみくじプログラムを実行しませんでした」と表示されます。 なんで???
950 :
デフォルトの名無しさん :03/06/30 23:23
CでAPIを使うのに分かりやすい解説書、解説サイトありませんか? 猫でもわかる・・・は一応読破しました。 他にもあればお願いします。
猫を読破したならもう必要ないだろ。
952 :
デフォルトの名無しさん :03/06/30 23:28
いや、でもまだまだ知りたいことがあるんで。
中学生なんですけど、僕もAPIについて 知りたいです。でも、猫なんとかってのはまだ難しすぎました。 基本的なことからやりたいので、超初歩的なことから書いてある サイトを知らないでしょうか?
一通り、Cは理解しました。 C++もAPIを使う以前に必須ですか?
APIはWIN32APIと脳内変換すべきか・・・
API=WIN32APIでいいんですか? CでWinアプリを作るっていうのも 要するにWIN32APIを使うってことなんですかね
>>894 コードを短くするのに悩みそうなのでアイデアだけ。
以下では3次元ベクトル u, v の内積と外積を i(u,v), o(u,v) で表す。
またPを任意の点とする。四点A,B,C,Dに対し、
a0,a1,a2,a3,b0,b1,b2,b3 をそれぞれベクトル
AP,AB,AC,AD,BP,BC,BD,BA とし、
s1 = o(a2,a3), s2 = o(a3,a1), s3 = o(a1,a2), t1 = o(b2,b3)
とするとき、四面体ABCDの体積を vol は vol = fabs(i(s1,a1))/6 で求まる。
そして点Pが四面体ABCDの内部にあることは次と必要十分。
vol != 0 &&
i(s1,a1)*i(s1,a0) >= 0 &&
i(s2,a2)*i(s2,a0) >= 0 &&
i(s3,a3)*i(s3,a0) >= 0 &&
i(t1,b1)*i(s0,b0) >= 0
なぜなら、s1 = o(a2,a3) は△ACDを含む平面の法線ベクトルなので
この平面に関して点Pと点Bが同じ側にある場合に限り、
内積 i(s1,a1) と i(s1,a0) の正負は一致する、
つまり i(s1,a1)*i(s1,a0) >= 0 となる。ただし、等号は
vol == 0 の場合か△ACDを含む平面上に点Pが存在する場合に成立。
同様の検査が4つの面について合格し、なおかつ体積 vol が 0 でない場合、
そしてその場合に限り、点Pは四面体ABCDの内部にあるといえる。
>>957 C&API直打ちでプログラムを作るのは骨が折れるぞ。
そこそこのプログラムを作りたいならC++とオブジェクト指向に
関する理解は必須。
初学者の変な言葉づかいを容認して話を進めようとするのはあまり感心しない
961 :
デフォルトの名無しさん :03/07/01 04:02
すみません、超初心者なので行き詰まってます・・・ 10桁までの整数を読み込み1桁ずつchar型配列ketaに格納するには どうすれば良いですか? 例えば3254と入力されたら keta[0]=3,keta[1]=2,keta[2]=5,keta[3]=4という具合に。 スキャンを使ってもうまくいきません。 どうかお願いします。
>>961 char keta[1024];
int n;
scanf("%d",&n);
sprintf(keta,"%d",n);
こうやる
つーか単に
char keta[1024];
fgets(keta,sizeof keta,stdin);
でいいと思うが。10桁以内か、数字列かどうかの判断はその後するということで。
↓よろしくお願いします。 複数個の整数データを読み込むものとする. その和が 107 を超えるか,または,読み込んだデータの個数が 8 個になった時点で データの読み込みを中止し,読み込んだデータの和と個数を出力するプログラムを書け. 結果は,和と個数を1つ以上のスペースで区切って出力すること.
>>961 あと最後に
for(i=0 ;i<10 ;i++)
keta[i] -= '0';
#include <iostream> int main() { int const max_num = 8; int const end_threshold = 107; int num = 0; int sum = 0; while( sum <= end_threshold && num < max_num ) { int n; if( std::cin >> n ) { sum += n; ++num; } else { return 1; } } std::cout << sum << ' ' << num << std::endl; return 0; }
char keta[11]; int i; fgets(keta,11,stdin); for( i=0; keta[i] && i<11; i++ ) keta[i] -= '0';
972 :
デフォルトの名無しさん :03/07/01 16:38
すみません、教えていただけませんか? a0 = 0, a1=1, an+2 = an+1 + an (n は 0 以上) で定まる数列 an を求める関数 int fibonacci(int n) を、 再帰を使って作成しなさい。 動作確認をするために、20項まで出力する main 関数も作成しなさい。 この数列は、Fibonacci(フィボナッチ)数列と呼ばれ、 a2 = 1, a3 = 2, a4 = 3, a5 = 5, a6 = 8, a7 = 13, ・・・となる。
#include <stdio.h> int fibonacci(int n) { if (n == 0) return 0; else if (n == 1) return 1; else return fibonacci(n - 1) + fibonacci(n - 2); } int main(void) { printf("%d\n", fibonacci(20)); return 0; }
>>973 ありがとうございました!
本当に助かりました
すみません。下のような式の場合、a はどのような値になるのでしょうか? a = x && y;
xとyに拠る
978 :
デフォルトの名無しさん :03/07/01 22:08
979 :
デフォルトの名無しさん :03/07/01 22:11
指定されたデータを削除する配列のプログラムはどうしたらいいんですか? 削除して空いた場所に、最後のデータを移動するのと、 後のデータを1個ずつずらすものをつくりたいです。配列は順序よく並んでいません。 デリートを使ってお願いします
さてエスパーに電話するか
俺のセブンセンシズによると
>>979 は
配列を格納したリストがつくりたいのだと小宇宙が語っている
983 :
デフォルトの名無しさん :03/07/01 22:59
一辺10の立方体の内部に整数値を座標にした点を4つランダムに 生成し、その4点を頂点にした四面体の体積および四面体が 立方体の中心を含むか含まないかを表示するプログラムを作成しなさい。 ヒント 点Pが四面体ABCDの内部にあるかどうかは、四面体ABCDの各面とPにより 形成される4つの四面体PABC,PBCD,PCBD,PDABの体積の和が、 の四面体の体積よりも大きい場合にはPは四面体の外部にある。 お願いします。
984 :
デフォルトの名無しさん :03/07/01 23:02
3次元空間内の4点を頂点とする四面体の体積を求める関数 3次元ベクトルを扱う関数の定義ファイル "vector.h" を使ってお願いします。 お願いします
宇治社中で聞くとか
うむ俺たちには vector.h は無理だな。 vector なら使えるが。
宇治社中って何ですか?
>987 vectorでお願いします
vector は使えるが、おそらく vector.h の代わりにはならないんだなこれが。
そうなんですか?全く何のことやら分からないです
↓STLマンセーなヤシ
vector_3d<T>
無視された958に黙祷。。。
次スレまだ〜?
しかし、意味不明
>>997 日本語は正しくな。
「しかし漏れはバカだから理解できません」
だろ?
999 :
デフォルトの名無しさん :03/07/01 23:23
1000 :
デフォルトの名無しさん :03/07/01 23:23
1000げとー
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。