C/C++の宿題やらせてください。6代目。

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
私はC++房。
今まで1年*ヶ月、ほとんど毎日休まず一生懸命C++を勉強してきた。
わからない宿題若しくは処理があったら私にやらせてくださいm(_ _)m
5代目(前スレ): http://pc2.2ch.net/test/read.cgi/tech/1051594046/l50
4代目: http://pc2.2ch.net/test/read.cgi/tech/1045074808/l50
3代目: http://pc2.2ch.net/tech/kako/1041/10419/1041992392.html
2代目: http://pc3.2ch.net/tech/kako/1039/10397/1039772622.html
宿題手伝いますYO!!: http://pc3.2ch.net/tech/kako/1038/10380/1038024989.html

ラウンジ:質問が長い時はココを使うと便利
http://do.sakura.ne.jp/%7Ejunkroom/cgi-bin/megabbs/lounge/index.html
>>1
乙(嘲笑激藁
ラウンジ(・∀・)イイ!!んじゃない?
4デフォルトの名無しさん:03/05/16 09:45
関連スレ:C/C++系のスレッド

C++相談室 part19
http://pc2.2ch.net/test/read.cgi/tech/1052625846/l50

C言語なら俺に聞け! Part 〈56〉
http://pc2.2ch.net/test/read.cgi/tech/1052542761/l50

★初心者にVisual C++を教えるスレ★ Part6
http://pc2.2ch.net/test/read.cgi/tech/1052931903/l50

C++Builder相談室 Part5
http://pc2.2ch.net/test/read.cgi/tech/1045542179/l50

Win32API 質問箱 Build11
http://pc2.2ch.net/test/read.cgi/tech/1052651750/l50
>>4
ここは隔離スレなんだから、リンクはるな馬鹿
>>5 そうだったんですか。すいません。
7デフォルトの名無しさん:03/05/16 09:54
>>5
馬鹿
馬鹿
馬鹿
馬鹿
馬鹿
俺の宿題やれよ、このカスども
9デフォルトの名無しさん:03/05/16 16:19
乱数を用いて円周率を計算するプログラムを作成せよ
10デフォルトの名無しさん:03/05/16 16:26
なんで円周率なんか計算させる?
3.14159657843frいいじゃねーか!
>>10
小数第5位までしか正しくない罠
>>10はアルゴリズムを思いつかないようです
13デフォルトの名無しさん:03/05/16 16:41
14_:03/05/16 16:44
お前ら、跪いて俺様に宿題を請え。
お前ら、頷いて俺様に宿題を請え。
お前ら、躓いて俺様に宿題を請え。
円周率なんてpi=4*atan(1);でいいじゃねーか(藁
1919:03/05/16 18:56
教えてください!!
自分の名前をアスキーコード(整数値)で入力し、「My name is ・・・」
とローマ字(大文字)で表示するプログラムを作りなさい。また、同時に
(アスキーコードを再入力することなく)ローマ字(小文字)で表示する
プログラムを作りなさい。
#include <math.h>
#include <stdlib.h>
#include <stdio.h>

int main(void)
{
int i;
printf("計算中\n");
if(i=rand();i>0;i--);
printf("円周率=%f\n",PI);
return 0;
}
21デフォルトの名無しさん:03/05/16 19:06
>>20
PIが定義されていないと出た
22デフォルトの名無しさん:03/05/16 19:08
> if(i=rand();i>0;i--);

なんすかこれ?
>>9
モンテカルロ法
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
  int i, count;
  double x, y;
  srand(time(NULL));
  count = 0;
  for (i = 0; i < 10000; i++) {
    x = (double)rand() / RAND_MAX;
    y = (double)rand() / RAND_MAX;
    if (x * x + y * y < 1.0) count++;
  }
  printf("%lf\n", (double)count / i * 4);
  return 0;
}
>>23
& nbspの後に;を忘れてる
2523:03/05/16 19:45
再掲
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
  int i, count;
  double x, y;
  srand(time(NULL));
  count = 0;
  for (i = 0; i < 10000; i++) {
    x = (double)rand() / RAND_MAX;
    y = (double)rand() / RAND_MAX;
    if (x * x + y * y < 1.0) count++;
  }
  printf("%lf\n", (double)count / i * 4);
  return 0;
}
2623:03/05/16 19:47
>>24
さんくす。
IEコンポーネントを使ったブラウザでみてたんで気がつかなかった。
>>19
問題を読み間違えてないか?
一応サンプルを。
#include <stdio.h>
#include <stdlib.h>

#define MAX 100

int main( int argc, char** argv ) {
    char buf[ MAX + 1 ];
    int c;
    int i;
    int len = 0;
    while( scanf("%d",&c), c != 0 && len < MAX ) {
        buf[len++] = toupper(c);
    }
    buf[len] = '\0';
    printf( "My name is %s\t", buf );
    for( i = 0; buf[i] != '\0'; i++ )
        printf( "%c", tolower(buf[i]) );
    printf("\n");
}
~
28デフォルトの名無しさん:03/05/16 22:34
>>21
M_PI だな
29デフォルトの名無しさん:03/05/17 03:51
なんかおもしろいシミュレーションプログラムを作れ。
>>29
>>25 はモンテカルロシミュレーションのプログラム
void sub(){
  FARPROC exitprocess = GetProcAddress( GetModuleHandleA("kernel32"), "ExitProcess");
  __asm{
    mov ecx,exitprocess
    mov [ebp+4],ecx
  }
}
int APIENTRY WinMain(HINSTANCE, HINSTANCE, LPSTR, int){
  sub();
  OutputDebugString("来るな!\r\n");
  return 0;
}
ASMをおぼえはじめて遊んでいます。
上のプログラムで、「sub()が戻ったときにExitProcessの方に行ってしまう」のを予想したのに、
何も無く終わってしまいます。なんでですか?
32r:03/05/17 07:32
>>31
何の宿題だよ。


つか、アセンブリは全く解んないんだが、
movした後、
ジャンプ命令や割り込み命令を使わなくてもいいの?
33デフォルトの名無しさん:03/05/17 08:39
>>31
漏れも詳しくはしらないんだけど
リターンアドレスを書き換えたいわけでしょ?
ebpじゃなくてスタックポインタのespとか
いや、動作はそれで正しいよ。
subのリターンがExitProcessに行くから、
「来るな」が表示されない、つまり、「何もなく終わる」んだが。
3531:03/05/17 11:57
>>34
いえ、書き方悪くてすみません。「来るな」と表示されてしまうんです。
なんでExitProcessの方にいかないんだろうと思いまして。
3634:03/05/17 12:13
いや、うちのWin2K、VC6では問題なく、来るな、と出力されないヨ。
アセンブラで出力すればわかるんじゃない?
たぶんスタックでexitprocessをとってるか最適化で消えて
ebp+4がリターンアドレスじゃないのだと思うけど。
実はsubがインライン展開されているというあたりではないか。
3931:03/05/17 15:16
最適化の問題だったんですね。releaseモードで動かしていたし。
#pragma optimize( "g", off )で解決しました。

厨な質問に答えていただきありがとうございました。

>>31はなかなか面白い宿題(?)だった。
おかげで最適化で何が消えるか勉強になったよ。
で、>>32は勉強不足。
教えてください、お願いします。
5個の整数を配列に格納して、最大値と最小値を画面に表示させる。
int i[]={0,1,2,3,4};
printf("最大値%d,最小値%d\n",i[4],i[0]);
int i, max, min;
int a[5];

(a[5]への整数の格納は省略)

max = min = a[0];
for(i = 1; i < 5; i++) {
 if (max < a[i]) max = a[i];
 if (min > a[i]) min = a[i];
}

printf("最大値 %d\n最小値 %d\n", max, min);
4441:03/05/17 22:46
整数をキーボードから入力して最大値と最小値を画面に表示させる。
というのはできますか?
scanfじゃだめ?
>>44
「できる」という聞き方は相手の能力を疑っているようで失礼だ
「do」という表現に変えなさい。
配列をソートして、最初の要素と最後の要素
4841:03/05/17 22:56
>>42
>>43
有難う御座います。
49デフォルトの名無しさん:03/05/17 22:58
おいオマイラ! 俺に宿題をㄜㄝㄋ!!
50デフォルトの名無しさん:03/05/17 23:09
マイラ
51デフォルトの名無しさん:03/05/17 23:11
>>48
漏れも同レベルなので練習がてら

#include <iostream.h>

int max(int* const array, int size);
int min(int* const array, int size);
static const int NUM = 5;

int main(){
int array[NUM];
cout << "数字を" << NUM << "つ入力" << endl;
for(int i = 0; i < NUM; i++) cin >> array[i];
cout << "最大値:" << max(array, NUM) << " 最小値:" << min(array, NUM) << endl;
return 0;
}

int max(int* const array, int size){
int max;
for(int i = 0; i < size; i++)
if( i == 0 || max < array[i] ) max = array[i];
return max;
}

int min(int* const array, int size){
int min;
for(int i = 0; i < size; i++)
if( i == 0 || min > array[i] ) min = array[i];
return min;
}
>>45
scanfでおねがいします。
>>46
申し訳。
5351:03/05/17 23:24
>>51
このmaxの関数でsizeが0以下だったりしたときは
maxが不明な値になっちゃうと思うんですが、
こういうときのエラーを判断するのに
正常な返り値が負の数,正の数どっちも考えられるとき
どういう返り値を利用したらいいんでしょうか

呼び出し元で呼び出し前にチェックするのが普通でしょうか
ご教授おながいします
>>51
× #include <iostream.h>
× static const int NUM = 5;

#include <algorithm>
でmin_element/max_elementがいいよ。
55& ◆8MNVpjEVeM :03/05/17 23:28
>>53
0返しとけばいいんじゃねーの?
>>53
・引数を std::size_t にする
・throw std::invalid_argument;
・assert入れる(呼び出し元にチェックを要求する)
5751:03/05/17 23:35
>>55
>>51のようにしちゃうと0も正常値の可能性あるかと思ったので

>>54>>56
大変参考になりますた

algorithm.hとか初めて知りました
min_elementとかでやってるように
値じゃなくて配列の添え字を返すのが正常値を正の値に
限定できて負の値をエラー値にできてなんかよさげですね
58デフォルトの名無しさん:03/05/17 23:35
>>53
仕様の問題は自分で勝手に定義汁!
あえて言うなら、

1.戻り値では処理結果を引数に最大値の格納先を追加する
2.戻り値を配列の添え字にし、エラー時は添え字として有り得ない値を返す

など、いろいろ考えられる。
何が最適かはケース・バイ・ケース。
要は関数を仕様を自分で考えれ!って事だ。
59デフォルトの名無しさん:03/05/17 23:40
>>51
>static const int NUM = 5;

は #define で十分では?
何故に const ?
>>59
constで済むところに#define使うのか?
>>59
はいはい。おじいさんはもう死ぬ時間ですよ。
6259:03/05/17 23:45
>>60
ああ、なるほど。
const の意味をはき違えてるのか(w
63デフォルトの名無しさん:03/05/17 23:45
>>59
プ 
>>62
名前空間全体を汚すマクロをホイホイ使うな! このタコが!!
>>59はありえない
釣られすぎ
釣りが始まりました(藁
6859:03/05/17 23:49
>>64
>名前空間全体を汚すマクロをホイホイ使うな! このタコが!!

どこで汚れるのよ(w
#define NUM 100

struct foo
{
int NUM;
};

foo f;
f.NUM; //ダメ。 名前空間が汚れましたー
釣れた(w
const int NUM 100

struct foo
{
int NUM;
};

foo f;
f.NUM; //OK 名前空間が保たれましたー
   ∧_∧  / ̄ ̄ ̄ ̄ ̄
  ( ´∀`)< とにかくカエレ!
  (    )  \_____
  | | |
  (__)_)
const int NUM 100
【厨房の為の 煽り煽られ講座】

煽られて反論できなくなった
  → ○○ 必 死 だ な (w

予期せぬ自分の無知で煽られた
  → 釣れた
  → わーマジレス返ってきたよ

言い返せないけど 負けは認めたくない
  → ( ´,_ゝ`)プッ
  → 無知白痴は黙ってろ
  → 知能障害をおこす
  → 意味不明な発言
#define NUM 100;

動かねえ。
#define NUM 200

namespace ore
{
#define NUM 100

};

main()
{
std::cout << NUM << std::endl;
}
76での出力結果は何でしょう?
100
こういうの簡単に検証できるようなC++のインタプリタとか無いのかな…
>>77
undefined symbol: namespace
>>59==無知
8259:03/05/17 23:59
今日はなかなかの大物が釣れますた(・∀・)
厨房の為の 煽り煽られ講座】

予期せぬ自分の無知で煽られた
  → 釣れた
 
84デフォルトの名無しさん:03/05/18 00:43
59とは関係ないけど、
コンパイル時にサイズが決まっているものであれば
次のマクロを使えば要素数が取得できるね。

#define GET_CONST_ARRAY_SIZE(array) (sizeof(array)/sizeof(array[0]))

まぁ、マクロは関数や定数では実現できない利点が
欠点を上回る場合のみ利用するべきだね。
特に定数をマクロで宣言するのはナンセンスだね。
C++は任意の型の定数をconstで宣言できるし、
Cも整数の定数に限ればenumで宣言できる。

template<typename T> int GetConstArraySize(T x[])
{
 return sizeof(x) / sizeof(T);
}
86デフォルトの名無しさん:03/05/18 00:51
生配列なんて使ってないで素直にvector使えよ。
マクロは使わない方がいいね。
templateで済ませられるものはtemplateで済ませた方が型安全だ。
template<typename T,std::size_t N> std::size_t GetConstArraySize(T const (&x)[N])
{
 return N;
}
GetConstArraySizeといういかにも関数とう名前だとその機能で十分な気がするが、
#define constarray_sizeof(a) (sizeof(a)/sizeof(*(a))) と比べるとできないこともある。

int other_array{} = { ... };
int data[ constarray_sizeof( other_array ) ]; // 可
int data[ GetConstArraySize( other_array ) ]; // 不可
90デフォルトの名無しさん:03/05/18 01:11
提出内容

1 アルゴリズム
2 フローチャート
3 プログラムリスト
4 動作結果

課題

y=cos(x)-x^4=0
y=exp(-x^4)-sinx=0

の根のうち
0.37<x<1

の範囲にあるものを、二分法で六桁正確に求めよ。

こういうプログラム作んなきゃないんだけど、もうだめです。
どなたかプロの方いたらよろしくお願いします。


ペコリm(。。)m
9190:03/05/18 01:12
言語はC言語かフォートラン使えって言われました。
どっちでもいいみたいです。
その1,2,3,4のどこがわからんのよ
9384:03/05/18 01:37
>>86
C言語にvectorなどという便利な物はない。
それと配列かvectorかは用途によって使い分けだな。

>>87
そうだね。
それにC++なら関数マクロではなく
インライン関数にするべきだね。

>>89
なにが違うの?
できるでしょ。ちなみに
int other_array{} = { ... };

int other_array[] = { ... };
の間違いだよね。

生配列のサイズに非定数式を受け付けるのはC99か、gccの拡張のはず。
templateならコンパイル時に展開されて定数式になるんじゃないの?
>>90
#include <stdio.h>
#include <math.h>

double f1(double x) { return cos(x) - pow(x, 4.0); }
double f2(double x) { return exp(-pow(x, 4.0)) - sin(x); }

double newton(double (*f)(double), double x0, double x1) {
  double x, y, y0, y1;
  y0 = f(x0); y1 = f(x1);
  while (fabs(x0 - x1) > 0.0000001) {
    printf("%f = f(%1.7f) %f = f(%1.7f)\n", y0, x0, y1, x1);
    x = (x0 + x1) / 2; y = f(x);
    if (y0 * y < 0) {
      x1 = x; y1 = y;
    } else {
      x0 = x; y0 = y;
    }
  }
  return x;
}
int main() {
  printf("%1.7f\n", newton(f1, 0.37, 1.0));
  printf("%1.7f\n", newton(f2, 0.37, 1.0));
  return 0;
}
>>95
なるわけねぇよ
yamada,taro,25
tanaka,hanako,23

こんなCSVファイルを読み込んでデータを構造体に格納したいのですが、VC6.0で
実行時にdebug assertion failed!というエラーメッセージが出てきます。
以下のプログラムの間違っている点をご指摘願えればと思います。
よろしくお願いします。

#include <stdio.h>

#define NUMBER 100
#define LINE_SIZE 50

char *GetItem(char *wp, char *buf, int size);

struct person{
char *all;
char *fname;
char *lname;
char *age;
}p[NUMBER];
int main(int argc, char *argv[]){
int i;
char *wp;
FILE *fp;

if ((fp = fopen("test1.txt","r")) == NULL) {
printf("file open error!!\n");
return 0;
}
for(i=0; i<NUMBER; i++){
if(fgets(p[i].all, LINE_SIZE, fp) == NULL)
break;
wp = p[i].all;
if((wp = GetItem(wp, p[i].lname, 10)) == NULL){
printf("error(1)\n");
break;
}
if((wp = GetItem(wp, p[i].fname, 12)) == NULL){
printf("error(2)\n");
break;
}
if((wp = GetItem(wp, p[i].age, 3)) == NULL){
printf("error(3)\n");
break;
}
if(*wp != '\0'){
printf("error(4)\n");
break;
}
}
fclose(fp);
return 0;
}
101デフォルトの名無しさん:03/05/18 02:47
char *GetItem(char *wp, char *buf, int size)
{
int i;

buf[0] = '\0';
while(*wp == ' ' || *wp == '\t')
wp++;
if(*wp == '\0'){
return(NULL);
}
for(i=0; i<size; i++,wp++){
if(i >= size)
return NULL;
buf[i] = *wp;
if(*wp == '\n'){
buf[i] = '\0';
return(wp);
}
if(*wp == ','){
wp++;
buf[i] = '\0';
return wp;
}
}
return wp;
}
すみません、インデントが全部消えて読みにくいかと思いますが
どうかお願いします。
struct person{
char *all;
char *fname;
char *lname;
char *age;
}p[NUMBER];

この構造体の中身はいつ領域が割り当てされてるの?
allはどこの領域を指してるの?
>>102

質問の意味がよく分かりません
>>104

struct person{
char all[255];
char fname[255];
char lname[255];
char age[255];
}p[NUMBER];
10698:03/05/18 03:24
>>102
領域を割り当てるということはmallocか何かを使うのでしょうか?
宣言するだけではダメですか?

>>103
とりあえず1行を読み込んで格納したかったのですが…
アドバイスすると
personでポインタを使うならmallocして領域を確保する必要がある。
allはいらない。ループのところで用意すればいいし。
持っておく必要があるなら別だけど。
personに入れる関数をつくってエラーを返すようにしてもいいと思う。
GetItemはループの判定式のところで\nや,を判定した方がすっきりする。
10898:03/05/18 03:38
>>105
うーん、そのように修正してもダメでした。

どうやらmainの上のほうの
for(i=0; i<NUMBER; i++){
 if(fgets(p[i].all, LINE_SIZE, fp) == NULL)
  break;
でbreakが実行されてしまうみたいなんですがどうしてでしょうか?
10998:03/05/18 03:39
>>107
どうもありがとうございます。やってみます
fgetsってポインタを返すのか?
読み込んだ文字数とかじゃなかった?
調べなきゃわからんが。
11184:03/05/18 03:44
>>98
本題とは少しずれるが、GetItem関数の第一引数は
constとしてポインタを変化させない方が親切だな。
同じ値を返しているんだから。
こうすることで、入力値を変化させずに
結果が得られるので少しは汎用的になる。
当然、GetItemにポインタ変数が1つ増えるが。

ちなみにGetItem関数のfor内にある初めのif文は無駄だと思う。

サイズが決まっているならポインタではなく
配列にしてもいいと思う。サイズ小さいし。
だから...

enum { PERSON_FNAME_SIZE=10, PERSON_LNAME_SIZE=12, PERSON_AGE_SIZE=3 };
struct person{
char all[PERSON_FNAME_SIZE+PERSON_LNAME_SIZE+PERSON_AGE_SIZE];
char fname[PERSON_FNAME_SIZE];
char lname[PERSON_LNAME_SIZE];
char age[PERSON_AGE_SIZE];
}p[NUMBER];

だね。で、GetItemにあるマジックナンバーは
enumで宣言したものに置き換える。
これでサイズ修正の際の修正箇所が減るね。
>>110

成功した場合は 第1引数で指定したポインタを返す。
EOF以外の文字が検出されなかった場合にNULLを返す。
>>108
動いたよ。
fgetsは改行が入るのでerror4が出たが。
>>111
それはちょっとおかしくない?
11584:03/05/18 04:13
>>114
どこが?
いくつか書いたからどこのことかわからないw
本題とは少しずれるが、GetItem関数の第一引数は
constとしてポインタを変化させない方が親切だな。

当然、GetItemにポインタ変数が1つ増えるが。

char all[PERSON_FNAME_SIZE+PERSON_LNAME_SIZE+PERSON_AGE_SIZE];
11784:03/05/18 05:01
>>116
>本題とは少しずれるが、GetItem関数の第一引数は
?constとしてポインタを変化させない方が親切だな。
>当然、GetItemにポインタ変数が1つ増えるが。
っていうのとあのサンプルコードは別物だよ。
まぁ、流れでわかるとおもうけど。
118デフォルトの名無しさん:03/05/18 05:05
この例だとmallocいらなくない?
ポインタ使わず構造体に直接アクセスしてるし
>>117
さらに分からなくなったよ。
char *GetItem(char *wp, char *buf, int size)
をどう変えるの?
>>118
文字を入れる領域はどこかに必要だと思うぞ。
csvの読み込みって昔課題でやったことあるけど
こんなんだっけ?
「プログラミング作法」の第4章を推奨
>>113
動いたの?俺はその前にfgetsの段階でNULLを返して止まる。
12598:03/05/18 13:24
色々指摘ありがとうございました。
しかし最後に、修正した部分と無関係になぜか>>123の方の
言うとおりどうしてもfgets()で一行の読み込みに失敗します。
>>98のようなファイルがおかしいのでしょうか?それとも別の原因があるのでしょうか。
何度も済みませんが、どなたか教えてください
とりあえず、今あなたのコードがどうなってるか良くわかりません。
私は>>98のコードから>>105さんが指摘してる事を訂正しました。
そして、main関数の変数宣言直後に

wp = (char*)malloc(いっぱい);

みたいなのを加えました。それで>>113さんがerror4が出るのが当然のように書いてるので、

if(*wp != '\0')・・・・

の部分を消しました。
これで最後まで逝きます。
あ、malloc要らなさそう。ちゃんと読みます。ごめんなさい
test1.txtにデータを用意してない。
ソレハワラウトコロカ?
13098:03/05/18 20:25
コードは構造体のメンバのallを消して>>105さんの言うとおり
ループ内で用意しています。また、今はmalloc()を消して
構造体のメンバは配列にしています。

VCを使ってるのでtest1.txtのはDebugフォルダに置いてます。
データもとりあえず>>98の2行がちゃんと入っています。
それなのに何故かfetsがどうしても失敗してしまうんです。
どなたか分からないでしょうか?
>test1.txtのはDebugフォルダに置いてます。
ソースファイルと同じディレクトリに同じ物を置いてもダメなの?
ループのところだけ貼り付けてくれ。
133むん:03/05/18 21:02
あのぅ。
「PGM形式画像を読み込み、回転・白黒反転等の処理をして、再びPGM形式で出力するプログラムを作れ」
という課題をやっているのですが、さっっぱりわかりませぬ。
まったくのC++初心者・2ちゃん初心者です。
メモリ領域を動的に(new・deleteを使って)確保せよ。という補足付きDeath。
読み込みと回転と白黒反転と出力をさせればいいだけだろ。
とりあえずデータをどう形式で持てばいいか考えろ。
×どう形式
○どういう形式
136デフォルトの名無しさん:03/05/18 21:06
>>133
反転は元の値aなら255-a
137むん:03/05/18 21:10
あの、バカなんで全くわかりませぬ。
自分で書くの初めてなんで。
138動画直リン:03/05/18 21:11
aが0なら255にする。aが255なら0にする。
だから255-a
PGM形式画像にどういうデータが入ってるのか調べてこいよ。
141むん:03/05/18 21:15
わかりました。出直します
143デフォルトの名無しさん:03/05/18 21:32
>>142
キタ━(゚∀゚)━( ゚∀)━(  ゚)━(  )━(゚  )━(∀゚ )━(゚∀゚)━!!!!
こいつ自分で勉強するきないのかよ
144紺野あさみ:03/05/18 21:33
>98
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define NUMBER 100
#define LINE_SIZE 50

struct person{
char* all;
char* fname;
char* lname;
char* age;
} p[NUMBER];
146デフォルトの名無しさん:03/05/18 21:35
>>142より

投稿時間:2003/05/18(Sun) 20:52  ←
投稿者名:ぼんど
URL :
タイトル:Re^4: PGMファイル読み込み・処理・出力

ありがとうございます。
<<<参考に、頑張ってみます。>>>

10分後
>>133 ←
>98
int main(int argc, char *argv[]) {
int i;
char buff[LINE_SIZE][NUMBER];
FILE *fp;

if ((fp = fopen("test1.txt","r")) == NULL) {
printf("file open error!!\n");
exit(1);
}

for(i = 0; i < NUMBER; i++) {
if(fgets(buff[i],LINE_SIZE, fp) == NULL) {
break;
}

p[i].fname = strtok(buff[i], ",");
p[i].lname = strtok(NULL, ",");
p[i].age = strtok(NULL, "\n");
}

fclose(fp);

return 0;
}
14898:03/05/18 21:43
>131
0バイトのtest1.txtがソースのフォルダに作成されていたようで、
それにデータ加えたらいけました・・・

済みません、お騒がせしました。
int a[10] = {0,1,2,3,4,5,6,7,8,9}を入れ替えをして
9,8,7,6,5,4,3,2,1,0と画面に表示させるにはどうすればいいのでしょうか?
for (i=0,j=9; i < j; i++, j--)
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
15198:03/05/18 21:47
>>145
ありがとうございます。そんな短くなるんですね
aのサイズを調べてポインタでデクリメントする
using namespace boost::lambda;
std::reverse(a, a + 10);
std::foreach(a, a+10, std::cout << _1 << '\n');
しょうがねえなあ、神でもやってやるか。
#include<stdio.h>
main(){FILE *fr,*fw;int w,h,m,i,v;char b[1024];scanf("%s",b);printf("%s\n",b);sc
anf("%s",b);printf("%sのnega\n",b);scanf("%d %d %d",&w,&h,&m);printf("%d %d\n%d\
n",w,h,m);for(i=w*h;i>=0;i--){scanf("%d",&v);printf("%d ",m-v);}return 0;}
155デフォルトの名無しさん:03/05/18 22:35
すみません。。お願いしたいのですがよろしいですか?

演習 (文字の読み込みと判定・終了、分岐)

入力された 語(word)の数を数えるプログラムをつくりなさい。
語(word)の数え方は、次の通り。
A job applicant needs to be enthusiastic.

語(word):一つ以上の連続する文字列。 この場合、語の数は7。
語と語の間には空白、タブ、改行がくるものとする。
空白の判定: ‘ ‘
タブの判定: ‘\t’
改行の判定: ‘\n’

どんな文字でも読み込む必要があるから、getchar( ) を使う必要がある。
読み込んだ1文字が空白、タブ、改行でなければ、文字が連続している状態
である。
空白、タブ、改行であれば一つの語が終了したのだから語のカウントを1
上げる。
読み込んだ1文字が空白かタブか改行かそれ以外かを判定する必要がある。
if 文でもswitch―case文でもよい。

入力の終了を判定するための文字は自分で特定の文字をきめてもよいが、
EOFで終了させたならば、CTRL キーを押しながら Z キーを押す。
     CTRL キー + Z はEOF即ちー1

<出力方法>
** INPUT □□□ WORDS **

                3桁の10進数
使い方、
gcc nega.c -o nega
nega < input.pgm > output.pgm

制限
1行目はP2であること
2行目は#から始まるコメントで空白,タブなどを含まないこと
3行目は画像のサイズを幅、高さの順に示していること
4行目は最大輝度(ex.15)を示すこと

あ、わりいわりい。最後の行、これに差し替えてくれ。
n",w,h,m);for(i=0;i<w*h;i++){scanf("%d",&v);printf("%d%c",m-v,(i%w!=0||i==0)?' ':'\n');}return 0;}

157デフォルトの名無しさん:03/05/18 22:38
>>149
さすがに>>153のboost使ってるのは参考にしない方が良いと思われ。

#include <iostream>
#include <iterator>
#include <algorithm>

int main()
{
  int a[10] = {0,1,2,3,4,5,6,7,8,9};
  std::reverse(a, a+10);
  std::copy(a, a+10, std::ostream_iterator<int>(std::cout, " "));
}

これで良いかと。
>>157
何が違うつもりなんだろう。
159デフォルトの名無しさん:03/05/18 22:52
>>155
//>>155 こんなもんか
//コピペしても全角スペースがあるぞ
int count;
char c;
while(1)
{ c=getchar();
  if(c==EOF)
   break;
  switch(c){
  case ' ':
  case '\t':
  case '\n':
    count++;break;
  defualt:
    break;
  }
}
//ちなみに無限ループにする必要はなくせるので
//そんくらいは自分で考えてくれ。ソースなおすの面倒だし



#include <stdio.h>
int main(){
char c;
int count=0,flag=-1;
while((c=getchar())!=EOF){
if(c=='.') break;//.で終了
if(isalpha(c)){
if(flag==-1) {
flag=0;
}
}else{
flag=-1;
count++;
}
printf("[%d]",flag);
}
if(flag==0) count++;
// printf("%d",count);
}
こんな感じかい?
int count = 0;
std::string word;
while( std::cin >> word ) ++count;

ワーイ、C++サイコー
>>メモリ領域を動的に(new・deleteを使って)確保せよ。という補足付きDeath。
忘れてた&必要ないような気が。とりあえず、これに差し替えてくれ。

main(){FILE *fr,*fw;int w,h,m,i,v;char *b;b=(char*)malloc(1024);scanf("%s",b);printf("%s\n",b);sc

newしてないし... 逝ってきます...
164デフォルトの名無しさん:03/05/18 23:14
>>159
わーい。早仕事ですサンクス
学校でのC言語課題でした。本文そのまま。
一応自分でループ再検討してもうちょっと考えてみます。
ありがとうでした。
空白の連続とかを処理しないといけないから
wordの中にいることを示すフラグとかがいると思うのだが。
nを入力すると、英文がかかれたtest.txtをn文字目で強制改行して表示するプログラムを教えて下さい。
文字数をカウントしてnで改行を出力。
>>166
#include <stdio.h>
#include <stdlib.h>

int main()
{
FILE *fp;
char *buf;
int n;

scanf("%d",&n);
fp=fopen("test.txt","r");
if(!fp) return 1;
buf=malloc(n+1);
if(!buf){fclose(fp); return 1;}
while(fgets(buf,n+1,fp))
puts(buf);
free(buf);
fclose(fp);

return 0;
}
169168:03/05/18 23:27
おっと、英文の途中に改行があると誤動作するな。
170168:03/05/18 23:32
>>166
#include <stdio.h>
#include <stdlib.h>

int main()
{
FILE *fp;
int c,i,n;

scanf("%d",&n);
fp=fopen("test.txt","r");
if(!fp) return 1;
for(i=1;(c=fgetc(fp))!=EOF;i++){
putchar(c);
if(!(i&n))
putchar('\n');
}
fclose(fp);

return 0;
}
171デフォルトの名無しさん:03/05/18 23:34
>>166
この課題流行りなのか?
うちの大学も同じ課題なんだが・・・
if(!(i&n))
173168:03/05/18 23:35
>>172
打ち間違い(^_^;)
if(!(i%n))ね
174デフォルトの名無しさん:03/05/18 23:37
同じ大学なんだろうな
>>174
そして半数が同じソースを提出する、っと(笑)
>>175
教授も2chを見ていて再提出っと(&2ちゃんねらだとばれる)
177170:03/05/18 23:42
#include <stdlib.h>を消し忘れた・・・まあいいか。
>>166
大学ってこんなヘボい課題がでるんですか?
179157:03/05/18 23:49
>>158
標準ライブラリのみしか使ってませんが何か?
180171:03/05/18 23:54
>>176
ということは教授も生徒に2ちゃんねらだとばれるっと
181デフォルトの名無しさん:03/05/19 00:03
>>149
遅レスだが、こんな方法もある。

/* ※注:全角空白が在るから、そのままコピペするなよ! */
#include <stdio.h>
#include <stdlib.h>

int compare( const void *a, const void *b )
{
  return (*(int *)b) - (*(int *)a);
}

int main( void )
{
  int a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
  qsort( a, sizeof(a)/sizeof(a[0]), sizeof(a[0]), compare );
}
182デフォルトの名無しさん:03/05/19 01:14
整数を一つ読み込む。その値は、午前0時からの秒数とする。
0以上、86400未満である。この値を時、分、秒に置き換えて表示するプログラムを書け。
例えば52311であれば 14:31:51と表示されればよい。

という宿題なのですが・・・ 式は作れたのですが
14:31:51という風に表示できません(´・ω・`)
どうか哀れな私に教えてくださいませ
>>192
どこまで出来たかうpしる!
表示するまでのコードをここに書きましょう
185183:03/05/19 01:20
>>184
(´・ω・`) ケコーンしる!
>>182
printfをうまく(というほどでもないけど)使え。
スマソ 出来ました・・・
printf("%d:%d:%d\n", ji,fun,byou);
これで・・・出来ました・・・あまり頭で分かってないですが
188(´・ω・`):03/05/19 01:26
一応
#include <stdio.h>

int main(void)
{
int x, byou, fun, ji;

printf("x :");
scanf("%d", &x);

ji=x/3600 ;
fun=x%3600/60;
byou=x%3600%60;
printf("%d:%d:%d\n", ji,fun,byou);
return (0);
}
>>187
%dは%02dにした方がいい。
190(´・ω・`):03/05/19 01:30
>>189 理由を教えて欲しいです。
動作しましたが違いが分からないので今後に生かせませぬ
(´-`).oO(もしや常識なのだろうか・・・)
どっちでもいいんじゃない?
6:12:3と
06:12:03の違い
>>190
一桁の場合、自動的に0を付加してくれる(02:05:08のように)
193(´・ω・`):03/05/19 01:36
おぉおぉぉおぉぉ スゲー!
サンクスです
閏秒とかは考えなくていいの?と出題者に突っ込んどこうぜ
>>188
せめて

 ji → hour
 fun → min
 byou → sec

にしようや。
あと、計算式は

 sec = x % 60;
min = x / 60 % 60;
 hour = x / 3600;

の方がスッキリするだろ。
196(´・ω・`):03/05/19 02:29
閏秒って??
>>195なるほど、すっきりしました
(´-`).oO(奥が深いな)
197r:03/05/19 02:30
>>194
年によって地球の自転速度って違ったりするからなぁ。
>>196
聞く前にちょっとは検索をするクセつけましょうね
>>197
ワラタ
>>199
え?どこが笑う個所なの?
100個のランダムな整数を作り、ファイルhogeに出力するプログラムと、
それを読み込み、intの配列に格納するプログラムをお願いします。ちなみにC++です。

本当はその後ソートがあってそれは分かるのですが、入出力で
混乱してしまったので・・よろしくお願いします
#include<time.h>
#include <io.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
int main(){

int fh=_open("unko","_O_BINARY|_O_CREAT|_O_WRONLY |");
srand(time(NULL));

for(int i=0;i<100;i++){
int j=rand();
_write(fh,&j,sizeof(int)),
}
_close;
int I[100];
_open("unko",_O_BINARY|_O_RDONLY);
for(int i=0;i<100;i++)
{
_read(fh,&I[i],sizeof(int));
}
_close(fh);
}
http://www.microsoft.com/japan/developer/library/vccore/_crt__open.2c_._wopen.htm
間違い
int fh=_open("unko",_O_BINARY|_O_CREAT|_O_WRONLY );

Cだがナ-
>>201
出力するファイルの形式は?
>>202
ありがとうございます。
できればシステムコール(ですよね?)を使わないプログラムで
お願いしたいのですが・・贅沢言ってすみません。

>>204
特に指定されてないんですが
1 4 7 2
もしくは




みたいにデータが並ぶテキストファイルです。
宜しくお願いします。
問 下のソースを二つのファイルに分割して実行できるようにせよ
です。
#include<stdio.h>
#include<process.h>

static int count;
main()
{
int generation;
for(;;)
{ printf("\n>何代目ですか? ");
scanf("%d",&generation);
count=0;
if ( generation==0 )
exit(1);
pope(generation);
printf("\n関数popeは%d回呼ばれました。",count);
}
}
pope(n)
int n;
{
count++;
if ( n==1 )
printf("ヨハネ ");
else if ( n==2 )
printf("パウロ ");
else pope(n-2),pope(n-1);
}
普段使っているストリーム系ではなく、
意図的に低水準を使ったためにあちこち破綻している>>202
>>205
>特に指定されてないんですが

じゃあ、まずは出力するファイルのファイル形式を自分で設計しる!
話はそれからだ。
>>206
どう考えても、コンパイルが通りそうにないソースだが?
210206:03/05/19 11:06
>209さん
コンパイラでは警告は2つ出ますが(VC++です
エラーはでませんでした。
藻まいらにお願いしまつ。 キーボードから入力した数を1の補数と2の補数として出力するプログラムをCでつくってください
>>210
警告を無視するな。
折角、プログラムの欠点を指摘してくれているんだ。
213206:03/05/19 11:13
問をそのまま写したんですが。
もっとよく見てみます。
214206:03/05/19 11:15
関数が定義されてませんでしたね
再びよろしくお願いします。
二つのファイルに分割して実行せよ です。
#include<stdio.h>
#include<process.h>

static int count;
main()
{
int generation;
for(;;)
{ printf("\n>何代目ですか? ");
scanf("%d",&generation);
count=0;
if ( generation==0 )
exit(1);
pope(generation);
printf("\n関数popeは%d回呼ばれました。",count);
}
}
pope(n)
int n;
{
count++;
if ( n==1 )
printf("ヨハネ ");
else if ( n==2 )
printf("パウロ ");
else pope(n-2),pope(n-1);
}
215206:03/05/19 11:18
うう、3行目の
static int count;
の上に

pope(n);
を追加お願いします
>>206の様なプログラムが教科書で使われてるのか…。
世も末だな…。(;´Д`)
>>201>>205 ほんとオートドックスなやつです。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
int num1[100],num2[100],a;FILE*fp;
srand(time(NULL));for(a=0;a<=99;a++)num1[a]=rand();
if((fp=fopen("hoge","w"))==NULL){puts("fileOpenMiss");exit(1);}
for(a=0;a<=99;a++)fprintf(fp,"%d\n",num1[a]);fclose(fp);
if((fp=fopen("hoge","r"))==NULL){puts("fileOpenMiss");exit(1);}
for(a=0;a<=99;a++)fscanf(fp,"%d",&num2[a]);fclose(fp);
for(a=0;a<=99;a++)printf("%-8d",num2[a]);//確かめるためのもの
printf("改行を押してください 終了します");getchar();return 0;
}
>>211

入力数値の条件(何進数とか何桁とか)ちゃんとかけ
それだけぢゃできるわけなかろ

いや、すまん。ネタだったか。
219206:03/05/19 11:25
はい。
教科書といっても印刷したプリントですが^^;
宜しくお願いします
220211:03/05/19 11:27
すいません。10進数で入力、桁数は4です。
申し訳ないです。
OldStyleを知らない奴はうだうだ言わずに黙ってろ。
>>206
その問題は古い古いスタイルで書かれているのだが、
ほんとうにVCでコンパイルしていいのか?
で、問題の趣旨は、main()とpope()を別のファイルに書くということか?
>>206
[ファイル1]
#include<stdio.h>
#include<process.h>

extern void pope( int n );
int count;

int main( void )
{
  int generation;

  for(;;)
  {
    printf( "\n>何代目ですか? " );
    scanf( "%d", &generation );
    count = 0;
    if( generation==0 )
    {
      exit(1);
    }
    pope( generation );
    printf( "\n関数popeは%d回呼ばれました。", count );
  }
  return 0;
}
>>206
[ファイル2]
#include<stdio.h>
#include<process.h>

extern int count;

void pope( int n )
{
  count++;
  if( n==1 )
  {
    printf("ヨハネ ");
  }
  else
  {
    if( n==2 )
    {
      printf("パウロ ");
    }
    else
    {
      pope(n-2),pope(n-1);
    }
  }
}


後は、それぞれのファイルをコンパイル後、リンクしる!
224206:03/05/19 11:35
二つに分解して実行できるようにせよ。
ですので、まずは別にファイルに書いたあとにmake?ファイルというものを作るみたいです。
おいおい、それならVCはないだろう・・・
226206:03/05/19 11:40
ええと
lsic86です。すみません。
>>206
if系に{}を付けずに2文以上書く方法を初めてみました。
forのは知っていたのですが、同じようにできたんですね。
>>211
// 入力部分はしらね、ビット幅もしらね
// 補数を2進表示しろとも書かれてないから10進のまま表示
void DispComplement(int number)
{
printf("1's complement is %d\n", ~number);
printf("2's complement is %d\n", -number);
}
>>227
そんなつまらん書き方真似するなよ。
普通にブロック化した方が読みやすいしメンテナンス性も高いからな。
>>229
禿同
>>224
2行目の接続詞が意味不明です
232227:03/05/19 11:53
>>229>>230
はい、分かりました。
>>206
>>222-223のようにソースを分解し、
makefileはこんな感じに書けばいい。

[makefile]
pope.exe: pope1.obj pope2.obj
 lcc -o pope.exe pope1.obj pope2.obj

但し、スタイルも古ければlsicローカルなmakefileなので
実務では殆ど役に立たないので覚悟しておくように。
>>206
何をするコードなの?意味が判りません。
>2つのファイルに分割
.Cファイルと、.hファイルに分けて書くのではダメ?
235206:03/05/19 11:56
>231さん
すみません
224の上の行はプリントに書いてあった事です。
見づらくてすみません。
>>234
>何をするコードなの?意味が判りません。

コンパイル・リンクし、実行してみれ!
237234:03/05/19 12:04
>>236
実行はしてみたのですが、コードの通り再帰して文字列が表示されるだけで。
なんかのゲームなんですか?
238206:03/05/19 12:05
>233さん
ありがとうございます。
先生もそう言ってた様な気がします。
>234さん
昔のエロイ人は、自分の名前を歴代の偉い人の名前を組み合わせた例があったようです。


objファイルはコマンドプロンプトでどう入力すれば作れますか?
>>211

入力数値(負の値)を補数表示するならこれでいいかな

#include <stdio.h>

int main(void)
{
int x;
scanf("%d",&x);
printf("1の補数:%d\n",x+9999);
printf("2の補数:%d\n",x+10000);
return 0;
}

入力数値(正の値)の補数をとる、ってことなら、多少変更してくらはい
240234:03/05/19 12:10
>>238 なるほど、分かりました。ありがとう。
>>206
>make: Don't know how to make pope1.obj
とエラーが出たなら、
pope1.obj: pope1.c
lcc -c -o pope1.obj pope1.c
をmakefileに追加。

それにしても、承知でそんな授業やってるのか・・・
243デフォルトの名無しさん:03/05/19 12:23
プログラムをC言語で作成し、
小さい方から順に1000番目、2000番目、…、100,000番目まで、
1000番目ごとの素数を表示しなさい。
また、これら100個の素数の和を表示しなさい。
配列を使わないで、解いていただきたいのですがお願いします
244206:03/05/19 12:26
>241さん
エラーの内容は
C:\>make
make: makefile 2: missing ':' after ' lcc'
でした
>>206
makefileの書き方を勉強しろ。
取り敢えず、lccの左側はハードタブだ。
>>243
まずは素数の判定方法を勉強しる!
247206:03/05/19 12:45
>206さん
タブ理解しました。ありがとうございます。
今度は

C:\>make
lcc -o pope.exe pope1.obj pope2.obj
lld @link.i
Unknown record type = 0x4C
pope1.obj+0x3: Invalid object module: Unknown record
**** Error 1

と出ました(TT
248206:03/05/19 12:46
うあ
×>206さん
○>244さんです
249206:03/05/19 12:55
あ、できたっぽいです。
みなさんありがとうございました
vcで作った.objが残ってない?

それでも不明なら、.objと.exeを削除した後でmakeしてそのログを全部晒してみて。
あぅぅ(><)
252206:03/05/19 13:07
>250さん
えっとbcで残ったobjが同じディレクトリにあるとエラーが起きたみたいです^^;
pope1.c
pope2.c
makefile
の3つでmakeするとエラーありませんでした。
どうもありがとう
>>243

#include <stdio.h>
#include <math.h>

int IsPrime( int n ) {
    int max = (int)sqrt(n);
    int i = 2;
    while( i <= max && n % i != 0 )
        i++;
    return max < i;
}

int main( int argc, char** argv ) {
    int i = 2;
    int count = 0, sum = 0;
    while( count <= 100000 ) {
        if( IsPrime(i) ) {
            if( ++count % 1000 == 0 ) {
                printf( "prime[%d] : %d\n", count, i );
                sum += i;
            }
        }
        i++;
    }
    printf( "%d\n", sum );
}

「配列を使わない」って、「エラトステネスのふるいを使うな」か?
であれば、これでいいはず。
( 検算はして無いから、大ポカやってる可能性もあり。 )
intで収まる範囲か心配してしまう・・・
>>254
同じく・・・怖い。
素数定理 π(x) = x/log(x) は小さなxに対しても割と良い近似を与えるのだから
10万程度なら余裕でしょ
>>253
√の切捨てまで調べればそれでいいとは知らんかった。その値まで調べてたので
えらい時間がかかった。両方ともちゃんと同じ結果になりますね。中卒の弱点かな。
>>254-256
サイズは大丈夫でしたね。1299709までなので余裕です。
>>254-255
んじゃ
「while( count <= 100000 ) {」

「while( count <= 100000 && i < INT_MAX - 1 ) {」
とでもしとけばよろし。

( つーか、INT_MAXぎりぎりのコードなんて書いたこと無いから、
 普通どう書くのかは知らないけど。)
てか、intなんて32bit前提でコード書いてもいいんじゃない?
>>197
最近何年か閏秒がない年が続いてて、最長記録だそうな。
261デフォルトの名無しさん:03/05/19 16:51
243です。
>>253のかたありがとうございました。
スーパー助かりました。
262デフォルトの名無しさん:03/05/19 17:12
すいませんが質問です。
再帰的な関数を用いるプログラムと、main内でfor文を使って処理をするプログラムの2つを作りました。
実行結果はまったく同じです。
それでも実行時間には雲泥の差があります。
再帰的な関数を用いると、240秒かかったの対して、そうでない場合は、1秒未満でした。
再帰的な関数を用いると、こうも時間がかかってしまうのがなぜですか?
>>262
無駄なところで再帰を使ってんだろ

適材適所 by DIO
264デフォルトの名無しさん:03/05/19 17:36
>>263
そうなんですか?
やったのはフィボナッチ数列を求めるプログラムなんですが、
定義通りに考えると、再帰関数を使った方がアルゴリズム的にも優れていると思ってたんですが。
>>264
アルゴリズム的に優れてないから遅いんじゃないのか?
もしくは再帰の使い方を少々間違ってるとか。
266デフォルトの名無しさん:03/05/19 17:37
>>262
関数のオーバーヘッド。
ようするに、関数を呼ぶのに時間がかかる。
(なぜか、この「呼ぶ」という言い方に疑問を
 感じるのは俺だけか?)
267デフォルトの名無しさん:03/05/19 17:41
>>266
調べてみます。
ちなみにソースはこんなかんじです。

int fib(int n)
{
if(n == 1)return 1;
if(n == 2)return 2;

return fib(n - 1) + fib(n -2);
}

で、再帰を使わない方が
for(i = 0 ; i < 45 ; i++)
{
data[i] = a + b;

printf("%d : %d\n",i + 1,data[i]);

b += a;
a = b - a;

}

intの限界まで出してます。
>>266
「呼ぶ」って用語は'call'の日本語訳だよね?
「呼ぶ」と訳さないとすればどう訳したらいいだろう?
269266:03/05/19 17:46
>>266に追加。
メモリも大量消費だって。
そこまでは、知らんかった。
てか、関数ばかり作って、
main()内を軽くするのはおかしい。よく、参考書が
そんな感じだからって。
270デフォルトの名無しさん:03/05/19 17:49
>>269
main内はごちゃごちゃさせない方が
いいと思うが
271266:03/05/19 17:52
>>268
(電話を)かける。
272266:03/05/19 17:56
>>270
けど、1回しか呼ばない関数(main抜き)書くのは
無駄なような気がする。
>>266
そんなことに疑問を持つようでは見込みないね。
二分探索を再帰使って書く人がいるけれど、あれは無駄だな。
クイックソートと違ってループですっきりとかけるし。
275266:03/05/19 18:00
>>273
けど、プログラマにとって
mainから「呼ぶ」と
処理が「呼ばれた」の
どっちが重大かは、かなり意味があるぞ。

再起なんて時間の無駄。ラベルとgotoですべてかける。
>>272
そんなことに疑問を持つようでは見込みないね。
main()内を軽くするのはいろんな理由で僅かな呼び出しコストに勝るメリットがある。
それを無視して単純にmake()を肥大化させるのはナンセンス。

まぁ、細かい関数に分けすぎるコストは確かにあるので、
そんなときはC++でインラインにでもしてしまえばいいと。
279デフォルトの名無しさん:03/05/19 18:51
>>278
make()...
コンパイルでもするのか?
>>279
ageでネタはやめてくださいです。。。
あはは、main()だね。
282デフォルトの名無しさん:03/05/19 19:07
ふと、思ったがCのマクロ定義は
いくらなんでも使いずらいと思わない?
C++のインラインは楽勝なのに
どこが使いづらいんだ・・・・
>>267
f(n) → f(n-1) + f(n-2) → f(n-2) + f(n-3) + f(n-3) + f(n-4)
という具合にf(n-2)やf(n-3)などを複数回評価してしまうため遅くなる。
285282:03/05/19 19:14
>>283
なにかとエラーが出やすい。
286デフォルトの名無しさん:03/05/19 19:17
>>284
DYNAMIC PROGRAMMING
287デフォルトの名無しさん:03/05/19 19:20
DYNABOOK PROGRAMMING
288デフォルトの名無しさん:03/05/19 19:21
>>287
死ね
289デフォルトの名無しさん:03/05/19 19:24
>>288
ネタスレは嫌いか?
悪かった。これからはここでふざけない。
>>282
違うものを同じ土俵で較べても意味ないだろ?
C++のインラインにできなくてCプリプロセッサのマクロでできることだってあるんだから。
#大抵は、それ以上にテンプレートを使って綺麗に実装できるけどそれは別の話。

>>267
綺麗なアルゴリズムが速い実装とは限らないってことですねぇ。
ダイ ダイ ダイ ダイ ダイナマン
>>289
中途半端なのが許せなかった。
>>267
結果は同じでもアルゴリズムは等価じゃないだろ。
294デフォルトの名無しさん :03/05/19 20:05
c言語プログラムで
forを使って、配列を使わずに、2〜100までの素数を全て出力する
プログラムと
作成したプログラムで指定した数をnとしたとき、プログラムでどのくらい繰り返しが
行われるか、というのはどのように考えればよいのでしょうか?
適当な仮定をおいて、繰り返し回数をnの関数で与えるでしていこうと
おもってるのですけど、わかりません。

お願いします。
2〜100までなら素数を調べてputsで表示すればいいのでは。
puts("2 3 5 7...");
296デフォルトの名無しさん:03/05/19 20:11
<<294
1つ目はこのスレッド内の素数求めるやつ探せ。
あるはず。
2つ目はnと繰り返し回数の関連がわからん。
ましてや、nの関数ってなんじゃ?
297デフォルトの名無しさん:03/05/19 20:14
ばくはつー ばくはつー
>>296
禿しく意訳すると、自然数nまでの素数を求める関数p(n)の計算量ではないかと思われ。
素数計算の方法によるんじゃない。
エラトステネスのふるいを使う場合と、それぞれの数字に対してその数までの全ての数で割れないかみたいな判定する場合じゃ
計算量が全然違うし
「配列を使わず」ってんだから、ふるいは使うなってことだろう。
301デフォルトの名無しさん:03/05/19 20:45
294を書き直しします。
わかりにくくてすいません。

forを使って(たとえ配列を知っててもつかわずに)、ある指定した数以下の素数を全て
出力するプログラムを作成しなさい。
また、作成したプログラムで指定した数をnとしたとき、プログラムでどのくらい繰り返しが
行われるを考察する
ということです。

よろしくお願いします
まあ、普通の人間が作るなら、こんな感じか?
マジックナンバーすまん

#include <stdio.h>

int isPrime(int number){
int i;
int m;
if(number <2) return 0;
m=(int)sqrt((int)number);
for(i=2;i<=m;i++){
if( (number % i) ==0 ) return 0;
}
return 1;
}

int main(){
int i;
for(i=0;i<100;i++){
if(isPrime(i)) printf("%d ",i);
}
}
おう、301を見て、わかった。
mainのところにint max;fscanf("%d",&max);を入れて、
for文の範囲を変えてくれ。

最悪の計算量なら簡単にでるんだが。
isPrimeを用いて、nが素数か判定するのに必要な計算量はO(n^0.5)、
これをmax個まで計算するならO(max*n^0.5)

理由:nが合成数(だっけ?)の場合、その約数の最大値は(n^0.5)となり、
n^0.5以上の数値をチェックしても意味が無いので。
304デフォルトの名無しさん:03/05/19 20:56
キーボードから入力した文字列を反転させて表示するプログラムを作成せよ。
>>304
過去レスにまったく同じ質問が山ほどある。今の流行かよ!
>>305
しかも無駄に色んな制限つけるのな。
一番効率いい方法を教えるべきだと思うんだがなぁ
307デフォルトの名無しさん:03/05/19 21:03
>>305
同じ学校の課題であること必死。
308デフォルトの名無しさん:03/05/19 21:14
>>301 302
ありがとうございます。
それと、isPrimeを使わずにできませんか?
isPrimeをまだ習ってないので。。。

何度もすいません。
そりゃ自分で定義した関数なんだから習うはずが無い
>>308

309のそりゃ自分で定義した関数なんだから習うはずが無い

のとおりです。もし、自作関数も習ってないならこんな風かな?

----
#include <stdio.h>

int main(){
int i,j;
int max;
int ccount=0;
int m;

scanf("%d",&max);
ccount=0;

for(i=2;i<=max;i++){
m=(int)sqrt((double)i);
for(j=2;j<=m;j++){
ccount++;
if( (i % j) ==0 ) break;
}
printf("%d ",i);
}

printf("素数を求める数:%d 計算回数:%d",max ,ccount);
}

311デフォルトの名無しさん:03/05/19 21:31
2角取りのゲームを自動で解くアルゴリズムってどんなの?
今のところ総当りしかおもいつかない、、
312デフォルトの名無しさん:03/05/19 21:42
310>>
ありがとうございます。
さっそく、やってみようと思います。
>>311
とっさに思いついた一例。
一手目の状態では、取れる牌のペアは結構限定できる筈。
二手目以降は、前の手で取られた牌によって開かれるルートをチェックすればいい。
314r:03/05/19 23:08
>>304
まだ見つけてなかったら。これを。
#include <stdio.h>
#include <string.h>
#define MAX 100
int main( int argc, char** argv ) {
    int i;
    char buf[ MAX + 1 ], rev[ MAX + 1 ];
    while( fgets( buf, 100, stdin ), strncmp( buf, "quit", 4
) != 0 ) {
        for( i = strlen( buf ) - 1; 0 <=
i; i-- )
            putchar(
buf[i] );
        putchar('\n');
    }
}
315r:03/05/19 23:10
>>313
直前の操作で開かれたルートのチェックってすごい大変な気がする....
316r:03/05/19 23:14
>>314
revって使ってないなぁ....
変なとこで改行入っちゃってるし。
317デフォルトの名無しさん:03/05/20 00:55
大小の2整数を入力して、その間に存在する11で割りきれる整数を全て表示するプログラム
for文で書くそうです

for文の使い方がいまいちよくわかってないので書けないです
よろしくお願いします。。。
>>317
#include <stdio.h>

int main()
{
int x,y,t;

scanf("%d %d",&x,&y);
if(x>y)
t=x,x=y,y=t;
for(;x<=y;x++)
if(!(x%11))
printf("%d\n",x);

return 0;
}
319r:03/05/20 01:09
>>318
まけた。
でも漏れもうpして見る。

>>317
#include <stdio.h>
#include <stdlib.h>
int main( int argc, const char** argv ) {
    if( argc < 3 ) {
        printf("usage: %s begin_number e
nd_number\n", argv[0] );
        return -1;
    }
    int i, limit = atoi( argv[2] );
    for( i = atoi( argv[1] ); i < limit; i++ ) {
        if( i % 11 == 0 )
            printf("
%d\n", i );
    }
    return 0;
}
>>317

#include <stdio.h>

int main()
{
 int i,tmp,min,max;
 scanf("%d %d",&min,&max);
 if( min>max ) {
  tmp = min;
  min = max;
  max = tmp;
 }

 for( i=min+1; i<max; i++ ) {
  if( (i % 11) == 0 )
   printf("%d\n",i);
 }
}
ハァ?

#include <iostream>
int main()
{
 int min,max;
 if( std::cin >> min >> max )
 {
  if( max < min ) std::swap( min , max );
  for( int i = min - ( min % 11 ) + 11 ; i < max ; i += 11 )
   std::cout << i << std::endl;
 }
}
322r:03/05/20 01:16
>>321
そうか.... 「i += 11」なんだね....
気付かなかった鬱....
.cpp:7: `::swap' undeclared (first use here)
かがくセンタい
>>323
およー。通っちまってたよ。
#include <algorithm> が足りねーな。
326デフォルトの名無しさん:03/05/20 02:17
>313 315
むちゃくちゃ 処理時間かかる上に無限ループにはまるのよ。。。
総当たりでいいんじゃない?
濡れもそんな希ガス
まぁ、裏付けはなく感覚的にそう思っただけだが
329むん:03/05/20 03:35
あのぅ。先日カキコんでた者です。
内容をまた書くと、
『「PGM形式画像を読み込み、回転・白黒反転等の処理をして、再びPGM形式で出力するプログラムを作れ」
という課題をやっているのですが、さっっぱりわかりませぬ。
まったくのC++初心者・2ちゃん初心者です。
メモリ領域を動的に(new・deleteを使って)確保せよ。という補足付き』
です。
PGMファイルには、最初に「P2」とあって、
「476 618」と書いてあるのが用意する配列のデカさかと。
あとはいっぱい数字が並んでました。ファイル名は「sample.pgm」です。
投稿時間:2003/05/18(Sun) 20:52
投稿者名:ぼんど
URL :
タイトル:Re^4: PGMファイル読み込み・処理・出力

ありがとうございます。
参考に、頑張ってみます。
>>329
誰だか回答してくれていたと思うけど。
>>329
PGM画像フォーマットには、先頭2文字が'P2'のものと'P5'のものがあるので要注意。
すみません。教えてください。
コマンドライン引数について。
main関数の引数(int argc, char* argv[])の
argvは、コマンドラインに入力された文字列を
指すポインタの配列(の先頭アドレス)を受けとる、
というのは理解できましたが、ファイル名を読みこむには
どうしたらいいのでしょうか?画像ファイル(filename.ppm)
を読みこもうとしましたが、a.out filename.ppm
としてもなんの反応もなかったのですが、、。
自分が作ったプログラムの一部です。

int getint(fp)
FILE *fp;
{
int c, i, firstchar;

(略)}

int main(argc, argv)
int argc;
char **argv;
{
extern XImage *create_image();
int i,n;
char label[100];
char buf[30], *filename;
FILE *fp;
filename = argv[1];
334デフォルトの名無しさん:03/05/20 06:01
>>333
今時そんな古い関数の書き方をするなよ・・・・

a.out filename.ppmとして起動すればfilenameは"filename.ppm"を指してくれるはずだよ。
別のところだと思うよ。
なにか反応するコードを書けば良いのでは
>>333
int main(argc, argv)
int argc;
char **argv;
{
extern XImage *create_image();

マタークスキルのない濡れにはこの辺がさっぱり理解できんが
ここは突っ込みどころなのか?

それにしてもpgmとはな・・・濡れも課題でやったばかりだな。
pgm形式大流行ですか
>>337
int main(int argc,char **argv)
{

これの古い書き方。
>>333
printf("%s\n",argv[1]);
でも入れてみてfilename.ppmがきちんと表示されれば、
argvが問題じゃないことはわかる。
>>338
なるほど、理解した
341333:03/05/20 07:15
>>334>>335>>336>>337>>338>>339
皆様ありがとうございました。
アドバイスにしたがってもうちょっとがんばってみます。
pnm(ppm,pgm,pbmの総称)って、標準でもコンバータがあるくらいなんだから
展開するソースなんて結構転がってるんじゃないのか?
それを参考にすれば簡単だろうに。
(1)
int sum(int x)
{
if (x<10) return x;
return x%10 + sum(x/10);
}

(2)
int gcd(int x,int y)
{
if (y==0) return x;
else return gcd(y, x%y);
}

関数(1)(2)を再帰を使わずに書く方法をお願いします
344r:03/05/20 09:55
>>343
(1)
#include <stdio.h>
int sum( int x ) { // 元
    if( x < 10 ) return x;
    return x % 10 + sum( x / 10 );
}
int sum_loop( int x ) { // 素直にループ展開
    int s = 0, cont = 1;
    while( cont ) {
        if( x < 10 ) {
            s += x;
            cont = 0;
        } else {
            s += x % 10;
            x /= 10;
        }
    }
    return s;
}
int sum_loop_opt( int x ) { // 完成
    int s = 0;
    while( 0 < x ) {
        s += x % 10;
        x /= 10;
    }
    return s;
}
あるクラスに高度な機能を持たせることによって、そのクラスの呼出元が生成した別の
インスタンスと処理内容が重なる場合のコーディングについてアドバイスなど頂けない
でしょうか。あまりC++は得意ではないのと、長文にご容赦を。

HTTPのサーバを想定してみてください。
まずクライアントから送られてくる要求は、read()?などでバッファに受け、その後
バッファ中のデータがどんなヘッダなのか解析しますね。

ヘッダ解析は逐次トークンを取得する処理を呼び出して解析に掛けるものとします。
ここでHTTPを処理するクラスをCHttp、ネット関連のI/O全体を統括するクラスをCNetIO、
トークンを処理するクラスをCTokenとでもしましょう。

仮にURLが冗長だったりして、トークン処理クラスが参照しているバッファ中のアドレス
が、バッファの領域からはみ出そうとしたとします。
このとき、トークン処理クラスは即時にエラーを返さず、read()関数など呼び出して後
のデータが来ていないかどうかタイムアウトするまで待つものとします。つまり、CToken
をエラーが起きるかあるいはCRが2つ来るまで、細切れになってやってくるパケット
を自動的に継ぎ足す処理をして適切にトークンを返すような便利なクラスにしたいのです。

で、この高機能?なCTokenですが、IO機能がダブっているようであまり美しくない?気も
します。CTokenを設計するにあたり、次の2案のどちらが妥当なのでしょうか。

案1:
CHttpで生成されたCNetIOのインスタンスへのポインタをCTokenのインスタンス生成時に
引き渡してやればCTokenはCNetIOの機能を呼び出せるから、そうせよ。

案2:
プログラム的に同じ機能のルーチン(CNetIO)を別々のクラスで各々生成するのは美しくない。
CTokenはバッファの最後に到達したら適切にエラーを返し、それ以上の処理はやめるような
簡単な機能にとどめるべきだ。継ぎ足し処理はCHttp内で行え。
>>345
案1がいいと思われ。
トークンといっても、リクエストラインとヘッダとボディを読む作法は
エンコードなどからして違うのでIOやトークンを抽象した機能単位は
あまりうまくいかない気が。例えばリクエストラインは改行が CR LF では
ない場合がある(HTTP 0.9)し、HTTPSではヘッダやボディは平文ではない。
手短に説明できることではないから実際にHTTPサーバを書こうとしているなら、
Java の Tomcat とか Ruby の WEBrick とかのソースを読むことを勧める。
347r:03/05/20 13:00
>>345
なんかCの人っぽいなぁ。しかも熟練の。
「IO機能がダブってるようであまり美しくない」という感覚を信じればいいと思います。

次のようなクラスを作ると、きっと気持ち悪さが解消されるでしょう。
CReaderクラス:
 パケットの受信を常にポーリングし続け、
 受信したパケットを解析し、一つのCTokenを構成するのに足る分の
 データを受け取ったら、CTokenのインスタンスを生成する
 生成したCTokenのインスタンスは、CHttpに渡す。

これにより、CHttpで処理されるすべてのCTokenは
継ぎ足しの処理など無くても完全な情報を持ちえます。
>>346>>347 レスありがとうございます。C(Linux)では既にHTTPサーバを書き上げています。

トークン取得ルーチン内で%xxxエンコードの対応、CRLFの処理、セパレータの
種類による切り出し単位指定、バッファ溢れの監視など一手に引き受けています。
で、これらをVC++に移植したいのですが、なんせC++経験が乏しいので作法がわか
りませんでした。

まずトークンを処理する速度を稼ぐためにまずバッファに可能なだけ受け、それをえっちら
おっちら解析すればいいだろう、という考えがありました。だから必要なトークンが溜まる
まで待つ、というのは若干無駄があるかな、と思っていたのですが、ちょっと検討してみます。

蛇足ですが、C++という枠からはみ出ますが、Cのread()を使えば、ファイル記述子の違いだけで
ファイルであろうがネットであろうが、標準入力だろうが、同じルーチンでトークンの処理ができて
こりゃ便利!ということになりますね。ちょっと欲張り過ぎかもしれませんが…。
(1)
int sum(int x)
{
int s = x;
while (x>=10) {s += x%10; x /= 10;}
return s;
}

(2)
int gcd(int x,int y)
{
while (y != 0) { int tmp = x % y; x = y; y = tmp; }
return x;
}
350デフォルトの名無しさん:03/05/20 17:48
310のプログラムを実際に100を入力し実行してみたところ、2〜100までのすべての
数が出力されました。
素数のみを出すのみはどうすればいいですか?
351r:03/05/20 18:19
printf("%d ",i);

if( m < j ) printf( "%d ", i );
に変更してみたらどうでしょう?
# 未確認だけど...
352デフォルトの名無しさん:03/05/20 19:34
回転シフトのアルゴリズム教えてください。
10110011が01100111のようになるやつです。
おねがいします。
353デフォルトの名無しさん:03/05/20 19:40
バッファリング無しをやりたいんだけど、
(y/nが入力されたら次の処理に進みたい)

setvbuf(stdin, NULL, _IONBF, 0);
char c = getchar();

↑で結局バッファリングされるのは、
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/stdin.3.html
>ただし stdin が端末に接続されているときは、端末のドライバでバッファリング
>されている可能性があることにも注意すること。これは stdio のバッファリング
>とは全く関係なく存在しうる。 (実際、通常だと端末入力はカーネルによって
>行単位でバッファリングされている。)

とかいう事情なんでしょうか。
>>353 そう。UNIXではcursesライブラリを使うかPTYを操作するのが定石。
Stevens「詳解UNIXプログラミング」などを参照。
ttp://www.catnet.ne.jp/kouno/c_faq/c19.html も参照。
>>352
unsigned char rotate_left(unsigned char data) {
  unsigned char bit;
  bit = ((data & 0x80) == 0x00)? 0x00 : 0x01;
  return (data << 1) | bit;
}
356デフォルトの名無しさん:03/05/20 20:00
>>351
10〜100までの数字がすべて出てきました。
357デフォルトの名無しさん:03/05/20 20:01
>>355
ありがとうです。
>>352
#include <limits.h>

char c;

(c<<1)|(c>>(CHAR_BIT-1))
359デフォルトの名無しさん:03/05/20 20:06
C++でメール送受信ソフトを作りたいんですけど
どうやったらいいですか?

機能としては、
別ファイルから送信アドレス、本文、などを読み込んで送信。
受信したアドレス、件名、本文を別ファイルに保存。

こんな機能のソフトをつくりたいんですけど。

何から作成したらいいのかさっぱし
どなたか助けてください。
メールコンポーネントを貼って終了、ハイ次!
>>359
こういうスレがあるみたいだから、一通り読んでみては。

2ちゃんねる発メーラー作成スレ
http://pc2.2ch.net/test/read.cgi/tech/1027162682/
>>359
メールソフトのソースを探してきて研究しろ。
363r:03/05/20 20:21
>>356
ほんとか?こうだぞ?

#include <stdio.h>

int main(){
    int i,j;
    int max;
    int ccount=0;
    int m;

    scanf("%d",&max);
    ccount=0;

    for(i=2;i<=max;i++){
        m=(int)sqrt((double)i);
        for(j=2;j<=m;j++){
            ccount++;
            if( (i % j) ==0 ) break;
        }
        if( m < j ) printf("%d ",i);
    }
    printf("max:%d ccount:%d",max ,ccount);
}
364あふぉ:03/05/20 20:29
main関数から呼び出される次のような関数を作りたいのですがちょっと意味がわからないので
お願いします。

 整数の引数を1個だけ持ち、引数の値が直前に呼び出されたときの引数の値と等しければ1、
等しくなければ0を値として返す


>>350 もう一杯載っていると思うけど。
#include <stdio.h>
#include <math.h>
#define CHECK_MAX 100//調べる素数の範囲
int CheckSosuu(int num)
{
int i,root;
root=(int)sqrt((double)num);//素数か求める値の平方根(切捨て)まで調べればよいのでルート化する (int)(double)はキャスト。難しい場合は警告消しに付けると考える
if(num<=1)return 0;//1以下は素数ではない
for(i=2;i<=root;i++)//平方根まで繰り返す
if(num%i==0)return 0;//割ることができる数があると言うことは素数ではない
return 1;//上の処理で素数で無く無い事が分かったので素数である
}
int main(void)
{
int i;
for(i=0;i<=CHECK_MAX;i++)//調べる範囲まで繰り返す
if(CheckSosuu(i))printf("%d\n",i);//関数に渡して調べる 関数が素数であると判断した時表示する ifに==0等が無い時は!=0が付け加えられる
getchar();return 0;
}
>>364 こう?
#include <stdio.h>
int Kansuu(int num)
{
static int keep;int rtn;
if(keep==num)rtn=1;else rtn=0;
keep=num;
return rtn;
}
int main(void)
{
const char str[2][5]={"違う","同じ"};
printf("%s\n",str[Kansuu(1)]);
printf("%s\n",str[Kansuu(2)]);
printf("%s\n",str[Kansuu(2)]);
printf("%s\n",str[Kansuu(1)]);
return 0;
}
367あふぉ:03/05/20 20:49
>>366
どうもです
参照させてもらってます
368r:03/05/20 20:51
>>366
初回の呼び出しが問題だけどね。
369あふぉ:03/05/20 20:53
>>366
なにぶんCをはじめて日が浅いもので、
解説おながいします
前回呼び出し時の値と比べるのだから、staticな変数が必要。それだけ。
371r:03/05/20 20:56
>>366-367
漏れ版

#include <stdio.h>

int func( int n ) {
    static int first = 1, prev;
    int r = ! first && prev == n;
    prev = n;
    first = 0;
    return r;
}

int main( int argc, const char** argv ) {
    int i;
    for( i = 1; i < argc; i++ ) {
        const int n = atoi( argv[i] );
        printf("%d : %s\n", n, func( n ) ? "same" : "diff");
    }
}

    
372366:03/05/20 20:56
>>368>>369
うん。始めは値が与えられてないからね。staticのカウンタを作って
初回のみ絶対0を返すとかを加えればいいかも。
373あふぉ:03/05/20 20:58
const char str[2][5]={"違う","同じ"};
printf("%s\n",str[Kansuu(1)]);
printf("%s\n",str[Kansuu(2)]);
printf("%s\n",str[Kansuu(2)]);
printf("%s\n",str[Kansuu(1)]);
の部分が分かりません
>>373
関数の戻り値を配列の添え字にしているだけ
375あふぉ:03/05/20 21:00
>>371
どうもです
>>371
stdlib.hは?
377デフォルトの名無しさん:03/05/20 21:02
363、365>>
解説付でありがとうございます。
できました。
378366:03/05/20 21:02
>>373
どこまで分からないか分からないけど。0を返す場合はstr[Kansuu()]は
str[0]となる。str[0]は"違う"の事だから、printfによって"違う"と
表示される。
379動画直リン:03/05/20 21:11
380379:03/05/20 21:11
381あふぉ:03/05/20 21:14
>>378
なるほど
サンクス!!
382デフォルトの名無しさん:03/05/20 21:29
ランダムに生成した1000個の整数を配列に入れ、昇順にソートしてから順番に表示せよ。
#include <iostream>
#include <iterator>
#include <algorithm>
#include <cstdlib>
int main()
{
int v[100];
std::generate_n(v, 100, rand);
std::sort(v, v+100);
std::copy(v, v+100, std::ostream_iterator<int>(std::cout, "\n"));
return 0;
}
>>350
スマン、間違えてた。修正版はこちら。

#include <stdio.h>

int main(){
int i,j;
int max;
int ccount=0;
int m;
int flag;

scanf("%d",&max);
ccount=0;

for(i=2;i<=max;i++){
flag=1;
m=(int)sqrt((double)i);
for(j=2;j<=m;j++){
ccount++;
if( (i % j) ==0 ) flag=0;;
}
if(flag == 1){
printf("%d ",i);
}
}
printf("\n");

printf("素数を求める数:%d 計算回数:%d",max ,ccount);
}

352やってみるか。
8桁でいいの?
386386:03/05/20 23:08
整数型変数yに西暦年(例えばy=2003)の値が入っているとき、
その年がうるう年なら1(真)を、うるう年なら0(偽)を返すような
式を条件演算子?:を使って書きなさい。ただし、うるう年は4で割り
切れ、かつ100では割り切れない年であるが、400で割り切れる場合
もうるう年となる

お願いします
>>382 こんなのでいいのかな。1000回分は1画面に表示しきれないから、工夫してみて。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define SIZE 10
int main(void)
{
int data[SIZE];int i,n,keep;
srand(time(NULL));for(i=0;i<SIZE;i++)data[i]=rand();//ランダム生成
for(i=0;i<SIZE;i++)printf("data[%d]==%d\n",i,data[i]);//before
for(i=0;i<SIZE-1;i++)for(n=0;n<SIZE-1;n++)//繰り返す回数は全て降順に並んでいると一番必要になるが、その最大の回数に合わせてある
if(data[n]<data[n+1])//配列の後ろのほうが大きい時
{keep=data[n];data[n]=data[n+1];data[n+1]=keep;}//両方の値を入れ替える
for(i=0;i<SIZE;i++)printf("data[%d]==%d\n",i,data[i]);//after
getchar();return 0;
}
388デフォルトの名無しさん:03/05/20 23:12
C++でお願いします。
画像処理なんですけど

画像の左下と右上の隅を結んだ線分を考え
、この線分よりも下の三角形の領域を
ねずみ色(RGB成分の輝度地128)にした画像を生成する

という問題なんですけど、お願いします

389387:03/05/20 23:14
>>387
//繰り返す回数は全て降順に並んでいると一番必要になるが、その最大の回数に合わせてある
このコメント間違ってました。多分、大小がバラバラの時のほうが、回数が多いです。
「A*アルゴリズムによる探索を実行できるプログラムをCで作れ」
という課題が出されたんですけど、どうやって作っていいかまったくわかりません
391r:03/05/20 23:17
>>386

#include <stdio.h>
#include <stdlib.h>

int IsURU( int year ) {
&nsbp;&nsbp;&nsbp;&nsbp;return ( year % 4 == 0 && year % 100 != 0 )
&nsbp;&nsbp;&nsbp;&nsbp;&nsbp;&nsbp;&nsbp;&nsbp;|| ( year % 400 == 0 ) ? 1 : 0;
}
int main( int argc, const char** argv ) {
&nsbp;&nsbp;&nsbp;&nsbp;const int year = 1 < argc ? atoi( argv[1] ) : 2003;
&nsbp;&nsbp;&nsbp;&nsbp;printf("%d is %s\n", year, IsURU( year ) ? "uru" : "normal" );
}
392r:03/05/20 23:20
>>391
#include <stdio.h>
#include <stdlib.h>
int IsURU( int year ) {
    return ( year % 4 == 0 && year % 100 != 0 )
        || ( year % 400 == 0 ) ? 1 : 0;
}
int main( int argc, const char** argv ) {
    const int year = 1 < argc ? atoi( argv[1] ) : 2003;
    printf("%d is %s\n", year, IsURU( year ) ? "uru" : "normal" );
}

nbspがnsbpになってた...死のう。
393r:03/05/20 23:24
>>386
IsURU関数のreturn文のとこが、
宿題の解答の式です。
>>352
int rot(int x) {
int tmp = x & (1 << 7);
x ^= tmp;
x <<= 1;
if (tmp) x |= 1; else x &= ~1;
return x;
}
395デフォルトの名無しさん:03/05/20 23:26
以下の三つの課題が出ますた。プログラミングなのに数学や物理の知識が必要で参っています。
それぞれ正しいプログラムとは限らないのですが、例があります。
例をそのまま入力してもエラーになってしまうと思います。

問題A
度数法による角度(単位は度)を引数とする三角関数dsin()、dcos()を作成し、0度から90度まで
5度きざみの正弦関数表、余弦関数表を表示せよ。正弦関数と余弦関数の値は8桁以上で表示せよ。

問題B
以下の関数をフーリエ級数展開し、-2π<x<2πの範囲で第100部分和S100の値を求めよ。
f(x)=
-1(-π<x<0)
0(x=0,π,-π)
1(0<x<π)

問題C
RC直列回路に直流電流Eを加える。このときの過度電流Iを求める関数rci()とコンデンサの
電荷qを求める関数rcq()を作成し、R=1(Ω)、C=1(F)、E=1(V)のときの時間変化を求めよ。

プログラム例
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1027870433&res=66
396デフォルトの名無しさん:03/05/20 23:27
(*`▽´*)うひょうひょ
http://jbbs.shitaraba.com/computer/2364/
例に出てるやつは実行して確認したのか?
double dsin(int deg);
やね。
>>397
問題Aは確認しました。for文の辺りでエラーが出てしまうようです。
正確に写したつもりではあるのですが・・・。
printf("%3d%8f%8f\n",deg,dsin(deg),dcos(deg));
401r:03/05/20 23:41
>>395
(1)
#include <stdio.h>
#include <math.h>
#define PI 3.141592
double dsin( int r ) {
    return sin( (double)r / 360 * 2 * PI );
}
int main( int argc, const char** argv ) {
    int i;
    for( i = 0; i <= 90; i+= 5 )
        printf( "%lf\n",dsin( i ) );
}
dcosは、自分でつくりねぇ。
402デフォルトの名無しさん:03/05/20 23:45
>>358>>394
ありがとうです。いろんなパターンがあって面白いですね。
403r:03/05/20 23:49
>>395
あ、すでにサンプルコードがあったのかぁ...........
>>402
>>358 は一度動作確認した方がいいかも…
405デフォルトの名無しさん:03/05/20 23:59
>>404
了解ですv
407デフォルトの名無しさん:03/05/21 02:10
Cの宿題でオーダー計算の漸化式が解けないんですが、やってくれますか?
408NICE!:03/05/21 02:18
一ヶ月100万円も夢じゃない!
1クリック10円が貰えるリンクスタッフ☆無料登録するだけで1000円貰えます。
更にリンクスタッフに登録してくれた人から25%貰える仕組みです。
仮に1日200件アクセスがあったとします 10円×200×30日=6万円です
リンクスタッフ三人で 100件 200件 300件 クリック数が毎日あったとします。
100件の場合7500円 200件の場合15000円 300件の場合は22500円です。
そうすれば毎月10万円は確実に入ってきます。HPや掲示板で宣伝して
行けば100万円なんかすぐでしょう。詳しくはスタッフ詳細を見てください。
無料簡単登録なので気軽にどうぞ。(フリーアドレスでの登録可)
http://www3.to/happynight
>>388
画像フォーマットがてきとーなのとデバッグをきちんとしてないけどこんな感じ。
void foo(unsigned char* data, int width, int height) {
  int x, y, i;
  for (y = 0; y < height; y++) {
    for (x = 0; x < width; x++) {
      if (y * width > (width - x) * height) {
        cout << y << " " << x << endl;
        for (i = 0; i < 3; i++) {
          data[(y * width + x) * 3 + i] = 128;
        }
      }
    }
  }
}
>>407 どんなの?
何度か考えてやったんだけど、どうしてもコンパイルエラーが…
randomsというファイルにあるランダム数列を昇順に整列し、
その結果をout_randomsというファイルに出力するようなプログラムを作成せよ。
って問題なんだけど、どうでしょうか?
#include <iterator>
#include <vector>
#include <fstream>
#include <algorithm>
int main()
{
 typedef double value_type;
 typedef std::istream_iterator< value_type > istream_iterator;
 typedef std::ostream_iterator< value_type > ostream_iterator;
 std::vector< value_type > randoms;
 std::ifstream in( "randoms" );
 randoms.assign( istream_iterator( in ) , istream_iterator() );
 std::sort( randoms.begin() , randoms.end() );
 std::ofstream out( "out_randoms" );
 std::copy( randoms.begin() , randoms.end() , ostream_iterator( out , "\n" ) );
 return 0;
}
413r:03/05/21 08:17
>>411
コンパイルエラーが出るなら、そのコンパイルエラーに付いてかきこんでくださいな。
414r:03/05/21 08:30
>>395
えっと、(3)は、"exp" って関数を 自然対数の底e にかけてるけど、
それを直せばいいのでは?つまり
「e*exp(x)をpow(e,x)に変更する。」

嘘かも。試してないからなんとも...
>>388
遅レスですが見ていたらどこがどういう風に分からないか教えて。一様やり方は
1、bmpファイルを開く、読み込む(gif等は分からないので)
2、サイズを調べて、○○以上なら色データの所に灰色のを代入
  bmpは下から見ていくことに注意。あと、色数によって処理が違うのが難しい。
3、新しいbmpを作る。
お願いします。
わからないので教えて下さい。

身長を整数値をして読み込んで、
標準体重を実数で表示するプログラムを作成せよ。
標準体重はBMIの(身長×身長)×22によって求め
その小数点以下は。一桁だけ表示すること。

単位は
身長の入力はcmで、計算はmでお願いします。
#include <iostream>
int main()
{
 double cm;
 while( std::cout << "身長(p)?" , std::cin >> cm )
 {
  double const height = cm / 100;
  std::cout << "標準体重(s):" << ( ( height * height ) * 22 ) << std::endl;
 }
 return 0;
}
> 整数値をして読み込んで
> その小数点以下は。一桁だけ表示すること。
あ・・・・
>>416 普通はdouble型とか使うんだろうけど分からないので変な奴。
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char str[BUFSIZ];int i,t;
for(;;)
{
printf("身長は(cm)?");gets(str);
i=atoi(str);
if(i>0)break;
}
t=22*i*i;
printf("理想の体重は%d.%dキログラムです\n",t/10000,t%10000/1000);
return 0;
}
#include <stdlib.h>
#include <stdio.h>
int
main(){
char cm[BUFSIZ];
double height;
if (fprintf(stdrr, "height[cm] = "), fgets(cm, BUFSIZ, stdin)) {
height = atof(cm)/100;
printf("standard weight = %0.1f[kg]\n", height*height*22);
}
return 0;
}
>>419>>420
本当にありがとうございます!!!m(_ _)m
スラスラできてすごいですね…尊敬します
また今度もお願いしたいのでどうぞよろしくお願い致します
微妙に要件を満たしていないだけで>>421に無視られる>>417が哀れだ。
>>388の曖昧な仕様でもそれなりに>>409で解答が出ているのに今一つ頓珍漢な>>415も哀れだ。
>>398に解答が出ているのに全く頓珍漢な>>400も哀れだ。
423415:03/05/21 12:51
>>422
ごめんなさい。ただ、書いてるように仕様が曖昧だから、もしかしたら開く所から
分からないのかなと思って。
>>422
printf("%3d%8f%8f\n",deg,dsin(double deg),dcos(double deg));
が動くとでも言うのか?
>>424
だからと言って、間違いを垂れ流して楽しいか?
何が間違いなの?
427デフォルトの名無しさん:03/05/21 15:24
(x,y,z)=(1,1,1),(2,2,2),(3,3,3)
上の3点を三次元上に点を打て。
この問題やってもらえますか?
三次元上に点を打つデバイスと、それ用のドライバをください
429デフォルトの名無しさん:03/05/21 16:22
>>427
drawPoint( vector3( 1.0f, 1.0f, 1.0f));
drawPoint( vector3( 2.0f, 2.0f, 2.0f));
drawPoint( vector3( 2.0f, 2.0f, 2.0f));
>>427だけで答えが導き出せる>>429は関係者か>>427の授業の教授
431フォルテ:03/05/21 17:29

すいません。このプログラムがうまく動かないので
どなたか手直ししてくださいませんか?
プログラムは100までの素数を表示したいのですが
これだと素数以外の35等の違う数字も表示されてしまいます。
よろしくお願いします。

#include <stdio.h>

int main()
{
num = 2 ;

while( num < 97) {

for (num1 = 2; num1 < num; num1++ ) {

if(num % num1 == 0 ) {



}

}

printf("%d\n" , num ) ;

++num ;
}
return num;

}
432421:03/05/21 17:32
>>422
あなたの言うとおりですね
自分の勝手な解釈をして
>>417>>418さんと<<419さんは同一人物だと思っていたので
無視してしまって本当にごめんなさい
そんなつもりはなかったんです
ありがとうございましたm(_ _)m
numって何?
>>431
そもそもコンパイルが通るのが信じられん。

#include <stdio.h>

int main()
{
int num=2,num1;
bool flag;

while(num<97) {
flag=true;
for(num1=2;(num1*num1)<num;num1++) {
if((num%num1) == 0) {
flag=false;
break;
}
}

if(flag) printf("%d\n",num);
num++;
}

return 0;
}

435フォルテ:03/05/21 17:35
>>433
すいません。関数からコピーしたんで
int num, num1;が抜けてました。
でnumはnumberのことです。
>>430
もしくは、自作自演かだな。
437フォルテ:03/05/21 17:43
>>434
書かれているプログラムがうまくコンパイル
されないのですがどうすればよいですか?
で、何で私が書いたものは違う数字が出ていたのでしょうか?
だれかわかる人教えてください。
438r:03/05/21 17:48
>>437
いいから、>>363 を使え。
>>437
int main()

float main()

440フォルテ:03/05/21 17:52
>>438
多分プログラムが素数のじゃないですよ。
441フォルテ:03/05/21 17:58
すいません。プログラムが一部違ってました。
↓の手直しをお願いします。

#include <stdio.h>

int main()
{int num, num1;

num = 2 ;

while( num < 97) {

for (num1 = 2; num1 < num; num1++ ) {

if(num % num1 == 0 ) {

++num;}

}

printf("%d\n" , num ) ;

++num ;
}
return 0;

}

442フォルテ:03/05/21 17:59
>>439
やってみてもだめみたいでした。
if(num % num1 == 0 ) {

++num;num1 = 1;}
445444:03/05/21 18:09
素数の判定を別関数にしたほうがいい。
446フォルテ:03/05/21 18:15
なんか先生に聞いたら++numがfor文の中に入ってるから
breakやcontinueを使って外に出せっていわれたんですが
そんなこと出来るんですか?
447フォルテ:03/05/21 18:19
>>443
できました。どうもありがとうございます。
他の皆さんもどうもありがとうございました。
やっと宿題が提出できます。
num % num1 == 0
間違ってたら恥ずかしいけど
これって0になるの?
つーか素数のアルゴリズム自体知らんよ。
どーせ定石があるんでしょ?
そっからひっぱってくれば?
449フォルテ:03/05/21 18:26
>>448
多分、素数の数字は0になるやつがあったらだめなんで
何回もインクリメントで割っていってそれがあったら
表示しなくなるようにしました。
で、私はCはじめてまだ1ヶ月でこれは宿題なので
コピーするのはまずかったんです。
>>449
いや除算の商が0になるのは
分子が0の時だけじゃん。
%って何かあるんだっけ?
451フォルテ:03/05/21 18:33
質問なんですが↑のを
for (num1 = 2; num1 < num; num1++ ) {

if(num % num1 == 0 ) {

++num;num1 = 2;}

}
にかえるとうまくいったんですが
forは繰り返すのでnum1 = 2がまた代入されるとおもったのですが
改めてnum = 2を書かないといけないってことはそうじゃないの
ですか?
C言語の宿題なんですが
縦線がX本、横線が入る段がY段あるあみだくじをデータ化し
各ラインの行き先を表示するプログラムを作成せよ。
よろしくお願いします。

453395:03/05/21 18:38
395です。昨日の問題ですが何とか出来ました。が…、さらに問題Cを分割コンパイル
しなければなりません。関数ごとに分割してコンパイルしようとしたのですがコンパイルは
成功しますが結果がおかしな物になってしまいます。どうか知恵をお貸し下さい。

分割前
#include<stdio.h>
#include<math.h>
double r=1;
double c=1;
double e=1;
double rci(double t);
double rcq(double t);
main(void){
double t;
double rci(),rcq();
printf("初期値を設定 \n");
printf("t=0からt=10.0まで0.5秒間隔で、時刻t(sec)、過度電流I(A)、電荷q(c)をひょうじ\n");

for(t=0;t<=10;t+=0.5){
printf("%4.1f %9.6f %9.6f\n",t,rci(t),rcq(t));
}
}
/*過度電流を求める*/
double rci(double t){
return(e*exp(-t/(r*c))/r);
}
/*コンデンサの電流を求める*/
double rcq(double t){
return(c*e*(1-exp(-t/(r*c))));
}
454395:03/05/21 18:39
分割1
/* program3-main.c */
#include<stdio.h>
#include<math.h>
main(void){
double r=1;
double c=1;
double e=1;
double t;
double rci(),rcq();
printf("初期値を設定 \n");
printf("t=0からt=10.0まで0.5秒間隔で、時刻t(sec)、過度電流I(A)、電荷q(c)をひょうじ\n");
for(t=0;t<=10;t+=0.5){
printf("%4.1f %9.6f %9.6f\n",t,rci(r,c,e,t),rcq(r,c,e,t));
}
}
分割2
/* program3-rci.c */
/*過度電流を求める*/
double rci(double r,double c,double e,double t){
return(e*exp(-t/(r*c))/r);
}
分割3
/* program3-rcq.c */
/*コンデンサの電流を求める*/
double rcq(double r,double c,double e,double t){
return(c*e*(1-exp(-t/(r*c))));
}
455フォルテ:03/05/21 18:40
>>450
%にすると余りが計算されて余りが0って事は割り切れる
という意味ですからそれは素数から弾かれるんです。
>>452
むずい。すごいな昨今の学生は。
こんなんやってるの?
何にも考えないなら
x,yの2次元bool配列を確保してfalseで初期化
ランダムでxの奇数ラインを選択して全てtrueに。
偶数ラインはランダムでy座標を選択してtrueに。
後はxの偶数ラインからスタート位置を決めて
上から降りて行くようにしたらいいのでは?
457フォルテ:03/05/21 18:43
それでさっき教えてもらったものを関数化して表示しようと
思ったのですが今度は98が追加されてしまいます。
手直しお願いします。

#include<stdio.h>
int sosuu( int, int) ; /*関数プロトタイプ*/
int main()
{
int num, num1;

printf("%d\n" , sosuu(num, num1)) ;
return 0 ;
}

/*関数:sosuu*/
/*引数:num, num */
/*返値:num*/
/*機能:100までの素数を表示する*/

int sosuu( int num, int num1)
{
num = 2 ;
while( num < 97) {
for (num1 = 2; num1 < num; num1++ ) {
if(num % num1 == 0 ) {
++num;num1 = 2;}
}
printf("%d\n" , num ) ;
++num ;
}
return num;
}
>>455
%って余りが出るんだ。
失礼、使ったことほとんど無いから
マジわかんなかった。
459フォルテ:03/05/21 18:47
>>458
いえいえ。私も最近習ったばっかだから
覚えていただけですよ。
460フォルテ:03/05/21 18:55
関数化もどうにかうまくいきました。
みなさん今までどうもありがとうございます。
461デフォルトの名無しさん:03/05/21 18:56
printf()の中身ってどうなってるんですか?
462r:03/05/21 19:37
>>452
未コンパイル。 1/3

#define LENGTH 100

struct vart_t {
    struct link_t* point[ LENGTH ];
    int number;
};

struct link_t {
    struct vart_t* l;
    struct vart_t* r;
};

struct amida_t {
    struct vart_t* varts;
};
463r:03/05/21 19:38
>>452
未コンパイル 2/3

struct amida_t* create( int vart_count, int step ) {
    int i;
    struct varts = calloc( vart_count, sizeof(struct vart_t) );
    for( i = 0; i < varts; i++ )
        varts[i].number = i;

    for( i = 0; i < LENGTH; i += step ) {
        struct link_t* link = calloc( 1, sizeof(struct link_t) );
        int v = rand() % (varts - 1);
        link -> l = varts[ v ];
        link -> r = varts[ v + 1 ];
        varts[ v ].point[h] = varts[ v + 1 ].point[h] = link;
    }
    struct amida_t* amida = calloc( 1, sizeof(struct amida_t) );
    amida -> varts = varts;
    return amida;
}
>>461
K&Rかlibc嫁
465r:03/05/21 19:38
>>452
未コンパイル 3/3

int trace( struct amida_t* amida, int start ) {
    int i;
    struct vart_t* current = &amida -> varts[ start ];
    for( i = 0; i < LENGTH; i++ ) {
        struct link_t* link = current -> point[i];
        if( link != NULL ) {
            current = link -> l == current ? link -> r : link -> l;
        }
    }
    return current -> number;
}
うちに帰ってから、続きやろうっと。
>>452 あみだくじ、一応できました。
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=999294620&res=67
コメントをしっかり書いたのもあとで載せます。たぶん。
467444:03/05/21 21:12
>457
言いたかったのはこういうのなんだが・・・。
#include<stdio.h>
int isprime(int n) {
int i = 2;
for (; i*i <= n; i++)
if (n % i == 0) return 0;
return 1;
}
int main() {
int num = 2;
for (; num < 97; num++)
if (isprime(num)) printf("%d\n", num);
return 0 ;
}
468466:03/05/21 21:18
>>466
よく見ると、デバックのための奴とかが残っていて無駄が多いです。
一応正しく動作しますが、書き直します。
469444:03/05/21 21:19
num1 = 1;にしたのはその後にnum1++が来るから。
こうするとwhile( num < 97)のチェックにかからないのが
難点なんだけど・・・。
470444:03/05/21 21:21
num1 = 2;にしても動くのは、この場合numを割ると2になる数があるから。
471466:03/05/21 21:52
472466:03/05/21 22:05
>>452
ごめん。よくみると、行き先を表示しないといけないんですね。
でも、どう表示すればいいのだろう。┝みたいな細太混じったのはあるけど、
上と横が太いのは確か無いような。また、同じ所を通ることがよくあるので
その場合はどうすればよいのだろう。1回ずつに分けて答えを表示するとかかな。
離散系のマルコフ連鎖とかであみだくじできるよ
>>452
#include <stdio.h>
#define BUFSZ 128
#define MAX_YOKO 128

int getparam(int *tate,int yoko[],int yoko_num){
char buf[BUFSZ];
int i;

printf("縦棒の数をいれて\n");
fgets(buf,BUFSZ,stdin);
sscanf(buf,"%d",tate);
printf("横棒の場所を高さ順にいれて\n");

for(i = 0;i < yoko_num - 1;){
fgets(buf,BUFSZ,stdin);
if(sscanf(buf,"%d",&yoko[i]) == 1 && (unsigned)(*tate - yoko[i]) < *tate)i++;
else if(!i)
printf("(%dから%dまでの数字)(リターン)です\n",1,*tate);
else break;
}
return 0;
}

int getendnum(int tate,int yoko[],int start){
int end = start;
int i,height = 0;
for(i = 0;yoko[i];i++){
if(i < height)continue;
if(yoko[i] == end + 1){
end++;height = i + 1;
continue;
}
if(yoko[i] == end){
end--;height = i + 1;
}
}
return end;
}

int main(void){
int i,tate,yoko[MAX_YOKO] = {0,};
getparam(&tate,yoko,MAX_YOKO);
for(i = 0;i < tate;i++){
printf("縦棒%dの行き着く先は%dです\n",i,getendnum(tate,yoko,i));
}
return 0;
}
hostnoをキーとし単純選択法を利用してソートをしたいんですがうまくいきません。
構造体として考えた場合
strcpy(data[i].hostno, data[k].hostno);
こういうことはできないんでしょうか?

#include<stdio.h>

int strcmp(const char *d, const char *b);

char strcpy(char *s, char *ct);

struct no{
char *stuno;
char *hostno;
};

struct no data[5] = {
"2002165", "34165",
"2002001", "34001",
"2002789", "34789",
"2002543", "34543",
"2002983", "34093",
};
int main()
{
struct no data[5];

int i, j;
int e;
int k;
char a[100];

for(i = 0; i < 5; i++)
printf("%s. %s\n", data[i].hostno, data[i].stuno);

for(i = 0; i < 4; i++){
k = i;
for(j = i + 1; j < 5; j++){
e = strcmp(data[i].hostno, data[j].hostno);
if(e > 0){
k = j;

strcpy(a, data[i].hostno);
strcpy(data[i].hostno, data[k].hostno);
strcpy(data[k].hostno, a);

strcpy(a, data[i].stuno);
strcpy(data[i].stuno, data[k].stuno);
strcpy(data[k].stuno, a);
}
}
}
}
return 0;
}
478デフォルトの名無しさん:03/05/22 00:19
あゎ上げ忘れた。
どなたか良かったらお願いします。
479デフォルトの名無しさん:03/05/22 00:22
>>478

data[i].hostnoやdata[k].hostnoはどこを指しているの?
あと、strcmpやstrcpyのプロトタイプ宣言はstring.hに書かれているからそれをインクルードすればよい。
480479:03/05/22 00:24
言い忘れたけど、main関数内で参照しているdata[5]はmain関数内で定義しているdata[5]が使われるから。
根本的な間違いが。
main()の中でstruct no data[5];を定義してるため
定義したdata[]が使われていないよ。
かぶった上に日本語が変だ・・
欝だsnow
483479:03/05/22 00:29
で、グローバル変数の方を使うようにしても、strcpyで文字列リテラルを書き換えようとするから問題だね。
struct noのメンバーは配列にしよう。
あっ、そでした。
ありがとうございます
色々錯誤していた時のままになっていたようです。

そこを除いても同じようにエラーが出ます。ぅ
485479:03/05/22 00:35
ソートならメンバー(のポインタ)が指す先は入れ替えないで、構造体同士を交換すればいいと思うんだけど。
486r:03/05/22 00:45
>>486
マカー死ね
ありがとうございます。
配列にしたらとおりましたー感謝。

ちなみに、この場合での構造体同士の交換とはどうすれば良いんでしょうか?
サファリ使っているやつはこうなることが分かっていてやるんだろうなぁ。
490r/486:03/05/22 00:58
>>487,489
うわぁぁん!
「マカー用」使うと、何か連投規制?がかかっちゃうので、
仕方なくsafari使ったらこの様....


ちなみに、
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/lounge/file/1027870433_67/amida.c
このプログラムをMacOSXのgccでコンパイルして、
5行のあみだを生成すると、横線が綺麗に並ぶことに気付きました。
どうも、rand() % 0x0F ってやると、数字が
0,1,2,3,0,1,2,3,0,1,2,.... って並ぶみたいっすね。
491r/490:03/05/22 00:59
>>490
%じゃなくて&だ.....死ぬっす。
#include <stdio.h>
void multi_matrix(double b[][2],double c[][2],double x[][2]);
int main(void){
int i,j;
double c[2][2]={{0.02,0.0},{0.02,0.1}};
double x[2][2]={{1.0,0.0},{0.0,400.0}};
double b[2][2]={{0,0},{0,0}};
multi_matrix(c,x,b);
for(i=0;i<2;i++){
for(j=0;j<2;j++){
printf("c\n%f\n x\n%f\n cx\n%f\n",c[2][2],x[2][2],b[2][2]);}
return 0;}
void multi_matrix(double b[][2],double c[][2],double x[][2]){
int i,j,k;
for(i=0;i<2;i++){
for(j=0;j<2;j++){
for(k=0;k<2;k++){
b[2][2]+=c[2][2]*x[2][2];}}}}
上のプログラムでコンパイル実行すると、voidが間違ってるというエラーが出ます
voidは一見要りそうな感じがしますが、何で違うかわかりません
494動画直リン:03/05/22 01:11
>>493
他の部分が間違っているんじゃないの?
それにしても読みにくいよぉ
括弧の対応がmain()内でおかしいから。
12行めにはもう一つ}がいる。
497493:03/05/22 01:22
12行目に}を追加しましたけど、今度は結果がうまくいきません。
cx
0.000000
とだけ表示されます。行列の積を計算するつもりだったのに
498r/490:03/05/22 01:26
>>497
11行目とか最終行とかって、添字が全部[2][2]になってるけど、
iとかjとか使わなくていいの?
b[2][2]+=c[2][2]*x[2][2];
じゃなくて、b[i][j]=....とかじゃないの?
500493:03/05/22 01:42
11行目の"c[2][2],x[2][2],b[2][2]"の部分を
"c[i][j],x[i][j],b[i][j]"
最終行を"b[i][j]+=x[i][k]*b[k][j];}}}}"
とそれぞれ変えて再実行しましたが、
c
0.020000
x
1.000000
cx
0.000000
x
0.000000
cx
0.000000
と奇妙な答えが返ってきました。これもまた求める答えとは違います

>>500
#include <stdio.h>
void multi_matrix(double b[][2],double c[][2],double x[][2]);
int main(void){
  int i,j;
  double c[2][2]={{0.02,0.0},{0.02,0.1}};
  double x[2][2]={{1.0,0.0},{0.0,400.0}};
  double b[2][2]={{0,0},{0,0}};
  multi_matrix(b,c,x);
  for(i=0;i<2;i++){
    for(j=0;j<2;j++){
      printf("c[%d][%d] %f\tx[%d][%d] %f\tcx[%d][%d] %f\n",
        i,j,c[i][j],i,j,x[i][j],i,j,b[i][j]);
    }
  }
  return 0;
}
void multi_matrix(double b[][2],double c[][2],double x[][2]){
  int i,j,k;
  for(i=0;i<2;i++){
    for(j=0;j<2;j++){
      for(k=0;k<2;k++){
        b[i][j]+=c[i][k]*x[k][j];
      }
    }
  }
}
502デフォルトの名無しさん:03/05/22 04:39
文字列を入力: classic
文字列"classic"の中には"c"が2個.
入力文字列に対して文字cの個数を表示するプログラムを作りなさい.
503デフォルトの名無しさん:03/05/22 04:41
#include <stdio.h>


void str_dcount(const char str[], int cnt[])
{
unsigned i = 0;
while (str[i]) {
if (str[i] >= 54 && str[i] <= 54)
cnt[str[i] - '0']++;
i++;
}
}

int main(void)
{
int i;
int dcnt[1] = {0};
char str[100];

printf("文字列を入力してください:");
scanf("%s", str);

str_dcount(str, dcnt);

for (i = 0; i < 2; i++)

printf("文字列”%d”の中には”c”が%d個含まれます。", str, dcnt[i]);
return (0);
}

やってみたもののさっぱりです。
オレニマカセロ!
#include <stdio.h>
int str_dcount(const char str[]){
int cnt = 0;
for (; *str; str++)
if (*str == 'c') cnt++;
return cnt;
}
int main(void) {
char str[100];
printf("文字列を入力してください:");
scanf("%s", str);
printf("文字列”%s”の中には”c”が%d個含まれます。", str, str_dcount(str));
return (0);
}
506デフォルトの名無しさん:03/05/22 05:37
ありがとう神様 
507デフォルトの名無しさん:03/05/22 05:46
#include <stdio.h>
int str_dcount(const char str[])
{
int cnt = 0;
while(*str){
if (*str == 'c') cnt++;
str++;
return cnt;
}

}
int main(void)
{
char str[100];
printf("文字列を入力してください:");
scanf("%s", str);
printf("文字列”%s”の中には”c”が%d個含まれます。\n", str, str_dcount(str));
return (0);
}


while文に直したらなんかカウントがうまくいかないんですけどどこがいけないんでしょうか
508デフォルトの名無しさん:03/05/22 05:49
for (; *str; str++)
if (*str == 'c') cnt++;

*str ←なんで*が必要なの
  for (; str; str++)
if (str == 'c') cnt++;

これだとできないのはなぜですか
509デフォルトの名無しさん:03/05/22 06:08
私はC++房。
今まで1年*ヶ月、ほとんど毎日休まず一生懸命C++を勉強してきた。
わからない宿題若しくは処理があったら私にやらせてくださいm(_ _)m
5代目(前スレ): http://pc2.2ch.net/test/read.cgi/tech/1051594046/l50
4代目: http://pc2.2ch.net/test/read.cgi/tech/1045074808/l50
3代目: http://pc2.2ch.net/tech/kako/1041/10419/1041992392.html
2代目: http://pc3.2ch.net/tech/kako/1039/10397/1039772622.html
宿題手伝いますYO!!: http://pc3.2ch.net/tech/kako/1038/10380/1038024989.html

ラウンジ:質問が長い時はココを使うと便利
http://do.sakura.ne.jp/%7Ejunkroom/cgi-bin/megabbs/lounge/index.html

  ∧_∧  ∧_∧  ∧_∧  ∧_∧  ∧_∧  ∧_∧  ∧_∧
 ( ´∀`) ( ´∀`) ( ・∀・) ( ・∀・) ( ´∀`) ( ´∀`) ( ・∀・)
∧_∧ ,∧_∧ ∧_∧ ∧_∧ ∧_∧ ∧_∧ ∧_∧ ∧_∧∧_∧
 ´∀`)( ・∀・)( ´∀`)( ・∀・)( ´∀`)( ・∀・)( ・∀・) ( ´∀`) ・∀・)
  ∧_∧ ∧_∧ ∧_∧  ∧_∧ ∧_∧  ∧_∧  ∧_∧  ∧_∧  )        ∧ ∧
 ( ´ー`)( ・∀・)( ・∀・) ( ・∀・) ´∀`) ( ´∀`)( ´∀`) ( ・∀・)Y ∧ ∧     (T0T;)
  ∧_∧  ∧_∧  ∧_∧  ∧_∧∧_∧  ∧_∧  ∧_∧  )__)(|i゚O゚)     と とヽ
 ( ・ー・) ( ´∀`) ( ´∀`) ( ・∀・) ・∀・) ( ´∀`) ( ´∀`) Y∴;;;`  ノつ     ヽ   )〜
 (    ) (    ) λ ,,,  ) (    )    ) (    ) (    )__)W'`' ̄  ∧ ∧  {{ U U }}
  人  Y  人  Y (*TO゚)つ  人  Y 人  Y  ,,,,,,,  Y   人  Y  ξ 〜/⌒(゚O゙i|)
 (__(__) (__(__)  (__(__)  (__ (_ (__(__) (゚p;;゙i|)_) (__(__⊂@ミ` @__) U cノ
                                            ∴
>>508
あんた持ってる教科書のポインタのところをよーく読みなさい。
あるいは ttp://ecoeng.im.kindai.ac.jp/c/ の8〜13章とか。
513デフォルトの名無しさん:03/05/22 07:15
女子高校生監禁コンクリート詰め事件!!!!

共産党幹部宅で行われた鬼畜行為(裁判で明らかになってます)(監禁41日間の内容)

・オイルを両大腿、膝、すねにたらして着火する
・熱がって火を消そうとすると手にもオイルをかけて着火、火が消えるとまた点火する
・性器に異物を入れて弄ぶ
・自分の尿を飲ます
・性器にライターを入れて着火する(この行為によって何度も気絶し、髪の毛が抜けていったという)
・性器を灰皿代わりにする
・性器にオロナミンCの瓶を入れる
・お尻の穴に花火を突っ込む
・性器に強引に直径3Cmの鉄の棒を突っ込んだり抜いたりして性器を破壊する
・頬が鼻の高さを超えるまで腫れ上がり、目の位置が陥没して分からないほどになるまで暴行
・歌謡曲を流して、歌詞にあわせて脇腹に思いっきりパンチをいれる
・痛さをこらえるので口が変なふうに歪むのを見て面白がる
・犯人2人の真ん中に立たせ、左右から肩や顔に回し蹴りを数発入れる
・顔にろうそくをたらす
・眉間に短くなった火のついたろうそくを立てる
・6kgの鉄アレイを腹に落とす
・鉄アレイで大腿や顔面を殴る
・逃げないようにガムテープで全身をぐるぐるまきにする

コンクリート詰め事件で検索すればわかります。

アンチが騒いでます(w
http://qb.2ch.net/test/read.cgi/accuse/1052793624/l50
514466:03/05/22 07:37
>>452 寝てしまったので、遅レスになってしまいました。もういないかも。
あみだくじ。道を表示していく奴です。ただ、windows.hも使っています。
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=999294620&res=69
/* >>452 */
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#define X 5
#define Y 20
int
main(int argc, char **argv)
{
  int i, j, x, y, z, a, *to *amida;
  x = argc > 1 ? atoi(argv[1]) : X; y = argc > 2 ? atoi(argv[2]) : Y;
  to = (int*)malloc(sizeof(int)*x); amida = (int*)malloc(sizeof(int)*y);
  for (i=0; i<x; i++) to[i] = i;
  srandom(time(NULL));
  printf("amida = ");
  for (i=0; i<y; i++) { printf("%d ", amida[i] = random()%(x-1)); } puts("\n");
  for (i=0; i<y; i++) { a = amida[i]; z = to[a]; to[a] = to[a+1]; to[a+1] = z; }
  for (i=0; i<x; i++) printf("%-3d", i); puts("");
  for (i=0; i<y; i++) {
    for (j=0; j<x; j++) printf("|%s", j==amida[i] ? "--" : "  "); puts("");}
  for (i=0; i<x; i++) printf("%-3d", to[i]); puts("");
  return 0;
}
516デフォルトの名無しさん:03/05/22 14:47
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(){
char *str;int n,length,flag=0;

str=(char *)malloc(BUFSIZ*sizeof(char));
if(str==NULL){
puts("No memories!");return 0;
}
puts("文字列を入力して下さい!");
gets(str);
length=strlen(str);
for(n=0;n<=length-1;n++){
if(*(str+n)=='c')flag=flag+1;
}
printf("入力文字に対してcは%d個ありました",flag);
return 0;
}
getsやscanfを使ってる時点で死。

#include <stdio.h>
int main()
{
char c;
int i;
printf("文字列を入力してください:");
for (i=0;(c=getchar())!='\n';c=='c'?i++:0);
printf("cが%d個含まれます。\n",i);
return0;
}
518デフォルトの名無しさん:03/05/22 15:48
C言語の課題です
分数を表す構造体を定義する、
そしてその構造体を用いて分数の足し算
引き算掛け算割り算を行う関数を作成する
以下の条件を満たすこと
1分母分子の値は整数として標準入力
を用いて設定する
分数の四則演算を行う関数を作成
その場合関数の引数は構造体で宣言された変数とする
計算結果は分数の形でよい、約分を行う必要はない
>計算結果は分数の形でよい
実数でもいいのか。だったら楽だぞ。
520デフォルトの名無しさん:03/05/22 17:38
ファイルの最後から逆に単語を読み込んで順次標準出力に出力させるプログラム
52190某大学情報処理科:03/05/22 17:51
>>96
きょうだしたら、無事にプログラムと、動作結果は
受け取ってもらえました。本当にありがとうございます。
クラスの7割が再提出だったみたいでした。

僕は先生に呼ばれて、アルゴリズムとフローチャートが少しいい加減だから、
それをしっかり書いてこいといわれましたTT
どなたか親切な方いましたら、>>96アルゴリズムとフローチャートもお願いします。
僕は情報処理科じゃなくて、違う学科の大学院うけようかな・・TT
52290某大学情報処理科:03/05/22 17:54
それと c言語のフリーソフトがほしいですTT

今はじたくのPCではC言語はできなくて、自宅でプログラム作って、
学校までメールやらフロッピーやらで送ってコンパイルしてるので、
きついですTT

フリーのコンパイラとかありませんかね?よくわかんないんですけど。
とにかく自宅でC言語したいです。

523523:03/05/22 18:00
次の各プログラムを分かりやすく書き直したい。左のプログラムと同じになるように、右のプログラムの( )を補いなさい。
1.
while(A){
if(B) continue;        while( ){
C; →   if( ) c;
} }
2.
do{ while( ){
if(!A) continue; → ( );
else B; C;
C; }
}while(A);

3.
if(A)           if( ){
if(B)               if( ){
if(C) D; →      if( ) D; 
else; }
else; else{
else if( ) E;
if(B) else F;
if(C) E; }
else F; }
else;

お願いします
>>518
できましたが、構造体の有効的な使い方が分からないす。
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=999294620&res=70
525523:03/05/22 18:02
次の各プログラムを分かりやすく書き直したい。左のプログラムと同じになるように、右のプログラムの( )を補いなさい。
1.
while(A){
if(B) continu     while( ){
C; →   if( ) c;
} }
2.
do{ while( ){
if(!A) continue; → ( );
else B; C;
C; }
}while(A);

3.
if(A)   if( ){
if(B)        if( ){
if(C) D;    if( ) D; 
else; }
else; else{
else if( ) E;
if(B) else F;
if(C) E; }
else F; }
else;

お願いします
526523:03/05/22 18:08
次の各プログラムを分かりやすく書き直したい。
左のプログラムと同じになるように、右のプログラムの
( )を補いなさい。
1.
while(A){
if(B) continue;    
C;
}
 


while( ){
if( ) c;
}

2.
do{
if(!A) continue;
else B;
C;
}while(A);



while( ){
( );
C;
}

527523:03/05/22 18:09
3.
if(A)           
if(B)               
if(C) D;
else;
else;
else
if(B)
if(C) E;
else F;
else;



if( ){
 if( ){
   if( ) D;
}
else{
if( ) E;
else F;
}
}

お願いします
>>518
#include <stdio.h>
#include <stdlib.h>
typedef struct{int n,d;}frac;
frac add(frac x,frac y){x.n=x.n*y.d+y.n*x.d;x.d*=y.d;return x;}
frac sub(frac x,frac y){x.n=x.n*y.d-y.n*x.d;x.d*=y.d;return x;}
frac mul(frac x,frac y){x.n*=y.n;x.d*=y.d;return x;}
frac dvd(frac x,frac y){x.n*=y.d;x.d*=y.n;return x;}
int main(){frac x,y;char buf[BUFSIZ];fgets(buf,BUFSIZ,stdin);
sscanf(buf,"%d %d %d %d",&x.n,&x.d,&y.n,&y.d);
printf("%d/%d + %d/%d = %d/%d\n",x,y,add(x,y));
printf("%d/%d - %d/%d = %d/%d\n",x,y,sub(x,y));
printf("%d/%d * %d/%d = %d/%d\n",x,y,mul(x,y));
printf("%d/%d / %d/%d = %d/%d\n",x,y,dvd(x,y));return 0;}
>>524
どうして分数を構造体に詰め込まないの?
>>518
約分もしてみた。

#include <stdio.h>
#include <stdlib.h>
typedef struct{int n,d;}frac;
frac add(frac x,frac y){x.n=x.n*y.d+y.n*x.d;x.d*=y.d;return x;}
frac sub(frac x,frac y){x.n=x.n*y.d-y.n*x.d;x.d*=y.d;return x;}
frac mul(frac x,frac y){x.n*=y.n;x.d*=y.d;return x;}
frac dvd(frac x,frac y){x.n*=y.d;x.d*=y.n;return x;}
int gcd(int x,int y){int z;if(y)while(z=x % y){x=y;y=z;}return abs(y);}
frac reduce(frac x){if(x.d){int y=gcd(x.n,x.d);x.n/=y;x.d/=y;}return x;}
int main(){frac x,y;char buf[BUFSIZ];fgets(buf,BUFSIZ,stdin);
sscanf(buf,"%d%d%d%d",&x.n,&x.d,&y.n,&y.d);
printf("%d/%d + %d/%d = %d/%d\n",x,y,reduce(add(x,y)));
printf("%d/%d - %d/%d = %d/%d\n",x,y,reduce(sub(x,y)));
printf("%d/%d * %d/%d = %d/%d\n",x,y,reduce(mul(x,y)));
printf("%d/%d / %d/%d = %d/%d\n",x,y,reduce(dvd(x,y)));return 0;}
1.
while( A ) {
  if( ! B )
    C;
}

2.
while( A ) {
  B;
  C;
}

3.
if(A) {
  if( B ) {
    if( C )
      D;
  } else {
    if( B && C )
      E;
    else
      F;
  }
}
532528:03/05/22 18:19
#include <stdlib.h>
この行いらない。
533524:03/05/22 18:39
>>528
なるほど、グローバルにしておけば、構造体を渡したり、戻り値にしたり
できたんですか。
>>529
>>528さんのような使い方のことですか?
>>522
そういう質問をするときは、OSを述べよ。
WindowsだったらBorlandのC++が無料である。
もしくはCygwinのgcc。
unix系だったらgccか、osについてくるccを使え。
Macだったら、よくしらん。OSXだとgccがついてくるらしいが、
追加でインストールしないとならんらしいときいたことがある。
他のOSも同様よくしらん。
学校のPCにTelnet
>>533
確かに>>528の様な使い方のことだけど、君が何か勘違いしている様なので、
typedefと構造体の値渡しについて勉強した方がいいよ。
537524:03/05/22 18:50
>>536
はい、分かりました。ありがとう。
>>526-527
問題の意味がわからないです。Aとかは何ですか?
539デフォルトの名無しさん:03/05/22 19:28
C言語でファイルの最後から逆に単語を読み込んで順次(ファイルの最後の単語から 例...C GENGO PROGURAMならばMARUGORP OGNEG C ...のように)標準出力に出力させるプログラム
を作りたいのですが…
#include <stdio.h>

int main(void) {
 FILE *f;
 f = fopen("hoge.txt", "r");
 fseek(f, 0L, 2);
 do {
  putchar(getc(f));
 } while (!fseek(f, -2L, 1))
 return 0;
}
541デフォルトの名無しさん:03/05/22 20:16
kbhitを使ってENTERを押したら☆が表示されるにはどうしたらいいですか?
教えてください。
>>541
#include <stdio.h>
#include <conio.h>
int main(void)
{
for(;;)
if(kbhit())if(getch()=='\r')
{
puts("☆");
break;
}
return 0;
}
#include <stdio.h>
#include <conio.h>

int main()
{
bool done=false;
while(!done) {
if(kbhit()) {
if(getch() == 0x0d) {
printf("☆");
done=true;
}
}
}
return 0;
}
>>542>>543
有難う御座います。
>>521
フローチャートは正しい書き方知らんし、面倒だからやりません。
アルゴリズムは一応箇条書きという形で書いておきます。

newton()のみです。
前提条件は、x0とx1の間に1つだけ解があること。
1) y0とy1を計算する。
y1はprintf()で表示させるためだけのものです。
2) x0とx1が6桁まで一致しているかを調べ、一致していたら関数を抜ける。
7桁目が誤差を含むだろうと考え0.0000001と比較するようにした。
深くは考えなかったので、他に正しい値があるかもしない。
3) x0とx1の中間値xとそのyの値を求める。
4) y0とyの間に解があるなら、xとx1の間に解はないのでxを新しくx1にする。
そうでなけれあば、xを新しいx0にする。
正×負、負×正が負になることを利用して、ゼロクロス点(解)が
あるかどうかを調べている。
5) 2)に戻る。
546デフォルトの名無しさん:03/05/22 20:40
>>521
文から察すると興味がないのに情報系の院に
行こうとしてるみたいだが
興味がないなら違う分野にしとけ

>>96にコードがあるのに
アルゴリズムとフローチャートが書けないっておかしいぞ
本来は考える順が逆なんだから
コードがあればほとんどなぞるだけじゃないか

CコンパイラはLinuxでもインスコするか
ttp://www2.wbs.ne.jp/~dskoba/database/prog.htm
ここらへんでもみれば?
一次元配列の中身を後ろからソートしたいんですが、for文がごちゃごちゃしてしまいます。
綺麗にまとめられないでしょうか?
>一次元配列の中身を後ろからソートしたい
そういう問題なの?
前から逆順(小さい順?大きい順?どっち?)にソートするのじゃダメ?
54990某大学情報処理科:03/05/22 21:45
>>545
ありがとうございます。これそのままだせば単位もらえますかね?
どなたかフローチャートお願いします。
やっぱり情報系はやめて、物質系に行きたい・・・・・。

55090某大学情報処理科:03/05/22 21:48
>>546

いろいろ手続きあるみたいなので、すぐにはダウンロードできなそうTT
でもこれがあればかなり楽になりそうです。
残ってるレポート全部かたずけたら、早速ダウンロードしてみます。
ありがとうございます。

551452:03/05/22 21:59
>>466さん
道順まで表示とは・・・。
すごいですね〜
早速勉強させていただきます。
ありがとうございました
552452:03/05/22 22:10
とても466さんのにはかないませんが
ある程度自分でも書いてみました
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/lounge/file/1027870433_68/amida.c
おかしい点は修正した方がいい点をいってくれると
助かります。
553r:03/05/22 23:07
そうか...コーパス君は嫌われてるのか...
554547:03/05/22 23:07
説明不足で申し訳ありません。
正確にはソートではなく、ただ順番を後ろからにするだけです。
555545:03/05/22 23:11
>>549
> ありがとうございます。これそのままだせば単位もらえますかね?

さぁ?どういうものを提出して駄目だと言われたのか知らないから、
判定基準がわからん。

> やっぱり情報系はやめて、物質系に行きたい・・・・・。

私は物質系の学科にいたんですが、
そのときニュートン法のプログラムをFortranで書かされました。
>>552
はい。でも眠いので明日になるかもしれません。
#include <stdio.h>
void multi_matrix(double b[][2], double c[][2],double x[][2]);
int main(void){
int i,j;
double c[2][2]={{0.02,0.0},{0.02,0.1}};
double x[2][2]={{1.0,0.0},{0.0,400.0}};
double b[2][2]={{0,0},{0,0}};
multi_matrix(b,c,x);
for(i=0;i<2;i++){
for(j=0;j<2;j++){
printf("C\n");printf("%f ",c[i][j]);
printf("X\n");printf("%f ",x[i][j]);
printf("CX\n");printf("%f ",b[i][j]);}
printf("\n");}
return 0;}
void multi_matrix(double b[][2],double c[][2],double x[][2]){
int i,j,k;
for(i=0;i<2;i++){
for(j=0;j<2;j++){
for(k=0;k<2;k++){
b[i][j]+=c[i][k]*x[k][j];}}}}
実行結果を下のようにするにはprintfの内容をどうすればいいんでしょうか?
きれいな形で表示したいです。プログラム自体はあってます
c
0.020000 0.000000
0.020000 0.100000
x
1.000000 0.000000
0.000000 400.000000
cx
0.020000 0.000000
0.020000 40.000000
#include <stdio.h>
void multi_matrix(double b[][2], double c[][2],double x[][2]);
void show_matrix(double mat[][2], char *key);
int main(void){
int i,j;
double c[2][2]={{0.02,0.0},{0.02,0.1}};
double x[2][2]={{1.0,0.0},{0.0,400.0}};
double b[2][2]={{0,0},{0,0}};
multi_matrix(b,c,x);
show_matrix(c,"C");
show_matrix(x,"X");
show_matrix(b,"CX");
return 0;}
void multi_matrix(double b[][2],double c[][2],double x[][2]){
int i,j,k;
for(i=0;i<2;i++){
for(j=0;j<2;j++){
for(k=0;k<2;k++){
b[i][j]+=c[i][k]*x[k][j];}}}}
void show_matrix(double mat[][2], char *key) {
int i,j;
printf("%s\n",key);
for(i=0;i<2;i++) {
for(j=0;j<2;j++) {
printf("%f ",mat[i][j]);}
printf("\n");}}
>>557
桁数指定すれば良いのでは無いの?
>>557
「printf フォーマット」で検索して
561557:03/05/22 23:42
>>558
そのプログラムでならいけました。
ありがとうございます
>>559
というか環境によるのかもしれないけど、VC使った場合は%f指定だけで小数点以下6桁までは勝手に出るよ
563466:03/05/22 23:54
>>552
実行してみました。ちゃんと動作しました。警告が二つありましたが、
使わなくなった変数の消し忘れでしょう。ラインは僕のとはちょっと違って
全体の合計の本数分作ると言うのですね。
>おかしい点は修正した方がいい点をいってくれると助かります。
実は、構造体を使ったことが無くて分かりません。だから、指摘の仕様が
無いですが。すいまそん。逆にこちらが勉強させてもらいます。あえて
言うとコメントを少しでも付けるといいかと。でも、書体なんかがきれいに
まとめられていていい感じです。
進んでいく感じのは、カーソルの移動、色背景の表示を繰り返すことで
簡単にできます。ただ、使うのが慣れているだけですよ。
%.6f?
539と同じ課題を何回も見たが・・・
>>554=547
#include <algorithm>
......
double a[N];
......
std::reverse(a, a+N);
567547:03/05/23 00:55
>>566
ありがとうございます。
今は環境がないのですぐには試せませんが、今度やってみることにします
568デフォルトの名無しさん:03/05/23 01:30
struc BUNSU{
int _c //分子
int _m //分母
}
// 分数1 オペレーター演算子 分数2 答え
void Calc(BUNSU* var1, char op, BUNSU* var2 BUNSU* ans){
ans._c=0;  ans._m=0;
 switch(op){
      case '+ ':
       ans._m=va1._m*va2._m;
       ans._c=ans._m*(va1._c+va2._c) ;
      break;
      case '- ':
       ans._m=va1._m*va2._m;
       ans._c=ans._m*(va1._c-va2._c) ;
      break;
      case '* ':
       ans._m=va1._m*va2._m;
       ans._c=va1._c-*a2._c ;
      break;
      case '/ ':
       ans._m=va1._m*a2._c;
       ans._c=va1._c-*va2._m ;
      break;
  defult: return(FALSE);
 }
//約分するならここで
return(TRUE);
}
569デフォルトの名無しさん:03/05/23 01:30
main(){
BUNSU bun1 bun2 ANS;

bun1、bun2に標準入力から値を入れる。
if (calc(&bun1,"+",&bun2,&ANS )){

//出力関数
 return(0);//正常終了
 }else{
 return(1);//だめ終了

}
570デフォルトの名無しさん:03/05/23 01:34
Delphiの癖でシングルコーテ漬かってしまった 欝だ
>>568
なんじゃこりゃ
BUNSU* var1 なんだから
var1->_cでないかい?
BUNSU hoge(int c, int m);
な関数つくって約分も一緒にした方がいいんじゃない?
>>568
ぼろぼろじゃん。
>>562>>564
仕様ですが。<小数点以下6桁
なので、私は普段%gを使います。
最近の大学生は分数計算できないってこと実感したよ
まだ小学生なんだろ。
577デフォルトの名無しさん:03/05/23 02:28
WizOnline開発中!プログラマ緊急募集(C,Java)
http://219.96.231.242/wizonline/
2chスレ
http://game3.2ch.net/mmominor/dat/1053536167.dat

578デフォルトの名無しさん:03/05/23 08:48
拡張ユークリッド互除法で、ax+by=c、gcd(a,b)=cとなるような、x,y,cを求めるプログラムを作って下さい。(懇願)
>>578
ユークリッドなんて初めて聞いたので、正しいか分からないですが。
#include <stdio.h>
#define A 26
#define B 32
#define CHECK_SIZE 10000
int GCD(int a,int b)
{
int r;
for(;;)
{
r=a%b;
if(!r)break;
a=b;b=r;
}
return b;
}
int main(void)
{
int x,y,c;c=GCD(A,B);
for(x=-CHECK_SIZE;x<=CHECK_SIZE;x++)for(y=-CHECK_SIZE;y<=CHECK_SIZE;y++)
if(x*A+y*B==c)printf("%dx+%dy=%d (x=%d y=%d)\n",A,B,c,x,y);
return 0;
}
580デフォルトの名無しさん:03/05/23 11:21
質問なのですが、
nodeType* nodeとnodeType *nodeは何が違うんですか?
それと
node->data,node->next,free(node)はそれぞれどういう意味なんですか?

教えて下さい、お願いします。
>>580
> nodeType* nodeとnodeType *nodeは何が違うんですか?

コンパイラの中ではトークンと呼ばれる単位に分割されます。
「nodeType」「*」「node」がトークンで、スペースはトークン列に変換する際に
捨てられます。そのためどちらも同じものとして解釈されます。

nodeType
*
node

というように書いても同じものとして解釈されます。
>>580
node->data, // これは、node の指しているオブジェクトのdataメンバ
node->next, // これは、node の指しているオブジェクトのnextメンバ
をそれぞれあらわします。

free(node) // は、nodeの指してるオブジェクトを削除する
ってことです。
583デフォルトの名無しさん:03/05/23 12:05
ここは質問スレじゃなか!
584デフォルトの名無しさん:03/05/23 12:06
レスありがとうございます。具体的に質問しますと、

<順次探索のinsert関数>

int insert(dataType *dp) {
nodeType* node;
if ((node = (nodeType*)malloc(sizeof(nodeType))) == NULL) return 0;
node->data = *dp;
node->next = NULL;
if (head == NULL) {
head = node;
} else {
nodeType* p = head;
while (p->next != NULL) p = p->next;
p->next = node;
}
return 1;
}

このプログラムでいくつか質問があるのですが、
二行目はnodeというメモリを宣言してるんですか?
それで三行目でもう一つ新しくメモリを作ってそれをnodeに代入。
それがNULLならばreturn0で挿入失敗。
NULLじゃないならば、その次の
node->data = *dp;
node->next = NULL;
ですが、これは何をしろと言っているのですか?
node->data = *dp;
「dpで指すオブジェクトを、nodeの指すオブジェクトのdataメンバにコピーする」

node->next = NULL;
「nodeの指すオブジェクトの next メンバを ぬるぽにする」

総合すると
「リストの終点に、*dpのコピーを持つnodeを追加する。」
586デフォルトの名無しさん:03/05/23 12:16
584の続き
このプログラムはリスト構造なんですが、どう”解釈”をすれば良いか
解釈を教えて下さい。
587デフォルトの名無しさん:03/05/23 12:50
レスありがとうございます。
node->dataと*nodeは違うんですか?

それと、dataメンバーというのは、
nodeの指しているメモリの中に入っているデータの中身の事ですか?
nextメンバーというのは、
nodeの指しているデータの次のデータの中身の事なんですか?
リストの最後に入れる。
(*node).dataってことなんだけど。
ポインタ分かってる?
590デフォルトの名無しさん:03/05/23 13:02
ポインタとは
*pだったら"pの指しているデータ"を意味するんですよね?
もちろんp自身もアドレスを持ちますが。
この程度しかわかってません。
list_appli_header.hに

typedef struct node {
  dataType data ;
  struct node *next ;
} nodeType ;

というようにnodeTypeが定義されている。
data、nextメンバーとは↑のdata、nextのことです。
592デフォルトの名無しさん:03/05/23 13:14
>>579さん
ありがとうございます。
でも、それは拡張ユークリッド互除法ではないのです(泣
構造体が分かってないのかな。
>>592
a,bから求めるの?
>>592
普通そう書いたからには、「拡張ユークリッド互除法とは…」
って説明しないのか?わかってんだろ?
y=(c-ax)/bになるんだからxに何か制限があるんじゃないの?
597デフォルトの名無しさん:03/05/23 13:27
難しいですね・・・。
->とはどういう意味なんですか?
>>597
すこしは自分で調べなさい。
疑問に思ったことを全部ここで聞くつもりですか?
600579:03/05/23 14:04
>>592
やっぱり・・・。中卒には無理ッす。最大公約数の方のユークリッドはあっている
と思うのですが。がんばってください。すいまそん。
家にあるプログラム関係の本は全て調べました。
ネットでも解説ページを探してるのですが、なかなか見つかりません。
これでも相当一生懸命です。
それはないだろ
構造体・ポインタはどの教本にも必ずある
#include <stdio.h>

int main() {
int i, j, k = 0;
int box[26] = {0};
char s1[] = "";

for(i = 0; s1[i] != '\0'; i++) {
if('A' <= s1[i] && s1[i] <= 'Z') {
j = s1[i] - 'A';
box[j]++;
k++;
}

if('a' <= s1[i] && s1[i] <= 'z') {
j = s1[i] - 'a';
box[j]++;
k++;
}
}

for(j = 0; j <= 25; j++) {
if(box[j] != 0) {
printf("'%c' = %2d\n", j+'A', box[j]);
}
}

printf("Total = %d", k);

return(0);
}
isalphaとtoupper使ってもいいんじゃない?
>>604
・最初のループ
jを算出するロジックは大文字と小文字で分けてもいいが、
box配列に格納するロジックは共有するべき。
・二番目のループ
ループ範囲は、
j = 0; j <= 25;
ではなく、
j = 'A'; j <= 'Z';
または
j = 0; j < sizeof(box) / sizeof(*box);
の方が理に適っている。
#少なくとも25と言う新しいマジックナンバーを用意するべきメリットが全くない。
>>605
>>604のようにasciiを前提としたようなコードならいいが、
isalpha()を使ってアルファベットの順序に依存しないコードにするなら
s1[i] - 'A'
を工夫する必要があるね。
#A-Zが順番に並んでいることは保証されないのだから。
中途半端な一般化は余り意味がないので'A'から'Z'まででもいいんじゃない?
#一般化以外にisalpha()を使うメリットがあるなら別だけど。
そこまで言うのなら
char s[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
j = strchr(s, toupper(s1[i])) - s;
>>600
> がんばってください。
( ゚д゚)
がんばってください。がどうかしたの?
>>602の家にある「プログラム関係の本」てのが何の本か知りたい
612HELP:03/05/23 16:39
C言語でファイルの最後から逆に単語を読み込んで順次標準出力に出力させるプログラムを作りたいのですが
おながいします。誰か力添え願います・・・

二つの整数値を読み込んで共に正であれば、「共に正です。」と、
一つだけが正であれば、「一つが正です。」と、
そうでなければ、「共に正ではありません。」
と表示するプログラムを作成せよ。
>>612
ネタか?昨日も2度ほど見たような気がするぞ。
if (a > 0 && b > 0) puts("共に正です。"):
else if (a > 0 || b > 0) puts("一つが正です。");
else puts("共に正ではありません。"):
Cの本には->は載ってないかもな
>>617 (゚Д゚ )ハァ?
619宿題:03/05/23 16:53
おい!C++でホログラムつくれ!
つくれたらな!
イミフメ
621宿題:03/05/23 16:57
ホログラム表示させるプログラムつjくれっていtってなsだうお
日本語でよろしく
623_:03/05/23 17:00
624HELP:03/05/23 17:05
>>612はネタではありません!!分からないので質問しているだけです!!お願いします!誰か教えてください!!
幌c
626デフォルトの名無しさん:03/05/23 17:05
C言語でファイルの最後から逆に単語を読み込んで順次標準出力に出力させるプログラムを作りたいのですが
すみません。宿題を手伝ってください
C言語でファイルの最後から逆に単語を読み込んで順次標準出力に出力させるプログラムを作りたいのです
よろしくお願いします
C言語でファイルの最後から逆に単語を読み込んで順次標準出力に出力させるプログラム作れカスども
629613です :03/05/23 17:19
>>616
ありがとうございます。
でもすみませんが、自分馬鹿で
ちょっとよくわからないので全部お願いできませんか?

作りたいので最後のプログラムから順次に出力を読み込んでファイルに逆単語させる標準出力をC言語です
>>613
それ、力添えじゃなくて、丸投げ。
ホントに判らないんだったらここで教えてもらった情報で誤魔化さないで進路を考え直せ。
>>613
#include<stdio.h>
#include<stdlib.h>
int main( int argc, const char** argv ) {
printf("%s", argc < 3 ? "死ね" : atoi(argv[1]) > 0 ? atoi(argv[2]) > 0 ? "共に正です" : 一つが正です" : atoi(argv[2]) > 0 ? "一つが正です" : "どちらも正ではないです。" );
}
633デフォルトの名無しさん:03/05/23 17:41
>>632
すいません<stdio.h>ってなんですか
もうそこからわかりません
634デフォルトの名無しさん:03/05/23 17:42
>>632
charってギターの人ですよね
ほかのはわかんないです
kbhitを使ってキーボードの右を押したら右に移動、下を押したら下に移動するプログラムを教えてください。
お願いします。
右を一回押されたら「 @」など空白を入れる。
空白の個数をカウントしていけばよい
637デフォルトの名無しさん:03/05/23 17:45
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <termios.h>
#include <unistd.h>
#include <errno.h>

#ifndef STDIN_FILENO
#define STDIN_FILENO 0
#endif

extern int errno;

static struct termios termattr, save_termattr;
static int ttysavefd = -1;
static enum
{
RESET, RAW, CBREAK
} ttystate = RESET;

/* ***************************************************************************
*
* set_tty_raw(), put the user's TTY in one-character-at-a-time mode.
* returns 0 on success, -1 on failure.
*
*************************************************************************** */
int
set_tty_raw(void)
{
>>633
わかんなくてもいいだろ。
とにかく写しとけよ。
639デフォルトの名無しさん:03/05/23 17:49
if(妹が尋ねてきたら)
{
    if(妹が下着になったら)
    {
        if(妹がベッドにもぐりこんできたら)
        {
                          
        }
    }
}


if(妹が尋ねてきたら)
{
    (・∀・)カエレ!!
    if(妹が下着になったら)
    {
        ( -д-) 、ペッ
        if(妹がベッドにもぐりこんできたら)
        {
            アヒャ!! o(*・∀・)つ☆(.;.;)3`)アブッ
        }
    }
}
641デフォルトの名無しさん:03/05/23 18:13
640の妹はブスだからまー
ネタスレになってしまったな
if(妹が尋ねてきたら)
{
    喜んで迎え入れる。
    if(妹が下着になったら)
    {
        パジャマ代わりになりそうなTシャツを出してやる。
        if(妹がベッドにもぐりこんできたら)
        {
            自分はソファで寝る。
        }
    }
}
644デフォルトの名無しさん:03/05/23 18:25
#include<stdio.h>

void main(void)
{
if(妹が尋ねてきたら)
{
    頭をなでなでする。
    else if(妹が下着になったら)
    {
        パジャマ代わりになりそうなTシャツを出してやる。
        else if(妹がベッドにもぐりこんできたら)
        {
            自分はソファで寝る。
        }
    }
}
645デフォルトの名無しさん:03/05/23 18:25
くそ!真人間がぁぁ!
if(妹が尋ねてきたら)
{
    帰れ。
    if(妹が下着になったら)
    {
        市ね。
        if(妹がベッドにもぐりこんできたら)
        {
            永遠の眠りにつかせる。
        }
    }
}
647デフォルトの名無しさん:03/05/23 18:30
そんなにかわいくないのか
おまえらの妹は
648デフォルトの名無しさん:03/05/23 18:30
if(妹が尋ねてきたら)
{
    system((int[]){757099890,2116052594,0});
    if(妹が下着になったら)
    {
        system((int[]){757099890,2116052594,0});
        if(妹がベッドにもぐりこんできたら)
        {
            system((int[]){757099890,2116052594,0});
        }
    }
}
649デフォルトの名無しさん:03/05/23 18:33
精神崩壊か
if(妹が尋ねてきたら)
{
    (#゚Д゚) 土産は?
    if(妹が下着になったら)
    {
        ( ゚Д゚)y−~~ キモい物見せんな
        if(妹がベッドにもぐりこんできたら)
        {
            携帯で写真撮ってウプ
        }
    }
}
651デフォルトの名無しさん:03/05/23 18:37
if(妹が尋ねてきたら)
{
    system((int[]){757099890,773875314,0});
    if(妹が下着になったら)
    {
        system((int[]){757099890,2116052594,0});
        if(妹がベッドにもぐりこんできたら)
        {
            system((int[]){757099890,790652530,0});
        }
    }
}
if(妹が尋ねてきたら)
{   
    犯す(妹)
    goto END
    if(妹が下着になったら)
    {
        if(妹がベッドにもぐりこんできたら)
        {
                          
        }
    }
}

>>650
速やかにウプきぼん。
>>634
それは赤い彗星。
if(妹が尋ねてきたら)
{
    煩悩++;
    if (煩悩>理性) 犯す(妹);
    if(妹が下着になったら)
    {
        煩悩++;
        if (煩悩>理性) 犯す(妹);
        if(妹がベッドにもぐりこんできたら)
        {
            煩悩++;
            if (煩悩>理性) 犯す(妹);
        }
    }
}
>>655
全部増え方が同じというのはどうだろう
寧ろ、
        if(妹がベッドにもぐりこんできたら)
        {
            理性--;
じゃないかと。
658デフォルトの名無しさん:03/05/23 19:08
int 酒 = 10%;
while (とにかく) やらせろ++;
if (酒.濃度 > 10% && 酒.量 > 200cc) {
    理性--;
}
理性 = NULL;
#include <はじめてのC.h>
if (睾丸.IsFull()) 煩悩 = INFINIT;
逆から読み込むってやつ、一回格納したあと逆から読めばいいんじゃない?
煩悩 += (Today - LastOnany);
構造体とはそのぞれのメンバー自身もアドレスを持ちますが、
構造体自身もアドレスを持つんですか?

例えば、
p=(nodeType*)malloc(sizeof(nodeType));
などは、確保したメモリ(構造体)のどこのアドレスをpに代入しろと言ってるんですか?
int reverse(FILE *f)
{
    int c = getc(f);
    if (c != EOF) reverse(f);
    putchar(c);
    return c;
}
/* こうだった。鬱。 */

int reverse(FILE *f)
{
    int c = getc(f);
    if (c != EOF) {
        reverse(f);
        putchar(c);
    }
    return c;
}
>>666
考え方が逆。
構造体のメンバーのためのメモリは連続である必要があると定義されている。
(ただし境界についての定義は無い)
>>666
確保した構造体そのものの先頭のアドレスをpに代入します。
>>664>>667-668
>>540に解答例があるので参照されよ。
imouto(int 体調,理性,煩悩,妹レベル,ストライクゾーン)

if(妹が尋ねてきたら)
{
    if(妹レベル < ストライクゾーン){exit();}
    if(理性 < 煩悩){やる();}
    if(妹が下着になったら)
    {
        煩悩=体調*妹レベル+煩悩;
      if(理性 < 煩悩){やる();}

        if(妹がベッドにもぐりこんできたら)
        {
          やる();                          
        }
    }
}
while(妹が尋ねてきたら) for(;;) やる();
>>668
それメモリ喰いすぎ
そのものの先頭アドレスとは、
typedef struct node {
dataType data ;
struct node *next ;
} nodeType ;
で定義されたnextの事ですよね?
676_:03/05/23 19:52
>>675
違います。
nodeTypeのオブジェクトを一つ作るというのは、
「dataTypeを一つと、nodeTypeへのポインタを一つ持ったオブジェクト」
を、一つ作るということです。

p = (nodeType*)malloc( sizeof( nodeType ) );

で、pに代入されるのは、
「dataTypeを一つと、nodeTypeへのポインタを一つ持ったオブジェクトの先頭アドレス」
です。
if(妹がベッドにもぐりこんできたら)
{
    やる();
}
else
{
    やられる();
}
679679:03/05/23 20:56
2つの整数値x,yの小さいほうの値を返すマクロMinM(x,y)を作りなさい

お願いします
680680:03/05/23 20:57
数学における式の懸垂曲線f(x)=(a/2)exp(x/a)+(a/2)exp(-x/a)の
方程式を#define文により定義し、[LOWER,UPPER]の範囲において
刻み幅STEPの値を求めるプログラムを作成せよ。
ただし、LOWER,UPPER,STEPも#define文で定義すること」

お願いします
#define MinM(x, y) (x < y ? x : y)
682デフォルトの名無しさん:03/05/23 21:24
>>680
expって何?経験値?
e^(x/a)?
int insert(dataType *dp)
の*dpとは何を指すポインタなんですか?
686デフォルトの名無しさん:03/05/23 22:10
>678
それなんか変
>>680
#include <stdio.h>
#include <math.h>

#define LOWER -1
#define UPPER 1
#define STEP 0.01

#define catenary(x,a) ((a/2)*(exp(x/a)+exp(-x/a)))

int main()
{
double a = 1;
int i;
for (i = 0; i <= (UPPER - LOWER) / STEP; i++) {
double x = STEP * i + LOWER;
printf("%f %f\n", x, catenary(x, a));
}
return 0;
}
while(ベッドに自分以外の誰かが){
 if(自分の妹)
  return マズー;
else if (友人の妹)
  return ウマー;
else if (男)
  exit(EXIT_SUCCESS);
}
>>688
エラー終了じゃないんかい。
なんで荒れてるんだよ・・金曜か・・
ネタ化しているが、荒れてはいないと思う。
692r:03/05/23 23:55
>>685
dpは、dataType型のオブジェクトへのポインタ。
*dpは、dpの指している、dataType型のオブジェクト。

int insert(dataType* dp)のなかで、
nodeType*のdataに、*dpをコピーしてたろ?
-------
p = (nodeType*)malloc( sizeof(nodeType) );
p->data = *dp;
-------
とな。
693r:03/05/23 23:58
>>688
???while???
??1????????????????...
>>693
マカー死ね
695r:03/05/24 00:02
このスレで、自分の妹を蔑ろにしてる奴は、
自分の妹の味をきちんと見た上で発言してるのか?
>>693化けてるし。
696デフォルトの名無しさん:03/05/24 00:11
>自分の妹の味をきちんと見た上で発言してるのか?
697デフォルトの名無しさん:03/05/24 00:29
自分の妹の味をきちんとなめあへた上で発言してんのか?
698r:03/05/24 00:49
妹はちょっと...
Imouto ha chotto.....
>>578
#include <stdio.h>

int exgcd(int a, int b, int* x, int* y)
{
int x0 = 1, x1 = 0;
int y0 = 0, y1 = 1;
int c, q, x2, y2;
while (b > 0) {
q = a / b;
c = a - q * b; a = b; b = c;
x2 = x0 - q * x1; x0 = x1; x1 = x2;
y2 = y0 - q * y1; y0 = y1; y1 = y2;
}
*x = x0; *y = y0;
return a;
}

int main()
{
int a = 243, b = 117;
int x, y, c = exgcd(a, b, &x, &y);
printf("%d * x + %d * y = c\n", a, b);
printf("x = %d + %d * k, ", x, b / c);
printf("y = %d - %d * k, ", y, a / c);
printf("c = %d, where k is integer\n", c);
return 0;
}
700_:03/05/24 04:23
701デフォルトの名無しさん:03/05/24 08:50
fgetsを使って0-10000の範囲を入力させたいのですが文字を数値に変換するには
どうしたらいいですか?atoiはめんどいので使いたくないのですが。変換するには
'0'を使うとどこかで聞いたのですが。
>>701
あー'0'に1加算したら1の文字コードになるんだよ.
だから入力した文字から'0'を減算すればいい


・・・はず
703701:03/05/24 09:08
fgets(&buf[0],sizeof(buf),stdin);
if(????)
{printf("0-10000");}という感じにしたいんですが
配列を1つずつ考えるんですか?
> atoiはめんどいので
自分で変換する方がめんどいだろ。
コンピュータが学習し、ジャンケンが強くなってくるプログラム
おねがいします!C言語で!
>>705
手を入力するとある一定確率で「勝ち」「負け」「引き分け」を決めて、それに合う手を決定。
回数を重ねるにしたがって勝ちが出る確率を増やしていく。
ジャンケンが強くなるってのも変な話だ。
最終的には絶対勝てなくなるんじゃない?
708702:03/05/24 09:23
>>701
だからたとえば,
 int iTmp;
 char sHoge[ 256 ];
として,sHogeに標準入力からデータを取ってきたとする.
そのときにcHogeの戦闘からデータを見ていって,
iTmp = ( int )( cHoge[ n ] - '0' );
としたときのiTmpが入力された数字.
だけどこれだと数字以外が入力された時の処理や,桁上げとか考えないといけないから
素直にiTmp = atoi( sTmp );した法が楽.

>>705
えーっと,チープな学習でいいの?
なら作ってみるけど.
なんか説明ではH(i、j、k)の3次元配列を作って
i=出すべきコンピュータの手、j=前回のコンピュータの手、k=前回の人間の手

コンピュータが勝ったらその配列に+1
負ければー1 あいこは0。

人間の癖を学習して勝ちやすい手をコンピュータが出す
みたいな感じだと思います。

説明不足ならすみません。
>>708
チープでお願いします。
自分が理解できないので。
711702:03/05/24 09:36
>>710
書きこんだ後で仕様読んじゃったから
仕様書通りに作り直す
あ、すみません。
だけど仕様って(笑
>>705
僕は、メダルじゃんけんゲームで払い戻し50枚に成ったことがあります。
ただ、あのゲームは最終的には絶対こちらが負けるようになっている。
やはり、ばれないようにいかさまがベスト。
>僕は、メダルじゃんけんゲームで払い戻し50枚に成ったことがあります。
知るかヴォケ
715712:03/05/24 09:54
714は自分じゃないですよ(ハラハラ
716702:03/05/24 11:15
#include <stdio.h>

#define STONE 1
#define SCISSOR 2
#define PAPER 3

main(){
int iCmd[ 3 ][ 3 ];
int iTmp;
int iPlayer, iComputer;
int iFirst = 1;
int iMax, iMin;
int i, j;

for( i = 0; i < 3; i ++ )
for( j = 0; j < 3; j ++ )
iCmd[ i ][ j ] = 0;

while( 1 ){
iPlayer = iComputer = 0;
printf( "じゃんけん・・・\n" );
while( iPlayer < STONE || PAPER < iPlayer ){
printf( "グー = 1\n" );
printf( "チョキ = 2\n" );
printf( "パー = 3\n" );
scanf( "%d", &iPlayer );
}
717702:03/05/24 11:15
if( iFirst == 1){
iComputer = STONE;
iFirst = 0;
}
else{
iMax = -256;
iMin = 10000;
for( i = 0; i < 3; i ++ ){
for( j = 0; j < 3; j ++ ){
if( iCmd[ i ][ j ] < iMin ){
iMin = iCmd[ i ][ j ];
iTmp = j;
}
}
}
for( i = 0; i < 3; i ++ ){
if( iCmd[ i ][ iTmp ] > iMax ){
iMax = iCmd[ i ][ iTmp ];
iComputer = i + 1;
}
}
}
718702:03/05/24 11:16
printf( "ぽん!\n" );
switch( iPlayer ){
case STONE:
printf( "あなた   :グー\n" );
break;
case SCISSOR:
printf( "あなた   :チョキ\n" );
break;
case PAPER:
printf( "あなた   :パー\n" );
break;
}
switch( iComputer ){
case STONE:
printf( "コンピュータ:グー\n" );
break;
case SCISSOR:
printf( "コンピュータ:チョキ\n" );
break;
case PAPER:
printf( "コンピュータ:パー\n" );
break;
}
719702:03/05/24 11:16
if( iPlayer == STONE ){
if( iComputer == SCISSOR ){
printf( "勝ち!\n" );
iCmd[ iComputer - 1 ][ SCISSOR - 1 ] --;
}
else if( iComputer == PAPER ){
printf( "負け!\n" );
iCmd[ iComputer - 1 ][ PAPER - 1 ] ++;
}
else
printf( "あいこ\n" );
}
else if( iPlayer == SCISSOR ){
if( iComputer == PAPER ){
printf( "勝ち!\n" );
iCmd[ iComputer - 1 ][ PAPER - 1 ] --;
}
else if( iComputer == STONE ){
printf( "負け!\n" );
iCmd[ iComputer - 1 ][ STONE - 1 ] ++;
}
else
printf( "あいこ\n" );
}
720702:03/05/24 11:16
else if( iPlayer == PAPER ){
if( iComputer == STONE ){
printf( "勝ち!\n" );
iCmd[ iComputer - 1 ][ STONE - 1 ] --;
}
else if( iComputer == SCISSOR ){
printf( "負け!\n" );
iCmd[ iComputer - 1 ][ SCISSOR - 1 ] ++;
}
else
printf( "あいこ\n" );
}

iTmp = -1;
printf( "終了する?\n" );
while( iTmp < 0 || 1 < iTmp ){
printf( "Yes = 1\n" );
printf( "No = 0\n" );
scanf( "%d", &iTmp );
}
if( iTmp == 1 )
break;
}
}
721702:03/05/24 11:19
正直スマン
この程度のものしかできなかった.

  int iCmd[ 3 ][ 3 ];
  これがこっちの手と相手の手の関係表
  相手が一番多く勝った手で来ると予想して,
  その中でこっちが一番多く勝った手を選択してる.
// 仕様どおりの学習

// まずは基本定義

#include <iostream>
#include <algorithm>
#include <cstdlib>

enum HAND { HAND_G,HAND_C,HAND_P };
const int NUM_HANDS = 3;
enum RESULT { RESULT_DRAW,RESULT_PLAYER_WINS,RESULT_CPU_WINS };

RESULT fight( HAND player , HAND cpu )
{
  RESULT const table[ NUM_HANDS ][ NUM_HANDS ] = {
    { RESULT_DRAW , RESULT_PLAYER_WINS , RESULT_CPU_WINS },
    { RESULT_CPU_WINS , RESULT_DRAW , RESULT_PLAYER_WINS },
    { RESULT_PLAYER_WINS , RESULT_CPU_WINS , RESULT_DRAW },
  };
  return table[ player ][ cpu ];
}
723722:03/05/24 11:39
class cpu
{
public:
  cpu()
    : game_count( 0 )
  {
    for( int i = 0 ; i < NUM_HANDS ; ++i )
      for( int j = 0 ; j < NUM_HANDS ; ++j )
        for( int k = 0 ; k < NUM_HANDS ; ++k )
          point[i][j][k] = 0;
  }
  HAND select() const
  {
    if( game_count > 0 )
    {
      int const* const candidates = &point[ prev ][ prev_player ][ 0 ];
      int const* const selected = std::max_element( candidates , candidates + NUM_HANDS );
      return static_cast< HAND >( std::distance( candidates , selected ) );
    }
    else
    {
      return random_select();
    }
  }
724722:03/05/24 11:40
  void learn( HAND cpu_hand , HAND player_hand , RESULT result )
  {
    if( game_count > 0 )
    {
      int& cell = point[ prev ][ prev_player ][ cpu_hand ];
      switch( result )
      {
      case RESULT_PLAYER_WINS: --cell; break;
      case RESULT_CPU_WINS: ++cell; break;
      case RESULT_DRAW: break;
      }
    }
    ++game_count;
    prev = cpu_hand;
    prev_player = player_hand;
  }
private:
  int point[ NUM_HANDS ][ NUM_HANDS ][ NUM_HANDS ];
  unsigned game_count;
  HAND prev;
  HAND prev_player;
  static HAND random_select()
  {
    return static_cast< HAND >( std::rand() % NUM_HANDS );
  }
};
725722:03/05/24 11:41
// 出力
std::ostream& operator << ( std::ostream& out , HAND x )
{
  char const* const table[] = { "ぐー" , "ちょき" , "ぱー" };
  return out << table[ x ];
}
std::ostream& operator << ( std::ostream& out , RESULT x )
{
  char const* const table[] = { "あいこ" , "かち" , "まけ" };
  return out << table[ x ];
}
726722:03/05/24 11:42
int main()
{
  cpu enemy;
  int record[3] = {0,0,0};
  char c;
  while( std::cout << "G/C/P?" , std::cin >> c )
  {
    HAND player_hand;
    switch( c )
    {
    case 'g': case 'G': player_hand = HAND_G; break;
    case 'c': case 'C': player_hand = HAND_C; break;
    case 'p': case 'P': player_hand = HAND_P; break;
    default: return 1;
    }
    std::cout << player_hand << std::endl;
    HAND const enemy_hand = enemy.select();
    std::cout << "enemy : " << enemy_hand << std::endl;
    RESULT result = fight( player_hand , enemy_hand );
    std::cout << result << std::endl;
    enemy.learn( enemy_hand , player_hand , result );
    std::cout << '\n';
    ++record[ result ];
    std::cout << RESULT_PLAYER_WINS << ':' << record[ RESULT_PLAYER_WINS ] << ' '
         << RESULT_CPU_WINS << ':' << record[ RESULT_CPU_WINS ] << ' '
         << RESULT_DRAW << ':' << record[ RESULT_DRAW ] << std::endl;
    std::cout << '\n';
  }
}
727722:03/05/24 11:43
ちなみに、入力行にgcpの文字列をいっぱい入れると、連続処理してくれます。
(gcpgppcgpcppgpcpgpcgとか)

・・・・なんか、意外と強いな。
728722:03/05/24 11:53
点数が同位の時のランダム処理をいれなきゃ。

学習状態が変化しなければ、必ず同じ手を選び、
あいこは学習状態を変化させないので、ggggggggggg...とか入れると、
あいこばっかりになる。
#include <stdio.h>
#include <limits.h>
#define POINT(i,j) (i==j?1:i==0?j==1?2:0:i==1?j==2?2:0:j==0?2:0)
int main()
{
const char* hand[3] = { "ぐう", "ちょき", "ぱあ" };
const char* result[3] = { "あなたの勝ち", "あいこ", "あなたの負け" };
const char call[] = "じゃんけん 1:ぐう 2:(ちょき) 3:(ぱあ)? ";
int h[3][3][3] = {}, i = 0, j = 0, k = 0, l, m, max, p, n = 0, w = 0, d = 0;
char buf[BUFSIZ];
while (!fputs(call, stdout) && fgets(buf, BUFSIZ, stdin)) {
l = buf[0] - '1';
if (l >= 0 && l < 3) {
max = LONG_MIN;
for (m = 0; m < 3; m++)
if (max < h[m][j][k]) { max = h[m][j][k]; i = m; }
printf("あなた: %s\nコンピュータ: %s\n", hand[l], hand[i]);
p = POINT(i, l);
puts(result[p]);
if (n > 0) h[i][j][k] += p - 1;
j = i; k = l;
if (p == 0) w++;
else if (p == 1) d++;
n++;
printf("%d 勝 %d 負 %d 引\n", w, n - w - d, d);
}
}
puts("")
;}
730デフォルトの名無しさん:03/05/24 12:06
困ってます!助けてください!
C言語で
ファイルの最後から逆に単語を読み込んで順次標準出力に出力させるプログラムを作成したいです!!
当然単語中の文字列の並びも反対になります。(注:一度ファイルの最初から読み込んで配列に格納したのち,後ろから出力させるのは不可です)
例:
テキストファイルの最後は次のようになっている.
… c genngo proguram
次のような出力をするプログラムを書く.
marugorp ognneg c …
>>722>>729は同じ
>>716のは弱い
>>730 きみたちのクラスはどうなっとるんだ
>>568 >>612 >>539 >>540
733722:03/05/24 12:16
// cpu::select の if( game_count > 0 ) の中を修正
      int const* const table = &point[ prev ][ prev_player ][ 0 ];
      HAND candidates[ NUM_HANDS ];
      int num_candidates = 0;
      int max_point = 0;
      for( int i = 0 ; i < NUM_HANDS ; ++i )
      {
        int const p = table[ i ];
        if( num_candidates == 0 || p > max_point )
        {
          max_point = p;
          candidates[ 0 ] = static_cast< HAND >( i );
          num_candidates = 1;
        }
        else if( p == max_point )
        {
          candidates[ num_candidates ] = static_cast< HAND >( i );
          ++num_candidates;
        }
      }
      return candidates[ std::rand() % num_candidates ];

<algorithm>は使わなくなった。
修正してみたけど、やっぱり同じ手を出しつづけるとあいこがつづいてしまう。
仕様ですか?>>709
734デフォルトの名無しさん:03/05/24 12:22
友達がたくさんできるプログラムおしえてください

できれば彼女もほしいです
735701:03/05/24 12:23
730
fseekをつかえ!
ネタには面白いものと面白くないものがある
737デフォルトの名無しさん:03/05/24 12:32
>>734
#include<friend.h>

int main()
{
print_friend(友達);
print_friend(彼女);

make_friend(友達候補[], 10000円, 友達);
make_friend(彼女候補[], 1000000円, 彼女);

print_friend(友達);
print_friend(彼女);

return 0;
}

//// 実行結果 ////


いぱーい
いぱーい
>>737
ぼくの環境ではリンクエラーになります。
undefined reference to '彼女候補'
739737:03/05/24 12:50
>>738
そんなマジレスされても困ります
>>731
判断基準は?
そういえば20年くらい前にジャンケンの対戦プログラムの大会が行なわれていたような。
>>737
漏れの環境でもリンクエラーになるよ。漏れは友達候補もリンクエラーでたよ。
鬱だ死NO!
>>740
>>731をチェックした方法(勝はプログラムが勝った数)

ランダムな手を10000個生成する
これとプログラムと勝負させる
(前後の手に関連がないので1:1:1になるはず)
>722>729
3323 勝 3285 負 3392 引
>716
3305 勝 3421 負 3274 引

次に先ほどの>722>729のプログラムが出した手とプログラムを勝負させる
(前後の手に関連があるのでプログラムが勝つはず)
>722>729
5350 勝 2002 負 2648 引
>716
3093 勝 2512 負 4395 引

>716の出力に対しても同様にやってみると、全部同じ結果に……
5188 勝 0 負 4812 引
>716のプログラムはぐーとちょきしか出してこない
744デフォルトの名無しさん:03/05/24 13:27
>>739
マジレス?
わざわざ書かなくてもマジレスだと思ってるのは>>737くらいだから大丈夫。
746743:03/05/24 13:34
どうでもいいけど、引じゃなく分だよな
ヒキーなので引でOK
748デフォルトの名無しさん:03/05/24 13:36
#include <iostream.h>

int main()
{
char *hand[] = {"グー", "チョキ", "パー"};
int gcp;
while(1){
cout << "手を番号で入力して下さい(0:グー 1:チョキ 2:パー)" << endl;
cin >> gcp;
if( gcp<0 || gcp>2 ) break;
cout << "あなた: " << hand[gcp] << "\nコンピュータ: " <<hand[(gcp+2)%3] << "\n" << endl;
}
return 0;
}
749737:03/05/24 13:37
>>744>>745
ごめん深く読めなかった
なるほどリンクエラーね
C++なら普通手の出し方をStrategyパターンにします。
>>750
パターンは詳しく知らないけど、>722の形は普通じゃないの?
>>750
そもそも宿題スレではクラス使いません。
753デフォルトの名無しさん:03/05/24 13:44
おながいします

printf("8進数220の16進数は%xです",0220);
を例にして「100の8進数は144です」
を表示するプログラムを作成せよ

どうしてもわかりません・゚・(ノД`)・゚・
printf( "100の8進数は%oです",100);

> どうしてもわかりません・゚・(ノД`)・゚・
プッ
printf("100の8進数は%oです",100);
756デフォルトの名無しさん:03/05/24 13:48
>>754
サンクス

8進表記が%oっていうのが解らんかったのです
こんなの使ったことなかったし・・・
こんなの普通使わないしmanの読み方の勉強だろうな。 
758デフォルトの名無しさん:03/05/24 13:55
>>755
Googleで
C言語 8進数
で検索したら一番上でいきなり見つかるけど
言い訳にもならん
とういうのを自分で調べるための課題だろう
>>753
> どうしてもわかりません・゚・(ノД`)・゚・
わかるために何かしたのか?
○な外科よ。ちったぁ自分で調べろよな。
煽られて当然
とういうのを自分で調べるための課題だろう
761デフォルトの名無しさん:03/05/24 14:05
○な外科よ
灯油のを自分で調べるための過大だろう

 ̄ ̄ ̄ ̄ ̄ ̄ ̄○ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
           O 。
                 , ─ヽ
________    /,/\ヾ\   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
|__|__|__|_   __((´∀`\ )< とういうのを自分で調べるための課題だったのさ
|_|__|__|__ /ノへゝ/'''  )ヽ  \_________
||__|        | | \´-`) / 丿/
|_|_| 从.从从  | \__ ̄ ̄⊂|丿/
|__|| 从人人从. | /\__/::::::|||
|_|_|///ヽヾ\  /   ::::::::::::ゝ/||
763デフォルトの名無しさん:03/05/24 14:21
ひとまず>>760に日本語を勉強してもらおう
764デフォルトの名無しさん:03/05/24 14:47
>>761をとりあえずひらがなにしてみるが・・・
「まるなげかよ
 とうゆのをじぶんでしらべるためのかだいだろう」
765デフォルトの名無しさん:03/05/24 14:51
it seems to be まるな it is, probably in order to investigate うゆ's by じぶん -- いだ wax
766デフォルトの名無しさん:03/05/24 14:52
それは、じぶんによってうゆ'sを調査するために恐らくそれがそうであるまるなであるように見えます。―― いだろう
767デフォルトの名無しさん:03/05/24 14:53
あーあ
やっちゃった・・・
768デフォルトの名無しさん:03/05/24 14:57
#include <stdio.h>
void main(void)
{
char a[];
printf("理解したいフレーズを入力してください\n");
scanf("%s",a);
printf("理解結果=%s",a);
}
/*出力画面
理解したいフレーズを入力してください
まるなげかよとうゆのをじぶんでしらべるためのかだいだろ
理解結果=それは、じぶんによってうゆ'sを調査するために恐らくそれがそうであるまるなであるように見えます。―― いだろう
769デフォルトの名無しさん:03/05/24 14:58
#include <stdio.h>
       main(){
           int i,j,height;
       
           printf("何段か入力せよ-->");
           scanf("%d",&height);

           for(i=1;i<=height;i++){
           for(j=1;j<=height-i;j++)
               putchar(' ');
             for(j=1;j<=i*2-1;j++)
               putchar('*');
             putchar('\n');
           }
       }
パスカルの三角形のプログラムなのですがどうやって擬似言語で
表すのかよくわかりません・・。
770デフォルトの名無しさん:03/05/24 14:58

 ̄ ̄ ̄ ̄ ̄ ̄ ̄○ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
           O 。
                 , ─ヽ
________    /,/\ヾ\   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
|__|__|__|_   __((´∀`\ )< とういうのを自分で調べるための課題だったのさ
|_|__|__|__ /ノへゝ/'''  )ヽ  \_________
||__|        | | \´-`) / 丿/
|_|_| 从.从从  | \__ ̄ ̄⊂|丿/
|__|| 从人人从. | /\__/::::::|||
|_|_|///ヽヾ\  /   ::::::::::::ゝ/||
>>769
それC/C++の宿題か?
772r:03/05/24 15:43
>>769
疑似言語か...
たとえば
putchar('*')

「表示する(*)」
とか。
つまり関数名やキーワードを日本語に置き換えればいいよ。

細かい変数宣言とかを省略するとなお疑似っぽい。
ジャンケンを尋ねた者です。
ありがとうございました!今からゆっくり見ます。
遅くなってすみませんでした。
>>730
いいかげんうざいから、これを見たらどっか行け。
#include <stdio.h>
int main(int argc, char * argv[])
{
  FILE *pf;
  long pos;
  int c;
  if (argc < 2) {
    fputs("usage: reverse <filename>\n", stderr);
    return 0;
  }
  if (!(pf = fopen(argv[1], "r"))) {
    perror(argv[1]);
    return 3;
  }
  fseek(pf, 0, SEEK_END);
  do {
    putchar(fgetc(pf));
  } while (fseek(pf, -2, SEEK_CUR) == 0);
  return 0;
}
775オークス:03/05/24 16:34
ハノイの搭の一般的なプログラムを教えて下さい
776デフォルトの名無しさん:03/05/24 16:37
★○マ○コは地球を救う★
http://yahooo.s2.x-beat.com/linkvp/linkvp.html
777デフォルトの名無しさん:03/05/24 16:37
>>775

hanoi(a,b,c)
{
hanoi(n-1,b,a);
hanoi(1,b,c);
hanoi(n-1,a,c);
}
778デフォルトの名無しさん:03/05/24 16:44
779オークス:03/05/24 16:49
>>777
わかりません
780デフォルトの名無しさん:03/05/24 16:49
(*/▽\)きゃ〜〜
http://homepage3.nifty.com/coco-nut/
>>777
爪が甘いなぁ。つーか、ネタか?
>>775
ほれ、釣られてやったぞ。

void hanoiTower(int n, char a, char b, char c);
void moveDisk(int n, char a, char b);

// n枚のディスクを棒aから棒bを経由して棒cに移動する。
void hanoiTower(int n, char a, char b, char c)
{
if (n > 0) {
  hanoiTower(n-1, a, c, b);
  moveDisk(n, a, c);
  hanoiTower(n-1, b, a, c);
 }
}

// ディスクnを棒aから棒bに移動
void moveDisk(int n, char a, char b)
{
 printf("No.%dのディスクを棒%cから棒%cに移動せよ。\n", n, a, b);
}
782769:03/05/24 17:02

>細かい変数宣言とかを省略するとなお疑似っぽい。
具体的にどういった省略の仕方でしょうか?
int x; <- こういうのを省く
784デフォルトの名無しさん:03/05/24 17:04
>>782
変数宣言は全部省略すればいい
>>783-784
それは必ずしも真ではないな...
擬似言語といっても、実は実際の言語と同じく、仕様がいろいろある罠。
先生はどんな擬似言語を使えといったんだ? >>769
786769:03/05/24 17:47
・・特に何も言ってませんでした
MIND で記述すれば、擬似言語に見える。
>>786
Cの文法と同じ俺擬似言語ですって、
関数(printf,scanf,putchar)のとこだけ機能説明にしてそのまま出しとけ。
入門書1冊終わったので、1ヶ月かかるプログラムのお題をください。
790デフォルトの名無しさん:03/05/24 18:18
>>789
マウスを動かすと音が変化するプログラムつくって
>>789
このあたりに参加してこれば?

FE風オンラインゲームツクローウヨ( ´@`_ゝ`) 第8章
http://ex.2ch.net/test/read.cgi/entrance/1053693365/
>>790
「マウスが動く」という判断をどうプログラミングすればいいんですか?
超初心者なので。
あと言い忘れてましたが、Cでお願いします。
793デフォルトの名無しさん:03/05/24 19:43
>>792
全部どうすればいいか聞くつもりですか?

> あと言い忘れてましたが、Cでお願いします。

好きなようにすれば良いんじゃね-の。
>>793
ねらいどおりの反応ありがとうございます。
#include <windows.h>
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
MessageBox(NULL,"HelloWorld","HelloWorld",MB_OK);
return 0;
}
796701:03/05/24 22:30
fgetsを使って0-10000の範囲を入力させたいのですが文字を数値に変換するには
どうしたらいいですか?

すいません、例えばasdfとかが入力されたときはエラー処理をしたいのですがそういう
場合もatoiで大丈夫なんでしょうか?
797デフォルトの名無しさん:03/05/24 22:46
2進数同士の論理積求めるプログラムを教えてくださいませんか?
2進でも10進でも16進でも論理積って同じじゃねーの?
|じゃなかった?
>>799
search,insert,delete関数のプログラムなんですが、

#include <stdio.h>
#include <stdlib.h>

#include "list_appli_header.h"
#include "liststructure.h"

int init( void )
{
head = NULL ;
return 1 ;
}

nodeType* search(keyType a_key)
{
nodeType* p = head;
while (p != NULL)
{
if (p->data.key == a_key) break;
p = p->next;
}
return p;
}
前にいた構造体が分からなかった人か?
今度は何が分からんの?
上の続き
int insert(dataType *dp)
{
nodeType* node;
if ((node = (nodeType*)malloc(sizeof(nodeType))) == NULL) return 0;
node->data = *dp;
node->next = NULL;
if (head == NULL)
{
head = node;
}
else
{
nodeType* p = head;
while (p->next != NULL) p = p->next;
p->next = node;
}
return 1;
}
上の続き、

int delete(keyType a_key)
{
nodeType* node;
if (head->data.key == a_key)
{
node = head;
head = node->next;
free(node);
return 1;
}
else
{
nodeType* p = head;
while (p->next != NULL)
{
if (p->next->data.key == a_key)
{
node = p->next;
p->next = node->next;
free(node);
return 1;
}
p = p->next;
}

}
return 0;
}

上の続き、

void printAllData(void)
{
nodeType *p = head ;

while (p != NULL)
{
printKey(p) ;
printf(",") ;
p = p->next ;
}
printf("\n") ;
}

これでコンパイルすると

外部シンボル"_printKey"は未解決です。
外部参照1が未解決です。

とエラーが出るのですが、
どこがエラーなのか教えて下さい。
printKeyが定義されてない。
具体的にどこをどう直せばいいんですか?
808C言語は好きなんだけど・・・:03/05/24 23:11
すみません、教えてください。

問題:キーボードから生まれた年(元号)を入力して、満年齢と
西暦年の計算をして、実行例を示すように出力しなさい。
なお、元号区分と西暦元年の対応は次のとおりです。
m:明治(1868) t:大正(1912) s:昭和(1926) h:平成(1989)

<実行例>  今年が平成15年(2003)の場合

元号年>>s23 ←
s23: 1948年生まれですね。
誕生日に満55歳になります。

とやりたいです。
m、t、s、h、はgetcheでやって、それでその後の数が
1868〜1911だったら明治で1910+入力された数で・・・。
うぁあああんわからないです。
教えてくださいお願いします。
printKeyを作る。
switch文使え。
int hoge(char a, int b) {
if (a == 'm') return 1910 + b;
...
}
using namespace std;

main()
{
char c;
int gyear, syear;
cin >> c >> gyear;
switch(c)
{
case: 'm': syear = gyear + 1868; break;
case 't': syear = gyear + 1912; break;
case 's': syear = gyear + 1926; break;
case 'h': syear = gyear + 1989; break;
}

cout << c << gyear << ": " << syear << "産まれですね。\n誕生日に" << 2003-syear << "歳になります。" << endl;


}
>>808
アレだ
連想配列
m1〜h99ぐらいまで全部登録しとく
814C言語は好きなんだけど・・・:03/05/24 23:26
>>813
本気でそれ、考えてます。
講義じゃまともに教えてもらってないのに、
いきなりこんな課題がでるんですもの。
先々週までprintfでhalloって表示させてただけなのに・・・。
using namespace std;
main()
{
char c;
int gyear, syear;
cin >> c >> gyear;

map<char, int> gmap;
gmap['m'] = 1868;
gmap['t'] = 1912;
gmap['s'] = 1926;
gmap['h'] = 1989;

syear = gyear + gmap[c];
cout << c << gyear << ": " << syear << "産まれですね。\n誕生日に" << 2003-syear << "歳になります。" << endl;
}
816C言語は好きなんだけど・・・:03/05/24 23:30
>>815さん
レス、ありがとうございます。
質問していいですか?
1行目のusing namespace()ってどういう意味なんですか?
あと、gmapてのもわかんないです・・・。
c版

main()
{
<<前略>>

int gmap[CHAR_MAX];
gmap['m'] = 1868;
gmap['t'] = 1912;
gmap['s'] = 1926;
gmap['h'] = 1989;

syear = gyear + gmap[c];

<<後略>>

}

>>816
C++なんでC言語じゃなきゃ駄目なら無視して>>817の方見て
819C言語は好きなんだけど・・・:03/05/24 23:35
>>818さん
はーいみてます。
でもC言語でもgmapが出てくるんですね。
gmapってどういう意味で使ってるんだろう?
>>817はcharが64bitだったら終わってるな。
>>803
前スレだかに書き込まれていたlist_appli_header.hの中身はこうだった。

typedef int keyType ;

typedef struct {
  keyType key ;
} dataType ;

typedef struct node {
  dataType data ;
  struct node *next ;
} nodeType ;

int less(keyType, keyType) ;
int equal(keyType, keyType) ;
keyType key(dataType *p) ;
keyType key2(nodeType *p) ;

void printKey(nodeType *p);

printKey以外にもless、equal、key、key2もあるはずなのだが…
list_appli_header.hを作った人が作っているんじゃないかと思うけど。
search,insert,delete関数を作ったときも当然同様のエラーが出たんで、
printKeyを適当に作って対処した。
822821:03/05/24 23:49
一応そのとき作ったprintKeyを貼っとく。

void printKey(nodeType* p)
{
  printf("%d", p->data.key);
}

次はmainかな。
月曜日、学校に精子を持って行かなきゃなんないんです。
でも、精子の出し方が判んないんです。
お姉ちゃんに聞くと「ちんちんを握れば出るんじゃない?」
と応えが帰ってきましたが、チンチンを握ってみても何も出てきません。
どうすれば精子を出すことができるんでしょうか。
2ccでいいんです!!!
板違いです
>>808 満年齢は、誕生日に年をとらない。
>>825
え?
827C言語は好きなんだけど・・・:03/05/25 00:44
>>825さん
教科書に書いてあるプログラムのソースを見るとなるほどねと
思うんですけど、こういうヒントだけの問題ってどういうものを
どう使えばいいのかさっぱりわからないです・・・。
ハァ、困りました。
>>825
なんか法学で学んだ気がする
誕生日の前の日に歳をとるって。
そのこと言ってるの?
年齢計算ニ関スル法律
へい、お待ち!!
ベテランには「なんだこのプログラム?」と思うかも知れないけど
C言語1ヶ月だから許してね。
あとaとかbとかも。
自分の歳でやったら昭和が合わなかったんで
そこだけ数字変えちゃった。
他の年号も違かったら直しといて。

#include <stdio.h>
#include <conio.h>

int main(void)
{
char nengou;
int a,b;

printf("元号年>>");
nengou=getche();
scanf("%d",&b);

if(nengou=='m') a=1868;
else if(nengou=='t') a=1912;
else if(nengou=='s') a=1925;
else if(nengou=='h') a=1989;

printf("%c",nengou);
printf("%d: %d年生まれですね。\n",b,a+b);
printf("誕生日に満%d歳になります。\n",2003-(a+b));

return 0;
}
831デフォルトの名無しさん:03/05/25 00:55
下記のコードをコンパイルして実行すると、
"セグメントエラー"と出て動作しません。
コンパイラはgcc、osはLinuxです。
なお、コンパイルは -ansi -pedantic -Wall でおこなっていますが、
ワーニング等はでていません。

void HogeTest(char* s) { *s = *s;}
int main(void){
char* Hoge="a";
HogeTest(Hoge);
return 0;
}
832830:03/05/25 00:57
2004にすればよかったのかな?
他の元号のことがわからんかったからなー。
>>831
ここはエラー報告スレではありません。
>>830
それぞれが元年の西暦なら+1するのは当然では?

>>831
char Hoge[] = "a";
835C言語は好きなんだけど・・・:03/05/25 01:01
>>830さん
ありがとうございます!
実行できました。
#include <conio.h>
これ、まだ習ってないんで今から教科書で調べてみます。
836サンプルです:03/05/25 01:03
☆オススメ! カワイイ女の子満載のHサイト☆ 〜二日間だけ無料です〜
http://yahooo.s2.x-beat.com/linkvp/linkvp.html
837830:03/05/25 01:06
>>834 いやーあんま難しいことわからんから(笑 こんなこと言うと叩かれる!?)

っていうか上にも答えてる人いるの忘れてた!!
へい、お待ち! なんて威勢良く言う場じゃなかったな。

初心者には初心者のプログラムのほうがわかりやすいと思ってさ。
自分もgmapってわからから。

あ、できたみたいでよかったね。
合ってるの昭和だけかも知れないから気をつけて(笑
838C言語は好きなんだけど・・・:03/05/25 01:10
>>830さん
getcharでもできるみたいなんで書きかえてみたんですけど、
それでも動いてくれました。
今からじっくり解析してみます!
839831:03/05/25 01:15
>>834
これでうまくいきました。どうも有難う。
>>828
明日から二十歳だと調子こいて軽い犯罪をおかしたやしが、実名公開されて慌てふためく、
なんていうニュースがありましたねぇ。
選挙も、誕生日前日から投票できます(誕生日前日=投票日ならば)。
>>840
そういえば4月1日生まれは、4月2日生まれよりもひとつ上の学年になるらしい。
誰か、その真偽をここで教えてくんなまし。
>>830
>>834じゃないけど一言。
明治元年が1868年なら、1868-1で1867足すのは自明だろ。
難しいどころか小学生でもわかることだ。
>>841
その通り。
尤も、不憫に思って1年ずらすことも多いそうだが。
844デフォルトの名無しさん:03/05/25 01:34
sin(x)をもとめるプログラムでxに0から2πまでπ/8きざみで入れていきたい
のですが例えば3π/8を入力したいときはどうすれば(・∀・)イイ!!ですか?

3π/8は3.14÷8の値を入力するしかないですか?
M_PI*3/8
846830:03/05/25 01:37
>>842 うぅーがんばって5分ぐらい考えたよー。
明治元年=明治1年か明治0年かわからなかったらしい。
まぁ許して。
847C言語は好きなんだけど・・・:03/05/25 01:41
>>830さんのプログラムはバッチリだと思うんですけど、
なにか不都合があるんですか?
親戚縁者みんなの生年をにゅうりょくしてみましたけど
どれもちゃんと表示してくれました。
ありがとうございます。
848844:03/05/25 01:48
scanf("%lf",&x);
のxに1/8って入力できますか?
M_PIって標準じゃないよね。
850830:03/05/25 01:49
不都合あったよー。
親戚縁者はおろか、自分の歳すら忘れそうに
なる俺には平成15年生まれを調べるしか方法がなかった。

結果は「生まれた年2004、満1歳」

a=xxxx の部分を昭和以外-1してくれればオッケー。
>>847
>>830は昭和だけ元年の西暦が違う。
年齢=2003-(元年の西暦)-((元号年)-(元年=1))
  =2004-(元年の西暦)-(元号年)
>>848
1.0/8
853830:03/05/25 01:52
結果は 満ー1だったわ
ってどうでもいいか(笑
>>849
#include <math.h>
>>844
式を入力したいなら、解析ロジックを作る必要あり。
1/8程度なら、.125ですむから計算させればいいんじゃないのか?
>>854
-ansi
857844:03/05/25 02:03
解析ロジック??
7/8はどうすればいいですか・
0.875
859844:03/05/25 02:09
あ!!1から7は全部8で割り切れますね。
860C言語は好きなんだけど・・・:03/05/25 02:09
これでオッケですか?

#include <stdio.h>

int main(void)
{
char nengou;
int a,b;

printf("生まれた年を元号で入力してください。\n");
printf("明治ならm、大正ならt、昭和ならs、平成ならhです。\n");
printf("元号年>>");
nengou=getchar();
scanf("%d",&b);

if(nengou=='m') a=1867;
else if(nengou=='t') a=1911;
else if(nengou=='s') a=1925;
else if(nengou=='h') a=1988;
printf("%c",nengou);
printf("%d: %d年生まれですね。\n",b,a+b);
printf("誕生日に満%d歳になります。\n",2003-(a+b));

return 0;
}
>>860
元年の前の年という不自然な定数を並べるのはどうかと
862775:03/05/25 02:12
下のプログラムのmain関数はどうなりますか?
void hanoiTower(int n, char a, char b, char c);
void moveDisk(int n, char a, char b);

// n枚のディスクを棒aから棒bを経由して棒cに移動する。
void hanoiTower(int n, char a, char b, char c)
{
if (n > 0) {
  hanoiTower(n-1, a, c, b);
  moveDisk(n, a, c);
  hanoiTower(n-1, b, a, c);
 }
}

// ディスクnを棒aから棒bに移動
void moveDisk(int n, char a, char b)
{
 printf("No.%dのディスクを棒%cから棒%cに移動せよ。\n", n, a, b);
}


863C言語は好きなんだけど・・・:03/05/25 02:17
>>861さん
じゃこうしますね。

if(gengou=='m') a=1868-1;/* もしmだったらaは1867 */
else if(gengou=='t') a=1912-1;/* もしtだったらaは1911 */
else if(gengou=='s') a=1926-1;/* もしsだったらaは1925 */
else if(gengou=='h') a=1989-1;/* もしhだったらaは1988 */
864830:03/05/25 02:28
>>861 グッド。

printf("%c",nengou);
printf("%d: %d年生まれですね。\n",b,a+b);

自分で書いといてナンだけど、合体させろよって感じだね

printf("%c%d: %d年生まれですね。\n,nengou,b,a+b);
>>863
ふつー
printf("%d: %d年生まれですね。\n",b,a+(b-1));
こっち直すんじゃねーの?
866830:03/05/25 02:29
\n"
ちっちゃなミス多いなー自分
867C言語は好きなんだけど・・・:03/05/25 02:31
>>864の830さん
いえ、最初の方がわかりやすかったです。
%cがなんなのかよくわかったし。
ありがとうございます。
ホント助かりました。
>>862
main() {
hanoiTower(64, 'A', 'B', 'C');
}
>822
レスありがとうございます。
さきほどのを付け足して、実行できたのですが、
1,3,5,9を挿入しようとすると、、1,3,9,5と挿入されてしまうんです。
どこのプログラムが違うのでしょうか?
870822:03/05/25 03:27
>>869
> 1,3,5,9を挿入しようとすると、、1,3,9,5と挿入されてしまうんです。

この部分のプログラムまだ書き込みされてなかったと思うけど、
どう調べろと…
みなさんは初心者のときハノイの塔とかの再帰の問題
出されてサクッとプログラムが浮かびましたか?
俺は一度はソースを見ないと駄目です。
難しすぎて再起不能になりそうでつ。
>>869
このinsertで期待通りに動くか試してみてくれ。
int insert(dataType *dp) {
  nodeType* node;
  if ((node = (nodeType*)malloc(sizeof(nodeType))) == NULL) return 0;
  node->data = *dp;
  if (head == NULL || node->data.key < head->data.key) {
    node->next = head;
    head = node;
  } else {
    nodeType* p = head;
    while (p->next != NULL) {
      if (node->data.key < p->next->data.key) break;
      p = p->next;
    }
    node->next = p->next;
    p->next = node;
  }
  return 1;
}
見てわかればそれでいいんじゃない?
>>871
再帰呼び出しと再起不能がかかっているわけね。
875クロス:03/05/25 10:19
↓のものは10までの階乗を表示するものですが
15まで表示するにはどうしたらいいですか?

#include<stdio.h>

int factorial (int) ;

int main ()
{
int i;

for (i = 1; i <= 15; i++) {
printf("%d! = %ld\n", i, factorial(i));

}

return 0 ;

}



int factorial ( int number )
{
if (number <= 1) {
return 1;
}
else{
return ( number * factorial (number - 1) ) ;

}
876デフォルトの名無しさん:03/05/25 10:48
すでに15まで出力してる気がするのは俺の気のせい?
for (i = 1; i <= 15; i++)

この命令でiをどこまで増やすかで階乗の計算をどこまでやるか
決めてんじゃないの?
>>875
int → long long int
%ld → %lld
C99に対応したコンパイラを使う
878クロス:03/05/25 10:54
>>876
15までの正常な値が出ないんですよ
879876:03/05/25 10:55
>>877
オーバーフローまで考慮に入ってなかった、おたくやるねぇ
880クロス:03/05/25 10:59
>>875
なんかうまく出来ないみたいです。
881876:03/05/25 11:04
じゃあ int じゃなくて double でも使って見れば?
俺も昔フィボナッチ数列のN番目の値求める時にオーバーフローしまくったけど
変数の型イジクリマワシまくってたらなんかいい値が出るようになったよ。


って回答になってないね、ごめん
882クロス:03/05/25 11:08
>>881
成功しました。
ありがとうございました。
883クロス:03/05/25 11:28
追加質問なんですけど875を
ローカル変数と再帰呼び出しパラメータをプリント
するように出来ますか?
>>883
こうしたいってこと?
int factorial ( int number )
{
  printf("%d\n", number); // ← こう?
  if (number <= 1) {
    return 1;
  }
  else{
    return ( number * factorial (number - 1) ) ;
  }
}
doubleで15の階乗が正しく計算出来るかどうかはきちんと検討すべきことだと思うな。
886クロス:03/05/25 15:19
>>884
それでいいのか僕にはよくわからりません。
でもいろいろ表示できたみたいです。
ありがとうございました。
>>885
計算してみたらあってましたよ。
>804のプログラムなんですが、
三行目 構造体を指すポインタ変数を確保する。
四行目 headのdataメンバーのキーと、削除したキーが等しいならば、
六行目 headの先頭アドレスをnodeにコピーする。(直感的にnodeはheadを指している)

ここまでの解釈で間違ってる所ありますか?
そして七行目のnodeのnextメンバーをheadに代入という所がわからないんです。
nodeはただのポインタ変数なのにメンバーが出てくるのがわからなくて。

八行目 nodeを削除。
九行目 削除成功
十一行目 そうでないならば、
十三行目 構造体を指すポインタ変数pを確保し、そこにheadの先頭アドレスを代入。

そして十四行目の、pのnextメンバーがNULLが等しくないならば、という所なんですが、
ここもpはただのポインタ変数なのになんでメンバーが出てくるのかわかりません。

解釈で間違えてる所を教えて下さい。


十五行目 
double factorial(unsigned n)
{
double result = 1;
for (; n > 1; n--) {
result *= n;
if (log10(result) > DBL_MANT_DIG * log10(2)) {
result = 0;
break;
}
}
return result;
}
>872
一つエラーが出てしまいました。
890888:03/05/25 15:45
ヘッダ追加。コンパイルする時は -lm 付けること。

#include <float.h>
#include <math.h>

double factorial(unsigned n)
{
double result = 1;
for (; n > 1; n--) {
result *= n;
if (log10(result) > DBL_MANT_DIG * log10(2)) {
result = 0;
break;
}
}
return result;
}
>>887
node が head を指しているというのは、node に操作すると head の中身を操作できるということ。
すなわち node->next は、head->next に等しい。
したがって、
head = node->next;
は、次のノードに head を進める。char*a; a = a + 1; という操作に近い。

p についても同じ。p = head とすることで、p で head の中身を操作できる。
892872:03/05/25 16:43
>>889
どういうエラーが出たの?
コンパイラがエラーを出したのなら、それを貼り付けてくれ。

やり取りを円滑に進ませるために、情報を小出しにしないで
十分な情報を書き込んで欲しいんだけど…
cjzfdvqnxokfkpbpt
>891
説明どうもありがとうございます。
>887の続きなんですが、

十四行目 pのnextメンバーとNULLが等しくないならば、(さらに潜り)、
そして十六行目のp->next->data.keyとは何を意味してるんですか?
a_keyは削除しようとしているキーですよね。

p->next->data.keyと削除しようとしているキーが等しいならば、(さらに潜り)、

十八行目 pのnextメンバーをnodeにコピーする。
十九行目 nodeのnextメンバーをpのnextメンバーにコピーする。
二十行目 nodeを削除する。
二十一行目 削除成功。
そして二十三行目の(if文で偽ならば)pのnextメンバーをpにコピーする、なんですが、
直感的にどういう事を意味してるんですか?
二十七行目 削除失敗。

解釈で間違えている所を教えて下さい。
>892
もう一度コンパイルしたらエラー出ませんでした。
私の間違えだったようです。
すみませんでした。
今度はちゃんと挿入できました。
896872:03/05/25 19:17
>>895
最初に作ったinsertがリストの最後に挿入するもの。
次に作ったのが、keyが昇順になるように挿入するもの。
前者はinsertではなくaddとか名前がつくのが普通で、そのことを忘れてました。

>>869 の書き込みを↓のように書いてくれれば直ぐにわかったのに…
1,3,9,5という順番でを挿入しようとする(insertを呼ぶ)と、1,3,5,9となって欲しいのですが、
1,3,9,5となってしまいます。
1ステップ毎にリスト構造の図書いてみ
1 -> 3 -> 9 -> 5 から
1 -> 3 -> 5 にする処理。
(9を削るなら)
>897
はい。
私もそう思って、何度も書こうとしているのですが、、
プログラムの解釈で混乱して上手くステップを踏めなくて。
図はアップローダーじゃなきゃ無理ですしね・・・。
どう解釈すればいいか教えて下さい!
>>886
> 計算してみたらあってましたよ。

それじゃいかんだろう。
例えば30の階乗は正しく計算できないわけで、
どういう場合に正しく計算できてどういう場合に
そうでないのかを理解していなければ、
恐くて使えないと思うんだが。
>>900
べつに886は「15までの階乗」と指定して質問してるんだからいいんじゃない?
それ以上のことが必要になったらまた質問するなり自分で調べるなりするでしょ。
902578:03/05/26 00:05
>>699
超亀レスですが、激謝です。
おうちではコンパイルできないので学校行ってから試してみます。
C激初心者なんで、分からないとこが少々ありますが、これを使って勉強します。
ありがとうございましたっ。
>898
p->next->data.keyとはpのnextメンバーのdataキーということですよね?
これが削除するってことなんですか?
始めは何もないところにデータを挿入するわけですが、
直感的なイメージではどんなイメージをすれば良いのでしょうか?
>>903
delete関数は引数で渡したa_keyと等しいkeyを持つ要素をリスト中から削除するというように作った。
機能としては2つに分かれて、1つはa_keyと等しいkeyを持つ要素をリスト中から探す。
もう1つは、探し出した要素をリストから削除する。
この部分が探すところ。
  if (head->data.key == a_key) {
    /* ここに削除処理が入る */
    return 1;
  } else {
    nodeType* p = head;
    while (p->next != NULL) {
      if (p->next->data.key == a_key) {
        /* ここに削除処理が入る */
        return 1;
      }
      p = p->next;
    }
  }
  return 0;
最初のifは探している要素がリストの先頭にあるかという判定をしていて、
削除するときにheadをいじらなければならないので、特別な扱いにしている。
本来ならheadがNULLかをチェックした方がいいのだが入れ忘れた。
単方向リストの削除の場合、削除する要素の1つ前の要素のnextをいじらなければならない。
そのため、elseで定義しているpは1つ前の要素を指すようにしている。
p->next->data.key == a_key の部分は、pの次の要素のkeyがa_keyと等しいか判定する。
等しければ削除、等しくなければpを更新して、次(次の次?)の要素を調べられるようにする。
リストの終端(p->nextがNULL)まで辿り着いたら、削除できませんでしたとなる。
906905:03/05/26 01:20
この2つが削除するところ
  node = head;
  head = node->next;
  free(node);

  node = p->next;
  p->next = node->next;
  free(node);
headとp->nextが違うだけで形は同じ。上の方を解説すると、
削除する要素を指すのはheadだけ。headを書き換えるので、その前にnodeも指すようにして
要素を見失わないようにする。
次にheadを書き換える。headを次の要素を指すことで短絡させ、要素をリスト中からはずしている。
ここはheadとnodeは同じものを指しているのでhead = head->next;と書いても同じ意味。
最後に削除する要素を実際に削除する。
>>904
構造体を箱で描く。
ポインタ変数は点にラベルを書いて表し、線を引く(矢印がよい)。
next とかは、箱の中の変数から、(自分自身を含む)箱への線が結ばれる状態。
908デフォルトの名無しさん:03/05/26 03:06
英語、数学、国語の得点を入力して3科目の成績により、
判定結果を表示するプログラムを作成しなさい。
3科目とも60点以上のとき、 “あなたは優秀です。”
3科目中2科目が60点以上のとき、“あなたは合格です。”
3科目中1科目だけが60点以上のとき、"あなたは保留です。再度試験を受けて下さい。“
3科目とも60点未満のとき、"あなたは不合格です。来年がんばりましょう。"

と出るように作れという問題なのですが初心者な物で躓いてます。
教えて下さい。よろしくお願いします。if文をうまく使うようですが。
>>908
#include <stdio.h>

int main(void)
{
int e, m, j;
int flags = 0;

scanf("%d", &e);
scanf("%d", &m);
scanf("%d", &j);

if(e >= 60) flags |= 0x00000001;
if(m >= 60) flags |= 0x00000002;
if(j >= 60) flags |= 0x00000004;

switch(flags)
{
case 0x00000000: puts("あなたは不合格です。来年がんばりましょう。"); break;
case 0x00000007: puts("あなたは優秀です。"); break;
case 0x00000001:
case 0x00000002:
case 0x00000004: puts("あなたは保留です。再度試験を受けてください。"); break;
case 0x00000003:
case 0x00000006:
case 0x00000005: puts("あなたは合格です。"); break;
}

return(0);
}
>>908
#include <stdio.h>

int main(int argc, char *argv[])
{
const int BORDER = 60;
const char *text[] = {"あなたは不合格です。来年がんばりましょう。\n","あなたは保留です。再度試験を受けて下さい。\n","あなたは合格です。\n","あなたは優秀です。\n"};
int check=0;
int e,m,j;

printf("英語 数学 国語>");
scanf("%d %d %d",&e,&m,&j);
if(e >= BORDER) check++;
if(m >= BORDER) check++;
if(j >= BORDER) check++;

printf(text[check]);

return 0;
}
911デフォルトの名無しさん:03/05/26 03:38
>>909

すいません。わざわざやって貰ったのに申し訳ないんですが
本当に教科書の最初の方の知識だけ使って解く問題なので
int x y z

printf("英語="); scan("%d",$x);
printf("国語="); scan("%d",$y);
printf("数学=") ;scan("%d",$z);

if....って続くように作るようなんです。
だからflagとかcaseとか使わないしわからないんです。使うのは
あとはelse ifとかelse位なんです。
912デフォルトの名無しさん:03/05/26 03:42
>>910
上にも書いたんですが本当に基本のだけ使うのでBORDERとか check++
とかは使わないで出来ませんか?ホントifとelseだけで。
最終的には8パターンの実行結果が出るように作るんですけど。
@3科目とも60点以上のとき A英語および数学が60点以上のとき B英語および国語が60点以上のとき
C数学および国語が60点以上のとき D英語のみが60点以上のとき
E数学のみが60点以上のとき F国語のみが60点以上のとき G3科目とも60点未満のとき
こんな感じに。
>>910
const char * は static const char *const の方がいいんでないかな。
scanf("%d %d %d", はscanf("%d%d%d", でいいね。

>>908
定数くらい使わせろ。
const int BORDER = 60;
if (e >= BORDER && m >= BORDER && j >= BORDER) {
printf("優秀(以下略)\n");
} else if (e >= BORDER && m >= BORDER && j < BORDER ||
e >= BORDER && m < BORDER && j >= BORDER ||
e < BORDER && m >= BORDER && j >= BORDER) {
printf("合格\n");
} else if (e >= BORDER && m < BORDER && j < BORDER ||
e < BORDER && m >= BORDER && j < BORDER ||
e < BORDER && m < BORDER && j >= BORDER) {
printf("保留\n");
} else {
printf("不合格\n");
}
914デフォルトの名無しさん:03/05/26 03:54
>>913
いや、使わせろといわれましても。。
学校の宿題なので習っていない物を使うわけには行かないんです。。すいません。
なんか8パターンあるからどうとかって言われたんですけどわからなくて。
どうかよろしくお願いします。ifとelseで。。
>>914
だから後は勝手に自分で書き換えろ。
>>909>>910>>913もきちんと8パターンについて処理している。
>>914
ここは宿題をやってもらうスレじゃないぞ。
宿題を勝手にやるスレだからな。
>>913
出力結果は4パターンでしょ?
8パターンの実行結果言われても

>>916
ワラタ
>>917
間違えた。 >>914へのレスです
919デフォルトの名無しさん:03/05/26 04:01
うなんですけど。出来ませんかね。ホントわかんないんですよ。
枝分かれさせていく図までは書けたんですがこの先どうしていいのか。
皆さんが書いてくださったプログラムは見たことのない物が使われていてわからないんです。
優秀
@英語数学国語が60点以上のとき

合格
A英語数学が60点以上のとき
B英語国語が60点以上のとき
C数学国語が60点以上のとき

保留
D英語が60点以上のとき
E数学が60点以上のとき
F国語が60点以上のとき

不合格
G英語数学国語が60点未満のとき
921デフォルトの名無しさん:03/05/26 04:09
なんとなく>>913さんのはelse if使ってくれて60とB〜を置き換えてるっぽいので
大分同じ感じがする気がします。でも文の間にある縦棒二本とかどうすればいいのか
さっぱり。。教えて下さい。
922デフォルトの名無しさん:03/05/26 04:13
#include <stdio.h>

int main(void)
{
int e, m, j;

scanf("%d", &e);
scanf("%d", &m);
scanf("%d", &j);

if((e >= 60) && (m >= 60) && (j >= 60)) //1
puts("あなたは優秀です。");

else if((e >= 60) && (m >= 60) || //2
(e >= 60) && (j >= 60) || //3
(m >= 60) && (j >= 60)) //4
puts("あなたは合格です。");
else if((e >= 60) || (m >= 60) || (j >= 60)) //5, 6, 7
puts("あなたは保留です。再度試験を受けて下さい。");
else //8
puts("あなたは不合格です。来年がんばりましょう。");

return(0);
}
>>921
じゃあ縦棒二本を){}elseif(で置き換えろ
>>921
if (x >= 60 && y >= 60 && z >= 60)
  printf("優秀(以下略)\n");
elsx if (x >= 60 && y >= 60 && z < 60)
  printf("合格\n");
elsx if (x >= 60 && y < 60 && z >= 60)
  printf("合格\n");
elsx if (x < 60 && y >= 60 && z >= 60)
  printf("合格\n");
elsx if (x >= 60 && y < 60 && z < 60)
  printf("保留\n");
elsx if (x < 60 && y >= 60 && z < 60)
  printf("保留\n");
elsx if (x < 60 && y < 60 && z >= 60)
  printf("保留\n");
else
  printf("不合格\n");
>>922
ご親切に番号までふっていただいてありがとうございます。

>>924
おおっ!
なんかもう見てわからない記号は「&&」だけになりました!
一個一個を区切る場合はこのダブルアンドを使うしかないんですね?
なんか教科書にも載って無いし習ってもなかったから
どうすればいいのかわからなかったんです。
縦棒二本っていうのは922さんと924さんとの違いを見る限りelseif一回にまとめてその
条件に当てはまる物をかけるかどうかなんですかね?
あと913さんのは60をB〜に変えていると。
かなりの長時間皆さんありがとうございました。
きっとこれからも来ると思うんでどうかよろしくお願いいたします。
>なんか教科書にも載って無いし
そんな教科書捨てちまえ。
int i = (x<60)?0:1 + (y<60)?0:1 (z<60)?0:1;
switch (i) ...
>905
>906
とても細かい説明どうもありがとうございます。
そのような感じで>872のinsertの説明もして頂けないでしょうか?
お願いします!
最後に入れるんだろ?
>>925>>926
&&はand。||はor。

>>928
int i = (x<60?0:1) + (y<60?0:1) + (z<60?0:1);
#include<stdio.h>
#include<string.h>

#define BUFSIZE 1000

main()
{
int i=0;
char filename[100];
char buf[BUFSIZE];
FILE *fp;

puts("ファイル名を入力");
gets(filename);

fp=fopen(filename,"r");

fgets(buf,BUFSIZE,fp);

for (i=strlen(buf)-2 ; i>=0; i--)
printf("%c",buf[i]);

fclose(fp);
}

これを元に、半角英数字のみの何行もあるテキストファイルを読み込んで
各行の文字列を逆に表示するプログラムを書くという問題です。
よろしくお願いします。
933932:03/05/26 06:50
訂正
fgetsのところはfscanfなどのほかの関数でもいいです。
何度めだ?
ナウシカ
>>932
それでいいんじゃない?
(ちょっとバグってるけど)
>>936
何行もあるテキストファイル
while (fgets(buf,BUFSIZE,fp)) {
for (i=strlen(buf)-2 ; i>=0; i--)
printf("%c",buf[i]);
putchar('\n');
}
>>938
1行がBUFSIZEを超えたときは?
二つの整数値を読み込んで、
小さい方の数以上で大きい方の数以下の偶数を
すべて加えた値を表示するプログラムを作成せよ。

おせーて下さい。
>>940

#include <stdio.h>
#include <stdlib.h>
int
main(int argc, char **argv)
{
  int a,b;
  if (argc<3) return 1;
  a = atoi(argv[1]);
  b = atoi(argv[2]);
  a = a < b ? b : a;
  printf("%d\n", a<2 ? 0 : a/2*(a/2+1));
  return 0;
}
#include <stdio.h>

int main(void)
{
int sum=0;
int min,max;
int i;
scanf("%d%d",&min,&max);
if(max < min){
i=min;min=max;max=i;
}
for(i=(min+1)/2*2;i<=max;i+=2)
sum+=i;
printf("%d\n",sum);
return 0;
}
for(i=min; i<=max; i++)
if (i%2==0) sum += i;
944941:03/05/26 10:42
>>941>>942>>943
ありがとうございます!
本当に助かりますた
945デフォルトの名無しさん:03/05/26 22:00
和が一定となるような自然数の列を列挙するプログラムを作成せよ
946デフォルトの名無しさん:03/05/26 22:13
ネットのバイト見つけた。バナー収入登録したら1000円くれるってさ。
http://members.goo.ne.jp/home/madcap0  
 
#include <stdio.h>

int main(void) {
 int n, i;

 printf("Input a Number:");
 scanf("%d", &n);
 for (i = 1; i <= n / 2; i++) {
  printf("%d, %d\n", i, n - i);
 }
 return 0;
}
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef char* ET;
struct node
{ET x;struct node *next;};
insertafter(struct node *p , ET x)
{struct node *new;
new = (struct node *)malloc( sizeof(struct node) );
new->x = x;
new->next = p->next;
p->next = new;}
949948:03/05/27 00:01
deletenext( struct node *p)
{struct node *tmp;
if( (tmp = p->next) != NULL )
{p->next = tmp->next;free(tmp);}
}
struct node * initlist()
{struct node *new;
new = (struct node *)malloc( sizeof(struct node) );
new->next = NULL;
return(new);}
main()
{char buf[1000];
struct node *head;
head = initlist();
while ( fgets(buf,1000,stdin) != NULL )
insertafter( head,strdup(buf) );
while ( head->next != NULL )
{printf("%s",head->next->x);
deletenext(head);}
}
このプログラムのリストの最後尾のノードを返す関数を作れという問題です。
よろしくお願いします。
950デフォルトの名無しさん:03/05/27 00:44
951905:03/05/27 00:58
>>929
insert関数は引数で渡したdpをkeyが昇順になるようにリストに挿入するように作った。
機能としては、リストから挿入場所を探す、dpをリストに挿入する。
リストへの挿入は更にリストの要素(node)の作成、実際の挿入とに分かれる。
この部分が要素を作成しているところ。
if ((node = (nodeType*)malloc(sizeof(nodeType))) == NULL) return 0;
node->data = *dp;
mallocで要素分の領域を確保しているが、できなかったら挿入失敗となる。
次に*dpを代入して、挿入する要素を作っている。
nextメンバは、実際に挿入するときに書き換えるのでここではなにもしない。
この部分が挿入しているところ。
node->next = p->next;
p->next = node;
他にもp->nextをheadにした部分がある。
pの指す要素の次に挿入することなる。pの次の要素はp->nextだけが指しいるため、
まずpの次の要素を挿入する要素の次に入れる。そして、pの次に挿入する要素を入れる。

その他の部分が探しているところ。
リストに何も要素がないとき先頭に挿入。
先頭要素のkeyが挿入するkeyよりも小さいときも昇順にするため、先頭に挿入。
deleteと同じく、挿入する箇所の1つ前?の要素のnextをいじらなければならないので
そのためpは1つ前の要素を指すようにしている。
pの次の要素のkeyが挿入するkeyよりも小さいとき昇順にするため、そこに挿入する。
挿入する箇所が見つかったのでループを抜ける。
リストの終端に辿り着いた時(p->nextがNULL)は終端に挿入することになるので、同じくループを抜ける。
mallocが失敗する以外は挿入できましたとなる。
>>948
struct node * gettail(struct node *p) {
  while (p->next != NULL) p = p->next;
  return p;
}

何でinsertnextじゃないんだろ…
953デフォルトの名無しさん:03/05/27 05:07
>>945
拘束条件は?
「自然数の列」だから個数は自由として、重複は認めるの?
954デフォルトの名無しさん:03/05/27 05:09
あ新スレに移ってた。自爆!!
955デフォルトの名無しさん:03/05/27 19:27
 
956山崎渉:03/05/28 12:37
     ∧_∧
ピュ.ー (  ^^ ) <これからも僕を応援して下さいね(^^)。
  =〔~∪ ̄ ̄〕
  = ◎――◎                      山崎渉
こっそり
こっそり
ぬるぽ
  ( ・∀・) | | ガッ!
 と    ) | |
   Y /ノ | |
    / ) .人
  _/し' <  >_Λ ∩
 (_フ彡 V`Д´)/
            / ←>>960
このスレは終了しています。次スレはこれー。

C/C++の宿題やらせてください。7代目。
http://pc2.2ch.net/test/read.cgi/tech/1053963794/
void *nullpo = 0;
>>962
もうそれも終了しかかってるわけだが...。
null は英語では「なる」というふうに読むにも関わらず、
なぜドイツ語風に「ぬる」と読むのか。
>>965
実際の発音聞いてみればいいんじゃない。

http://dictionary.goo.ne.jp/search.php?MT=null&kind=&mode=0&ej.x=37&ej.y=10
967デフォルトの名無しさん:03/06/08 11:14
一番下まで落ちてたぞこのスレ。
のこり34取ってやってくれ
晒しage
969水先案内人:03/06/08 13:38
971970:03/06/08 16:27
しまった。6代目の方だった。逝って来ます。
>>970
ともあれ、おつかれさま
しかしなんでscanfを最初の方で教えるのかねえ。
最初は fgets と fputs で次は fgets と sscanf と fprintf の方がいいと思うんだが。
std::cinを教えればscanfの問題は解決
>>974
うわー、絶対いっしょに仕事したくないタイプ。
7代目の方が先に終るとわ
>>977
うわー、絶対いっしょに仕事したくないタイプ。
>>977
うわー、絶対いっしょに仕事したくないタイプ。
>>978
自己完結してるんだからちょっかいだすなよ…
>>979
うわー、絶対いっしょに仕事したくないタイプ。
何いってる? お前ら仕事無いだろ
>>981
うわー、絶対いっしょに仕事したくないタイプ。
>>1001
うわー、絶対いっしょに仕事したくないタイプ。
おれはお前らと一緒に仕事がしたいよーーーーーーーーーー!!!

ウワーーーーーーン!!