(・∀・)C/C++の宿題やらせてください。ver10
1 :
デフォルトの名無しさん :
03/07/01 23:36
2?
四面体の宿題は禁止
4 :
デフォルトの名無しさん :03/07/01 23:46
どうしても課題が書けません(´・ω・`) 問題はこれです 整数を一つ読み込み、それが素数か否かを判定するプログラムを書け。素数とは、1ごその数自身以外の数では割り切れない数である。 入力した数をxとすると、この問題を解く一つの方法は、xを2,3,4、・・・、√xで次々と割って余りを求めることである。 割った余りが0だったら素数でないと分かる。割り切れないまま繰り返しを続けていって、割る数がxの平方根より大きくなったら 素数であると分かる。 一時間くらい挑戦してたら片方判定出来たり、もう片方判定出来て片方判定できなくなったりしますた・・・ 一応ソース張ってみます。
6 :
デフォルトの名無しさん :03/07/01 23:48
#include <stdio.h> int main(void){ int x,heihoukon,n,i; printf("x: ");scanf("%d", &x); i=1; heihoukon=0; while(heihoukon*heihoukon<x) heihoukon=heihoukon+1; if(heihoukon*heihoukon==x) printf("heihoukon:%d\n",heihoukon); else printf("heihoukon ha %d-1 kara%d no aida \n",heihoukon,heihoukon); while(i<=heihoukon){ i=i+1; if(x%i==0) printf("x is not sosu\n");break;} if(i>heihoukon) printf("x is sosuu\n"); return(0); }
「片方」って意味がわからん。
8 :
デフォルトの名無しさん :03/07/01 23:54
>>7 素数でないか素数であるかと表示させたいのに片方しか表示されなかったりしました
>>6 breakの位置が変だろ。すぐループ抜けるぞ。
if(x%i==0) {
printf("x is not sosu\n");
break;
}
こう書け。これでもまだおかしいがな。
ifとかforは全部{}で囲む癖つけた方が無難だぞ。
10 :
デフォルトの名無しさん :03/07/02 00:04
12 :
デフォルトの名無しさん :03/07/02 00:13
>>11 変更したら無限ループに突入した模様・・・
あぁわかんない(ノд`)
13 :
デフォルトの名無しさん :03/07/02 00:15
と思ったら出来ました (*´д`*)ありがとうございました
14 :
デフォルトの名無しさん :03/07/02 01:08
一辺10の立方体の内部に整数値を座標にした点を4つランダムに 生成し、その4点を頂点にした四面体の体積および四面体が 立方体の中心を含むか含まないかを表示するプログラムを作成しなさい。 ヒント 点Pが四面体ABCDの内部にあるかどうかは、四面体ABCDの各面とPにより 形成される4つの四面体PABC,PBCD,PCBD,PDABの体積の和が、 の四面体の体積よりも大きい場合にはPは四面体の外部にある。 お願いします。
>>4 これ使え。
int isprime(int n) {
int x;
for (x = 2; x * x <= n; x++)
if (n % x) return 0;
return 1;
}
何度書いたんだろう、この関数。
>>16 >if (n % x) return 0;
わざと?
if (n % x == 0) return 0;
正の整数値 n を読み込み,偶数の時はその値を 2 で割り,また, 奇数の時はその値を 3 倍したものに 1 を加えるという処理を n の値が 1 になるまで繰り返すプログラムを書いてください。 その際,入力された値,及び,各演算を行った結果得られた n の値を, 得られた順番に1つ以上のスペースを空けて出力すること。 C++です。どうかよろしくお願いします・・・。
Cだけど。 void hoge(int n) { while (n != 1) { printf("%d ", n); if (n % 2 == 0) n /=2; else n = 3*n + 1; } }
21 :
デフォルトの名無しさん :03/07/02 05:53
複数の文字列からなるリストからキーとなるデータを探し、もしそれがあればそのあとに新しいデータを、 もし無ければ先頭に新しいデータを挿入するプログラムを作成せよ。 たとえば、asakura itoh sakataで、itohをキーとして検索し、新しいデータをyamadaとして、asakura itoh yamada sakata とします。 tanakaをキーとして検索すると、ないので、tanaka asakura itoh sakataとします。 C言語の宿題です。お願いします。
>>19 C++ 初めて使うけど
#include <iostream>
typedef unsigned long long int U64 ;
typedef struct Struct_NumList
{
U64 Num ;
Struct_NumList* Next ;
} NumList ;
class Collatz
{
private:
NumList* First ;
NumList* Add ( U64 num ) ;
void Del ( NumList* ptr ) ;
void Out ( NumList* ptr ) ;
public:
Collatz ( U64 num ) ;
~Collatz () ;
void Out ( void ) ;
} ;
NumList* Collatz::Add ( U64 num ) { NumList* ptr ; ptr = new NumList ; ptr->Num = num ; if ( num == 1 ) ptr->Next = NULL ; else { if ( num & 1 ) num = num * 3 + 1 ; else num = num / 2 ; ptr->Next = Add ( num ) ; } return ptr ; } void Collatz::Del ( NumList* ptr ) { if ( ptr->Next != NULL ) Del ( ptr->Next ) ; delete[] ptr ; return ; } void Collatz::Out ( NumList* ptr ) { if ( ptr != NULL ) { std::cout << ptr->Num << " " ; Out ( ptr->Next ) ; } else std::cout << std::endl ; return ; }
Collatz::Collatz ( U64 num ) { if ( num != 0 ) First = Add ( num ) ; else First = NULL ; } Collatz::~Collatz () { Del ( First ) ; } void Collatz::Out () { Out ( First ) ; return ; } int main () { U64 n = 2 ; { Collatz* C ; C = new Collatz ( n ) ; C->Out() ; delete C ; } return 0 ; }
>>24 のCollatzのデストラクタをミスってた
Collatz::~Collatz ()
{
if ( First != NULL ) Del ( First ) ;
}
>>21 動作未確認だけど、こんな感じで
各種関数の使い方とエラー時の始末は自分で考えて下さい
#include <stdlib.h>
#include <string.h>
typedef struct Struct_Data
{
char *Name ;
struct Struct_Data *Next ;
} Data ;
typedef struct
{
Data *First ;
} List ;
Data *NewData ( char *str )
{
Data *New = malloc ( sizeof ( Data ) ) ;
New->Name = malloc ( strlen ( str ) + 1 ) ;
strcpy ( New->Name, str ) ;
return New ;
}
List *NewList () { List *New ; New = malloc ( sizeof ( List ) ) ; New->First = NULL ; return New ; } void AddList ( List *list, Data *New ) { Data *Cur = list->First ; while ( Cur != NULL ) { if ( strcmp ( Cur->Name, New->Name ) == 0 ) { New->Next = Cur->Next ; Cur->Next = New ; break ; } else Cur = Cur->Next ; } if ( Cur == NULL ) { New->Next = list->First ; list->First = New ; } return ; }
void AddString ( List *list, char *str ) { AddList ( list, NewData ( str ) ) ; }
>>19 #include <iostream>
using namespace std;
int main(void)
{
unsigned n;
cin >> n;
while(n > 1)
{
int i = n;
if(i % 2 == 0)
i = i / 2;
else
i = i * 3 + 1;
cout << n << ' ' << i << endl;
n--;
}
return(0);
}
文字列を入力して、その文字列が逆から読んでも同じ文字列かどうか判定するプログラム、というのはどう書けばよいのでしょうか・・? よろしくお願いします。。。
>>30 #include<stdio.h>
#include<string.h>
#define TRUE 1
#define FALSE 0
int isreverse( const char *word ){
int i, len;
for( i = 0, len = strlen( word ) - 1; i < len; i++, len-- ){
if( word[i] != word[len] )
return FALSE;
}
return TRUE;
}
入力文字列 word の改行コードは、ヌル文字で上書きしておいてね♪
下記の2つのプログラムをForループの処理が終わるたびに配列を表示するように 改良してください。 #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); puts("昇順にソートしました。"); for (i = 0; i < nx; i++) printf("x[%d] = %d\n", i, x[i]); return (0); }
2つめ /*--- 単純交換ソート(第2版:交換回数による打ち切り) ---*/ void bubble(int a[], int n) { int i, j; for (i = 0; i < n - 1; i++) { int exchg = 0;/* パスにおける交換回数 */ for (j = n - 1; j > i; j--) if (a[j - 1] > a[j]) { swap(int, a[j - 1], a[j]); exchg++; } if (exchg == 0) break;/* 交換が行われなかったら終了 */ } }
>>35 このプログラムは並び替えをするプログラムです。
たとえば、
22 5 11 32 120 68 70
を入力すると
5 11 22 32 68 70 120
を出力するのです。
その並び替える途中を、たとえば
22 5 11 32 68 120 70
・
・
・
というのを出力して欲しいのです。
よろしくお願いします。
>>33-34 ん〜と、バブルソートのソートっぷり(?)を見たいんだよね?
1つ目の方
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]);
}
for( j = 0; j < n; j++ )
printf("%d ",a[j]);
printf("\n");
}
}
2つ目の方 void bubble( int a[], int n ) { int i, j; for ( i = 0; i < n - 1; i++ ) { int exchg = 0;/* パスにおける交換回数 */ for ( j = n - 1; j > i; j-- ) if ( a[j - 1] > a[j]) { swap( int, a[j - 1], a[j] ); exchg++; } if ( exchg == 0 ) break;/* 交換が行われなかったら終了 */ for( j = 0; j < n; j++ ) printf("%d ",a[j]); printf("\n"); } }
う、リロードしないで書き込んじゃった…。 問題解釈はあっていたみたいだね。 ちなみに両方とも確認済み。
40 :
デフォルトの名無しさん :03/07/02 22:59
>>40 ちょっとした勘違いで
>>26-28 は、そのままでは駄目ポ
と言う訳で、お詫びに全部作り直したので、少し待っててね
42 :
(´・ω・`) :03/07/02 23:20
3次元上の点でp1,p2,p3,p4があるとする。p1,p2は水平で、p3,p4も水平であり、 この2線は平行している。p1,p2を結んだ中点とp3,p4を結んだ中点を結んだものが 対称面となる。 このとき、この法線ベクトルを求めるプログラムを書きなさい。 どう書けばいいの・・・?_| ̄|○||||
>>42 まぁお前は3Dゲーム作りは不可能ってこった
こいつ文字列を構造体に格納する宿題でさんざん荒らした香具師じゃね−のか? 俺ぜってー答えないことに決めた。
47 :
デフォルトの名無しさん :03/07/02 23:28
→□□□□□ □■□■□ □□■□■ ■□■□■ □□□□□→ 左上から入り、右下へ出る迷路のプログラム(黒は通れない)を、 反復深化でプログラミングを書き換えろと言う宿題が出たのですが、 さっぱりわかりません。
点と点を結んだら線にしかならんと思うが・・・
49 :
デフォルトの名無しさん :03/07/02 23:29
#include <stdio.h> int m[7][7]={{2,2,2,2,2,2,2}, {2,0,0,0,0,0,2}, {2,0,2,0,2,0,2}, {2,0,0,2,0,2,2}, {2,2,0,2,0,2,2}, {2,0,0,0,0,0,2}, {2,2,2,2,2,2,2},}; int Si,Sj,Ei,Ej,success, sp,ri[100],rj[100]; int visit(int,int); void main(void) { sp=0; success=0; Si=1; Sj=1; Ei=5; Ej=5; printf("\n迷路の探索\n") if (visit(Si,Sj)==0) printf("出口は見つかりませんでした\n") }
50 :
デフォルトの名無しさん :03/07/02 23:29
つづきです。 int visit(int i,int j) { int k; m[i] [j]=1; ri[sp]=i,rj[sp]=j;sp++; if(i==Ei && j==Ej){ for(k=0;k<sp;k++) printf("(%d,%d)",ri[k],rj[k]); success=1; } if(success!=1 && m[i][j+1]==0) vidit(i,j+1); if(success!=1 && m[i+1][j]==0) vidit(i+1,j); if(success!=1 && m[i][j-1]==0) vidit(i,j-1); if(success!=1 && m[i-1][j]==0) vidit(i-1,j); sp--; return(success); }
51 :
デフォルトの名無しさん :03/07/02 23:30
どうか、よろしくお願いいたします。
52 :
デフォルトの名無しさん :03/07/02 23:32
書いたのは、与えられたプログラムで、 これを反復深化で書き直せというのが、問題です。 わかるづらくてすいません。
55 :
デフォルトの名無しさん :03/07/02 23:34
VC++を独学で勉強するのによい参考書しりませんか?
黙って宿題してろ
>>42 問題文が意味不明だぞ。
p1,p2が水平ってどういう意味だ?
図にして説明してみろ。
58 :
デフォルトの名無しさん :03/07/02 23:40
>>54 47、49、50、51、52
が自分の書き込みです。
よろしくお願います。
60 :
デフォルトの名無しさん :03/07/03 00:09
61 :
デフォルトの名無しさん :03/07/03 00:18
スレッドのわかりやすいサンプルを教えてください。 お願いします。
62 :
デフォルトの名無しさん :03/07/03 00:22
>>37 さん、レスありがとうございます。
一つ目を実行してみたところ
5 22 11 32 68 120 70
5 11 22 32 68 70 120
5 11 22 32 68 70 120
5 11 22 32 68 70 120
5 11 22 32 68 70 120
5 11 22 32 68 70 120
とおかしな出力になってしまいました。
さらなる改良をよろしくお願いします。
そんでいいんちゃう?
>>65 実況中継が欲しいのでは?
5 22 11 32 68 120 70
5 11 22 32 68 70 120
おおっ〜と、ここで 11 と 22, 120 と 70 がそれぞれ入れ替わりました
いや〜、今日もXXX(←関数名)は良い仕事をしてますね
…見切った! 多分、
ht
ttp://hspcenter.com/hspsc1/hsp19.html ↑これの下の方にある「数列の変化の様子」みたいなのを再現したいんでしょう!?
じゃあ、バブルソートモドキ関数を真・バブルソート関数にして…
1つ目の方
void bubble( int a[], int n )
{
int i, j;
for ( i = n; i > 0; i-- ) {
for ( j = 1; j < i; j++ )
if ( a[j - 1] > a[j] )
swap( int, a[j - 1], a[j] );
for( j = 0; j < n; j++ )
printf("%d ",a[j]);
printf("\n");
}
}
2つ目の方 void bubble(int a[], int n) { int i, j; for ( i = n; i > 0; i-- ) { int exchg = 0;/* パスにおける交換回数 */ for ( j = 1; j < i; j++ ) if ( a[j - 1] > a[j] ) { swap( int, a[j - 1], a[j] ); exchg++; } if ( exchg == 0 ) break;/* 交換が行われなかったら終了 */ for( j = 0; j < n; j++ ) printf("%d ",a[j] ); printf("\n"); } }
あ、今思いついたんだけど、もしかして swap 関数が呼び出される度に表示したいのかな? それも違うんだったら、表示の具体例を書き込んでね♪
>>47 問題
>>49-50 書き換える前の物
>>51 頼んだ
という事か。反復進化ってなに?調べても5件しかないし、そのうち3件は、
キャッシュが使えなく、スクロールが遅い変なページだし。
>>33 2つ目は自分でヤッテ
void bubble( int a[], int n )
{
int i, j, k;
for ( i = n; i > 0; i-- )
{
for ( j = 1; j < i; j++ )
{
if ( a[j - 1] > a[j] )
{
swap( int, a[j - 1], a[j] );
for( k = 0; k < n; k++ )
printf("%d ",a[k]);
printf("\n");
}
}
}
}
>>70 よう分からんけど、言葉の響きと、実際のソースから推測すると
再帰を使わずに、同様の処理をしろと言う事ではなかろうか?
74 :
デフォルトの名無しさん :03/07/03 08:53
>>70 深さ優先探索の深さに限度を設定し、 解が見つかるまで、上限値を段階的に増やしていくというやり方です。 1回で解が見つからなければ、さらにもう1手探索をし、 それでもだめならば、もう1手と、上限値を1手ずつ増やしていく という方法のことです。 よろしくお願いします。
75 :
デフォルトの名無しさん :03/07/03 08:57
2次元配列に複数の文字列を読み込み、文字数の長さ順にソートして表示するプログラムを作成せよ。 ただし、ポインタ変数を用いること。 2次元配列のときのポインタの使い方が分かりません・・・
char **InputData;
InputData = (char **)malloc(sizeof(char*) * データの個数);
for(i=0;i<データの個数;i++){
InputData[i] = (char *)malloc(sizeof(char) * 1つの文字列の最大長);
gets(InputData[i]);// (σ´д`)σ
}
文字列の長さは、strlen(InputData[i])で。
ソートを行う場合は、strcpy連発するよりもポインタでの交換が吉。
詳しくは
>>80 が説明してくれるはず。
説明しようと思ったけど80じゃないから遠慮しよう。
int main(void) { char str[] = "aiueo"; char *ptr = str; --------------------------------------------------- 以上のような変数宣言をしたときの 1.ポインタ変数のアドレス 2.ポインタ変数に格納されている値 3.ポインタ変数が参照する配列変数の先頭アドレス 4.ポインタ変数の参照先データ をそれぞれポインタ変数を用いてポインタの位置を文字数分まで1つずつ 進めながら16進数で確認するプログラムを作成せよ という問題なのですが、3つ目のがよく分からなくて・・。 printf("%x",????); これの????には何を入れるべきなんでしょうか? 誰か教えてもらえませんか?(⊃д⊂)
>>79 わからなくて当然。ポインタを16進数で表示する汎用的な方法はないから。
できるのは4だけだな。
>>80 16進数って%xかなって思ったんですけど、コレは勉強になりました。
でも・・・コレをやらないといけないんですヽ(;´Д`)ノ
「ポインタ変数が参照する配列変数」っていうのは「str」の事ですか?
それの先頭アドレスっていうのは「&str[0]」の事なのかな・・・?
それをポインタ変数を用いて書くから・・・あひゃ。
82 :
デフォルトの名無しさん :03/07/03 14:21
>>81 %xは符号無し整数型の値を16進で表すものであって、ポインタの値を表示するものではない。出題者にもそう言うべき。
単に「ポインタの値を表示しろ」なら%pでできるんだが。
> 「str」の事ですか
うん
> 「&str[0]」の事なのかな
そう。strだけでもいいけど。
変数Aに任意の正の整数を代入し、その1の桁を四捨五入して 表示するプログラムを作ってもらえませんか?
84 :
デフォルトの名無しさん :03/07/03 14:27
printf("%d\n",(A+5)/10*10);
>>83 printf("%d",a%10>=5?a+10-a%10:a-a%10);
>>80 そうなのかなあ。
処理系定義の方法で整数に変換できると思うのだけど。
null pointer だけは整数 0 に変換されると仕様で定義されてる。
変換結果を整数で表せない場合のみが未定義。
大抵の宿題では特定の処理系が仮定されていることを考えれば、
移植性に関するコメントは無用なのでは。
処理系依存でいいなら%pを使えば。 おそらく16進数で表示されるだろうし。
>>86 宿題だからこそ重箱の隅をつついて高得点get
宿題ぽっちでそんな変わるかね。 趣旨理解して、無駄なく卒なくで良いじゃん。
intとかでキャストして16進表示は?
アドレスのサイズと int のサイズが 同じとは限らないからねぇ。
ポインタのアドレスをchar*にキャストしてsizeof(ポインタ)のぶんだけ出力するってのはどうか?
ifとかで出来る簡単な電卓プログラムを お願いします
#include <stdio.h> #include <string.h> #include <math.h> int main(void) { char op,buf[BUFSIZ]; int x,y; fprintf(stderr, "try: 2*3\n"); while(!feof(stdin)) { fprintf(stderr, "> "); fgets(buf,BUFSIZ,stdin); if (3 == sscanf(buf, "%d %1[-+*/^] %d", &x, &op, &y)) { switch(op) { case '+': fprintf(stderr, "= %d\n", x+y); break; case '-': fprintf(stderr, "= %d\n", x-y); break; case '*': fprintf(stderr, "= %d\n", x*y); break; case '/': fprintf(stderr, "= %g\n", (double)x/y); break; case '^': fprintf(stderr, "= %g\n", pow(x,y)); break; } } } return 0; }
サンクスです
符号なし整数nのビット位置pから下位qビットを取り出す関数unsigned GetBit(unsigned n,int p,int q)を作成しなさい。ただし、右端をビット位置0とし、返すビット列は右詰とする。 お願いします。
>>96 unsigned GetBit(unsigned n,int p,int q)
{
return (n>>(p-q+1))&((1<<q)-1);
}
98 :
デフォルトの名無しさん :03/07/03 23:10
#include <stdio.h> #include <stdlib.h> #include<time.h> void main(void) { int kotae; /* コンピュータが決めた答え */ int su; /* 入力値 */ int ten; /* 得点 */ int kaisu = 0; /* 入力回数 */ /* 乱数で答えを取得する */ kotae = rand()%20; /* 乱数の種を設定 */ kotae+=1; /* 乱数(1〜20)をkotaeに代入 */ /* 正解するかタイムオーバーになるまで数当てをする */ printf("1〜20までの数値を入力してください。\n"); do { kaisu = kaisu + 1; /* 入力回数+1 */ printf("%d回目の入力 = ",kaisu); scanf("%d",&su); /* suを入力 */ /* 入力値によってヒントメッセージを表示する */ }while(kaisu < 6 || kotae != su || clock()/CLOCKS_PER_SEC <=3); if(kotae == su) { ten = 120 - (20*kaisu); printf("\n正解です。\n貴方の得点 %d点\n",ten); } else { printf("\nゲームオーバー\n"); } } よろしくお願いします。
数当てゲームを課題で作っているのですが上手く出来ませんでした。 問題点は乱数なのに数値が2に固定されているのと正解しても抜け出せない。 秒数制限してあるのに秒数制限されていないという2点です。 あとはヒントをif文で表示するのですが上手く出来きませんでした。ヒントは不正解の時にヒントを表示するのですが誤差を5ずつに設定します。 入力値<答え−5 答えー5<=入力値<答え 答え < 入力値<=答え+5 答え+5< 入力値 という感じです。
ガンダムシード
101 :
デフォルトの名無しさん :03/07/03 23:17
forで10000回ループして、最後にhello,worldを出力するまでの 時間を測るにはどうしたらいいですか? #include <stdio.h> int main(){ int a; for(a=1;a<=10000;a++){ if(a==10000){ printf("Hello,world"); } } }
102 :
デフォルトの名無しさん :03/07/03 23:22
保守
>>101 現時刻記録:A
処理
現時刻記録:B
B-A
104 :
デフォルトの名無しさん :03/07/03 23:27
現時刻記録ってのはtimeを使うのですか? 分かりやすい説明ありがとうございます。
105 :
デフォルトの名無しさん :03/07/03 23:35
ヽ(`Д´)ノ ( ) () ()  ̄  ̄
107 :
デフォルトの名無しさん :03/07/03 23:45
>104 結婚してください
>>107 えんりょーしときます。
どうか教えてもらえませんか
109 :
デフォルトの名無しさん :03/07/03 23:55
>>108 clock
10000は少なすぎる・・・
2〜3秒かけて処理をするには 何回くらいループしたらいいですか?
>>110 マシン性能に左右される。やってみるしかない。
環境依存になるけどタイマーつかった方がいいかと
112 :
デフォルトの名無しさん :03/07/04 00:01
>>110 マルチタスクではそんなんわかんないよ。
根本的に変えたほうがいい。
ありがとうございます。 もっとググってきます
現在時刻を取得しながあ無限ループさせて、 ループに入る直前の時刻から3秒たってたらbreak;
>>114 ×3秒たってたらbreak
○3秒以上たってたらbreak
ここにプログラム書いたら何処が間違ってるか 突っ込んでくれるかなぁ・・・
1+5とか入力して、下のプログラムを実行させたいんですけど、 関係ない記号を入れると最後の一文を表示させたいんです。 でもどうしてもできないんですよ。どうしましょ? よろです。 if(mar=='+') { printf("%f%c%f=%f\n",a,mar,b,a+b); } else if(mar=='-') { printf("%f%c%f=%f\n",a,mar,b,a-b); } else if(mar=='/') { printf("%f%c%f=%f\n",a,mar,b,a/b); } else if(mar=='*','x','X') { printf("%f%c%f=%f\n",a,mar,b,a*b); } else if(mar!='+','-','/','*','x','X') { printf("演算子を間違ってませんか?\n"); }
コード貼るのは別の場所にしたら、誰か突っ込んでくれるんでない?
else if(mar=='*','x','X') else if(mar!='+','-','/','*','x','X') ダメじゃん。
えっ?
elseだけでいいやん。%fもそれでええの?
122 :
デフォルトの名無しさん :03/07/04 19:26
>>117 > if (mar=='*','x','X')
Cならばこれはおかしいかと。
mar の型も知りたいところですし、適当な場所に全コードを
掲示していただけると、アドバイスしやすくて助かります。
else if(mar=='*','x','X')は else if(mar=='*' || mar == 'x' || mar == 'X')に else if(mar!='+','-','/','*','x','X')は elseに替える。
大人しくswitch使えよ
出来ました。お手数お掛けしました。馬鹿ですみません。
switch(mar){ case '-': printf("%f%c%f=%f\n",a,mar,b,a-b); break; case '+': printf("%f%c%f=%f\n",a,mar,b,a+b); break; case '/' printf("%f%c%f=%f\n",a,mar,b,a/b); break; case '*': case 'x': case 'X': printf("%f%c%f=%f\n",a,mar,b,a*b); break; default: printf("演算子を間違ってませんか?\n"); break; }
128 :
デフォルトの名無しさん :03/07/04 21:04
CPUの周波数によって表示を変えたり メモリーの容量で表示を変えたり HDDの容量で表示変えたり OSによって表示変えたり実行できるOS制限したり できませんか?
できますよ
130 :
デフォルトの名無しさん :03/07/04 21:11
どうやって?
>128 マルチ厨ハケーン
この宿題を解いてください。 GNU MPライブラリを用いて二項係数 nCkを求める関数 void my_mpz_binom(mpz_t rop, int n, int k) を作成し、 70 C 13 を求めよ。
133 :
デフォルトの名無しさん :03/07/04 22:02
:
ループでできたかな。 あと、GNU MPライブラリって多倍長ライブラリ?
>134 その通りです。
137 :
専門学校生 :03/07/04 23:07
今年から専門学校に通いだしてC言語の宿題でわからないのがいくつかでてきました。 解いてください。 <処理条件> 入出力様式に従って、3つの整数を入力し、条件にしたがって結果を表示するプログラム (条件) すべてが等しい場合・・・「全てが等しい」と表示した後、数値を表示。 2つが等しい場合・・・「2つが等しい」と表示した後、最大値、最小値を表示。 すべてが等しくない場合・・・「全てが等しくない」と表示した後、最大値と最小値を表示。 <入出力方式> Input(a,b,c)=xxx,xxx,xxx 結果:xxxxxxxxxxx 値:xxx
138 :
専門学校生 :03/07/04 23:11
もう一つあります。 <処理条件> 出力方式に従って、1〜10までの数値の中で、奇数の和、偶数の和を求めて表示するプログラム。 計算にはfor文をつかう。 <出力方式> 奇数の和=xx 偶数の和=xx
#include <stdio.h> int main() { int a,s=0,d=0; for(a=1;a<=10;a++) a&1?(s+=a):(d+=a); printf("奇数の和=%d\n偶数の和=%d\n",s,d); return 0; }
>>142 あの・・・検索という言葉を知っていますか?
144 :
デフォルトの名無しさん :03/07/04 23:34
#include <stdio.h> int main(){ int a,b=0,c=0; for(a=1;a<=10;a++){ if(a%2==1){ b=a+b; } else{ c=a+c; } } printf("奇数の和は%d\n",b); printf("偶数の和は%d",c); return 0; }
俺は137-138ではないので知らん。
146 :
デフォルトの名無しさん :03/07/04 23:37
147 :
デフォルトの名無しさん :03/07/04 23:37
>>132 /* GNU MPライブラリを用いて二項係数 nCkを求める関数 */
void my_mpz_binom(mpz_t rop, unsigned long n, unsigned long k)
{
if (n < k) {
mpz_set_ui(rop, 0); /* 引数が不正のときは0としておく */
return;
}
mpz_t fact_n, fact_nk, fact_k, fact_tmp;
mpz_init(fact_n); mpz_init(fact_nk); mpz_init(fact_k); mpz_init(fact_tmp);
my_mpz_fact(fact_n, n); /* fact_n <- n! */
my_mpz_fact(fact_nk, n-k); /* fact_nk <- (n-k)! */
my_mpz_fact(fact_k, k); /* fact_k <- k! */
mpz_mul(fact_tmp, fact_nk, fact_k); /* fact_tmp = (n-k)!*k! */
mpz_cdiv_q(rop, fact_n, fact_tmp); /* rop = n!/((n-k)!*k!) */
}
/* 階乗の計算 */
void my_mpz_fact(mpz_t rop, unsigned long n)
{
mpz_set_ui(rop, 1); /* rop <- 1 */
for (unsigned int nn = 2; nn <= n; nn++) {
mpz_mul_ui(rop, rop, nn);
}
}
#include <stdio.h> #define maxof3(x,y,z) maxof((x), maxof((y), (z))) #define maxof(x,y) (((x) > (y)) ? (x) : (y)) #define minof3(x,y,z) minof((x), minof((y), (z))) #define minof(x,y) (((x) < (y)) ? (x) : (y)) int main() { int a, b, c; printf("Input(a,b,c)="); scanf("%d,%d,%d", &a, &b, &c); printf("結果: "); if (a == b && b == c) { puts("全てが等しい"); printf("値: %d\n", a); } else { puts((a==b || b==c || c==a) ? "2つが等しい" : "全てが等しくない"); printf("最大値: %d\n最小値: %d\n", maxof3(a, b, c), minof3(a, b, c)); } return 0; }
d=(a==b)+(b==c)+(a==c); dが3なら全て等しい。1ならふたつが等しい。0なら全て異なる。
>>138 #include <stdio.h>
int main(void)
{
int i;
int x = 0;
int y = 0;
for(i = 1; i <= 9; i+=2)
x = x + i;
for(i = 2; i <= 10; i+=2)
y = y + i;
printf("奇数の和 = %d\n", x);
printf("偶数の和 = %d\n", y);
return(0);
}
for(j=k=0,i=11;--i;)*(i&1?&j:&k)+=i;
>>149 を見て C の == が Kronecker delta であることに初めて気付いた。
154 :
デフォルトの名無しさん :03/07/05 00:10
input ファイルの i 行目を output.i というファイルに 書き出すプログラムを書け。 お願いします。
155 :
デフォルトの名無しさん :03/07/05 00:16
>>154 fopen/fcloseとfgetsとforループがわかればできます。
156 :
デフォルトの名無しさん :03/07/05 00:17
追加。あとfputs。
>>155 ==156
1行あたりが、くそ長くて、メモリの確保が出来ないのですが…
ならgetcとputcで
157 は私じゃないですが・・・。 書き出すファイル名に outputi (i は行番号)とするのが 分かりません。 「int 型を char 型にして "output" の末尾に付ける」 これってどうすれば・・・? 型落ちは防げるものですか?
>>153 その解釈はなんか微妙じゃねーか!?
分からんでもないんだけど・・・ぅぅぅ、なんか気持ち悪い。
162 :
デフォルトの名無しさん :03/07/05 00:45
上から「☆」←この文字が落ちてくるみたいに表現したいんですけど、 標準Cでできますか?
163 :
デフォルトの名無しさん :03/07/05 00:49
>> 159 int lineno; /* 行数 */ char output_i[MAX_PATH]; /* 出力ファイル名称 */ sprintf(output_i, "output.%d", lineno) です。 linenoが123ならばoutput.123になります。 >> 157 メモリの確保ができないとは。行の最大長はどれくらいですか? 1024もあれば十分じゃあないのですか?それともメガ単位? 最大長がわかればfgetsでデータを読み取るバッファを @内部変数でとる A外部変数でとる Bmallocする 最大長がわからないとき、fstatでファイルサイズを知りそのファイルサイズ でmallocする。 これがだめなら158さんのおっしゃるとうりfgetcとfputcで。
164 :
デフォルトの名無しさん :03/07/05 00:57
保守 by 162
>>162 出力方法に依存する。
大抵の文字端末では何らかのエスケープシーケンスを出力することで実現できる。
>>163 ギガ単位です。
malloc()しても、ヌルポしか返ってきません
やはり、地道にfgetc()とfputc()を使うしか無いのでしょうか?
モニタを上下逆に置く
>>166 fgetsで\nがあるかどうかで行数を数えればいいだけでは?
発想を変えて、モニタを落すプログラムを作ってみては?
>>168 でも、それなら、fread()の方がましな気が…
>>160 例えばこんなのかな。確かに気持ち悪いなw
void
set_unit_matrix(int dim, int **x)
{
int i,j;
for (i = 0; i < dim; i++) for (j = 0; j < dim; j++) x[i][j] = (i == j);
}
0以上1未満の小数が与えられた時、その二進表現の文字列を返す 関数を定義し、その動作を確認しなさい。 お願いします
何桁まで? あと文字列の確保は?
何桁って・・・double型のビット数でいいと思うが。
ごめん。doubleの変数のビットパターンを返すわけじゃないね。
循環小数なら無限だもんなぁ。
>>174 #include <stdio.h>
#include <float.h>
char *dtob(double x, char *s)
{
int i = 0;
if (x < 0 || x >= 1) return 0;
s[i++] = '0'; s[i++] = '.';
while (x > 0) if ((x *= 2) < 1) s[i++] = '0'; else { x -= 1; s[i++] = '1'; }
s[i] = '\0';
return s;
}
int main()
{
double x;
char buf[-DBL_MIN_EXP+5]; /* maybe wrong */
while(!feof(stdin)) if (scanf("%lf", &x) == 1) if (dtob(x, buf)) puts(buf);
return 0;
}
>>162 #include <stdio.h>
#include <time.h>
#define DOS_TATE_SIZE 25
int main(void)
{
int i,n;clock_t t;
for(i=0;i<DOS_TATE_SIZE-1;i++)//星を出力する回数
{
for(n=0;n<DOS_TATE_SIZE;n++)puts("");//画面クリア
puts("☆");//星を表示 カーソルは一番下にある
for(n=0;n<DOS_TATE_SIZE-i-2;n++)puts("");//改行の回数が多いほど星が上に表示される
t=clock()/CLOCKS_PER_SEC;//待つために使用
for(;clock()/CLOCKS_PER_SEC-t<=1;){}//1秒待つ
}
return 0;
}
181 :
専門学校生 :03/07/05 14:56
宿題やってくれて、ありがとうございます。 今年から専門学校にはいりました。
182 :
デフォルトの名無しさん :03/07/05 15:05
>>181 ちょっとまてそれくらい自分で解け!!!
入門へんではないか!!これからがたいへんだぞ!!
なんか昔のベーシックみたいだな。
ありがとうございます。 助かりました
185 :
デフォルトの名無しさん :03/07/05 23:30
>> 154, 166 ギガ単位!これって宿題じゃあなくて仕事? fgetcとfputcを使って地道にやってください。 fread, fwriteを使ってもあまり速度は変わらないと思います。 fgetcとfputcは中でバッファリングしてるので。
これにコメントつけれって言われたんですが、、、 何がしてーのかサパーソなんでつ 助けてくだちい #include <stdio.h> #define INDEX 1000 main() { int i,j,flag,tmp,pnum[INDEX]={2,3}; for(i=4,tmp=2;tmp<INDEX;i++){ for(j=0,flag=0;pnum[j]<i,pnum[j];j++){ if(!(i%pnum[j])){ flag=1; break; } } if(!flag)pnum[tmp++]=i; } for(i=0,j=1;pnum[i]<=INDEX;i++,j++){ printf("%d",pnum[i]); if(j==10){ printf("\n");j=0; }else{ printf("\t"); } } return 0; }
>>185 移植性を考えるんならそれがいいだろうけど、
実用性を目指すならメモリにあわせて read みたいなシステムコールで
一度にたっぷり読んだ方が早いと思われ。
もっとも、一行の平均長が短いのならファイル作成で時間がかかるから、
stdio で十分かと。典型的なデータがあるなら測定して決めないといかんだろう。
宿題ならコードの簡潔さも加味して fgetc/fputc が良いかと。
google: エラトステネスの篩
>>188 レスサソクス
しかし、コレにコメント付けれつー宿題なんでつ
結果は解ってるしエラトステネスの篩も知ってるんでつが
アフォな香具師がこれにコメントつけれとかぬかしたもんでほとほと鬱なんでつ
つーか、マンドクセー
>>186 int i,j,flag,tmp,pnum[INDEX]={2,3}; /* pnum[] は素数を要素とする配列 */
for(i=4,tmp=2;tmp<INDEX;i++){ /* INDEX個の素数が見つかるまで */
for(j=0,flag=0;pnum[j]<i,pnum[j];j++){ /* i 未満の素数 pnum[j] のいずれかで */
if(!(i%pnum[j])){ /* i が割り切れれば */
flag=1; /* i は合成数である */
break; /* i についてはもう調べなくて良い */
if(!flag)pnum[tmp++]=i; /* 合成数でなければ i を tmp 番目の素数として登録 */
for(i=0,j=1;pnum[i]<=INDEX;i++,j++){ /* INDEX以下の素数 pnum[i] について */
printf("%d",pnum[i]); /* 表示し */
if(j==10){ /* 10個出力する毎に */
printf("\n");j=0; /* 改行を出力 */
}else{ /* 各10個目以外は */
printf("\t"); /* 水平タブを出力 */
>>190 ありがdございますた
このコメント(・∀・)イイ!!
勉強になりますたm(_ _)m
>>186 /* int main( void ) ; */
/* 小さい方からINDEX個の素数を、stdoutに表示する関数 */
/* 引数なし、返り値=必ず0、失敗した場合の考慮なし */
main() …
> /* 小さい方からINDEX個の素数を、 違うよ。
>>186 これだとINDEX個の素数は求めて配列に格納するけど
表示するのはINDEX以下の素数じゃね?
コメントつけろって言ってるのに つまらない揚げ足をとるアフォがいるスレはここですか?
素数計算して表示してない分はちょっと勿体無いな
まぁ、1000以下の素数が何個有るかなんてわからんからな どうあがいても1000個はねーだろって事ジャネーノ
>>194 >>196 INDEXがあまり大きくなければ、
INDEX以下の素数をすべて表示するのにはINDEXまでの素数を求めるのが速い。
素数定理に基づく経験則を使えばもう少し減らせる。
>>198 それは大体わかるんだが
どのくらいが分かれ目になるんだ?
間違えた、
>>198 - INDEX以下の素数をすべて表示するのにはINDEXまでの素数を求めるのが速い。
+ INDEX以下の素数をすべて表示するのにはINDEX個の素数を求めるのが速い。
>>200 かなり大きいと思うよ。少なくとも10桁以上じゃないかね。
というか、上限が決まって列挙で、素数を余分に生成しない方法が 余分に生成するより速いことはないんじゃないかな。
次の問題をお願いします。まだcを初めて3ヶ月の初心者なので、 制御文、繰り返し、ポインタ、配列、そして今回の関数ぐらいまでしかやってません。 なのでなるべく簡単なプログラムでお願いします。 整数型変数a,b,c,dにそれぞれ値を与えて、この4つをa<=b<=c<=d の順番に並べる関数sort4(&a,&b,&c,&d)を書きなさい。 結果は、main関数内で a,b,c,dの順で出力すること。
>>208 宿題の文は丸写ししましょう。
あなたの勝手な(勘違いが多分に含まれた)意味不明な問題を書かれても困ります。
最近は宿題丸投げが推奨なのか… 自分なりに噛み砕いて分からない所を聞くんだと思ってたが # 説明ベタは別問題
>>207 英語読むのあまり自信ないんで確認。
こんな解釈であってるか?
1) 数の桁数とヒントの数を入力。ともに0 0なら終了
2) ヒントを指定した数の分だけ入力。ヒントは、数、hitの数、blowの数
3) ヒントから推測できる数を出力。推測できなかったらNOを出力
4) 1) に戻る
>>209 今も一度確かめましたが、問題は丸写ししました。
自分でも問題の意味からいまいち分からなかったのですが・・・。
#define swapif(a,b) if(a>=b){ a^=b^=a^=b;} void sort4(int* a, int* b, int* c, int* d) { swapif(*a,*b); swapif(*a,*c); swapif(*a,*d); // aが一番小さい数になる swapif(*b,*c); swapif(*b,*d); // bが次に小さい数になる swapif(*c,*d); // ってな感じでソート完了 } ifとか書いてくのめんどくさかったから、マクロにしちゃった。 こりゃネタにしかならんかな?
>>213 >>208 にも書きましたが、何せ初心者なのでdefineとか書かれても分かりません。
あとmainの部分は・・・。省略ですか?
宿題よろしくお願いしますm(_ _)m mainプログラムから12個のデータ a[0],a[1],…a[11]を配列で受け取り その平均値mからの偏差 a[i] - m(i=0,1,2,…,11) を配列として計算する関数を作れ。熊谷の平均気温は1月から12月までそれぞれ 3.2, 3.9, 7.0, 12.9, 17.7, 21.1, 24.6, 26.2, 21.9, 16.0, 10.6, 5.6(度) である。その関数を利用して各月の気温の偏差を書き出すmainプログラムも作れ です。改めてお願いします…
変数Aに任意の正の値をいれて、その1の桁を四捨五入して表示するプログラム。 ヨロシクお願いします。
>>214 mainは a, b, c, d の数値代入と表示だけだろ
>>208 #include <stdio.h>
#include <stdlib.h>
#include <time.h>
void sort4(int*a,int*b,int*c,int*d)
{
int i,n,num[4],minNum[4]={32767,32767,32767,32767},used[4]={0},check=-1;
num[0]=*a;num[1]=*b;num[2]=*c;num[3]=*d;
for(i=0;i<4;i++)
{
check=-1;
for(n=0;n<4;n++)
{
if(minNum[i]>=num[n]&&used[n]==0)
{minNum[i]=num[n];check=n;}
}
if(check!=-1)used[check]=1;
}
*a=minNum[0];*b=minNum[1];*c=minNum[2];*d=minNum[3];
}
int main(void)
{
int a,b,c,d;srand(time(NULL));
a=rand();b=rand();c=rand();d=rand();
printf("a==%5d b==%5d c==%5d d==%5d\n",a,b,c,d);
puts("ソート↓");sort4(&a,&b,&c,&d);
printf("a==%5d b==%5d c==%5d d==%5d\n",a,b,c,d);
return 0;
}
>>208 #include <stdio.h>
#include <time.h>
#include <stdlib.h>
void swap(int *a,int *b){int tmp=*a;*a=*b;*b=tmp;}
void r_sort(int **p, int *end){
int **x;
if(*p==end) return;
for(x=p+1;*x!=end;++x)
if(**(x-1)>**x) swap(*(x-1),*x);
r_sort(p,*(x-1));
}
void sort4(int *a,int *b,int *c,int *d){
int *p[] = {a,b,c,d,NULL};
r_sort(p,NULL);
}
main(){
int a,b,c,d;
srand(time(NULL));
a=rand();b=rand();c=rand();d=rand();
sort4(&a,&b,&c,&d);
printf("%d %d %d %d",a,b,c,d);
}
>>219 すいません、、、
それの意味が分かりません。。。
Aに13を代入したとすると、、、
((13+5)/10)*10=18になりますよね??
どういう意味なのでしょう。。。
このほうが綺麗か。 void r_sort(int **p, int **end){ int **x; if(p==end) return; for(x=p+1;x!=end;++x) if(**(x-1)>**x) swap(*(x-1),*x); r_sort(p,x-1); } void sort4(int *a,int *b,int *c,int *d){ int *p[] = {a,b,c,d}; r_sort(p,p+sizeof(*p)); }
>>214 関数内の swapif(*x,*y); を全部
if(*x >= *y){ int tmp=*x; *x=*y; *y=tmp;} みたいに書き直せばいいよ。
>>207 いっそのこと全探索してしまうとか。
最大でも 10! = 3628800 通りだし、なんとかなりそうな気も……。
int a=12を10で割ると1 それに10掛けると10
>>223 もしAがdoubleであれば
A = floor((A + 5) / 10) * 10;
>>228 なるほど!!!
少数以下は勝手に削られるってことですか??
>>229 doubleってなんでしょう。。。
doubleは実数intは整数だ
>>215 中卒にはこたえた。標準偏差というのが分からなくて。あってるかな?
#include <stdio.h>
#include <math.h>
void MakeHensa(const double a[12],double hensa[12])
{
int i;
double n,m,l,hzh;
for(i=0,n=0;i<12;i++)n+=a[i];
m=n/12;
for(i=0,n=0;i<12;i++)n+=pow(a[i],2);
n/=12;
for(i=0,l=0;i<12;i++)l+=a[i];
l/=12;l=pow(l,2);
hzh=sqrt(n-l);
for(i=0;i<12;i++)hensa[i]=(a[i]-m)/hzh*10+50;
}
int main(void)
{
int i;
double ondo[12]={3.2,3.9,7.0,12.9,17.7,21.1,24.6,26.2,21.9,16.0,10.6,5.6},hensa[12];
MakeHensa(ondo,hensa);
for(i=0;i<12;i++)printf("%2d月:%4.1f℃(%4.1f)\n",i+1,ondo[i],hensa[i]);
return 0;
}
>>231 なるほど。。。
ありがとうございます。
ちょっと作ってみたんですけど、家のパソコンではなぜかコンパイル出来ないんで合ってるか分かりませんが、、、
どうでしょう??
#include <stdio.h>
main(){
int a;
printf("正の値を打ち込んでください。");
scanf("%d",&a);
a=((a+5)/10)*10;
printf("一の位を四捨五入してみました。%f \n",a);
return 0 ;
}
>>215 #include <stdio.h>
void hensa(double * ans, const double * data)
{
int i;
double ave=0;
for(i=0; i<12; i++) ave += data[i];
ave /= 12; //これが平均値
for(i=0; i<12; i++) ans[i] = data[i]-ave; //偏差を計算
}
int main()
{
int i;
double a[12]={3.2, 3.9, 7.0,12.9,17.7, 21.1, 24.6, 26.2,21.9, 16.0, 10.6, 5.6};
double b[12]; //偏差を格納するための配列
hensa(b,a);
for(i=0; i<12; i++) printf("%3.3f ",b[i]);
printf("\n");
return 0;
}
>>232 この問題って多分標準偏差じゃなくてただの差じゃねぇか?
>>233 何をしたいんだ?
printf("一の位を四捨五入してみました。%d \n",a);
じゃねーの?
>>234 そうか。それならもう少し易しかったのに。でも、偏差値の求め方を
勉強する機会なんてそう無いと思うから、良かったかな。
>>235 dとfの違いすら分かりません・・・T_T
大学の授業は男しか居なくて仲良しができなくて・・・。
yahooで調べてみてもそんな簡単なことのってませんでしたT_T
あの、それをdにしたら平気なんでしょうか??
Cの参考書とかねーの? printfのとこみりゃのってんだろ。
>>238 うん
あとネットでprintfしらべるよろし
あ・・・printfで調べるんですか!! 分かりました。早速調べます〜! ありがとうございました!!
%dはint、%fはdouble
flootもな
float
みんなやさしくなっちゃった
よーしパパもfloot調べちゃうぞ
floot ... ぷっ
フルート
話の流れからいってfloorの打ち間違いだと思うが…
250 :
デフォルトの名無しさん :03/07/06 22:41
馬鹿ばっかり
私のために争うのはやめて!!
いやーみんなのおかげですごく助かりました!!! ほんとありがとうございました。笑顔
何を今更
>>256 そこは、「キリ番ゲッツ!!」って言わないと
randは種を変えないと同じ数を返すんだが・・・。 clock()は差を取らないとダメなんじゃない?
259 :
デフォルトの名無しさん :03/07/07 00:37
>>256 まあ、これは最初に提示されたソースが無駄なことをしている、ってことで。
それにエラトステネスのふるいではないし...。
この問題が解けません・・・ 1000以下の完全数を全て求めて表示するプログラムを書け。完全数とは、 約数(1とその数自身を含む)の和がその数の2倍に等しい数である。
#include<stdio.h> int main(void){ int x,wa,y; wa=0; for(x=0;0<=x && x<=1000;x=x+1){ for(y=1;0<=y && y<=x;y=y+1) { if(x%y==0) wa=wa+y; } if(x*2==wa) printf("kanzensuu:%d",wa); return(0);} }
と作ってみたのですが上手く回ってないです・・・
waをいつ初期化すればよいか考えろ
>>263 サンクスです。
単純なことに気づかない漏れは・・・
次は友愛数を求める宿題だな
266 :
デフォルトの名無しさん :03/07/07 01:48
質問しまつです。 スタックを用いて引き算をする際、 x = pop(); push(pop() - x); としますよね。これはいいんですが、 push(-pop() + pop()); ではダメだと言われてしまいました。自分にはこの二つの違いがわかりません・・・。 どなかたご教授くださればありがたいです。
267 :
デフォルトの名無しさん :03/07/07 02:07
>>266 式の評価順でしょう。-pop() が実行された後に pop() が実行される場合もあるし、
pop() が実行された後に -pop() が実行されることもある。評価順によって結果は異なりますよね?
268 :
デフォルトの名無しさん :03/07/07 02:17
>>267 なるほど!
どっちから実行されるかはその場合によって変わる事があるんですね。
勉強になりました!!
これでレポートが書けます・・・。本当に感謝です。ありがとうございました。
初歩的な質問なのですが #include <stdio.h> main() { int i,j; j=10; for (i=9; i>0 ;i--){ j=j*i; } printf ("%d\n",j); } 前回の課題内容であるN!の階乗計算プログラムに対し、階乗計算の部分を関数化せよ。但し、次の条件に従うこと。 ・関数名はfactorialとすること ・int型の変数を関数の引数として受け取り、その引数に従って関数内部で階乗計算を行うこと ・階乗の計算結果を関数の返値とすること ・main文でfactorialを呼び出した後、結果をprintf文で画面表示すること なんですが関数のところでの変数宣言がイマイチわかりません。 どなたか教えてください。
前回の課題っていうのが最初に書いたソースです
#include <stdio.h> long int factorial(long int N) { long int i=N-1; for(; i>1; i--){ N=N*i; } return N; } int main() { long int N=10; //intならN=10ですでにオーバーフローするぞ N=factorial(N); printf("N!=%ld\n",N); return 0; }
>>271 >int型の変数を関数の引数として受け取り
問題文を良く読め
つーか、intが2バイトってネタは、もう飽きた
>>266 分かった!・・・・・・・・・・・・・・・・・・・・・・・・・・かもしれない。
俺も最初同じだろって思ったtが、多分こういうことなんじゃないの?
x = pop();
push(pop() - x);
の場合、スタックの一番上の値から次の値が引かれる。
一方、
push(-pop() - pop());
の場合、前半の-pop()が先に呼ばれるか、後半の+pop()が呼ばれるかは
どうなるか分からないので、どちらからどちらが引かれるかは予想できない。
(俺が知らんだけで、ANSI Cとかで前から後ろと保証されているかもしれんがなぁ)
だからきっと、266にだめといった人は、関数呼び出しの順番が明確でないと
言いたかったのでは?
もし、266がそこまで考慮して後者の書き方をしたのなら
あんたの方が一枚上手だったということで。
で、俺の環境(XP+VC6)でテストしたところコンパイルオプションによって値が変わった。
具体的に言うと、通常のコンパイルだとうまく動いたが、最適化してコンパイルすると
値が正負逆になっておかしくなった。
_, ._ ( ゚ Д゚) ( つ旦O と_)_) _, ._ ( ゚ Д゚) ガシャ ( つ O. __ と_)_) (__()、;.o:。 ゚*・:.。 とっくに書かれてた・・・
>>273-274 長文乙彼
でも、評価順は良くあるネタだから
それくらいは、憶えておいて、一瞬で見抜かないとね…
最近16bitマイコンさわってたからなんか勘違いした。わりい。 この場合大抵intでいけるな。
//
>>215 //もう古い話題だが、こういう問題出す教師には次の回答で復讐
int a,b,c,d;//ソートする対象
void sort4(int *aa,int *bb,int *cc,int *dd){
int a=*aa,b=*bb,c=*cc,d=*dd;
#define sorted(a,b,c,d) (((a)<=(b))&&((b)<=(c))&&((c)<=(d)))
#define store(aaa,bbb,ccc,ddd) {*aa=aaa,*bb=bbb,*cc=ccc,*dd=ddd;return;}
#define dosort(aaa,bbb,ccc,ddd) if(sorted(aaa,bbb,ccc,ddd))store(aaa,bbb,ccc,ddd)
dosort(a,b,c,d);dosort(a,b,d,c);dosort(a,c,b,d);dosort(a,c,d,b);
dosort(a,d,b,c);dosort(a,d,c,b);dosort(b,a,c,d);dosort(b,a,d,c);
dosort(b,c,a,d);dosort(b,c,d,a);dosort(b,d,a,c);dosort(b,d,c,a);
dosort(c,a,b,d);dosort(c,a,d,b);dosort(c,b,a,d);dosort(c,b,d,a);
dosort(c,d,a,b);dosort(c,d,b,a);dosort(d,a,b,c);dosort(d,a,c,b);
dosort(d,b,a,c);dosort(d,b,c,a);dosort(d,c,a,b);dosort(d,c,b,a);
}
#define p(a,b,c,d) printf("%i %i %i %i\n",a,b,c,d);
int main(){
a=110;b=291;c=3431;d=43;//本当はscanf等で読み取るのが良い。
p(a,b,c,d);
sort4(&a,&b,&c,&d);
p(a,b,c,d);
return 0;
}
281 :
デフォルトの名無しさん :03/07/07 04:41
age
コードブレーカー?
for while do{}while等を使わないでコードを書くことはハードウェア化
する上で重要な手段。
>>280 のコードはハードウェア化するとquick sortより
早いだろうね。
286 :
デフォルトの名無しさん :03/07/07 13:12
出来上がったハフマン木をトレースしていけば委員でないの?
>>286 このスレに来てるってことは実際に作ってくれって言ってんのか?
289 :
デフォルトの名無しさん :03/07/07 13:42
これで成績が決まってしまいます・・・。 どうかこの問題を解いては頂けないでしょうかm(_ _)m 学生7名の国語,数学,英語の成績のファイルindatがある。このファイルを読み込んで(6) の形式にある形で結果をファイルresultに出力せよ。indatの内容 60 80 70 63 90 74 72 82 60 85 90 72 75 78 89 75 90 87 85 74 72 1行目から順に国語,数学,英語の成績である。 (1)1次元配列が与えられているときその総和を求める関数sumを作れ。 (2)総和で求めたsを利用して平均値を求める関数meanを作れ。
290 :
デフォルトの名無しさん :03/07/07 13:44
(3)偏差を求める関数hensaを作れ (4)標準偏差を求めるsigmaを作れ (5)データxとデータyの標準偏差をσx,σyとしたとき,相関係数を求めるsokanを作れ。 それを使って英語と数学の相関係数を求めよ。 ただし,計算式は(3)のhensa-x,hensa-yを用いると 相関係数=((hensa-x)(hensa-y))/(σx*σy)の二乗根 (6)resultファイルの出力形式 No. Jap Math Eng sum 1 60 82 89 ○ 2 80 60 75 ○ ・・・ 7 72 78 72 ○ mean yy.y yy.y yy.y zzz.z sigma yy.y yy.y yy.y sokan=xx.xxxxxx ↑のような形で お助けください…
>>282 私にふられても問題解釈に自信のない口なんで…
今のところ私の方は
>>208 さんがレスくれんからまだ作り始めてもない。
292 :
デフォルトの名無しさん :03/07/07 15:38
>>282 問題を出すプログラムではなく、問題を解くプログラムを作らなくてはならない
のです。
4 6
7360 0 2
2507 0 1
9713 1 1
9678 2 2
0 0
というテキストを読み込んで、
9876
と出力させます。
一旦すべての可能性を記憶しておいて、条件にあわないものを間引いていく
方法が考えられますが、うーん...。
>>282 つまり、読み込んだヒントをもとに適合する数値を探せという問題だ。
全数探査は簡単だが10桁にもなると大変な計算量になるし、
適切に推論しようとすると論理処理をコーディングするのが面倒くさい。
このバランスが鍵だね。
宿題にしてはちょっとしたプログラムになるな。
208さんではなく、
>>207 さんでしたね
hit and blowで数を推測するプログラムは昔組んだことある。
そのときは、10×Lの配列にヒントから得られる確率を足していくという手段を
とったんだけど、えらい面倒臭かった。
一応は動いたんだけど、どこか勘違いがあるらしく確率の総和が
一定にならないときがあった。
提出時間が18時なんで どうかよろしくお願いしますm(_ _)m
296 :
デフォルトの名無しさん :03/07/07 17:25
タイムリミットまであと30分。 だれかたすけてあげて!!!!!
相関係数の式が間違ってないか? それから一番最後の相関係数は何と何の相関係数なんだ?
>1 60 82 89 ○ この○はギャグかなんか?
299 :
デフォルトの名無しさん :03/07/07 17:42
○のところはsumで求まる部分じゃん?英語と数学が相関関数て書いてあります。
301 :
デフォルトの名無しさん :03/07/07 17:53
itoaの中身を教えてくださいm(__)m atoiで二進数からいじるやり方は分かったんだけど逆がどうしても・・・。 おねがいします〜。
itoa.cでぐぐれよ、、
>>300 素早い対応ありがとうございましたm(_ _)m
今日の24時まで提出に延びたのですが
>>300 さんのやつだと7人各々の3教科合計が表示されませんでした。
試行錯誤してみたんですが良い方法ありませんでしょうか?
305 :
デフォルトの名無しさん :03/07/07 19:49
atoiでどうやって二進数からいじるんだよ。strtolならまだしも
>>304 main()の
for(i=0;i<n;i++) fprintf(dp,"%d %2.0lf %2.0lf %2.0lf ○\n",i,
japanese[i],math[i],english[i],japanese[i]+math[i]+english[i]);
の部分の「○」を%3.0lfにする。
>>292 そういう問題でしたか。どこの宿題です?工業大学とかかな。
作ってみたいですが、めんどくさいです。
>>294 さんやってあげてください。
記憶のソースの方に余分な変数(k,m)が含まれてました。 すみません。
>>308 「斜め掛け」って、な〜に?「斜め足し」の間違い?それとも別に出された課題なの?
>>308 もったいないから、配列は0から使おうね。
#include <stdio.h>
#define SIZE 10
int main()
{
int a[ SIZE + 1 ][ SIZE + 1 ];
int i, j, k;
/* make matrix */
for( i = 0; i < SIZE; i++ ){
for( j = 0; j < SIZE; j++){
a[ i ][ j ] = i * 10 + j + 1;
}
}
/* add right-down line element */
for( i = 0; i <= SIZE; i++){
a[ i ][ SIZE ] = a[ SIZE ][ i ] = 0;
for( j = SIZE - i, k = 0; j < SIZE; j++, k++){
a[ i ][ SIZE ] += a[ k ][ j ];
a[ SIZE ][ i ] += a[ j ][ k ];
}
}
a[ SIZE ][ SIZE ] /= 2;
/* print answer */
for( i = 0; i < SIZE + 1; i++ ){
for( j = 0; j < SIZE + 1; j++)
printf( "%4d", a[ i ][ j ] );
printf( "\n" );
}
return 0;
}
ウッ、細かい整形をしている間に先を越されてしまっていたか…。
>>314-315 有難う御座います。
配列0から使うように…もとより自己スキル磨きます。
本当に有難う御座います。
何か★の箇所にエラーが出るんですが・・・ #include <stdio.h> #include <math.h> #define PI 3.14159265358979323846 #define N 100 main(){ return 0; } int sigma(a,d){ int i,b[N]; double s=0; seiki(a,d,b[]); (★) for(i=0; i<N; i++){ s = s + b[i]; } return s; } seiki(a,d,b[]){ (★) int i, seed, random,b[N]; seed = 2; srand(seed); for(i=0;i<N;i++){ random = rand()*4/randmax; b[i]=sqrt(N/2/PI)/a/d/d*exp((-1)*random*N/2/a/a/d/d); } }
エラーメッセージ嫁
>>319 (´・ω・`)も、もうちっと詳しくおながいできませんか
>>318 手元の環境で実行できないから自信ないけど、
int i;
unsigned char *p;
p = ( unsinged char* ) &hdr.hoge;
for( i = sizeof(int) ; i != 0; i-- )
printf( "%02x", p[ i - 1 ] );
って1ヘッダ要素づつファイルに書き込んだらどうかな?
324 :
デフォルトの名無しさん :03/07/08 01:55
>>318 なんで
fp = fopen("myfile.au", "w");←ここ
バイナリでの書き込みじゃないの?
326 :
デフォルトの名無しさん :03/07/08 02:06
そーなんだ
>>328 次は、ランダムで問題を作り、それに解答するプログラムだな
>>327 上のは何も表示されない。
下のは実行出来なかった。UNIXとかなのかな?
>>328 いきなり入力待ちみたいになってて、やり方が分からんから、適当に数値を
何回か入力してたら、いきなりエラーが発生しました、終了しない場合は
製造元になんたらと変なサウンドと共に出た。ドラクエの冒険の書が
消えた時の音みたいで、めちゃびびった。
331 :
デフォルトの名無しさん :03/07/08 10:41
これの関数の定義がちがうといわれました。 すみませんが教えて頂けないでしょうか? ≪問題≫ 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, ・・・となる。 実行例 Fibonacci(0) = 0 Fibonacci(1) = 1 Fibonacci(2) = 1 : : Fibonacci(19) = 4181 Fibonacci(20) = 6765
#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; }
333 :
デフォルトの名無しさん :03/07/08 11:15
あともう一つお願いします。 標準入力からの入力に現れたアルファベット小文字をカウントする プログラムを作成しなさい。アルファベットは、a から z まで 連続した値を取るとして処理して構いません。 実行例:(下線部分は実行時に入力するか、ファイルから読み込む) As I have explained earlier, using XDMCP to display X across Internet is basically a no-no Ctrl + Z アルファベット小文字の出現回数 'a':8 'b':1 'c':2 'd':2 'e':7 'f':0 'g':1 'h':1 'i':6 'j':0 'k':0 'l':5 'm':0 'n':6 'o':4 'p':2 'q':0 'r':4 's':7 't':3 'u':1 'v':1 'w':0 'x':1 'y':2 'z':0
334 :
デフォルトの名無しさん :03/07/08 11:38
A+B=C,D+E=F,A+D=G,B+E=Hを満たすA〜Hの値をそれぞれ求めよ。 ただしA〜Hは1から8までの数字である。 これ、わっかるかなぁ〜?
わっかんね〜だろ〜な〜
>>333 #include <stdio.h>
#include <stdlib.h>
int main(){
int count[0x80]={0};
int i;
while( (i=getc(stdin))!=EOF ){
if(i>=0x80){ // ASCII文字以外破棄
i=getc(stdin);
if(i==EOF) break;
continue;
}
count[i]++;
}
for(i='a';i<='z';i++){
printf("%c:%d\n",i,count[i]);
}
return 0;
}
338 :
デフォルトの名無しさん :03/07/08 13:06
>>331 mainが違うの?
int i;
for(i=0; i<21; ++i)
printf("Fibonacci(%d)=%d ",i, fibonacci(i));
>>338 20項なのに21と書くのはスマートじゃない。
>336 CtrlZはAsciiではSUBですが、 一部のOSではテキストファイルの終端文字として使われていたそうです。 また、一部のOSでは標準入力の打ちきりに使うそうです。
イテレーションだと考えれば最終要素の次の要素をウォッチドッグ にするのはごくごく自然。
watchdog をタイミングに依らないところで使うの初めて見た こういう場合は setinel っていうじゃないの?
>>331 int fibonacci(int n) {
return (int)(pow((1 + sqrt(5) / 2, n) / sqrt(5) +0.5);
}
int fibonacci(int n) { return (int)(pow((1 + sqrt(5)) / 2, n) / sqrt(5) +0.5); }
途中から指数関数的に誤差が拡大するのも見逃せないが、 どこまで正しいか分からないから良くない。
A=1 B=6 C=7 D=3 E=2 F=5 G=4 H=8 A=3 B=2 C=5 D=1 E=6 F=7 G=4 H=8 A=1 B=3 C=4 D=6 E=2 F=8 G=7 H=5 A=6 B=2 C=8 D=1 E=3 F=4 G=7 H=5 A=2 B=3 C=5 D=6 E=1 F=7 G=8 H=4 A=6 B=1 C=7 D=2 E=3 F=5 G=8 H=4 A=2 B=6 C=8 D=3 E=1 F=4 G=5 H=7 A=3 B=1 C=4 D=2 E=6 F=8 G=5 H=7
347 :
デフォルトの名無しさん :03/07/08 15:22
25個の石の山 交互に(最大三個まで)取っていき、最後の一個をとったほうが負け 自分先手 コンピューター後攻 取るごとに残りの石の数を表示 お願いします
348 :
デフォルトの名無しさん :03/07/08 15:30
350 :
デフォルトの名無しさん :03/07/08 15:41
#include <stdio.h> int main() { int s = 25, n = 3, p, c; printf("start: %d stones left\n", s); while(!feof(stdin)){ printf("you: "); fflush(stdout); if (scanf("%d", &p) == 1) { if (p<1 || n<p) { printf("not in 1..%d. retry\n", n); continue; } s -= p; if (s == 0) { printf("you won\n"); return 0; } c = s%(n+1) != 0 ? s%(n+1) : 1; s -= c; printf("cpu: %d (%d stones left)\n", c, s); if (s == 0) { printf("you lost\n"); return 0; } } } printf("\nabort\n"); return 1; }
ぐは
355 :
デフォルトの名無しさん :03/07/08 17:20
○×は先行有利が鉄則。 ◯│×│ ─┼─┼─ │◯│ ─┼─┼─ │ │
>>352 そのプログラムにはバグがあるわけだが・・・
>>340 なるほど。勉強になりました。ありがとう。
B木にノードを挿入するinsert()を 反復構造でコーディングしてくれえ
>>358 >>207 のリンク先にあるSample Inputを入力すると
Output for the Sample Inputが出力される。
(という動作確認をしました)
361 :
デフォルトの名無しさん :03/07/08 21:23
>> 358 反復構造とは何ですか?
363 :
デフォルトの名無しさん :03/07/08 21:38
>>362 結局スタック的なデータ構造がいるという・・・
結局リカーシブな構造になるわけね・・
>>360 もう少し詳しくおながいします。英語が分からないので。
何桁入力して改行、それを何回行なう、エラーはどういうときに発生するか等。
>>361 なぜたわしに聞くの?
>>362 さんの言うように、同じ関数内を中心にforとかを使うのだと思います。
>> 359. 362 こんなのでどうでしょう。 struct BTree { int data; struct BTree *left, *right; }; void insert(struct BTree *at, struct BTree *ins) { struct BTree *cur = at; while (cur != NULL) { struct BTree *whitch = ins->data > cur->data? cur->right: cur->left; if (whitch == NULL) { whitch = ins; break; } cur = whitch; } }
>>367 まず、インデントとC、C++混在記法を何とかして下さい。
混在?
ちょっと間違えたね。これで。 struct BTree { int data; struct BTree *left, *right; }; void insert(struct BTree *at, struct BTree *ins) { struct BTree *cur = at; while (cur != NULL) { struct BTree *whitch = ins->data > cur->data? cur->right: cur->left; if (whitch == NULL) { if (ins->data > cur->data) { cur->right = ins; } else { cur->left = ins; } break; } cur = whitch; } }
読みづらい。
>>366 6 4
160348 0 4
913286 2 3
431289 3 1
671283 3 3
これはSample Inputの最初の5行だけど、最初の行は桁数とヒント数を入力する。
桁数の後スペースを一つ入れてヒント数を入力し改行する。
残りの4行は試行する数とhit数とblow数からなるヒントを入力する。
最初の行の桁数と同じ桁の数を入力して、スペースを一つ入れ、hit数を入れ、
スペースを入れ、blow数を入れ、改行する。
同様に残りの4行を入力する。
ここまで入力するとOutput for the Sample Inputの最初の行の
637281
が出力される。
この後また桁数とヒント数を入力する状態になる。
桁数とヒント数を入力する代わりに 0 0 を入力するとプログラムが終了する。
ヒントをヒント数分入力しても、数が一つに決まらないときは NO を出力する。
入力エラーのチェックは全然入れてない。
手元にコンパイラがないから、エラーが出るかもしれない。 勘弁してくださいね。 insertの引数atは常にルートノードのアドレスということ になります。 あと、insertする順番によっては非常に効率の悪いB木に なりますね。 たとえば、1,2,3,4,5をこの順番でinsertするとリストに 近い構造になってしまう。 深さを優先にしてB木の構造そのものを組替えるような insertを作ったら面白いですね。 あつ、このinsertだと最初のノードは作れないね。 その辺はよろしく。
>367 それ、B木っていうの? どうみても、二分木みたいだけど。
>>373 書いてある通りにやったら、その通りに出来ました。
分かりやすく教えてくれて、ありがとう。
B-Tree じゃなくて Binary-Tree だったりして
間違えちゃった? B木=二進木=binary treeじゃあないの? それともB木=balanced tree?
381 :
デフォルトの名無しさん :03/07/08 22:52
二進木っていうかな。二分木だよね。
よく勘違いされるからバ木とかにしてほすぃ
平衡木
387 :
デフォルトの名無しさん :03/07/08 23:00
バイナリとバランスじゃねーの?
binary treeをバイナリ木と書くことは稀
うーん。確かにB木はBalanced treeのようだね。 失礼失礼。 でも、宿題の本質は再帰構造でなくて反復構造でということ。 Balanced treeを再帰構造で作れる人だったら、反復構造の 二進木insertのコードを見ればOKだと思うのですが。 要するに、内部でループするということです。(苦しい!)
391 :
デフォルトの名無しさん :03/07/08 23:06
全言語のページから二進木を検索しました。 約97件中...
丸投げいいですか? 次のベクトルaを求めるプログラムを示せ。 a=TUb 「cos θ1 -sinθ1 0 0┐ T=|sin θ1 cosθ1 0 0| |0 0 1 0| └0 0 0 1」 「cos θ2 -sinθ2 0 l1┐ U=|sin θ2 cosθ2 0 0| |0 0 1 0| └0 0 0 1」 「l2┐ U=|0| |0| └1 」 手計算した後,それを出力しようとも思ったのですがいくらなんでもまずいかなぁと… よろしくお願いします。 7/10午前まで募集
>393 *bg_smpRtの初期化どこよ?(w
>>394 (´・ω・`)すいません、マジにわからないので教えてください。
>>393 え〜っと、もうどこから突っ込んでいけばよいのやら…(苦笑)。
エラーが出た理由は
>>394 さんのご指摘どおり、 bg_smpRt の領域が確保されていないから。
この場合は malloc するより、 unsigned char *bg_smpRt[sizeof(int)]; という感じで宣言した方がいいと思う。
というわけで、同様の理由により他の bg_hoge すべてでエラーが発生するはずなんだけど、本当に一箇所だけだった?
というか、なんでわざわざエンディアン変更後を保存するのかな?
構造体の中身に直接書くのはマズイの?
あと、書き出すときにちゃんとゼロパディングしないと、元とは違った値になっちゃうことがあるかもよ。
あ、間違った。396の書いた人は323ね。
>>392 #include <stdio.h>
#include <math.h>
double * mmul44(double * am, double * lm, double * rm, int rc)
{
int i, j, k;
for(i=0; i<4; i++) for(j=0; j<rc; j++) for(k=0; k<4; k++)
am[i*rc+j] += lm[k+i*4]*rm[j+k*rc];
return am;
}
int main()
{
int i;
double theta1=1.0, theta2=2.0;
double cs1=cos(theta1), sn1=sin(theta1), cs2=cos(theta2), sn2=sin(theta2);
double T[16]={cs1,-sn1,0,0, sn1,cs1,0,0, 0,0,1,0, 0,0,0,1};
double U[16]={cs2,-sn2,0,1, sn2,cs2,0,0, 0,0,1,0, 0,0,0,1};
double b[4] ={2,0,0,1}, a[4],tmp[16];
mmul44(a,mmul44(tmp,T,U,4),b,1);
printf("a=TUb\n");
for(i=0; i<4; i++) printf(" %f\n",a[i]);
return 0;
}
a[4] -> a[4]={0}
tmp[16] -> tmp[16]={0}
>>396 (´・ω・`)解説どうもです。自分まだまだヘボでしてどうかご勘弁を…
頑張って仕上げてみます
402 :
デフォルトの名無しさん :03/07/09 03:12
文字の集合を表す構造体Setを定義し、要素を追加する 関数を定義し、その動作を確認しなさい。 追加した要素が 集合の新しい要素の場合1、既に存在していた場合0を返すとする。 int addset(Set &set,char a) 前スレで書き込んだ者ですが答えが返ってこず、いまだにさっぱりわかりません。 どなたか分かる方いましたらお願いします。
>>402 文字の集合とは?
構造体Setのメンバーは?
>>402 こんなん?
#include <limits.h>
struct Set
{
char data[2<<CHAR_BIT] ;
} ;
int addset( Set &set, char a )
{
int ret = set.data[a];
set.data[a] = 1 ;
return ret ;
}
406 :
デフォルトの名無しさん :03/07/09 03:32
>>403 すいません・・・これだけの情報しか与えられていません・・・・(涙)
>>405 レスありがとうございます!
参考にさせて頂いてもうすこし考えてみます
Struct Set { char data[(UCHAR_MAX + 1) / CHAR_BIT + 1]; } Set; int addset(Set &set, char a) { set.data[a / CHAR_BIT] &= a % CHAR_BIT; }
問題文を読み間違えてた… つー訳で、1と0返すのが逆になってるので訂正 int addset( Set &set, char a ) { int ret = set.data[a] ^ 1 ; set.data[a] = 1 ; return ret ; }
何やってんだろう… と言う訳で、疲れてるようなので、これだけ訂正して、もう寝まふ struct Set { char data[1<<CHAR_BIT] ; } ;
ありがとうございました
>>405 メンバーが1つだけでは構造体の意味が無いような。
>>406 集合と要素が何なのかは分からない?それが分からないと解き様が無い。
>>413 なら生の配列をそのまま集合だとするのが良いとでも?
この問題がさっぱり分かりません 次々と文字を入力して、それをそのまま出力するプログラムを書け。 ただし、英小文字(aからzまで)は、すべて対応する英大文字に変換してから出力すること。 小文字から大文字への変換は32を引けばよい(Cは大文字と小文字の間の変換をもっと簡単に 書く手段も提供しているのだが、文字コードの練習のために、あえてポータビリティの点で問題の ある書き方を採用することにする) 文字コード(数字)を入力していく場合のプログラムなら書けるのですが、 文字を入力していって小文字だった場合変換するという処理の仕方が分かりません。 文字コード→文字のやり方なら知っているのですが、文字→文字コードのやり方がわからないです 誰か・・・(´・ω・`)
416 :
デフォルトの名無しさん :03/07/09 04:07
>>415 こんな風に
#include <stdio.h>
#include <ctype.h>
int main()
{
int c;
while((c=getchar())!=EOF)
putchar(islower(c)?c-32:c);
return 0;
}
>>414 そういうわけではないけど、出題者が求めている答えには、
メンバーが複数登場すると思う。
数Tで言うと下みたいなのがあったでしょ。
整数∈{{6の倍数⊂{2の倍数∩3の倍数}}⊂自然数}
プログラムが分からないのでなく、問題が分からないとなると
どうしようも無い。
>>418 すいませんヘッダはstdio.hしか習ってないのでその範囲でしか分かりませぬ(´・ω・`)
>>415 #include <stdio.h>
#include <ctype.h>
int main() {
int c;
while( ( c = getchar() ) != EOF )
putchar( islower( c ) ? c - 32 : c );
}
>>420 #include <stdio.h>
int main()
{
int c;
while((c=getchar())!=EOF)
putchar((c>='a'&&c<='z')?c-32:c);
return 0;
}
遅い、かぶった、returnがない。 なんて恥ずかしいんだ。俺。死のう。
ありがとうございます 解決しました
しかし ?c-32:c という処理が理解出来てなかったです(ノд`) putchar習ったばかりで・・・テキストは「これ打つと表示出来るよ」で終わってます どなたか解説お願いします
>>425 じゃあこれで。
これなら教師も文句言わないでしょう。不要な括弧もつけたし。
#include <stdio.h>
int main()
{
int c;
while((c=getchar())!=EOF){
if(c>='a'&&c<='z'){
putchar(c-32);
}
else{
putchar(c);
}
}
return 0;
}
A ? B : C と書くと、Aが真(非0)のときBが、Aが偽(0)のときCが、この式の値になります。 つまり islower(c) ? c - 32 : c は、 islower(c)が真...すなわち、cが小文字の時、c-32が、cが小文字でない時にcが この式の値になります。 # このとき、islower(c)とc >= 'a' && c <= 'z' は等価です。
なるほど!お陰様でよーく理解できました 条件たくさんつけてすみませんでした
>>402 #define MAX_CHAR_NUM 256
struct Set{
int cp;
char data[MAX_CHAR_NUM];
}set;
int addset(Set& set, char a )
{
int i;
for(i=0; i<=set.cp; i++){
if(a==set.data[i]) return 0;
}
set.data[set.cp++]=a;
return 1;
}
こーゆー事だと解釈いたしましたが。
431 :
デフォルトの名無しさん :03/07/09 05:59
432 :
デフォルトの名無しさん :03/07/09 06:57
結局
>>334 のプログラムは作れないの?
漏れも作れんが・・・
重複はいけないのか? A=1,B=3,C=4,D=6,E=2,F=8,G=7,H=5 他にもあるがプログラムにするまでも無いだろ
>>398 bcc32でコンパイル失敗しました。もちろん全角スペースは半角スペースに変換しました。
エラー内容です。
エラー E2063 3.c 17: 不正な初期化(関数 main )
>>434 まじ,はじめて書き込んだんですが…
どこにありました?宿題だから他にも聞いた人がいるだけだと。
うるさい、マルチはマルチだ。
437 :
デフォルトの名無しさん :03/07/09 11:38
先輩♥
>>432 やるきなす。
#include <stdio.h>
#include <stdio.h>
int main(){
int a,b,c,d,e,f,g,h;
for(a=1;a<=8;a++){
for(b=1;b<=8;b++){
if(a==b) continue;
for(c=1;c<=8;c++){
if(a+b != c) continue;
if(c==a || c==b) continue;
for(d=1;d<=8;d++){
if(d==a || d==b || d==c) continue;
for(e=1;e<=8;e++){
if(e==a||e==b||e==c||e==d) continue;
for(f=1;f<=8;f++){
if(f==a||f==b||f==c||f==d) continue;
if(f==e) continue;
if(d+e !=f) continue;
for(g=1;g<=8;g++){
if(g==a||g==b||g==c||g==d) continue;
if(g==e||g==f) continue;
if(a+d !=g) continue;
for(h=1;h<=8;h++){
if(b+e !=h) continue;
if(h==a||h==b||h==c||h==d) continue;
if(h==e||h==f||h==g) continue;
printf("%d %d %d %d %d %d %d %d \n",a,b,c,d,e,f,g,h);
}}}}}}}}}
>>439 まったくもって、やるきないし。
#include <stdio.h>
int main(){
int a,b,c,d,e,f,g,h;
for(a=1;a<=8;a++){
for(b=1;b<=8;b++){
c=a+b;if(c>=8) continue;
for(d=1;d<=8;d++){
for(e=1;e<=8;e++){
int check[9]={0};
int flag=0;
int n;
f=d+e;if(f>8) continue;
g=a+d;if(g>8) continue;
h=b+e;if(h>8) continue;
check[a]++;check[b]++;check[c]++;check[d]++;
check[e]++;check[f]++;check[g]++;check[h]++;
for(n=1;n<=8;n++){
if(check[n]!=1) flag=1;
}
if(flag==0){
printf("%d %d %d %d %d %d %d %d \n",a,b,c,d,e,f,g,h);
}
}
}
}
}
}
>>334 ならたかが4万通りなんだから順列生成して代入すればいいでしょ。一瞬で終るよ。
a,b,d,eを生成すれば、c,f,g,hは必然的に決まる。 よって、全パターンと考えれば、10x9x8x7=4320だと思うのだが。
>>392 こうしろ、もう遅いかもだけど。
int main()
{
int i;
double theta1=1.0, theta2=2.0;
double cs1=cos(theta1), sn1=sin(theta1), cs2=cos(theta2), sn2=sin(theta2);
double T[16]={0,0,0,0, 0,0,0,0, 0,0,1,0, 0,0,0,1};
double U[16]={0,0,0,1, 0,0,0,0, 0,0,1,0, 0,0,0,1};
double b[4] ={2,0,0,1}, a[4]={0}, tmp[16]={0};
T[0]=cs1; T[1]=-sn1; T[4]=sn1; T[5]=cs1;
U[0]=cs2; U[1]=-sn2; U[4]=sn2; U[5]=cs2;
mmul44(a,mmul44(tmp,T,U,4),b,1);
printf("a=TUb\n");
for(i=0; i<4; i++) printf(" %f\n",a[i]);
return 0;
}
定数式で配列を初期化せんといかんのか >>bcc
こういうときはめんどくさいな。それが規格通りの仕様だが・・・自信なし
>>442 a+b=c, a+d=gから、aの取りうる値は6以下でなければならない。
b,d,eも同様なので、6P4で高々360通り。
つーかよく考えたら、a,b,d,eが1-6しか取り得ないなら
c=8, g=7を仮定して自動的にa=6, b=2, d=1が確定するじゃん。
#ついでに言えば、この段階でe=3も確定するね。
従って、a,b,d,eが1,2,3,6の組み合わせのときだけなので24通り。
しかも、a,b,d,eを四角形に並べたときに1と2が必ず対角に来るので
b=2ならa=3かa=6。他も同様なので次の8通りだけ条件が成立する。
a=6,b=2,d=1,e=3
a=6,b=1,d=2,e=3
a=3,b=2,d=1,e=6
a=3,b=1,d=2,e=6
a=2,b=6,d=3,e=1
a=2,b=3,d=6,e=1
a=1,b=6,d=3,e=2
a=1,b=3,d=6,e=2
結論、プログラムを書くまでもなかった。
>>443 1から8までって問題文を読み落としている。
どんなに多くても8!なんだからわざわざ考えなくてもいいと思うんだが
448 :
デフォルトの名無しさん :03/07/09 18:48
すみません、質問です。 以下の課題をやっているんですが、文字列の扱いについてよくわかりません。 課題: リンクによるリストを用いて「辞書」を作り,その辞書を操作するためのCのプログラムを作成する. 文字列を要素(節点の項目)として持つリストを使って,次のような「辞書」システムを作りなさい. 辞書システムは, 辞書に単語を登録する(リストに文字列を挿入する) ``Insert'' 辞書から単語を削除する ``Delete'' ある単語が辞書の中にあるかどうかを判定する ``Lookup'' 辞書の中に登録されているすべての単語をプリントする ``Print'' を持つものとする.
>>448 Cでは普通ゼロ終端のchar配列で表す。
可変長ならmalloc/freeでヒープに取るといいよ。
比較したいときはstrcmp、コピーしたいときはstrcpy。
450 :
デフォルトの名無しさん :03/07/09 19:11
>>448 これは基本的なリンクリストの使用例ですね。
>文字列の扱いについてよくわかりません
struct elem {
struct elem *next; /* NEXTポインタ */
char *word; /* 単語 */
};
このような要素をヘッダからnextポインタでリンクする。
登録する単語をchar *newwordとすると、要素をつくるとき
struct elem* newelem = malloc(sizeof(struct elem));
newelem->next = NULL;
newelem->word = malloc(strlen(newword)+1);
strcpy(newelem->word, newword);
で単語の文字列をwordに格納する。
あとはおわかりかと。nextのほかに逆方向のポインタをつけると
削除するとき楽というのがあります。
このwordに
>>448 単語の最大長が決まっているのであれば、
#define MAX_WORD_LENGTH 128 /* 単語の最大長 */
struct elem {
struct elem *next; /* NEXTポインタ */
char word[MAX_WORD_LENGTH]; /* 単語 */
};
とします。このとき、
newelem->word = malloc(strlen(newword)+1);
は不要です。
早速の回答、ありがとうございます。 char[]を使って、入出力は%sを使うことはわかったのですが、その後がわかりません…\\ 。 数字だけの場合なら、挿入して参照するときちんと出てくるのですが、文字にするとや\\ はろエラーが。。。
まず定義しました。 次に、初期化。 そして、挿入。 dekiteiruつもりなんですが・・・。 struct node { int key; struct node *next; }; struct node *head, *tail; void listinitialize(void) { head = (struct node*) malloc(sizeof(*head)); tail = (struct node*) malloc(sizeof(*tail)); head->next = tail; tail->next = NULL; }; struct node *insertafter(int v, struct node *p) { struct node *x; x = (struct node*) malloc(sizeof(*x)); x->key = v; x->next = p->next; p->next = x; return x; };
二つのn次元ベクトルa、bの内積を求めるプログラムを動的メモリを活用し作成せよ。
>>453 sizeof(struct node)と書けよ。
いろいろなサイトを見ても意味がわからなかったのですが、 制御文のreturnの意味と戻り値の意味を教えてくれませんか?
>>458 2つの整数の和を求める関数を作れ。
話はそれからだ。
簡単そうなのですが私には無理な問題があります。下記のプログラムを 「分割すべき配列の要素数が3以上であれば、先頭の要素、中央の要素、末尾の要素の 3値の中央値を持つ要素を枢軸として選択する」と言う方針を用いて、関数quickを 書き換えてください。
/* クイックソート */ #include <stdio.h> #define swap(type, x, y)do { type t = x; x = y; y = t; } while (0) /*--- クイックソート ---*/ void quick(int a[], int left, int right) { int pl = left;/* 左カーソル */ int pr = right;/* 右カーソル */ int x = a[(pl+pr)/2];/* 枢軸は中央の要素 */ do { while (a[pl] < x) pl++; while (a[pr] > x) pr--; if (pl <= pr) { swap(int, a[pl], a[pr]); pl++; pr--; } } while (pl <= pr); if (left < pr) quick(a, left, pr); if (pl < right) quick(a, pl, right); }
int main(void) { int i; int x[9]; 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]); } quick(x, 0, nx - 1);/* 配列xをクイックソート */ puts("昇順にソートしました。"); for (i = 0; i < nx; i++) printf("x[%d] = %d\n", i, x[i]); return (0); }
463 :
デフォルトの名無しさん :03/07/09 21:24
>>455 合ってるかな?
#include <iostream>
using namespace std;
struct Vec
{
float* pv;
int d,n;
Vec():n(0),d(0),pv(NULL){;}
Vec(float f):n(5),d(1){pv=new float[n];pv[0]=f;}
Vec(float f0,float f1):n(5),d(2){pv=new float[n];pv[0]=f0;pv[1]=f1;}
Vec(float f0,float f1,float f2):n(5),d(3){pv=new float[n];pv[0]=f0;pv[1]=f1;pv[2]=f2;}
~Vec(){if(pv)delete[] pv;}
Vec& DelVec(Vec* pIn){pIn->d=1;pIn->pv[0]=0.f;return *pIn;}
void Add(float f){if(!(d%5)&&n<=d){if(pv)delete[] pv;n+=5;pv=new float[n];}pv[d++]=f;}
Vec& operator =(const Vec& v){if(pv)delete[] pv;d=v.d;n=v.n;pv=new float[n];for(int i=0;i<d;i++)pv[i]=v.pv[i];}
float Dot(const Vec& v)
{
float ret=0.f;
if(d!=v.d){DelVec(this);return 0.f;}
for(int i=0;i<d;i++)ret+=pv[i]*v.pv[i];
return ret;
}
};
int main()
{
Vec a(1.f,0.f,1.f),b(0.f,1.f,1.f);
cout<<"a.Dot(b)= "<<a.Dot(b)<<endl;
return 777;
}
この宿題もお願いします。 hのソートが終わるたびに、配列とhの値を表示するように改良してください。 /* シェルソート */ #include <stdio.h> #define swap(type, x, y)do {type t = x; x = y; y = t; } while (0) /*--- シェルソート ---*/ void ssort(int a[], int n) { int i, j, h; for (h = n / 2; h > 0; h /= 2) for (i = h; i < n; i++) { int tmp = a[i]; for (j = i - h; j >= 0 && a[j] > tmp; j -= h) a[j + h] = a[j]; a[j + h] = tmp; } }
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]); } ssort(x, nx);/* 配列xをシェルソート */ puts("昇順にソートしました。"); for (i = 0; i < nx; i++) printf("x[%d] = %d\n", i, x[i]); return (0); }
>>464 ど こ で h が ソ ー ト さ れ て る ん だ ?
time ./a.out
妙なswapマクロ使ってるな、と思ったら つかってねーでやんの。
469 :
デフォルトの名無しさん :03/07/09 23:52
>>458 いろいろ問題ありだな。
文字列でなく整数のリストが作れるプログラムを最初に作って
それから、文字列のリストに修正するほうがよろしいかと。
リストが理解できる<<<リストが作れる<整数のリスト<文字列のリスト
今は正直言って「リストが理解できる」のレベルにいたってないよ。
>>453 の間違いでした。
すみません458さん。
471 :
デフォルトの名無しさん :03/07/10 00:29
腕の一覧表を讃える
472 :
デフォルトの名無しさん :03/07/10 01:44
まったくの素人です。 基本的なC言語の範囲で以下のプログラムを作成せよ 「キーボードから与えられた数値(非負の整数)を 2進数表示させるプログラムを作成せよ」 授業のヒントではdo〜while構文を使うといいのでは? と言っていた気がします。
>>472 まず、何がわからないのかを明確にしろ。
そのためには、フローチャート(実行手順をざっと紙にでも書いてみろ)を書く。
その上で、分からないところを、ここに書く。
後、使用している環境(OSやツール名)も書け。
素人にもレベルがあって、printfやmainすら理解しない段階も来るのでな・・・
>>473 何が分からないか自分でも分かりまへん
BeOS使用してまふ
ツールはクイックタイムくらいしか使ってまへん
頭痛がしてきた・・・
476 :
デフォルトの名無しさん :03/07/10 03:38
#include<stdio.h> int main() { int i,x; printf("input integer:"); scanf("%d", &i); do { x=i%2; i/=2; printf("%d",x); } while(i>0); return 0; } 出力が逆だけどねーw
#include <stdio.h> int main(void) { int i,x; printf("input integer:"); scanf("%d", &i); for (x = 1; i >> 1 >= x; x <<= 1) ; for (; x > 0; x >>= 1) putchar(i & x ? '1' : '0'); return 0;}
#include <stdio.h> #include <limits.h> int main(void) { int i,x; printf("input integer:"); scanf("%d", &i); for (x=1<<(INT_BIT-1); x ; x >>= 1) ; putchar(i & x ? '1' : '0'); return 0; }
for (x=1<<(INT_BIT-1); x ; x >>= 1) ; ↑ この最後のセミコロン消し忘れた・・・
まだ間違ってた。 #include <stdio.h> #include <limits.h> #define INT_BIT (sizeof(int) * CHAR_BIT) int main(void) { int i,x; printf("input integer:"); scanf("%d", &i); for (x=1<<(INT_BIT-1); x ; x >>= 1) putchar(i & x ? '1' : '0'); return 0; }
int i,j=0; for(i=0;i<<j;i++); と書くと、for文の終了条件ってどうなるんですか?
sageミスった・・・ 鬱だ・・・ スマソ。
484 :
デフォルトの名無しさん :03/07/10 15:08
任数の整数を入力し、これを16進数および2進数で表示せよ 表示例は 10 = A = 00001010 ただし2進数の桁は8桁まででよい。 です。%xは使ってはいけないっとのことです。 宜しくお願いします。
オレニマカセロ!
>486 オマエニマカスィタ! つーか、ニュー速+ 書けないウツダ…
#include <stdio.h>
int main(void) {
int i,x;
printf("input integer:");
scanf("%d", &i);
printf("%d = ", i);
for (x = 0; i >> 4*x > 0; x++) ;
for (; --x >= 0;)
putchar("0123456789ABCDEF"[(i
>>4 *x)%16]);
printf(" = ");
for (x = 8; --x >= 0;)
putchar((i >> x) & 1 ? '1' : '0');
return 0;}
for (x = 0; i >> 4*x > 0; x++) ; for (x = 1; i >> 4*x > 0; x++) ;
ありがとうございます。 なんか r=x %16 x=x/16 のような記述で素人てきなプログラムが いいみたいがいいらしいんですけどできるでしょうか?
>>489 後から条件をつけるのはマナー違反
487が一生懸命作ってくれたプログラムが無駄になるだろ
492 :
デフォルトの名無しさん :03/07/10 16:42
493 :
デフォルトの名無しさん :03/07/10 16:43
#include <stdio.h> #include <stdlib.h> int main(){ int a[100],sum=0,i,j; double t; for(i=0;i<100;i++){ a[i]=rand()%100; } for(j=0;j<i;j++){ sum=sum+a[j]; } t=sum/100; printf("sum=%d average=%f\n",sum,t); } 乱数の合計と平均を出すプログラムなんですが、平均の小数部分がでません どうすれば?
>>493 t=sum/100;
↓
t=sum/100.0;
t=sum/100; ↓ t=(double)sum/100.0;
>>493 int a[100],sum=0,i,j;
↓
int a[100],i,j;
double sum=0;
>>494-497 C言語音痴で申し訳ありません
おかげでできました
採用したのは494さんです
499 :
デフォルトの名無しさん :03/07/10 17:38
へたれなので2chで画像クリックなんて怖くてできません。
501 :
デフォルトの名無しさん :03/07/10 17:54
この問題やってください。 整数1から20までの乱数をn個発生させ、各整数ごとの生成個数の平均と標準偏差を示しなさい。ここで、nは1000,2000,3000…,10000とする。なお、乱数はrandom()%20+1の式で生成するものとする。 ホントに初心者なのでお願いします。
502 :
デフォルトの名無しさん :03/07/10 18:22
怠け者の俺に答えを教えて下さい。 バブル、クイック、単純選択、単純挿入、それぞれのソートのプログラム ↓バブルだけでギブアップ。もっと綺麗に表示したい #include <stdio.h> int main (void) { int item[100]; int a,b,t; int count; printf("数値をいくつ入力しますか?"); scanf("%d", &count); for(a=0; a<count; a++) scanf("%d", &item[a]); for(a=1; a<count; ++a) for(b=count-1; b>=a; --b) { if(item[b-1]>item[b]) { t=item[b-1]; item[b-1]=item[b]; item[b]=t; } } for(t=0; t<count; t++) printf("%d",item[t]); return 0; }
>>501 #include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main(void)
{
const int n_min = 1000;
const int n_max = 10000;
const int n_step = 1000;
int i, n, r;
double sum, sum2, mean, sigma;
for (n = n_min; n <= n_max; n += n_step) {
sum = 0;
sum2 = 0;
for (i = n; i != 0; --i) {
r = random() % 20 + 1;
sum += r;
sum2 += r * r;
}
mean = sum / n;
sigma = sqrt(sum2 / n - mean * mean);
printf("%d\t%f\t%f\n", n, mean, sigma);
}
return 0;
}
>>492 素直なので教えてあげる。つーかitoaそのまま。
const char * itos(unsigned long i,char* s,int dig)
{
unsigned long t;
char const *h = s;
char *p;
if(dig == 10 && (long)i<0){
*s++ = '-';
}
p = s;
do{
t = i%dig;
i /= dig;
if(t > 9)
*s++ = (char)(t-10+'A');
else
*s++ = (char)(t + '0');
}while(i>0);
*s-- = '\0';
while(p < s) {
t = *s; *s = *p; *p = (char)t;
++p; --s;
}
return h;
}
こんなの丸写しするなら、gccのソースダウンロードしてコピーすればいいじゃん。 それだけでも勉強になるわな。
(´-`).。oO(…なぜgcc)
>>505 gccにitoaがあるなんて初耳だな〜
508 :
デフォルトの名無しさん :03/07/10 19:12
あの、HDやFDDのデータをじかに書き込み、読み込みするってできるんすか?
>あの、HDやFDDのデータをじかに書き込み、読み込みするってできるんすか? フロッピーディスクドライブのデータっていうことは、何処のメーカーかとかだよね。 そりゃー難しいんじゃないかな? どころで、ここって(・∀・)C/C++の宿題やらせてください。ver10 なんだけど、 これは宿題なのか?
三つの複素数 α、β、γの実数部、虚数部の値(実数)をそれぞれ入力し、 (α+γ)(β+γ)を求めて表示せよ。 ただし、複素数を、実数部と虚数部に対応するメンバで構成される構造体として表し、 複素数の加算用関数c_add()と乗算用関数c_mul()を作成して、これを利用すること。 これらの関数は、sとtを複素数を表す構造体としたとき、c_add(s,t)、c_mul(s,t)と呼び出すと、 それぞれ戻り値として、sとtを加算、または乗算した結果である複素数の構造体を返すものとする。 入力はキーボードからです。 よろしくお願いします。
512 :
デフォルトの名無しさん :03/07/10 19:45
501です。ホントに初心者でわからないところがあります。ホントにすいませんがもっと簡単なやり方はありませんか?
#include <stdio.h> #include <stdlib.h> int main(){ int a,i,b,guu,choki,paa,n[200],awin,bwin,even; double wa,wb,e,game; for(i=0;i<200;i++){ n[i]=rand()%3; } guu=0; choki=1; paa=2; awin=0; bwin=0; even=0; game=0; for(a=0;a<200;a+=2){ b=a+1; game=(a/2.0)+1.0; wa=awin/game; wb=bwin/game; e=even/game; if(n[a]==guu&&n[b]==choki) awin++; if(n[a]==choki&&n[b]==paa) awin++; if(n[a]==paa&&n[b]==guu) awin++; if(n[b]==guu&&n[a]==choki) bwin++; if(n[b]==choki&&n[a]==paa) bwin++; if(n[b]==paa&&n[a]==guu) bwin++; if(n[a]==n[b]) even++; printf("%d %7.6f %7.6f %7.6f\n",game,wa,wb,e); } } 二人でするじゃんけんのゲームごとの二人の勝率を調べようとしましたが、 結果は0.000000だけが並ぶのはなぜですか?
>>511 #include <stdio.h>
typedef struct {
double r; double i;
} c_t;
c_t c_add(c_t s,c_t t){ c_t r; r.r=s.r+t.r; r.i=s.i+t.i;return r;}
c_t c_mul(c_t s,c_t t){ c_t r; r.r=s.r*t.r-s.i*t.i; r.i=s.r*t.i+t.r*s.i;return r;}
int main(void)
{
c_t a,b,c,ans;
scanf("%lf%lf",&a.r,&a.i);
scanf("%lf%lf",&b.r,&b.i);
scanf("%lf%lf",&c.r,&c.i);
ans=c_mul(c_add(a,c),c_add(b,c));
printf("real:%f image:%f\n",ans.r,ans.i);
return 0;
}
517 :
デフォルトの名無しさん :03/07/10 22:10
int型変数、a,b,の値をそれぞれ10,4として、次の文をそれぞれ 実行したときのaの値を表しなさい。 (1) a/=b (2) a+5*b-- (3) a=a!=b (4) a=a%b (5) a=a>b (6) a=a||b (7) a++ (8) a=!a (9) a+=b*2 (10) a=(++a)*(b++) これがどうにもわかりません。。。 よろしくお願いします
オレニマカセロ! 連続に実行するの? 10はダメそうだけど。
これって、コーディングするんじゃなくて、机上で考える問題じゃ・・・
問題のまんまソース書いて表示すればいいんちゃうん?
1 2 2 10 3 1 4 2 5 1 7 11 8 0 9 18 6と10はパス。
522 :
デフォルトの名無しさん :03/07/10 22:18
世の中オブジェクト指向なんですよ。世の中の全てはオブジェクトで表せるんですよ。だから、プログラムだってオブジェクト指向が一番なんですよ。
愛の告白も、オブジェクト指向で・・・
if ( ORE->Kokuhaku(KANOJYO) == true)
{
//告白に成功したら性交:p(アホか?)
ORE->Insert(KANOJYO);
}
else
{
//フられたら、呑みまくり!!
ORE->Nomikai();
}
ごめんなさい・・・僕が悪かったです。
http://www.futuresoftware.org/diary/diary0306.html
523 :
デフォルトの名無しさん :03/07/10 22:45
int map[10][10]={ 1 1 0 0 0 0 1 0 1 0 0 1 0 1 1 1 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1 1 1 1 1 0 1 0 1 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 1 1 1 1 0 1 0 0 1 1 0 0 1 0 0 1 1 0 0 0 0 1 0 0 0 1 1 0 1 0 1 1 0 1 0 0 2 1 0 0 0 0 0 0 の迷路(0は道 1は壁 2は出口)をコマンドラインでX、Y座標を入力して、 再帰を使い、出口までの経路のみを表示するプログラムをつくりたいんですけど、 おねがいたします。
なせコマンドラインでXYを入力するかがわかりません
525 :
デフォルトの名無しさん :03/07/10 22:48
↑Cでおねがいたします
マトックは何回まで使えますか?
>>523 主語述語が入り組んでて文章の意味が良く分からん。
>>526 7回までです。あと、どこかにモーニングスターが隠されています。
>>528 しかし、繰り出すまでの時間が長いのでボス戦にはあまり向いてないぞ。
531 :
デフォルトの名無しさん :03/07/10 23:07
>>524 コマンドラインでってかいてあるんですよ。 >>527 すいません文章下手で。とにかく迷路の出口までの経路のみを表示するプログラムをつくりたいんですよ。
自力で何とか出来ました|彡サッ
>>523 というか意味がわからん
コマンドラインで入力するX,Yが何を表しているのか
見たとこMAPはソース内で定義するんだろうけど
523の説明だとコマンドラインからMAPを入力するようにも読める
そしてスタート地点も謎
下のプログラムの出力結果はどうなるか、説明しなさい。ただし、 実行したらこうなりましたと言う回答は不可 #include<stdio.h> int a[]={0,1,2,3,4}; int *p[]={a,a+1,a+2,a+3,a+4}; int **pp=p; int main(void) { printf("a=%d,*a=%d\n",a,*a); printf("p=%d,*p=%d,**p=%d\n",p,p,**p); printf("pp=%d,*pp=%d,**pp=%d\n",pp,*pp,**pp); printf("pp-p=%d,*pp-a=%d,**pp=%d\n",pp-p,*pp-a,**pp); return 0; }
536 :
無料動画直リン :03/07/10 23:38
>>535 コンパイルしないプログラムに価値なんて無いよ。
ちょうどGB聖剣やってた所だから、ビビット来た。
540 :
デフォルトの名無しさん :03/07/11 00:26
へたれなので2chで画像クリックなんて怖くてできません。
文字列strをメモリに格納するための関数char *SaveStr(char*)を作成しなさい。 プログラムの方針として、まずstrlen()関数により格納される文字列の長さを求め、 malloc()関数によりメモリの確保を行い、strcpy()関数により文字列のコピーを行い、 格納したアドレスを関数の戻り値とすること
char *SaveStr(char* s) { char *t = malloc(strlen(s)+1); if (t) strcpy(t, s); return t; }
544 :
デフォルトの名無しさん :03/07/11 01:56
リストに格納されているデータを反対側から取り出し、 ファイルに格納するプログラムを作成せよ。 jyohou2002=(struct seiseki *)malloc(sizeof(struct seiseki)); jyohou2002->next=NULL; printf("%d人目の登録をしますか?YESなら1,NOなら2",i); scanf("%d",&Flag); current_p=jyohou; while(Flag==1){ printf("%d人目の国語の登録をどうぞ",i); scanf("%d",¤t_p->jpn); printf("%d人目の英語の登録をどうぞ",i); scanf("%d",¤t_p->eng); printf("%d人目の数学の登録をどうぞ",i); scanf("%d",¤t_p->math); i++; printf("%d人目の登録をしますか?YESなら1,NOなら2",i); scanf("%d",&Flag); if(Flag==1){ current_p->next=(struct seiseki *)malloc(sizeof(struct seiseki)); current_p->next->next=NULL; current_p=current_p->next; } }
"¤"って、"curren"って読むのか?
実はprevはない
>>544 void s_fprint ( struct seiseki *cur, FILE *fp )
{
if ( cur != NULL )
{
if ( cur->next != NULL ) s_print ( cur->next, fp ) ;
fprintf ( fp, "%d %d %d\n", current_p->jpn, current_p->eng, current_p->math )
}
return ;
}
ミスってたね if ( cur->next != NULL ) s_fprint ( cur->next, fp ) ; 後はfprintf()の部分を自分が書き出したい方法に適当に変えてちょ
誰か if ( cur->next != NULL ) はイラネって突っ込んでよ…
大変恐縮ですが、以下の問題なのですが、 自分の実力ではどうにもならず、提出期限が迫っており、 現在勉強中ですが間に合いそうにありません・・・C言語にかなり強そうな方がいらっしゃるようですので、できればこの問題解決できたらと思って投稿しました。 よろしくお願いいたします。 問題:3つの外部ファイル(.datファイル) *A.dat* No Name A001 Hajime A002 Go A003 Tetsu A004 Yoshio *B.dat* No ID Point A001 B001 75 A002 B002 56 A003 B001 58 A004 B003 87 *C.dat* ID Subject Teacher B001 Math Mikami B002 English Suzuki B003 Science Yamazaki を、C言語で書いたプログラムでアクセスし、3つのファイルから 要素を取り出し、以下の一つの表を完成させるプログラム。datファイルの中身はカンマ区切りでも1スペース区切りにしてもかまいません。
*結果の表* No Name Subject Teacher Point A001 Hajime Math Mikami 75 A002 Go English Suzuki 56 A003 Tetsu Math Mikami 58 A004 Yoshio Science Yamazaki 87 ここで、NoとNameをA.datから、SubjectとTeacherをC.datから、 PointをB.datから持ってくるのですが、B.datとC.datのIDとSubjectを 合致させなくてはなりません。 全体の方針として、 データを開き、2次元配列にどんどん入れていって、 新しいファイルに書き出し、そのファイルを読み込んで表示させる という流れになると思うのですが、お恥ずかしいながら自分の実力では どうにもなりません。 このような例が書籍で調べたり、ネット上で調べても見当たらなく、 困っています。助けてはいただけませんでしょうか? 大変無理なお願いかもしれませんが、どうぞよろしくお願いいたします。 ちなみに問題の制約として、常にファイルにアクセスするような設計は不可のようです。
552 :
デフォルトの名無しさん :03/07/11 07:49
>>550 > カンマ区切りでも1スペース区切りにしてもかまいません。
これはプログラムをどちらにも対応させろという意味なのか?
553 :
デフォルトの名無しさん :03/07/11 09:29
計算結果で、複素数のiを表示させる場合はどうすればいいのでしょうか?
554 :
デフォルトの名無しさん :03/07/11 09:41
555 :
デフォルトの名無しさん :03/07/11 09:48
iはfloatのの所に書いとけばいいんですかね?
foatのところってどこよ
>>556 よく読めYO
「foatのところ」じゃなくて「floatのの所」だよ
じゃfloatのところってどこよ。
559 :
デフォルトの名無しさん :03/07/11 10:06
char *(*(*a[N])())() ↑って何かいてるの? 意味わからん。
560 :
デフォルトの名無しさん :03/07/11 10:07
あ、すいません。 自己解決しました。
561 :
デフォルトの名無しさん :03/07/11 10:08
560=555です。
C++Builderを使ってやる課題なのですが、誰が教えて頂けないでしょうか、お願いします。 酔歩・・・各時刻でx=x(t)にある点が時刻t=t+1では確率1/2でx(t)+a、確率1/2でx(t)-aに移動するとき、 この点はx軸上で酔歩を行うという。x軸、y軸に関して共に酔歩を行う時、x軸上で酔歩している点の 時刻tにおける位置をS(t)とすると、S(t)=煤ii=0からt)xi(iは添え字)である。ここで確率1/2でa、 確率1/2で-aの値と取る互いに独立な確率変数である。 ここからが問題文に入るのですが、 a=1として(x,y)平面上で一点の酔歩を行いt=0からt=1000までの点の軌跡を描きなさい。但し、初期値は(0,0) とします。更に時刻tまでの点のx座標の絶対値をξ(t)、すなわちξ(t)=max|(i=0〜x)xi|としたとき、 ξ(t)を求めて図を描きなさい。 与えられているヒントは、乱数はxi+1(i+1は添え字)≡λxi+μ(mod P)を使う。 LineToメソッド MoveToメソッドを使う。 ということです。 c++Builderを使うとどんなプログラムになるか教えて下さい。
λっていくつ? μ()ってどんな関数?。
>>559 関数ポインタの配列じゃないの?
その関数のプロトタイプ宣言を含んだ書き方だからややこしいだけでしょ。
>>563 そこまでは指定されてないんですよ。ただこれを使えば一番良いとしか。
ふーん、じゃ動くものは作れないね。
>>566 基本的に乱数は好きなように作っていいみたいです。
なんだそりゃ。いいかげんな問題だな。
C++Builderでも、SDKプログラミングはできる(w
C++Builderでどんなプログラムになるか教えて下さい。
こんなもんか(w int main(){ HDC dc = GetDC( NULL ); int t,x=0,y=0; RECT rect; POINT prevorg; GetClientRect( GetDesktopWindow(), &rect ); SetWindowOrgEx( dc, -rect.right/4, -rect.bottom/4, &prevorg); MoveToEx( dc, -100,0,NULL);LineTo( dc, 100,0); MoveToEx( dc, 0,-100,NULL);LineTo( dc, 0,100); MoveToEx( dc, 0, 0 ,NULL); for( t=0; t<1000; t++ ){ x += rand() > RAND_MAX/2? 1 : -1; y += rand() > RAND_MAX/2? 1 : -1; LineTo( dc, x, -y ); MoveToEx( dc,x,-y ,NULL); } SetWindowOrgEx( dc, 0, -3*rect.bottom/4, NULL); MoveToEx( dc, 00,0,NULL);LineTo( dc, 1000,0); MoveToEx( dc, 0, 0 ,NULL); for( t=0, x=0; t<1000; t++ ){ x += rand() > 0x7fff/2? 1 : -1; LineTo( dc, t, -abs(x) );MoveToEx(dc, t, -abs(x), NULL); } ReleaseDC( NULL,dc ); }
C言語で 何秒間の間に数字の1を何回押したかというプログラムを作りたいのですが 誰か教えて下さい。 何秒間というのはランダムです(5秒〜30秒ぐらいの間)
>572 ANSI-Cでは無理。激しく環境依存。
>>572 その文章じゃあ、何を教えてほしいのかわからん
ソースもらっても作ったっていうのか…
N=2^P個のデータをフーリエ変換するDFT,FFTのプログラムを教えて下さい。 お願いします。
>>576 そういえばそうですね・・・
C言語で
何秒間の間に数字の1を何回押したかというプログラムを
誰か作ってください。
何秒間というのはランダムです(5秒〜30秒ぐらいの間)
返事が遅くなってすみません。みなさまのおかげで、無事に完成しました。 どうもありがとうございました。
有名な数学的問題は大抵Webにころがっている
585 :
デフォルトの名無しさん :03/07/11 17:34
>>577 http://www5.airnet.ne.jp/tomy/cpro/sst7.htm#top を参考にしてください。
void fft1(double ar[], double ai[], int n, int iter, int flag)
がそう。引数の使い方を間違えずに。
ar[]はデータの実数部、ai[]はデータの虚数部、nはデータ数(=2^k)
flagは0がフーリエ変換で1が逆フーリエ変換。
iterはコードを見る限り0でよし。
だいたいFFT(=DFT)をプログラムで利用している人でFFTの
ロジックをちゃんと理解している人は10%くらいです。
残りの90%は使い方(=引数の意味)だけ理解している人です。
引数の意味の意味がわからない人は・・・
586 :
デフォルトの名無しさん :03/07/11 17:56
製作者にきけばいいじゃん
いや、ここで聞くのが確実だと思う。
俺はそうは思わない。
反対の反対は賛成な〜のだ
>>572 >>579 #include <stdio.h>
#include <time.h>
#include <conio.h>
#define WAIT 5
int main(void)
{
int pushOne=0;
clock_t start=clock()/CLOCKS_PER_SEC;
for(;clock()/CLOCKS_PER_SEC-start<=WAIT;)
if(kbhit()&&getch()=='1') pushOne++;
printf("'1'を%d回押しました\n",pushOne);
return 0;
}
>>593 conio.hがOSに依存するね。
まぁ、こういうのは仕方ないけど。
596 :
デフォルトの名無しさん :03/07/11 21:54
>>566 >ふーん、じゃ動くものは作れないね。
乱数発生方法として線形合法を使えといっている。
μは関数ではなくて単なる定数。
λも定数
≡λxi+μ(mod P) は合同式
潔く言い切ったつもりだろうが、教養のなさを露呈することに
なりましたな、あほ。
課題助けてください。 課題1:3科目(英数理)の点数をキーボードから入力して、それらの点数のうち最も高い点数を表示するプログラムを作りなさい。 自分が作ったのは下のです #include<stdio.h> main() { int eng,math,sci,max; printf("英語の点数--->");scanf("%d",&eng); printf("数学の点数--->");scanf("%d",&math); printf("理科の点数--->");scanf("%d",&sci); if(eng>math){ if(eng>sci){ max=eng; } else{ max=sci; } } else{ if(math>sci){ max=math; } else{ max=sci; } } printf("最高点は%d点です\n",max); } でもどうやら「関数」構造でなければならないらしいのですが、その時の講義に法事の為出席できなくて関数がわかりません。 本も読んだのですがプロトタイプが必要とかそれくらいしか理解できなかったです。 基礎論なので難しい関数は使わないはずです。よろしくお願いします。void return ansとか本に書いてあります。
お願い致します。 以下の積分は形を出力するプログラムを作成しなさい。 g(t)=∫cos(5t)dt g(0)=0より、g(t)=1+0.2*sin5tである。
自分で作ったのは以下です #include <stdio.h> #include <math.h> main() { double g; double x; for ( x=0; x < 100; x=x+1) { g = 1 + 2*sin(5*x); printf("%f %f\n", 5*x, g); } }
>>599 積分ってのがどういう演算か理解してるなら答えは出たようなもんだと思うが。
なんか妙にカクカクしたグラフ見たことあるだろう?
603 :
デフォルトの名無しさん :03/07/11 23:14
>>602 積分演算の結果はカクカクしているのか?
サイン波がカクカクしているのか?
その理解とやらを教えてくれ。
604 :
デフォルトの名無しさん :03/07/11 23:18
線形リストを用いて、過去に素数とわかった数を保存し、 指定された数(N)以下の素数を求めるプログラムを作成せよ。 ただし、Nはプログラム実行中の外部入力できるようにすること。
606 :
C勉強中・・・ :03/07/11 23:21
>552 いえ、どちらでもできれば問題なしです。 ここのスレッドはやってますね^^ どこかの本読むよりよっぽど勉強になります。 よろしくおねができますでしょうか?
教えていただけませんか?お願いします。
608 :
デフォルトの名無しさん :03/07/11 23:42
C言語で数当てゲーム(課題)を作っていて制限時間を30秒に 指定したいのですがどのようにしたらいいのでしょうか? 一応中身はfor文でやっています。基礎の基礎位のレベルでお願いします。 あとその秒数表示を1秒ごと同じ場所でカウントダウン方式みたいな感じで やりたいのですがそれはどうしたらいいのでしょうか!? よろしくお願いします。
609 :
デフォルトの名無しさん :03/07/11 23:43
2GB以上のファイルが読めないんですが, どうればいいですか?
>>607 #include <stdio.h>
#include <math.h>
main() {
double g,x;
int i;
for ( x=0; x < 100; x=x+1) {
g = 1 + 2*sin(5*x);
printf("%05.2f ",g);
if(g>0){
for(i=0;i<30;++i) printf(" ");
for(i=0;i<(int)(g*10);++i) printf("I");
}else if(g<0){
for(i=0;i<30.0+g*10;++i) printf(" ");
for(;i<30;++i) printf("I");
}
printf("\n");
}
}
612 :
C勉強中・・・ :03/07/12 00:01
550、551の質問内容ですが、締め切りが明日でかなり困ってしまっています。どなたかおしえていただけませんでしょうか? よろしくお願いしますm__m 実力不足で申し訳ないです・・・
613 :
デフォルトの名無しさん :03/07/12 00:04
>>599 問題が今一つわからないです。
よくあるのが求積つまり面積を求めるやつ。
あとは原始関数を求めるやつ。(∫cos(5t)dt=5sin(t)?)
おそらく面積を求めるほうですよね。
マンドクセー
611さんありがとうございます。 でもそれ僕のではありません。 僕の課題は599です。お時間ありましたらお願いします。
616 :
デフォルトの名無しさん :03/07/12 00:10
>>609 WindowsではWinAPIのRead関数を使わなければ読めなかったような
記憶があるが?違ったかな?
>>599 の解答のつもりで書いたけど?w
30のところは10にしてもいいかな。
>>616 OSはRed hat linuxかMac OS X 10.2
おそらくコンパイラにも関係してますよね
間違えました598です。
>>598 #include<stdio.h>
void foo()
{
int eng,math,sci,max;
printf("英語の点数--->");scanf("%d",&eng);
printf("数学の点数--->");scanf("%d",&math);
printf("理科の点数--->");scanf("%d",&sci);
if(eng>math){
if(eng>sci){
max=eng;
}
else{
max=sci;
}
}
else{
if(math>sci){
max=math;
}
else{
max=sci;
}
}
printf("最高点は%d点です\n",max);
}
main() { foo(); }
621 :
デフォルトの名無しさん :03/07/12 00:21
どなたかお願いいたします。 文字列でIPアドレスとネットマスクが与えられた時、ネ ットワークアドレスを文字列が返す関数を定義しなさい。
>>598 #include<stdio.h>
void foo()
{
int eng,math,sci;
printf("英語の点数--->");scanf("%d",&eng);
printf("数学の点数--->");scanf("%d",&math);
printf("理科の点数--->");scanf("%d",&sci);
printf("最高点は%d点です\n",eng > math ? eng : math > sci ? math : sci);
}
main(){foo();}
よくある宿題とその回答を集めた「宿題FAQ」でもつくれば重複も減るね
>>621 dotted decimal でいいのか?
環境依存しないで書けるの?
628 :
デフォルトの名無しさん :03/07/12 01:08
>>626 すみません。
dotted decimalの言葉の意味すらわからないのです。
本来ならある程度理解してから質問すべきところを、どうもすみません。
char* netaddress(char* ipaddress,char* netmask)
一文を使うようなのですが…。
よろしければご教授おねがいします。
629 :
デフォルトの名無しさん :03/07/12 01:32
>>628 (
>>626 さんじゃあないです)
dotted decimal は "151.55.11.22" みたいな文字列。
で、
char* ipaddress などに入ってくるモノや、返すべき値は、どのようなものなのでしょうか?
前述した文字列なのでしょうか?
それとも、char型4つの配列なのでしょうか?(ipaddress[0]=151, ipaddress[1]=55,...みたいな)
#include <stdio.h> char *netaddress(char *ipaddress, char *netmask) { int a[4], m[4]; char *netaddr; sscanf(ipaddress, "%d.%d.%d.%d", &a[0], &a[1], &a[2], &a[3]); sscanf(netmask, "%d.%d.%d.%d", &m[0], &m[1], &m[2], &m[3]); sprintf(netaddr, "%d.%d.%d.%d", a[0] & m[0], a[1] & m[1], a[2] & m[2], a[3] & m[3]); return netaddr; } int main(void) { printf("%s\n", netaddress("192.168.0.1", "255.255.255.0")); return 0; } こんなんでいいのかね
static char netaddr[16]; とでもしなきゃまずいんじゃね?
632 :
デフォルトの名無しさん :03/07/12 01:38
宿題:(C言語)3つの実数、a,b,cを入力し、それを三辺とします。 三角形が不等辺三角形、二等辺三角形、正三角形いずれかであるかを 答えるアルゴリズムを作りフローチャートに示せ。アルゴリズムだけ でもいいのでお願いします。できればフローチャートの説明もお願い します。
#include <stdio.h> #include <stdlib.h> int intcmp(const void *k, const void *n){return *k-*n;} main(){ int a[3]; printf("三辺の長さを入力 > "); scanf("%d %d %d",&a[0],&a[1],&a[2]); qsort(a,3,sizeof(int),intcmp); if(a[0]==a[2]) printf("正三角形です。\n"); else if(a[0]==a[1] || a[1]==a[2]) printf("二等辺三角形です。\n") else printf("不等辺三角形です。\n"); }
あ、整数でやっちゃった。
>>632 三辺が等しかったら、正三角形
それ以外で、二辺が、等しかったら、二等辺三角形
それ以外なら、不等辺三角形
>>632 アルゴリズム
i = ( a == b ) + ( b == c ) + ( c == a ) ;
i が 3 なら正三角形
i が 1 なら二等辺三角形
i が 0 なら不等辺三角形
以上
アルゴリズム・・・ フローチャート・・・
ごめん1でいいんだ
642 :
デフォルトの名無しさん :03/07/12 01:56
>>640 うんにゃ。
i=2にはならないです。
a=b かつ b=c のときには、3になりますよ。
643 :
デフォルトの名無しさん :03/07/12 01:57
>>604 次の線形リストを参考にしてできませんか?
#include<stdio.h>
#include<stdlib.h>
#define MAX 5
typedef struct data Data;
typedef struct data *DataP;
struct data{
int val;
DataP prev;
};
DataP add_data( int i, DataP last);
void print_data(DataP last);
void free_list(DataP last);
int main()
{
int i;
DataP last = NULL;
for( i = 0; i < MAX; ++i){
printf("input data %d\n",i);
last = add_data(i,last);
}
print_data( last);
exit(0);
}
645 :
デフォルトの名無しさん :03/07/12 01:57
つづき DataP add_data( int i, DataP last) { DataP new; if(( new = (DataP)malloc( sizeof(Data))) == NULL){ fprintf( stderr, "data allocation erroe !\n"); exit(1); } new -> val = i; new -> prev = last; return new; } void print_data( DataP last) { while( last != NULL){ printf("output data %d\n", last -> val); last = last -> prev; } } void free_list( DataP last) { DataP olast; while( last != NULL){ olast = last; last = last -> prev; free( olast); } }
646 :
デフォルトの名無しさん :03/07/12 02:06
>>629-630 レスありがとうございます。
忘れてました
#include <string.h>
#include <strstre.h>
char* itoa(int n){
char* s;
s= new char[10];
strstream st(s,0,ios::out);
st << n << '\0';
return _strdup(st.str());
}
この部分を使うようののですが。
たびたびすみませんが、よろしくおねがいします。
なんだそりゃ・・・C/C++混在だな・・・。
しかもdeleteするのは勘弁してほしいコードだな・・・
#include <stdio.h> char *netaddress(char *ipaddress, char *netmask) { int a[4], m[4]; static char netaddr[16]; sscanf(ipaddress, "%d.%d.%d.%d", &a[0], &a[1], &a[2], &a[3]); sscanf(netmask, "%d.%d.%d.%d", &m[0], &m[1], &m[2], &m[3]); sprintf(netaddr, "%s.%s.%s.%s", itoa(a[0]&m[0]), itoa(a[1]&m[1]),itoa(a[2]&m[2]),itoa(a[3]&m[3])); return netaddr; } int main(void) { printf("%s\n", netaddress("192.168.0.1", "255.255.255.0")); return 0; }
650 :
デフォルトの名無しさん :03/07/12 02:26
>>649 > sprintf(netaddr, "%s.%s.%s.%s", itoa(a[0]&m[0]), itoa(a[1]&m[1]),itoa(a[2]&m[2]),itoa(a[3]&m[3]));
sprintf(netaddr, "%d.%d.%d.%d", a[0]&m[0], a[1]&m[1], a[2]&m[2], a[3]&m[3]);
じゃだめなの ? (つーか、itoa() って静的領域返さなかったっけ ?)
>>649 なにやってんのぉー。
それにしてもstaticのいみねーよ。
655 :
C勉強中・・・ :03/07/12 11:42
>625 すごい!正直感動しました。ありがとうございました!
>>593 ありがとうございました。
あともうひとつ質問があるのですが、
今度はユーザーが時間を設定できるプログラムを作りたいんですが
誰か作ってください。
(ずうずうしくてすいません)
>>593 のソースの動きを見てれば
どこいじればいいかわかるとおもうが
660 :
デフォルトの名無しさん :03/07/12 21:53
#include<stdio.h> struct node { struct node *left; struct node *right; char label; }; //preorder void preorder(struct node *p) { if(p==NULL)return; printf("\n stop node %c \n",p->label); preorder(p->left); preorder(p->right); } //inorder void inorder(struct node *p) { if(p==NULL)return; inorder(p->left); printf("\n stop node %c \n",p->label); inorder(p->right); }
660の続き //postorder void postorder(struct node *p) { if(p==NULL)return; postorder(p->left); postorder(p->right); printf("\n stop node %c \n",p->label); } void insertdata(struct node **p) { if(p==NULL)return; insertdata(p->left); scanf("%c",&p->label); insertdata(p->right); } void main(void) { struct node *ptr; insertdata(&ptr); preorder(&ptr); inorder(&ptr); postorder(&ptr); }
660-661のプログラムでエラーがでてしまってどこを変更すべきかわかりません。 どなたか教えてください。
&ptr -> ptr
>>663 それはすでに気づいてなおしましたが、insertdata周りでエラーがでます。
**p→*p
>>665 エラーはでなくなりましたが(コンパイルは通るが)起動するとすぐに落ちます。
1. strut node ptr の指している実態が無い。 2. if(p==NULL) というコードはあるが、リストの端をNULLにするコードは無い この辺りが問題かと。
デバッガでメモリ内容見ましょう。これくらいなら追いかけられるはずです。
まあ、汎用ではないが、入力の監視に、selectあたりを使う。 秒数表示のところも、汎用ではできないが、エスケープシーケンスか、 コンソール系APIを使うのが妥当か。 いずれも基礎の基礎レベルとはいえないが、「基礎の基礎」に こだわるなら、答えは、「できない」
>>608 C言語が定めてない帰納が必要だから良い答が欲しければ
あなたが想定している環境(Cの処理系と実行環境)を指定しなければ無理かと
672 :
デフォルトの名無しさん :03/07/12 23:14
>>668 デバッガ以前。このプログラムではなにをどうしようとするのかわからない。
脊髄反射で書いているだけでアドバイスとしては最低。
>> 665
**p を直すのでは本末転倒。insertnode は ptr のほかに他の引数が必要
ではないか?
>> 667
同意します。
というわけで、プログラムの意図を教えてください
>>662
>>672 説明不足ですみません。insertnodeで値を入力した2分木を作成し、そのあと前置、中置、後置
探索をするというものです。
>672 最低っていわれちゃいました。別に脊髄反射ではないんですけどね。 p->leftとかにNULLが入っているのかどうかデバッガで確かめてくれって 意味で書いたんですけど。意味なしレススマン。
下のソースなのですが1つ問題がありますいい案おしえてください 内容はデータに10文字以内のキャラを格納なのですが10文字以上入力されたときに このままだと問題が発生してしまいます charのバイトの確保どうすれば解決しますか? ただし char[288]にすると返答したら300文字打ち込む言われてしまいましたTT /*ソース(このままコピペしてもグローバル宣言ないので動きません)*/ main() { int i,j; char data[10]; j=1; while(j==1) { gets(data); if(strlen(data)<=9) { j=0; } if(strlen(data)>10) { printf("文字数オーバ打ち直しPLA\n"); } } }
strlen(data)>10 10じゃなく9じゃないですか?
しょーがねぇなぁ。「とりあえず」動くだけなら main を
int main(void)
{
struct node ptr;
ptr.left = NULL;
ptr.right = NULL;
insertdata(&ptr);
preorder(&ptr);
inorder(&ptr);
postorder(&ptr);
return 0;
}
ってしる!あと、
>>672 よ、同意してくれんのはいいんだが、
>>665 は合ってると思うが。
こんな課題なんですがぜんぜんわかりません。 どなたかぜひお願いします。 教えてください。 英語の文章データを読み込んで単語に分け、アルファベット順に整理してその出現頻度を表示するプログラムを作成せよ。作業を簡単にするため、英文のテキストは以下のようなスタイルになっているとする。 (1)全て小文字で書かれている。 (2)1つの単語は2行にまたがらない。(ハイフンで継続しない) (3)単語の区切りはスペース、コンマ、ピリオド、疑問符?、感嘆符!、括弧()などの特殊記号である。 (4)ハイフンとアポストロフィをもつスペル(READY-MADE, I’ve)は1つの単語とする。 (5)総語数は100語以内である。 (6)1語の長さは15字以内である。 【手順】 1.ファイルを読み込む 2.文章を単語を区切る 区切り記号を利用して単語に分ける。 区切り記号と文字を見分けるため、マーク用の文字型配列を用意し、アルファベット文字のある位置には#印、それ以外にはスペースを代入する。 3.一語ずつアルファベット順に仕分けて出現頻度もカウントする 新しい単語が入る位置を探し、辞書順の席が見つかれば、それまで並んでいたものを1つずつ後へずらしてから挿入し、同じものがすでにあればその語のカウント数を1増やす。単語が入るべき位置や同じ語が見つからなければ語種数を1増やし、最後尾に1語追加する。 4.結果を表示する 受け取ったデータを読みやすい形に出力する。縦にアルファベット順に並べ、3列程度に並べて表示するようにする。 (表示の例) a 5 be 2 from 1 and 8 but 1 has 2 at 2 course 1 in 6
>>676 あ! そこ書き間違えましたstrlen(data)>9
ですね^^;
さらに書き間違いで仕様で「10文字以内のキャラ・・・」でなくて「9文字以内・・・」が正しいです
まあその辺の細かい所は気にしないでw
それよりも本題のバイト確保の仕方が分からなくて困ってます
仕様が9文字格納するのだがそこを100文字打つとかぬかす奴はどうすればいい?TT
char dataの設定の仕方教えてくださいTT
というか、getsやめてfgetsにしろ。
(σ・∀・)σゲッツ!!
>>679 > 仕様が9文字格納するのだがそこを100文字打つとかぬかす奴はどうすればいい?TT
ポア
(σ・∀・)σゲッツ!!
mallocで領域確保するのはいいのだが 結局char data[10];ってしてる限りそこに20文字入れたれたら問題発生するのでは? char data[10000]ってしても10000以上入力する言われそうですTT
VC++のC言語で文字を拡大表示などはできないのでしょうか?
そこに入れなきゃいーじゃん
どうすれば出来ますか!? なんか質問ばかりですいません…。
>678 ほとんど同じようなことやったことある。 それはいいとして仕様は結構詳しく書いてあると思うんだけど、 どの部分がわからないのでしょうか?わからない所がわからなきゃ 先に進めないのでまずそこから教えてください。
>>686 最初に256文字で領域を取っておいてそこに入れていく。
もし足りなくなったらまた256文字領域を確保してそこに入れていく。
これをメモリが無くなるまで繰り返す。私ならこうやるけど…。
>>692 そのやり方(ソースの書き方)教えてください
そんな便利な方法やり方知りません^^;
(σ・∀・)σゲッツ!! じゃ無理
>>694 getsじゃダメなのか _| ̄|○
根本的にgetsが無理があるのですね ハァ・・・
696 :
デフォルトの名無しさん :03/07/13 00:47
>>608 , 690
イメージフォントだから拡大のレベルに応じてフォントのサイズの変更
するくらいしかできないです。
MSゴシックの12ビットからMSゴシックの18ビットになどですね。
画面アプリケーションを作る上で、これは厄介な問題です。
逆にこれができればわざわざサイズごとのフォントを用意する必要も
ないわけです。
というか、mallocとか使わずにC++逝って std::string使え、っと。
698 :
デフォルトの名無しさん :03/07/13 00:58
>>691 えっと、まず、あらかじめ作られているファイルを読み込むのがわからないです。
ファイルを作ってそれを読み込むっていうのはわかるのですが、あらかじめ作られているのだと、ちょっと。。。
次に、2の工程はどうすればいいのか全然わからないです。
700getとかやってんの。もー見てらんない。
>698 fopen関数って知ってますか?ファイル読み込みにはその関数を使います。 手順2なんですけどはっきり言って自分にはよく理解できませんw。 >区切り記号と文字を見分けるため、マーク用の文字型配列を用意し、 >アルファベット文字のある位置には#印、それ以外にはスペースを代入する。 こうした後にこれを何に役立てるのかわかりません。文字の切り分け自体は strtok関数とか使えばいいと思うんですけど、役に立たなくてすいません。 他の方でこの文章の意味を推測できる方いますか?
>>701 ↓みたいなことなんでない?
バッファ1 同サイズのバッファ2
h #
o #
g #
e #
<space> <space>
h #
o #
(略)
激しく無意味な予感…
>702 ということはバッファ2で、#が出てくる始めの配列番号と#が連続で出てきた回数をカウントして バッファ1の中身を単語に切り分けていくということでしょうか?自分の宿題じゃないのに 本気で悩んでしまいました。これって素直なやり方の1つなんでしょうか。
>686 どーんと100MBくらい確保して、 「じゃあ1億文字入力してみろや」 くらいいえよ。
705 :
よし@C++ :03/07/13 02:03
英語・国語・数学の点数を入力して、それらの点数のうち、どれか一つでも90点以上であれば“合格”、 または平均点が60点以上であれば“合格”と表示するプログラムを、関数構造を使って作成せよ。 という課題がでたんですが、正直全然わかりません。基礎論の授業の前期テストなんでホントは簡単なはずなんですが… 勉強がたりなかったようです(:_;) どなたか教えていただけませんか?
>>704 (・o・)ゞ了解!
100MB確保しますw
これで実践する気にならないね もし1億文字入力されたら報告しますw
>>705 #include <stdio.h>
char *nurupo(int uho, int iiotoko, int yaranaika)
{
int ave = (int)((uho+iiotoko+yaranaika) / 3);
return(uho >= 90 ? "合格" : iiotoko >= 90 ? "合格" : yaranaika >= 90 ? "合格" : ave >= 60 ? "合格" : "ば〜か");
}
int main(void)
{
int uho, iiotoko, yaranaika;
printf("英語 = "); scanf("%d", &uho);
printf("国語 = "); scanf("%d", &iiotoko);
printf("数学 = "); scanf("%d", &yaranaika);
printf("%s\n", nurupo(uho, iiotoko, yaranaika));
return(0);
}
>>705 #include <stdio.h>
int func(int a,int b,int c);
main(){
int a,b,c;
printf("英語・国語・数学の点数を入力して下さい\n");
scanf("%d%d%d",&a,&b,&c);
if(func(a,b,c)==1){
printf("合格");
}
}
func(int a,int b,int c){
int d;
d=(a+b+c)/3;
if(d>=60){
return 1;
}else if(a>=90 || b>=90 || c>=90){
return 1;
}
return 0;
}
でも、fgetsって長さが読み込んだ文字数+1になってない? 改行文字でも入るのかな。それでめんどくさいから、[BUFSIZ]にして gets使ってた。エラーチェックしてもダメなん?
C FAQ嫁
>>693 ゴメン、お酒飲んでたの♥
コンソールからの入力をバッファリングして、出力するプログラムは以下の通り。
STRSIZE より大きい入力(この例では4文字)が来ても大丈夫なことを確かめてみて。
あと、今、酔っているから、間違ってたらゴメンね♪
#include <stdio.h>
#include <stdlib.h>
#define STRSIZE 4
typedef struct _Data{
char string[STRSIZE + 1];
struct _Data *next;
} Data;
main(){
int i;
Data *start=NULL, *now, *temp;
while( 1 ){
if( ( temp = (Data *)malloc( sizeof( Data ) ) ) == NULL ){
printf( "memory run out!\n" );
break;
}
temp->next = NULL;
fgets( temp->string, STRSIZE, stdin );
if( start == NULL )
start = temp;
else
now->next = temp;
now = temp;
9の9乗の9乗の計算をお願いします 9 9 9 9^(9^9)
for( i = 0; i < STRSIZE; i++ ){ if( temp->string[i] == '\n' ){ for( now = start; now != NULL; now = now->next ) printf( "%s", now->string ); break; } } if( temp->string[i] == '\n' ) break; } for( now = start; now != NULL; now = temp ){ temp = now->next; free( now ); } return 0; }
あっ、挟まれた(笑)。 711→713と続いてるから。
>>712 math ヘッダをインクルードして、pow( 9, pow( 9, 9 ) ) でいいと思う。
>>712 ゴメン、pow は double を取るから、キャストし直しといて♪
9^9^9は時間がかかるので9^9^3をやってみた 43932850369646432982977478265707271205801030817712671062167669775046634474476402 97733014126124825637294350648543542990955703795034525158532385201827409673987465 03532324400000659505126023955913142968176998364877699089666171297275956245407453 03319016864489485057634649269145869517428178955799492360778346148642644861766707 63939011044773249826312976410342770938186928234886034262794736743689436092688717 93467206677285688478458498235002859256706389043030847945506577080623430066283504 39758378904424542958598296457177460586846616037956743272570412126094093934321790 59758473650963158721532409698823634353634497752543930103682673439704262308013902 50903399147001650831878665172798468587509747439118815689
>>712 #include <math.h>
#include <stdio.h>
int main()
{
double x,f;
x = pow(9,9)*log(9)/log(10); /* 9^(9^9) = 10^((9^9)*ln(9)/ln(10)) */
f = fmod(x,1);
printf("9^(9^9) = about ");
printf("%fe+%.0f\n", pow(10,f), x-f); /* 10^x = (10^f)*(10^(x-f)) */
return 0;
}
質問させてもらいます。 整列アルゴリズムの二分挿入法を、 配列を使わずにポインタのリストで実現するという課題なんですが、 比較する要素をリストから探し出す度に先頭要素から見ていかなきゃならんので、 実行時間がめちゃくちゃ長くなってしまうんです。 (整列するデータは全て数字、数は10万個) このうざったい要素探索処理を高速化したいんですが 何か良策はないでしょうか?
721 :
C勉強中・・・ :03/07/13 04:04
>>721 それ私が書いたプログラム…。しかも、あなた宛に…。
724 :
C勉強中・・・ :03/07/13 04:12
>>721 コンパイルもできるのですが、
最後の表示で、SubjectとTeacherが表示できないのです・・・
改良というか拡張です
Cはまだ勉強不足で原因がいくら考えても出てこなく、デキル人に見てもらおうかと
なんとかなりますかね?よろしくお願いします。
725 :
C勉強中・・・ :03/07/13 04:14
>>723 あなたでしたか!とてもお世話になりました!
本当に感謝しています。
これ原因はどこでしょうか?
727 :
C勉強中・・・ :03/07/13 04:22
あっ!申し訳ありませんm__m なれないもので・・・ そうです、書いていただいたプログラムはちゃんと動き、感激しました。 本当に失礼しました
728 :
C勉強中・・・ :03/07/13 04:32
>>728 そのソースをコピペしてコンパイルしたけど、あなたの言っているのと違う結果になった。
No と Point しか表示されない。私のコピペミス? それとも、
>>724 で言っているのは間違い?
730 :
C勉強中・・・ :03/07/13 04:48
あれ?こちらでやるとNameは出るのですが。。。 おかしいな・・・ もう一回今やってみます
731 :
C勉強中・・・ :03/07/13 04:51
Nameでました。 前略こんな感じです↓ S028 Maeda 73 S029 Ogawa 85 S030 Okada 92
732 :
C勉強中・・・ :03/07/13 04:53
書き込むとNameとPointの感覚は1スペに見えますが、実際の画面では3スペースあります
>>731 やっぱりこっちは Name が出ない。とすると、こりゃかなり厄介だな(苦笑)。
734 :
C勉強中・・・ :03/07/13 05:02
うーん、なんででしょうかね・・・ 困った・・・ コンパイルの環境はなんですか? こちらは学校のUNIXサーバなんです でもこれはこっちで勝手にを加えた部分が悪いでしょうから、見ていただいて、おかしいと思うところがあれば・・・ 結構SubjectのIDがC001から順に並んでいなく、C010とか飛んでいる部分がネックになるのでしょうか
>>719 二分挿入法(二分探索木の挿入)を使うのなら、
データ構造もリストではなくツリー(二分木)であるべきではないのか
リストを使うなら、リストの末尾の要素を取得した時点で先頭から
逐次探索していた方が早いのでは(循環リストなら話は別)
課題が「ポインタのリストを使って」ということならばデータ構造の変更はできないが
>>734 ゴメン、ファイル名間違って保存してた(笑)。これで Name はひょうじされたぞ!(笑)
で、当初の問題が残ったわけだが(笑)。
ちなみにこっちの環境は XP home に bcc32。
737 :
C勉強中・・・ :03/07/13 05:09
>>736 そうですか、少し安心しました。
環境の違いで結果が変わっては聞けるもののきけなくなってしまいますからね(汗)
その環境ならおそらく全然結果に変わりはなさそうですね。
>>737 ちょっと分かった。
関数 read_c で Subject と Teacher を読み込む前のフラグが立ってない。
739 :
C勉強中・・・ :03/07/13 05:20
>>738 そのフラグというものの概念が実はわからないのでそのあたりは自分でいじれなかったんです・・・
そのほかの部分で納得するのに、昨日の昼からはまってて
もう体が言うことを聞かない状態です><
そのフラグだけで解決できるものですか?
ちょっとキタ! @関数 read_c の sscanf を以下のように変更。 sscanf(linebuf,"%s %s %s %s",buf[0],buf[1],buf[2],buf[3]); Aその6行下(else if の最後の項)を else if(strcmp(buf[j],"Credit")==0)i[3]=j+1; と変更。 これで実行するとちゃんと表示される! が、異常終了する(笑)。
741 :
C勉強中・・・ :03/07/13 05:37
>>今こっちでもやってみます
742 :
C勉強中・・・ :03/07/13 05:39
あれれ?今度はこっちでNameが表示されない(笑) 確認します
何か面倒な事になってるようで… で、正しく修正したけどいる?
744 :
C勉強中・・・ :03/07/13 05:45
やはりNameがでないで2スペースになってる・・・そっちはNameもしっかりでてますよね?
745 :
C勉強中・・・ :03/07/13 05:46
>>743 是非ほしいです!こんな短時間で驚きました。。。本当に感謝です!
>>744 Name もでてる。調査によると、read_c の strcpy のあたりで異常が…。
>>743 お、作者登場! やっぱり作者が一番詳しいからね(笑)。
ちなみ、あのフラグは No Name Address Age となってる並びを Name Age No Address とかって入れ替えても(勿論それに続くデータも)動くようにしてあるだけで 何と言うか趣味で付け足しただけだから 分からないなら、削ってしまった方が良いかもよ
…見切ったッッ!!! define されている BSIZE が小さい(笑)。大きくしたらちゃんと出たぞやっほうッ!
749 :
C勉強中・・・ :03/07/13 05:53
こんな時間まで皆さんお疲れ様です。昨日の昼からはまってたものがようやく解決できそうです。みなさんには本当に感謝しています!
750 :
C勉強中・・・ :03/07/13 05:53
BSIZE?そこが原因だったとは・・・ さすがです
>>747 私のプログラムでも、趣味で可変引数関数なんか作ってやがります(笑)。
↓はマジで書いてんすか? ・fgets(linebuf,sizeof(buf),fp);
見逃してた… read_c()の中のwhileを↓に訂正して while(flag&&!feof(fp)) { fgets(linebuf,sizeof(buf),fp); sscanf(linebuf,"%s %s %s %s",buf[0],buf[1],buf[2],buf[3]); /* この行 */ j=atoi(buf[i[0]-1]+1)-1; strcpy(Data_b[j].Subject,buf[i[1]-1]); strcpy(Data_b[j].Teacher,buf[i[2]-1]); Data_b[j].Credit=atoi(buf[i[3]-1]); }
755 :
C勉強中・・・ :03/07/13 06:04
結果が 前略 S0029 KaouzouRikigaku Fujii 85 S030 KousakuKikai Nishimura 92 て感じでNameが出ないのは自分だけですか? 本来 S029 Ogawa KouzouRikigaku Fujii 85 となるのですが・・・?
>>755 私はちゃんと出るけど…。うっかりキーを触っちゃって、ソースが変更されたのかな?
>>753 変数名を変えた時に直すの忘れてたね…(read_a〜cまでコピペで作ったし…)
つー訳で、全ての
fgets(linebuf,sizeof(buf),fp);
を
fgets(linebuf,sizeof(linebuf),fp);
に直して下さい
758 :
C勉強中・・・ :03/07/13 06:10
でました!大丈夫です。データファイルのほうがおかしくなっていただけでした! お騒がせしました。
>>758 よかったね♪ そうそう、今までのレスを読み返して。細かい修正がいくつかあるみたいだから。
じゃあ、私「目がテン」見るから。じゃ〜ね♪
761 :
C勉強中・・・ :03/07/13 06:16
ありがとうございました!本当に(涙)とても勉強になりました。これほどまじめに取り組んだのは初めてくさいです。
>>758 つーかそういうデータはバイナリファイルの決められたサイズで保存してそれを
読み込めば簡単なのでは。
763 :
C勉強中・・・ :03/07/13 06:22
>>762 それも考えようとしたのですが、今回のやっていただいた可変長のスペース区切りのほうが頭に入ってきやすかったもので・・・
友人でそちらの方法でやっているひともいるようです。
>>761 余力があるなら、良く考えて、必要無い機能を削って
read_a〜c の関数の同じ処理の部分を、1つの関数にまとめた方が良いよ
765 :
C勉強中・・・ :03/07/13 06:27
>>764 なるほどそうしたほうが見栄えよくなりますね。アドバイスありがとうございます。昨日から寝てないもので、休んでから挑戦してみます。提出は月曜ですからまだ時間がありますので^^
>>701-
>>703 アドバイスありがとうございます。
ファイルの読み込みはなんとなくわかったのですが、2の工程は全然なんですけど。。。
>バッファ2で、#が出てくる始めの配列番号と#が連続で出てきた回数をカウントして
>バッファ1の中身を単語に切り分けていく
???ってかんじです。
すんません。
>>704 ,
>>706 prog.exe < でかいファイル.dat
とやられて終わるだけ。
>>709 駄目。
君は、C とかの危ない言語は使わないほうが身のため。
VB とかにしときなさい。
>>699 windows2000 SP3
メモリ128MB
VC++6.0
です。
771 :
デフォルトの名無しさん :03/07/13 09:32
3Dマリオみたいなものを創りたいです。 とりあえず、プロトとして敵なし、マップをとことこ歩くのみの バージョンを創りたいです。
一応、言語はC/C++を想定してます。 C++は参考書で知ってます。 でもマリオは一部のアセンブリ言語を除いて C言語で書かれていると、昔、雑誌のインタビューで開発者が 言ってました。
独り言をここに書くのは止めて
775 :
デフォルトの名無しさん :03/07/13 10:15
10秒カウントダウンしてそれを毎回同じところに 表示するプログラムを作れと言われました。 はっきり言ってよく分かりません。 どなたかお願いします。
776 :
デフォルトの名無しさん :03/07/13 10:25
DOSで字を消すときは &bだった気がする。 エスケープ記号のバックスペース。 あとは、time(),clock()のどっちかで、 時間とりながら、一秒ごとに打ち出す。かな。
遅レス(?)ですが、 >720 >CPUを変更 そいつは無理です。 >735 >二分木を使う そうしたいのもやまやまなんですが、 課題にしっかり「リスト版の作成」と書いてあるのでお手上げです。 もう、あきらめます。 こんなバカな課題に付き合ってられません。
>>775 #include <stdio.h>
#include <time.h>
int main(){
time_t t1,t2;
int cnt=10;
system("cls"); printf("%d",cnt);
time(&t1);
for(;;){
time(&t2);
if(difftime(t2,t1) > 1.0){
system("cls"); printf("%d",--cnt);
if(cnt<=0) return 0;
t1 = t2;
}
}
return 0;
}
>>777 賢い人なら、あきらめずに二分木版をつくって、
その優位性をレポートにまとめて提出する。
Windowsじゃないと無理かな。 UNIXじゃ試してません。 UNIXなら"cls"を"clear"に変える。
っていうか、 タ イ マ ー は 環 境 依 存 コ ン ソ ー ル 関 係 も 環 境 依 存 以上。
>>777 二分木だってリストの一種だぞ。
線形リストとは書いてないんだろ?
>>782 clock使えば10秒カウントはできないわけではない。
>>180 の技を再び
#include <stdio.h>
#include <time.h>
#define DOS_TATE_SIZE 25
#define WAIT 10
#define Y 10
#define X 10
int main(void)
{
int i,t,count;
for(count=WAIT;count>=0;count--)//時間まで
{
for(i=0;i<DOS_TATE_SIZE;i++)puts("");//画面クリア
for(i=0;i<X;i++)printf(" ");//xの位置の移動
printf("%02d:%02d",count/60,count%60);//時間の表示
for(i=0;i<DOS_TATE_SIZE-Y;i++)puts("");//yの位置の移動
for(t=clock()/CLOCKS_PER_SEC;clock()/CLOCKS_PER_SEC-t==0;){}//1秒待つ
}
return 0;
}
celeron 1.7GHz のwin2k でもスクロールがかろうじて見える。 でもそれはそれでなんかカコイイ
> puts(""); putchar('\n');でいいだろ
どっちでもいいだろ。
つーか、CPUを100%食うタイマー(略
>>711 どうもありがとうです あの後わからなくてフテ寝決め込んで 起きてみたら すばらしいソースが早速つかわせてもらいます
>681 名前: 675 投稿日:03/07/13 00:11
>
>>680 >仕様がgetsなんですよTT
じゃなかったのか?
>>789 WinMainの中で無限ループするご時世ですが、なにか?
>>779 賢い人になるためにしこしこがんばります。
>>783 課題には線形リストの例が載ってたので、
どうやら線形リストを使うことを推奨しているようです。
とりあえず、みなさんのご忠告通りに二分木版を作ろうと思います。
質問に答えてくれてありがとうございます。
795 :
デフォルトの名無しさん :03/07/13 13:06
timeやclockを使ったプログラムの例で1番簡単なのを 教えてください。 使い方を知りたいです。
#include <time.h> time(NULL); clock();
797 :
デフォルトの名無しさん :03/07/13 13:29
どういう風に動くんですか?
>>792 >WinMainとか〜
環境依存。ヴォケが。
799 :
デフォルトの名無しさん :03/07/13 13:35
>>698 やはり手順2の意味が良くわからないですけど、たぶん1度ファイルから読み込んだ
データをバッファ1内で直接扱うのではなく、別バッファ2で'#'と' 'で置き換えて
わかりやすく区別します(
>>702 参照)。そして連続で#が出てくる最初の配列要素番号とその長さを
取得し、その情報をバッファ1に適用することで実際の単語を取り出すのだと思います。
これはバッファ2内で単純化してから考えるということだと思います。あとバッファ1内の
内容を直接いじって下手にデータ破壊をしないようにしているのだと思います。
自分が処理の中に手順2を含むのであればそう考えますがどうでしょうか?
説明が下手ですいません。他の方ならどう考えるのでしょうか?
801 :
デフォルトの名無しさん :03/07/13 13:40
C言語で、5回勝負の先に3勝したほうの勝ちとなるジャンケンゲームを作り、 色々な戦略(たとえば1順番に出す:2:ランダムに出す など)を一つの関数として定義して,戦略の優劣を評価するプログラムを 教えてください。
>>800 それ以外考えられないと思う。
ただこの場合#は1個でも単語として成立するんだろ?
手順2が無いほうが絶対楽だけど課題じゃしょうがないわな。
>>778 一秒ごとに
cls: not found
が表示されますた
winでgcc
時間のやつがよく出てて、それが本当に宿題か分かんないけど、
>>785 じゃ遺憾の?非環境依存だから、どのマシンでもそれなりに動くし。
ウインドウズなら、猫でも分かるの
http://www.kumei.ne.jp/c_lang/intro/no_59.htm とかを調べてみるといいよ。ただ、windows.hは永井意味の分からん英語が
おっぱおあるから、初心者だと難しいかも。
98、Meなら、エスケープシーケンスと言うのがある。グーグルで見ると
山ほど乗ってるよ。printfにそのまま記述できるから猫のより簡単だけど、
2000、NT(ANSI.SYSが無い)では動かないらしい。
805 :
デフォルトの名無しさん :03/07/13 15:31
2つの整数を入力し、a/bの値を四捨五入して小数第2位まで表示するプログラム。 ただし%.2fはつかわずに自力で計算すること。 わからないのでよろしくお願いします。
>>805 #include <stdio.h>
#include <stdlib.h>
int main(){
int a,b;
div_t ans;
printf("*** a/b を計算します(小数第一位を四捨五入) ***\na = ");
scanf("%d",&a);
printf("a = ");
scanf("%d",&b);
ans = div(a,b);
printf("a/b = %d", (ans.quot>ans.rem*2)?ans.quot:ans.quot+1);
return 0;
}
ごめん間違えた、小数第2位か。
808 :
デフォルトの名無しさん :03/07/13 15:59
WinMainかよ(;´Д`)
コメントをつけろという宿題は現在受け付けておりません。
813 :
デフォルトの名無しさん :03/07/13 16:08
マジっすか? すみませんでした。 気が向いたらぜひお願いします。 最後の希望age
814 :
デフォルトの名無しさん :03/07/13 16:15
>>807 取り組みありがとうございます。
小数2位のほうでもわかるでしょうか?
>>805 直した。
#include <stdio.h>
#include <stdlib.h>
int main(){
int a,b;
div_t tmp1,tmp2,tmp3;
printf("*** a/b を計算します(小数第3位を四捨五入) ***\na = ");
scanf("%d",&a); printf("b = "); scanf("%d",&b);
tmp1 = div(a,b);
tmp2 = div(tmp1.rem * 100, b);
tmp3 = div(tmp2.rem * 10, b);
if(tmp3.rem >=5) ++tmp2.quot;
if(tmp2.quot >= 100){++tmp1.quot;tmp2.quot%=100;}
printf("a/b = %d.%d",tmp1.quot,tmp2.quot);
return 0;
}
816 :
デフォルトの名無しさん :03/07/13 16:22
817 :
デフォルトの名無しさん :03/07/13 16:22
ごめん、ちょっとバグってる。
11行目が間違ってた。正しくは。 if(tmp3.quot >=5) ++tmp2.quot;
#include<stdio.h> void main() { int a,b; printf("*** a/b を計算します(小数第3位を四捨五入) ***\na = "); scanf("%d",&a); printf("b = "); scanf("%d",&b); printf("a/b = %d.%d",(1000*a/b+5)/1000, (1000*a/b+5)/10%100 ); }
>>805 まだだめだった、たびたびすまんす。
#include <stdio.h>
#include <stdlib.h>
int main(){
int a,b;
div_t tmp1,tmp2,tmp3;
printf("*** a/b を計算します(小数第3位を四捨五入) ***\na = ");
scanf("%d",&a); printf("b = "); scanf("%d",&b);
tmp1 = div(a,b);
tmp2 = div(tmp1.rem * 100, b);
tmp3 = div(tmp2.rem * 10, b);
if(tmp3.quot >=5) ++tmp2.quot;
if(tmp2.quot >= 100){++tmp1.quot;tmp2.quot%=100;}
printf("a/b = %d.%02d",tmp1.quot,tmp2.quot);
return 0;
}
これでいいはず。すれ汚し須磨祖。
まだ改良できるな。でもやめときます・・・。
823 :
デフォルトの名無しさん :03/07/13 17:16
>>822 ご丁寧にありがとうございます。 改良できるとこはしてくださるとありがたいですよ(笑)
んー。 int をunsigned longにしたり、 tmp2 = div(tmp1.rem * 100, b); ここが100倍しているけど10倍ですむようにすれば、もう少し扱える数値範囲が増える。 まぁ究極は入力を文字列として受け取って、多倍長処理を実装するわけだが。 やる?
ZOO ZOO C
あ、しまった。入力は正の数じゃなくて整数か。 じゃ、まだだめだ。 #include <stdio.h> #include <stdlib.h> int main(){ int a,b,sig=1; div_t tmp1,tmp2,tmp3; printf("*** a/b を計算します(小数第3位を四捨五入) ***\na = "); scanf("%d",&a); printf("b = "); scanf("%d",&b); if(b==0){printf("bには0以外の整数を入力してください。\n");return 0;}; if(a<0){a*=-1;sig*=-1;} if(b<0){b*=-1;sig*=-1;} tmp1 = div(a,b); tmp2 = div(tmp1.rem * 100, b); tmp3 = div(tmp2.rem * 10, b); if(tmp3.quot >=5) ++tmp2.quot; if(tmp2.quot >= 100){++tmp1.quot;tmp2.quot%=100;} printf("a/b = %d.%02d",tmp1.quot*sig,tmp2.quot); return 0; } ついでにb==0のエラー処理もつけた。
>>826 ありがとうございます。
すごくきれいです。
印刷してとっておきます
829 :
よし@C++ :03/07/13 18:13
>>705 です。遅くなりましたが、教えてくれた方々、どうもありがとうございます!
>>826 そんなにコメント書くなんてお疲れ。
でも、実際、俺はうざいな〜。
>>826 スゲー、入門書も真っ青だ
参考になります
832 :
デフォルトの名無しさん :03/07/13 19:23
#include <windows.h> int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, int nCmdShow){ int rect; for(rect=0;rect<=10;rect++){ MessageBox(NULL,TEXT("Hello,world"), TEXT("はろー"),MB_OK);} return 0; }
833 :
デフォルトの名無しさん :03/07/13 20:48
2つの整数をユーザーレベルで受け取り、ユークリッドの互除法によって最大公約数を求めるプログラムを作成せよ。 **要求仕様** 1.最終的な結果として”xとyの最大公約数はzである。”という趣旨の結果表示を行うこと。 2.最大公約数が求められないような値が入力された場合には、(ユーザ入力により負の値が入力されたような想定) 警告を発し、再入力を促すようにせよ。 この問題の2番目がよくわかりません。よろしくお願いします。
>>833 じゃあ、2のところだけ。
main(){
int x,y;
while(1){
printf("input x y >>");
scanf("%d %d",&x,&y);
if(x<0){printf("xの値が不正です。");continue;}
if(y<0){printf("yの値が不正です。");continue;}
break;
}
}
テスト
dsfs fds fs
現在のポインタn がNULL でないならば、score の値と入力された得点を比較して、 もし入力された得点が大きいならばポインタを挿入し(関数insert() で行う)、そうでなければ 再帰的に先に進むように、関数ordered_append() を完成させる。 #include <iostream.h> struct node { int num; int score; struct node *next; }; typedef struct node Node; Node *ordered_append(Node *, int, int); Node *insert(Node *, int, int); void show(Node *); void deletelist(Node *); void main() { Node *root = NULL; int num, score; cout << "番号: "; cin >> num;
cout << "得点: "; cin >> score; while(num >= 0) { root = ordered_append(root, num, score); cout << "番号: "; cin >> num; cout << "得点: "; cin >> score; } cout << "番号\t 得点\t 成績\n"; show(root); deletelist(root); } Node *ordered_append(Node *n, int num, int score){ (不明部分) } Node *insert(Node *n, int num, int score){ (不明部分) } (略)
フルカラーBMPカラーバー画像を生成・保存するプログラムを作成せよ。 ていう宿題が出されました。いろいろ調べたんですが、よくわかりません。 よろしくお願いします。
5つの英単語をユーザレベル入力させてそれぞれの単語が何文字で構成されているか、 さらに合計で何文字あったのかを数え上げて表示するプログラムを作成せよ。 **要求仕様** 例)”cat”は3文字 ”dog”は3文字 ”monkey”は6文字 ”rabbit”は6文字 ”panda”は5文字 合計で23文字 と表示されるようにせよ。 という問題なんですがよくわかりません。すいませんがお願いします。
>>800 >>802 ありがとうございます。
でも、ソースがわからんです。簡単に教えていただけませんか?
別に#に置き換えてのじゃなくて普通に読み込むだけのでもかまわないので教えていただけませんか?
>>841 #include <stdio.h>
#include <string.h>
int main()
{
char a[4096];
int s=0,d=5,f;
while(d--){
fgets(a,sizeof a,stdin);
f=strlen(s)-1;
printf("\"%s\"は%d文字\n",a,f);
s+=f;
}
printf("\n合計で%d文字\n",s);
return 0;
}
>>843 文字数は半角ではなく全角でお願いしまふ
845 :
デフォルトの名無しさん :03/07/13 23:51
846 :
デフォルトの名無しさん :03/07/14 00:04
#include <stdio.h> #include <string.h> void g(const char *); int main() { char a[4096],k[100]; int s=0,d=5,f; while(d--){ fgets(a,sizeof a,stdin); f=strlen(a)-1; a[f]='\0'; sprintf(k,"%d",f); printf("\"%s\"は",a); g(k); printf("文字\n"); s+=f; } sprintf(k,"%d",s); printf("\n合計で"); g(k); printf("文字\n"); return 0; }
847 :
デフォルトの名無しさん :03/07/14 00:04
void g(const char *h) { char *j[]={"0","1","2","3","4","5","6","7","8","9"}; for(;*h;h++) printf("%s",j[*h-'0']); }
848 :
846,847 :03/07/14 00:05
printf("%s",j[*h-'0']); は printf("%s",j[(*h-'0')%10]); に
全角で表示するっていうのも勉強なんだろうか。
>>698 話の流れが掴めないんだけど、結局、何が分からないの?
>>705 です。
>>708 さん改めてありがとうございました。
でも、funcっていうの(関数?)を習ったことがないんですが、他の関数構造使ったらどうなるんでしょうか?
voidやreturnは習いました。
func() は自分で作った関数。
そうなんですか。 これまでに習得したコマンドを使用することって書いてあるんですが、自分で作ったその関数ならば通用すると思いますか?
>>852 あなたは今とても馬鹿なことを言っています。
はっきり言ってみんな呆れています。
知らないにもほどがあります。
もう少し勉強してからきてください。
日本語が通じていません。
どうもすいません。勉強不足は反省しております。
>>854 関数の作り方と、if文とreturn習ったならおk
最後のreturn 0はmainの最後につけたほうがよさげだなぁ
わかりました!どうもありがとうございます。 迷惑をかけた皆さん、ホントごめんなさい。
861 :
デフォルトの名無しさん :03/07/14 10:26
#include <stdio.h> #include <stdlib.h> #include <time.h> #define NUM 1000 #define MAX 20 int main(void) { int data[MAX] = {0}; int sum = 0; int i; srand((unsigned int)time(NULL)); for(i = 0 ; i < NUM ; i++) { data[rand() % MAX]++; } for(i = 0 ; i < MAX ; i++) { printf("%2d : %5d\n", i + 1, data[i]); sum += data[i]; } return 0; }
863 :
デフォルトの名無しさん :03/07/14 11:37
浮動小数点変数が与えられた時、小数以下n桁に四捨 五入した 文字列を返すような仕組みの関数ってわかりませんか? 完敗です(・・;)
>>863 四捨五入だったかどうか忘れたけど、sprintfの%fで精度を与えればできたかも。
866 :
デフォルトの名無しさん :03/07/14 11:57
浮動小数点変数を a に、桁数を n に入力して、 char* round(double a, int n) この関数に、小数以下n桁に四捨五入した文字列を返すような仕組みを 作らなければいけないのですが、どうもその仕組みがうまくつかめない もので。。
>>866 /* 戻す領域は再利用されるので呼び出し側での取り扱い注意 */
char *round(double a, int n)
{
static char sBuf[100];
sprintf(buf, "%.*f", n, a);
return sBuf;
}
>>867 あああ、sprintf()だけ書いたときの名残が・・・
sprintf(sBuf, ...)
ってことで。
>>867 rount(1.005, 2)やってみ
間違えた round(1.005, 2)
標準関数printfは表示桁数を変数で指定できないため、 それを可能にする関数char*printint(int n,x)を作りなさい。 ここで、変数nは表示桁数、変数xは出力したい数値を表すものとする。 なお、表示桁数に満たない数の頭の部分は空白で埋めるものとする。 また、得られた処理結果はprintf("%s\n",printint(n,x));で確認できる。 という問題なのですが、ご迷惑でなければ、どうにか お力添えをお願い致します。
>>871 表示桁数を超える数の時はどうする?
ていうか、これじゃダメなのか?
printf("%*d\n", n, x);
>>871 > 標準関数printfは表示桁数を変数で指定できないため、
できます。
char *printint(int n,int x) { static char buf[1024]; sprintf(buf,"%*d",n,x); return buf; }
>>869 本質的でない問題の解決案。
#include <stdio.h>
#include <float.h>
/* 戻す領域は再利用されるので呼び出し側での取り扱い注意 */
char *round(double a, int n)
{
static char sBuf[100];
sprintf(buf, "%.*f", n, (1 + DBL_EPSILON) * a);
return sBuf;
}
877 :
デフォルトの名無しさん :03/07/14 15:04
浮動小数点aが与えられた時、少数以下n桁に四捨五入した文字列を返す関数を定義しなさい。 char* round(double a, int n) お願いします。
878 :
デフォルトの名無しさん :03/07/14 15:18
浮動小数点aが与えられらたとき、少数以下n桁に四捨五入した文字列を返す関数を定義しなさい。 char* round(double a, int n) お願いします。
880 :
デフォルトの名無しさん :03/07/14 15:48
1整数型add 整数型mul それぞれの構造体を定義する 文字型typ 20~99までの整数について X[n]addにはn+n X[n]mulにはn*n X[n]typには 奇数なら”O”偶数なら”E” 3nが5から15の場合の値を表示する 初歩的だとは思うんですけどまったくわかりません。おしえてください。おねがいします
881 :
デフォルトの名無しさん :03/07/14 15:50
1整数型add 整数型mul それぞれの構造体を定義する 文字型typ 2 99までの整数について X[n]addにはn+n X[n]mulにはn*n X[n]typには 奇数なら”O”偶数なら”E” 3 Nが5から15の場合の値を表示する 初歩的だとは思うんですけどまったくわかりません。おしえてください。おねがいします
>初歩的だとは思うんですけどまったくわかりません 俺こういう言い方嫌い 何をもって初歩的だと思ったわけ?わからないくせに
883 :
デフォルトの名無しさん :03/07/14 16:26
>>881 int main(void)
{
static const struct {
int add;
int mul;
char typ;
} X[] = {
{0, 0, 'E'},
{2, 1, 'O'},
{4, 4, 'E'},
{6, 9, 'O'},
...
{198, 9801, 'O'},
};
int ic;
for (ic = 5; ic <= 15; ic++) {
printf("値\n");
return 0;
}
885 :
デフォルトの名無しさん :03/07/14 16:57
>>881 すみませんでした
>>884 ありがと−ございます
0から99の数字ってすべて入力するのですか?
うごかなかったので…
886 :
デフォルトの名無しさん :03/07/14 17:08
以下に0から99の数字をバイナリ→BCD、バイナリ→文字コードに変換する プログラムがある。そのうち二つの関数(bcdhen(), aschen())を作成しなさい。 誰か、 おねがいします。。 #include <stdio.h> typedef unsigned char BYTE; typedef unsigned short WORD; typedef unsigned long LONG; typedef char SBYTE; typedef short SWORD; typedef long SLONG; BYTE datatbl[100],/* 初期データ(バイナリ) */ bcdtbl[100],/* BCD データ */ asctbl[100];/* ASCII データ */ void bcdhen(void); void aschen(void); void main(void) { WORDcnt; /* バイナリデータ作成 */ for(cnt = 0; cnt < 100; cnt++) datatbl[cnt] = cnt; bcdhen(); aschen(); } /* バイナリ → BCD 変換 */ void bcdhen(void){} /* バイナリ → 文字コード変換 */ void aschen(void){}
void bcdhen(void) …ひどい問題だな
グローバル変数濫用という悪い癖をつけそうだなw
10で割ってシフト。
誰かお願いします。
>890 sprintf
sprintfって四捨五入してくれるの?
sprintfで小数n+1までの文字列をつくる。 で四捨五入。
0.00005とか足してn桁表示の方が楽かな。
ナルホド
できればプログラムを書いてほしいのですが‥。 お願いします!
char buf[7834], buf2[36798]; int i; double x; for (x = 5; i < n; i++, x /= 10); sprintf(buf, "%%.%df", n); sprintf(buf2, buf, a+x);
誰か作ってください。 例えば変数の値が10〜20の場合その変数を表示したときにその数字が黄色色に1〜9の場合赤色になるプログラムを誰か作ってください。 御願いします。
コンパイラーはフリーのbcc32です。
みなさんありがとうございます!! こんなにたくさんの人が協力してくれるなんて感動です。。。
if(i>=10&&i<=20) printf("<font color=\"yellow\">%d</font>\n",i); else if(i>=1&&i<=9) printf("<font color=\"red\">%d</font>\n",i);
誰かまじめに答えてください。
>>900 コンソール関連は環境依存だ。ヴォケが。
>>904 >>903 は一つの有意義な回答なのだが。
君が提示せずに、誰が君の利用したい環境を推測し得ようか。
Windows Meです。
三つの複素数α、β、γの実数部、虚数部の値(実数)をそれぞれ入力して、 (α+γ)(β+γ)を求めて表示せよ。 ただし、複素数を、実数部と虚数部に対応するメンバで構成される構造体 として表し、複素数の加算用関数c_add()と乗算用関数c_mul()を作成し、 これを利用すること。 これらの関数は、sとtを複素数を表す構造体としたとき、c_add(s,t)、 c_mul(s,t)と呼び出すと、それぞれ戻り値として、sとtを加算、または乗算 した結果である複素数の構造体を返すものとする。
>>908 どういう出力イメージを持っているんだ?
911 :
デフォルトの名無しさん :03/07/14 22:47
読み込んだテキストファイルの中から引数で指定した任意の文字列を検索して その数を表示するプログラムなのですが、ここまではつくったんですが、検索の部分がどうしても おかしいのです。なんとかなりませんでしょうか? #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { FILE *fp; char ch; int i=0, j=0, k=0; if(argc!=3){ printf("使用法:<プログラム名> <ファイル名> <文字>\n"); exit(1); } if((fp = fopen(argv[1], "r"))==NULL){ printf("ファイルを開くことができません\n"); exit(1); }
/* データ検索のルーチン */ while((ch = fgetc(fp)) != EOF){ if(ch==*argv[2]){ if(j==0) j++; } if(j>=1){ if(ch==*(argv[2]+j)) j++; } if(*(argv[2]+j)=='\0'){ j=0; i++; } /* データ検索のルーチン終了 */
} if(i>1){ printf("%d個の ", i); while(k<=j){ printf("%c", *(argv[2]+k)); k++; } printf("が見つかりました。\n"); } else printf("Not found\n"); fclose(fp); return 0; }
>>911 ファイルの中身を単一のバッファに全て読み込んでstrstr
fseek,ftell,malloc,fread,strstr これらの関数を駆使して。
qsortつかえ
>>915 あ〜、さっぱり分からないですその辺の関数
そんな難しいんでしょうか?
一文字ずつ検索して文字列にするといった感じなんです
一文字目が一致したら二文字目みたいにしていくプログラムをfgetcで作ることになってるんですが… 完全に正常には動かなくて…今のままだとたまにおかしくなるんです
>>920 じゃあ事前に全て読み込むということはしてはいけないの?
fgetcで一文字ずつとのことなんです… 全部一気に読み込んで検索ならもう少し楽なのかもしれませんが
>>911 こんな感じでいいかな?
きれいじゃないし、エラー処理してないからその辺は適当に・・・。
あと、コンパイルしてないからエラーがあるかも。
/* int find
FILE* fp;ファイルポインタ
char* lpsz;検索文字列
戻り値:ファイル中に含まれる検索文字列の数
*/
int find(FILE* fp,char* lpsz)
{
int i = 0,
len = 0, //検索文字列の長さ
count = 0; //カウント
char c = 0;
len = strlen(lpsz);//文字列の長さ取得
do{
for(i=0;i<len;i++){ //このforループ内で検索する
c = fgetc(fp);
if(c == EOF) break; //終端なら脱出
if(c != lpsz[i]) break; //一致しないと検索ループを抜ける
}
if(i == len) count++; //もし、上のループをbreakせずに抜ければ検索文字列と一致
}while(c != EOF);
return count;
}
>>923 検索する文字列 "ab"
テキストファイル "aab"
だとカウントされないのでは。
>>924 俺が上で作ってるプログラムもそうなんです…abでaabだと文字列にならないので困ってます。
>>911 /* データ検索のルーチン */
while ((ch = fgetc(fp)) != EOF) {
if (ch == argv[2][j] || ch == argv[2][j = 0]) {
++j;
if (argv[2][j] == '\0') {
++i;
j = 0;
}
}
}
/* データ検索のルーチン終了 */
誰か回答お願いします。マジで分からない。
926さんありがとうございます。 ところで俺のプログラムはどこがまずかったのでしょうか? argv[2][j]はどういう意味なんでしょうか?ポインタを配列に置き換えてるんですか?
926さん出来たら解説お願いしますm(__)m
>>924 指摘サンクス
んじゃ、これでどうかな?
int find(FILE* fp,char* lpsz)
{
int i = 0,
len = 0, //検索文字列の長さ
count = 0; //カウント
char c = 0;
len = strlen(lpsz);//文字列の長さ取得
do
{
for(i=0;i<len;i++) //このforループ内で検索する
{
c = fgetc(fp);
if(c == EOF) break; //終端なら返る
if(c != lpsz[i]) break; //一致しないと検索ループを抜ける
}
if(i == len){ //もし、上のループをbreakせずに抜ければ検索文字列と一致
count++;
}else{
fseek(fp,-i,SEEK_CUR);//breakしたときはファイルポインタをiだけ戻す
}
}while(c != EOF);
return count;
}
>>927 たぶん問題が悪い。
文字列として char* が戻り値なんて、ロクな問題じゃない。
あ〜、これじゃ 文字列:aaaaa 検索対象:aa のときに戻り値が2になっちゃうね。 戻り値が4になるには count++; ↓ count++; fseek(fp,-len+1,SEEK_CUR); にすればいいかな? なんか、文字列検索ってなかなか複雑だね。 まだどっか、間違ってそうだわ。
933 :
デフォルトの名無しさん :03/07/15 00:35
"aa"aaa, a"aa"aa, aa"aa"a, aaa"aa" こう検索するの?
if (ch == argv[2][j] || ch == argv[2][j = 0]) この部分がよく分からないのですがどういう動作をするんでしょう?
>>878 =927
釣られてやる。
860番代辺りに同じ質問と回答がある。
>>934 ch == argv[2][j]が偽であるとき、jに0を代入して
ch == argv[2][j]を検査する。
>>933 Yes!
でも、漏れの使ってるエディタとかは修正しない方の方式だし、
ソフトによってまちまちだから、別にそこまでしなくてもいいかも。
>>936 ポインタで書いたら
if (ch == *(argv[2]+j) || ch == *(argv[2]+(j=0)))
こうですか?
>>923 そう検索するんだったら、一文字読んで fgetpos()、
文字列が一致するか確認したら、fsetpos() で元の位置に戻す
とかした方が楽なんじゃないの?
>>938 *(Pointer + Integer) ≡ Pointer[Integer] ≡ Integer[Pointer]
どう書き換えてもポインタ演算。
>>938 これ位までなら、理解出来るようになろうね
if (ch == i[argv[2]] || ch == (j=0)[2[argv]] )
>>900 >>908 #include <stdio.h>
#include <windows.h>
int main(void)
{
int i;
for(i=1;i<=20;i++)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),(WORD)(4+(1-(i-1)/10)*2));
printf("%d\n",i);
}
return 0;
}
>>900 こんな方法もある。
#include <stdio.h>
int main(void)
{
int num;
printf("num = ");
scanf("%d", &num);
if(10 <= num && num <= 20){
printf("\x1b[1;33;48m");
printf("num = %d\n", num);
}
else if(0 <= num && num <= 9){
printf("\x1b[1;31;48m");
printf("num = %d\n", num);
}
else
printf("num = %d\n", num);
printf("\x1b[m");
return 0;
}
__∧_∧_ |( ^^ )| <寝るぽ(^^) |\⌒⌒⌒\ \ |⌒⌒⌒~| 山崎渉 ~ ̄ ̄ ̄ ̄
945 :
デフォルトの名無しさん :03/07/15 10:43
すみません、教えていただけませんか? 文字列 str に同じ文字が続くときは、それらを1つにする関数 void omit_samechar(char str[]) を作成せよ。 実行例:(下線部分は実行時に入力する) 文字列を入力してください:sssaaaaanyyyosaaaannnn sanyosan
void omit_samechar( char str[] ){ char *dst = str, prev = 0; for( ;*str; str++ ) { if( *str != prev ) *dst++ = *str; prev = *str; } }
ありがとうございます。 でもすみませんが、途中じゃわからないので 全部教えていただけませんか?
void omit_samechar(char str[]) { char *p; if (str == NULL || *str == '\0') { return; } p = str++; do { if (*str != *p) { p++; } } while(*p = *str++); } /* 常にコピーする辺りが無駄 */
void omit_samechar( char str[] ){ char *dst = str; for( ;*dst++ = *str;) for (; *dst == *++str;) ; }
void omit_samechar( char str[] ){ char *dst = str; for( ;*dst = *str; *dst++) for (; *dst == *++str;) ; }
void omit_samechar(char str[]) { char *p; for (p = str; *p = *str; p++) { while (*p == *++str) { } } } /* がーん、952と同じな上に出遅れた */
void omit_samechar(char *s) { char *p=s; while(*p++){ if(*p != *s){ *++s = *p; } } }
>954 最後のヌル文字入る?
void omit_samechar(char str[])
{
char *p = str;
do {
if (*str != *p) {
*++p = *str;
}
} while (*str++);
>>955 先にコピー済みなので大丈夫。
みてわかんない?
__∧_∧_ |( ^^ )| <寝るぽ(^^) |\⌒⌒⌒\ \ |⌒⌒⌒~| 山崎渉 ~ ̄ ̄ ̄ ̄
>>910 例えば、
#include<stdio.h>
int main(){
int a=30;
while(1){
printf("%d\n",a);
getchar();
a--;
if(a==0){return 0;}
}
}
このようなプログラムがあった場合、変数aが20になった場合10まで色が黄色に、
10になった場合0まで赤色にしたいのです。
MS-DOSプロンプトを使っているならANSIエスケープを使う google で ANSIエスケープ を検索
961 :
デフォルトの名無しさん :03/07/15 20:46
すいませんおねがいします。 文字をデータとして保持する構造体Listを考える。二つの リストをl1とl2とするとき、 l2の要素を l1の後ろに連結する関数を定義し、その動作を確認しなさい。 戻り値は、 追加したノード数とする。また、l2の要素と l1に追加された要素は独立の存在するとする。 int concat(List &l1,List l2)
962 :
デフォルトの名無しさん :03/07/15 20:49
>>962 問題に構造体の定義がないので自分で自由に決めるみたいです。
おねがいします。
理由は無いけどむかつくから作ってあげない。
おまいらアルゴリズムの本買えよ
Cの教科書穴が開くほど嫁! って逝ったらこのスレの意義がなくなるか…
>>911 今さらだが、折角書いたのでupさせてくださいな...
http://do.sakura.ne.jp/ 〜junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1027870433&res=119
ファイルが aaaa で検索文字列が aa のとき、3になる。
つーか、ずいぶん大げさなプログラムになってしまったので、
あんまり参考にはならないかもね。ケケッ!
しかもチルダが全角になってやがる。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
970 :
デフォルトの名無しさん :03/07/15 23:37
なぜか実数型使うと出力が変になります -947347397.00とかに。なぜですか? #include <stdio.h> void main (void) { double indata[5]; double ave = 0.0; int i; for(i=0;i<5;i++) { printf("\n数値を入力(実数型)"); rewind (stdin); scanf ("%4.2f",&indata[i]); ave=ave+indata[i]; } printf("平均値は%4.2f",ave/5); }
>>970 scanf("%lf",&indata[i]);
指定した文字数(char型)しか配列に格納せず 指定した文字数以降は廃棄される 関数があるって聞いたのですがなんていう関数ですか? 例) キーボード入力でabcdefghijkと打ち込んで変数(配列)の文字数指定が5文字だとしたら 変数にはabcd\0と格納されefghijkは廃棄されるという関数なのですが・・・・ 知ってる方教えてください よろしくお願いしますm(_ _)m
fgetsでいいんじゃないか。
974 :
デフォルトの名無しさん :03/07/16 00:05
#include <stdio.h> void main (void) { char i; scanf("%c",&i); while ( i != 'Y' || i != 'N') { scanf ("%s",&i); } printf ("終了\n"); } なぜか永久ループです
FAQを目から血が出るほど読みまくれ
#include <stdio.h> void main (void) { char i; scanf("%c",&i); c = toupper(c); while ( i != 'Y' || i != 'N') { scanf ("%s",&i); } printf ("終了\n"); }
何で宿題でもないものを、このスレで… つーか、もしかして、1000取り合戦なのか?
main() { std::cout << std::cin; }
釣りでした
せっかく1000が近いんだし答えが出てない問題に答えてやるか
>>974 残り僅かなのに、スレを無駄に消費した責任を取って、次スレよろ
911ですけどやっぱり検索文字列aabでaaabを検索したら無理でした。 /* データ検索のルーチン */ while ((ch = fgetc(fp)) != EOF) { if (ch == argv[2][j] || ch == argv[2][j = 0]) { ++j; if (argv[2][j] == '\0') { ++i; j = 0; } } } /* データ検索のルーチン終了 */ ここから改造してそこを修正する方法はないんでしょうか?
>>961 本当に
>文字をデータとして保持する構造体List
なのか?
#include <string> #include <stdio.h> struct List { std::string buf_; }; int concat(List &l1,List l2) { l1.buf_ += l2.buf_; return l1.buf_.size(); } main() { List l1,l2; l1.buf_ = "萌"; l2.buf_ = "ろろろろ"; concat(l1, l2); printf("%s", l1.buf_.c_str()); }
>>984 /* データ検索のルーチン */
while ((ch = fgetc(fp)) != EOF) {
if (ch == argv[2][j]) {
++j;
if (argv[2][j] == '\0') {
++i;
j = 0;
}
}
else {
fseek(fp, -j, SEEK_CUR);
j = 0;
}
}
/* データ検索のルーチン終了 */
>>985 はい。。
>>986 ありがとうございます!!ですがこの形でビルドすると戻り値がないのですが。。
戻り値はノード数にしたいのですがどうすればいいですか???
>>990 どういう判断で戻り値が無いと思ったの?
>>992 ビルドするとエラーのところに、警告で戻り値がないのでvoidとみなします。とでてくるんです。
>>993 その警告が出てる関数はmain()じゃねーのか?
>>993 main()→void main()
にすればいいんじゃ?
998 :
デフォルトの名無しさん :03/07/16 02:24
>>997 ネタということにしたいのですね? :)
1000 :
デフォルトの名無しさん :03/07/16 02:28
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。