[1] 授業単元: Cプログラミング
[2] 問題文(含コード&リンク):
1、武君が持っているお金の3倍と景子さんが持っているお金の5倍を加えると7500円
武の2倍と景子の7倍を加えると8850円である。それぞれいくら持っているか
2、sinxとxを加えると1になった。xはいくらか
上の2つの問題について解く方法を考えプログラムをくめ
上の問題だけしか解けない方法でも構わない
できれば1はfor文の2重ループとx,yをランダムに発生させて合わせるという2パターン
[3] 環境
[3.1] OS: Windows
[3.2] コンパイラ名とバージョン: VC 6.0
[3.3] 言語: C
[4] 期限: 2008年10月3日まで
[5] その他の制限:
ネット上にある連立方程式のプログラム(?)をつかわずにやれとのことですが気にしないでいいです
変な問題なのですがどなたかお願いします
>>952 sinのも似たようなもんだよ
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void main(){
int takeru, keiko, found;
found = 0;
for(keiko = 1;keiko < 7500/5; keiko++){
for(takeru = 1;takeru < 7500/3; takeru++){
if(((takeru*3+keiko*5) == 7500) && ((takeru*2+keiko*7) == 8850))
found = 1;
if(found != 0)break;
}
if(found != 0)break;
}
if(found != 0)printf("武=%d 景子=%d", takeru, keiko);
}
void main(){
int takeru, keiko, found;
srand(time(NULL));
found = 0;
while(found == 0){
keiko = rand() / 7500/5 + 1;
takeru = rand() / 7500/3 + 1;
if(((takeru*3+keiko*5) == 7500) && ((takeru*2+keiko*7) == 8850))
found = 1;
}
if(found != 0)printf("武=%d 景子=%d", takeru, keiko);
}
>>950 IPとして扱うならネットワークバイトオーダー(ビッグエンディアン)だろう
address & 0x000000ff は192になる
またバカが掻き回しにきたかw
956 :
801:2008/09/30(火) 16:43:44
>>802 コンパイルしてみた結果動くようです。
で、このプログラムはどういった動作をするものでしょうか?
結局よく分からなくて適当書いて提出しました。
とはいえ、取り敢えずどうもありがとうございました。
958 :
946:2008/09/30(火) 19:18:33
#include<stdio.h>
main()
{
char str[10];
gets(str);
printf("入力文字列:");
puts("str");
printf("逆転文字列:");
}
こんな感じかな?
全然わかんない・・・・
文字を逆転するのもどうしたらいいのかわからないし・・・・
誰か助けてください
959 :
946:2008/09/30(火) 19:21:26
puts(str)だった
960 :
946:2008/09/30(火) 19:32:07
>>947 習ってるのは
#include<stdio.h>
main()
みたいな感じで、main()をいじる方法はならってないです。
int main(〜)じゃない方法で出来ないでしょうか?
後最後のreturn 0;というのもまだ習っていません。
>>958みたいな感じではこのプログラムは作れないんでしょうか?
連レス失礼しました。
>>960 #include <stdio.h>
#include <string.h>
main()
{
char buf[1600];
int i;
printf("入力文字列:"); gets(buf);
i= strlen(buf);
printf("逆転文字列:");
while (i-- > 0) {
printf("%c", buf[i]);
}
printf("\n");
}
説明するのもめんどくさいからこれで
962 :
デフォルトの名無しさん:2008/09/30(火) 19:39:56
>>937 >>932ですが、わかりにくかったみたいですみません。
例えば、キーボードから0,0,1,1,2,2,3,3,4,4,5,5,6,7,8,9
と、入力したとき、実行結果が
histo[0]=**
histo[1]=**
histo[2]=**
histo[3]=**
histo[4]=**
histo[5]=**
histo[6]=*
histo[7]=*
histo[8]=*
histo[9]=*
のように表示するプログラムをつくるという意味です(ヒストグラム)
ポインタは使用してもかまいません。必ず配列の受け渡しを行っていることが前提です。
どなたかお願いします。
int histo[10] = {0};
while(適当に) histo[input_value]++;
と、詰めて、
for (i=0; i<10; i++) {
while(histo[i] != 0) {
printf("*");
histo[i]--;
}
printf("\n");
}
という感じに出力すればよいのではないかな。
>>953さん
ありがとうございます。すごく助かりました
>>953 すいません下のランダムの方がうまくいかないのですが
>>965 どううまくいかないんだろう。
永久ループに見せかけていつかそのうち見つかるってアレじゃないのかな。
>>965 rand() / 〜 じゃなくて rand() % (〜) の間違いだと思う
できました。ありがとうございます
970 :
デフォルトの名無しさん:2008/09/30(火) 22:24:22
>>963 ありがとうございます。配列の受け渡しはどのようにすればよいのでしょうか。
>>970 何に渡すの?別にmainだけでいいのでは。
というか内部関数作って配列渡そうとするとポインタ使うことになっちゃうよ
諸々を検討して、ああ、void main ってことなんだなって理解してたのに。
972 :
971:2008/09/30(火) 22:36:19
と思ったら配列渡す前提となっていた。
どこを関数化するんですか?
973 :
デフォルトの名無しさん:2008/09/30(火) 23:06:32
>>972 入力した0〜9までの個数を*で表示する部分を関数化です。
>>973 mainで
show_histogram(histo);
として、
void show_histogram(int *data) {
/* 出力処理 */
}
という関数を作ればよいのではないかな。
ポインタを習っていない段階でも
void xxxxx(int data[10]) {
/* 中身 */
}
は習った気がする。
976 :
デフォルトの名無しさん:2008/10/01(水) 00:11:27
>>974 void histogram(int *data){
int histo[10]={0};
int i;
for(i=0;i<10;i++){
while(histo[i]!=0){
printf("*");
histo[i]--;
}
printf("\n");
}
}
int main(void){
int j, a[16];
for(j=0;j<16;j++){
scanf("%d",&a[j]);
}
histogram(a);
return 0;
}
という感じにすればよいのでしょうか。
977 :
952:2008/10/01(水) 00:43:26
>>952の1番目の問題を解いてもらって2番目のsinx + x = 1 のほうの問題をやっていたのですがうまくいきませんでした
for文でまわしても結果がでてこないのとsinxのxはラジアンで扱ったほうがいいのかどうか(どっちでやってもうまくいかなかったんですが)わかりません
どなたかできる方いたら教えていただけないでしょうか?よろしくお願いします
>>977 double f(double x){
return sin(x)+x-1;
}
として、あとはニュートン法でも二分法でも
979 :
952:2008/10/01(水) 01:19:08
アドバイスありがとうございます。頭悪くて申し訳ないんですが以下のプログラムは何がいけないんでしょうか?全部おかしいですか?
#include <stdio.h>
#include<math.h>
double f(double x){
return sin(x)+x-1;
}
void main(void)
{
double x,z;
for(x=0;x<5;x++){
if(f(x)==0)z=1;
if(z!=0)printf("%d",x);
}
}
980 :
952:2008/10/01(水) 01:22:12
すいませんこっちでした
#include <stdio.h>
#include<math.h>
double f(double x){
return sin(x)+x-1;
}
void main(void)
{
double x,z;
z=0;
for(x=0;x<5;x++){
if(f(x)==0)z=1;
if(z!=0)
{printf("x=%d\n",x);
z=0;
}
}
}
>>952 #include <stdio.h>
#include <math.h>
int
main(void)
{
double x = 0.0;
for ( x = 1.0; 1.0E-8 < x; x -= 0.01 ) {
if ( (sin(x)+x-1.0) < 1.0E-8 ) {
printf("x == %f\n", x);
break;
}
}
return 0;
}
>>976 >>963 には入力データを配列に詰める処理と、表示処理を書いているんだけど
なぜ
>>937 のエッセンスを微妙に混ぜてしまったの?
分からないままとりあえず組み合わせて
> という感じにすればよいのでしょうか。
と締めくくるのは、クマーAAを生むのに必要な技術であって、プログラムを組むには必要ないよ。
懐かしいネタがw
void show_histogram(int *data){
int i;
for(i=0;i<10;i++){
while(data[i]!=0){
printf("*");
data[i]--;
}
printf("\n");
}
}
int main(void){
int i, input_value, a[10] = {0};
for(i=0;i<16;i++){
scanf("%d",&input_value);
a[input_value]++;
}
show_histogram(a);
return 0;
}
こうですか!?わかりません!教えてください!
if禁止なので入力チェックは本当にわかりません><
985 :
946:2008/10/01(水) 10:48:55
[1] 授業単元: c++
[2] 問題文(含コード&リンク):
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7745.txt ・「年(西暦)」「月」を入力したら,その月のカレンダーを表示するプログラムを作成しなさい。ただし,下記の条件を満たすものとする。
【条件】
(1)カレンダークラスを作成し,main関数でカレンダークラスの実体を生成し,カレンダークラス内のメンバ関数(show関数)を呼び出してカレンダーを表示する。
(2)カレンダークラスはカプセル化されていること。
(3)カレンダー表示には,年,月および曜日,日を表示すること。
(4)上記以外については自由に作成してよい。
[3] 環境
[3.1] OS: windows
[3.2] コンパイラ名とバージョン: VS2008
[3.3] 言語:C++
[4] 期限: ([2008年10月5日まで]
987 :
986:2008/10/01(水) 13:56:34
もしよければ閏年の表示もお願いします。
989 :
デフォルトの名無しさん:2008/10/01(水) 14:39:25
[1] 授業単元: 数理科学C
[2] 問題文: 二分法を用いて√2の近似値を求めるプログラム
[3] 環境
[3.1] OS: Windows/
[3.2] コンパイラ名とバージョン: gcc
[3.3] 言語: C
[4] 期限: [2008年10月2日まで]
[5] その他の制限:特になし
>>984 乙!
>>989 #include<stdio.h>
#include<math.h>
double f(double x){
return x*x-2;
}
int main(void){
double a=0.0, b=2.0, x;
while(f(a)*f(b)<0.0){
x=(a+b)/2;
if(f(a)*f(x)<0) b=x;
else a=x;
printf("x=%f f(x)=%f\n", x, f(x));
if(fabs(f(x))<1e-7) break;
}
return 0;
}
>>980 これの関数 f(x) の中身を書き換えればおk
991 :
デフォルトの名無しさん:2008/10/02(木) 16:03:28
質問なのですが、プログラム中に別のプログラムを呼び出す場合は
データをコマンドライン上で受け渡しはできないのでしょうか?
それともtxtデータなどで外部出力したものを読み取るしかないのでしょうか。
>>991 LinuxでもWindowsでも引数つきでプログラム起動は出来るだろう
引数か標準入力に書き込むか
994 :
991:2008/10/02(木) 16:30:53
調べてみたら標準出力のパイプ処理でうけわたしできるみたいですね。
ありがとうございました。
埋めるぜ
オレにとって手ごろな宿題が無くなってきてるな
ストライクゾーンが狭いからしょうがないけど
1000取っちゃうぜ?
どうぞどうぞ
では遠慮なく
1000ならオレ様勝手にレベルアップ
1001 :
1001:
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。