C/C++の宿題を片付けます 83代目
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2007/02/07(水) 15:41:38【質問者へ】
回答者の便宜のため、質問の際は以下を行うことを推奨します。
・質問は【質問テンプレ】を利用してください。
・問題文は、出題されたまま全文を書いてください。
・計算問題は数式をあげ、どのような計算をするのか詳しく説明してください。
・エラーは、その詳細と発生した行を書きましょう。エラーメッセージはコピペしてください。
・後から問題に付け足しするのはやめましょう。付け足しは作業を無駄にしがちです。
・なりすましを防ぐため、トリップを使ってください。名前欄に、「#」に続けて任意の文字列を入力して投稿すると、その文字列を知らない他人に騙られることを防ぐことができます。
【質問テンプレ】
[1] 授業単元:
[2] 問題文(含コード&リンク):
[3] 環境
[3.1] OS: (Windows/Linux/等々)
[3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等)
[3.3] 言語: (C/C++/どちらでも可 のいずれか)
[4] 期限: ([yyyy年mm月dd日hh:mmまで] または [無期限] のいずれか)
[5] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々)
【アップローダー==ラウンジ】(質問が長い時はココ使うと便利 回答者もコードが長ければここに)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
【C 関数検索 man on WWW】 http://www.linux.or.jp/JM/index.html
【過去ログ検索】 http://chomework.sakura.ne.jp/
【wiki】 http://www23.atwiki.jp/homework/
0232デフォルトの名無しさん
2007/02/14(水) 00:02:00元はバブルソートのプログラムだったんだろうと予想
#include<stdio.h>
#define ARRAY_SIZE 5
int main(void)
{
int Ary[ARRAY_SIZE]={10,5,8,2,6};
int wrk,i,j;
for(i=0;i<ARRAY_SIZE-1;i++)
{
for(j=0;j<ARRAY_SIZE-1-i;j++)
{
if(Ary[j]>Ary[j+1])
{
wrk=Ary[j];
Ary[j]=Ary[j+1];
Ary[j+1]=wrk;
}
}
}
printf("整列後\n");
for(i=0;i<ARRAY_SIZE;i++)
{
printf("%d\t",Ary[i]);
}
printf("\n");
return 0;
}
0233デフォルトの名無しさん
2007/02/14(水) 00:03:00やってること
#include <stdio.h>
#include <string.h>
int main(void){
char str[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int i1, i2;
i1=strlen(str) - 1;
i2=0;
while(i1>=0){
str[i2]=str[i1];
putchar(str[i2]);
i2++;
i1--;
}
putchar('\n');
return 0;
}
0234デフォルトの名無しさん
2007/02/14(水) 00:04:050235221
2007/02/14(水) 00:07:31ありがとうございます。
す ご く よ く わ か り ま し た。納得!
だから、str2を逃げ場所として用意してたんですね・・・
0236デフォルトの名無しさん
2007/02/14(水) 00:08:00これの出力結果をじっくり眺めてみるよろし
#include <stdio.h>
int main(void){
char str[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char *p1,*p2;
p1=str;
p2=str;
while(*p1!='\0'){
p1++;
}
p1--;
while(p1>=str){
puts(str);
*p2=*p1;
p2++;
p1--;
}
puts(str);
return 0;
}
0237221
2007/02/14(水) 00:11:16ABCD・・・WXYZ
ZBCD・・・WXYZ
ZYCD・・・
となる!(と思う)
わざわざ理解させるために、改変してもらってありがとうございます m(_ _)m
0238128
2007/02/14(水) 00:33:27自分で操作する部分は完璧です!
あとはコンピュータと対戦という形にできれば完成です!
敵は連続数字(34、78といった連続した数字)>2枚組(22、66など)>一枚抜かし(13、57など)
といった優先順位で自動で切るというようにしたいのですが、可能でしょうか?
0239225
2007/02/14(水) 00:47:350240デフォルトの名無しさん
2007/02/14(水) 00:55:56> 何をして欲しいんだ?
童貞な俺でも愛してもらいたい
0241デフォルトの名無しさん
2007/02/14(水) 06:52:480242デフォルトの名無しさん
2007/02/14(水) 08:09:450243デフォルトの名無しさん
2007/02/14(水) 08:58:510244デフォルトの名無しさん
2007/02/14(水) 09:21:180245デフォルトの名無しさん
2007/02/14(水) 09:24:180246デフォルトの名無しさん
2007/02/14(水) 09:28:270247デフォルトの名無しさん
2007/02/14(水) 10:06:33以下のC++の問題の回答について教えていただけませんでしょうか?
一応自分でもやってみましたがコピーコンストラクタなんかがどうも自信がなく…orz
http://www.za.ztv.ne.jp/yosi-h/vfsh0003faf0e6.jpg
0248デフォルトの名無しさん
2007/02/14(水) 10:31:40チョンボの判定は無し
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3652.c
0249デフォルトの名無しさん
2007/02/14(水) 11:06:56ソースコードがすべてあるんだから
実行してみれば良い
試験中なのかもしれんがw
0251デフォルトの名無しさん
2007/02/14(水) 15:37:20[2] 問題文:
平面上の3点(x1,y1),(x2,y2),(x3,y3)の座標値を与えて、その3点を通る二次関数 y=ax^2+bx+c
あるいはy=a(x-b)^2+cの3つの係数a,b,cを計算し、極点(xp,yp)を計算するプログラムを作れ。
ただし、平面上の3点を与えたときに二次曲線にならない場合はエラーとして返す事。
[3] 環境
[3.1] OS:Linux
[3.2] コンパイラ(バージョン):gcc
[3.3] 言語:C
[4] 期限:2/15 18:00まで
[5] その他の制限:特にありません。
どうか、よろしくお願いします
0252デフォルトの名無しさん
2007/02/14(水) 16:23:47[2] 問題文(含コード&リンク):
入力ファイル in.txt に、英文が格納されている。英文は、1行が末尾の改行も含めて40字以下、全体で20行以内とする。
英文には、英字、単語の区切りの空白、語句の区切りのコンマ、文末のピリオドのみが使われている。
入力ファイルの改行を取り除き、1行に1文の形式で出力する。すなわち、ピリオドの後のみで改行し直す。
コンマでは改行せず、単語の区切りの空白は残す。文末に空白が残っていてもよい。
出力は、ファイル out.txt に書き出す。
● 実行例
入力 inp.txt
This is a pen.But I don't have eraser.
出力 out.txt
This is a pen.
But I don't have eraser.
なお、入力ファイルと出力ファイルをオープンする。
行単位の読込みより、書式付の方が処理しやすい。
入力ファイルを字句単位で読み込み、空白を入れて出力ファイルに書き込む。
字句の最後にピリオドがあれば、改行を書き込む。
ファイル終端 EOF で終了する。
字句の最後のピリオドの有無は、文字列の長さを求めたり、文字の出現位置を返す関数で調べる。
[3] 環境
[3.1] OS: windows xp
[3.2] コンパイラ名とバージョン: bcc32
[3.3] 言語: C
[4] 期限: 本日中までです。
[5] その他の制限: 早いうちだと助かります。
0253デフォルトの名無しさん
2007/02/14(水) 16:51:14#include <stdio.h>
#include <string.h>
void setup()
{
if (!freopen("in.txt", "r", stdin)) {
perror("in.txt");
exit(1);
}
if (!freopen("out.txt", "w", stdout)) {
perror("out.txt");
exit(1);
}
}
int main()
{
char buff[64], *p, *q;
setup();
while (scanf("%63s", buff) != EOF) {
for (p = buff; q = strchr(p, '.'); p = q + 1)
printf("%.*s\n", q - p + 1, p);
if (*p)
printf("%s ", p);
}
putchar('\n');
return 0;
}
0254252
2007/02/14(水) 17:06:49警告が何個か出てますがきにしないでいいんですかね?
0255デフォルトの名無しさん
2007/02/14(水) 17:09:33無視しても問題はないけど、
#include <stdlib.h>
は追加しといてくれ。
代入式をforループの条件に使っていることに関する警告は無視しても構わない
0256デフォルトの名無しさん
2007/02/14(水) 17:14:020257252
2007/02/14(水) 17:14:55ありがとうございました。
0258デフォルトの名無しさん
2007/02/14(水) 17:19:13http://ex17.2ch.net/test/read.cgi/news4vip/1171440924/
0259デフォルトの名無しさん
2007/02/14(水) 17:48:00[2] 問題文(含コード&リンク):
typedef struct _Student Student;
struct _Student {
char name[10]; // 氏名
int p1; // 数学の得点
int p2; // 英語の得点
int p0; // 合計点
}
上記のような構造体で、学生の成績を格納し、構造体の配列で成績表を管理する。
最初に、データ数 num を入力する。データ数は4以上とする。
以降で、1行単位で、氏名 数学の得点 英語の得点 を入力する。
氏名と合計点を、合計点の低い方から3人だけ出力する。
同点の場合は、先に入力された方を優先する。
[3] 環境
[3.1] OS: windows xp
[3.2] コンパイラ名とバージョン: bcc32
[3.3] 言語: C
[4] 期限: 19時まで
[5] その他の制限:
0260デフォルトの名無しさん
2007/02/14(水) 18:50:49[1] 授業単元: 情報処理
[2] 問題文:
toupper,strcmp,strlen を用いずにそれらと同等の動作をする自作関数を作成せよ
[3] 環境 : Borland C++ 5.5
[3.1] OS: WindowsXP
[3.2]言語:C
[4]期限:2月15日 12時
0261デフォルトの名無しさん
2007/02/14(水) 19:22:00ほい。
#include<string.h>
int mystrlen(const char*a){return strchr(a,0)-a;}
int mystrcmp(const char*a,const char*b){return strncmp(a,b,-1);}
int mytoupper(int c){return c-97<26u?c^32:c;}
0262デフォルトの名無しさん
2007/02/14(水) 19:42:51int toupper( int ch ) { return ( ch += (('a'<=ch && ch <='z') ? 'A'-'a' :0) );}
int strcmp( char *a, char *b){
while( *a !=NULL && *b !=NULL && *a++ == *b++ ) ;
return ( *a - *b );}
int strlen(char *p){int cnt=0;
while ( *p++ !=NULL) cnt++;
return( cnt);
}
0263デフォルトの名無しさん
2007/02/14(水) 21:12:47*p++ !=NULLはないわ
0264デフォルトの名無しさん
2007/02/14(水) 21:26:11ch+=もないわ
0265デフォルトの名無しさん
2007/02/14(水) 21:52:14>264はウソ
0266デフォルトの名無しさん
2007/02/14(水) 22:01:550267デフォルトの名無しさん
2007/02/14(水) 22:10:530269デフォルトの名無しさん
2007/02/14(水) 22:50:110270デフォルトの名無しさん
2007/02/14(水) 23:09:39ch +='A'-'a'
小文字なら'A'-'a' を足す
0271デフォルトの名無しさん
2007/02/14(水) 23:11:410272デフォルトの名無しさん
2007/02/14(水) 23:12:16それなら代入する必要ないじゃん
0273デフォルトの名無しさん
2007/02/14(水) 23:14:41よくみりゃそーだな
0274デフォルトの名無しさん
2007/02/14(水) 23:16:26ch = ch + ('A'-'a' );
0275デフォルトの名無しさん
2007/02/14(水) 23:18:15これなら読みやすい
0276デフォルトの名無しさん
2007/02/14(水) 23:18:32return してるから代入する意味無いと言っている件
0277デフォルトの名無しさん
2007/02/14(水) 23:28:051つの問題に固執するんだ?
0278デフォルトの名無しさん
2007/02/14(水) 23:39:22debugerで返値を見てると予想
0279デフォルトの名無しさん
2007/02/14(水) 23:43:59ここは回答者が腕試しをするスレだもん。
0280デフォルトの名無しさん
2007/02/15(木) 01:22:37期限がよく分かんね
過ぎちゃったかな?
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3653.c
0281デフォルトの名無しさん
2007/02/15(木) 08:13:33どこもそうでしょ
アイドルの話をする掲示板でも何かの話題で盛り上がると
埋もれて流れてしまう書き込みがあるし。
誰も答えていない面倒な依頼を探すより
指摘など即答できるものに盛り上がってしまう。
0282デフォルトの名無しさん
2007/02/15(木) 11:16:05どっかの誰かの宿題を解く義務はない。
0283デフォルトの名無しさん
2007/02/15(木) 14:12:11やってみた。
こういう計算初めてやったから自信ないけど……
bcc5.5で確認。
gccもLinuxもさわったことないので適切に修正お願い
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3657.txt
0284デフォルトの名無しさん
2007/02/15(木) 15:32:29[2] 問題文(含コード&リンク):
プロンプト”input moji = ”に続けてgetchar()関数によりキーボードから文字を読み込み、
putchar()関数で入力された文字を画面に出力し、これをEOFが読み込まれるまで続ける。
[3] 環境
[3.1] OS: WindowsXP
[3.2] コンパイラ名とバージョン: Visual Studio
[3.3] 言語: C
[4] 期限: 明日AM9時
[5] その他の制限:よろしくおねがいします┏oペコリ
0285助けて・・・
2007/02/15(木) 16:12:293つの整数を入力し,その内の最小値を出力するプログラムを作成せよ.
但し,最小値を算出する関数,"min3"を自分で作成し用いなさい.
また,最小値の出力はメイン文で行うこと.
-------------------------------------------
"表示結果の例"
3つの整数を入力してください。
整数1:5
整数2:-4
整数3:0
最も小さい整数は-4
-------------------------------------------
<条件>
0.各自の課題であり,それぞれが自力でソースプログラムを作ること.
1.プログラム冒頭にプログラムの説明を入れる.
(どうやって作ったかの説明を記述下さい.)
2.各ポイントにコメントを挿入し,内容が分かるようにしておく.
3.ソースが綺麗になるようにVCのタブ機能を使うこと.
お助けください!!!!!まじできない・・・
0286デフォルトの名無しさん
2007/02/15(木) 16:17:27tempalte <typename T>
T min3(T a0, T a1, T a2)
{
return std::min(std::min(a0, a1), a2);
}
0287デフォルトの名無しさん
2007/02/15(木) 16:26:25課題:サイズnの配列をランダムでソートする場合、何回ソートを行うのが最適か、考えなさい。
一応作ってみたソースはこんな感じ
int a[size]をこれでシャッフル
void Shuffle(int a[],int size)
{
for(int i=0;i<size;i++)
{
int r=rand()%size;
int temp=a[i];
a[i]=a[r];
a[r]=temp;
}
}
よろしくお願いしますお( ^ω^ )
0288デフォルトの名無しさん
2007/02/15(木) 16:37:54#include <stdio.h>
int main(void) {
int c;
printf("input moji = ");
while((c=getchar())!=EOF) putchar(c);
}
0289デフォルトの名無しさん
2007/02/15(木) 16:41:57CっぽくないどころかCとは無関係だろ。
0290デフォルトの名無しさん
2007/02/15(木) 16:42:59#include <stdio.h>
int main(void)
{
int ch=0;
while ( EOF!=ch ) {
printf("input moji = ");
while ( EOF!=(ch=getchar()) ){
putc(ch,stdout);
if( ch=='\n')
break;
}
}
return 0;
}
0291デフォルトの名無しさん
2007/02/15(木) 16:53:58マルチだったのか
0292デフォルトの名無しさん
2007/02/15(木) 18:30:31この質問の意味が分からないのは俺だけ?
シャッフルしてるうちにいつかは整列される…って意味なら
配列の要素数をn、同じ要素の数をa#1, a#2・・・a#v としたら
n! / (a#1 * a#2 *・・・* a#v)
じゃね?
0293デフォルトの名無しさん
2007/02/15(木) 18:35:50俺もよう分からんが、
「サイズnの配列をランダムでソートする場合、何回ソートを行うのが最適か、考えなさい。」
たとえば
「a[5]={1,2,3,4,5} を 1回ソートしても、
0294デフォルトの名無しさん
2007/02/15(木) 18:37:35「a[5]={1,2,3,4,5} を 1回ソートしても、{3,2,1,4,5} みたいにランダムにはならない」
「つまり、何回くらい入れ替えればランダムっぽくなるか?」
的な問題かとオモタ
ていうか、「ランダムでソートする場合」って何?
0295デフォルトの名無しさん
2007/02/15(木) 18:41:090296デフォルトの名無しさん
2007/02/15(木) 18:42:280297デフォルトの名無しさん
2007/02/15(木) 18:42:50単純選択ソート......
0298デフォルトの名無しさん
2007/02/15(木) 18:46:16ソートって言葉を間違って使ってるからわかりにくいけど。
0299デフォルトの名無しさん
2007/02/15(木) 18:48:41よく気がついたな…。ム板はエスパー大杉。
0300デフォルトの名無しさん
2007/02/15(木) 19:00:02>>295
タメニナルナー
0301デフォルトの名無しさん
2007/02/15(木) 19:17:27ランダム := 無作為な交換
でソートする場合、何回
ソート := 交換
を行うのが最適か、考えなさい。
こういうことか
0302デフォルトの名無しさん
2007/02/15(木) 19:37:040303デフォルトの名無しさん
2007/02/16(金) 00:37:59「自分自身との入れ替え(つまり、実質入れ替わり無し)を含む」
やり方で n-1回 入れ替える
ってのが最小・均等なのかな?
0304デフォルトの名無しさん
2007/02/16(金) 01:42:23INT I=ATOI(STR);
みたいな事できないの?
0305デフォルトの名無しさん
2007/02/16(金) 01:48:520307お願いしますm(_ _)m
2007/02/16(金) 02:15:49[2] 問題文(含コード&リンク):1から5000までの素数をすべて計算せよ。
計算した素数のうち、双子素数となっている組を出力せよ。
双子素数とは、連続した奇数が素数になっているものの組である。
[3] 環境 windowsXP
[3.2] コンパイラ名とバージョン:VC 6.0 win32
[3.3] 言語: visualC++
[4] 期限: 2007年2月20日13:00まで
[5] その他の制限: プログラム中でC++の掛け算、割り算*,/を使ってはいけない。
0308デフォルトの名無しさん
2007/02/16(金) 02:52:47#include<stdio.h>
int main(void){
int i, j;
int prev_prime=1;
for(i=2;i<=5000;i++){
for(j=2;j<i;j++)
if(i%j==0) break;
if(j>=i){
if(i-prev_prime==2)
printf("%d %d\n", prev_prime, i);
prev_prime=i;
}
}
return 0;
}
0309デフォルトの名無しさん
2007/02/16(金) 03:02:32#include<iostream>
int main(void){
int i, j;
int prev_prime=1;
for(i=2;i<=5000;i++){
for(j=2;j<i;j++)
if(i%j==0) break;
if(j>=i){
if(i-prev_prime==2)
std::cout << prev_prime << " " << i << std::endl;
prev_prime=i;
}
}
return 0;
}
0310デフォルトの名無しさん
2007/02/16(金) 03:57:16[1] 授業単元: プログラミング演習
[2] 問題文(含コード&リンク): http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3658.txt
[3] 環境
[3.1] OS: Windows
[3.2] コンパイラ名とバージョン: Visual Studio 2005
[3.3] 言語: C++
[4] 期限: 2月16日
よろしくお願いします。
0311デフォルトの名無しさん
2007/02/16(金) 04:05:11[2] 問題文(含コード&リンク):
キーボードからgets()関数によりchar型配列a[5]に整数を文字列として読み込み、
atoi()関数を用いて文字列を整数に変換し、出力する。
[3] 環境
[3.1] OS: WindowsXP
[3.2] コンパイラ名とバージョン: Visual Studio
[3.3] 言語: C
[4] 期限: 本日12時
[5] その他の制限:
0312デフォルトの名無しさん
2007/02/16(金) 04:30:05bcc5.5で動作確認。
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char a[5];
puts("整数を入力 ※4桁以内");
gets(a);
printf("%d\n", atoi(a) );
return 0;
}
0313デフォルトの名無しさん
2007/02/16(金) 04:40:570314デフォルトの名無しさん
2007/02/16(金) 05:08:05いくらなんでもひどすぎだろ…
0315デフォルトの名無しさん
2007/02/16(金) 07:57:04>>310
自信ないけどやってみた
C++ってあるけど、明らかに元ソースがCなので.cで作成。
誰かツッコミよろ (汗
0316デフォルトの名無しさん
2007/02/16(金) 08:47:57ひどくない解答plz
0317デフォルトの名無しさん
2007/02/16(金) 10:02:25助かりました。ありがとうございました。
0318デフォルトの名無しさん
2007/02/16(金) 10:57:06[2] 問題文(含コード&リンク):
http://3rd.geocities.yahoo.co.jp/as_rmter/mondai.txt
[3] 環境
[3.1] OS: WindowsXP SP2
[3.2] コンパイラ名とバージョン: bcc55\bcc32.exe
[3.3] 言語: C
[4] 期限: できれば今日中
どなたかお願いします
0319デフォルトの名無しさん
2007/02/16(金) 10:58:47問題文見れない
0320デフォルトの名無しさん
2007/02/16(金) 11:19:55すいませんでした
こっちのアドレスです
0321デフォルトの名無しさん
2007/02/16(金) 11:29:050322デフォルトの名無しさん
2007/02/16(金) 11:57:240323デフォルトの名無しさん
2007/02/16(金) 12:00:590324デフォルトの名無しさん
2007/02/16(金) 12:08:25lastday[1] += ((ty%4==0 && ty%100!=0) || ty%400==0);
式の評価で2月の日数に加算をしているんだろうけど、きんもぉ〜〜☆
0325デフォルトの名無しさん
2007/02/16(金) 12:27:56if ((ty%4==0 && ty%100!=0) || ty%400==0)
lastday[1] ++;
ならいいのか
0326デフォルトの名無しさん
2007/02/16(金) 13:13:22http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3664.c
0327デフォルトの名無しさん
2007/02/16(金) 13:26:59ありがとうございました
0328デフォルトの名無しさん
2007/02/16(金) 13:28:16> この公式を使用する際は西暦1582年10月15日金曜日
> (グレゴリオ暦施行日)から有効になりますので注意
> この公式では1月、2月は前年の13月、14月として計算する事になっています。
念のために補足しとくっす。
0329デフォルトの名無しさん
2007/02/16(金) 13:38:39すまん、return 1; で終了させる条件の指定をミスったっす。面倒だから
if(year<=1582 && month<=10) return 1;
これを && month<=10 の部分は消しておいて。
1583年以降から適応ってことで if(year<=1582) にしといてちょっ。
0330デフォルトの名無しさん
2007/02/16(金) 20:25:07[1] 授業単元:プログラミング基礎
[2] 問題文(含コード&リンク):4行5列の行列の要素(整数)の最小値を求め表示する。。
[3] 環境
[3.1] OS: Windows XP
[3.2] コンパイラ名とバージョン: Visual Studio.NET
[3.3] 言語: C
[4] 期限: 2月17日12時
[5] その他の制限: if文、for文から配列まで習いました。
0331デフォルトの名無しさん
2007/02/16(金) 20:57:53こういう意味で良いの?
全角スペースは痴漢してちょ
#include <stdio.h>
a[4][5] = { // 超適当
{ 4, 2, -3, 3, 5 },
{ -1, 4, 0, 8, 23 },
{ 18, 2, 7, 9, 0 },
{ 22, -8, 9, 1, 18 }
};
int main(void)
{
int i, j;
int min;
min = a[0][0];
for (i=0; i<4; i++) {
for (j=0; j<5; j++) {
min = (a[i][j] < min) ? a[i][j] : min;
}
}
printf("最小値: %d\n", min);
return 0;
}
■ このスレッドは過去ログ倉庫に格納されています