C/C++の宿題を片づけ作戦指令 30代目

このエントリーをはてなブックマークに追加
おはようフェルプス君。
プログラミング能力がないにも関わらず授業を取った学生諸君が困り果てている。彼らは、いずれ単位を落とすだろう。
君の任務は持ち込まれる宿題を解き、質問者の窮状を救ったり足下を掬ったりすることだ。
例によって当局は一切関知しないからそのつもりで。
なおこのスレは1000まで達した後自動的に消滅する。

【注意点】 -------------------------------------------------
・問題はしっかりと解いてもらう方にわかりやすいように
 問題文などの省きはやめ、全文を書きましょう。

・使用する言語(C/C++)や環境(CUI/ANSIとか
 GUI/Windows32bitAPI など)は必ず書きましょう。

・計算問題は必ず数式自体をあげ、どのような計算をするのか
 くわしく説明してください。

・エラーは、その行とエラーの詳細を書きましょう。
 エラーメッセージが出た場合はそのままコピーしてください。

・後になって問題につけたしをするのはやめましょう。
 解いてもらっている方に失礼になってしまいます。
------------------------------------------------------------

【アップローダー==ラウンジ】(質問が長い時はココ使うと便利 回答者もコードが長ければここに)
http://do.sakura.ne.jp/%7Ejunkroom/cgi-bin/megabbs/lounge/index.html

【歴代スレは>>2-10
29代目: http://pc5.2ch.net/test/read.cgi/tech/1090765027/
28代目: http://pc5.2ch.net/test/read.cgi/tech/1089974839/
27代目: http://pc5.2ch.net/test/read.cgi/tech/1089448445/
26代目: http://pc5.2ch.net/test/read.cgi/tech/1088860889/
25代目: http://pc5.2ch.net/test/read.cgi/tech/1087929711/
24代目: http://pc5.2ch.net/test/read.cgi/tech/1086612317/
23代目: http://pc5.2ch.net/test/read.cgi/tech/1085149383/
22代目: http://pc5.2ch.net/test/read.cgi/tech/1083050221/
21代目: http://pc5.2ch.net/test/read.cgi/tech/1078157730/
20代目: http://pc5.2ch.net/test/read.cgi/tech/1075217631/
19代目: http://pc5.2ch.net/test/read.cgi/tech/1073566342/
18代目: http://pc5.2ch.net/test/read.cgi/tech/1071407728/
17代目: http://pc5.2ch.net/tech/kako/1070/10704/1070469896.html
16代目: http://pc5.2ch.net/tech/kako/1069/10698/1069837000.html
15代目: http://pc5.2ch.net/tech/kako/1068/10689/1068950713.html
14代目: http://pc5.2ch.net/tech/kako/1067/10671/1067175933.html
13代目: http://pc5.2ch.net/tech/kako/1064/10645/1064541405.html
12代目: http://pc5.2ch.net/tech/kako/1060/10607/1060706382.html
11代目: http://pc5.2ch.net/tech/kako/1058/10582/1058283913.html
10代目: http://pc5.2ch.net/tech/kako/1057/10570/1057070174.html
9代目: http://pc5.2ch.net/tech/kako/1055/10559/1055944101.html
8代目: http://pc5.2ch.net/tech/kako/1055/10550/1055056940.html
7代目: http://pc5.2ch.net/tech/kako/1053/10539/1053963794.html
6代目: http://pc5.2ch.net/tech/kako/1053/10530/1053045530.html
5代目: http://pc5.2ch.net/tech/kako/1051/10515/1051594046.html
4代目: http://pc5.2ch.net/tech/kako/1045/10450/1045074808.html
3代目: http://pc5.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
ZCurry
この擦れはム板に珍しくネタが洗練されてるな。
>>1
イイヨ イイヨ
>>1
ウ〜ン、発想はオモシロイんだが、AA がないんだよなぁ…
推奨NGワードってどこにあったっけ?
早速Cの質問です。
「テキストファイルから2つの整数を読み込み、和、差、積、商、余りを表示し、
結果を別のファイルに書き込むプログラムを作れ」というものです。
よろしくおねがいします。
>>7
どんな形式で2つの整数が書いてあるんだ?

たとえば
7 2
とか
7
2
とか色々あるだろ
97:04/08/08 23:49
>>8
上のような感じで横に並んでるようなのでおねがいします。
>>7
良くわからないけど,こんな感じ?
#include <stdio.h>
int main(int argc, char** argv)
{
FILE* in = fopen(argv[1], "rb");
FILE* out = fopen(argv[2], "wb");
int a, b;
while(fscanf(in, "%d%d", &a, &b) > 0) {
fprintf(stdout, "wa:%d\nsa:%d\nseki:%d\nshou:%lf\namari:%d\n",
a + b, a - b, a * b, (double)a / b, a % b);
fprintf(out, "wa:%d\nsa:%d\nseki:%d\nshou:%lf\namari:%d\n",
a + b, a - b, a * b, (double)a / b, a % b);
}
fclose(in);
fclose(out);
return 0;
}
117:04/08/09 02:00
>>10
わかりました。
ありがとうございました。
>>1
なかなかいいな。
>>10
printf()系で%lf使うなボケ。
15デフォルトの名無しさん:04/08/09 10:50
>>14
そう来ると思ったが、%lfと書くメリットはないな。
>>15
sscanfのときにdoubleなのにうっかり%fにしてしまうミスを防げる。
そもそもうっかりするな
18デフォルトの名無しさん:04/08/09 12:15
C++での質問です。
テンプレートの例を作るのですが、

#include <iostream>

using namespace std;
//テンプレートの宣言、定義
template <class T>
T max(T x, T y){
return x + y;
}

int main(void){
int a=1, b=3, c;
double d=1.9, e=0.8, f;

//int型での呼び出し
c = max(a, b);

//double型での呼び出し
f = max(d, e);

cout << c << "\n";
cout << f << "\n";

return 0;
}

で、コンパイルができません。
どうしたら、できるのか教えてください。
コンパイラは何でエラーメッセージはどんなだ。

なんで加算するのにmaxなんだ。
>>18
俺んとこではコンパイルできたけど、C++にはmaxって関数が既にあるから
どこかでそのヘッダが組み込まれていて多重定義のエラーになっているんだと思う。
max→Maxだとどうなる?
2113:04/08/09 12:36
>>14
>15に同意。

>>16
printf()系とscanf()系の指定子が共通だと思っている時点で大間違い。
微妙に違うところがたくさんあるのだから別々に覚えればいい。
例えば、"%*d"における'*'の意味はそれぞれ全然違う。

>>17
同意。うっかりミスする香具師に限って、「今度から気をつけます」と言うよな。
#その挙句にまたミスをしたときに「気が付きませんでした」と言うわけだ。
##>16がそうかどうかは知らんが。
>>18
まずはその間違った名前を何とかしろ。

って書こうとしたら既に>20に書かれていた……_/ ̄|○
23デフォルトの名無しさん:04/08/09 12:45
>>19,>>20,>>22
さん、どうもありがとうございました。
名前を変えたらコンパイルできました。

足し算だったらSUMでしたね。
>足し算だったらSUMでしたね。
・・・・・・まあこの場合、間違ってるとまでは言い切れないが・・・
sum 合計
add(ition) 加算
>>21
学生さんは「俺はうっかりしない」で構わないかもしれませんが、
仕事ではミスは起こりうるものとして防止策、対応策を講じるわけですよ。
難しくて分かりませんかね(´ー`)
話が読めない。

>>26は%lf派なのだろうか
普段から%lf使ってれば間違っても%lfで問題無いということを言いたいらしい
26 名前: デフォルトの名無しさん [sage] 投稿日: 04/08/09 13:19
27 名前: デフォルトの名無しさん [sage] 投稿日: 04/08/09 15:19
28 名前: デフォルトの名無しさん [sage] 投稿日: 04/08/09 15:29
わかんなかったらint 21hでいいんでねーの?
ここでまだちん
宿題まだでつか?
C言語に関する質問です
キーボードから文字列を入力し、配列に保存する
その配列の中の、最初にAまたはBまたはCが出てくる位置(何文字目か)
を返す関数を作成し、その文字の種類によってAならばalpha、Bならばblavo、Cならばcharlie
と表示するプログラムを作れというものです。
よろしくおねがいします
>>33
#include <stdio.h>
#define SIZE 256
int abc(char* buf);
int main(void)
{
char buf[SIZE];
fgets(buf, SIZE, stdin);

switch(buf[abc(buf)]) {
case 'A': printf("alpha\n");
break;
case 'B': printf("blavo\n");
break;
case 'C': printf("charlie\n");
break;
}
return 0;
}
int abc(char* buf)
{
int i = 0;
while(buf[i] && buf[i] != 'A' && buf[i] != 'B' && buf[i] != 'C') { i++; }
return i;
}
わかりました
簡潔なプログラムありがとうございます
Cの質問です
「コマンドラインで指定したファイルを読み、その中に出てくるアルファベットの
各文字の文字数をカウントする。カウントした結果を文字種と文字数をメンバとして
持つ構造体に保存する。カウント結果をソートして、たくさんカウントされたものから
順に文字を表示する。」というものです
なお大文字・小文字は同一視して構いません
よろしくお願いします
>>36
#include <stdio.h>
#include <ctype.h>
#define SIZE 26
struct Character {
char c;
int count;
};
int main(int argc, char** argv)
{
FILE* in = fopen(argv[1], "rb");
struct Character array[SIZE], tmp;
int c, i, j;

for(i = 0; i < SIZE; i++) {
array[i].c = 'a' + i;
array[i].count = 0;
}
while((c = fgetc(in)) != EOF) { if(isalpha(c)) { array[tolower(c) - 'a'].count++; } }
for(i = 1; i < SIZE; i++) {
tmp = array[i];
for(j = i - 1; j >= 0 && array[j].count < tmp.count; j--) { array[j + 1] = array[j]; }
array[j + 1] = tmp;
}
for(i = 0; i < SIZE; i++) { printf("%c %d\n", array[i].c, array[i].count); }
fclose(in);
return 0;
}
>>37
わからないところが解決して助かりました
ありがとうございます
>>791
>メーカー側としても嬉しい流れとも取れるわけで、問題になることは普通ありえないです

ゲーム作成者の意図しない結果を導くセーブデータの改造は、ゲームの著作権(同一性保持権)を侵害して
いて違法、と言う判決がある(通称ときメモ高裁判決: http://www.softic.or.jp/YWG/reports/tokimemo2.html )
ので、「まず問題にならない」とか「普通ありえない」といいきれるほどリスクの無い行為ではないよ。

# まあでも、非営利目的の個人を訴えて来るかどうかは疑わしいけど。
4039:04/08/10 02:38
Σ(゚д゚lll) げ、誤爆したスマソ 
誤爆 乙
Cのリスト構造に関する質問です
0〜9までの数値をリスト構造のデータ構造(数値はdouble型)で保存し、
0〜9までの数値を昇順につながっているようにする
その状態からさらにキーボードより、0〜9までの実数を1つ読み込み、
数値の順序を乱さないようにリスト内に入力された数値をもつリストの要素を1つ追加する
そしてリストに入っているデータをリストの順に表示するというものです
よろしくお願いします
単方向、双方向
どっちですか
・・・あ。昇順/降順だから単方向だし('A`)
#include<stdio.h>

typedef struct list{
double value;
struct list* next;
}LIST;

void print(LIST *l){
if(l->next){
printf("%f\n",l->next->value);
print(l->next);
}
}

void add(LIST *l,double v){
LIST* temp;
if(!l->next || l->next->value>v){
temp=l->next;
l->next=(LIST*)malloc(sizeof(LIST));
l->next->value=v;
l->next->next=temp;
}
else{
add(l->next,v);
}
}

int main(void){
LIST l;
double d;

l.next=NULL;
while(1){
scanf("%lf",&d);
if(d<0)break;
add(&l,d);
print(&l);
}
}
用が終わったら、解放して欲しい・・・
ヒープごと解放されると分かっていても気分が・・・( ´・ω・`)
まぁ良いんだけど・・・
4845:04/08/10 14:01
じゃあ追加
つい GC のある言語の気分で書いてたよw

void listfree(LIST *l){
if(l->next){
listfree(l->next);
free(l->next);
}
}

int main(void){
LIST l;
double d;

l.next=NULL;
while(1){
scanf("%lf",&d);
if(d<0)break;
add(&l,d);
print(&l);
}
listfree(&l);
return(0);
}
>>45,>>46
構造体のポインタの使い方がよくわからなかったのですが
このプログラムを参考にして理解できました
ありがとうございました
そこでD言語ですわ
Cのリスト構造について度々質問です
コマンドラインから指定したファイルを読み込み
ファイル中の各行の文字列をデータとしたリスト構造で、読み込んだ
ファイルを扱えるようにする(リスト構造は双方向を用いる)
読み込んだ後でリストを順方向、逆方向に辿りつつ
データ(各行の文字列)を表示する(両方向とも)
さらにキーボードから指定した行番号の行を削除する
その後再度リストを順方向に辿ってデータを表示するというものです
よろしくおねがいします
>>51
一体それの何処が質問なの?
>>51
何が分からないかを書いてくれ話はそれからだ
54デフォルトの名無しさん:04/08/10 16:05
所持金は最初500円で、じゃんけんして勝てば100円増え、負けたら100円減って所持金がマイナスになったら終了
というゲームをなるべく簡単なc言語で作ってください。
おねがいします。
5551:04/08/10 16:06
>>53
単方向のリスト構造はなんとかわかるのですが、双方向になると途端に
イメージがつかみにくくなりました。双方向ではどのようにリスト構造を記述
すればよろしいのでしょうか?
疑問点がわかりづらく申し訳ありません・・・
node *p, *q;

p->next = q;
q->prev = p;
>>56
ありがとうございます
これを足がかりになんとか作ってみます・・・
     ┌────┐┌────┐┌────┐
     |Node 1  ||Node 2  .||Node 3  |
NULL─┼・prev   ||   next・┼┼・prev   |
     |   next・┼┼・prev   ||   next・┼─NULL
     └────┘└────┘└────┘
図で描くとこんな感じか?
>>54
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(){
int i, j, money = 500;
srand(time(NULL));

while(money => 0){
printf("所持金 %d円\n[0]グー [1]チョキ [2]パー ", money);
scanf("%d", &i); if(i < 0 || i > 2) i = 0;
j = rand() % 3;
printf("YOU = %s ", i == 0 ? "グー" : (i == 1 ? "チョキ" : "パー"));
printf("COM = %s\n\n", j == 0 ? "グー" : (j == 1 ? "チョキ" : "パー"));

if((i + 1) % 3 == j)
money += 100;
else if((j + 1) % 3 == i)
money -= 100;
}
printf("Game Over\n");
return 0;
}
6059:04/08/10 16:34
while(money => 0)って・・・俺バカバカ!

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(){
int i, j, money = 500;
srand(time(NULL));
while(money >= 0){
printf("所持金 %d円\n[0]グー [1]チョキ [2]パー ", money);
scanf("%d", &i); if(i < 0 || i > 2) i = 0;
j = rand() % 3;
printf("YOU = %s ", i == 0 ? "グー" : (i == 1 ? "チョキ" : "パー"));
printf("COM = %s\n\n", j == 0 ? "グー" : (j == 1 ? "チョキ" : "パー"));
if((i + 1) % 3 == j)
money += 100;
else if((j + 1) % 3 == i)
money -= 100;
}
printf("Game Over\n");
return 0;
}
C言語で計算機のプログラムを作成せよ。補足説明もせよ。
という宿題です。お願いします。
>>61
#include <stdio.h>
int main(void) {
int i,j;
scanf("%d,%d",&i,&j);
printf("%d+%d=%d\n",i,j,i+j);
return 0;
}
#include <stdio.h>
#include <stdlib.h>

int main()
{
    double n1, n2;
    char szTemp[256];
    printf("Input num[1] > ");
    fgets(szTemp, sizeof(szTemp), stdin), n1 = atof(szTemp);
    printf("Input num[2] > ");
    fgets(szTemp, sizeof(szTemp), stdin), n2 = atof(szTemp);
    printf("Input oparator > ");
    fgets(szTemp, sizeof(szTemp), stdin);
    switch(szTemp[0]){
        case '+':
            printf("%f + %f = %f\n", n1, n2, n1 + n2);
            break;
        case '-':
            printf("%f - %f = %f\n", n1, n2, n1 - n2);
            break;
        case '*':
            printf("%f * %f = %f\n", n1, n2, n1 * n2);
            break;
        case '/':
            printf("%f / %f = %f\n", n1, n2, n1 / n2);
            break;
        default:
            puts("Unknown operator!");
            break;
    }
    return;
}
int main
あれ・・・ミスってる。
return; → return 0;

警告出なかったから気づかなかったorz
>>63
ところで、インデントどうやってるの?
&nbsp;[半角スペース]&nbsp;[半角スペース]
>>67
                    ナルホド
6954:04/08/10 17:43
>>59
どうもありがとうございます
7151:04/08/10 19:16
>>70
ありがとうございます
参考にさせていただきます
C++
文字列の前後のスペースを除去する関数
string trim(string);
を作成せよ
73デフォルトの名無しさん:04/08/10 20:57
>>72
#include <iostream>
#include <string>
#include <cctype>
using std::string;
using std::isspace;
string trim (string str)
{
  unsigned i = 0, j = str.length();
  while (isspace(str[i]))
    i++;
  while (isspace(str[j]))
    j--;
  str.resize(j);
  return string(str.c_str() + i);
}

int main(void)
{
  for (;;)
  {
    string str;
    std::cin >> str;
    std::cout << trim(str) << std::endl;
  }
  return 0;
}
もしisblankがあればisspaceよりもそれを使う方がいい鴨
>>73
ありがとうございました
75デフォルトの名無しさん:04/08/10 22:15
環境はwindowsXPHome+cygwin+gccで言語はCです
宿題は次の通りです。

円の座標データから、最小二乗法により
円の方程式の係数を求める関数を作れ。
円の方程式は、y=(x-a)^2+(y-b)^2
ただし、引数は次のようにする

x[],y[]・・・円の(x,y)の座標データの入っている配列のポインタ
count・・・座標データの数
a・・・円の方程式のaの値
b・・・円の方程式のbの値

お願いします
C++です
文字列の結合のプログラムがうまく動きません。
エラーが出て終了してしまいます。

#include <iostream>
#include <string>

using namespace std;

int main(void){
char *str="def";
char *str2=(char *)malloc(128);
int na;

//文字列の結合
str2="abc";

strcat(str2 , str);

cout << str2 << "\n";

return 0;
}

どこがおかしいでしょうか?
strcpy(str2, "abc");
strcat(str2, str);
78デフォルトの名無しさん:04/08/10 23:16
× str2="abc";

○ strcpy(str2, "abc");
ところで、malloc や strcat つかうなら

#include <cstdlib>
#include <cstring>
あたりを入れるべきじゃ?

逆に#include <string> はこのプログラムだと意味ない。
8076:04/08/10 23:44
ありがとうございます。

>>79さん
教科書には<string>とかいてあったのですが、
なくてもできました。

#includeはなんとなくおまじないみたいな感じで使っていたのでよくわかりません。
そのあたりのことについて詳しく紹介しているHPなどありましたら、
教えてください。
そんな教科書捨てちま・・・え無いんだろうな。家ではマトモな本読んだ方がいいぞ。
まぁ、あれだ。
C言語を学んどけ。
C++の前にCはやった方が良い
でも将来のことを考えると、 OOP を十分に習得するまでは C はやらないほうがいい。
誰も >>75 の問題には答えて上げられないのなw
問題がアレな感じもするけど
マジで
>y=(x-a)^2+(y-b)^2
y=なの?
(x-a)^2+(y-b-1/2)^2=b+1/4
>>75
>>86
円にならないだろ?
円にはなると思うけど…。
>(x-a)^2+(y-b-1/2)^2=b+1/4
は、(a, b+1/2)を中心とする半径√(b+1/4)の円。
8975:04/08/11 11:30
>>86-88
すいません
r^2=(x-a)^2+(y-b)^2
でした・・・
座標は
(x[i],y[i])なの?
(x[i],y[j])なの?
まぁマジレスすると

円の方程式を (x-a)^2+(y-b)^2=r^2 とする
誤差 dr を点から円への距離の差分とする。つまり dri = ((xi-a)^2+(yi-b)^2)^0.5 - r
dri^2 = (xi-a)^2+(yi-b)^2 - 2*r*((xi-a)^2+(yi-b)^2)^0.5 + r^2
この二乗の和を求める
S = Σdri^2 = Σ{(xi-a)^2+(yi-b)^2 - 2*r*((xi-a)^2+(yi-b)^2)^0.5 + r^2}
これを a , b , r で微分する
dS/da = -2Σxi + 2na -2rΣ((xi-a)/((xi-a)^2+(yi-b)^2)^0.5)
dS/db = -2Σyi + 2nb -2rΣ((yi-b)/((xi-a)^2+(yi-b)^2)^0.5)
dS/dr = -2Σ((xi-a)^2+(yi-b)^2)^0.5 + 2nr
dS/da = 0 , dS/db = 0 , dS/dr = 0 となる a , b , r が求める円の方程式の係数である。
方程式解くのはがんばれ

9275:04/08/11 13:42
>>90

>>91
サンクス!
今のところさっぱりだけどがんがってみる!
ちなみに式の中のnってなんなんでしょうか?
文字列結合ならアセンブラを使うがよろし
>>92
データ数じゃねぇの?
>>92
nには任意の定数が入ります
数学の宿題のスレではないよここは・・・
いや、俺学生だけど解いてあげるのが勉強になってちょうどいいわ
98デフォルトの名無しさん:04/08/11 17:02
Cなんですが、実行中のファイルのコピーの仕方がよくわかりません
実行ファイルがa.exeだとして、それを実行すると、そこの一つ上のフォルダに、
その実行ファイルを別名(b.exeとか)にしてコピーしたいのですが、いまいちできません。

ttp://ja5ytd.hp.infoseek.co.jp/copy.html
ここを参考してみたんですが、実行ファイルだと空っぽのファイルしか作れませんでした。
お願いします。
ウイルス作る宿題かい?
いえ、できればそのディレクトリの中を全部上層にコピーしたあと、そのフォルダを削除したいんですが、
実行ファイルのみがうまくいかずに困っています。
>>100
バイナリモードでリード、ライトしてみては?
>>100
もしかして Windows 環境でやってない?

Windows では、たとえ実行時であっても OS が必要ないと思った実行ファイルの一部分は
いつでもメモリ上から捨てられ、ふたたび必要になった時に実行ファイルを読み直すという
動作をするので、実行中のファイルをいじらせてはくれないよ。

もしやるとしたら、全てのセグメント、リソースなどを PRELOAD, FIXED, NONDISCARDABLE
属性にするようにコンパイラに指示する (これによって実行ファイルの全部分が破棄禁止に
なる) か、もしくは二つの実行ファイルを作って交互に切り替えながら実行するしかないよ。
任意の数値を逆に並び替えるアルゴリズムを教えてください
1234→4321
852→258
ってな風に・・・

頭弱くて素でわからん
104103:04/08/11 17:46
age忘れた
105103:04/08/11 18:08
漏れが馬鹿すぎた・・・わかりました。すみません。
>>103-105
なかなか面白い奴だな。
107デフォルトの名無しさん:04/08/11 22:04
何に使うか気になるけど
x+y(式A)、2x+5y(式B)に(x,y)=(10,2)(3.4)(4,1)をそれぞれ
代入するプログラムを作成せよ。ただし変数宣言「(x,y)のみのファイル」
と計算プログラムは別にし、あわせてmakefileも作成せよ。
また、filenema.exe -a の時は式Aのみの計算結果を、
filename -b の時は式Bの計算結果を表示できるようにせよ。

よろしくお願いします。
リンケージを意識させる問題とはいえ、ちょっとなぁ。
111デフォルトの名無しさん:04/08/12 03:49
"pushd"入力することでディレクトリスタックへカレントディレクトを保存し、
"popd"を入力することでディレクトリスタックのトップに保存されている
ディレクトリに移動するプログラムを作成しているのですが、
どうしてもバグが発生してしまします。
プログラムが非常に長くて全部は書けないのですが


/*ディレクトリスタックを実現するための構造体*/
struct dirStack{
char *dirName; //保存されているディレクトリ名
struct dirStack *next; //次のdirStackへのポインタ
};

/*ディレクトリスタックのトップへのポインタ.初期値はNULL*/
static struct dirStack *dirStackTop;

/*pushdが入力されたとき以下の行が実行される*/
dirStackTop=Cmd_pushd(dirStackTop);

112デフォルトの名無しさん:04/08/12 03:49
/*関数Cmd_pushd*/
struct dirStack *Cmd_pushd (struct dirStack *top){
struct dirStack *newTop;
char curName[256];
/*メモリの確保*/
if ((newTop=(struct dirStack *)malloc(sizeof(struct dirStack)))==NULL){
fprintf(stderr,"memory error!\n");
return;
}

getcwd(curName,sizeof(curName));//カレントディレクトリをcurNameに保存
/*以下の2行でバグ発生*/
newTop->dirName=(char *)malloc(sizeof(strlen(curName)+1));
strcpy(newTop->dirName,curName);

if (top!=NULL){
newTop->next=top;
}
return newTop;
}

ややこしくてすみません…。
バグの内容は?
>>112
newTop->dirName = (char *)malloc(sizeof(strlen(curName)+1));
sizeofいらね。
115111:04/08/12 04:30
>>114
sizeofとったら上手くいきました。
メモリの割り当てのエラーだったみたいですね…。
どうもありがとうございました!
ちなみに、
sizeof(strlen(curName)+1)
の値っていくつ?
sizeof(size_t)
と一緒?
そうだね、返り血がsize_tだから。
エラーが出てコンパイルできません。
どうしてでしょう。
教えてください。

#include <iostream>
using namespace std;

class JOK{
private:
static int all_sum;
int num;
char *str;
public:
static int all_get_JOK();
JOK(char *asd);
};

int JOK::all_get_JOK(){
return all_sum;
}

JOK::JOK(char *asd){
this->num = all_sum;
all_sum++;
}

int main(){
class JOK *obj = new JOK("nekoneko");
cout << JOK::all_get_JOK() << "\n";

return 0;
}
エラーは

static.obj : error LNK2019: 未解決の外部シンボル "private: static int JOK::all_s
um" (?all_sum@JOK@@0HA) が関数 "public: static int __cdecl JOK::all_get_JOK(void
)" (?all_get_JOK@JOK@@SAHXZ) で参照されました。

です。
>>118
staticなメンバ変数は、宣言とは別に定義されなければならない。
int JOK::all_sum;

すれちがい。
>>118
ありがとうございます。
1から10000000までの数について、ある整数の2乗になっているものを全て示せ。

できるだけ早いコードが良いらしいです。
あらかじめ配列に答えを入れておいてそれを表示するだけ、とかはもちろんダメらしいです。
>>122
#include <stdio.h>
int main(void)
{
for(int i = 1; i < 3163; i++) printf("%d\n", i*i);
}
#include <stdio.h>
#include <math.h>

int main()
{
    int i
    const int max = sqrt(10000000);
    for(i = 1; i < max; i++) printf("%d\n", pow(i, 2));
    return 0;
}
125124:04/08/12 19:15
訂正
正 i <= max
誤 i < max
なるほど 俺だったら真面目に解いたかも
出題者は >>123 の可能性を考えてないだろうなぁ
>>124
powの結果はキャストしろ。
128122:04/08/12 21:31
ありがとうございました。なるほど発想を変えてみると良いんですね。でも、次の問題でまた詰まりました。
このシリーズの問題はこれが5問目で最後なのでどうかお願いします

整数(分かりやすいようにコンマが入ってます)
X,000,999 ・ X,001,998 ・ X,002,997 …… X,100,899 ……X,999,000 について
ある整数の2条になっているものを表示せよ。ただし、Xの部分には1-9の数字の時を考える。
>>128
#include <iostream>
#include <algorithm>
#include <vector>
int main(){
  std::vector<long> v;
  for(long i = 1; i * i <= 9999000; i++) v.push_back(i * i);
  for(long i = 0, k = 999; i <= 999; i++, k += 999 ){
    for(long j = 1; j <=9; j++){
      long n = k + j * 1000000;
      if(v.end() != std::find(v.begin(), v.end(), n))
        std::cout << n << std::endl;
    }
  }
  return 0;
}
>>129
longが32bitだとだめね。
__int64とかlong longとか、環境依存の型を使わないとか。
131130:04/08/12 22:58
>>129
あ、悪い、あってるな。
for()の条件式にi*iなんて普通書かんから勘違いした。
>>128 C バージョン
#include <stdio.h>
#include <math.h>

int main()
{
long x;
long n;
long count = 0;
long amari;
long min;
long max;

for (x = 1; x < 10; x++) {
min = sqrt(x * 1000000) + 1;
max = sqrt((x + 1) * 1000000 - 999);
amari = (x*1000000) % 999;
printf("X = %ld :\n", x);

for (n = min; n <= max; n++) {
if ((n * n) % 999 == amari) {
printf("\t%ld\n", n*n);
count++;
}
}
}

printf("\n%ld found.\n", count);
}
Cでも書いてみた。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
long *TBL;
int MAX_INDEX;
int b_search(long n){
  int m, l = 0, r = 3162;
  while(r - l > 1){
    m = (l + r) / 2;
    if(*(TBL + m) == n) return 1;
    if(*(TBL + m) > n) r = m; else l = m;
  }
  return 0;
}
int main(){
  long i, j, k, n;
  MAX_INDEX = sqrt(9999000);
  TBL = malloc(MAX_INDEX * sizeof(long));
  for(i = 0; i * i <= 9999000; i++) *(TBL + i) = i * i;
  for(k = 999; k <= 999000; k += 999){
    for(j = 1; j <= 9; j++){
      n = k + j * 1000000;
      if(b_search(n))  printf("%ld\n", n);
    }
  }
  free(TBL);
  return 0;
}
134133:04/08/12 23:14
7行目、訂正

× int m, l = 0, r = 3162;
○ int m, l = 0, r = MAX_INDEX - 1;
>>133
やたらコアダンプすると思ったら
> TBL = malloc(MAX_INDEX * sizeof(long));
これ一要素分足りない
配列につっこむもの逆にすればかなり速くなるよ。
これの出力結果って何になる?
1974025
4774225
7958041
9678321
#include <stdio.h>
#include <math.h>

int main(){
    int max, i, j, tmp;
    for(j = 1, max = (int)sqrt(1999000); j <= 9; max = (int)sqrt(++j * 1000000 + 999000))
        for(i = (int)ceil(sqrt(j * 1000000 + 999)); i <= max; i++){
            tmp = (int)pow(i, 2);
            if(tmp / 1000 % 1000 + tmp % 1000 == 999)
                printf("%d\n", tmp);
        }
    return 0;
}

C版 兼 へたくそ版
> if(tmp / 1000 % 1000 + tmp % 1000 == 999)
の判定は tmp % 1000000 が 0 以外で 999 で割り切れるのと等価
今出てる回答って
「あらかじめ配列に答えを入れておいてそれを表示するだけ、
とかはもちろんダメらしいです。」
の条件クリアしてる?
>>141
禁止なのは

#include <stdio.h>

int main()
{
    int ansmap[] = {1974025, 4774225, 7958041, 9678321}, i;
    for(i = 0; i < 4; i++) printf("%d\n", ansmap[i])
    return 0;
}

こんなんじゃないか?
>>141 は慎重派の学生
#include <stdio.h>
#include <math.h>
int main(){
  int i, j, k, m, next;
  next = sqrt(1000999);
  m = next * next;
  for(i = 1000000; i <= 9000000; i += 1000000){
    for(j = 999; j <= 999000; j += 999){
      k = i + j;
      if(k == m){
        printf("%d\n", k);
      }
      else if(k > m){
        next++;
        m = next * next;
      }
    }
  }
  return 0;
}
訂正。
どっちでも答えは一緒だけど、厳密にはこっちが正しい。
#include <stdio.h>
#include <math.h>
int main(){
  int i, j, k, m, next;
  next = sqrt(1000999);
  m = next * next;
  for(i = 1000000; i <= 9000000; i += 1000000){
    for(j = 999; j <= 999000;){
      k = i + j;
      if(k == m){
        printf("%d\n", k);
      }
      else if(k > m){
        next++;
        m = next * next;
        continue;
      }
      j += 999;
    }
  }
  return 0;
}
146デフォルトの名無しさん:04/08/13 21:18
<empfile.txt>
鈴木太郎,33
佐々木次郎,25

上記ファイルをカンマ区切りで読み込ませようとしているのですが、
そのように表示できません。どう変更したら良いでしょうか。

<目標とする画面表示>
名前:鈴木太郎 年齢:33
名前:佐々木次郎 年齢:25

<現状>
名前:鈴木太郎,33 年齢:0
名前:佐々木次郎,25 年齢:0
147146:04/08/13 21:18
#include <stdio.h>
#include <stdlib.h>
struct LIST
{
  char name[20];
  int age;
}list[2];
void main(void)
{
  FILE *file_p;
  int i;
  file_p = fopen("empfile.txt", "r");//empfile.txtを読み込み。
  if(file_p == NULL)exit(1);
  i = 0;
  while(fscanf(file_p, "%s,%d", list[i].name, &list[i].age) != EOF)
    i++;
  for(i = 0; i < 2; i++)//構造体の内容を表示。
    printf("名前:%s 年齢:%d\n", list[i].name, list[i].age);
}
>>146
fscanf の %s は 非空白文字全てを読み込むため、
"," 毎読み込まれているようです。

対策としては、
1. ","(カンマ)ではなく" "(スペース)を区切り文字として使う
2. fscanf ではなく、 fgets & strtok 等を使う

例えばこんな感じ。
変更点のみ

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

char buffer[80];

while(!feof(file_p)){
fgets(buffer,80,file_p);
strcpy(list[i].name,strtok(buffer,",") );
list[i].age=atoi(strtok(NULL,","));
i++;
}
>>146
#include <stdio.h>
#include <stdlib.h>
struct LIST
{
char name[20];
int age;
}list[2];
int main(void)
{
FILE *file_p;
int i;
file_p = fopen("empfile.txt", "r");//empfile.txtを読み込み。
if(file_p == NULL)exit(1);
i = 0;
while(fscanf(file_p, " %[^,],%d", list[i].name, &list[i].age) != EOF)
i++;
for(i = 0; i < 2; i++)//構造体の内容を表示。
printf("名前:%s 年齢:%d\n", list[i].name, list[i].age);
return 0;
}

>>148
fgets の返り値を検査しないと EOF の時も strtok に突入しうる悪寒(汗
風邪でもひいたのか?
152146:04/08/13 23:28
>>148
今まで、fscnaf以外の読み取り関数を避けていたので、
この機会に勉強します。
また、スペースを区切り文字として使う方法でも、成功しました。

ありがとうございます。

>>149
目標通りの表示が得られました。
ありがとうございます。

%[^,] これはどういう意味でしょうか。
はじめて見る書式です。
%[認識するキャラクタの集合]
%[^無視するキャラクタの集合]
>>152
http://www.linux.or.jp/JM/ の 『man on WWW』 のセクション 2,3 で検索すると、
大概の C の関数は載っているので、調べてみる事をおすすめする。
155146:04/08/14 00:12
>>153
>>154

セクション3 scanf

>変換を示す % 文字

そうでした。まさに変換。
意味するところが飲み込めて来ました。
ありがとうございます。
"%[^,],%[^,],%[^,]"って感じで割りと使うのだけど、ファイルの方が

foo,bar,baz

ならいいけど

hage,,hoge

だと2番目が変換ミス(戻り値が1)になるんだよね。
age
sage
>>157
宿題がほしいのか?
まぁ、焦らずとも夏休み終了間際にはどっとくるでしょ。
多機能(各々に任す)計算機のプログラムを作成せよ。ソースの説明をせよ。
という問題の答えを教えていただきたいです。
言語は?
>>160
マルチ氏ねや
>>162
向こうで誘導されたんだと思われ。
164160:04/08/15 15:42
C言語です
誘導されたとしても、移動を伝えてなければマルチだよな。
>>165
そうか?誘導された時点で向こうでは誰も答えないだろうから良いと思うんだが。
>>166
その誰も答えないという自信はどこから?
第三者からみて何も告げずにというのは関心できないと感じる
>>167
言い方が悪かった。誰も答えないと確信してる訳じゃない。
ただ、既に他の摺れに誘導された事を知って質問に答えるのは
回答者の酔狂であって、マルチと知って質問に答えるのと対した違いは無いから、
礼儀を尽くすに値しないんじゃないか、と言う事が言いたかった。

>第三者からみて何も告げずにというのは関心できないと感じる
俺はどうでも良いと感じる。
でもまぁ、一言くらい書いてもばちは当たらんな。
つーか、移動元スレだけ見ても移動したかどうかは判らんし。
170デフォルトの名無しさん:04/08/15 16:35
c:\borland\bcc55\examples\stdlib\cpp1mepo.cpp(5) : warning C4508: 'main' : 関数に戻り値の型が指定されていません。戻り値を void 型と見なします。

できてるつもりなんですが、こんなのがでてしまいます
なぜなんでしょうか?
何が「出来てるつもり」なのか、説明してみろ
172デフォルトの名無しさん:04/08/15 16:37
#include<iostream.h>
main()
{
cout<<"I am genius\n";
}

という単純なプログラムのはずなんですが
>>172
int main()...
スレ違い…と言おうと思ったが、コンパイラの吐いた警告すら
読めてないところを見るとこいつは日本語が読めないのか。
なら仕方ないな
>>170
void か int で return
176170と同級生っぽw:04/08/15 16:51
進学校の高2の夏休みの宿題にいきなり

C++!

って。。。

PC持ってない人はどうするんだろうねw
変な冊子渡されたけど意味プーだしw

つか、上で質問してる文盲のやってるプログラムは
その冊子の1題目。

おまえももうちょっとがんばれよw
>>176
古い規格を習わされて御愁傷様。
>>176 ってかなりアフォっぽいっていうかアフォ
俺なんか、昔勝手に質問を他スレにコピペされ、
あらぬマルチ疑いをかけられ、回答して貰えなかった事あったなぁ・・・
そんなのは極希
>>172
cout<<"I am genius\n"; // この行がおかしい
うはあ、高校生マジで来てんの?
using namespace std;
>>183
iostream.h
185デフォルトの名無しさん:04/08/15 18:53
C++での質問なんですが、
基底クラスで純枠仮想関数を作って、派生クラスでその関数の中身を書くじゃないですか。
それで、基底クラスでその仮想関数を呼ぶ事って出来るんでしょうか?
上にある関数を下から呼び出すことは出来るのでしょうか?
出来なきゃ意味が(ry
それに下にある関数を上からの間違いじゃないのか?
基底と言う言葉から下を連想したのではないだらうか。
あの、初心者なんですがC++のコードって変数宣言するときに
VBみたいに関数のはじめのほうで全部宣言しちまったほうがいいんですか?
{
 int A,B,C,D,E;
 char cA,cB,cC;
 ・・・;・・・;・・・;・・・;・・・;・・・;・・・;
 ・・・;・・・;・・・;・・・;・・・;・・・;・・・;
}

それとも
{
 int A;
 ・・・;
 int B;
 ・・・;
 int C;
 ・・・;
 int D;
 ・・・;
 char cA;
 ・・・;
 ・
 ・
 ・
 (略)
}
こんなふうにそのつど宣言したほうがいいんでしょうか?
どっちのほうが綺麗なコードになりますか?
>>188
C++ では途中で宣言出来る。

どっちがいいかは知らね。
漏れは無駄がなくなるように変数宣言は出来るだけ後回し。
そのほうが変数の意味も分かりやすくなるし。
>>186-187
上下なんて図示上の都合なんだから、どちらが上か下かなんて意味無いだろ
次のようなメンバを持つ構造体の、それぞれのメンバの相対アドレス(先頭のメンバ
のアドレスが0x0000となるように)を昇順で出力するプログラムを作成しましょう。

char c;
short s;
int i;
long l;

ファイル名 : lesson10.c

l : 0x0000
i : 0x0004
s : 0x0008
c : 0x000a

ーーーーーーーーーーーーーーーーーー
これをお願いします 
>>188
まとめて書きたがる香具師に限って関数が長くなる傾向があり、その変数が何者なのか不明になりがち。

それはさておき、君は事前に使う道具を全て揃えてから作業に取り掛かるのと、
必要になる都度道具を用意するのとどっちが好きかね。
>>191
#include <stdio.h>
#include <stdlib.h>
#define offsetof(s, m) ((char *) &(s).(m) - (char *) &(s))
int main(void)
{
struct {
long l;
int i;
short s;
char c;
} foo;
printf("l:%p\ni:%p\ns:%p\nc:%p\n", offsetof(foo, l), offsetof(foo, i), offsetof(foo, s), offsetof(foo, c));
return EXIT_SUCCESS;
}
error C2059: 構文エラー : '('
195191:04/08/15 23:20
ありがとうございます
でもオレのレベルが低すぎてマクロが理解できません(´・ω・`)ショボーン
マクロ部分を関数内に展開?してくれませんか?ごめんなさい
マクロくらいこの機会に理解したらどうだよ?
昇順だと普通にやると環境依存になりがち
>>195
あー、(m)じゃなくてmのまんまじゃないと>194だった。
ついでによく見たらstddef.hにあるoffsetofマクロと仕様が違ってた。
マクロ定義を外して、
struct {

struct Foo {
に、
offsetof(foo, l)

offsetof(struct Foo, l)
にすれば通るはずだよ。
#include<stdio.h>
typedef struct mystruct{
char c; short s; int i; long long l;
}MYSTRUCT;
int main(void){
MYSTRUCT ms[2];
int index[4];
char p[]="csil";
char c;
int i,j,temp;
index[0]=((void*)&(ms[0].c))-(void*)&ms[0];
index[1]=((void*)&(ms[0].s))-(void*)&ms[0];
index[2]=((void*)&(ms[0].i))-(void*)&ms[0];
index[3]=((void*)&(ms[0].l))-(void*)&ms[0];
for(i=0;i<4;i++){
for(j=3;j>i;j--){
if(index[j]<index[j-1]){
temp=index[j];
index[j]=index[j-1];
index[j-1]=temp;
c=p[j];
p[j]=p[j-1];
p[j-1]=c;
}
}
}
for(i=0;i<4;i++)printf("%c:%04x\n",p[i],index[i]);
printf("size %04x\n",(void*)&(ms[1])-(void*)&ms[0]);
}
200199:04/08/15 23:46
仕様に昇順でとあったからソートを入れておいたよ。
バブルソート入れると行数きつきつ。

long だとうちのコンパイラ(cygwin gcc)じゃ int と同じサイズの 4 ビットだから
long long 型 8 ビットにしてみた。double 型でも可。
たぶん出題者の意図はこっち。
構造体の中身の順序をいろいろ変えて試すと面白いと思うよ。
ついでにおまけも入ってるよ。
……………4bitって………


unsignedで0〜15までしか表せないじゃん
202191:04/08/15 23:52
ありがとうございます
本当に助かりました(´Д⊂グスン
この機会にマクロを勉強してきます
203188:04/08/16 00:03
必要になる都度道具を用意するタイプなのでそうしようと思イマス
やってしまった。
s/ビット/バイト
何やっているんだろう・・・・・。
まだ夏休みなんだろ。
みんな遊び呆ければいいのに。
206191:04/08/16 00:09
>199さんの
char p[]="csil";
が理解できません
教えてください
スレ違い
つかそれがマジならそんな宿題やるレベルじゃねーだろ
>>206
可変長の文字列配列の初期化
実質的には
char p[5];
p[0]='c';
p[1]='s';
p[2]='i';
p[3]='l';
p[4]='\0';
といっしょ。
209191:04/08/16 00:21
( ゚д゚)ハッ!
csilって文字列になにか意味があるって想ってしまいました
早とちりごめんなさい(´;ω;`)ウッ…
GNUとはなにか教えてください
GNU's Not Usable
#include <stdio.h>

main()
{
printf("GNU");
while(1)
printf(" is Not Unix");
}
>>210
がんもどき 煮込んだら 美味かった
ttp://www.sra.co.jp/public/doc/gnu/
なんで G なの?

ANU = ANU's Not Unix
BNU = BNU's Not Unix
CNU = CNU's Not Unix
DNU = DNU's Not Unix

何でもいいじゃん
XINU
XI = G
gnu: 野牛、ヌー
何故 XI = G なのかワカラン。
バカでスマソ。
219デフォルトの名無しさん:04/08/16 18:26
>>218
XI(ズィー)とG(ヂー)
英語だと発音違うのにな
6番目のアルファベット
えっとちょっと疑問に思ったので質問なんですが

char Suzi[100];
double Result;
Suzi = "3.28"
Result = atof(Suzi);

こうすると
Result に 3.280000000002 が格納されてしまいます。
なぜ 3.280000000000 ではないのでしょうか?

//Suziの数によって右端が0だったり0じゃなかったりします・・・。
不動小数点数で表される数字は離散的だから
不動・・・orz
>>222
うーん、なにやら奥が深いんですね。
Result に 3.280000000000 というように正しい値が格納されるようにするには
どうすればいいですか?
double Result = 3.28;
>>221

char Suzi[100];
Suzi = "3.28"

これ変じゃないか?
いいの?
>>225
3.28は例なので任意の数字を指定できるようにしたいです。
>>226
すいません";"が抜けてました。
Suzi = "3.28";
です。
228227:04/08/16 19:34
あー変の意味がわかりました。
char Suzi[] = "3.28";

こう書けば大丈夫でしょうか?
>>227
そういう意味かな
230226:04/08/16 19:39
>>228
そういう意味です
231 ◆Z0vd5w812U :04/08/16 19:43
>>224
二進数小数についてを調べるとよい。
で、有限長小数を丸め誤差なしで扱いたいなら文字列で管理する。
あとは、誤差なしで数値管理してくれるライブラリパッケージを使うとか。
232218:04/08/16 19:46
>>219
なるほど、でもXIならどっちかというと「グィ」?
ん?って事はXINUはギニュー!?(特戦隊)

>>220
XI は 11 だと思います。
G は 7番目だと(ry
>>232
不覚にもギニューはつぼだった
>>232
英語の場合、X は S とか Z の発音する気が。
235デフォルトの名無しさん:04/08/16 21:39
ASCII文字列の各文字を
小文字を大文字に
大文字を小文字に
どっちでもなければそのまま
に変換するコードをC++でかっこよく書くにはどうしたらいいですか?
<*.h> および <cctype> の類は #include しないで実装するにはどうしたらいいですか?
>>236
かっこよくかww
がんばれ↓
237236:04/08/16 21:41
自分にレスってどうする on_
238デフォルトの名無しさん:04/08/16 21:44
こんなのしか思いつきません
これじゃあ全然C++じゃないんだけどなにをどうしたらC++らしくなるのでしょう?

void henkan(char* target)
{
  static const char s = ( 'a' - 'A');
  for(char* t = target; *t; ++t){
    if(*t >= 'a' && *t <= 'z') {
      *t -= s;
    }
    else if(*t >= 'A' && *t <= 'Z') {
      *t += s;
    }
}
センスなさ杉
C++ どころか C すらやめたほうがいいよ
240デフォルトの名無しさん:04/08/16 21:50
ガーン・・・>>239さんならどのようにしますか?
そもそも
>C++でかっこよく
><*.h> および <cctype> の類は #include しない
これがおかしいわけだが
242デフォルトの名無しさん:04/08/16 21:54
どこらへんがおかしいのか良くわからないので教えてもらえないでしょうか?
かっこいいかどうかはしらんが、こんなんでどう?

#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
struct UpperLower {
  void operator()(char &c){
    if(InRange(c, 'a', 'z'))
      c = c - 'a' + 'A';
    else if(InRange(c, 'A', 'Z'))
      c = c - 'A' + 'a';
  }
  bool InRange(int val, int a, int b){
    return val >= a && val <= b;
  }
};
int main(){
  string s = "absgd7382AHsufeAFDUE";
  cout << s << endl;
  for_each(s.begin(), s.end(), UpperLower());
  cout << s << endl;
  return 0;
}
char
to_upper_or_lower( char c )
{
    const char d = 'A' - 'a';
    char         r = c;

    if( c >= 'a' && c <= 'z' )
    {
        r += d;
    }
    else
    if( c >= 'A' && c <= 'Z' )
    {
        r -= d;
    }

    return r;
}

void
henkan( char* target )
{
    while( *target != '\0' )
    {
        *target = to_upper_or_lower( *target );
        target ++;
    }
}

普通にこれじゃダメなのか?
printf("ぬるぽ ぬるぽ オートラン♪\n");
printf("ヌルポ ヌルポ AutoRun♪ \n");
printf("ぬるぽ ぬるぽ オートラン♪\n");
printf("お前が踏まなきゃ誰が踏む!\n");
かっこよくだとか、ハック的な事を好むのは厨房までにしときなさい
247デフォルトの名無しさん:04/08/16 22:17
はーい
ありがとうございました。
>>235

普通は以下のようなテーブルを作成して
テーブル参照一発で解決じゃないですか?

{
0x00, 0x01, 0x02, ...
0x10, 0x11, 0x12, ...
...
0x40, 0x61, 0x62, ...
0x70, 0x71, 0x72, ...
0x60, 0x41, 0x42, ...
0x50, 0x51, 0x52, ...
...
};
>>246
ん〜、でも
きれいなソース、読みやすいソースをめざして、
コーディング技術の向上に努めるのはいいことかもしれませんよ。
>>249
オレがいつ
>きれいなソース、読みやすいソースをめざして、
>コーディング技術の向上に努めるのはいいこと
こんな話したよ?
       _
    ミ∠_)
  ∧_∧/ \\
  ( ・∀/)   | | ガッガッガッガッガッガッ 
  (  つつ    | |
   Y  /ノ    人
    / )    <  >_∧∩
  _/し' //. V`Д´)/
  (_フ彡        /  ←>>245
int char_tbl[0xff + 1];
void init(void){
  int i;
  for(i = 0; i <= 0xff; i++) char_tbl[i] = i;
  for(i = 'a'; i <= 'z'; i++) char_tbl[i] += 'A' - 'a';
  for(i = 'A'; i <= 'Z'; i++) char_tbl[i] += 'a' - 'A';
}

void henkan(char *s){
  while(*s){
    *s = char_tbl[*s];
    s++;
  }
}
#include<algorithm>
#include<numeric>
#include<iostream>
#include<string>
#include<functional>
#include<vector>

int main()
{
 string s="This is a test.";

 vector<char> cmap(256);
 fill(cmap.begin()+1, cmap.end( ), 1 );
 partial_sum( cmap.begin( ), cmap.end( ), cmap.begin( ));
 swap_ranges( cmap.begin( )+'A', cmap.begin( )+'Z'+1, cmap.begin( )+'a' );
 transform( s.begin( ), s.end( ), s.begin( ), bind1st( mem_fun1_ref(&vector<char>::operator[]), cmap ));

 cout << s << endl;
}
>>253
そりゃ確かにすごくC++っぽいけれどもw
255252:04/08/17 00:17
意味も無くクラス化してみたり。

#include <iostream>
class Henkan {
  int char_tbl[0xff + 1];
public:
  Henkan();
  char *operator()(char *s);
};
Henkan::Henkan(){
  for(int i = 0; i <= 0xff; i++) char_tbl[i] = i;
  for(int i = 'a'; i <= 'z'; i++) char_tbl[i] += 'A' - 'a';
  for(int i = 'A'; i <= 'Z'; i++) char_tbl[i] += 'a' - 'A';
}
char *Henkan::operator()(char *s){
  char *p = s;
  do{*p = char_tbl[*p];}while(*p++);
  return s;
}
int main(){
  char s[] = "abcd123EFGH456ijkl789MNOPQR";
  std::cout << Henkan()(s) << std::endl;
  return 0;
}
よし、次は継承とメンバシップで実装してみよう
257248:04/08/17 00:47
なんでみんなロジックで実装するんだろう。
ちょっと寂しくなってきた。
>>257
宿題に飢えていて、ヒマだからです。
'a' 'b' …… 'z' が数値で順番に並んでいるとは限らないので
(順番に並んでいない文字コードも実際に存在する) 、
完全な移植性を求めるならテーブルでやるしかない

ロケールを考えるともっと大変
>>259
>>(順番に並んでいない文字コードも実際に存在する) 、
マジッスカ?Σ(゚д゚lll)
EBCDIC
ASCIIコードだし
宿題
0〜9までの10個の整数を重複がないよう、
randを用いてランダムに配列a[10]へと格納し配列aの内容を表示せよ。

>>263
#include <iostream>
#include <algorithm>

int
main()
{
    int i;
    int a[ 10 ];

    for( i = 0; i < 10; i ++ )
        a[ i ] = i;

    std::random_shuffle( &a[ 0 ], &a[ 10 ] );

    for( i = 0; i < 10; i ++ )
        std::cout << a[ i ] << " ";

    return 0;
}
>>264
randつかってなーい
rand を用いていないので 0 点
>>265-266
ワロタ
#include <stdio.h>
#include <stdlib.h>
int main( void ) {
int a[]={0,1,2,3,4,5,6,7,8,9};
int i;
for ( i = 0; i < 50; i++ ) {
int x = rand() % 10;
int y = rand() % 10;
if ( x != y ) { int t = a[y]; a[y] = a[x]; a[x] = t; };
}
for ( i = 0; i < 10; i++ ) printf( "%d\n", a[i] );
return 0;
}
#include <iostream>
#include <algorithm>

int
main()
{
    int i;
    int a[ 10 ];

    std::fill( &a[ 0 ], &a[ 10 ], -1 );

    for( i = 0; i < 10; ++ i )
    {
        int idx;

        do
        {
            idx = rand() % 10;
        }
        while( a[ idx ] != -1 );

        a[ idx ] = i;
    }

    for( i = 0; i < 10; ++ i )
        std::cout << a[ i ] << " ";

    return 0;
}
>>268
もしだよ仮にありえないかもしれないけど
50回xとyに同じ値が入ったらどうすんの?
>>270

それも一つのランダムじゃないか
272263:04/08/17 03:12
>>264,268,269さま
ありがとうございました!
>>269
結果が出てくるまでの時間が一定じゃないんですけど・・・
>>273
リスト構造に0から9までの数字を入れておいて、
「先頭のノードをrand()%10番目に挿入」をn回繰り返せば
一定にならんかな?誰かコードヨロ。
バグがあったらスマソ(改行増えるのでfreeは省略)

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

#define NUMBER_COUNT 10
#define SHUFFLE_COUNT 50

struct lst {
  struct lst *next;
  int val;
};

int main(int argc, char **argv)
{
  struct lst *top, *cur;
  int i;

  for(i = 0; i < NUMBER_COUNT; i++){
    struct lst *lp = (struct lst *)malloc(sizeof(lst));
    lp->next = NULL;
    lp->val = i;
    if(i){
      cur->next = lp;
      cur = lp;
    }else{
      top = cur = lp;
    }
  }

  srand((unsigned int)time(NULL));

  for(i = 0; i < SHUFFLE_COUNT; i++){
    int r = rand() % NUMBER_COUNT;
    int j;
    for(j = 0, cur = top; j < r; j++, cur = cur->next) {}
    if(j){
      struct lst *tmp = top;
      top = top->next;
      tmp->next = cur->next;
      cur->next = tmp;
    }
  }

  for(cur = top; cur; cur = cur->next){
    printf("%d\n", cur->val);
  }

  return 0;
}
>>275-276
for(j = 0, cur = top; j < r; j++, cur = cur->next) {}

ここが一定時間にならない ... orz
>>268から
>for ( i = 0; i < 50; i++ ) {
>int x = rand() % 10;
>int y = rand() % 10;
>if ( x != y ) { int t = a[y]; a[y] = a[x]; a[x] = t; };
>}
を以下に変更する。
for ( i = 0; i < 10; i++) {
int x = rand() % 10;
if ( x != i ) { int t = a[i]; a[i] = a[x]; a[x] = t; }
}
こんなもんでいいんじゃない?
計算時間の大小が多少あるけれど。

#define TABLE_MIN 0
#define TABLE_MAX 9
#define TABLE_COUNT (TABLE_MAX - TABLE_MIN + 1)
int main(void)
{
int iIndex;
int iSet;
int iTable[TABLE_COUNT];
int a[TABLE_COUNT];

srand( (unsigned int)time( NULL ) );
for ( iIndex = 0; iIndex < TABLE_COUNT; iIndex++ ) iTable[iIndex] = iIndex + TABLE_MIN;
for ( iSet = 0; iSet < TABLE_COUNT; iSet++ ) {
iIndex = (int)((double)rand() / (double)(RAND_MAX + 1) * (double)(TABLE_COUNT - iSet));
a[iSet] = iTable[iIndex];
for ( ; iIndex + 1 < (TABLE_COUNT - iSet); iIndex++ ) iTable[iIndex] = iTable[iIndex + 1];
}
for ( iIndex = 0; iIndex < TABLE_COUNT; iIndex++ ) printf("a[%d] = %d\n", iIndex, a[iIndex]);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define NUM 10

int main()
{
    int iFlg[NUM], a[NUM], i, r;

    srand((unsigned)time(NULL));
    for(i = 0; i < NUM; i++) iFlg[i] = 0; /* 初期化 */
    for(i = 0; i < NUM; i++){
        for(; iFlg[r = rand() * NUM / (RAND_MAX+1)];); /* 空きを検索 */
        iFlg[r] = 1; /* フラグを立てる */
        a[i] = r;
    }
    for(i = 0; i < NUM; i++) printf("%d\n", a[i]);
    return 0;
}
281280:04/08/17 12:02
うわ、やり方変えたときの跡がある・・

for(; iFlg[r = rand() * NUM / (RAND_MAX+1)];);

while(iFlg[r = rand() * NUM / (RAND_MAX+1)]);
#include <stdio.h>
#include <stdlib.h>
#define N 10
main(){
  int a[N], i,j;
  for(i = 0; i < N; i++)
    a[i] = i;
  srand(time(NULL));
  for(i = 0; i < N; i++){
    j = rand() % N;
    if(i == j) continue;
    a[i] ^= a[j] ^= a[i] ^= a[j];
  }
  for(i = 0; i < N; i++)
    putchar('0' + a[i]);
  return 0;
}
a[i] ^= a[j] ^= a[i] ^= a[j];
なにやってるの?
って一応聞いてあげる。
>>283
読めないの?そのままじゃないか
285282:04/08/17 22:12
てかさ、普通に見やすくないこれ?
スワップのときは普通にいいと思うんだけど、世間じゃトリッキーコードとか抜かすやつ多い。
トリッキー云々以前に、
これは未定義だろうが、ぼけ!
って一応突っ込んであげる。
おまいら釣られすぎですよ
って一応注意してあげる。
マジ未定義?
じゃぁ、これでがまんするか。

a[i] ^= a[j]; a[j] ^= a[i]; a[i] ^= a[j];
もし、i == j (ry
if(i == j) continue;
が見えないのかと小一時間(ry
魚が釣りを覚えたのか?
入り乱れてて訳がわからなくなりそうだ。
って一応困ったふりをしてあげる。
一気に糞スレ化
a[i] = a[j] - a[i];
a[j] -= a[i];
a[i] += a[j];

んじゃこれ
>>294
宿題が提出されないから
「<a href="〜">〜</a>」という内容が含まれた文の〜部分を、
それぞれ変数に格納せよ。〜はURLとして妥当であり、関数は
sscanfを用いるものとする。
298デフォルトの名無しさん:04/08/17 23:50
age
sscanf だけでそのような高度なことが出来るのでしょうか
grep
>>297
できればCでつくってほしー
sscanf(start, "<a href=\"%[^\"]\">%[^<]</a>", url, linked);ではだめ?
ほんとうはこれでは不完全だけどガマンしろ

#include <stdio.h>
#define SIZE 1024
int main( void )
{
char buf[SIZE];
while ( fgets(buf, SIZE,stdin) != NULL ) {
char a[SIZE],b[SIZE];
sscanf( buf, "<a href=\"%[^\"]\">%[^<]</a>", a, b );
printf( "%s\n%s\n", a, b );
}
return 0;
}
2つのテキストファイルを読みこみ
両方に共通する文字列で最も長いものを出力する
プログラムを作成せよ

おながいします
>>304
引数にファイル2つ指定しる。
#include <iostream>
#include <fstream>
#include <string>
#include <set>
int main(int argc, char *argv[])
{
    std::ifstream f1(argv[1]), f2(argv[2]);
    std::set<std::string> v;
    int maxLen = 0;
    std::string s, maxStr;
    for (std::string s; f1 >> s, !f1.eof(); v.insert(s)) ;
    while (f2 >> s, !f2.eof()) {
        std::set<std::string>::const_iterator i = v.find(s);
        if (i != v.end()) {
            if (i->length() > maxLen) {
                maxLen = i->length();
                maxStr = *i;
            }
        }
    }
    std::cout << maxStr;
    return 0;
}
306304:04/08/18 01:04
>>305
すいません説明不足でした
2つのファイルは両方とも普通の (英文の) 文章が入っています
ですから、問題の趣旨としては、それぞれのファイルの全内容を比較して
一致する最も長い部分探せ、とのことのようです
再度よろしくですm(。_。 )m
diff みたいなのを作れってことでしょ?
>>306
文字単位でなく、単語単位での一致チェック。
#include <iostream>
#include <fstream>
#include <vector>
int main(int argc, char *argv[]) {
    std::ifstream f1(argv[1]), f2(argv[2]);
    std::vector<std::string> v1, v2;
    std::string s;
    while (!f1.fail()) { f1 >> s; v1.push_back(s); if (f1.eof()) break; }
    while (!f2.fail()) { f2 >> s; v2.push_back(s); if (f2.eof()) break; }
    std::vector<std::string>::const_iterator i1s = v1.end(), i1e = v1.end(), i2s, i2e, i;
    int len;
    for (i2s = v2.begin(); i2s != v2.end(); i2s++)
        for (i2e = i2s; i2e != v2.end(); i2e++)
            if ((i = search(v1.begin(), v1.end(), i2s, i2e + 1)) != v1.end())
                if ((len = i2e + 1 - i2s) > i1e - i1s) i1e = (i1s = i) + len;
    for (i = i1s; i != i1e; i++) std::cout << *i << " ";
    std::cout << std::endl;
    return 0;
}
309デフォルトの名無しさん:04/08/18 10:54
すみません。ちょっと解らない所があって・・・

http://www.tcp-ip.or.jp/~ikken/cpp/txt/o3.C.txt ・・・のサイトなんですが、
グローバルで動的にオブジェクト宣言している”CC”の配列の所なんですが、
コレ以降にあるCircleのメンバ関数を使う時に、なぜ’->’アロー演算子ではなく、
'.'ドット演算子なんでしょうか?
>>309
CC[0] = *(CC)
CC[2] = *(CC+2)

cc->set
(*cc).set
cc[0].set

上の3つは同じ意味
>>263
制作者は分かっているのだろうけど、>>268>>282 のような置換えの場合、
配列の要素数が奇数の時にランダム性に偏りが生じます。(証明略)
(今回は 要素数 = 10、つまり偶数なので問題ない。)
ソフトを改造して使用する場合は注意してください。
314309:04/08/18 12:33
310さん、311さん
ありがとうございました☆
理解できました!
315313:04/08/18 13:06
ごめん、嘘書いた。
入れ替えランダムの場合、要素数 = 3以上の場合ランダム性に偏りが生じる。
>>315
同一の元パターンに対する二要素間の入れ替え操作の繰り返しでは、奇数回入れ替えで生成
できるパターンと偶数回入れ替えで生成できるパターンに共通のものがないって言う話?
>>316
>>282 を例に取らせて頂きます。
要素数 n のうちの 2 要素を入れ替える作業を x 回行う場合、n の x 乗個の答えが生成されるワケですが、(同じ要素同士で入れ替えない場合も1回置換えと数える)
要素数 n の最終的な組み合わせは n! 個しかありません。
そして、n >= 3 の場合、n の x 乗 は n! で割り切れません。
今回の場合、10 の 10 乗 = 10000000000、10! = 3628800 となり
10000000000 / 3628800 = 2755.731922
となり、偏りが生じている事が解ります。
318313、317:04/08/18 15:02
なお、rand() 関数から 0 〜 9 の乱数を発生させる場合の偏りは今回考慮していません。

// ramd()関数自体の偏りを無くす演算
#define N 10

int i, r;
for (i = 0, r = 0; i < N; i++) r = (r + rand() * N / (RAND_MAX + 1) + i) % N;
>>317
で、それはどういう並びが多くなるの?
「要素数 n のうちの 2 要素を入れ替える作業を x 回行う」作業をn!回行う時は偏りがあるの?

あと、>>318は (rand() * N / (RAND_MAX + 1) ) == 0 だと思うんだけど。
関数y=sin*x(区間0<x<90℃,0<y<1)の原点から数えてyが20%と80%
(つまりy=0.2と0.8)のときのy=sin*xとの交点におけるxの値を
それぞれ求め、以下の式からaの値を求めるプログラムを作成せよ。

y=5x+4xy+2a  よろしくお願いします。



0<χ<90℃


・・・・・摂氏・・・
#include<stdio.h>だけ使って
getcharを用いて、ポインタを使って逆から表示せよ。
まったくわかりませぬ・・・。



>>320
#include<stdio.h>
#include<math.h>
#define PI 3.1415926535897932
int main(void){
double y[2];
double x,a;
int i;
y[0]=0.2;
y[1]=0.8;
for(i=0;i<2;i++){
x=asin(y[i])/PI*180;
a=0.5*(y[i]-5*x-4*x*y[i]);
printf("x=%.6f\ny=%.6f\na=%.6f\n",x,y[i],a);
}
}
たぶん仕様は満たしてるよ。
ところで
y=5x+4xy+2a
に何か数学的若しくは物理的な意味があるのか?
>>322
その問題の仕様が
まったくわかりませぬ・・・。

課題全文掲載汁話はそれからだ。
>>322
多分こんなかんじ?
#include <stdio.h>
int main(){
  char buf[512], *p;
  p = buf;
  fputs("input  > ", stdout);
  while('\n' != (*p++ = getchar()));
  fputs("result > ", stdout);
  for(p -= 2; p >= buf; p--) putchar(*p);
  return 0;
}
326325:04/08/18 23:58
バッファオーバフローしない様にしました。
#include <stdio.h>
int main(){
  char buf[512], *p;
  int i;
  p = buf;
  fputs("input  > ", stdout);
  for(i = 0; i < sizeof(buf); i++){
    *p = getchar();
    if(*p == '\n' || *p == '\0' || *p == EOF) break;
    p++;
  }
  fputs("result > ", stdout);
  for(--p; p >= buf; p--) putchar(*p);
  return 0;
}
>>325-236 はどうでもいいが、
>>323 の返事が気になる。
322と似たような問題よろしいでしょうか
大文字は小文字に、小文字は大文字に変換して出力せよ。
ただし、関数は2つ以上作成し、英文字以外はそのまま出力
また、標準ヘッダファイルのみで作成せよ。
>>328
上の例をちょっと改造することすら出来ないほど無能なのなら今後の身の振り方を考えた方がよい
>>319
>282 方式三要素の場合:
パターン分布
取りうるパターンは a)123 b)132 c)213 d)231 e)312 f)321 これを用いて初期状態を行列で表すと
(1 0 0 0 0 0) …A

入れ替え操作は
一回目 [0]<->[0] [0]<->[1] [0]<->[2]
二回目 [1]<->[0] [1]<->[1] [1]<->[2]
三回目 [2]<->[0] [2]<->[1] [2]<->[2]
よって全パターン間の置換確率行列は (手計算が間違ってなければ)
     /4 5 5 5 4 4\
     | 5 4 4 4 5 5 |
3^-3* | 5 5 4 5 4 4 | …B
     | 4 4 5 4 5 5 |
     | 5 5 4 4 4 5 |
     \4 4 5 5 5 4/
分布は A*B=(4 5 5 5 4 4)/27 (行列の各要素がそれぞれ a〜f の場合に対応)

3要素では奇数回置換しているので、奇数回置換で生成できるパターンになる可能性が、偶数回
置換で生成できるパターンになる可能性より少しだけ大きい
>268 方式三要素の場合:
1.パターン分布
取りうるパターンは a)123 b)132 c)213 d)231 e)312 f)321 これを用いて初期状態を行列で表すと
(1 0 0 0 0 0) …A
入れ替え操作は
[0]<->[0]:1 [0]<->[1]:2 [0]<->[2]:2 [1]<->[1]:1 [1]<->[2]:2 [2]<->[2]:1
よって全パターン間の置換確率行列は
    /3 2 2 0 0 2\
    | 2 3 0 2 2 0 |
9^-1* | 2 0 3 2 2 0 | …B
    | 0 2 2 3 0 2 |
    | 0 2 2 0 3 2 |
    \2 0 0 2 2 3/
n回置換での分布は A * B^n。
n=1: 9^-1* (3 2 2 0 0 2)
n=2: 9^-2* (21 12 12 12 12 12)
n=3: 9^-4* (1161 1080 1080 1080 1080 1080)
2.各要素の追跡
前述の入れ替え操作より、それぞれの桁の置換確率行列は (以下行列の括弧省略)
     5 2 2
9^-1* 2 5 2    …C
     2 2 5
よって、例えば a[0] の要素の n 置換後の分布は (1 0 0) * C^n
C^2:          C^4:
    33 24 24       2241 2160 2160
9^-2* 24 33 24   9^-4* 2160 2241 2160 ……
    24 24 33       2160 2160 2241
各要素は元の位置にいる確率が少し高い。置換対象をランダムに選ぶ限り、
偏りは残り続けると予想。
# 置換回数と対象をうまく制限すれば、例えば >282 で j=i+(rand()%(N-i));
# などとすれば置換が原因の偏りを無くすことができる場合もある
>>319
> で、それはどういう並びが多くなるの?

不定です。並び替えの回数によって変化します。
並び替えの回数が少ないほど偏りが大きくなり、並び替えの回数が多いほど偏りが小さくなります。

> 「要素数 n のうちの 2 要素を入れ替える作業を x 回行う」作業をn!回行う時は偏りがあるの?

それは答えの数(パターン)が n の n! 乗になり、結局のところ n >= 3 の場合 n! で割り切れません。

> あと、>>318は (rand() * N / (RAND_MAX + 1) ) == 0 だと思うんだけど。

rand()関数は 0 〜 RAND_MAX までの値を返します。例えば rand() を RAND_MAX に置換えると
(RAND_MAX * N / (RAND_MAX + 1) ) となり N - 1 という値が返ります。(N > 0)
なお、>>318 の式は「// ramd()関数自体の偏りを無くす演算」と書いてありますが、
偏りが小さくなるだけでなくなりはしませんでした。
334322:04/08/19 22:02
すみません。
322です。
325さんのソースで大体は理解できたんですが
fputsを使わない場合だとどうなるのでしょうか?
-32768〜32767の数値を
入力し、10進文字列に変換し出力するプログラムを作成せよ。
ただし、文字列に変換する部分は関数とすること。
以下のようにして関数部分を作成。

#include<stdio.h>
void inttod(int dec,char*str);
main(){
int num;
char str[7];

printf("input:");
scanf("%d,&num");

inttod(num,str);

printf("resulr:%s\n",str);
}
とりあえず、scanfから勉強してこい
337335:04/08/19 23:03
あぁすみません
scanf("%d",&num);
でした。
申し訳ありません。
void inttod(int dec,char*str)
{
    int i, n;
    if(dec < 0){
        dec = -dec;
        *str++ = '-';
    }

    for(i = 1, n = 10; dec >= n; i++, n *= 10);
    for(n /= 10; i; i--, n /= 10) *str++ = dec / n % 10 + '0';
    *str = '\0';
    return;
}
void inttod(int dec,char*str){
    sprintf(str, "%d", dec);
    return;
}
xy座標にある関数でない集合の二点A、Bを結んだ直線とy=5との交点を求めよ。
点A=(任意,y<5)、B=(任意,y>5)とする。
↑そんなもの数学の範疇だろう
1の二乗+2の二乗+3の二乗+……+nの二乗が2000を超えるときのnの値と、そのときの合計を求めるプログラムを作りなさい。
while文を使う事。
@ 1の二乗、2の二乗、……、nの二乗を計算するための変数と、合計を格納する変数を宣言する。
A 合計が2000以下の間、nの値を1ずつ増やしながらnの二乗を合計に加え、合計が200を超えたら、繰り返しを終了し、そのときの合計とnの値を出力する。

よろしくお願いします
>>342
#include<stdio.h>
int main(){
int n = 1, sum = 0;
while(sum <= 2000){
sum += n * n;
n++;
}
printf("n=%d 合計=%d\n", n-1, sum);
return 0;
}
344デフォルトの名無しさん:04/08/20 12:35
>>342
#include <stdio.h>
#define power_n(n) ((n)*(n))
main()
{
int sum = 0, n = 0;
while (sum <= 2000 && ++n) sum += power_n(n);
printf("sum = %d\nn = %d\n", sum, n);
}

sum=2109, n=18
346342:04/08/20 12:58
>>343
有難うございます。
でも、実行したらnが18になってしまいました。18の二乗は324なんですけど、表示結果は2109となっています。
2000を超えるnの値は45にならないと駄目だと思いますが、訂正してもらえますか?
>>346
釣りですか?
348342:04/08/20 13:03
すみません。勘違いしてました。どうも有難うございました。
javaのコンパイラをC言語できぼんぬ
>>349
system()
宿題マダー?
四則演算が可能で強い意味で例外安全、例外中立な多倍長演算クラスを作成しなさい
お願いしますm(__)m
>>352
強い意味で例外安全を定義しる。
・例外が起こってもリソースをリークしない。
・例外によって終了してもプログラムの状態が変更されていない。
355天才プログラマ:04/08/21 01:01
もう寝るけどいいか?
>>355
いい。永眠するとなおよい。
>>354
二つ目が分からん。
358デフォルトの名無しさん:04/08/21 01:42
>>355
落ちろっ!夢のない眠りへ…
二番目は
「例外が発生して制御が呼び出し元に移ったときに、例外を
投げた側の内部状態が呼び出し前と変更されていない。」
といった方が分かりやすくないか?
>>352
実装としては
・掛け算はO(N^2)
・割り算は 0 割のみ例外発生
・割り算はニュートン法にて収束させる
・出力と中間計算の領域確保失敗時に例外発生

このくらいだったら楽じゃない?
内部状態維持ってことは、計算のたびにスナップショットを取っとくの?
個人的にはスナップ、ロールバックと、演算は切り離したいな。
>>361
普通は状態をわざわざ保存してまで強い例外安全を保障しないと思う。
たとえば>>352の例のoperator+=なら、

・最初に例外を投げそうな処理(メモリ確保とか)を行う。
   ここで失敗したら何もしないで例外を外に伝える(例外中立)。
・実際の計算(ここでは例外を投げる可能性があるとする。ない場合はもっと単純)
・例外を投げない処理(代入、delete)のみを使って内部状態を変更(ポインタのswapが非常に有効)

こんな感じかと。
363デフォルトの名無しさん:04/08/21 16:16
352の爆弾仕様によりいまだれもてをつけず…
364デフォルトの名無しさん:04/08/21 17:32
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1093076686&res=1

今、とあるサイトでC++を勉強しているのですが、このクラスのメンバ関数addの部分の
elseより下の部分がわかりません。具体的に言うと、lt1やlt2などに何が入って、どのようにして追加されているのかが全然わかりません。
どのようにして動く?のかは理解できたのですが・・・。lt1=lt2やlt2=lt2->nextなどの代入がわかりません。
詳しくご説明をお願いします。
>>364
いやいや、あんたスレ違いだって…ここ宿題スレだしw
宿題で例外安全とはこれ如何にw
367デフォルトの名無しさん:04/08/21 18:02
やっぱりダメでしょうか?
>>364
デジャヴかな。つい最近そのソース見て「こいつCの癖が抜けてないな」と思った記憶が……
369シュトラッ仙:04/08/21 18:21
>>364

output 関数のprintf("")を
printf("[%p] [%p] data...%s \n", nt, nt->next, nt->st);
と 書き換えて

リストの保有するデータや List *型の nt , lt1, lt2
がどういう値かを確認してみるのが良いよ
370デフォルトの名無しさん:04/08/21 18:28
確認してみますね。ありがとうございました。
371デフォルトの名無しさん:04/08/22 15:39
宿題まだぁ〜あげ。
3721/3:04/08/23 15:24
こんにちは。
今回出題された課題は php の課題なのですが、アルゴリズムが分かれば私はそれで満足ですので
読みやすく慣れ親しんだ C での作成をお願いできればとこのスレに書き込みをさせて頂きました。
さて、課題の方なのですが以下の通りです。

----------------------------------------------------------------

高等数学の定理によって、円周率πは、次のような数列の無限和で求められることが知られています。
π = 4 * ( 1 - 1/3 + 1/5 - 1/7 + 1/9 - ... 無限に続く)

上の式には、第5項までの和しか明記されていないが、数列の第10000項までの和を計算するプログラムを作成せよ。

----------------------------------------------------------------

php を読める方がいらっしゃるかどうかは分かりませんが、私は以下のようにプログミングしました。
3732/3:04/08/23 15:25
// 円周率πの数列の第 num 項まで和を計算

$num = 50;// 項の数
$pi = 0;

echo "円周率πの".$num."項までの和を計算しますね★<br /><br />";

$pi += (1 - 1 / 3 );
$flg = TRUE;

for($i = 3; $i < $num * 2 + 3; $i += 2) {
if($flg) {
$pi += 1 / ($i + 2);
$flg = FALSE;
} else {
$pi -= 1 / ($i + 2);
$flg = TRUE;
}
}

$pi *= 4;

echo $num."項までの和は".$pi."ですょん★";
3743/3:04/08/23 15:27
これでいけると思ったんですがどうもうまくいきません(つ_<
先輩方のお知恵を拝借させて頂ければ幸いでございます。
どうか宜しくお願い致します。
>>374
int num = 50;
double pi = 0;

for(int i = 1; i < num; i += 2) {
pi += 1 / i;
pi -= 1 / (i+1);
}

pi *= 4;
俺ならこう書く。
376デフォルトの名無しさん:04/08/23 16:44
実行結果が 0 なのですが・・・。
オワッテルナ
#include <stdio.h>
#include <math.h>

int main(void)
{
int num = 100000;
int index = 0;
double pi = 0.0;

while (index < num) {
pi += 4.0 * pow(-1.0, (double)index) / (double)(index * 2 + 1);
index++;
}
printf("pi = %f\n", pi);

return 0;
}
>>378
動きましたありがとうございます。
php にも pow 関数はあるみたいなので課題をクリアできそうです。
どうも助かりましたです。
>>379
元のやつをいかして作ってみた。まだ見てるのかな?
符号の計算程度にpowとか使うと遅くなるよ。

// 円周率πの数列の第 num 項まで和を計算
$num = 50; // 項数
$pi = 0;
echo "円周率πの".$num."項までの和を計算しますね★<br /><br />";
$flg = 4;
$num = $num * 2; // 項数を何度も計算させない
for($i = 1; $i < $num; $i += 2) {
$pi += $flg / $i;
$flg = -$flg;
}
$num /= 2; // 項数を表示用に戻す
echo $num."項までの和は".$pi."ですょん★";
381379:04/08/23 21:25
>>380
とても勉強になりました。
自分で頭を悩ませて考えてたものをベースに改良して頂いて大変嬉しく思います。
私の元のプログラムよりかなりすっきりしててキレイですね。
しかも php で書いて下さって感激しております。
本当にどうもありがとうございました。
printfで0.0000000012とかを扱う時は

printf("■",)の
■四角の部分は何を書けばよいのですか?
0.0000000012
そこまで精度保証できん
>>384
精度って…有効桁たった2桁だぞw
>>382
%g
って、どう出力したいかによる。0.0000000012と表示したいなら
%.10f
386ぽろじょあ ◆niBmDfC40k :04/08/23 23:08
( .3.) ヌェー マルェー
387ぽろじょあ ◆niBmDfC40k :04/08/23 23:11
( .3.) ヌェー マルェー
388ぽろじょあ ◆niBmDfC40k :04/08/23 23:13
( .3.) マルェー なんでようかんマンは居なくなったんだYO?
宿題:開発が終了するOpenJaneをC++/Win32APIに移植し、メンテナンスせよ。
>>389
メンテナンスせよ。ってところはやってやるから、前半よろしく。
OpenJaneって、Cだったの?
392デフォルトの名無しさん:04/08/24 00:51
C言語に関する雑談ならこちら

ラウンジでC言語
http://etc3.2ch.net/test/read.cgi/entrance/1093006298/l50
393デフォルトの名無しさん:04/08/24 02:41
宿題です。
「VBで作ったTest.dllのTest(String型)という関数を、
VCからChar型の引数2つを渡して呼び出すプログラムを作りなさい。」
というものです。
どうかお力をお借しください。
・何で引数の個数が変わるのか
・VCから?VC限定?
WinAPI質問箱とかあったような気がするよ
395393:04/08/24 17:35
すいません。
質問の仕方が悪かったです。
VB側の関数Testも引き数は2つです。
引き数の数は変わりません。
Testという関数そのものの型を(String型)と書いたつもりでした。
すみません。
strResult=Test(strA,strB)と書くべきでした。
ちなみにDLLの上記関数を呼び出すのはVCです。
VBの方の関数を、VC側でクラスとして定義したいのですが、やり方がわからないのです。
ご教授お願い致します
>>393
この辺が参考にならないかな?
http://homepage2.nifty.com/DSS/VCPP/DLL/dllindex.htm
397デフォルトの名無しさん:04/08/24 18:10
visual c++ 6.0使用です。

淡色表示にしたメニューの、淡色表示を解除させるにはどうしたらよいのでしょうか?
よろしくお願いします。
以下の問題をお願いします。

「次の記述内容を満足するプログラムをJavaで作成せよ。
10名(A,B,C,D,E,F,G,H,I,J)の成績(0点から100点まで)をコマンド入力の際の
引数として与える。このとき、引数の順番とA,B,C,D,E,F,G,H,I,Jとを対応つける。
平均点を出力した後、A,B,C,D,E,F,G,H,I,Jの順番に表示し、平均点以上○印、
平均点以下は△印、最高点は◎印、最低点は×印で表示せよ。」

実行結果例としては
例)
平均点:70点
A 75点:○
B 65点:△
C 55点:△
D 95点:◎
E 40点:×
 … …

のような表示です。よろしくお願いします 。
399397:04/08/24 18:41
追加です。
淡色表示にしてあるものは、ポップアップ設定をしてあるのでIDはありません。
>>398
javaは確か専用スレがあるからそこで訊くといい。
401398:04/08/24 18:46
>>400
わかりました。誘導ありがとうございます!
402 ◆Z0vd5w812U :04/08/24 18:59
>>397
GetMenuItemInfo()/SetMenuItemInfo()で制御。
>>397
多分こっちの方が向いてると思う。

Win32API質問箱 Build22
http://pc5.2ch.net/test/read.cgi/tech/1092524669/
404398:04/08/24 19:38
以下の問題をお願いします。

「以下のC++で書かれたプログラムは複素数を表すクラス
complexを作成して複素数の加算(+)、減算(-)、乗算(*)、除
算(/)および代入演算(=)を行っている。プログラム中(1)〜
(5)を記述してプログラムを完成させ、さらに出力結果を求
めよ。ここで、クラスcomplexでは複素数zを極形式z=r(cosθ
+isinθ)(rは絶対値(大きさ)、θは偏角)で表している。クラス
complexのメンバ変数rは複素数の絶対値(大きさ)を表し、th
etaは複素数の偏角(argument)を表す。偏角の単位はラジア
ンである。演算子+,-,*,/,=がクラスcomplexに対してオーバー
ロードされている。必要であれば以下の数学関数を使用せよ。

double aten2(double y, double x):
y/xのアークタンジェント(逆正接)を返す。

double sin(double arg):
引数arg(単位:ラジアン)のサイン(正弦)を返す。

double cos(double arg):
引数arg(単位:ラジアン)のコサイン(余弦)を返す。

double sqrt(double num):
引数numの平方根を返す。引数は負になってはならない。

また、計算の過程で現われる複素数の実部、虚部ともに0に
なることはないとしてプログラムを作成してもよい。


スミマセンがよろしくお願いします。
405398:04/08/24 19:40
以下プログラム

#include <iostream>
#include <cmath>
using namespace std;
class complex {
double r, theta; // r: absolute value,
//theta : argument
public:
complex() { r = 0.0; theta = 0.0; }
complex(double rr, double tt)
{ r = rr; theta = tt; }
void get_r_theta(double &rr, double &tt)
{ rr = r; tt = theta; }
complex operator+(complex ob2);
complex operator-(complex ob2);
complex operator*(complex ob2);
complex operator/(complex ob2);
complex operator=(complex ob2);
};
406398:04/08/24 19:40
complex complex::operator+(complex ob2)
{
complex temp;
(1)
return temp;
}
complex complex::operator-(complex ob2)
{
complex temp;
(2)
return temp;
}
complex complex::operator*(complex ob2)
{
complex temp;
(3)
return temp;
}
complex complex::operator/(complex ob2)
{
complex temp;
(4)
return temp;
}
complex complex::operator=(complex ob2)
{
(5)
return *this;
}
407398:04/08/24 19:41
int main()
{
complex c1(1.0, 3.1416*0.33),
c2(2.0, 3.1416*0.2), c3;
double rr, tt;
c3 = c1 + c2;
c3.get_r_theta(rr, tt);
cout << "(c1+c2) r: " << rr
<< ", theta: " << tt << endl;
c3 = c1 - c2;
c3.get_r_theta(rr, tt);
cout << "(c1-c2) r: " << rr
<< ", theta: " << tt << endl;
c3 = c1 * c2;
c3.get_r_theta(rr, tt);
cout << "(c1*c2) r: " << rr
<< ", theta: " << tt << endl;
c3 = c1 / c2;
c3.get_r_theta(rr, tt);
cout << "(c1/c2) r: " << rr
<< ", theta: " << tt << endl;
c3 = c2;
c3.get_r_theta(rr, tt);
cout << "(c3=c2) r: " << rr
<< ", theta: " << tt << endl;
}
なにこの complex クラス
すんごい糞なんだけど
409デフォルトの名無しさん:04/08/24 19:47
すごい初心者な質問なんですがC++で
const char *str = "***class***";
int length = strlen(str);
char(length);

これの最後の行はどういう意味なんでしょうか?
charのコンストラクタに引数を渡してるのでしょうか
うざい
中間記法を逆ポーランド記法に変換、またその逆を行なうプログラムを作れ。
>>411
俺に命令するな!!
解答例

#include <stdio.h>
int main()
{
  puts("俺に命令するな!");
  return 0;
}
//(1)
double tr, tt, re, im;
ob2.get_r_theta(tr, tt);
re = r * cos(theta) + tr * cos(tt);
im = r * sin(theta) + tr * sin(tt);
temp = complex(sqrt(re * re + im * im), atan2(im, re));
//(2)
double rr, tt, re, im;
ob2.get_r_theta(rr, tt);
re = r * cos(theta) - rr * cos(tt);
im = r * sin(theta) - rr * sin(tt);
temp = complex(sqrt(re * re + im * im), atan2(im, re));
//(3)
double rr, tt;
ob2.get_r_theta(rr, tt);
temp = complex(r * rr, theta + tt);
//(4)
double rr, tt;
ob2.get_r_theta(rr, tt);
temp = complex(r / rr, theta - tt);
//(5)
double rr, tt;
ob2.get_r_theta(rr, tt);
r = rr; theta = tt;
415デフォルトの名無しさん:04/08/24 20:03
俺が最強だああああああああああああああああああああ
#include <stdio.h>

int main(void)
{
  puts("俺が最強だ");
  while(1) puts("あ");
  return 0;
}
417デフォルトの名無しさん:04/08/24 20:17
そんな暇な事してるんなら質問に答えてくれ
418398:04/08/24 20:21
>>414
ありがとうございました!!
>>411
ただ単に、コンソールに出力するだけで良いの?計算はしないのか?
だったら簡単。入力をトークンに切り分けて、次の再帰下降パーサに突っ込めばよい。
逆もまた同じ。逆ポ用のパーサに流し込んでやればよい。

Program → { Expression ";" }
Expression → Term { ("+" | "-") Term output_action() }
Term → num_literal { ("*" | "/" | "%") num_literal output_action() }
420411:04/08/24 21:41
問題文そのまま載せただけなんだがorz
逆ポーランドの計算はスタック使うだけでできたけど、
1+2*3 ==> 1 2 3 * + の変換は二分木使うらしく、さっぱりなんですが
421398:04/08/24 22:08
>>414
すみません、図々しいですが出力結果もお願いできますか?
422デフォルトの名無しさん:04/08/24 22:19
すいません。また基本的な質問なんですがクラス定義内のメンバ関数定義で

public:
virtual viod read( unsigned a,char& b) = 0;

この=0はどういう意味に解釈したら良いんでしょうか?
readは浮気しないって事
424デフォルトの名無しさん:04/08/24 22:27
すいません。
public:
virtual void read( unsigned a,char& b) = 0;
でした
>>398
標準の<complex>使え
>>424
純粋仮想関数と言う。
そのクラスでは実装しないが、そのクラスを派生したクラスではもれなく実装するようにという通達。
427424:04/08/24 23:31
ありがとうございます。つか勉強不足ですね(;´Д`)
C++ってどれだけ勉強すればいいのか。。。。。
コード読むこともままならない。。。
良書と言われてるものを一通り読むようになればある程度かな
http://www.1point.jp/~book_2ch/program/cpp.html
ここで色々探して読んでみな
429424:04/08/24 23:44
どもです。どうもすこし本読んで、だましだましやってくっていうのは
結構難しいですね。。1冊でも完読してみます。今手もとにあるのは英語の訳本
なので日本語が変で読みにくいんですよね。お金ないから買いしぶってたけど
もっといい本さがしてみます。
ありがとうございました
>>411
中間記法→逆ポーランド記法
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1064150088&res=205&fi=no

仕様
・各項は1文字まで(12+3 などはダメ)
・↑をオーバーした場合、1文字目しか表示しない
・仕様可能な演算子は四則演算子のみ
・()は非対応

注意事項
・Cとしてコンパイルすること
・VisualC++以外で動かなくても知らない
・正しくない式を入れた場合の動作は保証しない
・正しい式を入れた場合でもバグがあるかもしれない
・もっとレベルの高い人の答えを待った方が良いかもしれない
x+5y=9においてy=1の時x=4である。
x=4を新たなyの値とするとxの新たな値は-11である。
x=-11を新たなyの値とするとxの新たな値は60である。
x=60を新たなyの値とするとxの新たな値は-291である。

以下この操作を繰り返し、n番目のxの値を求めよ。
>425
それじゃ宿題にならんだろw
#include <stdio.h>
int main(){
  int n = 10;
  int i,x, y=1;
  for(i=1;i<=n;i++){
    x = 9 - 5*y;
    printf("%3d番目 x=%d\n",i,x);
    y = x;
  }
  return 0;
}
入力した数値データーの種類を、変数スコープを利用してカウントUPしなさい。
1、main関数
入力された数値データをもとに、偶数・奇数の判定をし、ユーザー関数sub1(奇数の場合)、sub2(偶数の場合)
を呼び出す。

2、sub1関数
性的変数で呼び出し回数をカウントupし、戻り値として返す。int sub1(void)

3、sub2関数
性的変数で呼び出し、回数をカウントupし、戻り値として返す。int sub2(void)

--------------------------
数値入力==>5
数値入力==>2
数値入力==>10
数値入力==>3
数値入力==>8
数値入力==>-1

sub1:2回(奇数)
sub2:3回(偶数)
---------------------------

えっと・・・・t:b亜lkhがkjdhkdsjんgばえl、mrんdhl
おながいします。
×性的
○静的

あ〜恥かしいですw
>>434
#include <iostream>
int sub1() {
  static int count;
  return count++;
}

int sub2() {
  static int count;
  return count++;
}

int main() {
  int n;
  for (;;) {
    cin >> n;
    if (n < 0)
      break;
    if (n & 1)
      sub1();
    else
      sub2();
  }
  std::cout << "sub1:" << sub1() << "(奇数)" << '\n';
  std::cout << "sub2:" << sub2() << "(偶数)" << std::endl;
  return 0;
}
437398:04/08/25 11:49
>>425
すみません。しかし、プログラムの内容がほとんど分からないので
出力結果を教えて頂けませんか?お願いします。
438デフォルトの名無しさん:04/08/25 12:10
 
    
>>436
カウンタ値を読むの時にカウントアップしてちゃなあ
>>436
おいおい。(^^;
C言語初心者ですが、javaのeclipseみたいなc言語用の開発ツールは
どういうものがあり、一番使いやすいものはどれになりますでしょうか?

freeソフトでも有料ソフトでもよいので教えてください。よろしくお願いします
eclipse
>>441
【初心者歓迎】C/C++室 Ver.8【環境依存OK】
http://pc5.2ch.net/test/read.cgi/tech/1091264964/588
Borlandのフリーのコンパイラ使っているのですが現在、
適当な整数型変数(例で36789)に代入して、金種計算をして下のように出力する

\36789

\10000 3
\5000 1
\1000 1



\1 4
というプログラムを作成しているのですが途中からわからなくなってしまいました。


#include<stdio.h>
void main(void)
{
int a=36789;
printf("\\%d\n\n",a);
printf("\\10000 %1d\n",a/10000);

この次からどのように入力すれば良いのかわからないですが
どうすればよいのでしょうか?


>>444
自分の将来を考えた方がいい
>>444
printf("\\10000 %1d\n",a/10000);
a %= 10000;
printf("\\5000 %1d\n",a/5000);
a %= 5000;
>>446
ありがとうございました。m(_ _)m
なんとかできました。
main(){
 何かの処理その1
 printf("AAAAA");←1番目は最初からある
 printf("BBBBB");←2番目はここに追加
 printf("CCCCC");←3番目はここに追加
 printf("DDDDD");←4番目はここに追加
 何かの処理その2
}

二番目以降n番目までのprintf〜を追加し、ソースを作成するプログラムを
作るにはどうすればいいのですか?
>>444
答え書いてもらってるのに「なんとかできた」って…

>>448
もっと具体的に
const char n = 10;
char i;
printf( "main(){\n" );
printf( "\t何かの処理その1\n" );
printf( "\tprintf(\"AAAAA\");\n" );
for ( i = 1; i < n; i++ )
printf( "\tprintf(\"%c%c%c%c%c\");\n", 'A' + i, 'A' + i, 'A' + i, 'A' + i, 'A' + i );
printf( "\t何かの処理その2\n" );
printf( "}\n" );
>>448
マルチすんなどあほ
452デフォルトの名無しさん:04/08/26 16:57
簡単なチャットプログラムを作る課題なのですが
・OSはサーバ側はLinuxでクライアント側はWindows
・kterm(DOS)で文字列のやり取りをする
・通信は非同期式
・サーバ側のプログラムはあるのでクライアント側のプログラムを作らねばならない

http://www.ops.dti.ne.jp/~allergy/socket/socket.html#event
を参考にしてサーバから受信はできるようになったのですが、
標準入力で読み込んでサーバ側に送信するところの記述が分かりません
分からない部分のソースは>>453です
453452:04/08/26 17:00
WSAEventSelect(sd, hEvent, FD_READ|FD_CLOSE|FD_WRITE);//多分FD_WRITEを追加

// ソケットへの接続が終了した
if (events.lNetworkEvents & FD_CLOSE)
{
printf( "Sever connection closed\n" );
closesocket(sd);// 通信が終わったらソケットを閉じる
WSACleanup();
WSACloseEvent(hEvent);// イベントクローズ
return 0;
}
// ソケットの受信バッファにデータがある
if (events.lNetworkEvents & FD_READ)
{
recvSize = recv(sd, buf, sizeof(buf), 0);
printf("Received %d bytes\n",recvSize);
printf( "Form Server->%s\n", buf );
}
// ソケットの送信バッファに空きができた
if (events.lNetworkEvents & FD_WRITE)// そもそもここのif文も違うかもしれません
{
//ここが分かりません
}
>>451
マルチって何?To Heart?
>>452
bufに送りたいデータをフォーマット揃えて、send関数とか使って飛ばすんじゃないの?
457452:04/08/27 16:38
>>456
sendで送れば良いと思うんですが、プロンプトからの入力の取り込み方が分からないのです。
fegts()やgets()ではうまくいきませんでした。
458デフォルトの名無しさん:04/08/27 19:51
解答をお願いします。

正整数を1節点に1桁の数を持つ整数リストintlist(ただし逆順)によって表現することにする。(リストの先頭には頭の節点、終端は0で表す)。
型は
typedef struct node{ int element;struct node* next;}* intlist
で表す。例えば、1024と言う数を与えられたとき、
→□□→□(4)□→□(2)□→□(0)□→□(1)□(0)
head   (四角の中には後ろの()の中の値が入ります)
ここで、正整数xを与えられたとき、それを表現した整数リストを返す関数createを書け。
ただし、節点を作るときはmallocを使う。

と言う問題をお願いします。
459458:04/08/27 19:57
一応ソースは書いたんですが、コンパイルできる環境ではないためにいいのか悪いのか分かりません。
見てもらえますか。

intlist create(int x)
{
intlist head,rear,front;
head = (intlist)malloc(sizeof(struct node));
head->next=0;
rear = head;
while( x != 0 )
{
rear->next = (intlist)malloc(sizeof(struct node));
front = rear->next;
front->element = x % 10;
front->next = 0;
x /= 10;
rear = rear->next;
}
return head;
}
>458
コンパイルできる環境を用意してから出直してこい。
それと重要なことだが、リストではheadに対応する語はrearではなくtailだボケ。
461シュトラッ仙:04/08/27 20:37
>>458

質問の回答用ソースを貼るスレ の レス番「207」
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1064150088&res=207
462デフォルトの名無しさん:04/08/27 20:44
perlのプログラム処理を質問したいのですが、どこかにスレッドは
ないでしょうか。
>>462
ラーメン屋でラーメン屋の場所を聞くような事すんなや

Perlについての質問箱 11箱目
ttp://pc5.2ch.net/test/read.cgi/tech/1090889189/l50

Perl言語に詳しい人に質問!
http://pc5.2ch.net/test/read.cgi/tech/1037383722/l50
464デフォルトの名無しさん:04/08/27 20:59
ありがとうございます。さっそく質問してみます。
465458:04/08/27 21:04
>>461
ありがとうございました。理解できました。

>>460
分かりにくかったとは思いますが、末尾って意味でrearを使ったわけではないです。
466デフォルトの名無しさん:04/08/28 00:28
二次元配列を動的にnewしたいんですけど、どうしたらいいでふか

int** a;
a = new int[3][4]; //javaならこんな感じでいけたとおもうんでふけど
  int **a = (int**)new int[3 * 4];
468466:04/08/28 01:03
>>467
返信ありがとうございます。

int** a;
a = (int**)new int[3*4];
これでも、とおりますかね?
コンパイルは通るんですけど、何か実行時エラーがでちゃうんですけど?
// int i, m. n, **array;
array = (int **)new int*[m];
array[0] = new int[m * n];
for(i = 1; i < m; i++) array[i] = array[0] + i * n;
// 処理
delete[] array[0];
delete[] array;



int *とintのサイズが同じならこれもありかな。
// int i, m, n, **array;
array = (int **)new int[m + m * n];
for(i = 0; i < m; i++) array[i] = (int *)array + m + n * i;
// 処理
delete[] array;

C++詳しくないので間違ってたらスマソ
>>466-469
まとめてどっか行ってくださいな
ん・・・?ああ。そうか。




勝手に「二次元配列を動的に確保しなさい」とか、そんな宿題とか解釈してた。
鬱だ・・・
>C++詳しくないので間違ってたらスマソ
これが2ch
なんだか宿題以外を持ってきたり、
javaとか激しくすれ違いなこと聞いてたり、
おまけにperlの宿題スレを教えてくれだ?
まとめて視界から消えろ
474デフォルトの名無しさん:04/08/28 02:07
                  ∧        ∧  イライライライラ
                    / ヽ        / ヽ   イライライライラ
                /   ヽ___/   ヽ    イライライライラ
              / ノ(               \
              |  ⌒   ●   /\   ●  |  / ̄ ̄ ̄ ̄ ̄ ̄
         へ    |           /  \     |< 宿題まだー?
       / \\  \        / ̄ ̄ ̄\  /  \______
     /   /\\  .>             ヽ
カンカンカン//  \\/ i i      _      |
 カンカンカン      i | ‖|    / ̄   ヽ    / __
   カンカンカン Σ [ ̄ ̄ ̄ ̄ ̄ヽ        / ̄  /|
   \ ̄ ̄ ̄ ̄ ̄ ̄ ̄/ ̄ ̄ヽ_____ /   /  |
     \回回回回回/                /   |
>>466
C++相談室 part34
http://pc5.2ch.net/test/read.cgi/tech/1092018643/
こっちが最適。
【初心者歓迎】C/C++室 Ver.8【環境依存OK】
http://pc5.2ch.net/test/read.cgi/tech/1091264964/

こっちの方が。
初心者歓迎だし、C++ 関係ないし。
「newしたい」と>>466が言っている以上、C++限定であると思うのだが。
>>452
readは?


                            あったっけ?
479=>>475,477:04/08/28 05:11
>>466
int a[2][3];と書く場合、メモリ上は次のようなレイアウトになっている。
[00][01][02][10][11][12]
この時a+i(0<=i<=3)はint(*)[3]型になっている。そこで、例えばa+1とすると、
コンパイラはsizeof(int[3])だけポインタを進めねばならないことを「知っている」。
よって、[00][01][02][10][11][12]
             ↑a
となる。では、int** a = (int**)new int[2][3];とした場合a[1][1]はどうなるか。
a[1]はa+1と解釈される。問題は+1することによってポインタはどのように進め
られるか。new int[2 * 3];の返す型はint*であるが、ここではint**にキャスト
されているので、今はこうなっている。⇒[0][1][2][3][4][5]
a[1](≒a+1)によってaがsizeof(int*)だけ進められる。これは規格に則った
正常な解釈である。本当はsizeof(int(*)[3])だけ進んでほしいのだが、それは
無茶な話だ。a[1][1]はどうなるかというと、[0]からsizeof(int*)進んだところに
ある値(なんだか予想も付かないが)をポインタ値として解釈した場所(これも
どこだか分からないが)からsizeof(int)だけ進んだ場所の値だ。なぜならa[1][1]
≒*(*(a+1)+1)であるからだ。いったいここはどこだろう?世界の果てだろうか?
こう見てきたように、int** a = (int**)new int[2][3];と書いてもa[1][1]のような
使い方はできない。
「それでも」と、あなたは言うかもしれない。「a[1][1]と書いてもよいようにnewを
使いたい!」では、解答を与えよう。
480=>>475,477:04/08/28 05:24
これが解答だ。
int m = 2, n = 3;
//初期化
// m個の要素を持ったint*型の配列を容易
int** array = new int*[m];
// それぞれにn個の要素を持ったintの配列
for (int i = 0; i < m; ++i) array[i] = new int[n];
// 処理
for (int i = 0; i < m; ++i)
    for (int j = 0; j < n; ++j)
        array[i][j] = foo();
// 後始末
for (int i = 0; i < m; ++i) delete[] array[i];
delete[] array;
…めんどくさい!あなたはそう叫ぶかもしれないが、これが現実だ。
どうか受け止めてもらいたい。現実は時として厳しい。これも厳しい
現実だ。
最後に1つだけ付け加えておこう。C++としては、std::vector<int>を使う
ことをお勧めする。最後の後始末はこれで必要ない。delete[]を忘れて
自分の書いたコードがメモリをリークするのを恐れて夜眠れなくなること
もない。これで万全だ。では、快適なC++ライフを楽しんでもらおう。
>>479-480
おねがい!本を出して!
>>481
うだうだ書いて、結論は否定だよ。(本としては)ダメじゃん。
vectorってベクトル?ベクター?
>>482
>>479-480は質問に対する解答を示した後、余談としてvectorを挙げている
ように見えるけれど…
intに1234と入力して、
上位二桁と下位二桁を出力するようににプログラムを作ろうと
しているのですが、
#include<stdio.h>
void main(void)
{
int atai=1234;
printf("atai=%d\n\n",atai);
printf("jyoui2keta = %2d\n",atai)
と、入力したところでつまずいてしまいました。
また、printf("jyoui2keta = %2d\n",atai)の部分をコンパイルすると
2桁になって出力されません・・・
どのようにすれば上位二桁を下位二桁を出力できるか教えてくださいm(__)m
#include <stdio.h>

int main(void)
{
int atai=1234;
printf("atai = %d\n\n", atai);
printf("joui2keta = %2d\n\n", atai / 100);
printf("kai2keta = %2d\n\n", atai % 100);

return 0;
}

%.2d
>>486
ありがとうございました。
これですべての入力の宿題終わりました。
(あとは、フローチャートやコーディングや感想かかなきゃですけど・・w)
こんな問題で、どういうフローチャートを書くんだ?
分岐もループも無いのにフローチャートなんて、ありえねぇ。
フローチャートを書く練習だね^^
一本筋のフローチャートになるけど…
ぜひ、487には 489を感想で書いて提出してほしい。
printf の中の動作をフローチャートにすればよろし。
フローチャートの問題は独立してるんじゃないのか?
文章で書かれたことをチャートにおこすとか・・・。
フローチャートって何かの役に立つの?
一回も書いたことないし、書こうとも思わない
複数人で1つのプログラムを組むときにどこを分割するかで役に立つ。(最近はオブジェクト図の方が多い。)
プログラムが分かってない人に説明するときにそこそこ役に立つ。
デバッグするときにたまに役に立つ。
最近はもっぱらシーケンス図とかだね
大学で年寄りの教員はUMLを知らないことがある。
また、UMLは教える内容がわりと多いので半期ほどの授業時間が必要。
それ以前にオブジェクト指向も教えないといけないね
500488:04/08/28 16:10
一年なんで練習ですねw
UMLでは「アクティビティ図」という、フローチャートみたいなものがある。
>501
だから?
フローチャートを要求してくるDQNな顧客があるのは仕方ない。
そのためにいやいやフローチャートを書くのもわかる。
だったらせめてループ記号くらい使おうよ。ワードにあるのがフローチャート記号の全てじゃないんだから。
txtのなかに書かれている文字列を読み込みソートして新たなfpに書き直したいのですが
どのようにすればよいのでしょうか
txtが以下のようなら
   あいう
   いうえ
   あいう
   うえお
新たに
   あいう 2 /* 出現回数
   いうえ 1
   うえお 1
のようにしたいのですがわかりません
c言語を使用してます。よろしくお願いしますm(_ _)m
単純なのは、「木」でメモリに蓄積していって、最後に吐き出す
>>505
txtがでかすぎてメモリに蓄積すると大変なんですよ(ノД`)シクシク
>>506
でかすぎるって、何100MBもあるの?
>>507
はい、あります(゚Д゚)ノ
・・・本当に宿題ですか?(;´Д`)
夏の課題です(ノД`)シクシク
総検索でがんばります、、、(+д+)マズー
511シュトラッ仙:04/08/29 00:04
>>504

もう少し詳しく問題内容を聞きたいです。

1.その文字列はどういった内容ですか(具体的に)?
2.改行文字が出現するまでを「1つの文字列」とみなすのですか?
3.使用可能なディスクのサイズはいくらですか?
1.かな全角で書かれたランダムな文字列です
2.1行に5〜10文字程度を1つの文字列とみなし、語句の最後に改行があります
3.特に制限はありません
よろしくお願いしますm(_ _)m
そもそも、1つの文字列ってどれぐらいの長さよ?
>>513
504の例のように1行改行までを1つの文字列とした
かな全角5〜10文字程度の長さです。
>508
とりあえず2GBくらいメモリ積んどけ。
金で解決できる問題ならそれで済ますのも一つの手だ。
#include <stdio.h>

#include <map>
#include <string>
using namespace std;

int main()
{
    map<string, int> counter;
    FILE *fp;
    char str[22];

    fp = fopen("temp.txt", "r");
    while(fgets(str, sizeof(str), fp) != NULL){
        if(str[strlen(str)-1] == '\n') str[strlen(str)-1] = '\0';
        counter[str]++;
    }
    fclose(fp);

    fp = fopen("temp2.txt", "w");
    map<string, int>::iterator itr;
    for(itr = counter.begin(); itr != counter.end(); itr++)
        fprintf(fp, "%s %d\n", itr->first.c_str(), itr->second);
    fclose(fp);
    return 0;
}


C++(VisualC++の拡張使ってないか不安だが)ならこれで十分なんだよな。
………速度とメモリ無視してるけど。
517癒 ◆xTtI333vNE :04/08/29 01:47
CでSTL使っていいのか?
メモリ内ではなくファイルに書き出す方法のmergesortでどうだろうか。
ファイルを分割してから実行したほうが良いんじゃないの?
後でマージすれば良いし。それくらい考えられないのか?
>>504
>>517
> C++(-略-)なら
  ~~~~    ~~~~
>>515-519
どうもありがとうございますm(_ _)m
さっそくファイル分割してmergesortを試してみまっす!
少し似てる問題なんですが、

最大8文字の英小文字からなる1億個の文字列(全て異なる。未ソート)が書かれたファイルを読み込んで、ある与えられた英小文字列αがあるかどうかを調べる。
もしあった場合には、このファイルを辞書順に並べた場合の何番目にあるか。また、その前後の文字列は何か。
ただしメモリは256MBしかない。
これを実現するプログラムの概要を示せ。

と言う問題で、効率がいいアルゴリズムってどんな感じですかね。
cat -n txt.txt |sed -ne "`awk '/^alpha$/{printf("%d,+2p\n", NR - 1)}' txt.txt`"
524癒 ◆xTtI333vNE :04/08/29 11:14
>>520

>>504
>c言語を使用してます。よろしくお願いしますm(_ _)m
って言ってたからなんだけど。。。
まぁ、本人満足してるみたいだからいいか
>>524
"C++(ここは略)ならこれで十分なんだよな。"(でも、Cでやるとな・・・。)

って感じで言ったんだけど。
526癒 ◆xTtI333vNE :04/08/29 12:03
>>525
漏れの理解力不足スマソ
>>526
こちらこそ、わかりにくい文章でスマソ
>>504
>>521
ファイル分割って言っても、行の途中で分割すると
カウントが正確でなくなるからな。
最後にそこだけケアしとけ。
529デフォルトの名無しさん:04/08/29 23:12
宿題
2次元配列を用いて標準入力から文字列を入力して表示しなさい。
(入力にはfgetsを用いること)
さらにstrlenを使い文字数をカウントしなさい。
またその文字数は入力した文字列の数と違うことはなぜか?
その原因を突き止め、文字数を用いた方法で解決しなさい。

まったくわかりません(ノ_・、)
お願いします(T人T)
2次配列なのはよく分からないけど、
char buff[1024];
がある時、
fgets(buff, 1024, stdin);
でbuffに標準入力から読み込める。無理に2次配列を使うなら
char buff[30][1024];
fget(buff[i], 1024, stdin); (i = 0 .. 29)
みたいになる、はず。

strlenでは最後の改行文字まで読み込む。そのことは
for(i=0;buff[i];i++)printf("%02X", buff[i]);
で確認できる。(最後に改行の0Cか0Aのどちらかは出てくる)
なので、その分入力した文字列の文字数と異なる。

解決法は…って、何を解決するの?
>>529
#include<stdio.h>
#include<string.h>

int main(void)
{
char test[1][10];
int tmp;

fgets(test[0] ,sizeof(test[0]),stdin);
printf("%s",test[0]);

//解決法?w
tmp=strlen(test[0]);
test[tmp-1]='\0';

printf("%s",test[0]);

return 0;
}

↑のようにやってみたけどさー
エラーはくぜぃ!教えてエロい人!
↓エラー内容

エラー E2277 a.c 14: 左辺値が必要(関数 main )
警告 W8004 a.c 19: 'tmp' に代入した値は使われていない(関数 main )
*** 1 errors in Compile ***
暗にfgetsは良くないと言いたい先生じゃないの?
>>531
test[0][tmp-1]='\0';
>>533
cool
>>531
#include<stdio.h>
#include<string.h>

int main(void)
{
  char test[1][10];
  printf("%s",(fgets(test[0],sizeof(test[0]),stdin), test[0]));
  printf("%s",(test[0][strlen(test[0])-1]='\0', test[0]));
  return 0;
}
536デフォルトの名無しさん:04/08/30 12:14
宿題お願いします。

課題内容ですが、
・各自でテーマを設定し、プログラミングをする
・C言語を用いて、LinuxもしくはWindowsで動作可能であること
・分岐構文と反復構文を用いること
・プログラム中にタイトルやコメントを十分に入れること
・A4用紙10枚以内

授業が分からないまま課題が出たのでテーマといっても全然思い付きません
高2なのでまだ難しい事は習ってません
何か適切なプログラムがあれば教えて下さい。
>>536
授業ではどの程度のことを学びましたか?
大まかな項目名だけでも書いてください。
>>536
とりあえずこのスレの宿題でよさげなやつでもパクっといたらどうでしょう?
539536:04/08/30 12:31
>>537
変数・分岐構文・反復構文あたりだけです
授業で習ってない内容が入ってても構わないそうです

>>538
一応一通り目を通しましたが、理解できないものが大部分でした。。
540デフォルトの名無しさん:04/08/30 12:33
>>535
great!
>>536
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1064150088&res=208
こんなんどうかな?
これ昔俺が宿題用に作ったやつで単純利息で目標金額まで何年かかるかってゆーもの。
ちなみに複利計算っつーのもあるけど
またあとでUPしよう

間違っていたら訂正よろしゅー
あーちゅーかA410枚じゃみじかすぎかw
すまん程度が低くて参考ににならんかったな
#include <stdio.h>
#include <time.h>
#include <math.h>
#define PRIME_MAX 258440
int main(void)
{
unsigned int sosuukouho,sosuu[258440],n,m/*配列の上限は258442個*/;
clock_t start, end;
start = clock();
sosuu[0] = 2;m = 1;sosuukouho=3;
/*このwhile文でPRIME_MAX個の素数を発見する*/
while(m<=PRIME_MAX-1){
for(n=0; n<=m; n++){
if(sosuukouho % sosuu[n] == 0)
break;
if((sosuukouho % sosuu[n] != 0) && (n == m-1)){
sosuu[n+1] = sosuukouho;
m += 1;
}
}
sosuukouho=sosuukouho+2;
}end = clock();
for(sosuukouho=0,sosuukouho<10000;sosuukouho++)
putchar('\a');/*終了を音で知らせる*/
/*ここのコメントは素数を表示する機能をなくすため*/
/*for(n=0;n<=m-1;n++){*/
/*printf("%d番目の素数は%dです\n",n+1,sosuu[n]);}*/
printf("処理にかかった時間: %f秒\n", (double)(end - start) / CLOCKS_PER_SEC);
printf("素数の数は%d個で、最後の素数は%dです。\n",m,sosuu[m-1]);
return 0;
}
>>536プレゼント これでも提出しとけ
セルラオートマトンで森林火災のシミュレーションなんてどう?
545536:04/08/30 13:07
ありがとうございます
簡単なものでも大丈夫なので十分参考になりました
とりあえずこの二つで頑張ってみます。
Scanf関数の文法説明・アルゴリズム説明をしろ
という宿題がでたのですがよくわかりません・・・
どなたか教えてもらえませんでしょうか?
Scanf 関数なんて関数はありません
なんか将来的に役に立たなさそうな宿題出されてる人が多いな。
>>548
宿題自体じゃなくて、アルゴリズムを"考える"ところに
意味があるんじゃなかろうか。
>>548
baka
>>546
Scanfとはだなつまりえーと、んじゃまず発音から教えるか。
発音はだな ス カ ン エ フ だ!
OK?そうだ勇気を出して口に出して言ってみるんだ!せーのっ
「・・・」 
OKOK恥ずかしがりやなんだな。大丈夫だそんなに恥ずかしくないぞ。
勇気をだして言ってみるんだ!はいっせーのっ!

だっふんだ!
>>551
子音の後ろ f の発音は普通 フ[f] だろ?
そんなんじゃ英語の単位貰えないぜ?
Y=4X+5があり、X=1〜nの時(刻み幅0.1)のYの値を求め、Yのn番目の値を
0.3倍した時の値とその値がXがいくつの時かを求めるプログラムを
おねがいします。
(0.3倍のYの値が無ければ前後二つのYの値とそれに対応する二つのXの値を求めよ)
#include <stdio.h>
double f(double x){return 4*x+5;}
double fi(double y){return (y-5)/4;}
int main()
{
double x,y;
int x1,x2;
int i;
int n;
printf("n >");
scanf("%d",&n);
for(i=1;i<=n*10;i++)
x=i/10.0;
printf("x=%fの時 y=%f\n",x,f(x));
}
y=f(n)*0.3;
x=fi(y);
x1=(int)(x*10);
x2=(int)((x+0.09)*10);
printf("y=%f の時 x=%f",y,x1/10.0);
if(x1!=x2)printf(" , %f",x2/10.0);
printf("\n");
return 0;
}
訂正
printf("y=%f の時 x=%f",f(x1/10.0),x1/10.0);
if(x1!=x2)printf(" , y=%f の時 x=%f",f(x2/10.0),x2/10.0);
>>555.556
釣り・・・だよな。
すげーぜ!

次の宿題まだー?
未解決問題:
>>352 >>411
eibun1.datというファイルがあり、内容は、

角田      熊沢      藤田      岸
松永      安田      渡辺      和田
・・・・・・

のようにTabで区切られた語群です。


「ファイル名」   eibun1.dat
「何行目」     N
「何番目の語」   M

ファイル名とN,M(数字)を入力したときに
M行目のN番目の単語を表示するプログラムを作成してください。
561デフォルトの名無しさん:04/09/01 19:08
M行目のN番目



N行目のM番目
>>560
それだったらタブ以外に改行文字も入れないと。
563デフォルトの名無しさん:04/09/01 23:12
お願いします!教えて下さい!
夏休みの宿題として、C++で住所帳を書いています。
で、名前などの編集機能を付けようと頑張っています。
一応、名前で検索をかけて、同じ名前があった場合に、どちらの名前を編集するか選択させるようにしたいのですが、
その部分で困っています。
とりあえず、ダブった名前のあるオブジェクトをさすポインタをオブジェクトの配列に代入していき、
編集するようにしたいんですが、うまくいきません。
*pList2[?] = pList2->Next でやろうとしました。
で、その配列を表示しようとしたら、エラーになります。

どうかお願いします。
>>563
つべこべ言わずにソース晒せ
565563:04/09/01 23:22
566デフォルトの名無しさん:04/09/01 23:29
C++なら構造体へのtypedefはいらん
*pList2[?] = pList2->Next
これが見当たらないんだが・・・
568563:04/09/01 23:40
あっ!
pList[k - 1] = pList1->Next;
下のほ〜にあります!すみません。例えで、書いただけなので。

typedefっていらないんですね☆
ありがとうございます!勉強になります
>>568
pList[?]はAddress_listであって、Address_list*
じゃないですよ
例外が有効なとき、newでNULLが返されたりしないことが多かったような…。
どうだっけ?
571563:04/09/01 23:50
えっと、Address_list* にすれば、うまくいくのでしょうか?
>>571
Address_list* pList1 = this->Next, *pList[10];
こうやったとしても

pList[k - 1] = pList1->Next;
cout << k++ << ":" << endl;
printf("   [名前] %s\n   [年齢] %s\n   [住所] %s\n   [電話番号] %s\n",
        pList[k - 1].pName, pList[k - 1].pAge, pList[k - 1].pAddress, pList[k - 1].pTelephone_number);
        ↑
最初pList[0]しか代入してないのでpList[1]が未定・・・
あと、ポインタの配列を採用するなら、こうね

printf("   [名前] %s\n   [年齢] %s\n   [住所] %s\n   [電話番号] %s\n",
        pList[k - 1]->pName, pList[k - 1]->pAge, pList[k - 1]->pAddress, pList[k - 1]->pTelephone_number);
574563:04/09/02 00:02
配列の要素がちゃんとできていなかったため、うまくいかなかったって事ですか?
>>574
×オブジェクトをさすポインタをオブジェクトの配列に代入
○オブジェクトをさすポインタをオブジェクトのポインタの配列に代入

あと、配列の要素も然り
576563:04/09/02 00:14
オブジェクトをさすポインタをオブジェクトのポインタの配列じゃないと、
代入できないのは理解しました☆
ところで、今僕がやってるやり方ってあんまり良くないんでしょうか?
577デフォルトの名無しさん:04/09/02 00:21
>>560
これじゃだめ?w
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1027870433&res=307
まぁよゆーのエラーありなんだが
良くないかどうか知らないけど、あとはk++の位置直せば終わりでしょ?
579563:04/09/02 00:39
すみません。直したんですが、エラー終了してしました。
同じ名前を2つ入力して、検索でその名前を入力したのですが、
2つ目が表示されませんでした。。。

http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1094053081&res=1
NULLPO
581563:04/09/02 00:53
NULLPO って何でしょうか? すみません。全然知識がないもので・・・。
584563:04/09/02 02:40
582さん、ありがとうございました☆
問題を解決することができました!
585デフォルトの名無しさん:04/09/02 05:32
また2・3匹釣られてるな
( ・∀・)⊃─[]ガッ
[    ]  (´∀` )←>>580
なぜC++なのにSTLを使わないんですか、そこがいまいちわかりません
STLが信用できません
コンパイラが信用できません
そして何より自分が信用できません
>>588
一番信用できないのがヒューマンエラー
double形配列dataに10人の体重データ{67.2, 43.6, 78.9, 50.1,0.0, 32.9, 44.4, 100.9, 62.5, 0.0}
を初期化し、体重の合計と平均を求めるプログラムを作成しなさい。ただし、未測定者の体重値は0.0としてある。

とりあえず合計を出そうとしましたが答えが0.0になってしまいます。どなたかお願いします。
#include <stdio.h>
int main(void)
{
double data[10] = {67.2, 43.6, 78.9, 50.1, 0.0, 32.9, 44.4, 100.9, 62.5, 0.0};
int i, goukei=0;
for(i=0;i<10;i++);{
goukei += data[i];
}
for(i=0;i<10;i++);{
printf("%f\n", data[10]);
}
printf("体重の合計は%fです。\n", data[10]);
return 0;
}
>>590
1. data が double なのに
goukei が int なのはいかがなものか。
2. data[10] を printf するのはまずい。
有効なのは data[0] から data[9] まで。
3. 最後の printf、合計値が入っているのは data[10] じゃない。
4. for ループの printf もなぜ data[10] …
592591:04/09/02 23:28
ところでこの問題、
未測定者は平均値の計算に含めないこと、
という意味なんですかね?
まあ、がんばってください。
ファイル「sample.txt」のデータを読み込み、直線補間しなさい。

座標は、x,yともに順番になっています。例えば1つ目の座標は
(x1,y1)=(0.0000E+00,0.5240E+01) となります。
windowsXP,bccを使用しています。よろしくお願いします。

sample.txtの内容
x座標
0.0000E+00 0.1000E-01 0.2000E-01 0.5000E-01 0.1000E+00
0.2000E+00 0.5000E+00 0.1000E+01 0.1500E+01 0.2000E+01
0.3000E+01 0.4000E+01 0.5000E+01 0.6000E+01 0.8000E+01
0.9000E+01 0.1000E+02 0.1100E+02 0.1200E+02 0.1248E+02
0.1469E+02 0.1920E+02 0.2336E+02 0.2635E+02 0.2916E+02
0.3364E+02 0.4053E+02 0.4489E+02 0.4900E+02 0.5427E+02
0.5929E+02 0.6453E+02 0.7056E+02 0.7862E+02 0.1000E+03
0.1138E+03 0.1210E+03 0.1284E+03 0.1440E+03 0.1690E+03
0.2000E+03 0.2250E+03 0.2560E+03 0.3000E+03 0.3480E+03
0.4000E+03 0.5000E+03 0.6000E+03 0.7000E+03 0.8000E+03
0.9000E+03 0.1000E+04 0.5000E+04 0.1000E+05

y座標
0.5240E+01 0.5280E+01 0.5400E+01 0.5650E+01 0.5900E+01
0.6200E+01 0.6620E+01 0.6880E+01 0.6980E+01 0.7000E+01
0.6870E+01 0.6610E+01 0.6290E+01 0.6000E+01 0.5350E+01
0.5050E+01 0.4760E+01 0.4480E+01 0.4310E+01 0.4210E+01
0.3770E+01 0.3000E+01 0.2430E+01 0.2100E+01 0.1830E+01
0.1460E+01 0.1080E+01 0.9170E+00 0.7800E+00 0.6500E+00
0.5600E+00 0.4760E+00 0.4150E+00 0.3430E+00 0.2270E+00
0.1870E+00 0.1650E+00 0.1500E+00 0.1220E+00 0.9200E-01
0.6950E-01 0.5600E-01 0.4500E-01 0.3500E-01 0.2720E-01
0.2130E-01 0.1450E-01 0.1070E-01 0.8200E-02 0.6600E-02
0.5400E-02 0.4550E-02 0.3000E-03 0.9300E-04
>一番信用できないのがヒューマンエラー

エラーを信用するも何もないだろ?(age)
>>590
for文の後に;はいらないですね
596デフォルトの名無しさん:04/09/03 00:32
for(i=0;i<10;i++){;}
{
printf("%f\n", data[10]);
}
と同じだからコンパイルできるんだよな。
>>590
#include <stdio.h>
int main(void)
{
double data[10] = {67.2, 43.6, 78.9, 50.1, 0.0, 32.9, 44.4, 100.9, 62.5, 0.0};
int i,j=0;
double goukei=0,heikinn;
for(i=0;i<10;i++){
goukei += data[i];
if(data[i]==0.0){
j++;
}
}
for(i=0;i<10;i++){
printf("%f\n", data[i]);
}
heikinn=goukei/(i-j);
printf("体重の合計は%f 平均は %fです。\n", goukei,heikinn);
return 0;
}
598590:04/09/03 00:38
#include <stdio.h>
int main(void)
{
double data[10] = {67.2, 43.6, 78.9, 50.1, 0.0, 32.9, 44.4, 100.9, 62.5, 0.0}, goukei=0;
int i;
for(i=0;i<10;i++);{
goukei += data[i];
}
for(i=0;i<10;i++);
printf("体重の合計は%fです\n", data[i]);
return 0;
}
こういう事ですか・・・・・?すみませんが全然わかりません
599590:04/09/03 00:41
>>597
ありがとうございます。助かりました
>>593
直線補間する座標は自分で入力するの?
>>600
座標はテキストファイルに入っているデータです。
「sample.txt」の内容そのまんまです。
602デフォルトの名無しさん:04/09/03 14:11
すみません。昨日ここに住所帳の事でお願いしに来た者なんですが、
入力したデータをファイルに書き込みできるようにしようと思ったのですが、
どう書いていいのか、全然わかりません。
で、ファイルに保存したデータを住所帳を開く度に使えるようにしたいのですが、
どうすればいいのでしょうか?
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1094188282&res=1
お願いします。
visual basic 6 用に書かれたコードを visual c++ 6 用に起こしています。
そこで質問です。

Basic関数でのLEFT関数(ttp://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vblr7/html/vafctleft.asp
と同様の命令を出す、vc++で使える関数はあるのでしょうか?
よろしくお願いします。
>>603
strncpy()
605>593:04/09/03 19:32
#include <stdio.h>
#include <stdlib.h>
enum {MAXDATA = 100};
int ndata = 0;
double data_x[MAXDATA], data_y[MAXDATA];
void read_data(FILE *fp)
{
int i;

fscanf(fp, "%*s"); /* "X座標"を読み飛ばす */
for (ndata = 0; ndata < MAXDATA && fscanf(fp, "%lf", &data_x[ndata]); ndata++)
;
fscanf(fp, "%*s"); /* "Y座標"を読み飛ばす */
for (i = 0; i < ndata && fscanf(fp, "%lf", &data_y[i]); i++)
;
}
void print_data(FILE *fp)
{
int i;
for (i = 0; i < ndata; i++)
fprintf(fp, "%f,%f\n", data_x[i], data_y[i]);
}
int main(void)
{
read_data(stdin);print_data(stdout);
return 0;
}
/* 補完は仕様がよくわからんので、データのリードだけ。続きはだれかやってちょ */
>>605
どんな出力がほしいの?
それが解からないと…
>>606
名前欄に>593と書いてあるが。
つまり、データ最小値<x<データ最大値で任意のxの値を入力し、
データから線形補間してxに対応するyの値を出力せよ、
といういう意味でOK?
609605:04/09/03 21:31
>>605は一応、>>593向けにつくた。(私は>>593ではないです)
x入力してyを出力するのか、入出力が逆か、
補完させるちゅーても、入出力どーすんのかわかんねーので。これ以上は難しいやね。
普通は、xの値からyを推定するって思うが・・・(>>608氏と同じこと)。ってことで、続きよろしくです。
・・・てか>>593氏が返事くれると、続きだれか作ってくれるでしょう・・・。
610593:04/09/03 21:47
>>608さんの意味でOKです。
>>605さん、ありがとうございます。
593は今なにがもとめられているかわかっていないに一票
612593:04/09/03 21:53
613612:04/09/03 21:53
>>593
間違って名前欄に書いちゃった^^;
614 :04/09/03 22:14
>>602なんですけど、やっぱり無茶苦茶なソースでやり気がなくなったんでしょうか?
マジでわからなくて、困ってるんですが・・・本当にお願いします。
615593:04/09/03 22:18
助かりました。本当にありがとうございます。

>>614
うん や り 気 がなくなったんだよ。
>>614
住所録のデータをファイルに書き込むってMySQLつかったりできるといいね^^
618デフォルトの名無しさん:04/09/03 22:30
やる気☆ですねw
で、MySQLって難しいってか、意味が全然・・・。
他に方法はないでしょうか?
>>618
もちろんありますよ。
たとえば、CVS形式で出力して読み込むだけなら簡単ですね。
名前1,年齢1,住所1,電話番号1
名前2,年齢2,住所2,電話番号2
     ・
     ・
のような形式でファイルに書き込んで、
読み込むときは
「,」でトークンをわけてやるようにすればできるでしょう。


620デフォルトの名無しさん:04/09/03 22:47
すみません。CVSって何かわからなかったので調べてみたんですが、
難しい内容のような気がするんですが・・・。
解りやすく説明したサイトを知っていれば教えてもらえないでしょうか?
それと、>>619さんならどんな風にソースを書きますか?
>>620
過去ログに似たようなプログラムが何度も出てきたように思います。
詳しくは過去ログにて。
同じことはあまり書きたくない。
(Cのスレだったかな?まぁ宿題・質問スレの過去ログ参照のこと)
確かに、CVSで調べると難しそうな内容ばっかりだな。
CVSではなく、CSVだ。


分かってるならすまん。
623620:04/09/03 23:01
あはー、やってしまいましたー
しかも、全然気づいてなかったです
C++の宿題がでてるんです。かわりに作ってください;;
CygwinでMeadowを開いて書いています。
作りたいのは簡易,会計処理プログラムです。
仕様コマンドは
 ・Input・Lord・Save・Sort・Search・Delere・Exit
を使ってExitコマンドをするまでは、プログラムは終了しないということです。
本当はもっと細かく仕様が決まっているんです。
作ってくれるという方は[email protected]までメールを下さい。
もちろんタダでとは言いません。
WebMoneyで2000円を払います。お願いします。
625sage:04/09/03 23:28
マジで払うのかよ?
626605:04/09/03 23:57
>>623 わしもよくやります<CSVとCVSの間違い

うーん・・・C++は門外漢なんだが。
ttp://cm.bell-labs.com/cm/cs/tpop/csvgetlinec++.c
にCSVライブラリのコードがある。
ttp://cm.bell-labs.com/cm/cs/tpop/code.html
↑の使用条件(参考訳:著作権表示を消さない限り、自由に使ってよい)にしたがって使ってくれい。
和訳は『プログラミング作法』として売ってるんで本屋さんへGo!
>>623
boost::tokenizer
>>623
strtok()
629619:04/09/04 00:16
ごめんなさい
>>623 != >>620でした
実は>>623 == >>619です

今日は疲れてるのかな…
630真620:04/09/04 00:48
>>627
>>628
ありがとうございます☆
てか、なんかちょっとおもしろい事になってますね。
631デフォルトの名無しさん:04/09/04 00:53
>>618

『CVS』Concurrent Versions System
http://e-words.jp/w/CVS.html
主に共同開発のためのシステム

『CSV』Comma Separated Values
http://e-words.jp/w/CSV.html
ファイルタイプ
んで624に釣られたカワイソウな人はいるんですか?
634624:04/09/04 12:44
まだ一人もメールをくださりません・・・。
>>634
ならメアド公開しろよ。
Cなのですが、ある型を宣言し最大値を入力、表示せよという問題です。
#include <stdio.h>
main(){
nt aa;
aa=INT_MAX;
printf("型 = int , 値 = %d\n",aa);
return 0;
}
【結果】
型 = int , 値 = 32767

俺のパソコンは16ビットなのか・・・2147483647と出るのが理想なのですが。
環境はWin2kproでLSI C-86使ってます。
LSIなのがいけないのでしょうか。
638637:04/09/05 04:50
iが抜けてましたね。
ちなみにsizeof(int)で見てみたらサイズはやはり2バイトでした。
>>637
LSI-Cはそうだね。無料版は制限もきついから早めに乗り換えた方がいいよ。
bcc32でvector使うと、警告がvectorのcppから出てくるんだけど、これを表示させなくしたいのね。
軟化上手い方法ある?
641637:04/09/05 14:24
>>639
ムァジすか。bccに変えるべきですね・・・・
どうもありがとうございました。
>>640
bcc32 hoge.cpp 1>/dev/null 2>&1
nulじゃないのか
>>640
bccに警告レベルを切り替えるpragmaがあるなら、#include <vector>の前後で変えればいいやん。
>>644
なんでこんなのでるの?警告が出ないような美しいvector.cppは無いのかねぇ?
どこのcpp取ってきても同じかな
//警告が出ないような美しいvector.cpp
#pragma option push -w-
#include <vector>
#pragma option pop
警告って発想がいやらしいよなぁ。
OKかエラーかはっきりしろよっ!って感じ。
648デフォルトの名無しさん:04/09/05 23:40
さっぱりわかりません。どなたかご教授下さい!お願いします!言語はCです。

15の要素数を持つtokuten配列を用意する。画面より、コマンドを選択し任意のデータを配列へ
挿入しその時のデータ数、全データ(要素数)および平均点を表示するプログラムを作成せよ。
なお、データの挿入位置は配列の先頭とする。また、要素数が15を超えた時はエラー表示をする。
画面例:
挿入データを入力して下さい。
入力データ:60

データ数:3
要素1:60
要素2:70
要素3:80
平均:70
>>648
コマンドって何があんの?下の例を見る限り挿入するデータしか入力してないみたいだが?
650デフォルトの名無しさん:04/09/06 02:21
>>648
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1064150088&res=216
コマンドは q で入力終了というものを勝手に追加した
651デフォルトの名無しさん:04/09/06 10:36
2点間の距離を算出するプログラムは以下のとおり

#include <stdio.h>
#include <math.h>
#define DIMENSION 3 /* N次元 */
double kyori(double a[],double b[]){
int i;
double k,k2=0;
for(i=0;i<DIMENSION;i++){
k2+=pow(a[i]-b[i],2);
}
k=sqrt(k2);
return(k);
}
void main(void){
double p1[]={1,2,3},p2[]={9,8,7};
printf("%f\n",kyori(p1,p2));
}

これを基にして点がp1、p2、p3、p4、p5・・・とある場合に
指定した点から近い順に表示するプログラムを作成してください
画面例:
どこから?
p1
近い順
p4
p3
・・・
p2
p5

これってどうなんですか?
何がどうなんですかだよ
653デフォルトの名無しさん:04/09/06 12:33
どうしようもないです。
654デフォルトの名無しさん:04/09/06 15:05
VC++6使用です。以下のようにプログラムを組んだのですが、実行をすると最後の行を
実行したときにエラーダイアログが表示されてしまいます。エラー内容は「The value
of ESP was not properly saved across a function call. This is usually a result
of calling a function declared with one calling convention with a function
pointer declared with a different convention. 」
関数ポインタの定義に__stdcallを付けてみましたが、表示されるエラー内容は一緒で
した。どこがオカシイのか、ご教授お願いします。
(DLLに入っている関数を使用するプログラムです)



short num;
short arg_1, arg_2;
typedef short (*FUNC)(short, short);
FUNC num_start;
HINSTANCE hDLL;

hDLL = LoadLibrary("num232.dll");
if(hDLL){
  num_start = (FUNC)GetProcAddress(hDLL, "NumStart");
}
arg_1 = 10; arg_2 = 100;
num = num_start(arg_1, arg_2);
ス レ が  ち が う だ ろ う   が    ー
657デフォルトの名無しさん:04/09/06 17:08
二年でプログラムをマスターできますか?仕事じゃなく趣味でやりたいのですが 目標はオリジナルのOSを作成する事です
努力次第です。
2年もあればOS程度作れるでしょう。
>>657
既存のOSを模倣したものならできるでしょう。
ただし、新しいアイデアを採り入れたようなものは
いろいろな論文を読んだりして研究しないといけません。
1日10分で2年と1日2時間で2年。
OSというとドライバあたりが気になる所だが。
>>657が途中で挫折するに5万円
662648:04/09/06 20:16
>>650
遅くなってすみません!本当に助かりました!
ありがとう〜
>>657が途中で挫折するに国家予算
664648:04/09/06 21:11
下図の販売店A,B,Cの各商品x,y,z,wの売上計算のプログラムをC言語を用いて実現せよ。
各データはプログラム内で設定し、合計を計算せよ。また、プログラム終了時に全データを印字せよ。
売上合計…各販売店の合計、各商品の合計、総合計

        商品
     x  y z w  計
販 A 1234 2345 3456 4321 11356
売 B 2876 2765 4567 3987 14195
店 C 1907 3254 3243 2536 10940
  計  6017 8364 11266 10844 36491

2次元配列を使えばいいとはわかったのですが解けません。
教えてください。お願いします…。
665648:04/09/06 21:14
図がずれた…。すいません!左から順にx,y,z,w,計です。
>>657がが途中で挫折するに2^63-1(unsigned int int)円
667666:04/09/06 21:22
思いっきり間違ったし。恥ずかしすぎ。
正しくは、
>>657が途中で挫折するに2^63-1(unsigned long long int)円
668デフォルトの名無しさん:04/09/06 22:34
ガイシュツかもしれませんが、教えてください。
オブジェクトのアドレスを自動変数にコピーしておき、
そのオブジェクトを破壊(デストラクタ)させた後、
コピーしたアドレスに対してアクセスを行うと、
どうなりますか?

UNIX/gcc
では、オブジェクトがあるかの様に動かす(メソッドをコールする)ことができました。

間違いなく、やってはいけない手法だとは思いますが、
ANSIとかでこの辺の動きって規定されていますか?
こんぱいらや機種依存で動作はことなりますか?
669デフォルトの名無しさん:04/09/06 22:38
>>665
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1064150088&res=218
ほれ。ちゃーんと改造のよちを残しときましたんでー(^^;
670デフォルトの名無しさん:04/09/06 22:40
>>668
ここは宿題すれつってんだろーが >657 に一言残して去れ!
671デフォルトの名無しさん:04/09/06 23:27
仕事でやるわけじゃないから挫折はないですよ 趣味でプログラム組みたいだけですから何十年かかろうがマターリとやれればいいんです
672デフォルトの名無しさん:04/09/06 23:32
仕事じゃないから挫折するって理屈はないの?
そんなわけで挫折に(地球上の人口)円
趣味"だからこそ"挫折がありそうなもんだが。
確かに。仕事でやる方が挫折がないだろ。
でもでもー うちは ふけいきだから とかいって かいしゃごと ざせt
676デフォルトの名無しさん:04/09/07 00:35
引数に text1.txt text2.txtなどのファイル名を二つ取り、これらのファイルに共通に含まれる行を表示せよ。

(1)の内容が…   AAA\nBBB\nCCC\nDDD\nEEE\nFFF
(2)の内容が…   XXX\nAAA\nFFF\nYYY\nZZZ
なら、
AAAとFFFが答えとなる。
#include <set>
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main( int argc, char* argv[] )
{
if ( argc != 3 ) {
cerr << "usage:\nargv[0] <inputFileA> <inputFileB>" << endl;
}

set<string> stringSet;
string line;
ifstream finA( argv[1] );
ifstream finB( argv[2] );

while ( getline( finA, line ), !finA.eof() ) {
stringSet.insert( line );
}
while ( getline( finB, line ), !finB.eof() ) {
if ( stringSet.find( line ) != stringSet.end() ) cout << line << endl;
}
return 0;
}
#include<stdio.h>

int main(void)
{
system("cat text1.txt >> text2.txt | sort text2.txt | uniq -d");
}

こここここれどうかな>>676
>678 ソートしちゃダメだろ(w

素直に diff 汁!
#include<stdio.h>
int main
{
   int i, j;

   printf("  10 11 12 13 14 15 16 17 18 19 20\n");
   for(i=10=;i<20;j++) {
      printf("%4d",i*j);
     }
  }
  printf("\n");

  return 0;
}

小さい方のループのjの値がループして戻ってくる度に10にリセットされるのはなんででしょうか?10の値がJに入れられるならj++しても帰ってくる度にjの値が10になって一生ループしても不思議じゃないと思うんですが...


C言語です
ソースがおかしいから何ともいえない。
ちゃんとコピーしてくれ。

> int main
仮引数リストはどこへ

> for(i=10=;i<20;j++) {
初期化がおかしい

>     }
>  }
括弧が対応していない
#include<stdio.h>
int main(void)
{
int i, j;

printf("  10 11 12 13 14 15 16 17 18 19 20\n");
for(i=10;i<=20;i++) {
printf("\n%2d",i);
   for(j=10;j<=20;j++){
    printf("%4d",i*j);
}
}
printf("\n");
return 0;
}

sumimasen
泡立ててました
>>680
ループして戻ってくる度にはリセットされてないけど?
forループ開始する度にはリセットするけど
685 :04/09/07 11:43
>>685
クリックすると、投票させられるっぽい。
>>684先生御教授ありがとうございます。
#include<stdio.h>

void putd(int a)
{
   printf("%d\n",a);
}

int main(void)
{
   int dt = 500;

   putd(100);
   putd(dt);

   return 0;
}
三行目から六行目は全く意味がないように思うんですが..
aは空っぽで、一体何をしたいんでしょう?
Cの入門書に書いてあったんです。
何のための関数か教えてくたざい。
>>688
>三行目から六行目は全く意味がないように思うんですが..
>aは空っぽで、一体何をしたいんでしょう?
迷言だな

マジレスすると、putd は、渡された数値を標準出力に書き出して改行する関数。
基本をしっかりと身に付けられるよう、がんがれよ
>>688
お前ワープは物理的に無理って信じてるだろ
しっかり身に付けてきます。親切にどうもありがとうございました
693デフォルトの名無しさん:04/09/07 15:05
>>691
ワープは無理だよ。
ホーキングもプラックホールでのワープは「ない」って、言い直したからね。
>>693
無理じゃない。
無理っぽいんだ!
量子の状態を瞬間移動させることには成功したと
どこかの雑誌で読んだ
697デフォルトの名無しさん:04/09/07 16:01
>>696
ワロタ
698デフォルトの名無しさん:04/09/07 16:15
プラックホールって何?
使い込まれた穴だよ。
想像してごらん・・・

ほら。黒い穴(ブラックホール)がイメージできたろう?
>>699
質問をよく読みましょう。
>>698
Pluck  hole
勇気の 穴
ある程度以上の質量を持った星が寿命を終えて最後に爆発した時、
その反動で星を構成していた物質がギュッと縮まることがある。
そうすると、元の物質よりも密度が高い物質が出来るわけで、
そうなると重力が大きくなって、回りの物をどんどん引き込んで
しまう。当然、そんな所に人間がいたら立っていることも出来ずに
ぺちゃんこになってしまう。そして光すらもその重力にまけてしまう。
つまり、その近くで仮に懐中電灯を付けても光らないわけだ。
そんなものが宇宙にあったら「黒い星(穴)」のように見えるだろう
ということでブラックホールと呼ばれる。
もちろん、実際に黒い色をしているかどうかすら本当は分からないが。
>>699
黒いのはあまり好きじゃない
704デフォルトの名無しさん:04/09/07 16:43
なるほど。ホーキングは勇者というわけか。
705デフォルトの名無しさん:04/09/07 16:44
test1.fの中でtest2.cに書かれた関数を呼び出しています。
このような条件でtest1.fをコンパイルしたいのですが、
どのようにコンパイルすれば良いのでしょうか?
当方、Linux環境です。
>>705
拡張子 f って何?
707デフォルトの名無しさん:04/09/07 16:46
>>705
CやC++でないならスレ違いだよ
C/C++でも宿題でなければスレ違いだけど
>>706
Fortranだろ
709デフォルトの名無しさん:04/09/07 16:50
>>706
.fはフォートランという言語だそうです。
内容はメイン関数だけみたいです。

>>707
一応、宿題なんですけど。。
別の言語?で書かれた関数も呼び出せることを
学ぶのが目的みたいです。
授業を聞かない705が悪い
711デフォルトの名無しさん:04/09/07 16:56
組み合わせを求めるプログラムを教えてくらさい。
int c(int a, int b)で
aCbみたいな。
>>711
int c(int a, int b){return a==0||b==a?1:c(a-1, b)+c(a, b-1);}
713712:04/09/07 17:06
ミス
int c(int a, int b){return b==0||b==a?1:c(a-1, b)+c(a-1, b-1);}
714デフォルトの名無しさん:04/09/07 17:07
>>712
aに8、bに4を渡すとうちではSegmentation Faultになった。
fortran:test1.f
program test
call ctest()
end


c:test2.c
void ctest_() {
printf("test");
return;
}

$g77 -c test1.f
$gcc -c test2.c
$g77 test1.o test2.o
$./a.out
716715:04/09/07 17:40
717デフォルトの名無しさん:04/09/07 18:48
>>715
できました!!ありがとう御座います!!!
718:04/09/07 20:04
構造体が扱えるのはは配列オンリーなんですか?
>>718
意味不明
>>718
そんな質問の仕方ではあなたがロンリーです
718は
struct N
{
int u, l, p, o
};

N n; // NG
N n[ 10 ]; // OK

ってことが言いたいのか?
むしろ、文から察するに、

struct {
int a[10];
};//OK

struct {
int a;
};//NG

という意味で聞いているように見える。

でも聞きたいことはおそらく、構造体を動的にメモリ確保できるのか
どうかということじゃないかと推測。
>721>722さん達の察する通りです。説明不足でしたあわたててました。

int abara;  ←配列にしてない
int abon[100];
int indo[100];
int mona[100];

これらを構造体にまとめて、例えば
[0]に設定した値を[20]に入れたら、
abara変数の立場はどうなるんでしょうか?
>>721
っていうか ガッ!!
>>723
何言ってんのかよくワカラン
この際長文でもいいからこれでもかってくらい詳しく説明してくれ
>>725
放置しろよ
携帯からなのでかなり時間がかかります。打ちミスも多いと思われ。
出来た頃にスレをアゲますので、マターリしてお待ちください。
↑絶望。放置。図書館かネトカフェからやれやボゲ
>>723
の文章は芸術
730デフォルトの名無しさん:04/09/07 22:47
標準入力から入力した数値を素因数分解するプログラムをお願いします。

例)
Input number=>100

5^2*2^2

731730:04/09/07 22:50
>>730
C言語でお願いします
(TдT)
(TдT)
↑何これ?

因数はすぐ見つかるけど表示はどうすりゃいいのさ
>>731
アルゴリズムは不問?全探索のみ?
>>732さん
顔文字はスルーで
表示は>>731にしめした通りですがわかりにくかったでしょうか。。

>>733さん
アルゴリズムは不問でもよいと思います。
>>730
#include <stdio.h>
#include <string.h>

int main(void) {
int i, j;
int num;

scanf("%d",&num);

if ( num == 1 ) printf("1");
else {
for ( i = 2; num != 1; i++ ) {
for ( j = 0; num % i == 0; j++ )
num = num / i;
if ( j != 0 ) {
printf("%d^%d", i, j);
if ( num != 1 ) printf("*");
}
}
}
printf("\n");

return 0;
}
736730:04/09/08 00:07
>>735
ダメダメ、例に書いたようにやってくれなくっちゃぁ。
>>736
氏ね
>735は少なくとも>730のように2バイト文字は使ってない罠。
2byte文字で出力する様にするのはできるけど、
そんなに2byte文字が重要なの?
っていうかそれくらい自分でやれよ
741730:04/09/08 00:23
どうもありがとうございました。
742デフォルトの名無しさん:04/09/08 03:05
直接選択法わけわかめ
743デフォルトの名無しさん:04/09/08 03:30
WinAPIについて質問です。
DLL側のcppファイルに
declspec(dllexport) int flag;
を宣言して、
EXE側のヘッダファイルに
declspec(dllimport) int flag;
を宣言して、cppにインクルードしました。
EXE、DLLの両方で共通のフラグを使おうと思ったのですが、
デバッガでトレースすると、EXE側で1に設定したflagが
DLL側の関数に入るとflagの値が0になってしまいました。
フラグのメモリアドレスを見ると、DLLとEXEで異なっていて
別領域が取られているようです。EXE、DLLの両方で共通の
同じフラグを使用するには、どのようにexport,importをすれば
よいのでしょうか?長くなってすいません。
>>744
よく考えたら宿題ではなかったです。
しかもVisualC++の使い方の質問かもしれない。
とりあえずそちらに質問してみます。
746デフォルトの名無しさん:04/09/08 12:32
zahyou.txtの内容が

1   0   -1
1   1   0.5
・・・
・・・

(tabで区切られています)

のようになっていて、これが
p1(1,0,-1)
p2(1,1,0.5)
・・・
・・・

という座標を表しています。

このとき入力された基点から近い順に表示し、この結果を
kekka.txtに出力するプログラムを作成してください。

画面例
*基点の座標を入力してください
1
1
0
*基点から近い順に表示します
p2
p1
・・・
・・・

条件 zahyou.txtのデータの読み込みにfscanfを使用すること
>>746
コンパイルしてないのでフォローよろしく
1/2

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define PMAX1000
#define INFILE"zahyou.txt"
#define OUTFILE"kekka.txt"
#define norm(a)sqrt((a)->x*(a)->x+(a)->y*(a)->y+(a)->z*(a)->z)
typedef struct{
double x,y,z;
int n;
}P3D;
P3D base;
int cmp(void* a,void* b){
double na=fabs(norm((P3D*)a)-norm(&base));
double nb=fabs(norm((P3D*)b)-norm(&base));

return (na>nb)?1:(na==nb)?0:-1;
}
>>746
2/2

int main(){
P3D p3d[PMAX];
FILE* fp;
int i,ct=0;
fp=fopen(INFILE,"r");
while(feof(fp)){
fscanf("%lf\t%lf\t%lf",&(p3d[ct].x),&(p3d[ct].y),&(p3d[ct].z));
p3d[ct]=ct+1;
ct++;
}
fclose(fp);
printf("*基点の座標を入力してください\n");
scanf("%lf",&(base.x));
scanf("%lf",&(base.y));
scanf("%lf",&(base.z));
qsort(p3d,ct,sizeof(P3D),cmp);
printf("*基点から近い順に表示します\n");
fp=fopen(OUTFILE,"w");// 使い回ししてごめんな
for(i=0;i<ct;i++){
printf("p%d\n",p3d[i].n);
fprintf(fp,"p%d\n",p3d[i].n);
}
fclose(fp);
return 0;
}
> fscanf("%lf\t%lf\t%lf",&(p3d[ct].x),&(p3d[ct].y),&(p3d[ct].z));
fscanf("%lf %lf %lf",&(p3d[ct].x),&(p3d[ct].y),&(p3d[ct].z));
>>749
>(tabで区切られています)
>>750
それが何か?
>>751
(ごめん)
fscanf("%lf",&(p3d[ct].x));
fscanf("%lf",&(p3d[ct].y));
fscanf("%lf",&(p3d[ct].z));
第一引数 fp 忘れ
755デフォルトの名無しさん:04/09/08 16:10
   c言語入門です。
   unix solaris環境。
   
問 %sと等価なプログラムをputcharで実現せよ。(ヒント '\0'が文字列の終端)

  意味がわかりません。お願いします。
>>755
%sはプログラムではありません。
〜終了〜
757デフォルトの名無しさん:04/09/08 16:30
>>755
厳密には>>756が正解だけど、%sというのは文字列s[]を出力するのに
printf("%s", s);
とすることだと思うから、
int i;
for (i = 0; s[i] != '\0'; i++)
putchar(s[i]);
でOK!
putchar()は1文字出力関数で、putchar('a');とputchar('1');は
それぞれaと1を出力する。
>>755
出題者が何も理解してない糞とでも書いとけ
いつもそうなんだけど、
質問者は質問したい内容を正確に書いてくれ
760755:04/09/08 16:56
759>>
問題がこう書いてあったもので・・・。
出題者が不在でしてどうしようもなく書き込ませてもらいました。
すいませんでした。

>>755-759
ありがとうございます。
>>696
今月号のニュートン立ち読みしてみな
なんか初めのほうにある
小ネタをたくさん紹介してるページに書いてあった
>>749
"%lf%lf%lf"
Cの話です。
変数char ss[5000]にいっぱいいっぱいに平仮名片仮名が無作為に選ばれて入れられています。
この中から「ぬるぽ」「ぬるポ」「ぬルぽ」「ぬルポ」「ヌるぽ」「ヌるポ」「ヌルぽ」「ヌルポ」
という連続した小さな文字列を探したいのですが、その作業を関数にしたいんです。
丸投げだと思うようでしたら、せめてヒントでもいただければと思います。
お願いします。
764デフォルトの名無しさん:04/09/09 01:51
>>763
わざわざ関数を作らなくてもstrstrという関数が用意されているんだけど。
765エイティン:04/09/09 02:43
strstrは初耳です...しかもひらめきで麥なん作ってまいました...ぬるぽハケーン関数です。
#include <stdio.h>
int nulpo(char ss)
{
  int a,i,c;
  a = strlen(ss);
  c = 0;
   for(i=1;i<=a;i++)
   {
    if(ss[i]==("ぬ"||"ヌ"))
    {  ++i;
     if(ss[i]==("る"||"ル"))
     {  ++i;
      if(ss[i]==("ぽ"||"ぽ"))
      { c=c+1;}
     }
    }
   }
return c;
}

動きますか?
766エイティン:04/09/09 02:57
strstrは初耳です...しかもひらめきで麥なん作ってまいました...ぬるぽハケーン関数です。
#include <stdio.h>
int nulpo(char ss)
{
  int a,i,c;
  a = strlen(ss);
  c = 0;
   for(i=1;i<=a;i++)
   {
    if(ss[i]==("ぬ"||"ヌ"))
    {  ++i;
     if(ss[i]==("る"||"ル"))
     {  ++i;
      if(ss[i]==("ぽ"||"ぽ"))
      { c=c+1;}
     }
    }
   }
return c;
}

動きますか?
>>766
つっこむ気にもなれん
#include <stdio.h>
int nulpo(char ss);

int main(void)
{
  int a
  char ss[5000];
  gets(ss);
  a = nulpo(ss)
  printf("%d回、ガッ して下さい。",a)
return 0;
}

int nulpo(char ss)
{
  int a,i,c;
  a = strlen(ss);
  c = 0;
   for(i=1;i<=a;i++)
   {
    if(ss[i]==("ぬ"||"ヌ"))
    {  ++i;
     if(ss[i]==("る"||"ル"))
     {  ++i;
      if(ss[i]==("ぽ"||"ポ"))
      { c=c+1;}
     }
    }
   }
return c;
}
>>767に変わって、親切にもつっこんでやる。
1.動くかどうか分からないならまずはコンパイルしろ。そして動かしてみろ。コンパイラがなければフリーのものがあるからインストールしておけ。
2.「if(ss[i]==("ぬ"||"ヌ"))」 この1行だけでも突っ込み所が満載過ぎ。とりあえず2ヶ所に絞った。
2.1.|| 演算子で繋ぐのは条件の真偽だけだ。aが"ぬ"か"ヌ"であることを判断したい場合はif(a=="ぬ"||a=="ヌ")と書け。
2.2.ss[i]の型は分かってるのか?そして"ぬ"や"ヌ"の型は?答えを言ってやると前者がcharで、char*だ。違う型のものを比較して意味があることなんざ殆ど無い。
3.iのインクリメントは++i;としてるのにcのインクリメントをc=c+1;にする理由でもあるのか?というか、そもそも++i;よりi++;の方がメジャーじゃないのか?(後半は主観だが)

おとなしくstrstr使っとけ。
なんつーか、××と○○は紙一重という感じ。
その前にint nulpo(char ss)にワラタ。おい、1文字しか渡さないのか
己は。ただ、一箇所だけ擁護しておく。
>そもそも++i;よりi++;の方がメジャーじゃないのか?
その通り、それは主観だ。ここはC++(特にiterator)に慣れてくると
そうでもなくなる。
ありがとうございました。勉強しときます
time=1000,dt=0.1,nsteps=time/dtを
for(i=0; i<nsteps; i++){}で回しているのですが、
iを均等に回すのではなく、最初と最後だけより細かく(例えば0.01刻みで)、
中間をすっとばす方法を教えてください。
774デフォルトの名無しさん:04/09/09 09:34
宿題を代わりに片して下さい!

アルファベットで単語、読み方、単語の意味をファイルに書き込み&読み込みが
できる単語登録プログラムを完成せよ。ただし、クラスを使い作成せよ。さらに、
他に上記のような機能に+αする事により、点数をつける。

てな、感じのプログラムをお願いします☆ファイルに書き込む形式は自由で、↑に書いている事以外に
追加したら、点数が高くなるんで、もし、他にこんな機能があれば便利ってのがあれば、追加お願いします!
>>773
double time;
for (time = 0; time < 200; time += 0.01);
for (; time < 800; time += 0.1);
for (; time < 1000; time += 0.01);
#但し加算の精度に注意。

或いはこっちの方が元のに近いかな。
double time;
unsigned it;
double dt = 0.01;
for (it = 0; it < 200 / dt; ++it) time = it * dt;
for (it < 800 / dt; it += 10) time = it * dt;
for (it < 1000 / dt; ++it) time = it * dt;
776773:04/09/09 10:04
>>775
y=a+5*xという式の場合、
for (it = 0; it < 200 / dt; ++it) {
 a+5*x;}
for (it < 800 / dt; it += 10){
 a+5*x;}
for (it < 1000 / dt; ++it){
 a+5*x;}
でいいんですか?
>>651>>764とは条件の異なる同種の問題
入力された2つの数字から、四則演算をする関数を作る。但し、自動変数は使用しないで
関数の引数も使わないで作れです。
お願いします
779デフォルトの名無しさん:04/09/09 11:42
↑あっすいません778はC++です。よろしくおねがいします
関数の引数を使っちゃダメならそもそも出力の仕方が分からん。
>>774 単語の検索機能だけ付けた。
#define DELIM '\t'
struct data{ string tango, yomi, imi; };
class dictionary{
protected: list<data> m_data;
public:
  void add(data &d){ m_data.push_back(d); }
  bool read(const char *file){
  fstream f(file, ios::in);
    if(f.fail()){ return false; } m_data.clear();
    data d;
    while(!f.eof()){
      getline(f, d.tango, DELIM); getline(f, d.yomi, DELIM); getline(f, d.imi, DELIM); m_data.push_back(d);
    }
    f.close(); return true;
  }
  bool write(const char *file){
  fstream f(file, ios::out);
    if(f.fail()){ return false; }
    for(list<data>::iterator i = m_data.begin(); i != m_data.end(); ++i)
      f << i->tango << DELIM << i->yomi << DELIM << i->imi << DELIM;
    f.close(); return true;
  }
  void show(void){
    for(list<data>::iterator i = m_data.begin(); i != m_data.end(); ++i)
      cout << "単語:" << i->tango << "\n" << "読み:" << i->yomi << "\n" << "意味:" << i->imi << "\n" << endl;
  }
  list<data>::iterator find(string tango){
    for(list<data>::iterator i = m_data.begin(); i != m_data.end(); ++i){ if(i->tango == tango){ return i; } }
    return NULL;
  }
};
入力された2つの数字から、四則演算をする関数を作ってください。
但し、自動変数(auto変数)は、一切使用しないで下さい。
 入力した2つの数字に対して、選択した演算の結果が表示されます。
2つの数字のうち、いずれかに0を入力するとプログラムは終了します。
 但し、上記で述べたように、自動変数を使用しないで、作成してください。
出来れば、関数の引数もなくして、
 ret = func1() ;
のような形式で呼び出すようにしてください
ってなもんだいです 。
よく意味が自分もわかんないんですけど、わかりますか?
グローバル変数を使えってことかな?
なんか出題者がダメポ
>>774
こんな感じ。メモ帳だけで作ってコンパイルしてないから
動かない可能性大。適宜修正してちょ。
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1060403548&res=116&fi=no
#include<stdio.h>

func1( int a, int b, int c )
{

intresult ;// 計算結果−戻り値 *使用不可

/* 0演算は何? */
switch( c )
{
case '1' :// 加算
result = a + b ;
break ;
case '2' :// 減算
result = a - b ;
break ;
case '3' :// 乗算
result = a * b ;
break ;
case '4' :// 除算
result = a / b ;
break ;
case '5' :// 剰余算
result = a % b ;
break ;
}
/* 戻り値をセット */
return( result ) ;

}
>>782 こんな感じかなぁ。なんの意味があるのか。。。
#include <iostream>

int a, b, m;

void func(void)
{
switch(m){
case 0: cout << a << " + " << b << " = " << a + b << endl; break;
case 1: cout << a << " - " << b << " = " << a - b << endl; break;
case 2: cout << a << " * " << b << " = " << a * b << endl; break;
case 3: cout << a << " / " << b << " = " << a / b << endl; break;
};
}
int main(void)
{
cin >> a >> b >> m;
cout << endl;
if(a && b){ func(); }
return 0;
}
#include<stdio.h>
#include<stdlib.h>
/* func1関数プロトタイプ宣言 */
extern int func1( int a, int b, int c ) ;// *必要に応じて変更
void main(void)
{
inta,b ;// 数値 *使用不可
intc ;// getchar()戻り値 *使用不可
intret ;// func()戻り値 *使用不可
for( ; ; )// 無限ループ a,bどちらかに0が入力されたら抜けます
{
printf("数値1を入力してください。:") ;// 数値取り込み
scanf("%d",&a) ;
printf("数値2を入力してください。:") ;// 数値取り込み
scanf("%d",&b) ;
/* ループを抜ける条件(0の入力)の判定 */
if( a == 0 || b == 0)
{
printf("ループを抜けます!\n\n") ;
break ;
}
/* 何の演算をする? */
printf("演算は何? 1:加算 2:減算 3:乗算 4:除算 5:剰余算 ") ;
c = getchar() ;
c = getchar() ;
if( c > 1 && c < 5 )
{printf("1〜5以外の数字は無効です。\n") ;
continue ;}
/* func1()実行 */ // *できれば呼出形式を変更
ret = func1( a, b, c ) ;
/* 戻り値表示 */
switch( c )
{
case '1' :
printf("計算は、加算です。\n") ;
break ;
case '2' :
printf("計算は、減算です。\n") ;
break ;
case '3' :
printf("計算は、乗算です。\n") ;
break ;
case '4' :
printf("計算は、除算です。\n") ;
break ;
case '5' :
printf("計算は、剰余算です。\n") ;
break ;
}
printf("結果は %d です!!!\n\n", ret) ;
を変えるみたいです。すいませんぜんぜんわかんなくて
>>786
わかりますか?
>>761
なるほどぬーとんに載ってたのかthx
>>789
func1( int a, int b, int c )
のパラメータ a, b, cと戻り値格納用変数をグローバルにしる!
792791:04/09/09 12:29
× 戻り値格納用変数
○ 結果保存用変数
ありがとうございます、変な説明ですいませんでした。
エラーになちゃいました。
回答載せてくれるとすごくたすかるんですが・・
無理ですかね?
795デフォルトの名無しさん:04/09/09 12:54
今日中に提出なんで誰かおねがいしますorz
だれが、どの問題で、どんなエラーが出てるのか
訳分からん
797デフォルトの名無しさん:04/09/09 13:00
728です。
798デフォルトの名無しさん:04/09/09 13:00
>>781>>784
ありがとうございました☆
感謝です!
#include<stdio.h>
#include<stdlib.h>

int r, a, b, c;

void func1()
{
/* 0演算は何? */
switch( c )
{
case '1' :// 加算
r = a + b ;
break ;
case '2' :// 減算
r = a - b ;
break ;
case '3' :// 乗算
r = a * b ;
break ;
case '4' :// 除算
r = a / b ;
break ;
case '5' :// 剰余算
r = a % b ;
break ;
}
}
void main(void)
{
for( ; ; )// 無限ループ a,bどちらかに0が入力されたら抜けます
{
printf("数値1を入力してください。:") ;// 数値取り込み
scanf("%d",&a) ;
printf("数値2を入力してください。:") ;// 数値取り込み
scanf("%d",&b) ;
/* ループを抜ける条件(0の入力)の判定 */
if( a == 0 || b == 0){printf("ループを抜けます!\n\n") ; break ;}
/* 何の演算をする? */
printf("演算は何? 1:加算 2:減算 3:乗算 4:除算 5:剰余算 ") ;
c = getchar() ;
c = getchar() ;
if( c > 1 && c < 5 ){printf("1〜5以外の数字は無効です。\n"); continue ;}
/* func1()実行 */ // *できれば呼出形式を変更
func1() ;
/* 戻り値表示 */
switch( c ){
case '1' : printf("計算は、加算です。\n") ; break ;
case '2' : printf("計算は、減算です。\n") ; break ;
case '3' : printf("計算は、乗算です。\n") ; break ;
case '4' : printf("計算は、除算です。\n") ; break ;
case '5' : printf("計算は、剰余算です。\n") ; break ;
}
printf("結果は %d です!!!\n\n", r) ;

}
}
801デフォルトの名無しさん:04/09/09 13:17
>>800
これでなるんですか?
>>801
コンパイルしてみなはれ。
803デフォルトの名無しさん:04/09/09 13:26
main.cpp(32) : error C2065: 'b' : 定義されていない識別子です。
main.cpp(37) : error C2065: 'c' : 定義されていない識別子です。
main.cpp(37) : error C2065: 'getchar' : 定義されていない識別子です。
main.cpp(41) : error C2065: 'func1' : 定義されていない識別子です。
main.cpp(50) : error C2065: 'r' : 定義されていない識別子です。
の実行エラー
main.obj - エラー 8、警告 0
ってでました。
>>803
799-800を全部コピペしてコンパイルしる!
805デフォルトの名無しさん:04/09/09 13:33
mainとfunc1()をわけないでってコンパイルってことですか?
>>805
まず、799にあるソースを自分の開発環境のエディタにコピペする。
次に、800にあるソースをさっきコピペした799のソースの下にコピペする。
そしてコンパイルしろ。
あ、できました。806ネ申さんありがとうございますた。
いやながながすいませんでした。
これでなんとかなりそうです感謝×2
808デフォルトの名無しさん:04/09/09 13:46
続き
int main()
{
  try{
    while((cin>>n>>c>>m)&&m) Do();
  }catch(int){
    cerr<<"四則演算エラー"<<endl;
  }
  return 0;
}
809デフォルトの名無しさん:04/09/09 13:47
失敗した。
>>807
C++じゃなかっけ
#include <iostream>
#define MAKE(x, y, mark) cout<<((x)mark(y))<<endl;

int n,m;
char c;
void Do()
{
  switch(c){
  case '*':
    MAKE(n,m,*) break;
  case '+':
    MAKE(n,m,+) break;
  case '-':
    MAKE(n,m,-) break;
  case '/':
    MAKE(n,m,/) break;
  default :
    throw -1;
  }
}
まだあるんですか?
C++ですよ
812806:04/09/09 14:00
>>811
多分、>>785のソースを改変して実現しろという事だったんでは?
質問者自体C/C++の違いがよくわかってないと思うので、
>>779の発言の意味は特にないと思う。
そうですねわかってないです。
>>785>>787>>788を改変してやってほしかったです。
814デフォルトの名無しさん:04/09/09 17:04
問 エノン関数を計算して、グラフを描写するプログラムを作ってください。
写像のことだろ。
質問の仕方からしてメンドーになりそうなのでスルー。
817814:04/09/09 17:37
エノン写像の間違いでした
818814:04/09/09 17:41
写像のことでした。すいません。
>>818
ちょっと待っててね
4 点の空間座標すべてに接する球体の中心座標を求める関数 Function を作成せよ。
ただし以下の定義を使用する事。

typedef struct {
double dX;
double dY;
double dZ;
} COORDINATES;

// 2 点以上の座標が一致した場合、または 4 点全てが平面上に存在する場合は FALSE を返す。それ以外は TRUE を返す。
// ans ... 中心座標用ポインタ
// quest ... 4 点の空間座標用ポインタ
int Function( COORDINATES *ans, COORDINATES *quest );

int main( void )
{
// 座標定義(値は可変するものとする)
COORDINATES Coord[] = {
{ 15.0, 7.0, 16.0 },
{ 8.0, -9.0, 1.0 },
{ 16.0, 6.0, -8.0 },
{ 24.0, 0.0, 8.0 }
};
// 関数 Function を使用
// 結果を表示
return 0;
}

よろしく御願いします。
821784:04/09/09 18:48
823デフォルトの名無しさん:04/09/09 19:21
教えて下さい!
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1094724836&res=1

このプログラムで、bool Input(Node* pNode)の所で、わからないのです。
エラーは出ないのですが、永遠とReferecne関数の所で、ポインタがNULLになって?
全然進まなかったんですが、bool Input(Node* pNode)をbool Input(Node*& pNode)
とすることで、問題は解決しました。ですが、なぜ”&”をつける事で、解決したのかが
わかりません。
どなたか教えて下さい!お願いします☆
いやです☆
825デフォルトの名無しさん:04/09/10 00:00
>>824
マジで教えてもらえませんか?
自分でも調べてみたんですが、本当にわからないんです。
お願いします。
826デフォルトの名無しさん:04/09/10 01:07
C++で分裂弾のプログラムを作っているのですが
発射した弾を消して3WAY弾を表示させるにはどうすればいいですか?
分裂弾とか3way弾とか言われても解からない
>>827
シューティングゲームで、
まず直線状に弾が飛んでいき、その後何らかの条件(一定時間経過とか)が成立すると、
斜め左・まっすぐ・斜め右の3方向に分かれて弾が飛んでいくということだろう。
たぶん。


>>826
if(分裂条件)
{
  Make3wayBrid(直線弾のx座標, 直線弾のy座標);
  Destroy(直線弾);
}
想像で語るな
ごめん。
すいません
質問の仕方が悪すぎました
キャラクターが現在向いている方向に弾を発射して一定距離進むと
斜め左・真っ直ぐ・斜め右の3方向に分かれて飛んでいくプログラムで
一定距離進んだ弾を消して3方向に弾を飛ばすにはどうすればいいか
というものです
ご迷惑お掛けしました
よっしゃ、予想的中っ!(喜ぶな)
>>831
それなんていう宿題?
それ板違うゲ製へ
もしかしてデータの管理方法もアホなやりかたなんじゃないか
行き当たりばったりで作ってると後で苦労するから
最初に構造とかある程度全体を頭の中に思い浮かべてから
作り始めるといいよ
キャクタの削除とか生成は必ず出てくるものなんだから特にね
835814:04/09/10 13:12
>>822さん、ありがとうございます。
そして、説明不足でした。ごめんなさい。
C言語でエノン写像を計算して、DOSの画面にグラフを描写するプログラムを
お願いしたかったのです。
>>814
unsigned char** image で格納されてるんだからどうにでもなるだろ
あと、日本でDOSっていうとおっさんはA800hを思い浮かべるけどそっちでいいの?
837デフォルトの名無しさん:04/09/10 14:42:58
age
838デフォルトの名無しさん:04/09/10 14:47:21
DEF SEG=&HA800
839デフォルトの名無しさん:04/09/10 15:31:23
Cで次の仕様を満たす信号発生プログラムを作成したいんですが。
どんなプログラムをくめばいいでしょうか?

基本式V=Asin(2πft)
V=電圧、A=振幅、π=円周率、f=周波数、t=時間

正弦波と方形波を選択可能
周波数と振幅を入力可能(周波数は0〜10M振幅は0〜10)
出力(信号波形データを)ファイルにセーブする(一列目時間二列目電圧値

以上です。
よろしくお願いします。
840keita:04/09/10 16:08:35
ヒストグラムを作るプログラムが完成しません。お願いします。1000 以下の素数が格納されているデータファイル prm1000.dat を読み込み素数の度数分布表を作成したいと思っています。作ったプログラムが下にあるものです。
#include <stdio.h>
#define N 50
int main( int argc, char *argv[] ) {
FILE *fp;
char *datafile;
int i, j, width, prime, count[N];
/* error*/    
if ( argc != 2 ) { printf( "error : Invalid Usage\n" );
exit( 1 );}
datafile = argv[1];
if ( ( fp = fopen( datafile, "r" ) ) == NULL ) {
printf( "error : can't open %s\n", datafile );
exit( 1 );}
/* initialize*/    
for ( i = 0; i < N; i++ ) count[i] = 0;
printf( "Enter the width => " );
scanf( "%d", &width );
/* read and count*/
j = 1;
while ( fscanf( fp, "%d", &prime ) != EOF ){ if ( prime < width * j )
count[j]++;
else
count[++j]++;}
fclose( fp );
putchar( '\n' );
for ( i = 1; i <= j; i++ )
printf( "%5d 〜 %5d : %3d\n", width*(i-1), width*i-1, count[i] );
exit(0); }
作ったプログラムをコンパイル実行するとerror : Invalid Usageと出てしまいます。
このプログラムのどこに何を足したら完成できるか教えてください。お願いします
841デフォルトの名無しさん:04/09/10 16:08:55
>>839
よくわからんが、こんな感じ?
int main(){
double V,A,f,t;
//基本式V=Asin(2πft)
//V=電圧、A=振幅、π=円周率、f=周波数、t=時間
A = 1;
f = 10;
for( t = 0; t <= 59; t++)
{
V = A * (sin( 2.0 * M_PI * f * t * (M_PI / 180.0)) * 180.0 / M_PI);
printf("%f,%f\n",t,V);
}
return 0;
}
842デフォルトの名無しさん:04/09/10 16:15:07
>>840
そのプログラムはあなたが作ったもの?
そうであれば何故メッセージが出てるのかわかるのでは。
843デフォルトの名無しさん:04/09/10 16:18:27
>>840
prgname.exe prm1000.dat
ってすれば・・・
844デフォルトの名無しさん:04/09/10 16:31:34
>>841
方形波か正弦波かを選べて
振幅と周波数を入力する画面があって入力するととその信号の計算結果が出て
その結果をファイルにセーブして
発生した信号波形を図に書くのが目的っす
みなおしたらいろいろわかりにくかったかな
V=A*sin(2*π*f*t)
周波数は0〜1000000振幅は0〜10.0
結果は2周期分くらいでるようにすればいいと思うんです。
845デフォルトの名無しさん:04/09/10 16:37:25
>V=A*sin(2*π*f*t)
これが勘違いの元。細かいのを作ってるからもうちょっと待ちな。
846デフォルトの名無しさん:04/09/10 17:02:29
VBで正五角形を中心を軸に回転させるプログラムを教えてください
847デフォルトの名無しさん:04/09/10 17:04:09
スレタイ読め
848デフォルトの名無しさん:04/09/10 17:05:26
>>846
カレー専門店で寿司を注文するような事をするな
849デフォルトの名無しさん:04/09/10 17:05:53
>>839=844
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1064150088&res=220
実行ファイルの後ろにデータ保存用のファイル名を書けばそこに記録される…はず。
何故か手元のgccでコンパイル通ってくれなかった…。
850846:04/09/10 17:10:29
こりゃー一本とられましたわ。
851デフォルトの名無しさん:04/09/10 17:11:12
波形はどれにしますか?番号で選んで下さい。
1.方形波
2.正弦波
ってでたあと2を打ってENTERおしても反応しないんですが
どうすればいいのでしょうか・・?
852デフォルトの名無しさん:04/09/10 17:16:40
度とラジアンがまったく考慮されてないような
853デフォルトの名無しさん:04/09/10 17:17:45
ごめん、
>while(0 < style && style < 3);
ここがミス。
while(style < 1 || 2 < style);
に変更してて。
854デフォルトの名無しさん:04/09/10 17:22:44
>>853
おおなおしたらいけました。
あのよろしければ実行ファイルの後ろにデータ保存用のファイル名を書けばそこに記録される
っていうのは具体的にどうするのか教えてもらえないでしょうか?
855デフォルトの名無しさん:04/09/10 17:25:48
コンパイル後できた実行ファイルが a.out で、wave.dat に記録したければ
a.out wave.dat
a.out > wave.dat
どちらでも可。
856デフォルトの名無しさん:04/09/10 17:34:12
>>854
追記モードは"w"を"a"に
または
a.out >> wave.dat
857デフォルトの名無しさん:04/09/10 17:38:45
ふ・・む・・
私の知識不足でごめんなさいよくわからないです・・
コンパイル後実行したあとa.outというファイルができるのでしょうか・・?
858デフォルトの名無しさん:04/09/10 17:42:59
>>857
このスレの回答者は主にLinux環境を基準としています。
ですから、a.outというのを自分の環境でのコンパイラの出力した実行ファイル
だと読みかえてください。
859デフォルトの名無しさん:04/09/10 17:46:23
なるほど
メモ帳かなにかに結果を記録するにはどうすればいいんでしょうか?
860デフォルトの名無しさん:04/09/10 17:47:37
>>859
なんだそりゃ
できたファイルをメモ帖でひらけよ・・・
861デフォルトの名無しさん:04/09/10 17:50:36
なるほどー
どうもありがとうございました。
お世話になりました。
いろいろ迷惑かけてすみませんでした。
本当にありがとうございました。
862デフォルトの名無しさん:04/09/10 19:26:30
自分の脳みそをちっと使えば分かりそうなもんなのに
何ですぐ人に聞くかな?
863デフォルトの名無しさん:04/09/10 19:48:08
よし、やるぞー! ふんっ!ふんっ! はやく質問こないかなー
864デフォルトの名無しさん:04/09/10 19:48:44
使い方を知らないからだろ
865デフォルトの名無しさん:04/09/10 20:35:41
.NETでDLLを作っているんだけど、下のコードでリンクエラーが生じてまつ。

// DLL
#include <stdio.h>

__declspec(dllexport) int func(void);

int func(void)
{
printf("inside of the DLL");
return 0;
}

//EXE
#include <iostream.h>

extern __declspec(dllimport) int func(void);

int main(void)
{
int a;
a = func();
cout << a << endl;
return 0;
}

DLLはプロジェクトの新規作成→DLL→空のプロジェクトと作成してるんだけど
どうしてもリンクエラー
ource02.obj : error LNK2019: 未解決の外部シンボル "__declspec(dllimport) int __cdecl func(void)" (__imp_?func@@YAHXZ) が関数 _main で参照されました。
Debug/neko101a.exe : fatal error LNK1120: 外部参照 1 が未解決です。
がでるのでつ。
一体どうすれば・・・・。
866デフォルトの名無しさん:04/09/10 22:26:43
>>865
それは宿題かね?
867865:04/09/10 22:35:33
extern __declspec(dllimport) int __cdecl func(void);
と__cdeclつけたらできまんた。
868デフォルトの名無しさん:04/09/11 14:31:37
Cの課題です。

コマンドライン引数で指定された文字列の英大文字を英小文字に、英小文字を英大文字にし
それ以外の文字はそのままで出力するプログラムを作成。
正し、コマンドライン引数が指定されなかった場合はエラーを出力し、二つ以上指定された場合は二つ目以降を無視する。

お願いします。
869デフォルトの名無しさん:04/09/11 14:46:18
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

int main(const int argc, char **const argv)
{
    const char *str;
    if(argc == 1)
    {
        fprintf(stderr, "error: an argument is required.");
        exit(1);
    }
    for(str = argv[1]; *str; ++str)
        if(isupper(*str)) putchar(tolower(*str));
        else putchar(toupper(*str));
    return 0;
}
870デフォルトの名無しさん:04/09/11 14:51:02
>>868
#include <stdio.h>
#include <ctype.h>

int main( int argc, char** argv ) {
int i;
char* str;

if ( argc < 2 ) {
fprintf( stderr, "えらー");
exit(1);
}
str = argv[1];
while ( *str != '\0' ) {
printf( "%c", islower(*str)?toupper(*str):isupper(*str)?tolower(*str):*str );
str++;
}
printf("\n");
return 0;
}
871デフォルトの名無しさん:04/09/11 14:53:40
>>870
hoge.c: 関数 `main' 内:
hoge.c:10: 警告: implicit declaration of function `exit'
hoge.c:5: 警告: unused variable `i'
872デフォルトの名無しさん:04/09/11 14:58:17
>>871
stdlib.hをinclude
int i;を削除
873868:04/09/11 15:30:00
ありがとうございます
874デフォルトの名無しさん:04/09/11 16:09:14
char OutputChar[3];
char SmallChar[] = "ぁぃぅぇぉっゃゅょゎァィゥェォッャュョヮ";

これでOutputCharに入っている文字がSmallCharと等しいか
判定するにはどうすればよいでしょう?
文字が等しいか判定するにはstrcmpで良いらしいのですが,
SmallCharの中の1文字と比較する方法がわかりませんでした.
875デフォルトの名無しさん:04/09/11 16:12:32
876デフォルトの名無しさん:04/09/11 16:16:05
>>874
strstr関数をしらべれ
877デフォルトの名無しさん:04/09/11 17:47:12
>>874
876の言うようにstrstrを使うか、
strncmpを使う
どうでもいいけど、ヵとヶが足りない
878デフォルトの名無しさん:04/09/11 17:51:36
第2バイトから比較してしまう可能性があるからstrstr()は使わないほうが無難。

bool isSmall(const char * OutputChar)
{
char SmallChar[] = "ぁぃぅぇぉっゃゅょゎァィゥェォッャュョヮ";

for (const char * psc = SmallChar; psc[0] != '\0'; psc += 2) {
if (OutputChar[0] == psc[0] && OutputChar[1] == psc[1]) {
return true;
}
}
return false;
}
879デフォルトの名無しさん:04/09/11 17:52:26
>>874
おいおい、smallcharの1文字っつてるだろ。
==でいんでないのか?
880デフォルトの名無しさん:04/09/11 18:07:34
define CHAR_BIT 16
881デフォルトの名無しさん:04/09/11 18:59:12
_mbsstr()なら平気じゃない?
882デフォルトの名無しさん:04/09/12 10:23:56
こんにちわ、はじめまして。
i=虚数 i*i=-1 π=円周率
ω=2*π*f
Z=(R+i*ω*L)/(1+i*ω*R*C-ω*ω*L*C)

L=0.001  C=0.0001としRについては0.1〜10.0の範囲で変化させ
Zの絶対値が最大になる周波数fを求める
出た結果をdata.txtというメモ帳ファイルにセーブする
(1列目抵抗2列目Zの絶対値3列目fの最大値)

またRが1と2と5の場合について
周波数fとZの絶対値の変化をおなじdate.txtにさっきの結果のあとにセーブする
(1列目R2列目f3列目Z)

というプログラムをCで作るという課題です
ツールはborlandのコンパイラでCpadという開発環境でやっています。

どなたかよろしくお願いします。
883デフォルトの名無しさん:04/09/12 11:13:23
fの最大値の求め方がわからねーから僕にはできませんon_
ヒントくれー
884883:04/09/12 11:19:23
あっ相加相乗平均でできそーなきがしてきた
885882:04/09/12 11:23:33
すみません私にもわからないっす・・
886883:04/09/12 11:35:00
ω=(-R*C+sqrt( (R*C)^2+4*R*C ) )/2*R*C

まちがってたらやさしく指摘してね!
でかけるからコード書くのは午後になりそー
887デフォルトの名無しさん:04/09/12 11:39:42
ガイキチが同時に2人沸いた
888デフォルトの名無しさん:04/09/12 11:41:42
>>887
ガイキチではなく、低能です。
889882:04/09/12 11:57:53
すみません・・・低脳です・・
どなたかよろしくお願いします。
890デフォルトの名無しさん:04/09/12 11:59:42
C言語でfloat,doubleのオーバーフローの判定をどうすればいいかわかりません。
どんな環境でも判定できるような方法はありますか?
ご存知の方よろしくお願いします。

891デフォルトの名無しさん:04/09/12 12:37:22
>882-886
そもそも、最大値を数値計算で求めるのが課題ではなくて?
892882:04/09/12 12:50:22
>(1列目抵抗2列目Zの絶対値3列目fの最大値)

の文が間違ってましたただしくは
(1列目 抵抗 2列目 最大になったときのZの絶対値 3列目 Zが最大値になったときのf)

>>891
はい、前半はRを変化させてそれぞれのZが最大値になるfを求めるのが目的です
後半はRが1と2と5の場合においてfを変化させてfとZの絶対値の関係を調べるのが目的です
周波数の最大値も書き忘れました・・・0〜1000000です。
893デフォルトの名無しさん:04/09/12 13:07:11
>>890
float.hあたりしらべてYO。
float : FLT_MIN<X<FLT_MAX
double : DBL_MIN<X<DBL_MAX
894デフォルトの名無しさん:04/09/12 13:12:50
いやね、886でなんか式かいてるけど、そういう解析的な手法じゃなくて、
数値計算で最大最小問題を解くのが主題じゃないのかなぁと思ったんだけど。
895デフォルトの名無しさん:04/09/12 13:20:31
まあ電気回路の演習でプログラミングに重きをおいていないのか、
数値計算(プログラミング演習)で、たまたま電気回路の問題を
解いてるのか、はっきりしないのでそこんとこよろしく
896882:04/09/12 13:32:06
>>892
また間違えてた
>(1列目 抵抗 2列目 最大になったときのZの絶対値 3列目 Zが最大値になったときのf)

は(1列目 R 2列目 最大になったときのZの絶対値 3列目 Zが最大値になったときのf)
です。
>>894-895
プログラミングの授業で電気回路の問題がでたのほうだと思います。
メインはプログラムです。
897デフォルトの名無しさん:04/09/12 13:32:35
プログラミングの課題に手計算でとけるような問題は出さないだろう
898デフォルトの名無しさん:04/09/12 13:41:09
>>897
手計算で解ける問題をプログラムで確認する
という問題なのかもしれない。
899882:04/09/12 13:55:34
前半はRを0.1から0.1から0.1ずつ10.0まで変化させて
変化させるごとに周波数0〜1000000まで変えてZの最大値を求めるので
て計算ではつらいかもです。
後半もRが1と2と5のときにfとZの絶対値の関係を求めてグラフにするので
て計算ではつらいかもしれないです。
900 ◆FIcNi4f8js :04/09/12 13:59:37
>>897
なんで?
901883:04/09/12 18:33:27
じゃじゃじゃじゃーんガイキチ登場
えっとやっぱ周波数の領域があったんですね!
あとだしはだめよ
ということで解析的に解くな!ということか
では今からやってみっかなー
できなかったらごめんねw>>882

902デフォルトの名無しさん:04/09/12 19:40:34
>>>882さん
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1064150088&res=221
こんなんできましたが、結果がとってもあやしーですw
ほかの方の検証求む!
903デフォルトの名無しさん:04/09/12 20:06:36
俺にはわからんからあげてやろう
904デフォルトの名無しさん:04/09/12 20:24:17
>>902
1Hzきざみ?
結果が荒すぎる気がする
905デフォルトの名無しさん:04/09/12 20:54:00
レス遅れてすみません。
どうもありがとうございます

結果が5.0でとまってしまっているのは
私だけでしょうか・・・?
906902:04/09/12 21:34:18
>結果が5.0でとまってしまっているのは

あー俺もそうだよ。。
その意味で結果がとってもあやしーとかきました。
んで解決方法ですが・・すいませんわかりませんon_
907デフォルトの名無しさん:04/09/12 23:45:45
ttp://ime.sakura.ne.jp/cgibin/source/subupload.cgi/ime0005.bmp
c=0.0000001
R=1000
E=5
初期値x(0)=0
で上の画像の方形波3周期分をあたえたときにでる
Vrを求めるのが目的で
x=∫idt
x'=(-1/c*r)*x+(1/r)*e(t)
Vr=(-1/c)*x+e(t)
(x'はxを微分したもの)
この式をオイラー法で解くんですが
周期Tは0.00005と0.001の2つから選べるようにするんです
結果は時刻tとe(t)とVrが出るようにするんですが
どんなプログラムを組めばよろしいでしょうか?
どんなプログラムを書けばよろしいですか
908デフォルトの名無しさん:04/09/12 23:50:14
ttp://ch.minidns.net/bbs/src/1095000557295.bmp
リンクをクリックしても画像が表示されませんでしたので変えました。
909デフォルトの名無しさん:04/09/13 00:02:34
>>906
いえそんなあやまれても
ありがとうございました

>>882
>>892
>>896
>>899
どなたかこの問題を解いていただけませんでしょうか
よろしくお願いします。
910デフォルトの名無しさん:04/09/13 00:03:42
>>906
とても感謝してます
どうもでした。
911902:04/09/13 01:14:25
Z=(R+jωL)/(1-ω^2LC+jωRC)

|Z|=sqrt(R^2+(ωL)^2) /sqrt( (1-ω^2LC)^2 +(ωRC)^2 )

んで左辺の分母分子を sqrt(R^2+(ωL)^2) でわる。
そしてむりやり分母に正の項をつくる。
そんでそこに相加相乗平均を使うと
(1-ω^2LC)^2=(ωRC)^2
ってのが分母最小値つまり|Z|の最大値となる。
ってことを利用してやったらさLCで割るってのが効いてくるのか0になりますね。

すいませんどうでもよい解析的手法でした。
912デフォルトの名無しさん:04/09/13 05:52:53
さがってしまったので必死にあげ
どなたかよろしくお願いします。
913デフォルトの名無しさん:04/09/13 08:19:43
二つの正の整数m,nをキーボードから入力し、
mからnまでの和を求めるプログラムをつくりなさい。
ただし、m<nとすること
というプログラムはどう作れば良いんですか?
914デフォルトの名無しさん:04/09/13 08:33:18
>>913

#include <stdio.h>

int main(void){
int i;
int m, n;
int sum = 0;

scanf("%d", &m);
scanf("%d", &n);

for(i=m;i<n+1;i++)
sum += i;

printf("合計 .. %d \n", sum);

return 0;
}

915デフォルトの名無しさん:04/09/13 08:36:23
激しく概出
916デフォルトの名無しさん:04/09/13 09:43:39
>>913
こっちのほうがm<nをみたすまでループしてbetter

#include <stdio.h>

int main(void){
int i;
int m, n;
int sum = 0;

do{
printf("Input m &n (m<n)\n");
printf("Input m:");scanf("%d", &m);
printf("Input n:");scanf("%d", &n);
}while(m>n);

for(i=m;i<n+1;i++)
sum += i;

printf("合計 .. %d \n", sum);

return 0;
}
917デフォルトの名無しさん:04/09/13 13:44:44
#define sum(n,m) (((m)+(n))*((m)-(n)+1)/2)

しゅくだいまだー?
918907:04/09/13 13:50:14
>>907-908

どなたかお願いしますー
ぜんぜんわかんないす・・
919デフォルトの名無しさん:04/09/13 13:57:12
>>907 画像がねえな
920デフォルトの名無しさん:04/09/13 13:58:19
>>908のほうはどうですか?
921デフォルトの名無しさん:04/09/13 14:31:26
>>907 わかんねえxがでかくなりすぎる… 後誰かよろしく
#include <stdio.h>
double e(double t,double T,double E)
{
for(;t-T>0;t-=T);
return (t*2>=T)?0:E;
}
#define dt10
int main()
{
double T[]={0.00005,0.001};
double c=0.0000001;
double r=1000;
double E=5;
double x=0;
double t,h,et,Vr;
int ts;// T[ts];

printf("0.00005なら'1' 0.001なら'2' を入力>");
do{
scanf("%d",&ts);
}while(ts!=0&&ts!=1);
h=T[ts]/dt;
for(t=0.0;t<T[ts]*3;t+=h){
et=e(t,T[ts],E);
x+=((-1/c*r)*x+(1/r)*et)*h;
Vr=(-1/c)*x+et;
printf("t=%f , e(t)=%f , Vr=%f\n",t,et,Vr);
}
return 0;
}
922デフォルトの名無しさん:04/09/13 14:40:12
エラー E2451 aaa.cpp 22: 未定義のシンボル dt(関数 main() )

というエラーがでたっす
923デフォルトの名無しさん:04/09/13 14:41:39
タブが消えたからだな↓こう
#define dt 10
924デフォルトの名無しさん:04/09/13 14:52:19
うむむたしかにすごい数になるっすね
どうもありがとうございました。

みなさんでもむずかしいのにどうしよう・・・
925デフォルトの名無しさん:04/09/13 14:55:07
まずオイラー法について書かないと>>907
926デフォルトの名無しさん:04/09/13 14:56:24
といいいますと・・・?
927デフォルトの名無しさん:04/09/13 15:05:23
>>925
中卒プログラマはこれだから(ry
928デフォルトの名無しさん:04/09/13 15:07:05
すいませんこのようなプログラムを作ったのですがいろいろいじっても動かないのです。
#include <stdio.h>

void main()
{
FILE *fp;
char str;

fp=fopen("test.txt","r");

if(fp==NULL){
printf("ファイルのオープンに失敗しました。\n");
}
else
{
while (feof(fp)!=0)
{
fscanf(fp,"%s",str);
printf(str);
}
}
}
feofはEOFになると0を返すようなので返さない間ファイルを読んで表示させたいのですが
何も表示されませんでした。
どなたかご教授願います・・
929デフォルトの名無しさん:04/09/13 15:08:11
あ、すいません半角スペースは消えてしまうのを忘れていました見づらくて申し訳ありません。
930デフォルトの名無しさん:04/09/13 15:09:30
>>927
>>1

>>928
逆。 while(feof(fp)==0){
931デフォルトの名無しさん:04/09/13 15:13:03
>>928
char型の値を読み込むときは%cを使え。%sはcharへのポインタを渡す必要がある。
たぶんやりたいのはこうだと思う。
while (feof(fp) != 0)
{
  fscanf(fp, "%c", str);
  printf("%c", str);
}
だけどただ単に1文字ずつ読み込んで表示したいのなら、fscanf/printfよりもfgetc/putcharの方がいい。
932デフォルトの名無しさん:04/09/13 15:25:08
930 _| ̄|○名にやってんだ折れ…

>>928
char str[1024];
fscanf(fp, "%.1024s", str);
933デフォルトの名無しさん:04/09/13 18:18:38
C言語(RT-Linuxのプログラム)です。

------------------------------------

・・・

pthread_t theThread;

void *thread_code(void *t)
{
・・・
}


main()
{
・・・

pthread_attr_init (&attr);
sched_param.sched_priority = 4;
pthread_attr_setschedparam (&attr, &sched_param);
ret = pthread_create (&theThread, &attr, thread_code, (void *) 0 );

・・・
}

優先度4のスレッド(thread_code 0)を作る部分なのですが、

main の中のこの4行を、優先度、スレッド名、スレッド番号を持つマクロに変換するには
どのようにしたらよいでしょうか?
934デフォルトの名無しさん:04/09/13 18:26:14
>>933
attrは作業用変数か?
それだと不可能。
戻り値をマクロに引数として渡すか、マクロをやめて関数にすることを検討するといい。
935デフォルトの名無しさん:04/09/13 19:35:53
C言語の質問です
1、2、3の駆動するモーターとスイッチが1つあり
1のモーターだけが3秒間、2のモーターだけが3秒間
モーター1と2が同時に10秒間駆動し、この3つの動きははランダムに行われて
スイッチが押されると1、2は駆動を止めて3が5秒間駆動し、5秒後はまた同じ事が繰り返される
というプログラムをできるだけ簡単に作って下さい
936デフォルトの名無しさん:04/09/13 19:53:33
そのモーターとスイッチの制御方法を言え
937デフォルトの名無しさん:04/09/13 19:59:01
>935
何のOSで組んでいるのですか?
WindowsやLinuxではあきらかに不向きのようなきが
938デフォルトの名無しさん:04/09/13 20:01:06
宿題スレなんだから。実際に繋がってるわけじゃないだろ。
939デフォルトの名無しさん:04/09/13 20:08:28
>>937
組込みではOSが無しの場合も良くあるよ。
環境依存だし、もしここに書くなら環境をちゃんと書いてもらわないとダメかもね。
940935:04/09/13 20:16:36
スイッチは手動制御だと思います
PICを使ってやるんですが、自分では何がなんやら全く分かりません…
自分の専門学校のパソコンはウインドウズです
941デフォルトの名無しさん:04/09/13 20:18:52
>>940
そうか。
二度と来るな。
942デフォルトの名無しさん:04/09/13 20:31:00
>>940
氏んでください。
君のPCに入っているOSなんか聞いていません。
PIC使うにしても回路図が解からないとどのポートに出力するのか解かりません。
C使うにしてもどの処理系を使うのか書いてもらえないと実装できません。
PICにもいろいろあります。メジャーなのはPIC16F84とか?
一番の問題はスレ違いということですね。
逝ってよし
943デフォルトの名無しさん:04/09/13 20:31:36
まあまあ、そんなこと言うなよ。
944933:04/09/13 20:40:31
>>934
レスありがとうございます。
遅れてすみません。
attrが他で使用されないと仮定の上ではどうでしょうか?
945デフォルトの名無しさん:04/09/13 20:43:45
946デフォルトの名無しさん:04/09/13 20:45:20
>>945
↑は偽スレです。飛ばないように。
947デフォルトの名無しさん:04/09/13 22:04:45
二つの抵抗値をキーボードから入力し、並列接続したときの合成抵抗の値を求めて、
出力するプログラムを作成しなさい。なお、各抵抗値の入力は整数型で行い、
合成抵抗は実数型で小数第二位まで表示するものとする。

と、いう宿題がでたのですが

#include <stdio.h>
void main(void)
{
int i1;
int i2;
float i3=1/(1/i1+1/i2);
  printf("R1を入力してください→");
scanf("%d",&i1);
printf("R2を入力してください→");
scanf("%d",&i2);
printf("合成抵抗は %d です。",i3);
}

と、作ってみたのですがborlandのコンパイラでコンパイルすると
2エラーでてしまいます・・・・何が原因なのでしょうか?
948デフォルトの名無しさん:04/09/13 22:05:30
>>935
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1064150088&res=222&fi=no
モーターとスイッチの制御は勝手にやってくれ。
あと、unsigned int mode = 0, i;のiは消してくれ。
949いつもここから:04/09/13 22:08:35
>>947
バッカヤロー!ひき殺されてーのか!
i1,i2がまだ入力されてないのにi3計算してんじゃねーぞ!
950デフォルトの名無しさん:04/09/13 22:08:43
>>947
エラー名書けや氏ねボケカス
#include <stdio.h>
int main(void)
{
int i1;
int i2;
float i3;
  printf("R1を入力してください→");
scanf("%d",&i1);
printf("R2を入力してください→");
scanf("%d",&i2);
i3=1.0/(1.0/i1+1.0/i2);
printf("合成抵抗は %d です。",i3);
return 0;
}
951デフォルトの名無しさん:04/09/13 22:09:56
間違ったじゃねえかこのやろう
printf("合成抵抗は %f です。",i3);
952いつもここから:04/09/13 22:10:15
>>948
バカヤロー!
i3はfloatだろうが!
printf("合成抵抗は %f です。",i3);
953デフォルトの名無しさん:04/09/13 22:11:20
>>952
どこにレスしてんだおまえは
しかもおせえんだよ
954デフォルトの名無しさん:04/09/13 22:14:55
>>947
double から float に変換してんじゃねーよクソボケ
#include <stdio.h>
int main(void)
{
    int i1;
    int i2;
    double i3;
    printf("R1を入力してください→");
    scanf("%d",&i1);
    printf("R2を入力してください→");
    scanf("%d",&i2);
    i3=1.0/(1.0/i1+1.0/i2);
    printf("合成抵抗は %f です。",i3);
    return 0;
}
955947:04/09/13 22:17:39
>>950 951 952
ありがとうございました!!
エラー名かきわすれ申し訳ございませんでした・・・

さっそく修正してみたいと思います。

956954:04/09/13 22:18:40
>>955
オレにはお礼なしかよチンカス
957デフォルトの名無しさん:04/09/13 22:19:06
すいません、>>933>>944ですが、
どなたか回答をいただけないでしょうか・・・?
よろしくお願いします。
958デフォルトの名無しさん:04/09/13 22:20:35
>>957
極力マクロを使うな。inlineで十分だろ。デバッグやりにくいし。
マクロにしないと駄目な理由を書いてくれ。
959デフォルトの名無しさん:04/09/13 22:24:51
Cだからinline不可でわ?
960947:04/09/13 22:27:33
>>956
すいません、入力してるときにカキコマレタようでみてませんでした・・・
961デフォルトの名無しさん:04/09/13 22:28:04
>>959
ああ、inlineの使えないCもあったんだった・・・
962デフォルトの名無しさん:04/09/13 22:33:11
>>959
ハァ?
963933:04/09/13 22:45:19
>>958
では inline を使うとどのようにできるのでしょうか?
すみません・・・
964デフォルトの名無しさん:04/09/13 22:48:05
>>963
関数の頭にinlineをつける
965デフォルトの名無しさん:04/09/13 22:50:12
>>963
調べたりする気のないヤツはプログラムするな
966デフォルトの名無しさん:04/09/13 23:04:15
>>965
禿同
967933:04/09/13 23:14:49
>>964-966
少し調べてみました。みなさん、レスありがとうございます。
inline はC++のようですが、Cでも使えるのでしょうか?
そこが心配なのですが・・・

例えば>>933だと

以下のようにnew というinline関数を定義すると

pthread_attr_init (&attr);
sched_param.sched_priority = 4;
pthread_attr_setschedparam (&attr, &sched_param);
ret = pthread_create (&theThread, &attr, thread_code, (void *) 0 );

は、どのように使用すればよいのでしょう?

--------------------------------------------

pthread_t theThread;

inline int new(priority, thread, number)

void *thread_code(void *t)
{
・・・
}

main()
{
・・・
}
968デフォルトの名無しさん:04/09/13 23:17:19
>>967
それは調べたなどと言わない。
969デフォルトの名無しさん:04/09/13 23:24:04
Cでもinlineは仕様できます。
C99に対応したコンパイラなら。
970デフォルトの名無しさん:04/09/13 23:24:09
>>968
厳しいですね・・・(涙)
いろいろと調べてるのですが、なかなか分からなくて・・・
すみません・・・
971969:04/09/13 23:24:43
+ 使用
- 仕様
972デフォルトの名無しさん:04/09/13 23:59:32
>970
インライン云々の前にふつうの関数がわからんのではないかという疑念を抑えることができない
973マイク ◆yrBrqfF1Ew :04/09/14 07:44:00
inlineをつけると「俺はfunctionをinline展開してくれるように切望してる」と
コンパイラに対して意思表示ができる
974デフォルトの名無しさん:04/09/14 08:42:08
printfで出力で小数点第二位まで出力したいのですが%.2で正常に出力できますでしょうか?
975デフォルトの名無しさん:04/09/14 08:49:07
>>974
試しもしないでできるかどうか聞いているのか?
976デフォルトの名無しさん
Cでプログラムしてるんですが
虚数√-1ってどうやってやるんでしょうか
sqrt(-1)だとおかしくなってしまうんですが