C/C++の宿題なら俺にやらせろ!

このエントリーをはてなブックマークに追加
435takeru
平面上の点を表す構造体Pointを用いて、三角形の三つの頂点座標を持つ構造体 Triangle
を以下のように定義した。


struct Point{
float X;
float y;

};
struct Triangle
struct Point a,b,c;
);

この定義を用いて、構造体Triangle 型の変数 tri を宣言し、三頂点が(1。0、1。0)、
(5。0、3。0)、(4。0、2。0)になるように初期化するプログラムをつくり、頂点座標を
次のように出力せよ。

出力例

三角形の頂点

(1。0、1。0)、
(5。0、3。0)、
(4。0、2。0)

どなたかお願いします。もうしにそうです。
436takeru:02/11/22 18:58
>>435を利用して、三角形の面積を計算するプログラムをつくれ。

三角形の面積は(a,b),(c,d),(e,f)ならば、

面積=1/2×{(e-a)(d-b)-(c-a)(f-b)} の絶対値で表される。

頂点は>>435の値を用いよ。絶対値はifを使っても、fabs()を使っても良い。

出力例
三角形の頂点

(1。000000、1。000000)、
(5。000000、3。000000)、
(4。000000、2。000000)、
面積 1。000

どなたかお願いします。
#include <stdio.h>

struct Point{ float X, y; };
struct Triangle { struct Point a, b, c; };

void PutFloat(float f)
{
  char buf[1024], *p;
  sprintf(buf, "%.1f", f);
  for(p = buf; *p; p++)
  {
    if(*p == '.')
      fwrite("。", 1, strlen("。"), stdout);
    else
      fwrite(p, 1, sizeof(*p), stdout);
  }
}

void PutPoint(struct Point *pt)
{
  fwrite("(", 1, strlen("("), stdout);
  PutFloat(pt->X);
  fwrite("、", 1, strlen("、"), stdout);
  PutFloat(pt->y);
  fwrite(")", 1, strlen(")"), stdout);
}
void PutTriangle(struct Triangle *tri)
{
  fwrite("三角形の頂点\n\n", 1, strlen("三角形の頂点\n\n"), stdout);
  PutPoint(&tri->a);
  fwrite("、\n", 1, strlen("、\n"), stdout);
  PutPoint(&tri->b);
  fwrite("、\n", 1, strlen("、\n"), stdout);
  PutPoint(&tri->c);
  fwrite("\n", 1, strlen("\n"), stdout);
}

void PutTriangleArea(struct Triangle *tri)
{
  float area, a = tri->a.X, b = tri->a.y, c = tri->b.X, d = tri->b.y, e = tri->c.X, f = tri->c.y;
  fwrite("面積 ", 1, strlen("面積 "), stdout);
  area = 1.0f / 2.0f * ((e - a) * (d - b) - (c - a) * (f - b));
  PutFloat(area < 0.0f? -area: area);
  fwrite("\n", 1, strlen("\n"), stdout);
}

int main()
{
  struct Triangle tri = { { 1.0f, 1.0f }, { 5.0f, 3.0f }, { 4.0f, 2.0f } };
  PutTriangle(&tri);
  PutTriangleArea(&tri);
  return 0;
}
しまった、抜け。
#include <string.h>
#include <stdio.h>
#include <math.h>
struct Point{
float X;
float y;
};
struct Triangle{
struct Point a,b,c;
};
void p(struct Point p){
printf("(%f %f)\n", p.X, p.y);
}
void main(void) {
struct Triangle tri;
tri.a.X = 1.0; tri.a.y = 1.0;
tri.b.X = 5.0; tri.b.y = 3.0;
tri.c.X = 4.0; tri.c.y = 2.0;
printf("三角形の頂点\n");
p(tri.a); p(tri.b); p(tri.c);
printf("面積%f", fabs(0.5*((tri.c.X - tri.a.X)*(tri.b.y - tri.a.y) -
(tri.b.X - tri.a.X)*(tri.c.y - tri.a.y))));
}
>>440
仕様をよく読めよ。
442デフォルトの名無しさん:02/11/22 20:12
C言語で画像を
(1) 濃度移動
(2) 濃度変換
(3) 輝度分解能(階調数)
(4) 空間解像度変換
するプログラムをキボンヌ
>>442
画像ソフトを買え。
>>443
gimpってオープンソフトだっけ?
だったらそのソースコードを読む。
オープンソフト........( ゚д゚)
オープンソース?
オーブントースター?
scanf関数で半径rを入力してもらい、
そのrを円を描く関数に渡して円を描くプログラムを…おながいします。
ちなみに、C言語です。。
printf("r=%dの〇",r);
450448:02/11/24 02:09
>449
そのneta 100くらい見た.死ね.
451448:02/11/24 02:10
>449
そのneta 100回くらい見た.死ね.
>>448
環境ぐらい書くもんだ。逝ね。
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
double r;

scanf("%lf", &r);
//circle(x, y, r); //適当な関数に置換せよ
return EXIT_SUCCESS;
}
454448:02/11/24 02:16
>452
SotecのWindows Meです.
#include <stdlib.h>
#define BEGIN do{
#define END }while(1)
#define mymalloc(s) BEGIN m=malloc(s); END
#define BYNARY (((((((
#define x )*2+
void *m;int main(void){mymalloc(BYNARY 1 x 1 x 1 x 1 x 1 x 1 x 1 x 1 );return 0;}
>>450-451
騙るわ、間違えて二重投稿するわ、「すれ立てるまでも」で名前消し忘れるわ、、、もっとしっかりしようぜ?
BYNARY?
#define END }while(1)
本気ですか?
>454
結局コンパイラを書かないあたりネタだな、、、
Bresenham's Algorithmで検索汁!
このマルチポストやろう!
そういえば、

#define BEGIN }
#define END {

これってどうよ?
#define SCREEN_SIZE 100
char screen[SCREEN_SIZE][SCREEN_SIZE];
#define pset(x, y) (screen[x][y] = 1)
void circle(int x0, int y0, int r)
{
 int x, y, dy;
 y = r;
 dy = r - 1;
 for (x = 0; x <= y; x++) {
  pset(x0 + x, y0 + y); pset(x0 - x, y0 + y);
  pset(x0 + x, y0 - y); pset(x0 - x, y0 - y);
  pset(x0 + y, y0 + x); pset(x0 - y, y0 + x);
  pset(x0 + y, y0 - x); pset(x0 - y, y0 - x);
  dy -= x + x + 1;
  if (dy < 0) {
   y--;
   dy += y + y;
  }
 }
}
int main()
{
 int radius, x, y;
 scanf("%d", &radius);
 circle(49, 49, radius);
 for (x = 0; x < SCREEN_SIZE; x++) {
  for (y = 0; y < SCREEN_SIZE; y++) putchar(screen[x][y] ? '*' : ' ');
  putchar('\n');
 }
 return 0;
}
inline void pset1(int x, int y) { screen[x][y] = 1; }
inline void pset2(int x, int y) { screen[y][x] = 1; }
inline void swap(int *a, int *b) { int tmp = *a; *a = *b; *b = tmp; }
inline int abs(int x) { return x >= 0 ? x : -x; }
inline int signum(int x) { if (x > 0) return 1; else if (x < 0) return -1; else return 0; }
void line(int x1, int y1, int x2, int y2)
{
 int x, y, dx = abs(x1 - x2), dy = abs(y1 - y2), d, delta;
 void (*pset)(int, int) = pset1;
 if (dy > dx) {
  swap(&x1, &y1);
  swap(&x2, &y2);
  swap(&dx, &dy);
  pset = pset2;
 }
 if (x1 > x2) {
  swap(&x1, &x2);
  swap(&y1, &y2);
 }
 delta = signum(y2 - y1);
 d = dx / 2;
 for (x = x1, y = y1; x <= x2; x++) {
  pset(x, y);
  d += dy;
  if (d >= dx) {
   d -= dx;
   y += delta;
  }
 }
}
>>463
動くけど、なぜ動くか良く分らない…鬱だ
一連のpset(〜);で、中心点(x0,y0)から、対称な八方向にプロットしている。
x+x,y+yなどは微分値を使用。
xで走査しながら、yで中心点から一定の距離のところを取得(微分値・変化率)。
よくわからん・・・
467デフォルトの名無しさん:02/11/24 10:24
(1)
  引数に与えられた整数が素数であるかどうかを判定する関数 is_primeを作成し、
  入力された正の整数を素数分解して表示するプログラムを作りなさい。

(2)
  年(西暦)月日を入力し、その日が1月1日から何日目になるかを表示するプログラムを作りなさい。
  ただし、その年がうるう年であるかどうかを判定する関数is_leapを作成して利用しなさい。

  うるう年は西暦の年が4で割り切れる年。
  ただし、その年が100で割り切れて、かつ、400で割り切れない場合はうるう年ではない。


一度に2つもすみませんがよろしくお願いします。
>>467
で、いつからここは丸投げスレになったんだ?

正直、あんた向いてない。今いる学校なり会社なりやめて違う道探した方が良いと思う。
>>468
>で、いつからここは丸投げスレになったんだ?
スレできた当初から。
で、〇投げだめな宿題Cスレ
http://pc3.2ch.net/test/read.cgi/tech/1038024989/l50
470デフォルトの名無しさん:02/11/24 12:19
>>468
最初から丸投げスレ。
何も出来ないくせに文句だけ言いたがる厨は、
お外に遊びに言ってなさい。
471C言語暦 3ヶ月:02/11/24 12:20
>>467の(2)を作ってみたよ。
正月を「経過日数1」とした。

今現在は16行制限みたいなんで
4/1000もレスを消費するともったいないので

姉妹スレのソーススレ借りました。

宿題のソースはここにおいてね
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1027870433&res=36
472C言語暦 3ヶ月:02/11/24 12:21
添削きぼんぬ です。
>>472
良ろしいんじゃないですか?分りやすくて。
ツェラーの公式を使えばもっと短くなるだろうけど、
読んだ人は分らなくなるかも。

あ、文字列定数中の()は、エスケープする必要ない弟子。























475C言語暦 3ヶ月:02/11/24 12:43
>>473
)で関数が閉じてしまって 「" がありません」になるかと思ってたよ、Thax.

ツェラーの公式って曜日を算出するものじゃないの?
どうやるのか ソースプリーズ?


























477C言語暦 3ヶ月:02/11/24 12:47
検索したら出てきたよ。
ここが良くまとまっている。
ttp://www.ne.jp/asahi/futohen/sankaku/h102.htm
479デフォルトの名無しさん:02/11/24 13:43
ax^2+bx+c=0
#defineマクロ文を使用し係数を読みこんで、判定し、
実数解がある時はそれぞれのマクロ文をコールし解を求め〜
判別式もマクロ文で作成すること

 朝から何度も適当にやっても解が合いません
判定式と解を出すのを#defineで作っただけでは駄目ですか
仮引数が無いのが駄目ですか
一回講義を休んで分かりませんその時はIF文を習ってました
教科書はTurboC初級プログラミングです




>>479
書いたソース載せろや。
>>480
禿同。
ほんと厨房は実装プログラム載せないよな。
最短距離を探すプログラムを、POINTERを使って
作ってください。
483ねた:02/11/24 13:49
ここに打ち込むのはけっこう大変なんですけど…
なんだか画面狭いし…
気合だ
485479:02/11/24 13:53
#include <stdio.h>
#include<math.h>
#define KAI_0 ((-b+m)/(2.0*a)
#define KAI_1 (-b-m)/(2.0*a))
#define KAI_2 (-b/2.0*a)
/*QR(a,b,c) (-b+sqrt(b*b-a*c*4))/(a*2)*/
#define DD (b*b - 4.0*a*c)

int main(void){

double a,b,c,m,x1,x2;

printf("ax^2+bx+c=0\n");
printf("a=");
scanf("%lf",&a);
printf("b=");
scanf("%lf",&b);
printf("c=");
scanf("%lf",&c);

486479:02/11/24 13:53
if (DD > 0.0){
printf("a=%.1lf b=%.1lf c=%.1lf\n",a,b,c);
m=sqrt(DD);
printf("x1=%lf\nx2=%lf",KAI_0,KAI_1);
}
else if (DD==0.0){
printf("a=%.1lf b=%.1lf c=%.1lf\n",a,b,c);
printf("x=%lf", KAI_2);
}
else {
printf("解なし");
}
}
試行錯誤の末全てがおかしいんだ
>>486
>else if (DD==0.0){

浮動小数点でこういうことしない。
そうだぞ、
else if (!DD) {
で充分。
>>488
アフォですか?
あ、ごめん、ネタだったのね。
491デフォルトの名無しさん:02/11/24 15:52
(double)dat==0
では、判定出来ないもの。
abs(dat-0.0)<epsilon
だっけ?
そんな風に判定しないと
fabs(dat) < DBL_EPSILON

-0.0 は必要無いし
494デフォルトの名無しさん:02/11/24 16:28
C言語でhostコマンド似たような実行をするプログラムって、
どんなプログラムになるんでしょう?
よろしければ、考えてもらえますか?
マルチポストとはなかなか度胸があるな。
HMX-12 萌え
>>463
ブレゼンハムのアルゴリズムだね。

>>464
デジタル微分解析による直線描画。
ふむふむ、
fabs(dat) <DBL_EPSILON
が、プレゼンハムのアルゴリズムで、

デジタル微分解析による直線描画で
hostコマンドと似たようなのものが実装できると

プログラム板は勉強になるなぁ。
499デフォルトの名無しさん:02/11/24 18:13
>>498
Kitty-Guy が発生しました
6と9を読み違えてみたのね…
突っ込みにくいネタはヤメテ!
>>468
プログラムを学んでいる人の大半はプログラマどころか情報系に就職する
わけでもないのだが
502デフォルトの名無しさん:02/11/24 18:30
112233334444555555556666をLz78符号化して
112020343440474059510510606136
という結果を得たとき、これを復号化する際
〜106
を10番目の語句+6ではなく、1番目の語句+0+6番目の語句+…と解釈すると
1122333344445551203316612334となります。
辞書の番号が一桁なのか二桁なのかどう区別したらいいのでしょうか?
503デフォルトの名無しさん:02/11/24 18:30
基地男が発生しました。
>>502
またそのネタかよ…
LZ78は符号化じゃないってば。

符号化の勉強しろよ。エリアス符号とか、SSS符号とか、エントロピー符号化でもイイや。

圧縮スレ行けば?
>>502
宿題なら答えてやるから、宿題の問題文をそのまま示せ。
>>504
エントロピー符号はLZ78に適用出来ないだろ
LZ78自体が表現出来てないんだから
>>506
そのとおりだが、エントロピー符号化の勉強をすれば、
可変長のビット列をバイト指向のストリームに書く方法くらいは
わかるんではないかと思った。
>>506
LZ78,77のようなparsing法は、エントロピー符号化で書けます

1)Eliasのγ、δ符号のように指数部とバイナリ部をエントロピー符号化する
2)記号単位で符号化する(parsing to symbolwise でしらべてみてちょ)
標準入力から無向グラフのデータを与えると、
グラフの辺を全て1度ずつ通る道筋(オイラー路)を出力する
Cのプログラムを書きなさい。
入力の形式は、
・最初の行に頂点の数N
・残りのN行は、それぞれ0番〜N-1番の頂点を表す。
 最初に辺の数が書いてあり、その後に辺で結ばれる相手の頂点の番号が
 並んでいる。区切り記号は1個の空白とする。
・グラフは連結であると仮定してよい。
出力は、頂点の番号をたとえば
12-24-179-3-...
のようにハイフンで結んで標準出力に書き出すこと。

よろしくお願いします。
510デフォルトの名無しさん:02/11/24 19:39
>>509
これってNP完全じゃないの?
皆さん、そんな難しい用語使わないで下さい。
大学院にも行ってないので理解できません。
>>510
ちがう。ハミルトン路ならNP完全だが、
オイラー路はO(N)で求まるはず。
513デフォルトの名無しさん:02/11/24 20:15
オイラーはドラマー
514デフォルトの名無しさん:02/11/24 20:25
必ず1ふでがきできるってこと?
>>512
ケーリーだ。ケーリー。
>>514
できるかどうかはデータによる。
できるとしたら、解がどのくらいの計算量で求まるかという話。
517467:02/11/24 23:26
どなたか>>467の(1)の問題わかる方いませんか?
関数が出てきてから理解できなくなってきたんでお願いします。
>>509
再帰関数
>>517
2以上の整数で割れたら割って、を続けて行けば?
>>517
#include <stdio.h>
int is_prime( int x ) { /* x が素数なら 0、素数でなければ一番小さい素因数を返す */
int n, i;
if ( x < 2 ) return 0;
if ( x % 2 == 0 ) return 2;
n = x/2;
for ( i = 3; i < n; i+=2 )
if ( x % i == 0 ) return i;
return 0;
}
int main( void ) {
int n, d;
fputs( "正の整数を入力してください: ", stdout );
scanf( "%d", &n );
if ( n < 1 ) {
printf( "%d は正の整数ではありません。\n", n );
exit( 1 );
} else if ( n == 1 ) {
puts( "1" );
exit( 0 );
}
while ( (d = is_prime(n)) != 0 ) {
printf( "%d, ", d );
n /= d;
}
printf( "%d\n", n );
return 0;
}
int is_prime(int n){
for(i=2; i<n; i++)
if(n%i==0){
printf("%d ",i);
n/=i;
i--;
}
}
522467:02/11/25 00:30
できました。
どうもありがとうございました〜。
ちっ、遅かったか
bool is_prime(int n, std::vector<int> &factor=std::vector<int>()) {
factor.clear() ;
for(int i=2;i*i<=n;i++) while(!(n%i)) factor.push_back(i),n/=i ;
if(n!=1) factor.push_back(n) ;
return factor.size()==1 ;
}
524デフォルトの名無しさん:02/11/25 07:59
■問題1
FileName = "test.csv"; を開いて 配列 TextData に 1行ずつ格納する プログラムを書け。

■問題2
問1の配列を逆順にする プログラムを書け。

■問題3
test.csv は タブ(\t)区切りフォーマットである。
<table> タグを利用し、CSVファイルの中身を全て表示するプログラムを書け。

C++
>>524
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <vector>
#include <algorithm>
void readFromStream(std::istream &is,std::vector<std::string> &result)
{
 std::string temp;
 while(std::getline(is,temp)) {
  result.push_back(temp);
 }
}
void writeToStream(std::ostream &os,const std::vector<std::string> csv)
{
 os << "<table>" << std::endl;
 for(std::size_t i = 0;i < csv.size();i++) {
  os << "\t<tr>";
  std::string line = csv[i];
  std::istringstream iss(line);
  
  std::string temp;
  while(std::getline(iss,temp,'\t')){
   os << "<td>" << temp << "</td>";
  }
  os << "</tr>" << std::endl;
 }
 os << "</table>" << std::endl;
}
続き
int main(int argc,char **argv)
{
 std::string fileName = "test.csv";
 std::ifstream ifs(fileName.c_str());
 if(!ifs.is_open()) return 1;
 
 std::vector<std::string> csv;
 readFromStream(ifs,csv); //読み込んで
 
 std::reverse(csv.begin(),csv.end()); //逆順にして
 
 writeToStream(std::cout,csv); //とりあえず標準出力に書き出してみる
 return 0;
}
とりあえず1と2だけ。
1:
std::list< std::string > TextData[1];
std::ifstream ifs(FileName);
std::string tmp;
while( std::getline(ifs,tmp) )
TextData[0].push_back(tmp);

2:
TextData[0].reverse();
528デフォルトの名無しさん:02/11/25 09:35
VC++をつかってじゃんけんのゲームを作ってます。ダイアログベース。グー チョキ パーのボタンをそれぞれ配置して、結果に応じて絵が出るようにしたいでつ。
どう記述すればいいか教えてください。
529528:02/11/25 09:38
で、5回負けたらゲームオーバー、5回買ったら勝利ってことにしたいです。
絵が出るというのは、北斗ののびたみたいにアニメチックにしたいです
53046:02/11/25 09:42
.NET flame workでコンパイルするときどうするんでつか?
>>530 それが宿題なんですね。
>>527
ワラタヨ
[課題](C言語)
標準入力で入力された文字列を暗号化するプログラムを作成しなさい。
void NullEncrypt(FILE *in, FILE *out)
{
int ch;
while(ch = fgetch(in), ch != EOF )
 fputch( ch , out );
}
int main() { NullEncrypt( stdin, stdout); return 0;}
#include <stdio.h>
int main(void) {
int c;
while ( (c = fgetc(stdin)) != EOF )
putchar( c-1 );
return 0;
}
#include <stdio.h>
#include <stdlib.h>
int main(int artc, char *argv[])
{ int i, c;
 char *p;
 if (argc < 2) {
  fprintf(stderr, "usage: %s keyword...\n", argv[0]);
  return EXIT_FAILURE;
 }
 i = 1;
 p = argv[1];
 while ((c = getchar()) != EOF) {
  if (! *p) {
   if (++i >= argc) {
    i = 1;
   }
   p = argv[i];
  }
  putchar(c ^ *p++);
 }
 return 0;
}
* ビジュネール暗号 */

#include <stdio.h>

int encrypt(int code, char *keywords[])
{
 if (keywords[0] == NULL) {
  int c = getchar();
  if (c != EOF)
   putchar(c ^ code);
  return c;
 } else {
  char *p;
  for (p = keywords[0]; *p; p++)
   if (encrypt(code ^ *p, keywords + 1) == EOF)
    return EOF;
  return 0;
 }
}

int main(int argc, char *argv[])
{
 while (encrypt(0, argv + 1) != EOF)
  ;
 return 0;
}
538デフォルトの名無しさん:02/11/26 13:57
得点を入力してそれの
平均点と標準偏差と偏差値得点を出力するプログラムを作成せよ。
負の数値を入力したら実行は終了するものとせよ
>>538
単純すぎてつまらない。
540tekeru:02/11/26 16:46
なんとかまにあったっす。
協力してくれた方々感謝します。
541533:02/11/26 17:17
ご協力ありがとうございました。
また来るかもしれないんでよろしくお願いします。
>>540
だれ?
動画を再生するソフト作ってください
多分スレ違いだから安心していい。
545デフォルトの名無しさん:02/11/27 12:48
コンソールからの入力で、実数が入力されたときはdouble型の変数に、
整数が入力されたときにはint型の変数に代入させたい。
とりあえず、

#include <stdio.h>
int main( void ){
char buf[100]=" ";
int idata;
double ddata;
char sdata[100];
while( buf[0] != '\n' ){
printf("?");
fgets(buf , sizeof( buf ) , stdin );
if( sscanf( buf , "%d" , &idata ) == 1 )
printf("int型 : %d\n",idata );
else if( sscanf( buf , "%lf" , &ddata ) == 1 )
printf("double型 : %f\n",ddata );
}
return 0;
}

みたいなコードを書いて見たのだけれども、実行してみると、

?10[Enter]
int型
?10.0[Enter]
int型
になっちゃう。(RedHad Linux,gcc)
下の10.0の入力の時に、double型ってなってくれればうれしいのだけれども
546教えて厨:02/11/27 12:54
[0,1]区間の乱数を十分多く発生させ
[0,0.1],[0.1,0.2],・・・・[0.9,1]区間にいくつ乱数があるかカウントせよ

次に乱数の初期値を変えて、同じ処理をせよ


-----------------------------------
誰か、やってくれませんか?
547教えて厨:02/11/27 12:54
age
>>545
C 標準では、文字列が何を表すかを判定する方法は無い。
さしあたり strchr() で、小数点を意味するドットがあるかどうかを
探してみろ。
>>545
doubleとintで取ってから、値を比べて同じならintを使ったら?

>>546
[0,0.1)とかじゃなくていいのか?
550546:02/11/27 13:12
>>549
いいです。
>>549
"10.0" を int にするのか?
あと [0,0.1) って何?

>>546
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
const unsigned int rand_initial = 12345; // ここに乱数の初期値を設定
const unsigned int rand_number = 10000; // ここに乱数を出す数を設定
unsigned int i, cnt[10] = { 0 };
srand(rand_initial);
for(i = 0; i < rand_number; i++)
cnt[(unsigned int)(rand() * 10.0 / RAND_MAX)]++;
for(i = 0; i < 10; i++)
printf("%1.1f 〜 %1.1f の出現数: %u\n", i / 10.0, (i + 1) / 10.0, cnt[i]);
getchar();
return 0;
}
>>551
数学的には 10.0 = 10 だからおかしくないだろ?

[0, 0.1) ってのは、0以上0.1未満の範囲。
553546:02/11/27 13:19
サンクスコ
>>552
10.0 は有効桁数が設定してあると考えた場合に = 10 にはならないだろ。
「有効桁数が設定してある」 という話を持ち出すべきでないと言うなら、
「数学的には」 という話も持ち出すべきではない。

まあ、545 が明確なルールを設定していないので無意味な議論だが。
555549:02/11/27 13:32
>>551
545のプログラムがトライ&エラーって感じだったので
10.0はint扱いでいいのかなって思ったんだけど、
あー、そういう仕様の解釈の方がまっとうかもな。
>>554
>「有効桁数が設定してある」 という話を持ち出すべきでないと言うなら、
>「数学的には」 という話も持ち出すべきではない。
なんでやねん…

10 = 10.0 = 10.00 = 10.000
は、有効数字が何桁だろうが、有効数字という概念を仮定しようがしまいが
常に成り立つ。
>10 = 10.0 = 10.00 = 10.000
>は、有効数字が何桁だろうが、有効数字という概念を仮定しようがしまいが
>常に成り立つ。

もうちょっと有効数字について勉強してくれ
>>557
ハァ?
負け惜しみはもういいよアフォ。
http://alfin.mine.utsunomiya-u.ac.jp/~niy/algo/s/shannon.html
ここの
if (i>3]&=bit0[cell[i].len&7];
の行、コンパイルエラーになるんだけど、誰かおしえてー
実数⊃整数だから、10も10.0も実数だと思えばいいんじゃないの。

つーか、整数って実数の特殊例でしょ。
たとえば有効数字4桁のとき、10.001と10.002は区別できない。
どちらも10.00という同じ物として扱われる。

そう考えると、10.0は10と同一視するしかない。
>整数って実数の特殊例
それは考え方次第

>そう考えると、10.0は10と同一視するしかない。
いくらなんでも論理展開が無茶苦茶
"10.0" と "10" が別のデータである事は厳然とした事実だ。
あと、554 の最後の行をちゃんと読んでくれ。

それと、556 はおそらく有効数字と言う言葉の解釈が間違ってるから、
本当に調べ直した方がいいぞ。
564549:02/11/27 13:59
>>563
数学の話を急にCの仕様の話に戻すのはズルイ、と思います。
無意味な議論には禿働。
別のデータって…

「内部表現が違うから」というなら、内部表現を決める前にそんなことを
いうのはおかしい。

プログラマのクセかもしれんが、10は整数で、10.0は浮動小数点数で表さな
きゃならないと決めてかかってるんじゃないか?

概念的には(つまり外部仕様としては)整数は実数の一種なんだから、
厳密に10.0として入力されたら、整数の10だと思って問題なかろう。
>>563
>おそらく有効数字と言う言葉の解釈が間違ってるから、
>本当に調べ直した方がいいぞ。

うん。調べなおした。間違ってなかった。
567デフォルトの名無しさん:02/11/27 14:06
有効数字と有効桁数の区別がつかない悲惨な 566 が居るスレはここですか?
厳密でない10.0が何か知らんが
「概念的に整数は実数の一種」というのは中学校の先生が
言っていたのかな?中学校ではよくそう教えるからな
>>567
ヤレヤレ…
有効数字は「桁数」で表します。
「有効数字2桁」とかね。
570デフォルトの名無しさん:02/11/27 14:10
国際的エロリスト

エロカイダ 同時多発エロ おっぱいが高層ビルに激突

http://tv2.2ch.net/test/read.cgi/eva/1038360362/l50



>>568
数⊃複素数⊃実数⊃有理数⊃整数
と大学院(数学専攻)で教わりましたが何か?
>>567=>>568=スーパーDQN
573546:02/11/27 14:11
そんなの高校で習うよ
へー、整数は実数じゃないんだ。
整数は複素数なの?
575デフォルトの名無しさん:02/11/27 14:12
hage
576デフォルトの名無しさん:02/11/27 14:15
[0,1]区間の乱数を十分多く発生させ
[0,0.1],[0.1,0.2]…[0.9,1]区間に幾つ乱数があるかカウントせよ
次に乱数の初期値を変えて同じ処理をせよ。
どういうことが判るか?

わかりましぇーん
救済キヴォンヴ
577568:02/11/27 14:15
別に間違っているなどとは言っておらん
定義しだいだ、と言ってるだけだ
578デフォルトの名無しさん:02/11/27 14:15
ヽ(´ー`)ノ
>>577
みぐるしいからもうやめれ。
実数に含まれない整数って何だよ(ワラ
>>576
ネタだとしたら、2 点。
「作ればあるもーん。定義すればあるもーん。」だろ(w
582579:02/11/27 14:19
>>579
構成的手法では再定義することによって初めて
含まれるようにできるだろ?そういう話
>>582
おいおい。ムズカシイ用語使って煙に巻いたつもりかしらんが、
実数なんていう非加算無限のものに構成的手法が適用できる
わけねーだろ。
s/非加算/非可算/
>>583
その辺は勉強してくれ
デデキントの切断とかコーシー列の同値類とか
>>585
うん。したよ。
自然演繹など、構成論的な手法によって構築できる
公理系は可算無限の対象しか含まないものだけ。

だいたい、constructiveってことはintuitionistic
なんだから、「実数全体の集合」なんてものを扱わない。
587デフォルトの名無しさん:02/11/27 14:27
ようするに10.0を10とみなしても良いってことダロ?
>>587
そんな事は 546 に訊いてくれ。
ちなみに C/C++ の定数の話だったらマズイ。
しまった「構成的」はconstructiveの訳語か、まずった
>ちなみに C/C++ の定数の話だったらマズイ。

数学の話を急にCの仕様の話に戻すのはズルイ、と思います。

まあ、[0, 1.0)という中学校の表記法を知らなかった奴だから、
無理もないんだが。
591589:02/11/27 14:32
いやそういうわけでもないな。問題なし
有効数字が「桁数で表すものじゃない」と思っていて、
整数は実数じゃないと思っていて、
[0, 0.1)という表記法を知らなくて、
constructiveという言葉を知らないくせに
構成的手法という言葉を使ってごまかそうと試みる
厨房のいるスレはここですか?
>>835
アフォですか?
おいおい有効数字の話はよそでやってくれ。
やるんだったら実装レベルの話しをしてくれ。
入力された文字列から小数点検索して処理すれば
いいだけのはなしだろ。入力データをdouble と
文字列で持たせてやればたいていのことができる。
[0, 0.1)
これどういう意味なんだ?
ポインタ本にも書いてあったけど意味わからん
半開区間だっけな?
閉区間  [0,1] 0 <= n<= 1
半開区間 [0,1) 0 <= n< 1
開区間  (0,1) 0 < n < 1
中学校からやり直せ。
>>594
過ぎた話を蒸し返すのはやめてくれ。
括弧の付け間違いで煽られるのか・・・。

書いたヤツがよっぽど高圧的な物言いをしたのか・・・?
区間の表記って中学でやったのか?
最近の中学が進んでいるのか
昔の中学が進んでいたのか
俺の中学だけが遅れていたのか
どれなんだろう
ちなみに、俺は高校でやった記憶があるのだが
for文の式

for( ;(ima %= 12)!= i; printf("%d時\t",++ima));

というのがあるんですが、「%=」の意味はなんですか?
>>602
余りを代入。
604デフォルトの名無しさん:02/11/29 00:55
ima = ima % 12の略
imaを12で割った余りをimaに代入っていう意味
605デフォルトの名無しさん:02/11/29 01:23
Windows98,VC++6.0で
改行入りのデータをファイルに書き込みたいんだけど
\nの前に\rが入るのを防げませんか?
>>603-604
ありがとうございました
607483-485:02/11/29 01:36
>>605
ファイルを"wb"モードでfopenしろ。
>>607
wb・・・
成る程、バイナリモードで開くんですね。
多謝!
勉強し直してきます。
609デフォルトの名無しさん:02/11/30 00:36
cの質問です。
データ1、データにを取り込んでそれぞれの平均値、最大値、最小値を求めるプログラムを作成しろとのことです。
ヒントプログラムがあるので書いておきます。

#include <stdio.h>
main() {
double ×××必要な変数を定義します.
int i;
FILE *fp1;
fp1=fopen("data4.txt","r");
for(i=0;i<3000;i++){
ファイルから読み込んでデータを代入していく処理を追加します
}
最大値,最小値を求める処理を追加します.
平均を求める処理を追加します.
printf("データ1の最大値=%f\n",data1max);
printf("データ1の最小値=%f\n",data1min);
printf("データ1の平均=%f\n",data1ave);
printf("データ2の最大値=%f\n",data2max);
printf("データ2の最小値=%f\n",data2min);
printf("データ2の平均=%f\n",data2ave);
fclose(fp1);
}

それでは、よろしくお願いいたします。
610JPS ◆M0LaMzf5rY :02/11/30 00:42
>>609
最大値、最小値処理するのはfor文の中でしょ?
てかどっかの本にまるまる載ってそう・・・
ヒントではなく、答えなのでは、と思いつつも
データ1とデータ2の仕様(data4.txtの中身)が分からないと
答えようがありません
612609:02/11/30 00:45
こういった中身のものが無数に広がっています。

13.160653,-44.018177
6.428124,-36.433974
12.031670,-26.586817
9.300368,-74.639087
11.545353,-55.847211
5.894994,-4.096887
12.608508,-66.110320
8.221066,-9.025639
613609:02/11/30 00:48
612の数字が(data4.txt)の中身です。
614デフォルトの名無しさん:02/11/30 00:50
>>612
左がデータ1で右がデータ2なの?
はっきり書けよ。
615609:02/11/30 00:55
すみません。
左がデータ1、右がデータ2です。

共に3000個あります。
616JPS ◆M0LaMzf5rY :02/11/30 00:56
あ、どういうこと?
右と左をいっこずつ比べるの?
っていうかforいらなくねー?
617609:02/11/30 00:57
データ1ならデータ1同士を、データ2なら2同士をくらべるみたいです。
double max1,max2,min1,min2,sum1,sum2;
くらい宣言しておくか?
>618
多分、こうしたいのでは
double data1[3000], data2[3000], buf ; /* 宣言 */
fscanf(fp1,"%lf,%lf",data1+i,data2+i) ; /* forの中身 */
620619:02/11/30 01:05
で、その後に、最大・最小・平均値を求めると…
621JPS ◆M0LaMzf5rY :02/11/30 01:05
#include <stdio.h>
int main(void)
{
double max_1 = 0,max_2 = 0,min_1 = 0,min_2 = 0,ave_1 = 0,ave_2 = 0;
char buf[256];
FILE *fp1,*fp2;

fp1=fopen("in_data.txt","r");
fp2=fopen("out_data.txt","w");

while(fgets(buf,sizeof(buf),fp1) != EOF)
{

↓あとはたのんだ!
622619:02/11/30 01:06
bufは要らなかった…
623JPS ◆M0LaMzf5rY :02/11/30 01:07
strtodでできんの?カンマのとこどう区別したらいいんでつか?
C言語についてちょっと質問です。
乱数を使って6面体や8面体などの色々なサイコロを表現しようと思います。
様々な多面体のサイコロを考えるので、汎用性を持たせるために
乱数の部分を以下のような関数にしました。
int ran(int n)
{
 srand((unsigned)time(NULL));
 return (rand() % n);
}
とりあえず、まず6面体のサイコロを10回振ったことを考えようと思い、
これをmain文の中で
 for(i = 0; i < 10; i++)
  printf("%d", ran(6));
と呼び出して、結果を表示させるようにすると
結果は6666…のようになります。
これでは1回サイコロを振った結果をただ単に
10回表示させたようにしか見えません。
ループ用変数iを関数ranの引数として追加してやって、
srandのところを、
srand((unsigned)time(NULL) + i);
とすればうまくいくことは分かるのですが、
この方法はあまり使いたくありません。
他に正しい結果を得るにはどうしたらよいでしょうか?
>>624
srandはプログラムの最初に一回だけ呼んでやれば
ranの中には必要ないです
>>624
コンピュータの実行速度が速いので、同じtime()のsrand()が何度も実行
されてしまうことが原因。

srand()をran()の外に出して最初に一回だけ実行するようにしてご覧。
毎回同じ値で乱数を初期化してるからだろ。
srand()をmain()に漏ってけ。
>>625-627
ケコーン(w
int main(void)
{
  struct STATINFO MinMax[2];
  double in_dbl[2];
  char buf[256];
  int cnt, errcnt, i, at1st = 1;
  FILE *iFP = fopen(DATA_FILE, "r");
  if(!iFP)
  {
    perror("データファイルが見つかりません");
    fputs(DATA_FILE, stderr);
    return -1;
  }
  printf("ファイル %s の処理を開始します。\n", DATA_FILE);
  for(cnt = errcnt = 0; fgets(buf, sizeof(buf), iFP); cnt++)
  {
    if(sscanf(buf, "%lf,%lf", &in_dbl[0], &in_dbl[1]) != 2)
    {
      perror("データが不正です");
      fprintf(stderr, "%d 行目: %s", cnt, buf);
      errcnt++;
    }
    else if(at1st)
    {
      for(i = 0; i < 2; i++)
        MinMax[i].max = MinMax[i].min = MinMax[i].sum = in_dbl[i];
      at1st = 0;
    }
630624:02/11/30 01:23
>625-627
すばやいご解答ありがとうございました。
srandは一回だけでよかったんですね。
mainのfor文の前に持ってきたらランダムな数字が表示されるようになりました。
    else for(i = 0; i < 2; i++)
    {
      if(MinMax[i].max < in_dbl[i])
        MinMax[i].max = in_dbl[i];
      else if(MinMax[i].min > in_dbl[i])
        MinMax[i].min = in_dbl[i];
      MinMax[i].sum += in_dbl[i];
    }
  }
  if(ferror(iFP))
  {
    perror("データファイルの読み込み中にエラーが発生しました");
    fputs(DATA_FILE, stderr);
  }
  fclose(iFP);
  printf("ファイル %s の処理が完了しました。\n", DATA_FILE);
  printf("%d 件のデータを読み込みました。\n", cnt);
  errcnt && printf("%d 件のエラーデータがありました。\n", errcnt);
  if(cnt - errcnt) for(i = 0; i < 2; i++)
  {
    printf("データ %d の最大値 = %lf\n", i, MinMax[i].max);
    printf("データ %d の最小値 = %lf\n", i, MinMax[i].min);
    printf("データ %d の平均 = %lf\n", i, MinMax[i].sum / (cnt - errcnt));
  }
  return 0;
}
#define DATA_FILE "data4.txt"
struct STATINFO { double min, max, sum; };

こんなん。
しまった、2 は定数化できるなあ。
あと、構造体の変数名が微妙なのを直すの忘れた。

まー動くから勘弁して。
宿題やってたら手が冷えた
ヒントに従えばこうでしょ?

#include <stdio.h>
int main() {
double data1[3000], data2[3000] ;
double data1max, data1min, data1ave, data2max, data2min, data2ave ;
int i;
FILE *fp1;
fp1=fopen("data4.txt","r");
for ( i = 0 ; i < 3000 ; i++ ) {
  fscanf ( fp, "%lf,%lf", data1 + i, data2 + i ) ;
}

for ( i = 0 ; i < 3000 ; i++ ) {
最大値,最小値を求める処理を追加します.
平均を求める前処理を追加します.
}
平均を求める処理を追加します.
printf ( "データ1の最大値=%f\n", data1max ) ;
printf ( "データ1の最小値=%f\n", data1min ) ;
printf ( "データ1の平均=%f\n", data1ave ) ;
printf ( "データ2の最大値=%f\n", data2max ) ;
printf ( "データ2の最小値=%f\n", data2min ) ;
printf ( "データ2の平均=%f\n", data2ave ) ;
fclose ( fp1 ) ;
}
> double data1[3000], data2[3000] ;

アフォですか?
637636:02/11/30 01:38
ごめん。

> for(i=0;i<3000;i++){
> ファイルから読み込んでデータを代入していく処理を追加します
> }
> 最大値,最小値を求める処理を追加します.
> 平均を求める処理を追加します.

分かれてたのね。
・・・出題者はアフォですか?
for ( i = 0 ; i < 3000 ; i++ ) {
data1max<*(data1+i)?data1max=*(data1+i):(data1min>*(data1+i)?data1min=*(data1+i):void);
data2max<*(data2+i)?data2max=*(data2+i):(data2min>*(data2+i)?data2min=*(data2+i):void);
}
atteru?
639638:02/11/30 01:39
平均値の前処理忘れた。
#include <stdio.h>
int main() {
double data1[3000], data2[3000] ;
double data1max, data1min, data1ave, data2max, data2min, data2ave ;
int i;
FILE *fp1;
fp1=fopen("data4.txt","r");
for ( i = 0 ; i < 3000 ; i++ ) {
  fscanf ( fp1, "%lf,%lf", data1 + i, data2 + i ) ;
}
data1max = data1min = data1ave = data1[0];
data2max = data2min = data2ave = data2[1];
for ( i = 1 ; i < 3000 ; i++ ) {
  if(data1max < data1[i]) data1max = data1[i]; else if(data1min > data1[i]) data1min = data1[i];
  data1ave += data1[i];
  if(data2max < data2[i]) data2max = data2[i]; else if(data2min > data2[i]) data2min = data2[i];
  data2ave += data2[i];
}
data1ave /= 3000;
data2ave /= 3000;
printf ( "データ1の最大値=%f\n", data1max ) ;
printf ( "データ1の最小値=%f\n", data1min ) ;
printf ( "データ1の平均=%f\n", data1ave ) ;
printf ( "データ2の最大値=%f\n", data2max ) ;
printf ( "データ2の最小値=%f\n", data2min ) ;
printf ( "データ2の平均=%f\n", data2ave ) ;
fclose ( fp1 ) ;
}
>>640
data2max = data2min = data2ave = data2[1]; /* data2[1]が素敵♪ */
642640:02/11/30 01:46
クソだなあ・・・。
エラーチェックまるで無いし、ファイル読み終わってもすぐに閉じないし。
ローカルに巨大配列もかなり痛い。

こういう教えられ方されてると、仕事でも平気でこういうコード書いたりしそう。
643640:02/11/30 01:48
>>641
   ||
 ∧||∧
(  ⌒ ヽ トゥ トゥ トゥマシェリ マ シェーリー
 ∪ 。ノ    トゥ トゥ トゥマシェリ マ シェーリー
  ∪∪
644640:02/11/30 01:50
>>629-632 でいいやん・・・。
したら、こんなどうしようもない間違えしないし。
それとも、バッファ 2 時限にして、double 型でループカウンタ作ればヨカタか?
微妙なバグを残してある所が本当に良いと思って
素敵♪って書いたんですけどね
でも、何でタイムスタンプ(01:47)が遅い漏れ(>>641)の方が先で
タイムスタンプ(01:46)が早い(>>642)の方が後なのだろうか?
ちょっと時空を超えただけだ、気にするな。
タイムスタンプってどこで拾うんだろう・・・
生暖かい場所で拾う。
ちなみに生暖かい温かさは、
プールの中でおしっこを漏らしたときの温度です。
いいえ、感動で流す涙の温度です。
fork()を理解するために、以下のようなプログラムを作成しました。
#include <stdio.h>
#include <unistd.h>
int main()
{
if(fork())
printf("親です\n");
else
printf("子です\n");
return 0;
}
これを実行したら結果は
親です
子です
となるか、
子です
親です
となって、終了するだろうと予想しました。
しかし、実際は
子です親です

となって、メッセージが2つ表示された後に、
2回改行されてしまいます。これはなぜでしょうか?
環境はUNIX+gccです。
>>651
親も子も一緒に動いているのに
なんでお行儀良く、片方の出力が完了した後、もう片方が出力される
と思えるのかな?
653651:02/11/30 20:39
>>652
一緒に動いているとは言っても、厳密には
CPUは同時に1つのプロセスの処理までしかできない、
そこでCPUスケジューラーによってどれか一つプロセスが
選ばれて、実行されている、そして短時間に何回も
そのプロセスを切り替えることにより、
まるで一緒に動いているかのように見せかけていると聞きます。
その辺はあまり分からないのですが、
もしプログラムの一文単位でプロセスが切り替えられるのなら、
と思って、初め、651のような予想をたてました。
でも652さんのおっしゃることから推測するとそれは違うみたいですね…。
文の途中でもどこか特殊な所ではプロセスが切り替えられているのでしょうか?
例えばそれが\nの直前では常に切り替わる、
とかだと納得がいくのですが…。
654デフォルトの名無しさん:02/11/30 21:24
/*問題
 一画素に付き、rgb各8bitの画像データ(320*240)がある。
 任意の閾値(0〜255)を入力すると、それ以上の輝度値を持つ画素のみの画像を
 作成するプログラムを作成せよ。 */

#include<stdio.h>
#include<stdlib.h>
main()
{

unsigned char *img1,*img2;
FILE *fp1;
FILE *fp2;

int x=256,y=256,z=256,i=0,j=0,k=0,l,m,n=0,o=0;
int W[320][240][3],t=0,d=0,A[54];

655デフォルトの名無しさん:02/11/30 21:24
m=54+320*240*3;
img1=malloc(m);
img2=malloc(m);


while(x>=256){
printf("青の閾値(0〜255)=\n");
scanf("%d",&x);
}
while(y>=256){
printf("緑の閾値(0〜255)=\n");
scanf("%d",&y);
}
while(z>=256){
printf("赤の閾値(0〜255)=\n");
scanf("%d",&z);
}

fp1=fopen("Red1.bmp","rb");
fp2=fopen("AAA.bmp","wb");


656デフォルトの名無しさん:02/11/30 21:25
fread(img1,m,1,fp1);

for(i=0;i<=319;i++){
for(j=0;j<=239;j++){
for(k=0;k<=2;k++){

W[i][j][k]=(int)*(img1+t+k+54);
}
t=t+3;
k=0;
}
t=t+240;
j=0;
}

for(o=0;o<=53;o++){

A[o]=(int)*(img1+o);
}

for(i=0;i<=319;i++){
for(j=0;j<=239;j++){
for(k=0;k<=2;k++){

if(k==0){
if(W[i][j][k]<x){
W[i][j][k]=0;
}
}
657デフォルトの名無しさん:02/11/30 21:27
else if(k==1){
if(W[i][j][k]<y){
W[i][j][k]=0;
}
}
else{
if(W[i][j][k]<z){
W[i][j][k]=0;
}
}
}

k=0;
}

j=0;
}

658デフォルトの名無しさん:02/11/30 21:27
for(i=0;i<=319;i++){
for(j=0;j<=239;j++){
for(k=0;k<=2;k++){

*(img2+t+k+54)=(unsigned char)W[i][j][k];
}
t=t+3;
k=0;
}
t=t+240;
j=0;
}
for(o=0;o<=53;o++){

*(img2+o)=(unsigned char)A[o];
}

fwrite(img2,m,1,fp2);

free(img1);
free(img2);
fclose(fp1);
fclose(fp2);
}

て宿題なんだけど、これコンパイルしても上手く動かない…。
どこが悪いか教えていただけないでしょうか
>>653
君の予想はノンプリエンプティブなマルチタスクでのみ当てはまる。
そういうシステムではプロセスは勝手に切り替わらないで、特定の場所でのみ切り替わる。

プリエンプティブなマルチタスクOSではほとんどいつでもどこでも切り替わる。
切り替わるのはCPUの命令単位でプログラムの1文字じゃない。
切り替えるタイミングは要するに時間で決まるので、切り替わる場所は不定。
逆に切り替えられない場所が特殊な場所は有る。

詳しく知りたければアセンブラ勉強しなさい。
>>659
アセンブラか?
>>660
加藤茶以外はなかなかつけませんが・・・
662名無しの学生サソ:02/12/01 01:32
swap (type, a, b) でtype型の a と b の値を交換する関数マクロを作成せよ。

という問題がわかりません。どなたかヒントを…
>>662
#define swap(type,a,b) {type t;t=a;a=b;b=t;}
正確には
#define swap(type,a,b) do{type t, t=a, a=b, b=t;}while(0)
665662:02/12/01 01:45
>664
なるほど!関数マクロで{}が使えるんですね!気が付かなかった…
どうもありがとうございました。
666662:02/12/01 01:48
訂正
×気が付かなかった
○知らなかった
関数はマクロじゃないしマクロは関数じゃない。
>>667
俺もオモタ。
パラメータ付きのマクロを関数マクロという。
この場合パラメータの有無は関係ないけどな。
671デフォルトの名無しさん:02/12/01 02:07
>>669
岩ねーよ(w
普通は関数型マクロというな。
>>671
キティはだまってろ
「関数マクロ」(w
こいつらアフォだ。
関数マクロなんて聞いたことないYO!
いかにもDQNっぽいな。
規格だと、標準ライブラリ
関数が同時にマクロとしても定義してあっても良いことになっている。
たとえば、getcharやgetcはたいてい関数定義とマクロ定義の両方が
ある。

それとごっちゃにしてるんでは?
引数のあるマクロは「引数つきマクロ」だよ。
google
「関数マクロ C言語」 318件
「関数型マクロ C言語」 38件
「引数つきマクロ C言語」 23件
(ププッ
678654:02/12/01 02:24
俺の問題分かる人おらんのかな?
>>678
読む気がしない。
やってることを言葉で説明してみ
>>674-676
だぁーーーーっはっはっはっは!!!
D Q N 決 定 だ な (プー
>>654
まず輝度から調べなおせ。
“任意の閾値(0〜255)を入力するとそれ以上の輝度値”と
言われてるのに、三色の閾値を要求しているのは明らかな勉強不足による無知
(ヒント Y=0.3*R+0.59*G+0.11*B)
つかそれ以前に、

int W[320][240][3]

は、やめてくれよ。
683654:02/12/01 02:52
int W[320][240][3]は問題でつか?
>>683
コンパイラ(環境)によっては通るんだろうけどなぁ。。。
いきなりスタックを200KB強とるプログラムってのはいかがなもんかと。
685超初心者:02/12/01 02:58
ダイアログベースで作成しています。ファイルをコピーするアプリケーションで
コピー元コピー先をボタンをクリックしファイルダイアログボックスを表示させ
、スタティックテキストにファイルまでのパスを表示するというものです。そし
て、もう一つのボタンがありクリックすると、ファイルのコピーを開始するとい
うものです。
但し、以下の場合はメッセージボックスを
表示する。
1.コピー元ファイル名が指定されていない。
2.指定のコピー元ファイルが存在しない。
3.コピー先ファイル名が指定されていない。
4.コピー先ファイルが既に存在する。

4の場合は、問い合わせメッセージの表示とし
ユーザが上書きOKを選択した場合のみ、
コピー実行されるようにする。


という感じです。よろしくお願いします。
何をよろしくお願いするんだ?
687超初心者:02/12/01 03:03
ソースの方よろしくおねがいします。
ルーク!!ソースを使え!!
( ゚д゚)ポカーン
「関数マクロ C言語」 318件
これってほとんど「関数、マクロ」に引っかかってるけど…
ところで「関数マクロ」って英語でなんていうの?
functional macro
>>691
function-like macro
日本語では「関数型マクロ」あるいは「関数形式マクロ」だろうな。

「関数マクロ」は俺も聞いたことない。つーか、なんか変。
694デフォルトの名無しさん:02/12/01 04:25
なんも冠つけないでただ「マクロ」と呼んでるんだが・・・
ひょっとして俺だけか?
>>693
#define N 100
みたいなのは?
>>695
は?
>>693じゃなくて>>694ですた。
#define swap(x, y) (...)
が「マクロ」なら、
#define N 100
はなんと呼ぶの?
どっちもマクロでしょ
MSDN では単にマクロと呼んでいるな。
>>654
> それ以上の輝度値を持つ画素のみの画像を作成

その輝度に満たないピクセルを、最低輝度の灰色でべったり埋めればいいのか?
全部を白ピクセルで埋めても仕様的に問題なさそうだ。
(char)w[240][300][3];奈良?
いずれにせよ外部のデータを扱う時は malloc() なり new なりにしなさい。
703デフォルトの名無しさん:02/12/01 09:30
int getchar();int putchar(int);int main(){char k[]="A52A2245332A252B435B2222A2"
"B2A2A23A2C32A3B5B2222A52B43532A2352C23A52A2246D2A3533B35K2A4D22A3224A45D2C25B"
"2A32A5D2C25D4A26C4A1",*p=k;int i,c,b=1;while(*p){c=0;for(i=0;i<8;i++){if(*p==
'0'){if(!*++p)break;b=!b;}c=(c<<1)+b;if((*p)--=='A')*p='0';if(*p >= 'A')b=!b;}
if(c)putchar(c);}getchar();return 0;}

このプログラムが「オマエモナー」を出力するようにkの初期値を書き換えてください。
A52A224:ト
5332A2:ロ
52B435:イ
B2222:の
。。。
「〜木馬」ですか?
char k[]="A52B2A2252A5A252B34535C52A2B226D2A2";
char k[]="A6B3C26B25A2B2A2A23A2C32A3B6B3A2B5B23B25D2A45G226C2A3";
char k[]="A5E5A5B2A32A5F3B5B3B3A5B2A4B5E3C5B23A4A5A6E2A3C53A36C222A4A3A3A2A6C22B2C2252A2A2A262232"
みんなつまんね〜な
char k[]="A5B2A3A25B4325B22A3A5B24C5B2A32A5B4325B22B36B25A5B22A3";
トロイ=とろいウィルスの事


本気で信じてた時期があった・・・
ファイル内の日本語を検索するプログラムを教えてください。
対象ファイル、検索文字列はプログラム内に書き、検索文字列の存在確認はあるかないかだけを
表示するものでお願いします。
712711:02/12/01 13:08
C言語でお願いします。
>>1
トリップはc++で。
714714:02/12/01 13:42
Warning: illegal pointer combination (param)
ってエラーが出るんですが何を直せばいいんでしょうか。
C言語のファイルの入出力をやっています。構造体?
というかポインターに問題があるってこと?

Did you free?
716:02/12/01 14:08
あなたは自由でしたか?
あなたはタダでしたか?
>>716
その場合は Were you free?
>>714
間違ったポインタを渡してる。
719714:02/12/01 16:47
ですよね・・。(param)はパラメーター違反ってことは
{}とかがあってないか根本的に間違ってるか。
>>719
たぶん後者。
つーかマルチやめい。
721714:02/12/01 17:10
はーい。
722超初心者:02/12/01 23:58
ダイアログベースで作成しています。ファイルをコピーするアプリケーションで
コピー元コピー先をボタンをクリックしファイルダイアログボックスを表示させ
、スタティックテキストにファイルまでのパスを表示するというものです。そし
て、もう一つのボタンがありクリックすると、ファイルのコピーを開始するとい
うものです。
但し、以下の場合はメッセージボックスを
表示する。
1.コピー元ファイル名が指定されていない。
2.指定のコピー元ファイルが存在しない。
3.コピー先ファイル名が指定されていない。
4.コピー先ファイルが既に存在する。

4の場合は、問い合わせメッセージの表示とし
ユーザが上書きOKを選択した場合のみ、
コピー実行されるようにする。


です。よろしくお願いします。

ぽかーn
>>722
CやC++以前に日本語の練習がだいぶ必要。
725デフォルトの名無しさん:02/12/02 17:12
行列
( 0 1 )
( 1 1 )
のn乗の計算が出来るプログラムを作りたいのですが・・・
まるっきりわかりません よろしくお願いします・・・


どこまで出来るの?
行列の乗算するプログラムは作れるのか?
727デフォルトの名無しさん:02/12/02 17:15
>>725
進級できるといいな
行列の普通の掛け算は出来るのですが
n乗はわかりません・・・
>>725

|0 1|n  |fib(n) fib(n+1)|
|1 1| == |fib(n) fib(n+1)|

ここに、fib(n)はフィボナッチ数列のn番目の数値を表す
>>729
|0 1|n  |fib(n-1) fib(n) |
|1 1| == |fib(n)  fib(n+1)|
と違う?
>>703
うちの環境では、gCnCXg[Bという文字しか表示されなかったぞ。
コンパイルに何かオプションでもつけなきゃならんの?
gcc使ってるんだけど。
>>730
そうだわゴメソ。
>>722

ス レ チ ガ イ
>>731
Shit-JIS だから。nkfしる!!
703 のコード自体は文字コードに依存していない。
char k[] の初期値によっては EUC の出力もできる。
736超初心者:02/12/02 22:52
>>733 どうしてスレ違いなんですか?こういう宿題が出てるんですが
わからないんで皆さんのお力を借りようと思っているんです。
次の各プログラムを作成せよ。
ただし、各関数は並記する書式にしたがって呼び出されるものとし、
それに合わせて関数の戻り値および引数を設定することとする。
ただし、配列のデータを引数として与える際には、
関数側ではポインタによる表記と配列による表記のいずれか一方で記述すれば良いこととする。

半径rの円の円周の長さlおよび面積sを算出する関数 circle() を定義し、
半径10.0[cm]の円についてそれぞれの値を求める。ただし、π=3.1415926536とする。
書式:void circle(double r, double *1, double *s)

他にも同じような問題がいくつかあるので
参考にするためにできるだけ簡単な構文で作ってもらえると助かります。
どなたか、お願いします。
>>736
どの言語かもわかりません。
>>737
円周とか円の面積って中学生あたりだっけ?

どこがわかんねーのよ
740超初心者:02/12/02 23:14
>>738 すいませんVC++です。
>>739
ポインタを習い、その演習としての問題なんですが
ポインタ自体の使い方、書式などがさっぱりです。
>>741
まず教科書を読み直せ。

void circle(double r, double *l, double *s)
{
    *l = 円周の計算;
    *s = 面積の計算;
}

> double *1

・・・何だって?
>>743
それは突っ込むのもアホくさいので無視した。
#include <stdio.h>
#define PI 3.1415926536
void circle(double, double *, double *);
int main(){
double r=10.0,l,s;
circle(r,&l,&s);
printf("l=%lf s=%lf\n",l,s);
return 0;
}
void circle(double r, double *l, double *s){
*s = r*r*PI;
*l = 2*r*PI;
}
ポインタを使えばまるで関数から
複数の値が返ってきたように考えることができるってやつだっけか?
今の流行は、

double *1

です。
もらったレスから以下のように考えたんですが正しい答えが出ません。
どこがまずいんでしょうか?
とりあえず、流行のdouble *1は直しました。

#include <stdio.h>
void circle(double r, double *l, double *s)
{
*l = 2 * r * 3.1415926536;
*s = r * r * 3.1415926536;
}
int main()
{
double r, l, s;
printf("r: ");
scanf("%f", &r);
circle(r, &l, &s);
printf("l = %f, s = %f\n", l, s);
return 0;
}
749デフォルトの名無しさん:02/12/03 00:27
scanf("%lf", &r);
>>748
マジックナンバーをばらまくな。
doubleはlfで取らなきゃ。
752デフォルトの名無しさん:02/12/03 00:31
>>750
いや、それよか東芝でないというなら社名10択ぐらいで挙げてほしい。
>>752
家電メーカー?
SONY 松下 日立 三洋 …だめぽ
現在の教育指導要項にしたがってπ=3で計算(略
(略しちゃだめ
おかげで、正しい答えが出ました。
有難うございます。
757デフォルトの名無しさん:02/12/03 01:41
きいてよ。
これとおなじ名前のスレで2chで初めて1000とったよ。
758デフォルトの名無しさん:02/12/03 01:43
>>757
オメ
>>757
(ノ゚ο゚)ノ おーパチパチ
そいつぁよかった。sage
>>757
市ね
762デフォルトの名無しさん:02/12/03 01:45
やっふーい!
ありがとう!
でも2Getは一度もないんだな。
int disp(void)
int sakujo(struct temp dt[],int su)
void ichiran(struct temp dt[],int su)
この3つの関数のプロトコル宣言の書き方を教えてください。
で通じるのでしょうか?
お願いします(´Д⊂)
>>763
プロトコル宣言じゃなくてプロトタイプ宣言だろ。
最後に ; (セミコロン)を付けるだけだぞ。
>>764
ありがとございます。
C言語わけわかんなくなってきたyp
include <stdio.h>
#include <string.h>
struct temp{
char na[20];
int yu1;
int yu2;
char addr[40];
}data[50];
int disp(void);
int tuika(struct temp dt[],int su);
int sakujo(struct temp dt[],int su);
void ichiran(struct temp dt[],int su);
void main(void)
{
int cnt;
int no;
do{
no = disp();
switch (no){
case 1: cnt = tuika(data,cnt);
break;
case 2: cnt = sakujo(data,cnt);
break;
case 3: ichiran(data,cnt);
break;
}
}while(no != 4);
}
int disp(void)
{
int bango,i;
char menu[4][18] = {"1:データ追加","2:データ削除","3:データ一覧表示","4:終了"};
printf("<<処理メニュー>>\n");
for(i = 0;i < 4;i++)
printf("%s\n",menu[i]);
while(1){
printf("\n処理番号ーー>");
scanf("%d",&bango);
if(bango >= 1 && bango <= 4)break;
printf("入力エラー!!再入力して下さい。\n");
}
return bango;
}
int tuika(struct temp dt[],int su)
{
char ans;
do{
printf("氏名ーー>");
scanf("%s",dt[su].na);
printf("郵便番号ーー>");
scanf("%d-%d",&dt[su].yu1,&dt[su].yu2);
printf("住所ーー>");
scanf("%s",dt[su].addr);
su++;
printf("データの追加を続けますか?(y/n)");
rewind(stdin);
scanf("%C",&ans);
}while(ans == 'y' || ans =='Y');
return su;
}
int sakujo(struct temp dt[],int su)
{
int i,j;
char name[20];
char ans;
do{
printf("削除するデータの氏名ーー>");
scanf("%s",name);
for(i = 0;i < su;i++){
if(strcmp(name,dt[i].na) = 0)break;
}
if(i < su){
for(j = i + 1;j < su;j++)
dt[j-1] = dt[j];
su--;
}
else
printf("その氏名のデータはありません。\n");
printf("データの削除を続けますか?(y/n)");
rewind(stdin);
scanf("%c",&ans);
}while(ans == 'y' || ans =='Y');
return su;
}
void ichiran(struct temp dt[],int su)
{
int i;
printf("<<データ一覧>>\n\n");
printf("番号 氏名     郵便番号 住  所\n");
for(i = 0;i <= su;i++)
printf(" %2d %-18s %03-%04d %-28s\n",i + 1,temp[i].na,temp[i].yu1,temp[i].yu2,temp[i].addr);
rewind(stdin);
getchar();
}おてあげ ∩(・∀・)∩
(main関数内)
int cnt; → int cnt = 0;

(tuika関数内)
scanf("%C",&ans); → scanf("%c",&ans);

(sakujo関数内)
if(strcmp(name,dt[i].na) = 0)break; → if(strcmp(name,dt[i].na) == 0)break;

(ichiran関数内)
for(i = 0;i <= su;i++) → for(i = 0;i < su;i++)

printf(" %2d %-18s %03-%04d %-28s\n",i + 1,temp[i].na,temp[i].yu1,temp[i].yu2,temp[i].addr);

printf(" %2d %-18s %03d-%04d %-28s\n",i + 1,dt[i].na,dt[i].yu1,dt[i].yu2,dt[i].addr);
#include <iostream>
#include <list>
#include <string>
#include <algorithm>

using namespace std;

class personal_data {
  public:
    void input() {
      char dummy;
      cout << "氏名ーー>"; cin >> name;
      cout << "郵便番号ーー>"; cin >> zip_main >> dummy >> zip_branch;
      cout << "住所ーー>"; cin >> address;
    }
    void output(size_t record_no) {
      cout.width(4); cout<< record_no << " ";
      cout.width(18); cout.setf(ios::left, ios::adjustfield); cout << name << " ";
      cout.width(3); cout.fill('0'); cout << zip_main << '-';
      cout.width(3); cout.fill('0'); cout << zip_branch << " ";
      cout.width(18); cout.fill(' '); cout.setf(ios::left, ios::adjustfield); cout << address << endl;
      cout.setf(ios::internal);
    }
    inline bool operator==(const string &s) {
      return name == s;
    }
  private:
    string name;
    int zip_main, zip_branch;
    string address;
};
class manager
{
  public:
    void run() {
      while(execute_menu());
    }
  private:
    list<personal_data> DataList;
    bool execute_menu() {
      int menu_no;
      cout << "<<処理メニュー>>" << endl;
      cout << "1:データ追加、2:データ削除、3:データ一覧表示、4:終了" << endl;
      cout << "処理番号ーー>"; cin >> menu_no;
      switch(menu_no)
      {
        case 1: add(); break;
        case 2: remove(); break;
        case 3: show(); break;
        case 4: return false;
        default: cout << "入力エラー!!再入力して下さい。" << endl; break;
      }
      return true;
    }
    void add() {
      char answer;
      do
      {
        personal_data new_data;
        new_data.input();
        DataList.push_back(new_data);
        cout << "データの追加を続けますか?(y/n)"; cin >> answer;
      } while(answer == 'y' || answer =='Y');
    }
    void remove() {
      char answer;
      string target_name;
      do
      {
        cout << "削除するデータの氏名ーー>"; cin >> target_name;
        list<personal_data>::iterator itr = find(DataList.begin(), DataList.end(), target_name);
        if(itr == DataList.end())
          cout << "その氏名のデータはありません。" << endl;
        else
          DataList.erase(itr);
        cout << "データの削除を続けますか?(y/n)"; cin >> answer;
      } while(answer == 'y' || answer =='Y');
    }
    void show() {
      cout << "<<データ一覧>>" << endl;
      cout << "番号 氏名        郵便番号 住  所" << endl;
      list<personal_data>::iterator itr;
      size_t record_no = 0;
      for(itr = DataList.begin(); itr != DataList.end(); itr++)
        itr->output(++record_no);
    }
};

int main(void) {
  manager DataManager;
  DataManager.run();
  return 0;
}
何だ!?ソース荒らしか?
7767C:02/12/04 09:36
C++で
ダイアログベースでグーチョキパー3つのボタンを配置してジャンケンするプログラムを作りたい。
おながいします。
7777C:02/12/04 09:37
ちなみに形だけはいっちょまえにつくりますた。
ワケ ワカ ラン
マジなのかネタなのかわからねぇ。
しまいにゃメール欄に「マジです」とかいてネタ
投稿するぞ。
7807C:02/12/04 12:17
まじです
781デフォルトの名無しさん:02/12/04 12:53
DirectX SDKのDebug版とRetail版の違いは何ですか?
782771-774:02/12/04 15:39
>>775
766-769 に回答しただけなんだが・・・。
783デフォルトの名無しさん:02/12/04 16:17
ある文法にしたがったソースを読み込み、そのプログラムを解析する
プログラムを作るというもんだいなんですが。
ようはコンパイラを作る課題の第1歩なんですけど
例えば
A=12;
をよみこんだら
A 変数
= 代入文
12 数値
なんて表示されるものです。
このプログラムは出来たのですが、次の問題に
前問(上の問題)から字句解析機能を関数として作成し前問と同じ
プログラムを作成せよ。ただし変数表の管理にハッシュテーブルライブラリーを
つかうこと。
となっています。
ハッシュテーブルをどこでどうつかうかわからないんですが。。。
分かる方、ご指導おねがいします
784783:02/12/04 17:26
あ、上のはC言語でです。
おねがいします
ただし変数表の管理にハッシュテーブルライブラリーをつかうこと。
て書いてあるじゃない。
変数名(例えば A)をハッシュテーブルに入れていけってことじゃないの?
786783:02/12/04 17:36
その場合ハッシュ値はどんなのがいいんでしょう。。。?
前にやった例だと入れるものが数字だったので
その数値をある数でわってあまりをaとすると
hash[a]のとこにいれてくってかんじだったんですが
この場合は変数はアルファベットですよね。
hash[A]なんてするわけにはいかないし。。。
どうすればいいんでしょう?
文字列のハッシュ関数のサンプルなんて腐る程あると思うが。
つーかハッシュテーブルについてどう習った?
文字も内部データ的には整数。
例えば、
printf( "%d\n", 'A' );
とかしてみたら、A という文字に対応する整数が表示される。
だから文字列の場合、一番簡単な例でいくと、
全ての文字(に対応する整数)を足した数をハッシュ値にすればいい。
789783:02/12/04 17:44
いきなり問題をやらされた感じです。。。
上に書いたような数値の例で。
文字列の例調べてみます
C言語の問題です。
「2次方程式 ax^2+bx+c=0 において,実数 a,b,c を代入し,その解を求めるプログラムを作成せよ」
という問題なのですが,注意点として

計算機の中では実数は倍精度で処理すると有効数字として15桁程度の精度を持つが,
それ以下の桁では誤差が生じる。その場合,2つの実数の差の絶対値を取り,
それが十分小さければ2つの実数は同じ値であると考える。

と書かれていたのですが,虚数解を求めるところでどうすれば誤差が生じないのか分かりません。
アドバイスお願いします。
791783:02/12/04 17:48
>788
あ、なるほど!
もしかして例えば変数Dだったら
hash[D-A]=変数
ってすればいいんですかね!?
>>783
別に A を引く必要はない。そのままの値を使いな。
793783:02/12/04 17:55
あ、正確には
hash[(int)'A'-'D']
ですね。

>792
そのままの値、ということは配列の最初のほうには
何も入らないと云う事ですよね?
宣言を
char hash[(int)'Z']
にしてやればいいのかな
>>791
 とりあえず変数名が文字列だとしたら、ハッシュキーの作成は
unsigned int makeHashKey( char *str )
{
unsigned int hash = 7743;
int i;
for( i = 0 ; str[i] != '\0' ; i++ ){
 hash = ( hash << 3 ) ^ hash ^ str[i];
}
return ( hash % cHASHTABLESIZE );
}

って感じが良いと思うよ。
>>793
いや....ある値で割って余りをとるんでしょ?
例えば、割り切れる数だったら 0 になるじゃない?
796783:02/12/04 18:05
う。。。またわからんくなってきた。。。

えーと、この場合ハッシュ関数はどうなるのでしょう?
割る数はハッシュサイズですよね?
てかハッシュサイズはどうなるんだ。
そいや数字もつかえるからA〜Zと1〜9の組み合わせ。。。
割られる数は。。。?

>794
forのループでが何を意味してるかわからないのですが
そこではなにをしてるのでしょう?
あと7743ってなんすか?
>>783
教科書とかにハッシュ法は載ってないのか?
一度じっくり本を読め。
しつもーん!
>>783にあるハッシュテーブルライブラリはどこに行きましたか?
ハッシュ関数とか用意されてないんですか?
ハッシュテーブルライブラリなら文字列をキーとして値を入力できそうですが?

799794:02/12/04 18:26
>>796
 ハッシュキーを作成する関数=ハッシュ関数じゃないのかな。

 7743は適当な定数。短い変数名文字列が、ハッシュテーブルの
前半に集中するのを防ぐために適当に入れただけ。名無しさんとかって
したんだけど、本当は適当に大きな素因数の方が良いのかも。

 forループの中では適当な計算をしている。ハッシュ関数は同じ
入力が与えられたら同じキーを発行したら良いから、適当にキーが
バラけて、かつ速い計算が良い。
 文字列の文字全てをキーに使う為のforループで、中で行っている
計算はxor。andならキーが0に収束するし、orなら1に収束するから
xorが向いている。シフトしているのは文字だけじゃなくてその文字が
文字列のどの場所に出てくるかによってもキーが変わるように。
 シフトしていない部分とのxorも求めているのは、長い文字列で最初の
方の文字がシフトによって消されないため。

 漏れもハッシュの演習を学校でやった事があったけど、実際に数千個の
英単語を入れてキーをグラフにしてみたらちゃんとバラけてた。
800783:02/12/04 18:28
教科書は入門書しかないんで役にたたないす。。。

ネットで調べてみたところ、例えば
Abcって変数ならAとbとcをそれぞれコードにしてくっつけて
それを割った値をキーにすればいいんですよね?

でもその前にこの場合のハッシュサイズはどうなるんでしょう?
> xor

それって何か意味のある動作をするか?
802801:02/12/04 18:30
ごめん、シフトもするのね。
803783:02/12/04 18:35
>799
うぅ。。。なんかむずすぎて全然わからん。。。
800みたいなやりかたじゃだめすかね?
ABCの文字コードが65、66、67なら
656667と言う数字をハッシュサイズで割り、そのあまりを
添字にもつ配列にいれる。

ハッシュサイズがわからんと思ったけど調べてると
別に割る数はハッシュサイズでなく適当でいいと書いてるとこも
ありましたがそれでいいのかなぁ?
804783:02/12/04 18:40
あらかじめハッシュサイズを手動で(100とか)きめといて
(65+66+67)/100をハッシュ値にするのが簡単そうですが
これじゃだめすかね。。。?
いいから 783 は 798 の質問に答えてくれよ
>>804
(65+66+67)%100 ね。
別にそれでいいんじゃないかなぁ?
そんなに高度なのは求められてないんでしょ。
807783:02/12/04 18:53
>805
あ、ハッシュテーブルライブラリーは別の問題でつくったんですよ。
でもそのままではつかえないのでそれを参考に考えるんだと
思います。
ちょっと問題はしょって書いたし書方わるかったかな。。。
(´-`).。oO(流用できないようなものをライブラリーと呼ぶのか。。。)
809デフォルトの名無しさん:02/12/04 19:03
(´Д⊂ヽ仕様がない
>>806
それは最後の文字しか意味を持たないじゃん。
>>810
んなこたーない
ハッシュ関数の意味判ってんねぇんだな。
あれでいいと思うんなら下手な計算せずに先頭一文字だけそのまま使っとけば?
813810:02/12/04 19:17
>>811
わりっす。>803とごっちゃにしちまった。
814デフォルトの名無しさん:02/12/04 20:45
char型のアルファベットの文字列をint型に直す関数ってありますか?
atoiだと文字型の数字しかint型になおらないですよね?
815デフォルトの名無しさん:02/12/04 20:47
char c= 'A';
int i= (int)c;
>>815
文字じゃなくて文字列ですよ。
817デフォルトの名無しさん:02/12/04 20:49
文字列を直したいんです。
ABCとかいう文字列をなんか一発で。。。
そういうのが無ければ普通に書けばいいんですが
一発で変換みたいなのがあればらくだなと
818デフォルトの名無しさん:02/12/04 20:49
文字列を?
ABCが数値としていくつになればいいの?
>>817
書けるんだったら書いてみてくれ。
123
822デフォルトの名無しさん:02/12/04 20:53
>>819
2748です。
つーかchar[]そのものが多倍長整数なんだが。
824つまり:02/12/04 20:55
”ABC"='A' * 0x10000 + 'B' * 0x100 + 'C'
function書くしかないんじゃない。
MD5つかえ
>>822
バカモノ。
なにがABCとかいう文字列だ。
16進数字じゃねぇのか?

>>824
それで本当に2748になるのか?
char *c="ABC";
int i;
memcpy(&i,c,sizeof(int));
>>790
誰かこれもお願いできませんか?
実数解の場合は分かったんだけど,虚数解の場合がどうしても分からない。
ちなみに実数の場合は
  D = b*b -4.0*a*c;
if(D > 0.0) { /* 実数解 (D > 0) */
x1 = (fabs(b) + sqrt(D)) / (2.0 * a);
if ( b >= 0.0 ) {
x1 = -x1;
}
x2 = c / (a * x1);
printf("x1 = %15.15f, x2 = %15.15f\n", x1, x2);
}
みたいな感じでやりました。
さて本物のレスがないのは釣りだったのだろうか?
831814:02/12/04 21:19
結局普通に自分で書きました(^^;
アルファベットを文字コードにして足して行っただけですが。
ちなみに僕は817しかかいてないですよ
足してどーすんだよ
833デフォルトの名無しさん:02/12/04 21:31
質問!
MS-DOS上でTurboC++使って制御の勉強をやってます。
プログラム→Rs-232C(1)→データ処理→Rs-232C(2)→データ処理
→計算など
と制御させると全体の周期が0.5秒くらいなんです。
そのうち、Rs-232C(1)とRs-232C(2)での外部処理で0.2秒ずつ食われます。
Rs-232Cでコマンドを送った後、データが返ってくるまで
他の処理をさせたいのですが、DOSでは無理ですか?
割り込み処理などでなんとかなるもんですか?
>>833
データ送受信を割込みで処理すれば割込みが有るまで好きなことが出来る罠。
「はじめて読む486」を参考にしてマルチタスクを実装する。
836833:02/12/04 22:14
レス感謝です。
>>834
その手法を考えて実装してみます。
どこか参考になるHPなどないかなぁ。
(TurboというかBorlandのヘルプはすでに読みましたけど・・・)

>>835
それ持ってます。途中まで読んで休止状態です(w
837790:02/12/04 22:52
>>835
俺へのレスですよね?
>>486以降を読んでも誤差を考慮した虚数解については書かれて無いんですけど・・・
>835は>833だと思われ。
>837はネタだと思われ
840790:02/12/04 23:18
>>838
あ,そうでしたか。同じ2次方程式の問題だったから勘違いしてしまいますた。
ネタじゃないです。マジで誰かお願いします。
>>840
よーわからんが、この辺はどうだ?
http://cl.rc.kyushu-u.ac.jp/Literacy/PP/H14/adp/program/equation.html
842790:02/12/04 23:25
>>841
ん〜。ここで>>829に書いてある実数解のを見つけたんですけど,虚数解のはなかったんですよね。
>>842
大体虚数をどう表す気だ。 doubleは実数しか表せないんだぞ?
それさえ判れば自明じゃないのか?
844790:02/12/05 00:08
>>843
今はreal,imagをdoubleで宣言して,

real = -(b / (2.0*a));
imag = sqrt(fabs (D)) / (2.0*a);
printf("x1 = %15.15f + %15.15fi (虚数解)\n", real, imag);
printf("x2 = %15.15f - %15.15fi (虚数解)\n", real, imag);

のようにやってるんですけど,>>841のページを見ると実数の場合,

if(d >= 0){ /* 判別式が正のとき、解を計算 */
x1 = (-b + sqrt(d)) / (2.0 * a);
x2 = (-b - sqrt(d)) / (2.0 * a);
printf("x1 = %27.20e(%27.20e)\n",x1,a*x1*x1+b*x1+c);
printf("x2 = %27.20e(%27.20e)\n",x2,a*x2*x2+b*x2+c);
}
では桁落ちするらしく,
if(d >= 0){ /* 判別式が正のとき、解を計算 */
x1 = (fabs(b) + sqrt(d)) / (2.0 * a); /* 修正箇所 */
if ( b >= 0.0 ) {
x1 = -x1;
}
x2 = c / (a * x1); /* 修正箇所 */
printf("x1 = %27.20e(%27.20e)\n",x1,a*x1*x1+b*x1+c);
printf("x2 = %27.20e(%27.20e)\n",x2,a*x2*x2+b*x2+c);
}
のように修正すると書かれてたので,虚数解の場合も修正しないとまずいのでは?
と思ったのですが違うのでしょうか?
845790:02/12/05 00:11
>>844
追加
Dもdoubleで宣言し,↓のようにしています。
D=b*b -4.0*a*c
毎度お馴染み TURBO C++ です。
#include <iostream.h>
#include <complex.h>

int main(void)
{
double x = 3.1, y = 4.2;
complex z = complex(x,y);
cout << "z = "<< z << "\n";
cout << " and imaginary real part = " << imag(z) << "\n";
cout << "z has complex conjugate = " << conj(z) << " \n";
return 0;
}
>>846
Cの問題なので却下。
848デフォルトの名無しさん:02/12/05 19:00
引き篭もり
double _Complex z;
850デフォルトの名無しさん:02/12/06 00:34
#include <stdio.h>
#include <math.h>

main()
{
int c=0,temp=0;


while((c=getchar())!='a'){
if(c==' ') temp=c;
else{
if(temp==' ') {
putchar(temp);
temp='a';
}
putchar(c);
}
}

return 0;
}

上のプログラムは,某本の二つ以上の空白を一つの空白に置き換えながら,入力を出力しなさいという問題の答えです。
このプログラムの改善点などありますでしょうか?
#include <stdio.h>
#include <math.h>

main()
{
int c=0,temp=0;


while((c=getchar())!='a'){
if(c==' ') temp=c;
else{
if(temp==' ') {
putchar(temp);
temp='a';
}
putchar(c);
}
}

return 0;
}

上のプログラムは,某本の二つ以上の空白を一つの空白に置き換えながら,入力を出力しなさいという問題の答えです。
このプログラムの改善点などありますでしょうか?
#include <stdio.h>
#include <math.h>

main()
{
  int c=0,temp=0;


  while((c=getchar())!='a'){
   if(c==' ') temp=c;
   else{
    if(temp==' ') {
     putchar(temp);
     temp='a';
    }
    putchar(c);
   }
  }

  return 0;
}

上のプログラムは,某本の二つ以上の空白を一つの空白に置き換えながら,入力を出力しなさいという問題の答えです。
このプログラムの改善点などありますでしょうか?
ワラタ
854JPS ◆M0LaMzf5rY :02/12/06 00:40
>>852
#include <stdio.h>

int main(void)
{
int ch;

while ( (ch = getchar() ) != EOF )
{
putchar( ch );

while ( ch == ' ' )
ch = getchar();
}

return 0;
}
>>854
それだと,
aa a a   a   a

aa
になってしまいます
aa a a a a
とならなくてはいけないので
int ch, last_char_was_space = 0;

while ((ch = getchar()) != EOF)
{
if (! last_char_was_space || ch != ' ')
putchar(ch);

last_char_was_space = (ch == ' ');
}
last_char_was_space = (ch == ' ');

の部分はどういう処理で?
chに' 'を入れる必要性は?
858JPS ◆M0LaMzf5rY :02/12/06 00:53
>>857
入れてるんでなくて、比較してんの
>last_char_was_space
長ぇよ!w
>>858
いや・・じらさないで早く挿入れて!
>>846
これなに?
>>858
chがスペースなら1,でないなら0っすか
で,if文で調べると
こんな高等な技術があったとは

>>859
あほな僕でもわかるようにと,考えてくださったのでしょう
863JPS ◆M0LaMzf5rY :02/12/06 01:06
>>862
がんがれ。オレも初めてこの使い方をみた時は正直あせったよ。
864西門 ◆J1DLkSnXwI :02/12/06 01:11
呼んだ?
#include <iostream>
#include <iterator>
#include <algorithm>

bool space_seq(char f,char s){return (f==' ')&&(s==' ');}
main(){
std::cin.unsetf(std::ios::skipws);
std::unique_copy(std::istream_iterator<char>(std::cin),std::istream_iterator<char>(),std::ostream_iterator<char>(std::cout),space_seq);
}
866デフォルトの名無しさん:02/12/06 07:49
for(;;)
{
char* c=new char[100];
c=NULL;
}
for(;;)
{
char* c=new char[100];
c=NULLPO;
}
868デフォルトの名無しさん:02/12/06 13:46
>>865
キタ
869宿題教えて!:02/12/06 16:02
#include<iostream.h>
/*行列を表すクラス*/
template <class T=int,int a=3> class Matrix {
T x[a];
public :
Matrix();
T &set(int row,int col){return x[(row-1)+(col-1)*a];}
//+演算子
friend Matrix<T,a> operator+(Matrix<T,a> &n,Matrix<T,a> &m){
int i;
Matrix<T,a> ret;
for(i=0; i<a*a; i++){ret.x[i] = n.x[i]+m.x[i];}
return ret;
}
void show();
};
//コンストラクタ
template<class T,int a> Matrix<T,a>::Matrix(){
int i;
for(i=0; i<a*a; i++) x[i] = 0;}
//表示関数
template<class T,int a>void Matrix<T,a>::show(){
int i;
for(i=0; i<a*a; i++){cout << x[i] << " " ;if(i%a == 2)cout << "\n";}
}
870宿題教えて!:02/12/06 16:03
int main(){
int length=3;
Matrix<int ,3> a,b,c;//3行3列の行列
int bNumber[9] = {6,5,4,3,2,1,9,8,7};
int i;
for(i=0; i<length*length; i++){a.set(i%length+1,i/length+1) = (i+1)*10;//i*10をセットする}
for(i=0; i<length*length; i++){b.set(i%length+1,i/length+1) = bNumber[i];//あらかじめ用意されたbNumberを入れる}
c.show();
c = a + b;//ここが実行されない
c.show();
return 0;
}
/*C++ですが、行列のクラスをテンプレートで実現して、
+ - * の演算子とinverse関数を実現せよ!とか云って来るんですよ
だから・・・お願いします。教えてください。
+のとこだけでよいので・・・
相談スレでスレ違いだったのでこっちに聞きます
マルチですが、相談すれは無視してください。
*/
マルチうざー
872宿題教えて!:02/12/06 16:15
マルチっていうかスレ違いって云われて
こっちに誘導されますた

>>871
分かるならおしえて!
実行されないってどういうことよ?
>>869-870
T x[a];
でa(=3)個分しか用意してないのにa*a個にアクセスしようとしているお前に乾杯
875デフォルトの名無しさん:02/12/06 16:24
friend...
You and I are friend?
876宿題教えて!:02/12/06 16:33
>>874
あ・・・
ほんとだ
スマソ
877宿題教えて!:02/12/06 16:36
できた〜〜
いちおーjavaプログラマのつもりだったのに
情けないです・・・
修行してきます
878デフォルトの名無しさん:02/12/06 17:37
>>875
×You and I are friend?
○Are you my friend?
879デフォルトの名無しさん:02/12/06 17:47
int ch, last_ch = 0;

while ((ch = getchar()) != EOF)
{
 if (ch == ' ' && last_ch != ' ')
  putchar(ch);
 last_ch = ch;
}
880デフォルトの名無しさん:02/12/06 17:49
おもいっきり間違えた…。

while ((ch = getchar()) != EOF)
{
 if (ch != ' ' || ch != last_ch)
  putchar(ch);
 last_ch = ch;
}
881デフォルトの名無しさん:02/12/06 17:50
全然ダメだ…。

while ((ch = getchar()) != EOF)
{
 if (ch != ' ' || (ch == ' ' && ch != last_ch) )
  putchar(ch);
 last_ch = ch;
}

つーか複雑になってきたので意味無し。
何したいのさ
つーか JPS、前に 「漏れに聞け」 スレで全く同じの扱ったろう。
もう ungetc() を忘れたのか?
>>881
if(ch != ' ' || lash_ch != ' ')
>>883
JPSのカキコは全部釣りだって気づいてないのか?
reiterate me.
(´-`).。oO(VBスレで釣りだって喚いてた人かな…
>>487
遅レスに便乗質問なんですけど,

>>else if (DD==0.0){
>浮動小数点でこういうことしない。

とあるのですが,この場合はどう処理するのが正しいのでしょうか?

http://www.google.co.jp/search?q=cache:http://www.cpnet.co.jp/gfan/techdoc/Geometry/numerr.htmに
2つの浮動小数点数を、「==」で比較してはならない。「等しい」と判定されなければならない場面で、誤差により、
等しくならないことはしばしばである。この場合、2つの浮動小数点数の差を取り、
その絶対値が、誤差限界より小さい時には、等しいものと判定するようにする。

とあったのですが,どう書いたらよいのか分かりません。お願いします。
if (fabs(DD) <= EPSILON)
890888:02/12/07 16:07
>>889
EPSILONって「十分小さい値」って意味ですかね?
入門用の本にはのって無いんですが。
891888:02/12/07 16:14
if(D == 0.0)をif (fabs(DD) <= EPSILON)に置き換えたら,

Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
niji.c:
エラー E2451 niji.c 41: 未定義のシンボル DD(関数 main )
エラー E2451 niji.c 41: 未定義のシンボル EPSILON(関数 main )
警告 W8070 niji.c 61: 関数は値を返すべき(関数 main )

っていうエラーが返ってきちゃったんですけど,なにか定義しなくちゃいけないんでしょうか?
いや、それは自分で定義するもんじゃないの。
fabsって見た感じ、絶対値返すっぽいし。
探すか,創る。つか、それぐらい作れ
894888:02/12/07 16:34
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vccore/html/_core_why_floating_point_numbers_may_lose_precision.asp
に書いてあるように,

#define EPSILON 0.0001

を追加し,if (fabs(DD)→if (fabs(D)にしたらできました。

実際問題,判別式として分ける場合,EPSILONはどの程度の値として定義すればいいのでしょうか?
0.0001よりもだいぶ小さい値になってるのもあるようなのですが…。
>>894
> #define EPSILON 0.0001

そんな事するなするな。
<float.h> の DBL_EPSILON や FLT_EPSILON を使え。
> DBL_EPSILON や FLT_EPSILON

まあ、もともとこんな定数用意してるぐらいだったら、標準で判定関数かマクロか
用意してくれてもいいじゃんとは思うけどナー。
897888:02/12/07 18:36
#include <float.h>
if(fabs(D) <= DBL_EPSILON)
記述の方法は↑で良いのでしょうか?
microsoftのページに
2.2204460492503131e-016 として定義された double 用の定数 DBL_EPSILONとあったのですが,
DBL_EPSILONは「どんな場合にも適したdouble用のEPSILONの値」という認識で間違ってませんか?
判別式が負だったら解なし、解を二つ求めて等しくなったら重解ってことにすりゃいいじゃん。
>>898
その場合でも
|x1-x2|<=DBL_EPSILONにする必要がありそうな
>>899
非常に近いけど重解じゃありません、でいいんじゃん?
fabs() 呼ぶのと、-DBL_EPSILON 〜 DBL_EPSILON の範囲でチェックするのとでは
どっちが速いんだろうな?
微妙だが、FPU持っててインラインに展開されるとか、signビットのクリアに
なるようならfabs()のほうが速いかもしれん。
903option:02/12/07 22:59
要素数が n である配列 a から key と一致する全要素の添え字を、配列 idx の先頭から
順に格納し、一致した要素数を返す以下の関数を作成せよ。

int seachidx(int a[], int n, int key, int idx[]);

誰か完成させてくださいませんか?
904 ◆F52DmOxJlc :02/12/07 23:10
>>903
これでいいのか?

int seachidx(int a[], int n, int key, int idx[]) {
 int i, j;
 j = 0;
 for (i = 0; i < n; i ++) {
  if (a[i] == key) {
   idx[j] = a[i];
   j ++;
  }
 }
 return j;
}
>>903
丸なげ?
906デフォルトの名無しさん:02/12/07 23:35
0から1の実数をパラメータとして白黒階調画像を表示するPGを作りたい
んですけどアドバイスもらえませんか?
907option:02/12/07 23:41
>◆F52DmOxJlcさん
ありがとうございました。
今コンパイル出来ませんが(都合により)後日コンパイルしてみます。
本当に助かりました。
908 ◆F52DmOxJlc :02/12/07 23:43
>>907
インデントに全角スペース使ってるからコピペはするなよ。

>>906
画像関係は経験ないのでわからない。すまん。
>>906
256倍して表示汁。
>>903 C++なら一行。
int seachidx(int a[], int n, int key, int idx[]) {
return std::remove_copy_if(a, a+n, idx, std::bind2nd(std::not_equal_to<int>(), key)) - idx;
}
911西門 ◆J1DLkSnXwI :02/12/08 00:22
>>906
よくわからんが、
「1つ1つの画素の輝度が[0,1]の実数で表されている画像を、
白黒2値の表示装置で表示したい」という意味なら、ディザリング
するのがよろしかろう。

#include <stdlib.h>

void dither(double input[], char output[], unsigned size,
  double contrast, double brightness)
{
 unsigned i;

 for (i = 0; i < size; i++) {
  double d = rand() * 2.0 / (RAND_MAX + 1) - 0.5;

  output[i] = (input[i] + d * contrast > brightness);
 }
}
>>909
>906の言う「0から1の実数」が、「0以上1以下の実数」のことだったら
256倍すると256諧調に収まらないので、
255倍の方がいいかも。
913910:02/12/08 00:25
しまった!添え字を入れるのか・・・
914906:02/12/08 00:46
たくさんの方ありがとうございます。
912さんの言われると通り0以上1以下の値を持った
2次元配列の値をパラメータとしてそのパラメータを
突っ込めば白黒階調画像が表示できるようなPGという意味でした。
説明不足ですみません。
915906:02/12/08 01:08
255倍というナイスアイディアありがとうございました。
ぐぐりました所いい感じのソースが見つかりました。
またなにかありましたらよろしくお願いします。

>>905
ここは、そういうスレじゃないのか?
>>917
そうか、ここはOKなんだな。>1にもとくに書いてないし。
宿題スレは丸投げ上等だからな。
よくわからん質問。マルチは不定だが。
920デフォルトの名無しさん:02/12/08 12:45
こんな宿題がでました。
typedef struct{
int y;/*西暦年*/
int m;/*月(1〜12)*/
int d;/*日(1〜31)*/
}YMD;
上の構造体が与えられているとする。
日付xのn日後の日付を返す以下の関数を作成せよ。
YMD after(YMD x, int n);
日付xのn日前の日付を返す以下の関数を作成せよ。
YMD before(YMD x, int n);
。。。ヒント。。。
★日にち★
▼1〜27▼ 日にちに+1
▼28(2月) うるう年か?▼YES 日にち+1,NO 月+1、日にち+1
▼29 2月?▼YES 月+1、日にち=1,NO 日にち+1
▼30 4,6,9,11月?▼YES 月+1、日にち=1,NO 日にち+1
▼31 12月?▼YES 年+1、月=1、日にち=1,NO  月+1、日にち=1
うるう年は
int isleap(int year)
{
return (year % 4 == 0 && year % 100 != 0 || year % 400 == 0);
}

で求める。
ちなみに西暦は深く考えなくていいです。1735年(?)以前がどうとかあった
気がしましたが。
丸投げ上等らしいので、誰かソース提供して欲すぃのですが・・・。
だめかなぁ・・・。
static long
jday(YMD x)
{
    int y = x.y, m = x.m;
    long d = x.d;
    if ((m -= 3) < 0) {m += 12; y--;}
    d += (long)y * 365 + y / 4 - y / 100 + y / 400;
    return d + (m * 153 + 2) / 5;
}
static YMD
toYMD(long d)
{
    int y, m;
    --d;
    y = d / (365 * 400 + 97) * 400; d %= 365 * 400 + 97;
    y += (d / (365 * 4 + 3)) * 4; d %= 365 * 4 + 3;
    y += d / 365; d %= 365;
    m = (d / 153) * 5; d %= 153;
    m += (d / 61) * 2; d %= 61;
    m += d / 31; d %= 31;
    ++d;
    if ((m += 3) > 12) {m -= 12; ++y;}
    {YMD x = {y, m, d}; return x;}
}
YMD after(YMD x, int n)
{
    return toYMD(jday(x) + n);
}

YMD before(YMD x, int n)
{
    return after(x, -n);
}
924 ◆F52DmOxJlc :02/12/08 13:33
ヒントが出てるんならそれに沿って回答した方が先生も喜ぶかな。

YMD after(YMD x, int n) {
 int i;
 for (i = 0; i < n; i ++) {
  if (x.d < 28) {
   x.d ++;
  } else if (x.d == 28) {
   if (x.m == 2 && isleap(x.y)) {
    x.m ++;
    x.d = 1;
   } else {
    x.d ++;
   }
  } else if (x.d == 29) {
   if (x.m == 2) {
    x.m ++;
    x.d = 1;
   } else {
    x.d ++;
   }
925 ◆F52DmOxJlc :02/12/08 13:35
  } else if (x.d == 30) {
   if (x.m == 4 || x.m == 6 || x.m == 9 || x.m == 11) {
    x.m ++;
    x.d = 1;
   } else {
    x.d ++;
   }
  } else {
   if (x.m == 12) {
    x.y ++;
    x.m = 1;
    x.d = 1;
   } else {
    x.m ++;
    x.d = 1;
   }
 }
 return x;
}

before() は after() を改造すればできるよね。
926920:02/12/08 14:36
おぉ!!こんなにソースが!!
有難いです。ここにいる方々には感謝してもしきれません。
本当にありがとうございました。
>◆F52DmOxJlc さん
あなたの事は神と呼ばせて下さい!!
神(^^)/ありがとう!!
927 ◆F52DmOxJlc :02/12/08 14:42
>>926
インデントに全角スペース使ってるからコピペはするなよ。
しかも動作確認してないから間違ってたら適当に修正しておくれ。
//この程度で神はカンベンw
いやー、JPSも成長したなあ。
人にいろいろ教えてあげるようになったとは。
929デフォルトの名無しさん:02/12/08 14:48
配列にデータを入力し、二乗の和と平均を表示するプログラムを作りなさい。
ただし、入力、二乗の和、合計のための関数を作って利用しなさい。

#include <stdio.h>
void input(double a[], int n);
double sum2(double sum2[],int n);
double sum(double sum[], int n);

int main(int argc, char* argv[])
{
double y[1000];
int n;
printf("いくつ入力するか決めてください:");
scanf("%d",&n);
input(y,n);
printf("二乗の和は%fです。\n",sum2(y,n));
printf("平均値は%fです。\n",sum(y,n)/n);
return 0;
}

void input(double a[], int n) {
int k;

for(k = 0; k < n; k++) {
printf("%d個目の数字を入力してください:", k+1);
scanf("%lf", &a[k]);
}
}
馴れ合いはカンベンw
931929:02/12/08 14:50
double sum2(double sum2[], int n)
{
int i;
double x = 0;
for (i = 0; i < n; i++) {
x += sum2[i]*sum2[i];
}
return x;
}

double sum(double sum[], int n)
{
int i;
double x = 0;
for (i = 0; i < n; i++) {
x += sum[i];
}
return x ;
}

作ってみたんですけど不安なのでおかしいところとか言ってくれませんか?
すまん、>>922は間違ってた。百年単位の閏年の処理を抜かしてたのと、4年単
位のところでなぜか3を足してた。

static YMD
toYMD(long d)
{
    int y, m;
    --d;
    y = d / (365 * 400 + 97) * 400; d %= 365 * 400 + 97;
    y += (d / (365 * 100 + 24)) * 100; d %= 365 * 100 + 24;
    y += (d / (365 * 4 + 1)) * 4; d %= 365 * 4 + 1;
    y += d / 365; d %= 365;
    m = (d / 153) * 5; d %= 153;
    m += (d / 61) * 2; d %= 61;
    m += d / 31; d %= 31;
    ++d;
    if ((m += 3) > 12) {m -= 12; ++y;}
    {YMD x = {y, m, d}; return x;}
}
933920:02/12/08 15:17
修正ありがdです。
学校行ったらさっそく試してみますね。
>>932
たびたびすまん。2000/2/29が間違ってた。

>     y += (d / (365 * 100 + 24)) * 100; d %= 365 * 100 + 24;
ここをこうしる。
    if (d == 365 * 400 + 96) {
        y += 3;
        d = 365 * 100 + 24;
    }
    else {
        y += (d / (365 * 100 + 24)) * 100; d %= 365 * 100 + 24;
    }
>>929
それでいい。
>>934
禿しく鬱。

static YMD
toYMD(long d)
{
    int y, m, i;
    --d;
    y = d / (365 * 400 + 97) * 400; d %= 365 * 400 + 97;
    if (d == 365 * 400 + 96) {
        y += 399;
        d = 365;
    }
    else {
        y += (d / (365 * 100 + 24)) * 100; d %= 365 * 100 + 24;
        y += (d / (365 * 4 + 1)) * 4; d %= 365 * 4 + 1;
        if (d == 365 * 4) {y += 3; d = 365;}
        else {y += d / 365; d %= 365;}
    }
    m = (d / 153) * 5; d %= 153;
    m += (d / 61) * 2; d %= 61;
    m += d / 31; d %= 31;
    ++d;
    if ((m += 3) > 12) {m -= 12; ++y;}
    {YMD x = {y, m, d}; return x;}
}
N×L行列と、L×M行列の積を求めるプログラムですが、
N、L、Mをmain関数の中で与えたいのですが、
どのようにしたらよろしいのでしょうか?
#include <stdio.h>
#include <stdlib.h>
#define N 3
#define L 5
#define M 4
typedef double matNL[N][L];
typedef double matLM[L][M];
typedef double matNM[N][M];
void multiply(matNM c, matNL a, matLM b)
{
int i, j, k;
double s;
for (i = 0; i < N; i++)
for (j = 0; j < M; j++) {
s = 0;
for (k = 0; k < L; k++) s += a[i][k] * b[k][j];
c[i][j] = s;
}
}

void matprint(int nrow, int ncol, double *a)
{
int i, j;
for (i = 0; i < nrow; i++) {
for (j = 0; j < ncol; j++) printf("%8.1f", *a++);
printf("\n");
}
}
938937:02/12/08 16:35


int main(void)
{
int i, j;
static matNL a;
static matLM b;
static matNM c;
for (i = 0; i < N; i++)
for (j = 0; j < L; j++)
a[i][j] = rand() / (RAND_MAX / 10 + 1);
for (i = 0; i < L; i++)
for (j = 0; j < M; j++)
b[i][j] = rand() / (RAND_MAX / 10 + 1);
printf("A\n"); matprint(N, L, (double *)a);
printf("B\n"); matprint(L, M, (double *)b);
multiply(c, a, b);
printf("AB\n"); matprint(N, M, (double *)c);
return (0);
}
>>937
malloc/freeって知ってる?
940937:02/12/08 17:15
>>939
malloc/freeは少しだけ使ったことあります。。
mallocでa[N][L]、b[L][M]、c[N][M]を確保して、
やろうと思ったのですが、
multiply()を定義する部分で、
()内をどうしたらよいのかわかりませんでした。
void
multiply(double *c, double *a, double *b, int l, int n, int m)
{
  int i, j, k;
  double s;
  for (i = 0; i < n; i++) {
    for (j = 0; j < m; j++) {
      s = 0;
      for (k = 0; k < l; k++)
        s += a[i*l+k] * b[k*m+j];
      c[i*m+j] = s;
    }
  }
}
942937:02/12/08 17:44
>>941
ありがとうございます。
ちょっと、やってみます。
すみません。C言語のMAKEファイルの宿題が出たんですが
さっぱりわからないんですがどこかに使い方の解説のサイトは無いでしょうか?
すれ違い?
C言語初心者です。
19の47乗を143で割った余りを求めたかったので
C言語で以下のような記述をしました。

printf("%d\n", (int)pow(19, 47) % 143);

すると表示される結果は-24となります。
正の数を正の数で割ったので、あまりがマイナスになることはありません。
実際に合同式を用いて手作業で計算すると、
答えは24になりました。
どうしてC言語を用いて計算するとマイナスになるのでしょうか?
環境はCygwin+gccです。
区間[0,1),[1,2),[2,3)に含まれるデータの個数を
配列を用いてカウントするプログラムを作成せよ。
ただし、個数のカウントに条件分岐をしようしてはいけない。

データ型の変換について習ったんでそれを使うんでしょうが、
条件分岐を使わないでどう組むのか全く分かりません。
助言お願いします。
>>943
「MAKEファイル」でぐぐっただけだがこんなんはどうよ。
http://www-clim.kugi.kyoto-u.ac.jp/yasunaga/make.html
>>944
19の47乗は61桁ほどになり、通常の処理系ではintでもdoubleでも正確に
表せないからどちらにしろ答えは無意味。
>>944
19の47乗は10進で61桁の数になる。
浮動小数点数の有効桁数は17桁くらいだから、
正確な計算は全く期待できない。
>>945
その3つの区間の数値は、小数点以下を切り捨てるとそれぞれ
0, 1, 2になる。これを配列の添え字に使う。
>>944
> 実際に合同式を用いて手作業で計算すると、
最初からそっちでプログラムしろ。
951937:02/12/08 19:16
>>939,941
ありがとうございました。
無事解決できました。
>>944
前スレに似たような質問があったような気がするが。
unsigned long int modpow(unsigned long int a,unsigned long int k,unsigned long int m){
unsigned long int b;
for(b = 1; k > 0; a = a * a % m, k >>= 1)
if(k & 1) b = b * a % m;
return b;
}
>>953
ビット演算がよく分かりません。
それはどういうアルゴリズムで、
どのぐらいの大きさまで計算できるんですか?
>>947
(゚Д゚)ハァ?
956デフォルトの名無しさん:02/12/09 04:34
>>954
処理系に依存するっスよ
>>955
その(゚Д゚)ハァ?の意味がわからない。どこかおかしいか?
958デフォルトの名無しさん:02/12/09 04:50
>>955
新しいため息のつきかた・・・
959デフォルトの名無しさん:02/12/09 05:24
リストに関するプログラム例として英語の文書ファイルに現れる単語リスト
を作成するプログラムを考えることにする。

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

struct CELL{
char word[32];
struct CELL *next;
};

int main(){
struct CELL *words, *p;
char newword[32];

words = NULL;
while(scanf("%s",newword)== 1){
for(p=words; p!=NULL; p=p->next)
if(strcmp(newword, p->word)==0)break;
if(p==NULL){
p=(struct CELL *)malloc(sizeof(struct CELL));
strcpy(p->word,newword);
p->next=words;
words = p;
}
}
for(p=words; p!=NULL; p=p->next)printf("%s\n", p->word);
}
960デフォルトの名無しさん:02/12/09 05:26
>>959の例プログラムを単語リストがアルファベット順になるように
機能拡張してください。よろしくお願いします。
961943:02/12/09 05:51
>>946
有難うございました。当方初心者なものでこれでも
難しいです。MAKEする上でコンパイルについて簡単に書かれて
いるものってないでしょうか。
962デフォルトの名無しさん:02/12/09 06:12
スプレットシートのコード教えて
>>961
>>946のページはgoogleで出た中で一通り書いてある所を選
んだだけだから、もっと単純なところも出て来るよ。
>>960
〜略〜
int main(){
struct CELL *words, *p, *prev;
char newword[32];

words = NULL;
while(scanf("%s",newword)== 1){
prev=NULL;
for(p=words; p!=NULL; p=p->next){
if(strcmp(newword, p->word)<0)break;
prev=p;
}
p=(struct CELL *)malloc(sizeof(struct CELL));
strcpy(p->word,newword);
if(p==NULL || prev==NULL){
p->next=words;
words = p;
} else {
p->next=prev->next;
prev->next=p;
}
}
for(p=words; p!=NULL; p=p->next)printf("%s\n", p->word);
}
>>964
どうもありがとうございます!
これで、レポートは間に合いそうです。
>>954
(m-1)*(m-1) が桁溢れしなければ計算できるよ。
m が大きい場合はかけ算も同じように二進展開して計算するといい。
967943:02/12/09 19:00
>>963
もう少し探してみます。どうもです。
968デフォルトの名無しさん:02/12/11 19:02
最後の伸びが悪いな。
宿題こいやこいや〜。
Amazon で注文したあずまんが大王が先ほど届いたので、これから読もうと思います。
応援してください。
引き篭もりは篭れ!
>>969
やめとけ、今の君には刺激が強すぎる。
鼻血出ますた
973デフォルトの名無しさん:02/12/11 22:16
入力されたタブを,次のタブストップまでのスペースをうめる適当な数の空白で置き換える
プログラムを書け。
タブストップの位置は,例えばn文字ごとというように固定して考えよ。

という問題なんですが,文章の意味をもう少し判りやすく説明してください。
「タブストップ」の意味はわかっているのか?
975デフォルトの名無しさん:02/12/11 22:27
>>973
出題者にきけよ
日本語を噛み砕けというのは C/C++ の話じゃないと思うが・・・。

例えば 「タブ幅=4」 と設定された時に、

"a[\t]bc[\t]def[\t]ghij[\t]klmno[\t]pqrstu という文字列を、
"a   bc  def ghij    klmno   pqrstu" に展開しろという事だろ。
977 :02/12/11 22:34
>>974
ただの\tじゃないんですか?
[\t]がタブストップ?
>>977
その通り。
[\t] は単に見やすく書いただけ
>>976
そういうことですか
\tの時に,
if(c[cnt]=='\t'){
printf(" ");
printf(" ");
printf(" ");
printf(" ");
}

という風に,表示するのをスペースにするものだと思っていました
文字列自体を変換するってことですか

いろいろとありがとうでした
>if(c[cnt]=='\t'){
>printf(" ");
>printf(" ");
>printf(" ");
>printf(" ");
>}
これだと条件が足りない。
ab[\t]cd
のとき、
abの後ろに、半角スペースが ’2個 ’ だから。
981デフォルトの名無しさん:02/12/12 14:34
新スレ逝くの?
982デフォルトの名無しさん:02/12/12 14:44
ねえ逝っちゃうよ?逝っていいの?ぬるぽ(((;゚∀゚)))ガクガクブルブル
983デフォルトの名無しさん:02/12/12 21:42
>>976
アニキ
そのプログラムできませんでした・・・
教えて・・・
s1=strtok(" ",s);//hankaku'space'kugiri
space_of_long = 4-strlen(s1);
put(s1);
space_of_long bun space put...
?
TpTab
int main(void)
{
  const int tab_stop = 4;
  char buf[] = "a\tbc\tdef\tghij\tklmno\tpqrstu\t";
  char *p = buf;
  int col = 0;
  printf("\"%s\"\n", buf);
  putchar('\"');
  while(*p)
  {
    if(*p == '\t')
      do putchar(' '); while(col = (col + 1) % tab_stop);
    else
      putchar(*p), col++;
    p++;
  }
  putchar('\"');
  return 0;
}

strtok() だと最後のタブ文字が捕捉できないにょ
英小文字を英大文字に出力が作りたくて
以下のように組んだんですが、大文字がうまく変換されません。
どこがまずいでしょうか?

#include<stdio.h>

void change(char *a)
{
while (*a != '\0'){
if (0x61 <= *a <= 0x7a)
*a -= 32;

a++;
}
}

main()
{
char a[100];

printf("input words\n");
scanf("%s", a);

printf("%s\n", a);

change(a);
printf("%s\n", a);

return 0;
}
よくわからんが toupper() を使え。
989デフォルトの名無しさん:02/12/13 15:33
>>987
よくわかるが toupper() を使え
#include <stdio.h>
#include <ctype.h>
int main(void)
{
  char buf[100], *p = buf;
  puts("input words");
  fgets(buf, sizeof(buf), stdin);
  fputs(buf, stdout);
  while(*p = toupper(*p)) p++;
  fputs(buf, stdout);
  return 0;
}
レス、有難うございます。

書き忘れていたんですが
ASCIIコードを使って変換しろということでした、すみません。

前述したプログラムを実行すると
英大文字も小文字と同様 -32されているようなので

if (0x61 <= *a <= 0x7a)

これがまずいのかなと考えてるんですが・・?
> ASCIIコードを使って変換しろ

その課題出した香具師、砲撃していいよ・・・
if (0x61 <= *a <= 0x7a)

if (0x61 <= (unsigned char)*a <= 0x7a)
>>991
> if (0x61 <= *a <= 0x7a)

そういう書き方はできないよ。
if (0x61 <= *a && *a <= 0x7a)
995デフォルトの名無しさん:02/12/13 16:18
a++している場所が悪 よく考えて
996bloom:02/12/13 16:19
997デフォルトの名無しさん:02/12/13 16:20
>>991
激しく( ゚Д゚)マズーです
if (0x61 <= *a && *a <= 0x7a)
としなさい

<=は左結合演算子なので左から順に評価されます
0x61 <= *a <= 0x7a とすると
まず 0x61 <= *a が評価され
この時点で大文字も小文字も真になります
言い切れませんが真は大抵 1 なので
0x61 <= *a が 1 に置き換わり
その後に右の <= が評価されるので
1 <= 0x7a が評価されることになり
これも真となります。
結局 if (0x61 <= *a <= 0x7a) だと
大文字小文字どころか
0x61 <= *a が成り立てば
全部通ってしまいます
if ('A' <= *a && *a <= 'Z')
    *a = (*a - 'A') + 'a';
よく読んでないけど、こうすべきだと思ったのは俺だけか
次スレ立つまで書き込み禁止
漏れ立てられないからだれかヨロシク

>>993
おいおい
1000デフォルトの名無しさん:02/12/13 16:20


お前等C/C++なんて糞言語やってないでDelphiしろ! デルファイ!
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。