ぼるじょあがC/C++の宿題を片づけますYO! 25代目
1 :
ぼるじょあ ◆yBEncckFOU :
04/06/23 03:41 (・3・)アルェー 実は他の人にまかせっきりのC++房のぼるじょあですYO!
わからない宿題を片づけますYO!
【注意点】 -------------------------------------------------
・問題はしっかりと解いてもらう方にわかりやすいように
問題文などの省きはやめ、エラーなどは適切に書きましょう
全文を書いてしまうか、分かりやすくまとめましょう。
・後になって問題につけたしをするのはやめましょう。
解いてもらっている方に失礼になってしまいます。
------------------------------------------------------------
【アップローダー==ラウンジ】(質問が長い時はココ使うと便利 回答者もコードが長ければここに)
http://do.sakura.ne.jp/%7Ejunkroom/cgi-bin/megabbs/lounge/index.html 【歴代スレは
>>2-10 】
2 :
デフォルトの名無しさん :04/06/23 03:43
4 :
デフォルトの名無しさん :04/06/23 03:53
次スレの報告も無かったしな
アルェー
7 :
デフォルトの名無しさん :04/06/23 10:26
これをやっていただけませんか↓ 順序つき集合Aを保存する2分探索木に対して,次の4種類の操作を選択して動作するプログラムbintree.cを作成せよ.ただし木の節点には整数を保存するものとする. INSERT(x,A) DELETE(x,A) MEMBER(x,A) MIN(A)
登録番号"int no"と名前"char name"と年齢"int age"を含む構造体person型の 配列を定義し初期化せよ。なお最後のデータにはNULLを入れておく。 登録番号は入力順に1,2,3,4,5とする。配列の先頭アドレスを指す構造体 person型のポインタを引数として与え、データを入力順に並び替える関数を作成せよ (・3・)ヨロシクぬるぽ
9 :
デフォルトの名無しさん :04/06/23 13:12
10 :
デフォルトの名無しさん :04/06/23 13:17
>>8 解こうと思ったが、問題文がよくわかりません。
・char name ← 名前一文字…?
・初期化って…? どんな感じに初期化…?
・入力したあと入力順に並び替える…?
普通データなんて入力順に並んでいるのでは
12 :
涙涙のプログラマ :04/06/23 17:03
#include <stdio.h> #include <stdlib.h> #define size 20 void main(){ int i,length,mmm; char c[size+1]; char rc[size+1]; printf("文字を入力(%d文字以下):",size); scanf("%s",c); i=0; while( *(c+i) != '\0') i++; length = i; if(length>size){ printf("%d文字以下で入力してください!\n",size); exit(-1); } printf("\n\n元の文字列: %s \n\n",c); for(i=0; i<length; i++) rc[i]=c[length-i-1]; rc[length]='\0'; printf("入れ替えた文字列: %s \n",rc); printf("\n\n何か入力すると終了します。\n "); scanf("%d",&mmm); }
13 :
涙涙のプログラマ :04/06/23 17:04
↑↑↑ rc[size+1] のポインタを引数にとり、文字列を入れ替えて 指定された配列に保存する関数reverseを作り この関数を使ってプログラムを書き換えるって・・・ 分からなくて泣きそうです・・(´ω`涙・・・助けて下さい
なけばいいじゃん 。・゚・(ノ∀`)・゚・。
2次方程式ax^2+bx+c=0の係数a,b,cを入力し 解が存在するかを判定するプログラムを作成せよ 初歩的なことですがCでお願いします。
>>13 問題のためのCだネ.問題解決の為のCになっとらん.てわけで答えだYO
#include <stdio.h>
#include <stdlib.h>
#define size 20
void reverse(int l,char *p,char *q){
int i;
for(i=0; i<l; i++) q[i]=p[l-i-1]; q[l]='\0';
}
void main(){
int i,length,mmm; char c[size+1]; char rc[size+1];
printf("文字を入力(%d文字以下):",size); scanf("%s",c);
i=0; while( *(c+i) != '\0') i++; length = i;
if(length>size){ printf("%d文字以下で入力してください!\n",size); exit(-1); }
printf("\n\n元の文字列: %s \n\n",c);
reverse(length,c,rc);/* 追加された部分*/
printf("入れ替えた文字列: %s \n",rc);
printf("\n\n何か入力すると終了します。\n ");
scanf("%d",&mmm);
}
改行規制うぜ
18 :
涙涙のプログラマ :04/06/23 18:42
ああぁ泣けました・・・ スゲ―――(゚∀゚)―――――!! すぐ出来ちゃうんですね・・・ 有り難うございました(号泣
19 :
デフォルトの名無しさん :04/06/23 18:44
>>18 ていうかこれでいいのかね?
文字列交換のところだけ関数化しただけなんだが・・・・
21 :
涙涙のプログラマ :04/06/23 19:06
関数reverse使ってるから良いとは思いますけど・・・ 内容分からないので・・・完動してますし 17殿のプログラムを信じて・・・関数プログラミングOKと思ってます。
23 :
デフォルトの名無しさん :04/06/23 19:37
ある会社で出張するための旅費が計算されました。係りの者が銀行でどの紙幣・硬貨が、どれだけ引き出せばよいかを処理するためのプログラムをつくりなさい。ただし、下の金種計算サブプラグラムを使用することとする。 データ:38832 25896 0 ―――――――――――――――――――――――――――――――――――― 実行結果: 金額を入力してください。0を入力すると合計を出力して終了 38832 10000 5000 1000 500 100 50 10 5 1 3 1 3 1 3 0 3 0 2 25896 2 1 0 1 3 1 4 1 1 0 5 2 3 2 6 1 7 1 3 ――――――――――――――――――――――――――――――――――――
/* 金種計算プログラム */ long kazu(long,long,long*); void kinsyu(long n,long d[]){ long a; n=kazu(10000,n,&a); d[0]=a; n=kazu( 5000,n,&a); d[1]=a; n=kazu( 1000,n,&a); d[2]=a; n=kazu( 500,n,&a); d[3]=a; n=kazu( 100,n,&a); d[4]=a; n=kazu( 50,n,&a); d[5]=a; n=kazu( 10,n,&a); d[7]=a; d[8]=n; } long kazu(long k,long nn,long *s){ *s=nn/k; nn=nn-(*s)*k; return nn;} ――――――――――――――――――――――――――――
逆関数法を用いて自分で決めた密度関数に従う確率変数(乱数)を生成しなさい。 これをヒストグラムに描いて生成した乱数が目的とする分布に従うことを確かめなさい。 という問題なんですがどうか!よろしく御願いしますm(_ _)m
>>27 分布関数の逆関数を作って、その関数に一様乱数(rand とかで作れる乱数)を渡すだけ。
>>28 >分布関数の逆関数を作って
これを数値的にやれって問題じゃないの?
>>29 正規乱数とか、数値計算っぽい今年なくても、log と sqrt で出来るし。
てか、rand()を自分で作れってことじゃないのか?
(1)逆関数法を用いて自分で決めた密度関数に従う確率変数(乱数)を作成しなさい。 レポートには目的とする分布の密度関数及びどのようにして生成したかをまとめる事。 また、生成した確率変数の平均と分散を計算しておくこと (2)↑のヒストグラムを描いて生成した乱数が目的とする分布に従っていることを確かめる 目的とする密度関数とヒストグラムを重ねて描け。縦軸注意。 が全文です。乱数はrandでいいんですが、逆関数法をどうやって表せばいいかわかりません。 どうか御願いします〜
>>32 逆関数法って用語を無視すれば乱数の特殊な場合である
double my_rnd(void){
return 0;
}
で確率密度関数 δ(x) の乱数を表現できるけど、逆関数法って何?
27じゃないけど 逆関数法による乱数の作り方 U を一様分布に従う確率変数とし,F を任意の一次元の累積分布関数とする. (0, 1) 区間 t に対して逆関数 F^(-1) (t) = inf { x | F(x) ≧ t } を定義すると,X = F^(-1) (U) は P( X ≦ x ) = P( F^(-1) (U) ≦ x ) = P( U ≦ F(x) ) = F(x) となることより X は分布関数 F に従う.よって,分布関数の逆関数の引数に一様乱数を入れてやれば,欲しい分布の乱数が得られる. だとさ
うわぁぁぁ。問題文にミスがありました。ごめんなさい 指摘レスくれた方すみません。下が正確なものです 登録番号"int no"と名前"char *name"と年齢"int age"を含む構造体person型の 配列を定義し初期化せよ。なお最後のデータにはNULLを入れておく。 登録番号は入力順に1,2,3,4,5とする。配列の先頭アドレスを指す構造体 person型のポインタを引数として与え、データを年齢順に並び替える関数を作成せよ
>>34 そうならば>33 でもいいような気がしてきた。
分布関数の逆関数を(プログラムで書ける形で)求めるなんて一般にはできないんだし。
>>35 >下が正確なものです
これ、正確なの?僕は未だに問題の意味がわからない。
>>35 俺もいまだにわからない。
・初期化せよ←これって例えばperson p[5];でいいの?
・最後のデータにNULLを入れる←?
わかっていること↓
・5つのデータを入力
・最後にデータを年齢順にソート
ぬーん。明日、先生を問い詰めてみます。 レスくれた方ありがとう。おやすみなさい
>>27 まず,(1)の数学的な部分(レポート作成)を自分でやれ。
そして,求めた分布関数の逆関数を数学的な式で書き込むこと。
そうすりゃ,その分布逆関数組み込んだ(2)を作ってやる。
>>40 激しく同意
数学的な部分は調べるのメンどーだ
42 :
デフォルトの名無しさん :04/06/24 18:17
うるう年は、4で割り切れ、かつ、100で割り切れない年、400で割り切れる年 のどちらかに当てはまる年である。 キーボードから西暦を入力させ、入力された年がうるう年かどうか判定し、 うるう年ならば、「xxxx年はうるう年です。」 そうでなければ、「xxxx年はうるう年ではありません。」 と表示するプログラムを作りなさい。 ただし,うるう年かどうかを判定する部分は,main関数とは別の関数を自分で作成すること。 という問題です。 #include<stdio.h> int main(void) { int n; scanf("%d",&n); if でこのあとがわかりません。教えてください!
n%4 ... 4 で割ったあまりを表す。 はい、頑張ってみようー
>>43 4000年で割り切れる年っていう条件が抜けてるよ
int sub(int a) { if(a%4==0&&a%100||a%400==0) return ON; else return OFF; } int main(void) { int n,flag; printf("n-->"); scanf("%d",&n); flag=sub(n); if(flag==ON) printf("%d年は閏年\n",n); else printf("%d年は平年\n",n); return 0; }
レスくれたみなさんありがとうございました。 レスを参考にして自分なりに組んでみたらできました。
まだ質問があるのですが、 #include<stdio.h> int main(void) { int n; printf("西暦を入力してください="); scanf("%d", &n); if(n%4==0&&n%100||n%400==0){ printf("%d年はうるう年です。\n",n); } else{ printf("%d年はうるう年ではありません。\n",n); } return 0; } で、一応できたのですが、 ただし,うるう年かどうかを判定する部分は,main関数とは別の関数を自分で作成すること。 という条件は満たしてませんよね…?
is_leap_year(n) { return n%4==0&&n%100||n%400==0; } if (is_leap_year(n)) printf(...);
bool isLeap(int year) { return year%4==0&&year%100||year%400==0; } if(isLeap(n)){ printf("%d年はうるう年です。\n",n); } else{ printf("%d年はうるう年ではありません。\n",n); }
bool 使うんだったら cout 使えよヽ(`Д´)ノ
54 :
デフォルトの名無しさん :04/06/24 20:34
ある測定器からパソコンに測定データが下記のようなフォーマットで送られてくる.各 時間での測定値は100 倍して指定されたオフセットを加えた値の16bit の正整数で表され, 上位8bit と下位8bit が分かれて送られる.例えば,下の例のように,オフセットが5000 の とき,40.91 という測定値は,40.91×100+5000=9091(2進数で 0010 0011 1000 0011 ) 35 131となり,35 と131 という整数が続けて送られることになる.今,測定データがdata.txt と いうファイル名で保存されているとき,それを読み込み、実際の測定値を計算し,データの 個数,最小値,最大値を求め,それらを下記のように日付を名前とするテキストファイル (”.txt” をつける)に書き出すプログラムを作れ.ただし,書き出すファイルはExcel で読 み込むことを考えて,タブ区切りとする(図のなかの<tab>はタブを表す;タブをprintf で 出力する場合には7-3 ページにあるエスケープ文字を使う).なお,測定データの個数は最大 100 を想定する.(ソースプログラムを提出せよ)
55 :
デフォルトの名無しさん :04/06/24 20:34
data.txt の内容 04-06-24.txt の内容 04-06-24 5000 0 19 136 7 35 131 14 44 13 21 45 17 28 40 45 38 27 254 48 16 74 60 9 71 72 10 197 86 17 182 100 23 1 114 23 127 データの個数: <tab>12 最小値: <tab>-26.25 最大値: <tab>65.37 時間<tab>測定値 0<tab>0.00 7<tab>40.91 14<tab>62.77 21<tab>65.37 28<tab>52.85 38<tab>21.66 48<tab>-8.30 60<tab>-26.25 72<tab>-22.43 86<tab>-4.66 100<tab>8.89 114<tab>10.15
どこからどこまでがdata.txt の内容でどこからどこまでが04-06-24.txt の内容 か分からない
> ただし,書き出すファイルはExcel で読み込むことを考えて,タブ区切りとする 普通は csv だろ。終わってるな、課題出したセンセは
tsvの方が使い勝手が良い事が多い
#include <iostream> #include <string> #include <fstream> #include <map> #include <algorithm> #include <limits> main() { using namespace std; map<int, double> resultMap; string line; ifstream ifs("data.txt"); string date; ifs >> date; date += ".txt"; int offset; ifs >> offset; double resultMax = numeric_limits<double>::max(), resultMin = numeric_limits<double>::min(); while(ifs.good()) { int time, hi, low; ifs >> time >> hi >> low; double result = ((hi << 8) + low - offset) / 100.0; resultMax = max(result, resultMax); resultMin = min(result, resultMax); resultMap[time] = result; }
ofstream ofs(date.c_str()); ofs << "データの個数:\t" << resultMap.size() << endl; ofs << "最小値:\t" << resultMin << endl; ofs << "最大値:\t" << resultMax << endl; ofs << "時間\t測定値" << endl; for(map<int, double>::iterator it=resultMap.begin(); it!=resultMap.end(); ++it) ofs << (*it).first << "\t" << (*it).second << endl; }
#include<stdio.h> int l(int n) { return n%4==0&&n%100||n%400==0; } int main(void) { int n; printf("西暦を入力してください="); scanf("%d", &n); if(l(n)){ printf("%d年はうるう年です。\n",n); } else{ printf("%d年はうるう年ではありません。\n",n); } return 0; } 関数名とかは好きなのにしろ
64 :
デフォルトの名無しさん :04/06/24 21:25
課題が出たのですが途中までしか分かりません。。教えてください。 課題: ■ポインタ引数を持つ関数を定義する課題 n秒をhh時間mm分ss秒の形に変形する関数convert_time()を定義し、 また、実際に引数を与えて呼び出しを行う。
文字配列nameにキー入力で"Good Moring"の文字を代入し、 その後、1文字ずつ取り出して表示せよ。 表示にはputcharを用いて文字列の長さは事前に分からないものとし、 プログラムの中で調べること。 (表示には必ず先頭1文字ずつ表示し、null文字が見つかったら表示を中止する)
#include<stdio.h> void convert_time(int*h,int*m,int*s,int n) { ??? } void main() { int h,m,s,n; scanf("%d",&n); convert_time(???); printf("%dh%2dm%2ds\n",h,m,s); } ???のところがわかりません・・(T T)
void convert_time(int n, char* p, size_t c) { snprintf(p, c, "%02d時間%02d分%02d秒", n/3600, n/60%60, n%60); }
>>64 void convert_time(int*h,int*m,int*s,int n)
{
*s = n % 60;
n /= 60;
*m = n % 60;
*h = n / 60;
}
convert_time(&h, &m, &s, n);
>66 前スレのどっかにあった。自分で探されよ。
>>66 *h=n/3600;
*m=n/60%60;
*s=n%60;
藻前ら、ケコーンし過ぎですよ。。。
#include<stdio.h> void convert_time(int*h,int*m,int*s,int n) { *s=n%60; n/=60; *m=n%60; *h=n/60; } void main() { int h,m,s,n; scanf("%d",&n); convert_time(&h,&m,&s,n); printf("%dh%2dm%2ds\n",h,m,s); } 4000 1h 6m40s Console>> 何かキーを押すと終了します。 出来ました(T T)有難う御座いました!
char c = 'a'; printf("%d", c);
>>65 #include <stdio.h>
int main(){
char str[20];
int i=0;
fgets(str,20,stdin);
for(i=0;str[i]!='\0'&&str[i]!='\n';i++){
putchar(str[i]);
putchar('\n');
}
printf("end\n");
return 0;
}
/*素直にNULL判別だけなら!='\n'は不要。*/
すいません自己解決いたしますた
78 :
デフォルトの名無しさん :04/06/24 22:35
何回もすいません。前スレで解いてもらったのですが、エラーばっかし出て… もう1度お願いします。期限明日までなんで… #include<stdio.h> int factorial(int n){ int i,f=1; for(i=1;<=n;i++) f=f*i; } return f; } int main(){ int i; for(i=0;i<=5;i++) printf("%d\n",factorial(i)); return 0; } の関数factorialを利用して キーボードから入力した2つの正または0の整数nとmの 組み合わせnCmを計算する関数combinationを作り、それを用いてnCmを計算するプログラム。 ヒント) nCm = n!/(n−m)!m! 出力例 Input n: 8 Input m: 6 8C6 = 28
エラーの詳細は?
80 :
デフォルトの名無しさん :04/06/24 22:50
int factorial(int n){ int i,f=1; for(i=1;i<=n;i++) f=f*i; return f; } double comb(int n, int m){ return (double)factorial(n) / factorial(n - m) / factorial(m); }
for文と配列変数を使って、入力した5つの数字の平均 を求めるプログラムを作れという問題がわからないので どうかお願いします。
C言語です。お願いします。 一般的な問題かもしれませんが、 年と月を入力するとカレンダーを表示するプログラムを作る問題です。 おねがいします
84 :
デフォルトの名無しさん :04/06/24 23:06
78の追加 どうやら3つ(n、m、n−m)の関数を宣言して 最後にcombinationの関数を作るみたいです。 >>79 なんか、nCmの式を立てるとこが… 詳しくは分かりません。
87 :
デフォルトの名無しさん :04/06/24 23:17
>>86 マルチとは? 初心者過ぎてすいません。
>>81 #include <stdio.h>
#define N 5
int main(void)
{
double s[N], sum = 0.0;
int i;
for (i = 0; i< N;i++){
printf("s[%d]:", i); scanf("%lf",&s[i]);
sum += s[i];
}
printf("average is %f\n", sum / N);
return 0;
}
92 :
デフォルトの名無しさん :04/06/24 23:31
>>90 分かりません>< 教科書みてもサッパリです・・・・m(_ _;)m
int combi(int n, int r) { if (r == 0 || n == r) { return 1; } return combi(n-1, r-1) * combi(n-1,r); }
int combi(int n, int r) { if (r == 0 || n == r) { return 1; } return (combi(n-1, r-1) + combi(n-1,r)); }
名簿を管理するやつをつくりたいのですが、わからないから どうかよろしくおねがいします。
>>96 int main(void)
{
char buf[16];
printf("名簿を管理しますか?\n");
fgets(buf,sizeof buf,stdin);
if (buf[0] == 'y') puts("がんがれ");
else puts("うんこ");
return 0;
}
>>96 system("Access.exe");
99 :
デフォルトの名無しさん :04/06/25 02:06
C言語でお願いします。配列ポインタの使い方がよくわからず、解けません。 お願いします。 n個の文字列 c0,c1,…,cn−1 を読み込んだ後、 読み込んだ文字列を表示するプログラムを作成せよ。 ・文字列を読み込む。 ・表示する。 上記2つを関数として作成し、main関数から呼び出すこと。 また、読み込む文字列長は固定である。(#define で宣言すること)
>>99 #include <stdio.h>
#include <string.h>
#define N 5
#define BUFSIZE 256
char buf[N][BUFSIZE];
void read(){
char *p;
int i;
for(i = 0; i < N; i++){
printf(" > ");
fgets(buf[i], BUFSIZE, stdin);
if(NULL != (p = strchr(buf[i], '\n'))) *p = '\0';
}
}
void display(){
int i;
for(i = 0; i < N; i++) puts(buf[i]);
}
int main(){
read();
display();
return 0;
}
>>100 レスありがとうございます。
しかし「n個の文字列の n は動的に確保する」という問題でした。
説明不足でした。すみません。
103 5人分の試験の点数を整数型配列にキーボードから入力し、その後ファ イルtensuuに出力せよ。 #include <stdio.h> int main (void){ int x[5]; int i; FILE *fp; for(i=0;i<5;i++){ printf("input data of No%d ",i+1); scanf("%d",&x[i]); } fp=fopen("tensuu","w"); for(i=0;i<5;i++){ fprintf(fp,"%d \n",x[i]); } fclose (fp); return 0; }
まず上の問題を実行してtensuuを作成すること。 作成したファイルtensuuから5人分の点数データを入力し、それから合計と平均を計算して画面出力せよ。提出するプログラムは @ファイルtensuu Aデータを読み込んで合計と平均を計算して画面出力するプログラム。また、メモ帳によってファイルtensuuを2つめのプログラムを実行する前に、ファイルtensuuを2つめのプログラムのソースファイルと同じフォルダにコピーしておくこと。
またB?上では5人分のデータ入力したがデータの個数が分かってないものとして作成せよ。但しfscanfにおいて、読み込むデータが終了して読み込めなかった場合の返却値はEOF(int型の負の値)である。 合計、平均値、および読み込んだデータの個数を画面出力せよ 長文でスイマセン
>>103-105 2,3を同時に書いたので、どちらかコメントアウトしてください。
#include <stdio.h>
int main (void){
int x[10],i,sum=0;
double ave=0.0;
FILE *fp;
fp=fopen("tensuu","r");
/*課題2用*/
for(i=0;i<5;i++){
fscanf(fp,"%d",&x[i]);
sum+=x[i];
}
/*課題3用*/
/*for(i=0;;i++){
if(fscanf(fp,"%d",&x[i])==EOF)break;
sum+=x[i];
} */
for(i=0;i<5;i++){printf("%d \n",x[i]);}
ave=(double)sum/i;
printf("num=%d sum=%d ave=%f\n",i,sum,ave);
fclose (fp);
return 0;
}
a * a = b(b + 1)/2 を満たす自然数 (a, b) を11組求めよ。 お願いします。
108 :
デフォルトの名無しさん :04/06/25 11:42
「C言語の問題」 ユーザに順次文字列の入力を求め、入力された文字列を変数に格納せよ。 ただし、終了は"end"の文字列のみが入力された場合とし、文字列長は256 の固定長でよいが、入力される文字列の数は不定でありユーザの気分で変 わるものとする。
>>107 まず数式の簡単な解きかたから教えてくれ…。
式そのままに総当りでやったら
(a ,b)=(1, 1)
(a ,b)=(6, 8)
(a ,b)=(35, 49)
(a ,b)=(204, 288)
(a ,b)=(1189, 1681)
(a ,b)=(6930, 9800)
↑この6つの解以降は無理。
>>109 b(b+1)/2っていうのは、Σ(1→b) (つまり1〜bまでの自然数の和)なんだから、
和を求めてからルート取って自然数になるかどうか調べればいいんじゃないかな?
それでやると、7個目はa=40391 b=57121
ただこれ以上は多倍長演算が必要になりそうなので断念
111 :
デフォルトの名無しさん :04/06/25 12:18
INSERTとDELETEはともかく、 MEMBERとMINはなんだ?
>>107 ああ、わかった。
aとbが逆でもいいのか。
求まった…
#include<stdio.h>
int main()
{
int resCount=0;//解の数
for(int a = 1;;a++)
{
for(int b = a;;b++)
{
if(2 * a * a < b * ( b + 1 ) )break;
if(2 * a * a != b * ( b + 1 ) )continue;
//解が得られた
printf("(a ,b)=(%d, %d)\n",a,b);
resCount++;//解の数に1加える
if(a != b && resCount < 11)
{//aとbが異なるなら、逆の場合も出力
printf("(a ,b)=(%d, %d)\n",b,a);
resCount++;//解の数に1加える
}
break;
}
if(resCount == 11)break;//解の数に11個で終了
}
return 0;
}
114 :
109==113 :04/06/25 12:28
>>110 うわー、リロードして書き込めばよかった…。
そうか。等差数列の和か…。
そちらの方がスマートなので、真の解答は任せた。
教えてください。 「ファイルの中から特定の文字列(例えば「abcde」)を抜き出してプリントさせる」 というプログラムをなるべく初歩的で簡単に作れと言われました。 よろしくお願いします<(_ _)>
abcdeを抜き出して、抜き出した文字列をプリントさせるのか? そんなことしなくても、printf("abcde")でいいじゃないか。
>>115 宿題を丸々コピペしろ
あと先生が言った言葉もな
>>116 それだと、含まれていない場合にも表示されるっぽ
なんにしろ「抜き出す」ちう言葉にはなんの意味もないな 含まれてる行を、とかそういう問題じゃないのか
>>121 BUFSIZの定義がされてませんぜ、旦那。
ついでに文字列の比較はstrcmp()で。
>>121 BUFSIZって幾つだと思ってるんだよ。BUFSIZ*256バイトもスタックに取るには大き過ぎだろうが。
それから、不定である以上BUFSIZより多い数入れたいかもしれないだろ? 動的に確保しろよ。
124 :
デフォルトの名無しさん :04/06/25 15:05
初期状態を除いてプログラム実行時に既存の英単語リストのファイル(list.txt)を読み込み,2次元配列に格納する. (例:words[単語数][単語文字数]) 単語登録,リスト表示,終了の各機能が選択可能なメニュー画面を表示する.ただし,登録可能な単語数を表示し,リスト内と同一単語の登録は受付けない.また,リスト表示は登録した英単語を含めるものとする. プログラム終了時に新しくできた英単語リストを読み出したファイルに更新する.なお,英単語リストのファイルは,1行1単語として出力するものとする. ヒント:文字列の比較は「strcmp関数」,文字列の複写は「strcpy関数」をそれぞれ使用し,引数の指定は各自で調査せよ.ヘッダーファイルは「<string.h>」を指定すればよい. お願いします。
>>122-123 様
ご指摘どうもです
122様のご指摘はすらっとできたのですが、
123様のご指摘された点が僕の手には負えそうにないです。
いろいろ調べてみたんですが、情けないことに動的に確保する方法がわかりません。
ということで
>>108 さんの回答を誰かUPしてください。
それみて勉強することにします...
on_
126 :
デフォルトの名無しさん :04/06/25 16:00
多角形の内外判定の関数がつくれません。たすけてください。 VC6つかってます。;;
if(多角形の内){ return 内; }else{ return 外; }
>>125 (適当
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUF_SIZE 256
#define STREQ(a, b) (*(a) == *(b) && strcmp((a), (b)) == 0)
int main()
{
char* buffer = NULL;
int count=-1, i;
do {
count++;
buffer = (char*)realloc(buffer, BUF_SIZE*(count+1));
fgets(buffer+BUF_SIZE*count, BUF_SIZE, stdin);
} while(!STREQ(buffer+BUF_SIZE*count, "end\n"));
for(i=0; i<count; i++) {
printf("%s", buffer+BUF_SIZE*i);
}
free(buffer);
return 0;
}
>>126 質問の仕方がこの上なく最悪かつスレ違い
131 :
デフォルトの名無しさん :04/06/25 16:39
>>131 そこ、たぶん学内からしかアクセスできない。
さすが近畿大学
近畿大学は本当にバカだなー
10人の数学の点数データを、配列要素を初期化する方法で配列に値を記憶させ、これらの最大値、最小値、合計値を求めよ。 以下それぞれの人の点数を表します 60 80 40 90 100 80 70 30 50 20
>>131 アドレス貼るだけとは・・・頭おかしいぞ
課題をここに書くということすら面倒ってか?
>>128 2次元配列へのポインタはchar (*buffer)[BUF_SIZE];で作れる
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUF_SIZE 256
int main()
{
char (*buffer)[BUF_SIZE] = NULL;
int count = 0, i;
do {
buffer = realloc(buffer, BUF_SIZE * count);
fgets(buffer[count], BUF_SIZE, stdin);
} while (strcmp(buffer[count++], "end\n"));
for(i=0; i<count; i++) {
printf("%s", buffer[i]);
}
free(buffer);
return 0;
}
>>135 #include <stdio.h>
#include <algorithm>
#include <numeric>
main()
{
int score[] = {60,80,40,90,100,80,70,30,50,20};
printf("最大値=%d,最小値=%d,合計値=%d",
*std::max_element(score, score + 10),
*std::min_element(score, score + 10),
std::accumulate(score, score + 10, 0)
);
}
>>131 #include <stdio.h>
int main() {
int score[] = { 60, 80, 40, 90, 100, 80, 70, 30, 50, 20 };
int i,max,min,sum = 0;
max = score[0]; min = score[0];
for(i=0;i<10;i++) {
if(score[i] > max) max = score[i];
if(scoer[i] < min) min = score[i];
sum += score[i];
}
printf("max = %d, min = %d, sum = %d\n",max,min,sum);
return 0;
}
>>138 危ねー。似たような方法を書き込みそうになったw
リロードしてよかったよ…。
スタックにデカい配列を作ろうとするな。
>>141 ifで閉じカッコが余計なのが大杉
(誤)if ((fp0 = fopen(argv[3], "r")) != NULL) {
(正)if ((fp0 = fopen(argv[3], "r") != NULL) {
>>143 \ ∩___∩
. \ | ノ ヽ ちょっ! ちょっと待つクマ!
\ / ● ● |
\| ( _●_) ミ 釣り方間違ってるクマ!!
彡、 |∪| ,/..
ヽ ヽ丿/ /⌒| この吊り方は、やばすぎるクマー!!!
/ \__ノ゙_/ / =====
〈 _ノ ====
\ \_ \
\___) \ ====== (´⌒
\ ___ \__ (´⌒;;(´⌒;;
\___)___)(´;;⌒ (´⌒;; ズザザ
ファイル(data.txt)を読み込みファイル内の単語数、最大語長を返す関数を作成し適切なmain()関数を作成せよ なお、ピリオドも1語と数える。 /* data.txt The Carlos Beltran sweepstakes are over, */ 実行結果 Wordcount:7 Maxlength:11 よろしくお願いします。
あ、スペース・改行は数えなくていいです。 追記すみません
K&R嫁
>>145 #include <stdio.h>
#include <ctype.h>
#define IN 1
#define OUT 2
void hoge(int *c, int *m) {
int ch, len = 0, max = 0, wcount = 0, state = OUT;
FILE *fp;
fp = fopen("data.txt", "r");
while ((ch = getc(fp)) != EOF) {
switch (state) {
case IN:
if ((ch == '.') || isalnum(ch)) len++;
else { if (len > max) max = len; state = OUT; }
break;
case OUT:
if ((ch == '.') || isalnum(ch)) { wcount++; state = IN; len=1; }
break;
}
}
if (state == IN && len > max) max = len;
*c = wcount; *m = max;
}
int main() {
int c, m;
hoge(&c, &m);
printf("Wordcount: %d\n", c);
printf("Maxlength: %d\n", m);
return 0;
}
買えよ
そうだよ。学生なら生協とかで割り引きで買えよ。それか古本屋で買えよ。
大学図書館に腐る程あるだろ >K&R 一冊ぐらいk
155 :
59.60 :04/06/25 20:56
#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX 100 void main(void) { char filename[20]; int time[MAX]; int i, n, offset, a, b,sum; double value[MAX], min, max,avr; FILE *fp; if((fp=fopen("data.txt","r")) == NULL) { printf("data.txt を開くことができません\n"); exit(1); }
156 :
59.60 :04/06/25 20:57
/*data.txt の内容を読み込み、個数、最小値、最大値、実際の測定値を求める 部分*/ fscanf(fp, "%s", filename); fscanf(fp, "%d", &sum); min=max=sum; i=1; while(fscanf(fp, "%d", &a) !=EOF){ sum +=a; if(min>a)min=a; if(max<a)min=a; i++; } avr=(double)sum/i; fclose(fp); if((fp=fopen(filename,"w")) == NULL) { printf("%s を開くことができません\n", filename); exit(1); } /*filename というファイルにデータの個数、最小値、最大値、平均値を出力す る部分*/ fprintf(fp, "データの個数: %d\n",i); fprintf(fp, " 最小値: %d\n",i); fprintf(fp, " 最大値: %d\n",i); fprintf(fp, " 平均値: %d\n",i); fclose(fp); }
157 :
59.60 :04/06/25 20:58
コンパイルは通ったのですがファイルが開けません どこがおかしいか指摘してください
159 :
デフォルトの名無しさん :04/06/25 22:12
>141 どううまく動かないのか具体的に書いてください。 入力これこれに対して、出力はこうなるのが正解だが、このような出力になるetc
gmpライブラリを使い1兆を超す二数の和を求める関数をつくれ 関数名はbignumaddとする 変数名とかは特に指定はありません どなたかおねがいします
#include <stdio.h> int main(){char a[99],b[99],*e="+-*/",*f;int s=0,c;float m=0,n;while(1){printf( "%f :",m);fgets(a,99,stdin)?0:exit(0);if(sscanf(a,"%s",b)>0){if(sscanf(b,"%f", &n)>0){m=s?c?c-1?c-2?m/n:m*n:m-n:m+n:n;s=0;continue;}else{if(!b[1] && (f=strchr (e,*b))){s=1;c=f-e;continue;}}}*a-'q'?0:exit(0);puts("Input errror (type 'q' t" "o exit)");}} このプログラム以前作ってもらったやつだが、コンパイルできん。 コピペじゃいかんのか? 初心者で全然わからん C言語の質問スレでもきいたが、ここでもきいてすいません
>>154 さんの
略以下は
かっぱらっちまえ でよろしいでしょうか?
>>161 なんすか。その7行スレに出てきそうなソースは…。
とりあえず見やすいように展開して欲しい( ゚Д゚)
せめて改行してほしいな・・。
>>164 >>165 全然C言語わかんないんす
どこで改行していいかもわかんない
電卓のシュミレーターなんですが。
>>166 Cなら ; (セミコロン) { } (括弧)の位置で改行する
改行したらコンパイル自体はいけたぞ。
>167 #include <stdio.h> int main() {char a[99],b[99],*e="+-*/",*f ;int s=0,c ;float m=0,n;while(1) {printf( "%f :",m) ;fgets(a,99,stdin)?0:exit(0) ;if(sscanf(a,"%s",b)>0) {if(sscanf(b,"%f", &n)>0){m=s?c?c-1?c-2?m/n:m*n:m-n:m+n:n ;s=0 ;continue ; }else {if(!b[1] && (f=strchr (e,*b))){s=1 ;c=f-e ;continue ;} } }*a-'q'?0:exit(0) ;puts("Input errror (type 'q' t" "o exit)") ; } } こうですか?
クワタ
コンパイルは知ってるのにCは書いたことないのかYo!
>>167 #include <stdio.h>
int main(){
char a[99],b[99],*e="+-*/",*f;
int s=0,c;
float m=0,n;
while(1){
printf("%f :",m);
fgets(a,99,stdin)?0:exit(0);
if(sscanf(a,"%s",b)>0){
if(sscanf(b,"%f",&n)>0){
m=s?c?c-1?c-2?m/n:m*n:m-n:m+n:n;
s=0;
continue;
}
else{
if(!b[1] && (f=strchr(e,*b))){
s=1;
c=f-e;
continue;
}
}
}
*a-'q'?0:exit(0);
puts("Input errror (type 'q' t""o exit)");
}
}
これでいいかな?
>>160 mpz_add()呼んで終わりだぞ?
もちょっと説明あったでしょ。
マルチになってしまうのですが前回のだとエラーが多発していたのでもう一度お願いできま せんでしょうか。 2次方程式の係数a,b,cを与え、方程式の解を求めて出力せよ。(関数は使わなくてよい) ヒント:係数の値によって、3つの場合分けが必要となる。 ここで、zの平方根yの計算は、y=sqrt(z);で計算すること。 また、#include<math.h>を#include <stdio.h>の次の行にくわえること
>>160 GMPライブラリを使わず・・・作成せよって問題なら分かるが使ったら意味なくない?
>>174 > エラーが多発していた
だ か ら そ の エ ラ ー メ ッ セ ー ジ を 晒 せ や 池 沼
177 :
デフォルトの名無しさん :04/06/25 23:13
n個の整数の最大公約数を求めるプログラムを教えてください。
>>169 ";"は日本語で言う"。"つまり文の終わり。
"}"を日本語に当てはめると"」"が近い。
つまり
hoge;
foo;
って具合にしろ
>>178 よくわからないんだが、そうすれば
きちんとしたプログラムとして動くの?
172のプログラムのことです
181 :
デフォルトの名無しさん :04/06/25 23:19
任意です。
戻り値の問題の応用として出されました mpz_add(mpz_t c, mpz_t a, mpz_t b) とすれば c=a+b;になるのは分かっているのですが、 mpz_t bignumadd(mpz_t e, mpz_t f) mpz_add(d, e, f) return d; こんな風にしてもコンパイルできません・・・
別に一行で記述してあっても動くものは動くが何か?
>>180 C言語では改行も空白の一種の扱いだから、改行が全くなくても正しいソースコードなら問題はない。
改行を入れるのは見易さのため。
>>183 んなこと言ってるとまたいつかみたいにバカが
「動けばいいというものではない。減点」
とか言い出すぞ。
コンパイルできないのは、コードに誤りがあるからだ。 どうせくだらんミスだろう。
一行に書いたほうがコンパイル早い?
ぐちゃぐちゃソースの中の ? って何を表してるの?
条件演算子? どういう風になるのかよくわからん・・。
>>177 #include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <malloc.h>
int gcd(int x, int y){if(y == 0) return x; else return gcd(y, x % y);}
int main(){
int n, *a, i, d;
char buf[256];
printf(" n > ");
n = atoi(fgets(buf, sizeof(buf), stdin));
if(n == 0) return 1;
assert(NULL != (a = malloc(sizeof(int) * n)));
for(i = 0; i < n; i++){
printf(" > ");
*(a + i) = atoi(fgets(buf, sizeof(buf), stdin));
}
d = *a;
for(i = 1; i < n && d != 1; i++)
d = gcd(*(a + i), d);
printf(" ans = %d\n", d);
return 0;
}
あ、メモリ開放忘れてた。まいいか。
電卓のシュミレーターをC言語 ・扱う数値は整数値でよい(実数ならもっといい) ・数値と演算子の区切りは改行(リターンキー)でよい ・対話的に使えるものとするー終了は数値の代わりに一文字 の入力をすればよい ・演算は加減乗除のみ(ほかのがあってもよい) ・演算子の優先順位は考慮しなくてもよい ・括弧は扱えなくてもよい ・メモリ機能は扱えなくてよい 前スレでこう聞いたら161のようなプログラムを作ってくれた。 うーん他のプログラムつくれないすか? 困ってるんです
194 :
デフォルトの名無しさん :04/06/25 23:53
>>190 ありがとうございます。
プログラムソースが結構複雑ですね。。。
まだ、初心者なんで全ては理解できません。
ようは、
1組の最大公約数を求めて、
求めた最大公約数と次の整数の最大公約数を求めていくということですか?
(例)
a, b, c, dの整数があったら、
まず始めにaとbの最大公約数xを求めて、
次に、xとcの最大公約数yを求めて、
最後に、yとdの最大公約数zを求める。
結果的にzがa, b, c, dの最大公約数になる。
という感じでしょうか?
>>194 そういうこと。
あともう一つ「最大公約数が1になっちゃったら、そこで終了」という終了条件もつけてる。
>>192 つーか161そのままでコンパイル通るよ
一応足し算とかできるし
197 :
デフォルトの名無しさん :04/06/25 23:56
>>195 とても参考になりました。
ありがとうございましたm(_ _)m
>>193 連続で入力できる分は問題ないと思います
>>198 そうじゃなくて、200の後に300入れられたら、どういう計算すればいいんだよ?
>>196 Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
sample3.cpp:
エラー E2268 sample3.cpp 3: 未定義の関数 'exit' を呼び出した(関数 main() )
エラー E2268 sample3.cpp 5: 未定義の関数 'strchr' を呼び出した(関数 main() )
エラー E2034 sample3.cpp 4: 'int' 型は 'char *' 型に変換できない(関数 main() )
警告 W8060 sample3.cpp 4: おそらく不正な代入(関数 main() )
*** 3 errors in Compile ***
コンパイルするとこうなる
なぜ(:_;)
>>200 #include<stdlib.h>
#include<string.h>
の2行入れてみ。
以下のようなエラーメッセージが出て困っています c:4 error: `bignumadd' declared as function returning an array c: In function `main': c:13: error: incompatible types in assignment c: At top level: c:24: error: `bignumadd' declared as function returning an array c: In function `bignumadd': c:28: error: syntax error before "return" プログラムは次のレスにコピペします
てか、なんで.cppなんだよ。
>>190 malloc()ってstdlib.hに入ってるんじゃなかったっけ?
#include <stdio.h> #include <gmp.h> mpz_t bignumadd(mpz_t a, mpz_t b); int main(void) { mpz_t d, e, f; mpz_init_set_ui(d, 100UL); mpz_init_set_ui(e, 200UL); mpz_init(f); f = bignumadd(d,e); mpz_out_str(stdout, 10, f); printf("\n"); mpz_clear(d); mpz_clear(e); mpz_clear(f); return 0; } mpz_t bignumadd(mpz_t a, mpz_t b) { mpz_t c; mpz_init(c); mpz_add(c, a, b) return c; }
>>199 よくわかんないですが、計算できればいいです
>>207 拡張子を".cpp"から".c"にしたら?
>>192 and
>>
ttp://pc5.2ch.net/test/read.cgi/tech/1088151291/57 おれもやってみた。
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define F fgets(buf, sizeof(buf), stdin)
int main(void){char buf[256];while(1){int x,y,op;x=atoi(F);if(isalpha(*buf))
break;op=*F;y=atoi(F);if(isalpha(*buf))break;printf("%d %c %d = %d\n",x,op,y,
op=='+'?x+y:op=='-'?x-y:op=='*'?x*y:op=='/'?x/y:0);}return 0;}
>>201 161のどこにいれるんすか?
全くわからないのに、こんな宿題だされてこまってます
>>202 あー、なにげmpz_tってポインタかと思ったら要素一個の配列として定義されてんのな。
こりゃそのままじゃ返せねーわ。
ポインタにしちまうか、引数のどっちかに答え入れるようにしたら?
210が行ってる学校はスゴいな C習い始め初日でもincludeする場所くらいは分かるだろうに・・・ もうすぐ7月だぞ?
学校が凄いんじゃなく、
>>210 が興味無いけど単位は取りたいみたいな
感じで、そもそもCをやろうという気は無いんだろう。
まぁそういう人のためのスレでもある気はするんだが、
話がある程度通じないとプログラムの実行方法とかも伝えられないから辛いな。
>>212 さん
すいませんがプログラムを書いていただけませんか?
ずっと困ってんです
興味ないんならなんで授業とるんだよ。
>>207 >>213 馬鹿ですいません
209のプログラムでできたんで大丈夫です
209の方本当にありがとうございました
>>217 どういたしまして。
この解答をお友達に写させない方がいいと思うよ。
あなたのためにも採点する人のためにも。
>>217 よ
あんな玄人丸出しのプログラムソースを見れば
教授だってプログラムについて質問したくなるぞ?大丈夫か
玄人って言われた。 ちょっとうれしい。
大学とかならプログラム演習の単位ウマーで取るやついっぱいいるかもね、つーかうちにもいっぱい。 中学、高校だと興味なくてもとにかくやらされる場合が多いから・・・それか?
初心者の中の玄人
プログラム全く分からんヤツが209のを書いてきたら 教授「お前、2chの宿題スレで答えてもらっただろ!!」 こういうオチが待ってる
下の上
ちゃんと見てますよ
大金先生の例もあるしな。
161改行したらできたよ ホントダ
#include <stdio.h> #include <gmp.h> void bignumadd(mpz_t result, mpz_t a, mpz_t b) { mpz_add(result, a, b); } int main(void) { mpz_t d, e, f; mpz_init_set_str(d, "1000000000000", 10); mpz_init_set_str(e, "2000000000000", 10); mpz_init(f); bignumadd(f, d, e); mpz_out_str(stdout, 10, f); printf("\n"); mpz_clear(d); mpz_clear(e); mpz_clear(f); return 0; }
全くけしからん… 君らには単位を認めない
>>232 全くけしからん…
君にはテニュアを認めない
せいぜい助教授だろ
レベル低すぎで笑えるw
>>159 削除されるべき単語が削除されずにそのまま出力されるんですよ。
だからその削除する部分の記述が間違っているのかなと思ってここにきました
>>234 うちのプログラム演習の担当は教授だよ、パソコン苦手な電磁気学の教授
239 :
デフォルトの名無しさん :04/06/26 14:41
引数で与えられた数だけ画面に*を表示する関数を作成する。 それを用いて20以下の乱数で求まった長さの*線を10本引いて終了する。 これが今日の授業の演習だったのですが全部できませんでした。 #include <stdio.h> #include <stdlib.h> int f(int a); void main () { int a,b,c; for(c=0;c<10;c++) a=rand()%21; b=f(a); if (b==1) printf("\n"); } int f(int a) { int d; for(d=0;d<a;d++) printf("*"); return 1; } これが自分の限界ですた。ちなみに*は一行しか表示されません・・・ 最初ビルドした時戻り値どうこうと出てきたのでワケも解らずreturnで1を戻しています。 タスケテー
240 :
デフォルトの名無しさん :04/06/26 14:46
>>239 for(c=0;c<10;c++)
a=rand()%21;
↑
forループはこれしかやらないよ
戻りの型は void 、return は不要。c の for よく見れ。{} がない。
>>239 初心者のうちはif, forなどの後は必ずブロックにしておくことを激しくお勧めしておく。
省略していいのは、自分が絶対ミスをしないと確信が持てる香具師だけだ。
#include <stdio.h>
#include <stdlib.h>
void f(int a);
int main()
{
int a;
int ic;
for(ic = 0; ic < 10; ic++) {
a = rand() % 21;
f(a);
putchar('\n');
return EXIT_SUCCESS;
}
void f(int a)
{
int ic;
for (ic = 0; ic < a; ic++) {
putchar('*');
}
}
void f(int a) { while(a--) putchar('*'); } でいいじゃん
void f(int a){while(a-- && putchar('*'));} でいいじゃん
どうもありがとうございました。 とりあえず要求通りに動くようになりました。 ただ、まだvoidとかを良く解ってなかったみたいなのでもう一度勉強し直します。 if,for後は注意するようにしますです。
246 :
デフォルトの名無しさん :04/06/26 16:02
>236 具体的な入力ファイル2つの中身と、その出力を示してください。 なるたけ小さくしたやつでね。 ここで解答してくれるような人はある意味めんどくさがりなので、 再現可能な入力を見つけるなんて面倒なだけでつまらんことはしてくれないでしょう。 >削除されるべき単語が削除されずにそのまま出力されるんですよ。 なんていうレベルのバグ報告をするやつはいますが、使えないやつと判断されます。
ここ本スレ?
もうみんな宿題終わったかなー?
文字列入力し、圧縮しながら圧縮文字列に入力する sprintf()を使用する事 入力文字列 AAAAAAABBBCddEEEE##### 圧縮文字列 @7A@3BC@4E@5# わかりましぇん・・・ 圧縮文字列を作るときにsprintfをすれば良いのですか?
>249 dが消えるのは仕様ですか。
251 :
◆YU.vf3DFSo :04/06/26 21:06
間違えです(w @7A@3BC@2d@4E@5# です。
>圧縮文字列を作るときにsprintfをすれば良い 例えば、"@7A"ならsprintf(buf,"@%d%c",7,'A')だろ?
>>249 入力:aab
出力:@2a@1b
みたいな感じで、膨らんでしまう場合もそのまま処理していいの?
あとsprintf()は本当に使わなきゃならんのか。
>>252 それを、連続した文字列が1の時はsprintfを行わないとすれば良いのでしょうかね・・・。
>>253 一応使えという事になっています・・・。
aabの時は、@2abと表示する様です。
もちろん2文字の連続の場合は逆に大きくなってしまいますが、取りあえずはそのままで良いのかと思います。
255 :
デフォルトの名無しさん :04/06/26 21:54
#include <stdio.h> #include <string.h> int main(void){ char buf[1024], s[1024]; char *p = buf, ch, *s_cur = s; int len; puts("文字列:"); fgets(buf, sizeof buf, stdin); buf[strlen(buf) - 1] = '\0'; while (*p){ len = 0; for (ch = *p; *p == ch; p++, len++); if (len >= 2){ sprintf(s_cur,"@%d%c", len, ch); s_cur += 3; } else { *s_cur = ch; s_cur++; } } *s_cur = '\0'; puts(s); return 0; }
256 :
デフォルトの名無しさん :04/06/26 21:55
>>249 こんなかんじかな(未テスト)
#include <stdio.h>
#include <string.h>
/*
* buf: 圧縮文字列が入る
* str: 入力文字列
*/
char *compress(char *buf, const char *str)
{
char *p = str;
while (p != NULL) {
int c = 1;
while (*p == *(p + 1)) { ++c; ++p; }
if (c == 1) sprintf(buf, "%s%c", buf, *p);
else sprintf(buf, "%s@%d%c", buf, c, *p);
++p;
}
return buf;
}
int main(void)
{
const char *input_string = "AAAAAAABBBCddEEEE#####";
char *compressed_string = malloc(strlen(input_string) * 3 + 1);
compress(compressed_string, input_string);
printf("入力文字列:%s\n圧縮文字列:%s\n", input_string, compressed_string);
free(compressed_string);
return 0;
}
>>256 はグズグズだったからやり直し。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *compress(char *buf, const char *str)
{
const char *p = str;
*buf = '\0';
while (*p != '\0') {
int c = 1;
while (*p == *(p + 1)) { ++c; ++p; }
if (c == 1) sprintf(buf, "%s%c", buf, *p);
else sprintf(buf, "%s@%d%c", buf, c, *p);
++p;
}
return buf;
}
int main(void)
{
const char *input_string = "AAAAAAABBBCddEEEE#####";
char *compressed_string = malloc(strlen(input_string) * 3 + 1);
compress(compressed_string, input_string);
printf("入力文字列:%s\n圧縮文字列:%s\n", input_string, compressed_string);
free(compressed_string);
return 0;
}
258 :
デフォルトの名無しさん :04/06/26 22:08
乱数を使って1桁の数当てを作ってみたんですけど、答えが常に一定でランダムになりません。 どうやったらいいでしょうか? #include <stdio.h> #include <stdlib.h> #include <time.h> main() { int a,b,i=1; srand(time(NULL)); a = rand()/32768.0*10.0; for(;;){ scanf("%d",&b); if(a == b) break; else i++; } printf("%d回で当たりました。",i); printf("%d",i); }
>256 sprintf(buf, "%s@%d%c", buf, c, *p) って大丈夫?
264 :
デフォルトの名無しさん :04/06/26 22:30
大学の課題なんですが、さっぱりですわ・・・ 1辺100mの正方形の四隅に電柱があり 4つの電柱が全て繋がる用に電線で結んだ場合の 最短距離を出力せよ ○ ○ ○ ○
267 :
デフォルトの名無しさん :04/06/26 22:44
>264 約282
すみません・・・
一応、答えだけじゃなくC言語のプログラムの方を提出したいので・・・
>>265 >>266 >>267 どのようにして解いたのですか!?
A ○――――○ ∠ABC=120゚ |`、 / | | `、__/ | | /B `、 | | / `、| ○――――○ C 最短はこうだと思うんだが。 プログラムでこれを見つける方法っていうなら、俺にはわからん。 逆に教えてほしい。
>>269 多分そんな感じでOKです!
なんか角度を振っていって絞り込むとか言ってた様な・・・
∠ABCを振れって言う意味かも知れません
なんかあれだ、ニュートン法だ。きっと。
新豚といえば均が氏んでその特集で皆の記事の結語に「合掌」と書いてあって 2chのノリだなぁと感じたっけな
#include<stdio.h> int main(void) { int i; float k; k=11/12; for(i=0;i<=4;i++){ if(i<=2){ k=k+2*(i+1); } else{ k=k-i; } } printf(" kの値は、%d",k); return(0); } をコンパイルしようとおもってもイレギュラーキャラクターと返ってきます。 どうしれば正しくコンパイルできますか?
#include<stdio.h> int main(void) { int i; float k; k=11/12; for(i=0;i<=4;i++){ if(i<=2){ k=k+2*(i+1); } else{ k=k-i; } } printf(" kの値は、%d",k); return(0); }
>>270 269の形状を前提にしていいのなら簡単だが。
ニュートン法は他の人に任せます。
#include <stdio.h>
#include <math.h>
double length( double CAB ) { return 50 / cos( CAB ) * 4 + ( 100 - 50 * tan( CAB ) * 2 ); }
// 角CABをCAB_min[rad]〜CAB_max[rad]の範囲をdiv等分して、最短になる角CABを探す
double find_min( double CAB_min, double CAB_max, int div ) {
double CAB_at_min = CAB_max, densen_min = length( CAB_at_min );
for( int i = 0 ; i < div ; ++ i )
{
double CAB = ( CAB_max * i + CAB_min * ( div - i ) ) / div, densen = length( CAB );
if ( densen < densen_min )
CAB_at_min = CAB, densen_min = densen;
}
return CAB_at_min;
}
int main() {
const double PI = 4 * atan( 1 );
double CAB_min = 0, CAB_range = PI / 4; // CABの範囲は0〜90度
while( CAB_range > 0.000001 * PI / 180 ) { // 百万分の1度の精度になるまで繰り返す
double CAB_at_min = find_min( CAB_min, CAB_min + CAB_range, 10 ); // 範囲を10等分して探す
printf( "CAB=%f[deg]\tlength=%f[m]\n", CAB_at_min * 180 / PI, length( CAB_at_min ) );
CAB_range /= 5; CAB_min = CAB_at_min - CAB_range / 2; // 探した分解能まで範囲を狭める
}
return 0;
}
>>274 ifの閉じ括弧の後ろに全角スペースが入ってる。消せばおけ。
>>260 if((fp0 = fopen(argv[3],"r")) != NULL){
int m;
char *p_key;
for(m=0; m<571; m++){
if((fgets(k[m],571,fp0))==NULL) break;
if(p_key = strchr(k[m], '\n')) *p_key = '\0';
printf("[%s]\n", k[m]);
}
}
この行はいらなかった。削除してくれ。 > printf("[%s]\n", k[m]);
>>276 すばらしい!
ありがたく参考させていただきます。
多謝
>>272 合掌を2chのノリ??
合掌や南無は,インターネットが流行る以前,つーか紙媒体でも,
ありふれた結語だったぞ???
数学の点数のデータが入った1次元配列のアドレスと人数を受け取り、それらの最大点、最小点、平均点を求めて 返す関数を作成せよ。 ただしmain関数では、最初に点数データを初期値代入し、関数を呼び出した後は最大点,最小点 平均点の値を出力せよ。
285 :
デフォルトの名無しさん :04/06/27 00:30
引数渡しした数を足し込み、それまでの合計値を返す関数sum_up()を作成し、 プログラムを完成せよ。このときの関数のプロトタイプは、 int sum_up(int n); とする。引数として-999999999という値を渡すと、それまでの合計値を0にクリアするようにせよ。 この値は記号定数、 #define CLEAR -999999999 として、CLEARという名前で使用できるようにせよ。main()関数は以下のものを使用せよ。 int main(void) { int i; sum_up(CLEAR); for(i=0;i<=100;i++) sum_up(i); printf("total=%d\n", sum_up(0)); return (0); }
>>285 int sum_up(int n){
static int sum;
if(n==CLEAR) sum=0;
else sum+=n;
return sum;
}
int sum_up(int n) { static int sum; if(n==CLEAR) sum=0; else sum+=n; return sum; }
かぶった
ああ、変数までかぶった・・・
290 :
デフォルトの名無しさん :04/06/27 00:36
せっかくだから漏れも int sum_up(int n) { static int sum; if (n == CLEAR) sum = 0; else sum += n; return sum; }
リロードしてよかった…三重婚は不健全だよね。
292 :
デフォルトの名無しさん :04/06/27 00:38
何がせっかくなんだよ(w int sum_up(int n) { static int sum; if (n == CLEAR) sum = 0; else sum += n; return sum; }
293 :
デフォルトの名無しさん :04/06/27 00:44
>>286〜292 こ、こんなに短いんですか!?
ゴメン 長すぎたか・・・ int sum_up(int n){ static int sum; return sum=(n==CLEAR)?0:SUM+n; }
SUMは小文字
>>297 長くてもいいから動くのを書いてください!
>297 int sum_up(int n){ static int sum; return sum+=(n==CLEAR)?-sum:n; }
文句ある? っちゅーかも前は 何行くらいの関数になると思ってたのさ?
303 :
デフォルトの名無しさん :04/06/27 00:58
これで頭に #include <stdio.h> って付ければ終わりですね?
307 :
デフォルトの名無しさん :04/06/27 01:02
int sum_up(int n) { static int sum; static int check = 0; if (check == 1){ sum = 0; check = 0; } if (n == CLEAR) { check = 1; return 0; } else { sum = sum + n; return sum; } }
>307 なぜcheckが必要なんだ? >285 には >main()関数は以下のものを使用せよ。 とあるが?
>>308 きっと285のご期待に応えて長いの作ったのだと思われ
>>308 つっこむ所はそこぢゃない。checkを使おうが使うまいが、
どのみち初回にCLEARで呼び出さなければゴミを返す所だ(w
おまえら、こんな深夜まで起きてるなんて・・・ ひまなんだな
>>311 ゴミかえさないよ。
ちゃんと初期化されるもんsun
>>311 staticな変数はゼロで初期化されるの知らないの?
訂正しますね。 int sum_up(int n) { static int sum; static int check;; if (check == 1) { sum = 0; } if (n == CLEAR) { check = 1; return 0; } else { sum = sum + n; check = 0; return sum; } }
318 :
デフォルトの名無しさん :04/06/27 01:40
>260 えー文句言うばかりではあれなので、がんばってみました。 で、削除する文字列リストに改行とかが入っているからでは? for(m=0; m<571; m++){ char buf[571] ; if((fgets(buf,571,fp0))==NULL) break; strcpy(k[m],strtok(buf,DELIMITER)); }
>313 >315 ネタにマジレス (316 で自己解決してしまったが...)
専用ブラウザ使ってたから気が付かなかったけど、 「あらゆる質問はまずすれ立てるまでもない質問はここでスレにしてください。」 って書いてあるのね・・・
>>281 > 合掌や南無は,インターネットが流行る以前,つーか紙媒体でも,
> ありふれた結語だったぞ???
ソースは?
πを求めるプログラムで #include<stdio.h> #include<math.h> #include<stdlib.h> #include"sgl.h" main() { int l,m,col1,col2,col3,col4; double x,y,i,a,iseed; sgl_winsize(400,400); sgl_init(); col1=sgl_colordef("black"); col2=sgl_colordef("gold"); col3=sgl_colordef("brown"); col4=sgl_colordef("red"); sgl_pos_win(300,300); sgl_color_background(col2); sgl_color(col3); sgl_disc(0,0,1.0); printf("乱数を入力\n"); scanf("%d",&m); printf("実行回数を入力\n"); scanf("%d",&l); srand(m);
for(i=1;i<=l;++i) { x=(double)rand()/RAND_MAX; y=sqrt(1-x*x); a+=y; sgl_color(col1); sgl_circle(x,y,0.005); } sgl_color(col4); sgl_line(0,a/l,1,a/l); a=(a/l)*4; printf("円周率の近似値は%f \nです.",a); sgl_display(); return 0; } ここまで出来たのですが、さらにこれの棒グラフもあらわせと言われました。 これにどのようなプログラムを付け足したらよいでしょうか?
↑ 名前322の間違い
325 :
デフォルトの名無しさん :04/06/27 04:08
>322 棒グラフをあらわすプログラムを足せばいいじゃねーか? これ以上のことを答えるのはむずかしーわな。 きっと、独自の描画関数が用意されているんだろう。 sgl.hの中とかに…
sprintfで、配列[5]からiの値を入れたい場合 sprintf(&配列[5],"%d",i) で良いんですか?
>>326 かなり違う。
sprintf(書き込み対象の文字列,"%うんちゃらとか",変換対象の変数);
みたいな感じ。てういかman見れ。
>>327 配列ってcharの配列じゃないのか
[0]〜[4]には既に何か入っていて[5]から入れたいとか
それだったら
>>326 の方法であっているはずだけど
あ、そういうことか。かなり読み違えてた。
>>326 スマソ。
330 :
デフォルトの名無しさん :04/06/27 13:08
eのx乗 = x/1 この方程式を二分法で解くプログラムを作成しなさい。 いろいろ立て込んでるようですがお願いします。
x/1 って何 xを1で割ってんの 二分法って何(調べりゃ分かるけど調べない)
x=1のとき e=1/1?
すいません1/x(x分の1)でした・・
>>333 さんありがとうございます、明日ガッコいって調べてみます
Innerという関数名で、2つの2次元ベクトルu,vの内積(u・v) を計算する関数プログラムを作りなさい。(u,vを引数とする) 宿題ではなく過去問です。よろしくお願いします。
2次元ベクトル
2次元ベクトル
二次元ベクタ
> ご回答有難う御座います。 ウザい。 おまえら役に立たねぇんだよヽ(`Д´)ノ ぐらいが丁度良い
342 :
デフォルトの名無しさん :04/06/27 18:17
2つの複素数の積を計算する構造体の関数を作成されよ。すなわち複素数の実数部と虚数部 をメンバーで表現する構造体を宣言され、その構造体の型を持つ変数を引数で受け取り、それらの 積(複素数)を返却値で戻されよ。ただしmain関数では最初に2つの複素数に適当な値を与え 2つの複素数と積の値を出力せよ
>336 #include<iostream> #include<vector> #include<numeric> #include<algorithm> #include<iterator> using namespace std; // 336によるとu,vは要素数2限定、らしい template <typename T> T Inner( const vector<T> &u, const vector<T> &v ) { return inner_product( u.begin( ), u.end( ), v.begin( ), 0 ); } // テスト。 int main() { int U[]={1,2}, V[]={3,4}; vector<int> u, v; copy( U, U+2, back_inserter( u )); copy( V, V+2, back_inserter( v )); cout << Inner( u, v ) << endl; }
344 :
デフォルトの名無しさん :04/06/27 19:41
1から100までの素数を出力しなさい。 また、それらの和も出力しなさい。 お願いします。
>344 // 意図的にバグを入れているので注意。 #include<iostream> using namespace std; int main(){ int primes[] = { 2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,91,97 }; int sum, i; for( i=0,sum=0; i<sizeof(primes)/sizeof(primes[0]); ++i ) { cout << primes[i] << endl; sum += primes[i]; } cout << "SUM = " << sum << endl; }
>>342 #include<stdio.h>
#include<math.h>
struct complex{double re;double im;};
complex mul(complex lhs,complex rhs)
{
complex ans;
ans.re = lhs.re*rhs.re - lhs.im*rhs.im;
ans.im = lhs.re*rhs.im + lhs.im*rhs.re;
return ans;
}
complex input(void)
{
char buf[256];
complex ret;
printf("Input Real:");
ret.re = atof(fgets(buf,sizeof(buf),stdin));
printf("Input Imaginary:");
ret.im = atof(fgets(buf,sizeof(buf),stdin));
return ret;
}
int main()
{
complex a,b,c;
a = input();
b = input();
c = mul(a,b);
printf("%f%+fi * %f%+fi = %f%+fi\n",a.re,a.im,b.re,b.im,c.re,c.im);
return 0;
}
Cで書いて欲しいのかC++で書いて欲しいのかどっちか判別つかん。
二分木の高さを計る関数を作ってほしいんですが
>>347 指定が無ければどっちで書いてもいいんじゃない?
>348 出力しろ、とはあるけれど、求めよ、ではないし。
354 :
デフォルトの名無しさん :04/06/27 20:29
@キーボードからデータを入力し、初めてマイナスの数が入力されるまでのデータのうち、 最大値と最小値を計算し、 またその最大値、最小値が入力された順番を表示するプログラム A2つの正数m、nの最大公約数を計算する関数 int gcd (int n, int m) を書きなさい よろkしくおねがいします。
355 :
デフォルトの名無しさん :04/06/27 20:30
悪い書き方 #include <stdio.h> int main(void) { int i,j; for (i=2;i<=100;i++) for(j=2; j<i,i%j!=0; j++)if (j==i-1) printf("%d\n", i); return 0; }
>>354 2、どっちか。
int gcd(int m,int n){
if (n==0) return m;
else return gcd(n, m % n);
}
int gcd(int m, int n){
int t;
while (n != 0){
t = m; m = n; n = t % n;
}
return m;
}
mとn逆だったね。
>>354 頼んでる身分でさぁ誤字あったら訂正しろや
359 :
デフォルトの名無しさん :04/06/27 20:49
1、 #include <stdio.h> int main(void) { int x, max = -1, max_i = -1, min = -1, min_i = -1, i; for (i=1;;i++){ printf("x >> "); scanf("%d", &x); if (x < 0) break; if (i==1){ max = x; min = x; max_i = 1; min_i = 1; } if (x > max){ max = x; max_i = i; } if (x < min){ min = x; min_i = i; } } printf("max = %d(%d番目) min = %d(%d番目)\n", max, max_i, min, min_i); return 0; }
>>350 二分木のrootからleafまでの最長距離を求める関数を作成せよ
>>361 二分探査でたどるごとにカウントしていけばよかろう
終了
>>349 typedef struct _node{
struct _node *left;
struct _node *right;
void *data;
}node;
typedef {
node *root;
int max_height;
} binary_tree;
int getMaxHeight(binary_tree *bt){
return bt->max_height;
}
364 :
デフォルトの名無しさん :04/06/27 21:07
×typedef { ○typedef struct {
int length(Node *root) { int r = (root->right == NULL ? 0 : length(root->right)); int l = (root->left == NULL ? 0 : length(root->left)); return max(r, l) + 1; } ニュアンス的にはこんな感じ。
366 :
デフォルトの名無しさん :04/06/27 21:16
宿題でこんなんでました。 文字列のファイル入出力プログラムをつくりなさい。 (fprint,fscanf版 と fread,fwrite版) よろしくお願いします。
fprintf と fscanf と fread と fwrite が ファイル入出力プログラムそのものですよ?
368 :
教えてください :04/06/27 22:48
提出期限まで書くなよ
372 :
デフォルトの名無しさん :04/06/27 23:17
sin(90)の結果を1.0000…にしたいのですが、0.8939966…(正確な値?)となってしまいます。 どうすれば1.0000…になるのでしょうか? 同様にsin(180)は0、sin(270)は-1という結果を出したいのですが・・・。
どうせ理科大だろ
sin(PI / 180 * 90)
377 :
デフォルトの名無しさん :04/06/27 23:35
2個の整数の最大値を返す関数max2(int a,int b)を作りなさい。 関数max2を使って、3個の整数を読み込んで、最大値、最小値を 表示するプログラミングを作りなさい。 お願いします
最小値を求めるのにも max2を使わなきゃならんのか
int max2(int a,int b){ return (a > b) ? a: b; }
maxim = max2(max2(a, b), c); あとは任せた↓
プログラミングを作るんだぞ。わかってんのか?
382 :
教えてください :04/06/27 23:50
>369〜371 54は私です。59,60のプログラムは難しくて分かりませんでした。
int max3( int a, int b, int c ) { return max2( max2( a, b ), c ); } int min3( int a, int b, int c ) { return -max3( -a, -b, -c ); } こうかな?
なるほど、最小値は符号逆にすりゃいいのか。 #include <stdio.h> int max2(int a, int b) { return (a > b) ? a : b; } int main(void) { int x, y, z, min; printf("x y z:"); scanf("%d%d%d",&x,&y,&z); printf("最大値:%d", max2(max2(x,y), z)); printf("最小値:%d", -max2(max2(-x,-y), -z)); return 0; }
>>383 なるほど、マイナスか・・・
勉強になった
なにげにお前ら頭いいな
すいませんがどなたか21代目の過去ログをウプしてもらえませんか?
>>385 なんつーか……、課題よく読みなおした方がいいぞ。
おまいさんのプログラムだと、読み出した値そのままで最大最小平均取ってる。
読み出した値から測定値に戻す作業せんと。
>389 /*data.txt の内容を読み込み、個数、最小値、最大値、実際の測定値を求める 部分*/ に、読み出した値から測定値に戻す作業 追加すればいいんですか? でも具体的にどうすればいいかわかりません… 2進数直して上位8ビットに256を掛けてやつと下位8ビットの和 からoffsetを引いて100で割ると測定値になるんですが、 ???です???
二つの整数a, b を引数としてaをbで割った際の余りを返す関数を、演算 子 % を使わずに作成し、その動作を確かめなさい。ただし、この関数では 再帰呼び出しを用いること。 という宿題が出たのですが、%無しで余りを出すやり方がわからず再帰呼び出しというのもあまりわかってないです・・・。 解答のほうよろしくお願いします。
深い再帰の悪寒
#include <stdio.h> int amari(int a, int b) { if(a>b){ a-=b; amari(a,b); }else if(a==b){ return 0; }else{ return a; } } int main(void) { int a,b; printf("a="); scanf("%d",&a); printf("b="); scanf("%d",&b); printf("a/bの余りは%d\n",amari(a,b)); return 0; }
へ?これだけじゃないの? int minus(int a,int b){ if(a < b)return a; return minus(a - b ,b); }
プログラムの最後で 演算結果をテキストファイル(data.txt)で 出力するにはどうしたらいいんですか?
実行プログラム > data.txt[enter] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>>396 それはわかってるんです・・・
プログラム自体でdata.txtのファイルを作る方法を。
>>391 (・3・)アルェー
b=0と負値の入力はぼるじょあ的処理系依存ですYO!
>>393 >>394 (・3・)アルェー
せめて,これぐらい頭をヒネってくださいYO!
負値入力されると,困っちゃいますYO!
#include <stdlib.h>
int amari(int a, int b){
if(!b) a/=b;
b=abs(b); a=abs(a);
if( a>b ) a=amari(a,2*b);
return a>=b?(a-b):a;
}
>397 入門書とかないの? Cなら int val=0; FILE *fp=fopen("data.txt","w"); fprintf(fp,"演算結果%d",val); fcolse(fp);
解決しました ありがとうございます
回答していただいた方々ありがとうございます。%無しだとそうやるのですね。 ありがとうございましたーm(._.)m
>>401 一応念のために言っておくが、剰余演算子(%)がなくても
普通はもっと簡単に求められる。
例えば負の値を扱わないでよければこれだけ。
int amari(int a, int b) {return a - (a / b) * b;}
403 :
デフォルトの名無しさん :04/06/28 10:14
391を読まずにレスしてしまった。
質問です。 f(x)=xの三乗の定積分を台形則により求めるプログラムを作れという課題が出ました。 言語はCです。よろしくお願いします。
406 :
へぼプログラマー :04/06/28 12:00
>>405 宿題は少し自分で考えろ。全部丸投げはおのれのためにならんぞ!
こういう風に考えたけどどうか?とか少しは自分の考えを述べる!
>>406 いいこと言っていると思う。
宿題回答するだけじゃ一方通行だし。
ソースを評価しあうみたいなこともできるじゃん。
まぁここは、単位のための答だけを求めてるやつと、 そういうやつらをさらにスポイルすることを目的としたやつらが集うスレ
台形則が分からないなら分からないって素直に言えよ
分からない
全部丸なげするような奴のスキルを上げさせないためのスレだと思ってるw
台形則って積分を数式として求めるんじゃなくて微小区間に分割して近似値を求める方法じゃね? aからbまでの区間を求めたいんだったら h=(b−a)/mとすると ∫aからb f(x)dx= h { 1/2 (f(a)+f(b)) + f(a+h)+f(a+2h)+・・・+ f( a + (n-1)h ) } って感じで…
ここは、プログラム書く事くらいしか能の無い香具師が、 その辺の香具師にスキル付けられて食いはぐれないように、 宿題丸投げしてくる普通の香具師に、いかにスキルを付けさせないか企むスレッドです。
なんかさあ、今更丸投げイクナイみたいなレスうざいんだけど。
>416 じゃあ、おまえが答えてやれよ。 俺わかんねーもん。
すみません、色々と説明不足でした。 a,b,分割点数nを入力して、f(x)=xの三乗の定積分∫aからb f(x)dxを台形則により求めるプログラムを作れ 414さんの言うように、a,b区間をn個の台形に分割して、各台形の面積を合計する、という方法でやります。 ∫aからb f(x)dx= h { 1/2 (f(a)+f(b)) + f(a+h)+f(a+2h)+・・・+ f( a + (n-1)h ) } 今自分も友達とやっているのですが、この式が使えそうです。 どなたか解ける方がいましたらよろしくお願いします。
やっぱわかりません(;;) どなたか訂正したソースお願いしますm(__)m
>>59-60 のoffsetと上位と下位から計算してる部分参考にしろよ。
>>405 >>420 ちゃんがいいソースもってきたからさぁ
double snx(double x)
{
return sin(x);
}
のぶぶんをさ
double snx(double x)
{
return x*x*x;
}
とするとイイイヨ
菅沼(・∀・)イイ!
425 :
デフォルトの名無しさん :04/06/28 14:53
どなたかC言語でお願いします。 10個の荷物があります。大きさはそれぞれ以下の通りです。 荷物番号 大きさ 0 3111 1 121 2 1651 3 3748 4 1520 5 4552 6 2883 7 825 8 4839 9 2151 この荷物を容量が10000のナップザックに出来るだけ隙間なく詰めます。 定量的には、荷物の大きさの和が10000以下になる組み合わせのうち 最大になる荷物の組み合わせを求めます。 1)10個の荷物の中で、大きさが3000以下かつその中で最大の荷物を見つけ出し、 その番号と大きさを表示するプログラムを書け。 2)10個の荷物のうち、いくつかの番号を入力し、 入力された番号の荷物のそれぞれの大きさと合計を表示するプログラムを書け。 3)荷物の組み合わせを全て表示するプログラムを書け。 (表示方法は荷物番号だけでよい。) また、表示は膨大な量になるので、提出する場合は一部だけでよい。 4)以上に基づいて(別に基づかなくても良いが) ナップザック問題を解き、正解の組み合わせと大きさの合計を表示する プログラムを書け。 よろしくお願いします。
short nimotsu[10]={3111,121,1651,3748,1520,4552,2883,825,4839,2151} ,box=0,j for(i=0;i<10;i++){ if(nimotsu[i]<=3000 && nimotsu > box){ box = nimotsu j = i } } printf("番号%d大きさ%d\n", j, nimotsu[j]) これでがんばれ このままじゃコンパイルできないからね
きちんと理解しないとバグがわからないようにプログラム作ってさ わざとバグのあるプログラムをうぷしてやればいいんだよ
431 :
デフォルトの名無しさん :04/06/28 16:10
mallocを使う問題 short型データn体を扱うメモリ領域を確保する。 nはプログラム開始時キーボードから入力する。 また、確保した領域は全て0で初期化すること。
>>431 #include <stdlib.h>
#include <stdio.h>
main()
{
void *mem;
int size;
scanf("%d", &n);
mem = calloc(n, sizeof(short));
}
>>431 #include <stdlib.h>
#include <stdio.h>
main()
{
void *mem;
int size;
scanf("%d", &size);
mem = calloc(size, sizeof(short));
}
435 :
デフォルトの名無しさん :04/06/28 16:21
>422 わかりません(++) 助けて下さいm(__)m
437 :
デフォルトの名無しさん :04/06/28 16:56
>>431 の発展系
次の構造体データをn体扱うプログラム。
nはプログラム開始後入力するものとする。
構造体 enemy_dat
メンバ short型 id;
char型 level;
int型 hp;
char型 pow;
なお、領域確保後idには0〜hまでの
通し番号をその他は全て0で初期化すること。
今学校でやってます。
お暇ならでしたらやってみてください。
先輩方の解答もぜひとも参考にしたいのです。
#include <iostream> #include <vector> typedef struct enemy_dat{ shortid; charlevel; inthp; charpow; }EnemyDat; using namespace std; vector<EnemyDat> Enemy; int main(void){ EnemyDat init_dat; int vol; memset(&init_dat, 0, sizeof(EnemyDat)); cout <<"確保する数を入力\n"<<endl; cin >> vol; Enemy.assign(vol, init_dat); vector<EnemyDat>::iterator it; int i=0; for(it = Enemy.begin(); it != Enemy.end(); it++, i++)it->id=i; return 0; }
>>437 #include <stdlib.h>
#include <stdio.h>
typedef struct _enemy_dat2
{
short id;
char level;
char pow;
int hp;
} enemy_dat;
int main(void)
{
enemy_dat* ed;
int size;
scanf("%d", &size);
ed = (enemy_dat*)calloc(size, sizeof(enemy_dat));
for (int i=0; i<size; ++ed, ++i) ed->id = i;
return 0;
}
enemy_data はアライメント考慮してメンバの位置を変えた。
441 :
デフォルトの名無しさん :04/06/28 18:37
どなたかC++でお願いします。 テキスト・モードにおけるブロック崩しゲームを作成する。 ・ボール:2バイトコードの「●」を使用する。色は自由。 ・壁 :2バイトコードの「■」を使用する。色は自由。 ・ラケット :2バイトコードで各自自由とする 下記のプリプロセッサ処理をする。 #include<stdio.h> #include<conio.h> #include<time.h> #include<dos.h> #define CLS() #define COLOR(n) #define LOCATE() #define CURSOLE(f) #define FUNCTION(f) #define SCREEN(f) #define RIGHT #define LEFT その他 よろしくお願いします。
Win2k以降はエスケープシーケンスつかえないだろ
>>441 残念ながらdos.hとかconio.hというヘッダファイルはオレの環境には存在しない。
>>441 >#inlcude <stdio.h>
>...
C++ だろ?
エスケープシーケンスかと思ったけど、 毎回全画面書き換えればできるか
C++にもstdio.hあるよ。 cstdioもあるけど
>>447 コンソールの行数はどうやって取得するの?
自分で壁書くんだから80とか固定でいいだろ
MS-DOS の頃は INT21 で返してくれたように思う。 今はしらん。
この辺使っていいの? void gotoxy(int x, int y); int movetext(int left, int top, int right, int bottom, int destleft, int desttop);
>>438 さん
C++でしょうか?
自分にはその知識がありません。
とても勉強になります。
>>439 さん
>enemy_data はアライメント考慮してメンバの位置を変えた。
学校側としてもこれが言いたいがために出した問題だったようです。
大正解、さすがです。
お二方とも、どうもありがとうございました。
455 :
デフォルトの名無しさん :04/06/28 21:47
457 :
デフォルトの名無しさん :04/06/28 22:06
考えても分かりませんでした..。よろしくおねがいします! 配列をポインタにより処理する課題 次のような配列xの宣言がある。 int x[8]={10,2,-3,4,55,6,-71,8}; int型へのポインタpt1,pt2を用意し、 pt1=x; pt2=x+8; とおけば、*pt1はx[0]、*pt2はx[8]を参照する。配列xの要素を逆順に並べ替える 処理をポインタpt1,pt2を使って書け。(配列記法x[i]は使ってはならない。処理が 完了している事をprintf()により配列をプリントし提出せよ。)
#include <stdio.h> #include <stdlib.h> #include <string.h> #define Number 30 void DisplayStudent(struct Student*); struct Student{ // 学生を表す構造体 char name[20];// 氏名 char sex[4];// 性別 char address[100]; // 住所 char number[10];// 出席番号 int math;// 数学の点数 int eng;// 英語の点数 int prog;// プログラミングの点数}; void main(){ int i; struct Student *p; struct Student student[Number]={ "セガタ サンシロウ","♂","東京都渋谷区","0000123",50,60,90,}; p = student; for(i=0;i<Number;i++){ DisplayStudent(p+i);} printf("構造体の大きさ:%d \n", sizeof(struct Student)); } void DisplayStudent(struct Student* student){ printf("%s %s : 数学=%d, 英語=%d, プログラミング=%d \n", student->name, student->number, student->math, student->eng, student->prog);}
>>457 問題文がちと変だな。
例示するんなら pt2 = x+7 にするか、配列が int x[9] じゃないと。
int x[8]={10,2,-3,4,55,6,-71,8};
int *pt1 = x, *pt2 = x+7;
for (int i=0; i<4; i++) {
int tmp = *pt1;
*pt1 = *pt2;
*pt2 = tmp;
pt1++; pt2--;
}
pt1 = x;
for (int i=0; i<8; i++) {
printf("%d ", *pt1);
pt1++;
}
printf("\n");
こんな感じで。
改行制度ため、見にくいです。スンマセン ↑を元にしたような感じで、 例えば数学の点数を?点以上の生徒の氏名から出席番号、点数を 表示させるプログラムをお願いしたいのですが・・・ ?点はキー入力でお願いいたします。どうか。
有難う御座います!試してみます。 課題のプリントはミスプリントであると授業で言ってたかも しれません。pt2=x+7と訂正していたと思います。すみません!
>>457 指定が無いのでC++とした。
#include<cstdio>
#include<algorithm>
using namespace std;
void printnum( int i ) {
printf( "%i\n", i );
}
int main( ) {
int x[8]={10,2,-3,4,55,6,-71,8}; // 良い子のみんなはx[]={...}だ!
int *pt1=x, *pt2=x+8; //良い子はx+sizeof(x)/sizeof(x[0])だ!
reverse( pt1, pt2 );
for_each( pt1, pt2, printnum );
}
>>462 多分Cだと思います。459様のを試して頑張ってつくってみます。
何かさらに教えてくれる事があったらおねがいします。
%i
すみません
>>457 をもう少し詳しく教えてください。
>>466 問題を把握しきれてないんだろうよ、本人が(w
何を教えればいいのか分からんぞ。
出来ました。迷惑掛けました。 ありがとうございます!
>>468 そうかもしれません、すみません!
ところで
>>464 は何が言いたかったのだろう???
>>467 ほらよ。
#include <stdio.h>
int main(){
int x[8]={10,2,-3,4,55,6,-71,8}, *pt1, *pt2;
pt1 = x; pt2 = x + 8;
while(pt1 < --pt2){
*pt1^=*pt2^=*pt1^=*pt2;
pt1++;
}
for(pt1 = pt2 = x; pt2 - pt1 < 8; pt2++)
printf("%d ", *pt2);
return 0;
}
>>472 ありがとうございます。
多レス申し訳ございません。
"^="なんてゆう演算子ってあったっけ?
あぁXORか
*pt1^=*pt2^=*pt1^=*pt2; ↑ こんなの提出したら挑発だと思われるだろうなw
そうか?
ちょっと分からなかった。ワロタ。なーるほどね。 俺、まだまだ青いなぁ。
アクロバット
アクロバットリーダーたけし
484 :
デフォルトの名無しさん :04/06/29 00:30
*pt1^=*pt2^=*pt1^=*pt2; これいいな〜 もらっていい?
最近cをはじめたのですが、こんな課題が出ました。 3次元ベクトルを要素が実数の1次元配列で表すものとする。 2つの3次元ベクトルの配列を第1、第2引数として受け取り、 それぞれのベクトルの大きさを第3、第4引数に、内積を関数値として返す関数を作成する。この関数を用い2つのベクトルを入力して、それらの大きさと内積を表示せよ。 配列使って内積を出すくらいはわかるのですが、関数使うとなるとわからなくなってしまいます。出来れば解答をよろしくお願いします。
458お願いしますよ・・・(´ω`)
>>485 ソースなんか要らなかったな。for の中よく見れ。よーーく見れ。
>>488 もしかしてfor文の繰り返し判断式は二つ以上書いてはだめってやつですか?
damepo...
>>486 >配列使って内積を出すくらいはわかるのですが、
じゃぁまずそこまで書いてみれ。
>>490 ちゃうわ コンパイル通ってたらだめもへったくれもないだろ
495 :
デフォルトの名無しさん :04/06/29 01:25
>>486 書いてみます。慣れた人からみれば無駄に長いのでしょうが勘弁してやってください(;´Д`
#include <stdio.h>
int main(void){
int i;
double j[3],k[3],sum=0.0;
printf("2つの3次元ベクトルjとkの数値を入力しなさい\n");
for(i=0;i<3;i++){
scanf("%lf",&j[i]);
}
for(i=0;i<3;i++){
scanf("%lf",&k[i]);
}
printf("j=(%f,%f,%f)\n",j[0],j[1],j[2]);
printf("k=(%f,%f,%f)\n",k[0],k[1],k[2]);
for(i=0;i<3;i++){
sum+=j[i]*k[i];
}
printf("j×k=%f\n",sum);
return 0;
}
sage忘れた上に、レス番号違ってる・・・。
>>492 さんへでした<(_ _)>
i<kurikaesi || x.nenryo<0 i が kurikaesi より小さければtrue i が kurikaesi 以上で x.nenryo が 0より小さければtrue i が kurikaesi 以上で x.nenryo が 0以上ならfalse
498 :
デフォルトの名無しさん :04/06/29 01:31
別にageても誰も文句は言わないよ・・・
>>494 ぱっと見、こういう感じかなぁ。
この関数の引数はどんな感じになるのか...
prev = NULL;
thisnode = head_of_list;
while(thisnode != NULL)
{
next_of_thisnode = thisnode->next;
thisnode->next = prev;
prev = thisnode;
thisnode = next_of_thisnode;
}
>>492 if(x.nenryo<0)をforの中に入れてbreakで途中で抜け出すぐらいか思いつきませんでした。
for(int i=0; i<kurikaesi; i++)の中にどのようにx.nenryo<0を入れていいか思いつきませぬ。
>>495 double s(double[], double[]);
main(略
double s(double j[], double k[]) {
int i;
double sum=0.0;
for(i=0;i<3;i++){
sum+=j[i]*k[i];
}
return sum;
}
こうするだけだよ。double[] もらって double 返す。
>>497 をよく読め。
x.nenryo<0 を入れるという発想がおかしいんだぞ(できないこともないが)
if () break; なら抜ける条件、for の中なら抜けない条件だ。分かるか?
503 :
デフォルトの名無しさん :04/06/29 01:41
>>502 497見る前にレスしてしまいました。
もうすこし自力で考えます。
>>499 node_t *insert_node(node_t **nd_ptrptr, int n, data_t dt)
{
node_t * nd_ptr;
node_t ** ptrptr;
ptrptr = nd_ptrptr;
while (n != 0 && *ptrptr != NULL) {
nd_ptrptr = &((*ptrptr)->next);
n--;
}
nd_ptr = new_node(dt, *ptrptr);
if (nd_ptr == NULL) return NULL;
*ptrptr = nd_ptr;
return nd_ptr;
}
これをいじってはできませんかね?
>>500 オイオイ,
if(条件) break; と while(条件) じゃ,条件判定論理が正反対だぞ?
判ってるのか?
if( a==0 ) break;→while(a!=0)
if( a&&b ) break;→while( !a||!b )
>>504 すまぬがそのソースは頭のやわらかい人に読んでもらってくらはい。
>>505 while(i<kurikaesi && x.nenryo>0){
x.Accel(nyuryoku_hunsya);
x.Report(i+1);
i++;
}
今までのアドバイスを受けてできたのがこれですがいかがなものでしょうか。。。
>>508 それだと x.nenryo == 0 でもtrueだね。
つーかforでやるんじゃなかったの?別に好き好きだけど。
>>494 >>504 コラコラ,逆順にするだけで新しいノード作るなよ。
node_t *reverse(node_t *node){
node_t *old_next;
node_t *new_next=NULL;
while(TRUE){
old_next=node->next;
node->next=new_next;
if( old_next==NULL ) break;
new_next=node;
node=old_next;
}
return node;
}
すごい亀レスですが、質問させてください。
>>85 をみました。
途中にある、
switch(mm){
case 12:youbi+=30;
case 11:youbi+=31;
case 10:youbi+=30;
case 9:youbi+=31;
case 8:youbi+=31;
case 7:youbi+=30;
case 6:youbi+=31;
case 5:youbi+=30;
case 4:youbi+=31;
case 3:youbi+=feb;
case 2:youbi+=31;
}
youbi=youbi%7;
なぜこんなことをするのかがわかりません。
おえしえてください。
>>510 君も番兵様なNULLノード作ってるやん(w
錨みたいにそこへ繋げるのね・・・
>>511 例外処理
>>509 for(int i=0; i<kurikaesi; i++){
if(x.nenryo<=0){
cout << "燃料が0以下になりました\n";
break;
}
x.Accel(nyuryoku_hunsya);
x.Report(i+1);
}
for文でもう一度考え直しました。
ちょうど0ならそこで終われますがnenryoが10から-20とかになると-20と表示されてしまうのがなんとも。。
>>85 は読んじゃいないが,
前月までの日数の総和を算出しているように見える。
516 :
デフォルトの名無しさん :04/06/29 02:19
>>512 逆順って、たとえば3 4 5 6 7と並んでいたら、7 6 5 4 3にするということだよな?
>>510 じゃならないぞ。
>>513 >>504 の
>node_t *insert_node(node_t **nd_ptrptr, int n, data_t dt)
>これをいじってはできませんかね?
『これを使って』と勘違い…_| ̄|●
あ、勘違いしていた。スマソ。
漏れはソースを反射的に読まなかったんだが、おまえらなんだかんだ言って優しいですね。
(´ω`)ちょっとハカーに変身しるわ
for(int i=0; i<kurikaesi; i++){ if(x.nenryo>0){ x.Accel(nyuryoku_hunsya); } if(x.nenryo<=0){ cout << "燃料が0以下になりました\n"; break; } x.Report(i+1); }
>>521 ありがとうございますm(_ _)m
頭悪くて申し訳ないです。
なななんか、盛り上がってんな(〃▽〃)
>>494 再帰にしてみた。
static node_t *reverseMain(node_t *node1, node_t *node2) {
if (node1) {
node_t *nnode = node1->next;
node1->next = node2;
reverseMain(nnode, node1);
} else {
return node2;
}
}
void reverse_list(node_t **node) {
*node = reverseMain(*node, NULL);
}
5行めのreverseMainの前、return忘れた、、、。
>>522 あのさ、&&は思いつかなかったんか?
for (int i = 0; i < kurikaesi && x.nenryo > 0; ++i) { ... }
ふふ
529 :
デフォルトの名無しさん :04/06/29 13:00
692 :デフォルトの名無しさん :04/06/29 12:50 ファイルから実数型のデータを入力し、分散を求め、ファイルに出力するプログラムを作成せよ。 提出期限は、次週の授業開始時までとする。 ただし、プログラム仕様は下記のとおり。 (1) 入力するデータの数は100個とする。 (2) 分散を求めるために、ファイルを2回読み込む方式を取れ。 (本当は配列で取っておき、計算する方が効率が良いが、 前章のファイル入出力の復習の意味 を含め、2回読み込 む方式を採用することにする) (3) ファイルへの出力フォーマットは、下記のとおり。 平均 = 平均の計算結果 分散 = 分散の計算結果 ただし、最大値、最小値が複数存在する場合には、データ中での先頭からの番号は、 若い方にせよ。 (4) 入力ファイル名は、input.dat、出力ファイル名は、output.dat。 お願いします。
猿スレにまでマルチですか。必死ですね。
531 :
デフォルトの名無しさん :04/06/29 13:46
マルチうざい ググれよ池沼
>>531 コンパイルできないコードが書かれています。
test2.c 25: 'M_PI' undefined test2.c 37: syntax error near 'void' test2.c 38: syntax error near '{' test2.c 46: 'xRe' undefined test2.c 46: 'xIm' undefined test2.c 47: 'xRe' undefined test2.c 47: 'xRe' undefined test2.c 47: 'xIm' undefined test2.c 47: 'xIm' undefined test2.c 48: 'xRe' undefined test2.c 48: 'xIm' undefined test2.c 61: 'M_PI' undefined test2.c 61: 'M_PI' undefined test2.c 65: 'xRe' undefined test2.c 65: 'xIm' undefined test2.c 66: 'xRe' undefined test2.c 66: 'xIm' undefined test2.c 66: 'xRe' undefined test2.c 66: 'xRe' undefined test2.c 66: 'xIm' undefined
>>535 これでどうですか?
copy_list(node_t *nd_ptr)
{
node_t * p;
data_t dt;
p = nd_ptr;>while(p != NULL){
dt = p->data;
p = p->next;
}
}
>>535 複写ってリストの複製を作るってこと?
node_t *duplicate_list(node_t *node) {
if (node == NULL) return NULL;
return new_node(node->data, duplicate_list(node->next));
}
#include<stdio.h> int main(void) { int i=0; int n; int sum=1; double totalsum=0; printf("n=:"); scanf("%d",&n); do{ i++; sum*=i; totalsum+=1.0/sum; }while(i<n); printf("%f,%d",totalsum,sum); return(0); } n=100を代入しても計算できるようにするにはどうすればいいのですか?
すいません条件が増えたのでもう1度書き込みます。 どなたかC++でお願いします。 テキスト・モードにおけるブロック崩しゲームを作成する。 ・ボール:2バイトコードの「●」を使用する。色は自由。 ・壁 :2バイトコードの「■」を使用する。色は自由。 ・ラケット :2バイトコードで各自自由とする ・ブロック :「■■■■」で1つのブロックとする ライフ・スコアをつけ、ゲームスタート・ゲームオーバーを表示する。 下記のプリプロセッサ処理をする。 #include<stdio.h> #include<conio.h> #include<time.h> #include<dos.h> #define CLS() #define COLOR(n) #define LOCATE() #define CURSOLE(f) #define FUNCTION(f) #define SCREEN(f) #define RIGHT #define LEFT その他 よろしくお願いします。
mallocは失敗しないと仮定するw
>>539 オレの環境にはconio.hもdos.hもない。
>>539 >#inlcude <stdio.h>
>...
C++ だろ?
C++にもstdio.hあるよ。 cstdioもあるけど
Cのライブラリとしてついてるんじゃないのか。 C++の標準ライブラリに.hはつかなかったはず・・・ ごめん、記憶違いかも
546 :
デフォルトの名無しさん :04/06/29 17:44
C++にも.hはつきます
>>539 >>441 でも気になってたんだが
>(略)
>#define RIGHT
>#define LEFT
>その他
その他ってなんだ?
むしろ.hpp
>>526 ありがとうございます。
前に間違えてfor (int i = 0; i < kurikaesi || x.nenryo < 0; ++i){ とやったことがあるのですがこれだとなぜいつまでも終了しないんでしょうか。
iは繰り返しの数を超えていてx.nenryoがマイナスになっても続くのですが。。。
>>550 >x.nenryo < 0
燃料が0以下(マイナス)の間、ループするってことになっている
forやwhileの条件式は成立すればループするって扱い
>>539 それっていつまでの宿題?
日数かかりそうだから別のスレに移動した方がよくないか?
553 :
デフォルトの名無しさん :04/06/29 18:59
>>551 あ、ほんとだ。。。
ものすごく恥ずかしいですがありがとうございました。
もう少し頭鍛えてきます。
555 :
デフォルトの名無しさん :04/06/29 19:55
556 :
デフォルトの名無しさん :04/06/29 19:58
>>552 すいません間違えました。7月7日までです。
壁の弾性計算とかラケットの摩擦係数とかブロックからの反射角とかボールの 加速度とかを良く考えないといけないから('A`)マンドクソ
558 :
デフォルトの名無しさん :04/06/29 20:12
整数を大きいものから順に並びかえるプログラムなんですけど、?の所に何が 入るかわかりません。どなたか教えていただけませんか? #include <stdio.h> #include <math.h> void printArray(int array[],int num); main() { FILE *fp,*wp; int data[100],num,i,j; int max,maxPos; fp=fopen("num.txt","r"); if (fp==NULL){/*エラ処理*/ printf(" not exist\n "); return 1; } i=0; while(fscanf(fp,"%d",&data[i]) != EOF){ i=i+1; } num=i-1; fclose(fp); printArray(data,num);
559 :
デフォルトの名無しさん :04/06/29 20:14
for(j=0;j<num;j=j+1){ max=data[j];maxPos=j; for(i=j;i<? ;i=i+1){ if (max < data[i]) { max=data[? ]; maxPos=i; } } data[? ]=data[j];data[j]=max; } printArray(data,num); /* ファイルに保存する */ wp=fopen("numr.txt","w"); if (wp==NULL){ printf("make file error \n "); return 1; } for(i=0;i<num;i++){ fprintf(wp,"%d\n",data[i]); } fclose(wp); return 0; } void printArray(int array[],int num){ int i; for(i=0;i<num;i=i+1) printf("%4d",? ); printf("\n"); }
560 :
デフォルトの名無しさん :04/06/29 20:31
num=i-1; これおかしくないか? num = iな気がするんだが。 max=data[i]; data[maxPos]=data[j];data[j]=max; printf("%4d",array[i]);
>>557 壁の弾性計算とかラケットの摩擦係数とかそこまで細かく考えずに
ただ打ち返すだけのもので結構です。
562 :
デフォルトの名無しさん :04/06/29 21:06
やはり('A`)マンドクソ 過ぎでしょうか?
>>561 テトリスあるよね?
アレはブロックが落ちてくるけど逆に言うとボールが止まっている訳ね。
これで君へのレスはお姉妹。
565 :
デフォルトの名無しさん :04/06/29 21:57
>>560 ありがとうございます。さっそく明日、大学でやってみます。申し訳ないんですが、for(i=j;i<? ;i=i+1) の?も教えていただけませんか?
566 :
デフォルトの名無しさん :04/06/29 22:07
2分木に行きがけ順(pre-order)で キーボードから文字を読み込み格納したいのですが どのように考えればよいでしょうか? 文字以外が入ったらその先はNULLになるようにしたいのですが。
567 :
デフォルトの名無しさん :04/06/29 22:10
sage
>>563 マンドクサイというよりも、いまどきDOSプログラミングなんて環境ないし、アホラシイ。
GUIなら、それなりにやりがいもあるし、誰かやるだろうけど。
>>567 #define MAXN 10
for (int i=; i<=m; ++i) scanf("%d",&a[i][j])
1オリジンなんだから a[10]は範囲エラー。 a[i-1][j-1] にする。
つーかプロトタイプが main にあったり int det() の定義がおかしかったりするのによく通ったな。
×for (int i=; i<=m; ++i) scanf("%d",&a[i][j]) ○for (int i=1; i<=m; ++i) scanf("%d",&a[i][j])
>>563 ブロック崩しなら七行スレにいくつかあるから
プログラムかけるんなら参考にしてみれば?
オセロ作って来いとか言われたんですけど、相手はコンピューターの・・・ それってC言語ならって半年そこらでつくれるようになるんですか、普通?
対CPUオセロも七行スレにあったな。 Partいくつかは忘れたけど過去スレ全部html化されてるっぽい。
>>574 パクれよ。ただしUIは自前で用意して胡麻枷
>>575 参考に見てみましたが、どこで改行してるのか分からないし
マクロ処理はまだならってないんです
>>576 そ、そんな
>>571 とりあえず
a[10][10]を
a[i-1][j-1]に変えてみたのですがコンパイルエラーが出てしまいました
int b[10],w[10];
int m;
main()
{
int i,j,jj[10];
int a[i-1][j-1];
int aij,bi,d,da;
このようにしたのですが
もしかして私はすごい勘違いをしていますか?
>>571 プロトタイプ宣言がmain()の中にあるのは別におかしくないよ。
>>578 >もしかして私はすごい勘違いをしていますか?
してます。
そういえばディ〜プ ブル〜のアルゴリズムって公開されてたっけ?
2元までの連立方程式は解けて 3元以上になるとプログラムが落ちるというわけの分からない状態なんですが ソースミスならまったく解けないはずだし...
>>578 for 文での話し。
for(i=1;i<=m;++i){
for(j=1;j<=m;++j){
printf("a(%d,%d)=",i,j);
scanf("%d",&a[i][j]);
}
ここで a[i][j] とあるが、i == 10、 j == 10 の時を考えて見れ。
>>580 main() の中だったらプロトタイプの意味ないじゃない?
>>583 クラメルは2次元までだったような…
3次元以上ならガウスのやつだな
>>584 いや、main()の中から呼ぶ関数をmain()で宣言するのは古いスタイルでCommonCではよくあった。
プロトタイプ宣言になってからは、引き数も宣言するようになったので関数外で宣言するのが当たり前になった。
589 :
デフォルトの名無しさん :04/06/30 00:41
590 :
デフォルトの名無しさん :04/06/30 02:37
あの学校のプログラミングの授業で微分方程式を必ず用いてプログラム作れっていう 課題が出たんですけどどんなのやればいいですかね? ちなみにバネ2本つないで振動させるっていうのは駄目らしいです。
何が? 普通に何をやればいいのかわからず・・・
>>566 どうやって文字以外をキーボードから入力するんだ?
懇切丁寧,いたせりつくせりな詳細仕様キボンヌ。
596 :
デフォルトの名無しさん :04/06/30 10:47
引数の個数を固定せず、コマンドラインで指定された全ての実数の 合計を求めるプログラムを教えてください。 Cでお願いしますm(__)m
>>596 #include<stdio.h>
#include<stdlib.h>
int main(int argc,char *arg[])
{
int sum=0,i=1;
while(arg[i]!=NULL){
sum=sum+atoi(arg[i]);
i++;
}
printf("合計値%d\n",sum);
return 0;
}
あー実数だった... よきにはからえ
3並べ(○×ゲーム)のプログラムを作成せよ ただし2人のプレイヤーが交互に座標を入力し、そのたびに 3×3の升目とこま(○×)を表示するようにする。 ヒント:3×3の整数配列を用意し、はじめは全て0で初期化 する。あとは○なら1,×なら2のように表現すればよい。 だそうです。期限が迫ってます、、どうかお力添えをお願いしたいです。Cでお願いしいます
>>599 その昔 X かじってたんで GUI ありで提出したイヤミな俺
だ、誰かわかる方いないでしょうか、、?
#include <stdio.h> int main() { int x, y, i, k, xx, yy; char *names[2] = { "A", "B" }; int matrix[3][3] = { { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 } }; int muls[8]; int over; int player = 0; for (i=0; i<8; i++) { do { printf("%s : x 0-2, y 0-2\n", names[player]); scanf("%d,%d", &xx, &yy); } while ((xx < 0) || (xx > 2) || (yy < 0) || (yy > 2) || (matrix[xx][yy] != 0)); matrix[xx][yy] = player + 1; //表示 for (y=0; y<3; y++) { for (x=0; x<3; x++) { printf("%d ", matrix[x][y]); } printf("\n"); } //判定 for (k=0; k<8; k++) { muls[k] = 1; }
for (y=0; y<3; y++) { for (x=0; x<3; x++) { muls[y] *= matrix[x][y]; muls[3 + x] *= matrix[x][y]; if (x == y) muls[6] *= matrix[x][y]; if (x == 2 - y) muls[7] *= matrix[x][y]; } } over = 0; for (k=0; k<8; k++) { if (muls[k] == 1) { over = 1; break; } else if (muls[k] == 8) { over = 1; break; } } if (over) { printf("%s is\n", names[player]); break; } player = 1 - player; } } 標準で boolean てなかったっけ? for の中に変数宣言できなかったっけ? ブロックの途中に変数宣言できなかったっけ? などと java 漬け+無印コンパイラで右往左往する僕。 センスに欠けてるから怪しまれなくてちょうどいいんじゃないか。
誰か添削して美麗に凝縮したの作ってくれるとうれしい
>>597 argv[argc+1]==NULL ということはないんじゃないか?
607 :
デフォルトの名無しさん :04/06/30 12:59
16進数を入力し、シフト演算子を用いて2進数に変換するプログラムを作成せよ おねがいします
「2進数として表示」って意味でいいんだろうなこの場合。
609 :
ぼるじょあ ◆yBEncckFOU :04/06/30 13:19
>>607 先頭に無駄な0が表示されるけど、気にしない気にしない(・3・)
#include <stdio.h>
#include <limits.h>
int main()
{
unsigned a,b;
int i;
scanf("%x",&a);
for(b=1U<<sizeof(unsigned)*CHAR_BIT-1;b;b>>=1U)
putchar(a&b?'1':'0');
putchar('\n');
return 0;
}
610 :
ぼるじょあ ◆yBEncckFOU :04/06/30 13:24
必要のないint i;を消し忘れた。
>>612 ありがとうございます。
恩にきります!!
ソースコードを読めるようになるのが先か書けるようになるのが先か…
勝利メッセージの部分をなおし間違えて "A is" なんてした僕がすまんかった
未経験のオヤジの目算じゃ当てにならないな 5分で終わるかもしれないし3ヶ月の案件かも知れん
コソボ イラク ごめん
618 :
デフォルトの名無しさん :04/06/30 16:14
619 :
デフォルトの名無しさん :04/06/30 17:09
回転の(行列を含む)計算に、何の値を入れたら何の値が返って来るのでしょうか(´・ω・`) 例えばベクトルx=0,y=0,z=10と回転xziku=90,yziku=0,zziku=0を入れると、x=0,y=10,z=10が返ってくるという考えでいいのでしょうか?
最後のはz=0ですorz
>>605 >>604 の置換 つーか
>>604 のアルゴリズム理解するのマンドクサー
#define comp(a,b,c) if((a)&&(a)&(b)&(c)) goto end
for(k=0;k<3;++k){
comp(matrix[k][0],matrix[k][1],matrix[k][2]);
comp(matrix[0][k],matrix[1][k],matrix[2][k]);
}
comp(matrix[0][0],matrix[1][1],matrix[2][2]);
comp(matrix[2][0],matrix[1][1],matrix[0][2]);
}
end:
printf("%s is\n", names[player]);
}
>>605 >>603 もちょっぴり置き換えてみるテスト
#include <stdio.h>
int main(){
int x, y, i, k, xx, yy, player;
char *names[] = { ".", "O", "X" };
int matrix[3][3]={0};
for(i=0,player=1; i<9; ++i, player^=3){
do {
printf("%s : x 0-2, y 0-2\n", names[player]);
scanf("%d,%d", &xx, &yy);
} while ((xx < 0) || (xx > 2) || (yy < 0) || (yy > 2) || (matrix[xx][yy] != 0));
matrix[xx][yy] = player;
//表示
for (y=0; y<3; y++) {
for (x=0; x<3; x++) printf("%s", names[matrix[x][y]]);
printf("\n");
}
623 :
デフォルトの名無しさん :04/06/30 17:39
CRandumクラスのメンバ関数に a〜bの一様乱数を生成する関数の実装部分を書く。 但し、関数名はdouble GetVal(double a,double b) の問題なんですが、 double VRandum::GetVal(double a,double b) { } この中のプログラムを教えてください、お願いします。
double VRandum::GetVal(double a,double b) { (*゚∀゚)=3 }
やっぱり 458、460お願いします・・・ どこに・どのようにscanfしたら良いのか分からなくなってきました。 for()の中身もなんか・・・変な風に考えて作ったら動かない・・・ (´ω`)ツマラナイ内容ですけど今一度お願いします
>>625 =>458=>460
以下の関数を付け加えれば、それなりのものができると思うが。
俺にはこれ以上何望んでるかわからんから、他にしたいことあったらもっと詳しく。
あと、作って動かないなら、晒してどうやったら動く?、と聞いた方がよいと思われるが。
void showmath(struct Student *p){
int i,point;
printf("数学の点で表示する最低を入力 =");
scanf("%d",&point);
for(i=0;i<Number;i++){
if((p+i)->math>=point){
DisplayStudent(p+i);
}
}
}
VRandumじゃなくてCRandumですね・・・記述間違い、すいません〜。
むしろRandumが気になる。記述者の間違い?
double VRandum::GetVal(double a,double b) { return rand()%2 ? a : b; }
>628 有り難うございます。 ですがなぜかエラーがでたり・・。 "山田太郎","男","神奈川県横浜市","0123456",56,47,65,}; void showmath(struct Student *p){ int i,point; printf("数学の点で表示する最低を入力 ="); scanf("%d",&point); for(i=0;i<Number;i++){ if((p+i)->math>=point){ DisplayStudent(p+i); } } } 458の続きで、↑のようにしたのですが、 プログラムの内容が理解できません。ので文字列の出力方法が分かりません。 468様のプログラムにはscanf();が見あたらないのですが、出力はされるのでしょうか? 出力=printf();しか知らないので分かりませんでした。
>>632 628じゃないけど下のようにすればいい。
for(i=0;i<Number;i++){
/*DisplayStudent(p+i);*/
showmath(p+i);
printf("構造体の大きさ:%d \n", sizeof(struct Student));
}
間違えた。
>>633 のfor文を削って
showmath(p);
入力した文字数を出力するプログラムを作ってください。 ただし、文字列の先頭アドレスを引数として、文字列の長さを返す関数mylenを作り、main関数でその関数を呼び出すようにしてください。
>>632 >>634 の通りです。
やっぱmain内も書いた方が良かったな…
あと、main以下に書くなら、プロトタイプ宣言忘れずに。
で、一応解説しとくわ
void show(struct Student *p){
int i,point;
printf("数学の点で表示する最低を入力 =");
scanf("%d",&point);//表示させる最低点の入力
for(i=0;i<Number;i++){ //最初から最後まで構造体をすべて調べる。
if((p+i)->math>=point){//もし、入力した点(point)より今の構造体(p+i)の数学の点((p+i)->math)が高ければ、
DisplayStudent(p+i);//DisplayStudent関数に今の構造体(p+i)のアドレスを送って、DisplayStudent関数で表示。
}
}
}
>>635 #include <stdio.h>
#define MAXLENGTH 30
int mylen(char *str){
int num=0;
while(*str++)num++;
return num;
}
int main(){
char str[MAXLENGTH];
printf("input string=");
scanf("%s",str);
printf("%s (length=%d)",str,mylen(str));
return 0;
}
>>635 #include <stdio.h>
int mylen(char *str){
int i;
for(i = 0; *(str + i); i++);
return i;
}
int main(){
char *buf[1024];
fgets(buf, sizeof(buf), stdin);
printf("%d\n", mylen(buf) - 1);
return 0;
}
ミスった。 char buf[1024] です・・
誰かお願いします・・
641 :
デフォルトの名無しさん :04/06/30 23:34
2×2の行列A及びBをキーボードから読み込み、その積(C=AB)を求めるプログラム 出力例 Input a :3 Input b :5 Input c :2 Input d :3 Input e :4 Input f :2 Input g :5 Input h :3 37 21 23 13 (注意)配列を使うこと。 お願いします。
642 :
デフォルトの名無しさん :04/06/30 23:40
ギャップ(ー)を含む名前を入力したら、ギャップを取り除いた配列を 出力するプログラム (ギャップは苗字と名前の間に入れ、また母音も変える。) ex) 名前を入力してください。:T-n-k--t-r- ←Tanaka Taroを上記のギャップ変換の規則に当てはめた。 出力結果 Tnktr
>>642 #include <stdio.h>
int main(void)
{
char buf[256];
int i;
printf("名前を入力してください。:");
fgets(buf, 256, stdin);
for (i = 0; buf[i] != '\n' && buf[i] != '\0'; ++i)
if (buf[i] != '-') putchar(buf[i]);
return 0;
}
>>641 #include <stdio.h>
int main(void)
{
int A[2][2], B[2][2], C[2][2] = { {0, 0}, {0, 0} };
int i, j, k;
for (i = 0; "abcd"[i]; ++i) {
printf("Input %c :", "abcd"[i]);
scanf("%d", &A[i & 2][i & 1]);
}
for (i = 0; "efgh"[i], ++i) {
printf("Input %c :", "efgh"[i]);
scanf("%d", &B[i & 2][i & 1]);
}
for (i = 0; i < 2; ++i)
for (j = 0; j < 2; ++j)
for (k = 0; k < 2; ++k) C[i][j] += A[i][k] * B[k][j];
for (i = 0; i < 2; ++i) {
for (j = 0; j < 2; ++j) printf(" %d", C[i][j]);
puts("");
}
return 0;
}
645 :
デフォルトの名無しさん :04/07/01 00:18
級数の和S=1+1/2+1/3+・・・+1/Nを計算するプログラムを #include <iostream.h> int main(void) { int n ; cout << "N=" cin >> n ; int i; double s = 0 ; for( i=1 ; i =<n ; i++){ s = s + 1/i ; } cout << "S(N)=" << s << endl ; return 0 ; } ↑こんな感じで作った場合、入力するnが大きな数になったときに 予想される制度上の問題点について述べなさいという問題なんですが さっぱりわかりません。よろしくお願いします。
>>645 iがintegerなら限界があるだろ。
nが22億強の値なら無限ループするよ。
それが問題なんでは…?
>>646 ありがとうございます。
このプログラムのnが大きくなったときの精度はどうなるのでしょうか?
nを22億より大きくするまでは正しく出力されるということでしょうか?
1/i って...
1/i はintだね
i<=n と=は後に書くんだが。これは俺の環境だけか? あと、s=s+1/iで、1/iは(double)1/iとキャストしてないと浮動小数点にならない(@VC++.net) ついでに、<iostream>でusing namespace std;使った方がいいと思われ。 文法についてばっかでスマン。
>>645 すまん。酔ってるんで適当にかいてしまった。
コンパイラによるがまあ32bitで
単なるint型なら0x7FFFFFFFが最大値。
これを越えた値を入力してみればすぐ問題がわかるよ…。
よってネタ
>>645 浮動小数点同士の足し算がどうなってるのかを考えないと駄目なんだけど、
例として、浮動小数点の精度を5桁とした場合で説明する。
2つの値 1.234e2 と 1.1111e-3 を足すことを考えた場合、
2つの値の桁をあわせてから足すことになる。
1.234e2 + 0.000011111e2
このとき、精度5桁だから、
1.234e2 + 0.0000e2
になっちゃって、 1.1111e-3 が足されなくなってしまう。
要するに、大きな数と小さな数を足す(引く)と、
小さい方の数字が意味を成さなくなっちゃう。
級数の和を計算するプログラムでは、
s = s + 1/i;
で 1/i の値が小さくなってくるとこの問題の関係で s の値が更新されなくなる。
愛があれば、セミコロンはいらんのか?
>>645 nの値以前に文法がなってない…。
これってコンパイルしてないだろ。
>>653 >>655 ありがとうございます。
浮動小数点について調べてみます。
>>657 すいません。本当は虫食いプログラムを完成させる問題+精度の問題です。
プログラムを実行する環境が今整っていなくて
単に紙に書くだけだったので間違えがあったんだと思います。
iostream.h ~~ 無しでもいいですか?
663 :
デフォルトの名無しさん :04/07/01 01:23
>>ぼるじょあ さん あの昨日も書き込んだんですけど、マルチ野郎とかじゃないんで本気で教えてください。 微分方程式を必ず使ったC言語のプログラミングをするという課題です。 あまりに簡単なのは駄目らしいです。 ばね2本や3本の単振動とかは駄目っぽいです。 100本くらいならいいらしいんですけど。 簡単なのでいいので教えてください。お願いします。
664 :
デフォルトの名無しさん :04/07/01 01:29
普通の計算式を逆ポーランド記法に直すプログラムを教えてry
>>664 1.普通の計算式の構文を解析する。
2.並び替えて文字列化して出力。
#include <stdio.h> const char* e(const char* p); void put(const char* p, int len) { printf(" %.*s", len, p); } void err() {printf("error"); exit(-1); } const char* f(const char*p) {if ( isdigit(*p) ) { int l = 0; while ( isdigit(p[++l]) ) ; put(p, l); p += l; } else if (*p=='(') { p = e(p+1); if (*p!=')') err(); ++p; } else err(); return p; }
const char* t(const char* p) {char op; p = f(p); while (op=*p, op=='*'||op=='/') { p = f(++p); put(&op, 1); } return p; } const char* e(const char* p) {char op; p = t(p); while (op=*p, op=='+'||op=='-') { p = t(++p); put(&op, 1); } return p; } main() {char s[256]; fgets(s, 256, stdin); e(s); }
> const char* t(const char* p) > {char op; > p = f(p); > while (op=*p, op=='*'||op=='/') { > p = f(++p); > put(&op, 1); > } > return p; > } > > const char* e(const char* p) > {char op; > p = t(p); > while (op=*p, op=='+'||op=='-') { > p = t(++p); > put(&op, 1); > } > return p; > } > > main() > {char s[256]; > fgets(s, 256, stdin); > e(s); > }
ん?もう埋めるの?
>>664 かなり適当。間違った入力はしないように(w
#include <stdio.h>
#include <string.h>
int nextop() {
int c;
while (c = getchar()) {
if (isdigit(c)) { putchar(c);
} else if (strchr("+-*/()", c)) { putchar(' '); return c;
} else if (strchr(" \t", c)){
} else { return 0; }
}
}
int main() {
int n, opl=1, op;
char ops[256] = {'\0'}, s[128] = {'\0'};
s['-'] = 2; s['+'] = 2; s['*'] = 3; s['/'] = 3; s['('] = 4; s[')'] = 1;
while (op = nextop()) {
while (s[ops[opl-1]] >= s[op]) {
if (ops[opl-1] == '(') {
if (op == ')') opl--;
break;
}
printf(" %c ", ops[--opl]);
}
if (op != ')') ops[opl++] = op;
}
while (ops[--opl] != '\0') printf(" %c ", ops[opl]);
putchar('\n');
return 0;
}
while (c = getchar()) { じゃなくて for (;;) { c=getchar(); だたよ。
while文とprintf関数,scanf関数を用いて,ひとつの整数をキーボードから入力させ, 入力した数値は xx です.これでよろしいですか?(y/n) と尋ね,n が選択された場合には,再び整数の入力を促すというプログラム をどなたかつくってください(´・ω・`)
>>673 ゴメン
単純過ぎてボケが思いつかなかったよ…
#include <stdio.h> int main(){ int n; char c='n'; while(c!='y'){ printf("整数を入力してください >"); scanf(" %d",&n); printf("入力した数値は %d です.これでよろしいですか?(y/n)",n); scanf(" %c",&c); } return 0; }
>>676 兄さん
scanf(" %c",&c);
は
scanf("%c%c",&ans,&ans);
にしたほうがいいかも。
久々にscanfを使った。。。
ごめん兄さん ansはcに修正。 自分で作ってみたやつの変数名を書いちゃった (/ω\)ハズカシーィ
「0〜7FFF の範囲の整数乱数100個を生成してファイルdata.txtへ格納する」 プログラムEmailアドレス+70.cppをディレクトリイd:\tmp\の中へ作る. なお,ファイルdata.txtの格納場所はソースプログラムと同じ場所とする. この課題が分かりませんorz 先生曰く簡単らしいんですが先週の講義出てなかった俺にはマジさっぱり。 単位がヤバイマジヤバイ。誰か助けてくださいorz
>>679 講義出てなくて単位取れないのなら自分のせいだろ。あきらめろ。
できました!ありがとうございました
682 :
デフォルトの名無しさん :04/07/01 12:49
1+2−5‥‥ という演算を行うために、 >+1改行 >答え+2改行 >答え-5改行 >答え‥‥ のように、符号付きで数値を入力すると,答が逐次表示される プログラムを無限ループを使って作って下さい(電卓風のプログラム)。 という問題なのですが、さっぱり分かりません。whileやdo whileを使うみたい なんですが、、、。 あと、main関数の型はvoid型でお願いします。
#include <stdio.h> int main(){ int a,b=0; while(1){ scanf(" %d",&a); b=b+a; printf("%d",b); } return 0; }
>>682 #include <stdio.h>
#include <stdlib.h>
void main() {
int i;
char buf[256];
int z = 0;
while (true) {
scanf("%s", buf);
i = atoi(buf+1);
switch (buf[0]) {
case '+' : z += i; break;
case '-' : z -= i; break;
case '*' : z *= i; break;
case '/' : z /= i; break;
}
printf("%d", z);
}
}
685 :
デフォルトの名無しさん :04/07/01 13:30
乱数を生成して1次元配列に保存したのち、配列内の値をすべて表示するC++プログラム。 ただし、arrayname[]の記法、*(pointer+i)の記法、*(arrayname+i)の記法を使ってみること。 (できる限り関数を用い、引数の書き方を理解すること。表示の仕方は自由) 乱数は作れるんですが、ただし書きのところがうまくいきません。 あまり理解ができていないのが現状ですが・・・ よろしくお願いします。
void print(int* arrayname,int size) { for(int i=0;i<size;i++)printf("%d\n",*(arrayname+i)); }
687 :
デフォルトの名無しさん :04/07/01 14:52
688 :
デフォルトの名無しさん :04/07/01 14:54
c言語なんですが課題で出て、まじ分かんなくて助けてほしいです! このままじゃ赤点になってまう!! 二問あるけど、神な人教えて〜 1.各月の日数を格納した整数型の配列を定義してください。これを利用して、年、月、日を読み込んで、それが年の最初から何日目であるかを表示するプログラムを作成しましょう。 ただし、閏年の規則は、以下の規則で規定されるものとします。 @西暦の年号が4で割り切れる年は閏年。 A@には当てはまるが、西暦が100で割り切れる年は閏年ではない。 B@にもAにも当てはまるが、西暦が400で割り切れる年は閏年。 2.1に以下の機能を追加してください。 1のデータを表示したあとに、その年のその月のカレンダーを表示する機能。カレンダーはfor文の入れ子を使用してみましょう。(使わなくてもできますが。) その月の1日の曜日が分かれば、カレンダーを作成できます。曜日を調べるのには、以下の文をどこかに挿入してください。曜日を調べる部分は、関数にしてもかまいません。 曜日は、変数retに代入された値で分かります。次の通りです。 日曜日月曜日火曜日水曜日木曜日金曜日土曜日 0123456 int ret; if (m == 1 || m == 2) { y--; m += 12; } ret = (y + y/4 - y/100 + y/400 + (13*m+8)/5 + d) % 7; yは入力された年、mは入力された月,dは曜日を調べたい日です。1日の曜日を調べたいわけですから、このdには…
690 :
デフォルトの名無しさん :04/07/01 15:10
助けてください!! マジわからないです。 #include <iostream.h> #include <string.h> int main(){ char **pName; char *Name; int n; cout << "生徒は何人ですか?\n"; cin >> n; for(int a = 0; a < n; a++){ for(int i = 0; i < n; i++){ pName = new char*[n]; cout << "生徒の名前を入力して下さい。 "; cin >> Name; pName[i] = new char[strlen(Name) + 1]; strcpy(pName[i], Name); if(pName == NULL) return 0; } } for(int i = 0; i < n; i++){ for( a = 0; a < n; a++){ cout << pName[i][a] << ', '; }} for(i = 0; i < n; i++) delete[] pName[n]; delete[] pName; return 0; } のプログラムなんですが、エラーで”(13) : warning C4700: 値が割り当てられていないローカルな変数 'Name' に対して参照が行われました。” と出ました。なぜ出るのか、ネットなどで自分で調べてみたのですが、わかりませんでした。名前をいくつか入力していって、それを後でいっぺんに表示させるプログラムを 作ろうとしました。他にも色々間違ってるかも知れないので、先生方のご指導お願いします。
>>688 いまコンパイラないから動くか分からないけど
#include <stdio.h>
int date(int y,int m,int d){ /* 問題文にあるやつね */ }
int main()
{
int days[]={31,28,31,30,31,30,31,31,30,31,30,31};
int y,m,d;
int day;
int i,ct;
scanf("%d %d %d",&y,&m,&d);
day=d;
if((y%4)&&!(y%100)&&(y%400))days[1]++;
for(i=0;i<m;i++)day+=days[i];
printf("%d日目",day);
ct=date(y,m,d);
for(i=0;i<ct;i++)puts(" ");
for(i=0;i<days[m-1];i++){
printf(" %d",i+1);
if(++ct%7)puts("");
}
puts("");
return 0;
}
>>690 char *Name:を
char Name[256];に変える
とんでもないくらい間違ってる、というか、変。あまりにも変。 std::string使えば良さそうなのに、なぜかcharの配列を使用してたり、 不気味な二重ループとか、無意味に何回も配列を確保したり解放したりして、 奇妙なことこの上ないんだが、そもそも何を作りたいのか、が分からんのだよ。
>>690 x pName = new char*[n];
o Name = new char*[n];
すまん
>>688 if((y%4==0)&&(y%100!=0)&&(y%400==0))days[1]++;
697 :
デフォルトの名無しさん :04/07/01 15:19
>>690 #include <iostream.h>
この辺でもういいやと思った
701 :
デフォルトの名無しさん :04/07/01 15:29
誠にありがとうございます。自分でもポインタは理解していない事はわかっていましたが、
かなり理解していないですね。
>>694 さんの”std::string使えば良さそうなのに”というのはどういったものなんでしょうか?
すみません。教えていただけないでしょうか?
>>680 そこをなんとかお願いしますorz
教科書読んでもよく分からない・゜・(ノД`)・゜・。
>>704 >Emailアドレス+70.cpp
とりあえず私はエスパーでは無いので、
あなたのEMailアドレスが分からないとできません
>>684 エラーなんですが、、、。c言語の宿題なんですけども、
char buf[256];とか分からない初心者なんで、もう少し分かり
易くならないでしょうか。
>>696 神!ありがとうございます!!
助かりそうです!!!
708 :
デフォルトの名無しさん :04/07/01 15:38
台形公式のCプログラムを作りたいのですがさっぱりわかりません。 お願いします。いろいろなサイトを見たのですがコンパイルできません。 1 ∫ e^-x^2dx 0 お願いします!!
char Name[256]; に変えて、2重ループは意味がないみたいなのでやめて、下の様にしてみました。 for(int i = 0; i < n; i++){ pName = new char*[n]; cout << "生徒の名前を入力して下さい。 "; cin >> Name; pName[i] = new char[strlen(Name) + 1]; strcpy(pName[i], Name); if(pName == NULL) return 0; してみたら、コンパイルはできたのでが、途中でエラーが出て終了になりました。 まったくさっぱりです。もう一度訓えて頂けないでしょうか?
iostream.h で通るの? iostream じゃないと怒られるのだが
NONAME.c: In function `main': NONAME.c:8: `true' undeclared (first use this function) NONAME.c:8: (Each undeclared identifier is reported only once NONAME.c:8: for each function it appears in.) ってでます
>>713 ごめん。1 に変えて。
while の代わりに for (;;) { でもいいよ。
>>713 while (true) {
を
for(;;){
に変えるだけじゃん?
>>711 よくわからんがこれじゃだめなのか?
#include <iostream>
#include <string>
#include <vector>
using namespace std;
void main(void)
{
vector<string> enroll;
string buf;
for(;;){
cout <<"生徒の名前を入力してください。(exitで終了)"<<endl;
cin >>buf;
if(buf == "exit")break;
enroll.push_back(buf);
}
vector<string>::iterator ite;
for (ite = enroll.begin(); ite != enroll.end(); ite++) cout << *ite << endl;
}
717 :
デフォルトの名無しさん :04/07/01 15:56
698様 入力する得に scanf("%s",&str[i]); こうなりますが、'\0'はどこに入れればよいでしょうか。 scanf("%s\0",&str[i]); は、ありえないと思うので。 699様 応援有難うございます。がんばります。
716さん、すみませんが自分はまだまだ初心者でして、 全然まったく知らないものがたくさん出てきてて、自分には理解できません
719 :
デフォルトの名無しさん :04/07/01 16:03
Cの宿題ですが、 入力した文字列を別の文字型配列にコピーした後、入力した文字列と、コピーした文字列を出力する文字列を作ってください。 ただし、二つの文字型配列s,tを引数として、tを指す文字列をsの指す領域にコピーする関数mycpyを作り、main関数ではその関数を呼び出すようにしてください。
pName = new char*[n]; for(int i = 0; i < n; i++){ cout << "生徒の名前を入力して下さい。 "; cin >> Name; pName[i] = new char[strlen(Name) + 1]; strcpy(pName[i], Name); if(pName == NULL) return 0; とりあえずさっきの所はこう変えろ(pName = new char*[n];をループの外に出す)
>>719 mycpy(char*s, const char*t)
{
while(*s++ = *t++);
}
main()
{
char a[256], b[256];
mycpy(a, "アヒャヒャヒャヒャ");
mycpy(b, a);
printf("%s%s", a, b);
}
変えてみましたが、また同じく止まりました(涙)
for(int i = 0; i < n; i++){ for( a = 0; a < n; a++){ cout << pName[i][a] << ', '; }} を for(int i = 0; i < n; i++){ cout << pName[i] << ', '; } に変えれ
#include <iostream.h> #include <string.h> int main(){ char **pName; char Name[256]; int n; cout << "生徒は何人ですか?\n"; cin >> n; pName = new char*[n]; for(int i = 0; i < n; i++){ cout << "生徒の名前を入力して下さい。 "; cin >> Name; pName[i] = new char[strlen(Name) + 1]; strcpy(pName[i], Name); if(pName == NULL) return 0; } for(i = 0; i < n; i++){ for(int a = 0; a < n; a++){ cout << pName[i][a] << ', '; } } for(i = 0; i < n; i++) delete[] pName[n]; delete[] pName; return 0; }
↑になってます。
>>725 これでどうYO
#include <iostream>
int main(){
using namespace std;
char **pName;
char Name[256];
int n;
cout << "生徒は何人ですか?\n"; cin >> n;
pName = new char*[n];
for(int i = 0; i < n; i++){
cout << "生徒の名前を入力して下さい。 "; cin >> Name;
pName[i] = new char[strlen(Name) + 1];
strcpy(pName[i], Name);
if(pName == NULL)
return 0;
}
for(i = 0; i < n; i++){
cout << pName[i] << ", ";
}
for(i = 0; i < n; i++) delete[] pName[i];
delete[] pName;
return 0;
}
729 :
デフォルトの名無しさん :04/07/01 16:35
先ほど台形公式について質問したものですが、 #include <stdio.h> #include <math.h> double f(double x) { double y; y = 4.0/(1.0+x*x); return(y); } main() { int i,n; double x,xstart,xend,xintv; double h,sum,pi,result; xstart=0.0; xend=1.0; xintv= xend - xstart; printf("Enter N :"); scanf("%d",&n); h = xintv/n; sum = 0.5*f(xstart); for(i=1;i<n;i++) { x = xstart + h*i; sum += f(x); } sum += 0.5*f(xend); result = sum*h; printf("\n Result of the integral = %16.14f",result); pi = 4.0*atan(1.0); printf("\n Pi = %16.14f Difference = %16.14f \n", pi, result-pi); } というプログラムをみようみまねで書いたのですが未定義のシンボルatanというものが出てきます。 どうしてなのでしょうか。
728さん、すげー!! ありがとうございます☆ 謎は解けました!! 感謝です!!!
>>729 私の環境
Microsoft Visual C++ Toolkit 2003 (タダ)
ではコンパイルできますよ。
あっ でも728さん なぜに、 for(i = 0; i < n; i++){ cout << pName[i] << ", "; } for(i = 0; i < n; i++) delete[] pName[i]; delete[] pName; にする事で、エラーが出なかったのでしょうか?
733 :
デフォルトの名無しさん :04/07/01 16:45
私は学校のemacsでやっているのですができません・・・。 atanを定義するのはどうしたらよいのでしょうか?
-lmathじゃねーの?
おかしいのはここですYO for(i = 0; i < n; i++){ for(int a = 0; a < n; a++){ cout << pName[i][a] << ", "; } } 生徒数n人を指定して名前をn文字以下にすると配列外にアクセスいきますYO 上の書式なら for(i = 0; i < n; i++){ for(int a = 0; a < strlen(pName[i]); a++){ cout << pName[i][a] ; } cout <<", "; } じゃないとおかしいYO coutはC++ですから引数型で振る舞い変えますYO
なるほど。理解できました☆ 本当にありがとうございました!! これで、2次元配列は完璧・・・ではないでしょうが、 今回の事は完全に理解できたと思います。 本当に感謝です!!
へたれですみません。
>>684 の
#include <stdlib.h>
char buf[256];
scanf("%s", buf);
i = atoi(buf+1);
とかよく分からないので
どなたかもう少し分かり易い方法をご教授下さい。
ちなみにエラーはtrueを1にしたらなおりました。
>>554 やはりつくって貰えないでしょうか?
お願いします。
>>739 でも全く習ってないのでどーにも分りません。
どなたかお助け下さい。
>>738 Windowsのコンソールでもいいの?
>>741 >>737 の意味はわかるんですけどどう教えたらいいのかは
教え方を全く習ってないのでどーにも分かりません。
>>740 目ウロコです!!
見事に見落としてました!
ありがとうございます
>>743 すみません自粛します
745 :
デフォルトの名無しさん :04/07/01 18:25
二次関数y=X^2について、xの値を-5から5まで変化させて、 printf文を用いてグラフを表示させるというもので、 * * * * * * -------- 以下対称 と表示させるプログラムを作成したいんですが、 printf文を用いて空白を表示させるにはどうすれば良いのでしょうか?
printf(" ");
すいません、間違えました。 .は空白を表します。 ........................* ...............* ........* ...* .* *
>>747 void printBar(int length)
{
for(int i=0;i<length;++i)
printf(" ");
puts("*");
}
750 :
デフォルトの名無しさん :04/07/01 18:39
>>749 返答ありがとうございます。
それを参考にして学校で習ったように書いてみたのですが、
int main(void)
{
int y,x;
for(x=-5; x<6; x++){
y=x*x;
printf(" ");
puts("*");
}
printf("\n");
return 0;
}
これだと、空白が表示されず、
*
*
*
*
となってしまいます。どこがおかしいのでしょうか?
for(int i=0;i<y++i) printf(" ");
ワロタ
こんな方法もある。 #include <stdio.h> int f(int x){ return x*x; } int main(void) { int i; for (i = -5; i <= 5;i++) printf("%*c\n",f(i) + 1, '*'); return 0; }
ご迷惑をお掛けして申し訳ありません。 740,754さんの書き方は、学校で習っていないので、 出来れば自分が750で書いた方法を直し、表示したいと思っています。 参考にしてのは、puts("*"); です。 yの値が空白の数になるので、そこが表示されないのは、 〜 y=x*x; printf(" "); 〜 の部分が不味いと思うんですが、どうなのでしょうか
なら自分で書けよ。 漏れには藻前が何習ってるのかなんて分からないんだから
758 :
デフォルトの名無しさん :04/07/01 19:07
int main(void) { int y,x,i; for(x=-5; x<6; x++){ y=x*x; for(i=0;i<y;++i) printf(" "); puts("*"); } printf("\n"); return 0; }
>>757 そうなるよう精進したいと思います。
>>758 うわーありがとうございます。
すごく助かりましたm(__)m
「習ってないから」っての見ると萎えるな。
>>760 あと
初心者です
ってのも
あっスレ違いすまそ
気持ちはわかるが、宿題スレだしなあ
習ってないからを使っちゃだめっていう宿題があるなら、それも萎える。
丸写しできる答えがほしいだけじゃなくて、 それを理解したいと考える人間もいるから、 意欲があるうちは付き合ってもいいと思うけどな。 習っていないと判断できるということは、 一応提示されたソースを読んでいるわけだし。
なんつーか、標準ライブラリにある関数すら(習ってなければ)使えないという宿題自体に萎える。 そういう問題出す教師にも萎える。教科書に書いてあったからとかごねればええやん。
C++ 標準ライブラリって全部で幾つ?
ひとつ
納得いかないなら答えなきゃいいだけの話では?
>>742 返事遅れてすみません。
OKです。参考になればいいと思ってますから。
771 :
デフォルトの名無しさん :04/07/01 22:15
>>770 別に丸投げしているつもりはありません。
丸投げしない人はまず自分でやってみたソースさらすよな。 もちろん コンパイルできない場合はエラーメッセージをちゃんと貼る。 実行結果がおかしい場合には何がどうなったら正しいのかを明記する。 そして ヒントなり答えなり貰ったら自分で調べる。 普通はね。
773 :
デフォルトの名無しさん :04/07/01 22:30
はじめまして ただいま独学でC++を勉強しております。 iniファイルの読み込みプログラムを作成していたところ 疑問点がでてきたので質問させていただきます。 ↓↓↓ソース↓↓↓ www1.ocn.ne.jp/~nasitaka/sample.zip 上記に乗せたプログラムを実行してみると TestKey を指定しているはずなのにその上に 定義してあるabcというキー部分を読み込んで 表示してしまいます。 これはどういう理由でこのような仕様になっている のでしょうか?
printf("TestKey = %s\n",strData);
775 :
デフォルトの名無しさん :04/07/01 22:44
>>772 まず自分で最後まで作ることができず、
コンパイル以前の問題です。自分でも色々と調べたのですが
やはりわからずこのスレに書き込みました。
無知と言われればそれまでですが、ちゃんと自分で理解できる
ようになりたいと思っています。
すいません何を言っても言い訳ですね。
>>774 様
そちらのほうが、見やすかったですね・・・・
すみません。
しかし、なぜ一つ上の値が読み込まれるようになっているのですか??
本来ならTestKeyの内容である
0068EBDC
という値が返ってきてほしいと思うのですが・・・
779 :
デフォルトの名無しさん :04/07/01 23:09
次はこんな質問がくるんだろうな 課題11 行列の積 提出期限 7/6(火)17:00 再提出期限7/7(水)17:00 次のプログラムの関数product, output_matrix を完成させて,行列A とB がそれぞれ MatrixA.txt, MatrixB.txt(ファイルの先頭の2つの整数は順に,行数,列数を表す)とい うファイルで与えられたとき, ABを計算してMatrixAB.txt に書き出すプログラムを作れ. ただし,関数product は, Aの列数とBの行数が一致しない場合,画面に警告を表示し実行 を終了するように作成するものとする. MatrixA.txt の例 MatrixB.txt の例 作成されるMatrixAB.txt 4 3 0.0 -1.2 2.8 2.1 -3.0 5.7 4.5 1.1 3.9 2.8 4.4 6.6 3 4 2.2 4.0 -1.4 5.5 3.0 0.0 1.6 2.2 7.7 -9.7 2.9 1.0 17.96 -27.16 6.20 0.16 39.51 -46.89 8.79 10.65 43.23 -19.83 6.77 31.07 70.18 -52.82 22.26 31.68
名古屋大ってアフォなんだな
名大から何の技術が発信されたっけな?ある?無名に近いかもな
締め切りすぎたからか
>>773 つかstrData初期化されてないよ?
一回目のprintf()でなんかよーわからんのが表示
二回目でTestKeyの値(なければ空文字列)
になると思われ。
二回目も意図してないのが表示されるのならiniファイルの指定が間違ってる。
iniファイルの指定はフルパスでないと、Windowsフォルダ探しに行くので注意。
そろそろ閏年の時期でつか? カレンダーでつか? 単語帳でつか?
>>781 よーし、ぱぱ作っちゃうぞー
俺も名大生だった…orz...
名古屋大学 化学・生物工学科 分子化学工学コース
>>782 先生、「大学」でくくって考える方がアフォだと思います・・
そうか、いつかは見つかるとは思ったが名大だったか。 化学系だから、しょうがないかな。
>>778 ==解答がここのコピペばかりで困り果てた名古屋大教授
796 :
デフォルトの名無しさん :04/07/01 23:26
>>787 様
参考にして作ったURLです。
ttp://homepage1.nifty.com/meru/prog/rag_c1.html 1回目のprintfではなにが表示されてもよかったので、初期化も
なにもしていないんです。2回目でのprintfではTestKeyの内容
を表示させたかったのですが、うまくいきません。
iniファイルへの書き込みをコメントでくくってありますが、これを
実行すると同一フォルダ内のiniファイル(Test.ini)にしっかり
書き込みをしているのを確認できるので、指定間違いはないようです。
796=773です
>>777 その通りですね。
だから、私は頑張りたいと思います。
ここで質問してた名大の二馬鹿は今後どうすんだろな いままでは教授の評価高かっただろうし おい、○○君近頃どうしたんだね アルゴリズムがやたら平易になってるようだよ PGとして即戦力になりえるくらいのプログラミング力だったのに・・・ まさか、カンニングでもしていたんじゃないだろうね? 二馬鹿「・・・」
>>778 ==自分で真面目にやったのにコピペした香具師に負けた真面目クン
名大の学歴に嫉妬した連中が猛々しくなっております。
Aaa:東京、京都 Aa :一橋、東京工業、大阪 A :東北、筑波、名古屋、神戸、九州、早稲田、慶應 ここにのってない大学はゴミ
環境依存スレってあったような
>>807 様
感動です!!
みごと表示されてました!!
これから解析してみようと思います。
また分からないことがあったらここで質問させていただきます。
ありがとうございました!!!!
ここまでにしてくれ。 Aaa:東京、京都 Aa :一橋、東京工業、大阪 A :東北、筑波、名古屋、神戸、九州、早稲田、慶應 Baa:北海道、お茶の水、東京外語、横浜国立、広島、上智、ICU Ba :千葉、東京都立、電気通信、金沢、京都工芸繊維、奈良女子、大阪外語、大阪市立、大阪府立、岡山、東京理科、同志社 B :埼玉、東京学芸、東京農工、横浜市立、信州、新潟、静岡、名古屋工業、九州工業、熊本、立教、明治、津田塾、学習院、関西学院
>>810 駄目
Aaa:京都、東京
Aa :大阪、東京工業
A :慶應、東北
S :会津
会津ワロタ
God:MIT, UCB Aaa:京都、東京 Aa :大阪、東京工業 A :慶應、東北 S :会津
2つの文字列 a,bを入力し、別の文字型配列にaをコピーした後、もう一つの文字列bをその後ろに追加するプログラムを作ってください。 ただし、3つの文字型配列s,t,uを引数として、tを指す文字列をsの指す領域にコピーした後、sにuを追加する関数mycatを作りmain関数ではその関数を呼び出すようにしてください。
#include <stdio.h> static int mylen(char *s){ //strlen(a); を自前で作る。 int i; for(i = 0; *(s + i) != '\0'; i++); return i; } static void mycat(char *s, char *t, char *u){ int i; for(i = 0; *(t+i) != '\0'; i++) //strcpy(s, t);を自前で作る。 *(s + i) = *(t + i); for(i = 0; *(u+i) != '\0'; i++) //strcat(s, u); を自前で作る。 *(s + mylen(t) + i) = *(u + i); *(s + mylen(t) + i) = '\0'; } int main(int argc, char *argv[]){ char*a, *b, *c; if(argc != 3){ //入力処理は適当にどうぞ。引き数でやります。 printf("argument value is no good.\n"); return 1; } a = argv[1]; b = argv[2]; c = (char*)malloc(mylen(a) + mylen(b) + 1); if ( c == NULL ){ printf("memory allocation is error.\n"); return 1; } mycat(c, a, b); printf("a, b, c: %s, %s, %s\n", a, b, c); free(c); return 0; }
for(i = 0; *(u+i) != '\0'; i++) //strcat(s, u); を自前で作る。 *(s + mylen(t) + i) = *(u + i); *(s + mylen(t) + i) = '\0'; は for(i = 0; *(u+i) != '\0'; i++) //strcat(s, u); を自前で作る。 *(s + mylen(s) + i) = *(u + i); *(s + mylen(s) + 1) = '\0'; の方がいいかな。結果は同じでも意味は違うし。 //strcat(s, u); を自前で作る。と書いているからには、ね。 *(s + mylen(t) + i) = '\0'; も可読性が悪いし。
(´-`)。oO(おまいらがじゃれあっている間にmitの連中は着実にハカーへの途を歩んでいる…
(´-`)。oO(ひとりの研究をすすめるより多くの人間にcをわからせて世に出した方が世間のためになる・・・
(´-`)。oO(啓蒙目的ならば名著をしるしてコンセサスを高める方が効果的である…
*(s + mylen(s) + i) = *(u + i); は int len; を作って、s に t をコピーした後で len = mylen(s); を受けておいてから *(s + len + i) = *(u + i); だぁね。 次の行も *(s + mylen(s)) = '\0'; でなきゃまずくないかい?
823 :
デフォルトの名無しさん :04/07/02 10:17
すみませんが次のプログラムを教えてくれませんか? 5人の学生の名前と成績を入力し、名前は2次元配列、成績は1次元配列に格納し、表示 するプログラムを作成せよ。 例 Please input 5 student's name and test score. student1-name:tarou -score:60 student2-name:hanako -score:90 student3-name:jiro -score:40 student4-name:daisuke -score:80 student5-name:kaoru -score:70 taro 60 hanako 90 jiro 40 daisuke 80 kairu 70
>>688 まだみてるかー ちゃんと動く版
#include <stdio.h>
int date(int y,int m,int d){
if (m == 1 || m == 2) {y--;m += 12;}
return (y + y/4 - y/100 + y/400 + (13*m+8)/5 + d) % 7;
}
int main()
{
int days[]={31,28,31,30,31,30,31,31,30,31,30,31};
int y,m,d;
int day;
int i,ct;
puts("年 月 日");
scanf("%d %d %d",&y,&m,&d);
day=d;
if((y%4==0)&&(y%100!=0)&&(y%400==0))days[1]++;
for(i=0;i<m-1;i++)day+=days[i];
printf("%d日目\n",day);
ct=date(y,m,1);
for(i=0;i<ct;i++)printf("\s\s\s");
for(i=0;i<days[m-1];i++){
printf("\s%2d",i+1);
if((++ct)%7==0)puts("");
}
puts("");
return 0;
}
>>823 #include<stdio.h>
main()
{
char name[5][255];
int score[5];
int n;
printf("Please input 5 student's name and test score.\n");
for(n=0; n<5; n++){
printf("student%d-name:",n+1);
scanf("%s",&name[n]);
printf("-score:");
scanf("%d",&score[n]);
}
printf("\n");
for(n=0; n<5; n++)
printf("%s %d\n",name[n],score[n]);
}
>>825 kaoruをkairuにするのをお忘れですよ。
>>826 825じゃないけどパッチ
if(0==strmcmp(name[i],"kaoru"))strcpy(name[i],"kairu");
828 :
デフォルトの名無しさん :04/07/02 11:18
825さんありがとうございます!
829 :
デフォルトの名無しさん :04/07/02 11:35
ほんとに申し訳ないのですが さっきの5人の学生を入力したあとに成績順に並べ替えるプログラムも 教えていただけないでしょうか? さっきのやつでいくと Please input 5 student's name and test score. student1-name:tarou -score:60 student2-name:hanako -score:90 student3-name:jiro -score:40 student4-name:daisuke -score:80 student5-name:kaoru -score:70 jiro 40 taro 60 kaおru 70 daisuke 80 hanako 90 となればいいらしいです。
#include <string.h> // ソート void sort(char name[5][64],int score[5]) { char name_t[64]; int score_t; int i,j; for(i=0;i<5-1;i++){ for(j=i+1;j<5;j++){ if(score[i]>score[j]){ strcpy(name_t,name[i]); strcpy(name[i],name[j]); strcpy(name[j],name_t); score_t=score[i]; score[i]=score[j]; score[j]=score_t; } } } } ソートさせたいとこにこれを書く sort(name,score);
831 :
デフォルトの名無しさん :04/07/02 12:04
//ソートって何ですか?
ソーッとしといてやれ。
相当おもしろい
総統閣下は(ry
835 :
デフォルトの名無しさん :04/07/02 12:19
呼び出される毎に1バイトデータの各ビットを1つずつ左にローテートする関数 例えば,10100000を左に1つローテートすると01000001となる void rotate(unsigned char *)を作って任意の整数を3回ローテート したものを表示する 例 整数:1 1-th shift: 2 00000010 2-th shift: 4 00000100 3-th shift: 8 00001000 というのと ユーザが指定したキー文字(unsigned char型)とXOR演算子を組み合わせて, ファイルを暗号化するプログラムをつくりなさい。但し, ファイル名とキー文字はキーボードから入力します。 例 入力ファイル名:test.c 出力ファイル名:test2.c 暗号化キーは:% というのを教えてください、お願いします
>>817-818 ありがとうございます!
自分も考えて途中までやってみました。最後に足す部分がよく分かりませんでした。
#include<stdio.h>
char mycat(char *s,const char *t,const char *u);
int main()
{
char s[256],t[256],u[256];
char string1;
printf("文字列aを入力してください:");
scanf("%s",t);
printf("文字列bを入力してください:");
scanf("%s",u);
mycat(s,t,u);
printf("文字列は:%s\n",s);
}
char mycat(char *s,const char *t,const char *u)
{
while(*s++ = *t++);
}
ソートーなばかどもだな
>>835 コンパイルしてないから間違ってたら適当に直して
void rotate(unsigned char* c){*c<<1;}
int xor(const char* outname,const char* inname,unsigned char key)
{
FILE* in;
FILE* out;
int state=1;
int c;
if(NULL!=(in=fopen(inname,"r"))){
if(NULL!=(out=fopn(outname,"w"))){
while(feof(in)){
fputc(fgetc(in)^key,out);
}
fclose(out);
}else state=0;
fclose(in);
}else state=0;
return state;
}
間違えた while(!feof(in)){
あと *c<<=1; 何度もすまん…
乱数50個をファイルに出力するさいに横に10個ずつ出力するようにしたいのですが どうしたらいいか分かりません。縦に50個全部出力されてしまいます・・・・ 誰かご教授お願いします。
ローテートやろ
>>842 int ct=0;
for(int i=0;i<50;i++){
fprintf(fp,"%d",rand());
if(++ct%10==0)fprintf(fp,"\n");
}
>>842 for (int i = 0; i < 50; ++i)
fprintf(fp, "%d%c", rand(), (i + 1) % 10? ' ': '\n');
できました。お早いお答えありがとうございました。
848 :
デフォルトの名無しさん :04/07/02 12:56
Cで while( printf("hoge"), (c=getchar()) != EOF ){ .... } という文があったのですが、この場合のようなコンマ(,)を用いた条件式はどう評価されるのでしょうか? 上の例の場合では、文脈的に後者(getcharを含む方)の方で判断される感じはわかるのですが、一般的にはどういう仕組みなのでしょう? (でも実際、上の例では前者(printfの方)も後者も値を返すはずなのでよくわかりませんが。。。)
スレ違いなきもするけど コンマで区切られた式の一番右側の値が式全体の値になる たとえば x=(a,b,c); ならxにはcが代入される つまりこの例は printf("hoge") while((c=getchar()) != EOF){ ... printf("hoge") } と等価
>>848 左から右に評価されて、右の式の値が全体としての値になる。
左の式の値は捨てられるだけ。
#include <stdio.h> main() { int a, b,c,d; printf("二つの整数値を入れてください--->"); scanf("%d %d",&a,&b); c = a / b; d = a % b; printf("%d 割る %d は %d 余り %d\n\n",a,b,c,d); return(0); } このプログラムを複数回繰り返すようなプログラムに変更したいんですがどうしたらいいでしょうか? お願いします。
855 :
デフォルトの名無しさん :04/07/02 14:39
教えていただきたいのですが、 memsetっていうのはどういう働きをするのでしょうか? できれば、サルでもわかるような説明をお願いします。
スレ違い。
ああ、名前欄748から戻すの忘れてた…。 (;゚Д゚)
こいつマルチだよ
会津って凄いね・・・
>>851 コンパイラ通してないけど
void get_move(int board[B][B], int player, int *p, int *q)
{
char buf[100];
int i, j;
printf("Player %d ", player);
while (1) {
printf("> ");
scanf("%s", buf);
if(isalpha(buf[0])){
*q = buf[0]-'a'+1;
*p = buf[1]-'1'+1;
}else{
*q = buf[0]-'1'+1;
*p = buf[1]-'a'+1;
}
if (is_legal_move(board, player, *p, *q)) return;
else{
for(i=1;i<=8;i++){
for(i=j;j<=8;j++){
puts("置ける場所");
if(is_legal_move(board, player, j,i)){
printf("%c%d\n",j+'a',i+1);
}
puts("");
}}}}
}
>>851 >>862 氏のは候補がずれるかと。
void get_move(int board[B][B], int player, int *p, int *q)
{
char buf[100];
int i, j;
printf("Player %d ", player);
while (1) {
printf("> ");
scanf("%s", buf);
if ('1' <= buf[0] && buf[0] <= '8' && 'a' <= buf[1] && buf[1] <= 'h') {
*p = buf[0]-'1'+1;
*q = buf[1]-'a'+1;
}
else {
*q = buf[0]-'a'+1;
*p = buf[1]-'1'+1;
}
if (is_legal_move(board, player, *p, *q)) return;
printf("select a legal move: ");
for(i = 1; i <= 8; i++) {
for(j = 1; j <= 8; j++) {
if(is_legal_move(board, player, i, j)) {
printf("%c%c ", 'a'+i-1, '1'+j-1);
}
}
}
}
}
ブラックジャックの作成でコインを賭けられるようにする。 どなたかお願いします。
>>864 恐らく、授業の流れでブラックジャックを作成するというようなものがあると思うのだが。
それだけでは誰もやらないよ。
>>864 int main(int argc,char** argv)
{
int COIN_WO_KAKERU = 1;
BURAKKUJAKKU_NO_SAKUSEI(COIN_WO_KAKERU);
return 0;
}
>835 1-th、2-th、3-thってなんだよ、オイ。
>>864 その課題が載ってるサイトのURLを教えてくれればやるよ。
870 :
デフォルトの名無しさん :04/07/02 21:06
onth twith thrith
C言語でお願いします。 複素数z を読み込んで,絶対値と偏角を計算して印字す るプログラムを作成せよ.但し, • 複素数の実部と虚部を示す実数型変数をメンバとする 構造体COMPLEX • 複素数の絶対値と偏角を示す実数型変数をメンバとす る構造体POLAR をtypedef 文を用いて定義し,以下の手続きをそれぞれ関 数として作成し,main 関数内では,手続き(1),(2) と(3) を呼び出すだけにせよ. 1. 構造体COMPLEX を読み込む. 2. 構造体COMPLEX からPOLAR を計算する. 3. 構造体POLAR を印字する.
>>872 C99 で complex.h ができたからそれを使えば?
>>872 complex.hを使わずにやっといた。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
typedef struct { double re; double im; } COMPLEX;
typedef struct { double abs; double arg; } POLAR;
COMPLEX read(void) {
char buf[256]; COMPLEX ret;
printf("実部: "); ret.re = atof(fgets(buf, sizeof(buf), stdin));
printf("虚部: "); ret.im = atof(fgets(buf, sizeof(buf), stdin));
return ret;
}
POLAR topolar(const COMPLEX* arg) {
POLAR ret;
ret.abs = sqrt(pow(arg->re, 2) + pow(arg->im, 2)); ret.arg = atan2(arg->im, arg->re);
return ret;
}
void print(const POLAR* arg) { printf("絶対値: %f 偏角: %f\n", arg->abs, arg->arg); }
int main(void) {
COMPLEX c = read(); POLAR p = topolar(&c); print(&p);
return 0;
}
876 :
デフォルトの名無しさん :04/07/02 23:00
はじめまして、メモリリークに関して質問させてください。 くだ質は、ちょっとレベルが高そうだったので... VisualC++6.0Standardを使用しています。 WTLを利用しています。 最適化コンパイラはいれていません。 VCでのメモリリーク検出について、Win32 Debugとしてビルトすると有効になる という記述を見て、試してみたのですが、うまく検出してくれません。 というより、どこに出力されるのか、とかも曖昧です。 VC++6.0でのメモリリークの検出について、教えてくださいorz よろしくお願いします。 メモリリークしているはずだけど、検出されないコード //helloproj.cpp int Run(LPTSTR /*lpstrCmdLine*/ = NULL, int nCmdShow = SW_SHOWDEFAULT) { int *p2; p2 = new int[5]; //略(deleteは行わず) }
>>876 ・それは宿題か?
・ここはレベル低いと言うのか?
正直低いです。
ここは、初心者本を読み終わってコードを書いてみたいけど手頃なサンプルが無い人が、 やる気のない超初心者にコードを書いてあげてみるスレです。
>>876 void* operator new(size_t t)
{
//この辺で好きなだけ情報を書き込むw
//return (void*)malloc(t);
}
void operator delete(void *p)
{
//この辺で好きなだけ情報を書き込む
free(p);
}
883 :
デフォルトの名無しさん :04/07/02 23:38
次のプログラムお願いします。 ファイルのオープン、クローズ fopen,fclose 商品ファイルをキーボードから受け取り、指定したファイル内容を変数 に格納し、表示するプログラムを作成せよ。商品ファイルは、複数のレコード (行)(最大100レコード)で構成されており、各レコードには、「商品コー ド(10文字未満の文字列)」「商品名(40文字未満の文字列)」「値段(0以上) 50000以下の整数値」が空白文字で区切られて並べられている。商品ファイルは /lesson/junichif/giftsに用意してあるので、各自のディレクトリに コピーして用いること。 例 % cat gift JZK-30 Jizake_tsumeawase 4500 BSP-15 Body_soap_set 3000 Bt-200 Bath_towel_set 2500 TEA-20 Koutya_tsumeawase 5000 THY-55 Koutya_hachimitu_tsumeawase 3000 SPO-22 Tyoumiryo_variety_set 4000 %./kadai6-1 Input filename:gifts(ここをキーボードから入力) JZK-30 Jizake_tsumeawase 4500 BSP-15 Body_soap_set 3000 Bt-200 Bath_towel_set 2500 TEA-20 Koutya_tsumeawase 5000 THY-55 Koutya_hachimitu_tsumeawase 3000 SPO-22 Tyoumiryo_variety_set 4000 長々すみませんがお願いします。
884 :
デフォルトの名無しさん :04/07/02 23:52
もうひとつお願いします。 商品ファイル名をキーボードから受け取り、指定したファイル内容を CSV(Comma Separated Value)形式に変換し、指定したファイルに出力 するプログラムを作成せよ。商品ファイルの形式は上のやつと一緒です。 CSV方式とは、1つのレコード内のデータをカンマで区切り、1行に並べた ものである。ここでは文字列を""で囲むこととする。 例 %cat gift JZK-30 Jizake_tsumeawase 4500 BSP-15 Body_soap_set 3000 Bt-200 Bath_towel_set 2500 TEA-20 Koutya_tsumeawase 5000 THY-55 Koutya_hachimitu_tsumeawase 3000 SPO-22 Tyoumiryo_variety_set 4000 %./kadai6-2 Input filename:gifts(これをキーボードから入力) Output filename:gifts.csv(これをキーボードから入力) %cat gifts.csv "JZK-30", "Jizake_tsumeawase", 4500 "BSP-15", "Body_soap_set", 3000 "Bt-200", "Bath_towel_set", 2500 "TEA-20", "Koutya_tsumeawase", 5000 "THY-55", "Koutya_hachimitu_tsumeawase", 3000 "SPO-22", "Tyoumiryo_variety_set 4000", よろしくお願いします。
885 :
デフォルトの名無しさん :04/07/02 23:53
どんなエラーが出たか暗い賭けよな・・・
>>885 色々と変。まぁとりあえず基底クラスに仮想デストラクタは持たせとこうよ。
888 :
デフォルトの名無しさん :04/07/03 00:22
889 :
デフォルトの名無しさん :04/07/03 00:22
宿題が出ました。よろしくお願いいたします。 連立非線形方程式に対するニュートン法のプログラムを作成し、以下の問題を解きなさい。 (1) { x_1^2 + x_2^2 - 2*x_1 - 3 = 0 { x_1*x_2 + 1 = 0 (2) { -x_1^2 + x_5 + 3 = 0 { x_1 + x_2 - 2 = 0 { -x_1 + exp(x_3 + 2) + 0.1 = 0 { x_3 + x_4 - 0.3 = 0 { x_1*x_3 - x_2*x_4*x_5 = 0 ・終了条件は|| f(x^(k+1)) || <10^-8 を使用すること。 ・反復係数k、近似解x^(k)、誤差|| f(x^(k)) || を出力し、2次収束をしているか確認すること。 ・反復係数kが30回を超えたら強制終了させること。 連立1次方程式ならぐぐって見つかったのですが、さすがにn次やexpが入るとお手上げです(>_<)
>>885 Derive_Cintarray::Indeication() で p_Japanese[i] p_English[i] p_Mathematics[i] にアクセスしてるけど
領域が確保されてない。Cintarray::Selection() で割り当てるようだけど何処にも使われてないし。
892 :
デフォルトの名無しさん :04/07/03 00:43
886さん、すみませんでした。 エラーですが、コンパイルはできるんです。でも、 数値を入力して、表示しようとしたら途中で止まってしまうんです。 887さん、仮想デストラクタをつけました。次はどのようにしたら良いのでしょうか?
>>892 自分の中でまとまってないんでわからなくなる。
クラス図書いたほうがいいよ。
オブジェクト指向を理解せずにC++(クラス)に突入するとこうなる みたいなソースだな。
一折C++も理解できて。腕試しにチャットプログラムとか作ってみました。 それでさらに高度な技?見たいな物を学びたいのですが、C++の応用本みたいなものは ありませんか?
>>881 オーバーライド・・・なんですか?
>>882 やってみます。
多数のレス、ありがとうございました。
いただいた情報で、ちょっとやってみます。
成否にかかわらず、また結果報告しにきます
898 :
883 884 :04/07/03 01:05
891さんありがとうございます!
void get_move(int board[B][B], int player, int *p, int *q) { char buf[100]; int i, j; printf("Player %d ", player); while (1) { printf("> "); scanf("%s", buf); if(isalpha(buf[0]) && isdigit(buf[1])){ *q = buf[0]-'a'+1; *p = buf[1]-'1'+1; if (is_legal_move(board, player, *p, *q)) return; }else if(isalpha(buf[1]) && isdigit(buf[0])){ *q = buf[1]-'1'+1; *p = buf[0]-'a'+1; if (is_legal_move(board, player, *p, *q)) return; } } }
あ、間違えた : else if(isalpha(buf[1]) && isdigit(buf[0])){ *q = buf[1]-'a'+1; *p = buf[0]-'1'+1; if (is_legal_move(board, player, *p, *q)) return; }
>>892 main()を下のに差し替え。
int main(){
Derive_Cintarray derive_cintarray;
derive_cintarray.Name_input();
derive_cintarray.Selection();
derive_cintarray.Repeat();
derive_cintarray.Indeication();
return 0;
}
こんな宿題が出されました。 @実数x 整数nを受け取りxのn乗を計算する関数を作成せよ (データをキー入力し関数を呼んだあとはxのn乗の値を出力すること) A実数x 整数nを受け取りxのn乗を計算する関数を作成せよ (データをキー入力し関数を呼んだあとはxのn乗の値を出力すること) ここではnが負である場合も考慮すること。
>>904 double mypow(double x,int n)
{
return pow(x,n);
}
903さん、ありがとうございます! ハッキリ言って、全然って事はないですけど、 わからない所がちらほら・・・。 ですが、これを見て、理解できるようなります。 本当にありがとうございました!
インプット、アウトプットもクラス化したいな。
StudentControllerクラスを作って、そいつを実装すればいいと思う。
909 :
ミナミヌマエビ :04/07/03 02:07
こんばんは。 最近、C++とWINAPIというものをやり始めたばかりのものですが、早速つまっています。 やりたいことは、ダイアログにListBoxなどのコントロールを表示することなのですが WM_INITDIALOG 時に CreateWindow( "listbox"...) を使うのではなく ひとつクラスをつくって、そのクラスからCreateWindowを呼ばせるようにしたいのです。 下のソースは概略ですが、コンパイルはうまくいっているようですが 外部シンボル TestClass::setParam(HINSTANCE__ *, int , int ,...) が未解決 外部シンボル TestClass:: myCreateWindow(HWND__ *.) が未解決 というメッセージがでます。 もともと一つだったファイルを、以下のように3つに分けてから、エラーが出るようになりました。 正直、どこが悪いのか分かりません。 どなたか教えていただけませんか? よろしくお願いします。
ソースです。 ------<testclass.h>----------- 内容は省略 -------end of <testclass.h>---------- ------<testclass.cpp>---------------------- class TestClass{ public: メンバ変数いろいろ void setParam( 略) { メンバ変数に引数を設定 } void myCreateWindow( HWND){ CreateWindow("LISTBOX", ・・・) を呼ぶ } -------end of <testclass.cpp>----------------
連続でスマソ --------<test.cpp>------------ #include "testclass.h" TestClass tc; WinMain( 略){ tc. setParam ( 略) CreateDialog( 略) } DlgProc( HWND hwnd) switch( 略) case: WM_INITDIALOG myCreateWindow ( hwnd ) } -------end of<test.cpp>-----------
cppでclass宣言するって一体…
こ こ は 宿 題 を 片 づ け る ス レ で す 。 一般的な質問はよそでやれ。
915 :
デフォルトの名無しさん :04/07/03 02:14
#include <stdio.h> int main(void) { int num = 123456789; int *np; ******; /*ポインタ変数npにnumのアドレスを代入*/ printf("The value %d is stored at address %d", ******); /*ここでは変数numだけを使って書くこと*/ printf("The value %d is stored at address %d", ******); /*ここではポインタ変数npだけを使って書くこと*/ return 0; } これの****** のところを補って完成させよ。 出力例(決まった値にはならないが。) The value %d is stored at address -1073745404 The value %d is stored at address -1073745404
>>915 問題が間違ってるよ
"The value %d is stored at address %d"
じゃあThe value %d is…って出力するのは無理
>>915 ******を、どの様に補っても、それぞれの出力、
>printf("The value %d is stored at address %d", ******);
The value %d is stored at address -1073745404
>printf("The value %d is stored at address %d", ******);
The value %d is stored at address -1073745404
には、対応しません。
testclass.hの中身が激しく気になる。 何が書いてあるんだろう?
testclass.h #ifndef TESTCLASS #define TESTCLASS #include"testclass.cpp" #endif だったら笑える。
>>921 このレベルなら
#include "testclass.cpp"
の一行のみでしょう
すいません、訂正が。 #include <stdio.h> int main(void) { int num = 123456789; int *np; ******; /*ポインタ変数npにnumのアドレスを代入*/ printf("The value %d is stored at address %d\n", ******); /*ここでは変数numだけを使って書くこと*/ printf("The value %d is stored at address %d\n", ******); /*ここではポインタ変数npだけを使って書くこと*/ return 0; } これの****** のところを補って完成させよ。 出力例(決まった値にはならないが。) The value %d is stored at address -1073745404 The value %d is stored at address -1073745404
>>923 何をどうやっても、
>printf("The value %d is stored at address %d\n", ******);
このコードでは、コンパイラのバグでも利用しない限り
>The value %d is stored at address -1073745404
の出力にはならない。
n人の学生のテスト結果d(0≦d≦100)を学生番号順に標準入力装置から入力する。 負の数が入力されたとき、入力終了とする。データは配列D[i](0≦i≦n-1)に入れる。 平均値、標準偏差、最高点、最低点を求めてこれを出力する。 最高点、最低点については該当する学生の学生番号も全て出力する。 C言語でお願いします。
926 :
デフォルトの名無しさん :04/07/03 03:30
>>924 あまい。
#if 0 /* 最初の ****** */
; /*ポインタ変数npにnumのアドレスを代入*/
printf("The value %d is stored at address %d\n", /* ここから */ What a Fxxxin' Program! /* ここまでが2つ目の****** */);
/*ここでは変数numだけを使って書くこと*/
printf("The value %d is stored at address %d\n",
/* ここから */
#endif
np = #
printf("The value %%d is stored at address %d\n", &num
);
printf("The value %%d is stored at address %d\n", np /* ここまでが3つ目の****** */);
/*ここではポインタ変数npだけを使って書くこと*/
>>925 一応問題の要請でデータは配列に格納すると書いてあるから、
配列に格納してみたけど、一回サーチするだけで全ての処理終わるのよね。
だから、
d[i] -> d
にしてわざと問題で求めている要件を破って、
「一回のサーチで処理が完了するように工夫しました」
とか主張するとおいしいかもね。
教官の想定している実装だと、
1. まず配列に格納
2. 最大値、最小値、平均値を計算
3. 最大値と等しい学生番号を順に出力
4. 最小値と等しい学生番号を順に出力
5. (値-平均)の二乗和から分散を出力
こういう感じになるだろうと予想して配列に格納とか言ったのかな?
あと var は標準偏差じゃなくて、分散だろうという突っ込みは無しでw
3 文字でそろえたかったの
改行が多すぎますと Error が出たので怒涛の圧縮かけましたw
そろそろ次スレ?
まだだ。まだ終わらんよ。
>>931 fortune用のデータを作ってくれ。
933 :
デフォルトの名無しさん :04/07/03 14:05
終らない歌を歌おう くそったれのお前らのため。
>>926 #if 0 ... #endifの間も字句解析されるから、'を単独で使うのはまずい。
…と、ネタにマジレスしてみるテスト。
>>934 そっか。じゃあ
>/* ここから */
の後ろと
> /* ここまでが2つ目の****** */
の前に " を追加すべし
>>923
例えば struct CELL{ char moji[10]; int num struct CELL *right; struct CELL *left; }; って構造体でmojiのアルファベット順(辞書順)に二分木をつくったとしたとき その二分木の中からnumの大きい順に要素を5こ取り出す関数を作って欲しいんですが c言語で
なんとなく
>>1 をはっときますね。
1 名前: ぼるじょあ ◆yBEncckFOU 投稿日: 04/06/23 03:41
(・3・)アルェー 実は他の人にまかせっきりのC++房のぼるじょあですYO!
わからない宿題を片づけますYO!
【注意点】 -------------------------------------------------
・問題はしっかりと解いてもらう方にわかりやすいように
問題文などの省きはやめ、エラーなどは適切に書きましょう
全文を書いてしまうか、分かりやすくまとめましょう。
・後になって問題につけたしをするのはやめましょう。
解いてもらっている方に失礼になってしまいます。
------------------------------------------------------------
【アップローダー==ラウンジ】(質問が長い時はココ使うと便利 回答者もコードが長ければここに)
http://do.sakura.ne.jp/%7Ejunkroom/cgi-bin/megabbs/lounge/index.html 【歴代スレは
>>2-10 】
ア〜ポインタ難しいな〜。イラツク。アツイ、レイプシタイ。
次スレ立てるなら、ぼるじょあ以外で頼む。
(・3・)エー そう言われるとぼるじょあで立てたくなりますYO!
なら次スレ立てるなら、ぼるじょあで頼む。
というかね、ぼるじょあだけで3つ以上も立ってるから、そろそろ新しいのがいいなあと。
じゃ、ようかんマンで
こんなかんじ?
.__ 実は集団行動が嫌いなようかんマンです
|・∀・| <調子に乗ってC/C++の宿題片付けます
ト旦ノ.|
調子`ゝゝ´調子
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
【注意点】 -------------------------------------------------
・問題はしっかりと解いてもらう方にわかりやすいように
問題文などの省きはやめ、エラーなどは適切に書きましょう
全文を書いてしまうか、分かりやすくまとめましょう。
・後になって問題につけたしをするのはやめましょう。
解いてもらっている方に失礼になってしまいます。
------------------------------------------------------------
【アップローダー==ラウンジ】(質問が長い時はココ使うと便利 回答者もコードが長ければここに)
http://do.sakura.ne.jp/%7Ejunkroom/cgi-bin/megabbs/lounge/index.html 【歴代スレは
>>2-10 】
948 :
ようかんマン ◆nup627Y0Gs :04/07/03 15:43
.__ ヽ|・∀・|ノ ようかんマン#羊羹饅々で 誰でも |__| ようかんマン ◆nup627Y0Gs になれるよ | |
ライフゲームで100×100のセルの中で自分と相手を比較して表示する 二次元配列を使ったプログラムを作る。 表示するセルはランダムでポインタは使用しない。 <ルール> ●:自分 ○:相手 ●○ や ○ のような縦・横・ななめで相手が2つか3つあればそのまま表示 ○ ●○ ○ 相手が1つか4つ以上あったら自分は消える。 相手が2つか3つあった場合、自分が表示される(増える) セルの現在状態 | 8近傍でのonのセルの数 | セルの次の状態 on | 2、3 | on on | 2、3以外 | off off | 3 | on off | 3以外 | off ただし、表示するセルが端になった場合、反対側のセルと繋ぎ合わせて判断する。 よろしくお願いします。
>>949 見辛い。
●○
○
と
○
●○
○
です
ようかんマンで立てようとしたが立てれなかった・・・
スレタイは ようかんマンがC/C++の宿題を片付けて見せます 26棹 でよろしく
953 :
デフォルトの名無しさん :04/07/03 16:27
1回目の実行でnmlになるけど 2回目の実行でabcに戻ればいいんだけど1回目と同じでnmlに戻ってしまいます。 関数strxorにどこかおかしいところがあるのでしょうが、わかりません。 ちなみに問題は 「文字列を引数として受け取り、各文字の下位4ビットを排他的論理和を用いて反転させた文字列を出力させる関数を作成しなさい。同じ文字列に対して2回関数を実行し、2度目の実行後に元の文字列に戻ることを確認しなさい」 です。 --------------- #include <stdio.h> #include <string.h> void strxor(char str[]){ unsigned char ext1_bit[100],ext2_bit[100]; unsigned char xor_bit[100],ans_bit[100]; int i,len; len = strlen(str); for(i=0; i<len; i++){ ext1_bit[i] = str[i] & 15; /* 下位4ビットを抜き出す */ xor_bit[i] = ext1_bit[i] ^ 255; /* 排他的論理和を求める */ ext2_bit[i] = xor_bit[i] & 15;/* 排他的論理和の2進数の4ビットを抜き出す */ ans_bit[i] = ext2_bit[i] + (str[i] - ext1_bit[i]); /* 下位4ビットの計算後の2進数表示 */ } printf("%s\n",ans_bit); } int main() { char str[100]; printf("文字列を入力してください.\n"); scanf("%s",str); printf("1回目の実行\n"); strxor(str); /* 1回目の実行 */ printf("2回目の実行\n"); strxor(str); /* 2回目の実行(元に戻る) */ return 0; } --------
>>953 同じ変換を2回行っているだけだから。
つまり、「変換した結果」を変換しなければならないので、
xorしたものでstrを置き換えましょう。
955 :
デフォルトの名無しさん :04/07/03 17:03
>>954 ありがとうございます。
str[i] = ext2_bit[i] + (str[i] - ext1_bit[i]);
でよかったんですね・・・Orz
>>953 bit演算を行う時は
& 0xf; /* 下位4ビットを抜き出す */
^ 0xff; /* 排他的論理和を求める */
& 0xf;/* 排他的論理和の2進数の4ビットを抜き出す */
としたほうがよい
void strxor(char str[]){ int i,len; len = strlen(str); for(i=0; i<len; i++){ str[i] = str[i] ^ 0x0f; } printf("%s\n",str); }
>>949 表示するセルはランダムという意味がよくわからない。 どれか一つのセルに注目するってこと?
>>959 ランダムは100×100のセルに適当に表示ってことです。
表示されたセルの中で1つ1つ判定していくってことです。
ライフゲームなんてうんざりするほどサンプルあふれてるから、 ここで聞くよりググルなりしたほうが早いよたぶん。
タッチタイプのことではないんです。 いちにちに自分が打鍵する数を各キーごとに集計してその結果を 翌朝に自分の携帯にメールで通知するソフトをCで作れというのが課題です。
今からようかんマンで次スレ立ててみます
964 :
ようかんマン ◆nup627Y0Gs :04/07/03 22:24
966 :
デフォルトの名無しさん :04/07/04 05:43
おいらの宿題をお願いしまつ 1.datファイルを読み込み、ファイル一覧を取得 2.ファイルの存在を確認する 3.全てのファイルがあれば、ファイルをtempフォルダへコピーする 4.各ファイルを移動する datの形式は、 START AAA:c:/a/temp.zip BBB:c:/b/temp.mpg CCC:c:/c/temp.jpg END 例) c:\a\temp.zip c:\b\temp.mpg c:\c\temp.jpg にあるファイルがあるか確認。あればc:\temp内に全てのファイルをコピー c:\a\temp.zip→c:\AAA c:\b\temp.mpg→c:\BBB c:\c\temp.jpg→c:\CCC へ移動する。 移動が終わったら、datファイルは削除する。
コピーと移動を行う環境非依存の汎用的な方法がないんで、環境を明記せよ
968 :
デフォルトの名無しさん :04/07/04 06:08
>>967 Windows2000です。
宜しくお願い致します。
969 :
>>967じゃないけど :04/07/04 12:10
>>969 レス遅くなりました。
ありがとうございます。
さっそく、やってみます。
初めまして。色々と試しているのですが、プログラムが作れません。 よろしければ、教えてください。 「チーム研究発表会の評価を集計するプログラムを作る。3人以内の学生メンバーで構成される4 チームが発表会に参加する。評価は調査内容、提案内容、発表資料、発表方法の4つのポイントで 行われ、各々のチームに対して合計点数が付けられる。」 1.評価に必要なデータを全て含むようなチームを表す構造体を作成し、typedefで名前を付けよ。 変数名はできる限り理解しやすいものを考え、各チームのメンバーのフルネームと学籍番号も 分かるようにすること。また、各チームにはチーム番号をつけよ。 という物なのですが、ここまで指定されていたら作れるのが当たりまえなのかもしれませんが、初心者 なものでほぼ手につきませんので、教えてください。
>>971 もう7月です。今の時点でこんなことをしてたら2年後なり4年後なりに自分がどうなるか考えなさい。
973 :
デフォルトの名無しさん :04/07/04 22:03
げ、あげちまったスマソ
975 :
デフォルトの名無しさん :04/07/04 22:42
>>973 error C2440: '=' : 'void *' から 'filelist *' に変換できません。
'void*' から非 'void' 型への変換には明示的なキャストが必要です。
と出て、コンパイルできません。
これなんでしょうか?
エラーの発生した場所が分からないと確かなことはいえないけど、 多分 malloc の返り値の型(void *) と代入先の型 (filelist *) が違うからかな。 ↓はてさて、これで直るか? if (curr == 0) { /* 新しい構造体を確保 */ - file = malloc(sizeof(filelist)); + file = (filelist *)malloc(sizeof(filelist)); curr = file; } else { - curr->next = malloc(sizeof(filelist)); + curr->next = (filelist *)malloc(sizeof(filelist)); curr = curr->next; }
C++でコンパイルしてんじゃねぇの?
>>977 どういいう意味?
VCじゃ、コンパイルできないの??
>>973 どうせだったらWin32API使ってバリバリに書けよw
>>978 >973はC。C++としてコンパイルするからエラーになる。ちゃんとCとしてコンパイルすれば通るよ。
>>980 ただでさえ低い可搬性をさらに下げろと………
983 :
デフォルトの名無しさん :04/07/05 16:02
「 typedef unsigned int Pages; /* ページ数 */ typedef char *Title; /* 文献のタイトル */ typedef char *Nname; /* 作者の名前 */ typedef char *Description; /* 説明 */ 」 これを使って定義したデータ型を使用して、標準入力から論文データを 読み込み、論文リストを保持し、標準出力への表示を行うプログラムを malloc関数とsizeof演算子を用いて作成せよ。 という問題です。教えてください。
985 :
デフォルトの名無しさん :04/07/05 17:55
この問題をお願いします。 適当な長さの10個の文字列を配列に読み込み、それらを短い順に並べて 表示するプログラムを作成しなさい。並べ替えは関数を使って行うこと。 文字列はchar型2重配列を使うこと。
"重配列" の検索結果のうち 日本語のページ 約 54 件中 1 - 36 件目 (0.16 秒) 意外と多いのね
>>985 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TEKITOU 256
int compare(const void *a, const void *b)
{
int x = strlen((const char *)a);
int y = strlen((const char *)b);
return (x < y)? -1: (x > y)? 1: 0;
}
int main(void)
{
char strings[10][TEKITOU];
int i:
for (i = 0; i < 10; ++i) { printf("string %d: ", i); fgets(strings[i], TEKITOU, stdin); }
qsort(strings, 10, TEKITOU, compare);
for (i = 0; i < 10; ++i) { printf("%s\n", strings[i]); }
return 0;
}
#include<stdio.h> void mul(const int ma[2][3],const int mb[3][2],const int mc[2][2]); main() { int i,j; int ma[2][3]={{1,2,3},{4,5,6}}; int mb[3][2]={{1,5},{5,3},{8,1}}; int mc[2][2]; mul(ma,mb,mc); for(i=0;i<=1;i++){ for(j=0;j<=1;j++){ printf("%4d",mc[i][j]); } putchar('\n'); } return(0); } void mul(const int ma[2][3],const int mb[3][2],const int mc[2][2]) ←24行目 { int i,j,k; for(i=0;i<=1;i++){ for(j=0;j<=1;j++){ for(k=0;k<=2;k++){ mc[i][j]+=ma[i][k]*mb[k][j]; } } } return; } 行列の積を求めるのですが、これをコンパイルすると、”c 24: can't change value of const object (+=)”と出ます。
>>988 俺には、24行目は
> mc[i][j]+=ma[i][k]*mb[k][j];
に見えるのだが。
だとすると、const int mc[2][2] に代入できるわけがない。
24行目はmc[i][j]+=ma[i][k]*mb[k][j];でした。ごめんなさい
自分で ma,mb,mc は変更不可(const)と宣言してるのに、その変更不可なmc に 代入しようとしてるのがまずい。 ma と mb から mc を求めるんなら、const は ma と mb にしか付けてはいけない。
>>991 ありがとうございました。勉強になりました
993 :
デフォルトの名無しさん :04/07/06 02:37
7
994 :
デフォルトの名無しさん :04/07/06 02:37
6
5
996 :
デフォルトの名無しさん :04/07/06 02:38
5
997 :
デフォルトの名無しさん :04/07/06 02:39
5?
998 :
デフォルトの名無しさん :04/07/06 02:40
5
999 :
デフォルトの名無しさん :04/07/06 02:41
5
5
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。