――【注意点】―――――――――――――――――――――――――
・質問は必ず【質問テンプレ】に従ってください。
・問題文は、解いてもらう方にわかりやすいように全文を書きましょう。
・計算問題は必ず数式をあげ、どのような計算をするのか詳しく説明してください。
・エラーは、その詳細と発生した行を書きましょう。エラーメッセージはコピペしてください。
・後から問題に付け足しするのはやめましょう。解いてもらっている方に失礼です。
・複雑なAAはスレが荒れたり問題が埋もれる原因になりますので使用を控えてください。
―――――――――――――――――――――――――――――――
【質問テンプレ】
[1] 授業単元:
[2] 問題文(含コード&リンク):
[3] 環境
[3.1] OS:Windows/Linux/等々
[3.2] コンパイラ(バージョン):
[3.3] 言語:C/C++/どちらでも可 のいずれか
[4] 期限:yyyy年mm月dd日hh:mmまで または 無期限 のいずれか
[5] その他の制限:どこまで習っているか、等々
【アップローダー==ラウンジ】(質問が長い時はココ使うと便利 回答者もコードが長ければここに)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm 【前スレ】
C/C++の宿題を片付けます 43代目
http://pc8.2ch.net/test/read.cgi/tech/1115794784/ 【歴代スレは
>>2-13】
乙
でも、どこまで習ってるかなんて必要かなぁ
後ヅケで「while文じゃなくてfor文で〜」とか言われるのイヤだからな。
ま、もっともそういう奴はテンプレなんか読んじゃいないし、
自分の使っている環境もろくに判ってないワケだが・・・。
7 :
↓どこがおかしい?:2005/05/24(火) 16:24:45
#include <stdio.h>
void main(void)
{
int kazu;
kazu=1;
scanf("%d\n",&kazu);
while(kazu<50)
{
printf("%d\n",&kazu);
kazu=kazu+1;
}
を実行して、1と2を入力したら、
1
2
1245052
1245052
1245052
1245052
.
.
.
と出てきた。
ちなみにMicrosoft Visual C++(Win32?)使用。
>>7 mainの"}"が(ry
printf("%d\n",&kazu);
>>7 void main(void)
printf("%d\n",&kazu);
ここ。
10 :
↓どこがおかしい?:2005/05/24(火) 16:29:53
ありがとうございました。
>>7 ・void main(void)は間違い。
・scanf("%d\n",&kazu);の\nは冗長。
・printf("%d\n",&kazu);の&kazuは間違い。
・中括弧の対応があっていない。
void main(void)ってなんでだめなの?
13 :
7:2005/05/24(火) 16:35:26
なんでだろう・・
mainはintと仕様で決まっている。
>>6 テンプレ読めといえば一旦は片付くのかも。
情報の後だし禁止は入れてほしい。
あと、その後どうなったかもできれば報告してほしいなー。
Q 【void main(void)】
main の型を void で定義したら先輩に怒られた。
A
ANSI Cでは main 関数の型は int と決められています。 void とするのは間違いです。
にも関らず、ある種の参考書には main の型を void として説明しているようです。
また、初心者に限らず熟練したプログラマーがこのように書くことが珍しくありません。
このため、特に初心者のプログラマーは何も考えずに(あるいは特に決まった値を戻す必要がないと思って)
main の型を void にしてしまうことがありますが、ネットではこれは非難の対象になりがちです。
ttp://www.st.rim.or.jp/~phinloda/cqa/cqa6.html
>>16 後だし禁止って、全文書けって事じゃないのか?
19 :
7:2005/05/24(火) 16:46:17
↑超初心者には分かりません(T_T)
>>19 日本語も読めないのか?どこの国の人間だよ
22 :
7:2005/05/24(火) 16:53:15
>>20 「関数の型」ってのが分からないんだと思うぞ
>>22 だから、日本語も読めないのかと聞いている。
25 :
16:2005/05/24(火) 16:56:06
>>後から問題に付け足しするのはやめましょう。解いてもらっている方に失礼です
書いてあったな。すまん。
【質問テンプレ】
[1] 授業単元: プログラミング1
[2] 問題文:
■■ネットワークプログラミング■■
2台のマシン(tokiとken)でソケットを用いた通信を行ってもらいます.
以下に送信側と受信側の動作を説明します.
・送信側
アルファベットのみで構成された文字列を1文字ずつ読み込みます(任意のファ
イルから文字列を読み込んでもよい).
そして,シーケンス番号と共に構造体に格納し,ソケットを用いて受信側に
送信する.
・受信側
受信したデータををAckとして,シーケンス番号と受信した文字を変換した
小文字なら大文字に,大文字なら小文字に)文字を構造体に格納し,送信側へ
送信する.
送信側では,受信用プロセスと,送信用プロセスを用意してください.
通信には,UDPを用い,ポート番号は1万+学籍番号の下3桁(10111など)と
2万+学籍番号の下3桁(20111など)を使ってください.
[3] 環境
[3.1] OS: Linux
[3.2] コンパイラ(バージョン):gcc
[3.3] 言語:C
[4] 期限:5月26日まで
よろしくお願いします。
>>26 前スレをちゃんと読め。それとも回答者はシカトか?
29 :
前スレ193:2005/05/24(火) 17:25:57
できん。困った。
30 :
デフォルトの名無しさん:2005/05/24(火) 17:38:21
[1] 授業単元:C言語
[2] 問題文: 自然数nを入力して受け付けて、さらにn個の整数を入力として
受け付ける。入力として受け付けたn個の整数を、受け付けた順とは逆順に
出力せよ。ただし、n>=0、n<=256であることを仮定してよい。
[3] 環境
[3.1] OS:WinXP
[3.2] コンパイラ(バージョン):VC++
[3.3] 言語:C++
[4] 期限:今日中にどうかよろしくおねがいします。
初歩的な問題で申し訳ありません。
>>30 #include <stdio.h>
int main(void)
{
int a[255],i=0,n=0;
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
for(i=n-1;i>=0;i--){
printf("%d",a[i]);
}
return 0;
}
32 :
31:2005/05/24(火) 17:45:10
ごめん。訂正
×:int a[255],i=0,n=0;
○:int a[256],i=0,n=0;
>>30 あと、細かい部分は自分でやってね
>>31 オチツケ。
a[256]じゃないとマズかろう。
>>32 すばやい回答をありがとうございました。
すごく助かりました。
>>30 #include <stdio.h>
#include <stdlib.h>
void print(int n)
{
if (n) {
int val;
scanf("%d", & val);
print(n - 1);
printf("%d\n", val);
}
}
int main()
{
int n = 0;
scanf("%d", & n);
print(n);
return 0;
}
>>36 再起が使いたい年頃なのさ。目を瞑ってやれ。
再帰を使わなくていい所に無理矢理再帰を使う香具師は、
自分の精液でも飲んでろってこった。
再帰より普通のループにした方が早いんじゃないか?
while(1)
{
semen = onane(side_dish);
drink(semen);
}
>>38 再帰版の一つのメリットはサイズの制限がスタックにのみ依存することだがね。
>35は別に無理矢理とは思わないけどなぁ。
#再帰的発想方法ができない人には辛かろうが、そうでない人には自然な発想だと思うし。
void my_life(void)
{
while(1){
if(rand()%3==1)
ona(2D_onechan);
else if(rand()%3==2)
ona(2D_imouto);
else
ona(3D_youjo);
}
}
43 :
デフォルトの名無しさん:2005/05/24(火) 18:49:21
[1] 授業単元: プログラミング実習
[2] 問題文(含コード&リンク): 1以上100以下の整数のうち2または7の倍数であるが、
3の倍数ではない数を出力し、いくつあるか数える
プログラムを作成しなさい。また出力は5個ごとに
改行すること。
[3] 環境
[3.1] OS:Linux
[3.2] コンパイラ(バージョン):gcc
[3.3] 言語:C
[4] 期限:2005年5月29日
[5] その他の制限: for を使うところまで一応習いました
まだまだド素人ですが教えていただけるとうれしいです。
>>43 #include<stdio.h>
int main(){
int i,j=0;
for(i=0;i<100;i+=7){
if(i%3 != 0){
printf("%d",i);
if(++j%5==0)printf("\n");
else printf(" ");
}
}
return 0;
}
>>43 数えた結果は出力しろとはかかれていないが一応出力してみた。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int ic;
int cnt = 0;
for (ic = 1; ic <= 100; ++ic) {
if ((ic % 2 == 0 || ic % 7 == 0) && ic % 3 != 0) {
++cnt;
printf("%d", ic);
putchar(cnt % 5 == 0 ? '\n' : ' ');
}
}
printf("\n%d\n", cnt);
return 0;
}
これは再帰で書きようがないだろうなぁ。
48 :
45:2005/05/24(火) 19:07:17
問題文思いっきり読み違えた
#include<stdio.h>
int main(){
int i,j=0;
for(i=1;i<=100;++i){
if((i%2==0 || i%7==0) && i%3!=0){
printf("%d",i);
if(++j%5==0)printf("\n");
else printf(" ");
}
}
return 0;
}
49 :
45:2005/05/24(火) 19:08:46
ていうか一番肝心なカウントするのを忘れてた。orz
>>41 スタックって小さいよ。ヒープとかの方がずっと大きい。
出題者もたぶん再帰を使って書くのは意図していないと思う。最大入力数に制限をつけているあたり。
それにC/C++では再帰はあまり使われないから、いざ使うとなるとみんな珍しがる。(んで異質だから叩くと)
たたきはせんが。
スタックサイズが環境依存だからなぁ。
でかい配列も関数内ではとりずらい。
(いや、マニュアル読めってのは当然だが)
別に珍しくはないと思うが...
簡単にクイックソートを実装したいときに使うし。
今回の場合、問題文からして配列を使う様に示唆されているのだから再起を使う必要性はない。
再起を使用して然るべき問題ならば誰も何も言いはせぬ。
>>47 #include <stdio.h>
void f(int i, int n) {
if (i == 300)
printf("\n%d\n", n);
else {
int j = i % 100;
if ((j % 2 || j % 7 == 6) && j % 3 != 2)
printf("%d%c", j + 1, ++n % 5 ? ' ' : '\n');
f(i + 3, n);
}
}
int main() {
f(0, 0);
return 0;
}
>>43 もう回答はでてるのでわかり易さを重視してみた。
#include <stdio.h>
#define NumMax (100)
#define LFN (5)
int main(){
char Num[NumMax+1];
int i,j=0;
for(i=0;i<=NumMax;i++){
Num[i]=0;
}
for(i=0;i<=NumMax;i +=2){
Num[i]=1;
}
for(i=0;i<=NumMax;i +=7){
Num[i]=1;
}
for(i=0;i<=NumMax;i +=3){
Num[i]=-1;
}
for(i=0;i<=NumMax;i++){
if(Num[i]==1){
printf("%3d ",i);
if(j % LFN == LFN-1){
printf("\n");
}
j++;
}
}
printf("\n");
return 0;
}
57 :
デフォルトの名無しさん:2005/05/25(水) 01:49:58
〔1〕授業単元
情報処理概論T
〔2〕問題文(含コード&リンク)
秒単位で表現された時間をよみこみ、時間、分、秒の単位に変換して
結果を出力するプログラムを作りなさい
3] 環境
[3.1] OS:Windows
[3.2] コンパイラ(バージョン):gcc
[3.3] 言語:C
[4] 期限:2005年5月30日まで
[5] その他の制限:whileを途中まで習いました
初歩的ですみません;どうぞよろしくお願いします。
>>57 その秒とは1970年1月1日00:00:00からの経過時間か?
よみこむってどこから?
60 :
59:2005/05/25(水) 02:04:00
間違って書き込みを…
#include <stdio.h>
int main(void) {
int t, h, m, s;
printf("input time:"); scanf("%d", &t);
h = t / 3600; t -= h * 3600;
m = t / 60; t -= m * 60;
s = t;
printf("%dh %dmin %dsec", h, m, s);
return 0;
}
61 :
デフォルトの名無しさん:2005/05/25(水) 09:00:42
[1] 授業単元: プログラミング言語
[2] 問題文:
適当な英単語がいくつか入っているchar型の2次元配列を作って、
それがローマ字であればそのままで、ローマ字以外であればNULLで埋めて別の配列に入れる。例えば…
word[0]="nagoya"→そのままout[0]へ
word[1]="this"→thiまではいいがsが適合しないので消してout[1]へ
word[2]="pen"→そのままout[2]へ
という具合です。よろしくお願いします。
[3] 環境
[3.1] OS:Linux
[3.2] コンパイラ:gcc
[3.3] 言語:C
[4] 期限:今週中
[5] その他の制限:ポインタ習ってません。
62 :
61:2005/05/25(水) 09:11:42
63 :
61:2005/05/25(水) 09:22:24
続けて申し訳ありません。
格納する際、英文字のままでなくローマ字規則に従って日本語化ってできますか?
できるならその方がありがたいです。
>>61 それ、真面目に考えるとかなりめんどいぞ。
・word[1]を消すのではなく、out[1]をナル文字で埋めればいいのかな?
・'の扱いはどうする?
・促音はどこまで許容?
・ポインタを習っていないと言うが、ポインタの概念なしに配列操作はできないのだが。
・例えばsprintf(), strcpy()などは使っていいのか悪いのか。
まぁ、真面目に解析するとかなに置き換える一歩手前まで作らなきゃならんからカナ化はできるだろうけど。
いずれにしても、ただの宿題じゃないだろ、それ。
65 :
61:2005/05/25(水) 09:40:44
・word[1]を消すのではなく、out[1]をナル文字で埋めればいいのかな?
そうです。wordを元にoutをいじっていくことになります。分かり辛く申し訳ないです。
・'の扱いはどうする?
う〜ん…ややこしいのでないことにしてください。
>>61の例文の範囲でお願いします。
・促音はどこまで許容?
ぎゃ(gya)は使っても、ゃ(xya)を単独でローマ字として使うことは一般的にありませんので、
ぁぃぅぇぉ等は省けます。
・ポインタを習っていないと言うが、ポインタの概念なしに配列操作はできないのだが。
関数を使うとして、入力配列も出力配列も関数に読み込むことで操作できませんか?
word[0][0]=out[0][0]で一文字ずつ読み込むとかで…
・例えばsprintf(), strcpy()などは使っていいのか悪いのか。
現知識では分かりませんが、stdio.h等に初めから入っている関数でしょうか?
それでしたらOKです。
宿題というか、実験の一部になります。とりあえず大学行ってきます。
もしお時間がありましたらどうぞよろしくお願いします。
いや、拗音じゃなくて促音をね……
元々余りなかったやる気がさっぱり失せた…
67 :
デフォルトの名無しさん:2005/05/25(水) 10:49:11
>>47 >>56 丁寧な解答ありがとうございました。
これからがんばって勉強します。
うーん。ポインタ使うなっちゅーのはツライのぉ。
/* ローマ字→カナ変換テーブル */
/* char *roma2kana_tb[][2]とかやりたいが・・・ */
char roma2kana_tab[][2][10] = {
/* ローマ字のつづりの長い順で書く */
{ { "gya", "ぎゃ" } },
{ { "ka", "か" } },
{ { "a", "あ" } },
};
/* ローマ→かな変換 ローマ字(in)からかな(out)へ。
文字列全部を変換できればゼロを、つづりがヘンなら非ゼロを返す。
outは十分な大きさを持っていること。効率は重視していない。
バグ:inが長さ0のとき、引数がNULLのときの対処はしていない。
*/
int roma2kana(char *in, char *out)
{
while (*in) {
int i;
for (i = 0; i < sizeof(roma2kana_tab) /sizeof(roma2kana_tab[0]); i++)
if (strncmp(in, roma2kana_tab[i][0], strlen(roma2kana_tab[i][0])) == 0)
goto FOUND;
return -1; /* 見つからなかった */
FOUND:
strcpy(out, roma2kana_tab[i][1]);
in += strlen(roma2kana_tab[i][0]); /* ここ、ポインタ使ってるよねぇ・・・えらい人たすけて */
out += strlen(roma2kana_tab[i][1]);
}
return 0;
}
大学の単位でポインタが分らないとか、もうネタの領域だろ。
教授が教えてくれるまで待っているつもりか?
自分で調べようとはしないのか?
高校生じゃねぇんだから、甘ったれるなと。
72 :
デフォルトの名無しさん:2005/05/25(水) 12:03:44
【質問テンプレ】
[1] 授業単元:シミュレーション
[2] 問題文(含コード&リンク):
二人のプレイヤーABが交互に四個ずつ将棋の駒を転がし、1000点を目指し競う。
表裏になれば1点、横になれば5点、縦になれば10点、逆立ちすれば20点の得点で
それぞれの確率は表40%、裏40%、横10%、縦6%、逆立ち4%である。
一回の勝負毎にどちらが勝ったかを表示させ何回で勝負がついたか、その時ABの得点はそれぞれいくらかも表示させる
[3] 環境
[3.1] OS:xp
[3.2] コンパイラ(バージョン):gcc
[3.3] 言語:C
[4] 期限:明日
お願いします。
73 :
デフォルトの名無しさん:2005/05/25(水) 12:09:42
[1] 授業単元:プログラミング基礎
[2] 問題文(含コード&リンク):
型tの二つの引数を交換するマクロswap(t,x,y)を定義しなさい。
このマクロはブロック構造を使い、swap(double,one,two)に対して,
以下のような出力が得られるものとする。
Cのコンパイラgccは-Eオプションを付けてソースファイルをコンパイルすると
プリプロセッサの処理までを行い、
結果を標準出力に出力する。
これを利用して正しく展開されることを確かめなさい。
{
double temp;
temp = one;
one = two;
two = temp;
}
[3] 環境
[3.1] OS:Linux
[3.2] コンパイラ(バージョン):gcc なのか。。。?
[3.3] 言語:C
[4] 期限:5月27日10時まで
>>73 #define swap(t, x, y) \
{\
t temp;\
temp = x;\
x = y;\
y = temp;\
}
/* 別にプリプロセッサの確認だけならmain作らんでもよかろ */
swap(double, one, two)
>>70 俺は61じゃないけど…大卒にコンプレックスでもあるのか?お前
78 :
76:2005/05/25(水) 12:54:51
ちょっとミスってた。
・#include <string.h>を追加
・mainの定義をint main(void)...に変更
でよろしく。
あー・・・大学出ても、できんやつは出来ん。
>>70 学ぶ気力などないわ。
80 :
デフォルトの名無しさん:2005/05/25(水) 13:05:57
【質問テンプレ】
[1] 授業単元:プログラミングT
[2] 問題文(含コード&リンク):逐次検索のプログラムを作りなさい。
[3] 環境
[3.1] OS:Windows XP
[3.2] コンパイラ(バージョン):Microsoft Visual C++ 6.0
[3.3] 言語:C
[4] 期限:2005年5月25日20:00まで
[5] その他の制限:下に自分が考えたプログラムとエラーメッセージを
載せますので、どこを直せばよいかお教えください。お願いします。
81 :
70:2005/05/25(水) 13:07:18
>>77 コンプレックスか・・・そうだな。あるな。
ちゃんと大学卒業してきてプログラムの単位まで取っている奴に
なんで typedef から教えなくちゃならんのかと・・・。
>>70なんて当たり前のことなのに
どうしてコンプレックスなんて単語が
でてくるんだろう…
>>981 >>984 >>986 >>実行形式をsender, receiver, reflectorにlnして実行。
>>sender, seceiverがtoki, reflectorがkenな。
実行形式をlnしてっどうゆうことですか?
プログラム2つ必要ではないのですか?
84 :
80:2005/05/25(水) 13:11:03
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define rnd() (1.0 / (RAND_MAX + 1.0)) * rand() * 10
#define X 7
#define DATA 100
#define NOT_FOUND -1
typedef int keytype;
int seqsrch2(keytype X, keytype a[ ], int m, int n);
void showdata(int a[ ], int size);
85 :
80:2005/05/25(水) 13:11:38
int main(void)
{
int i;
int d[DATA];
int y;
srand((unsigned) time(NULL));
for (i = 0; i < 5; i++)
{
d[i] = rnd();
}
printf("配列の中身:");
showdata(d, 5);
printf("探索対象:%d\n", X);
printf("探索結果:");
y = seqsrch2(X, d, 0, 6);
if (y != -1)
printf("%d は %d 番目にあります。\n", X, y + 1);
printf("%d はありません。\n", X);
}
86 :
80:2005/05/25(水) 13:12:10
int seqsrch2(keytype X, keytype a[ ], int m, int n)
{
if (m > n)
return NOT_FOUND;
a[n + 1] = X;
while (a[m] != X)
m++;
if (m <= n)
return m;
return NOT_FOUND;
}
void showdata(int a[ ], int size)
{
int i;
for (i = 0; i < size; i++)
{
printf("%d " , a[i]);
}
printf("\n\n");
}
87 :
80:2005/05/25(水) 13:12:47
D:\tikuji.c(11) : error C2143: 構文エラー : ')' が 'constant' の前に必要です。
D:\tikuji.c(11) : error C2143: 構文エラー : '{' が 'constant' の前に必要です。
D:\tikuji.c(11) : error C2059: 構文エラー : ''
D:\tikuji.c(11) : error C2059: 構文エラー : ')'
D:\tikuji.c(25) : warning C4244: '=' : 'double ' から 'int ' に変換しました。データが失われているかもしれません。
D:\tikuji.c(34) : warning C4013: 関数 'seqsrch2' は定義されていません。int 型の値を返す外部関数と見なします。
D:\tikuji.c(40) : error C2143: 構文エラー : ')' が 'constant' の前に必要です。
D:\tikuji.c(40) : error C2143: 構文エラー : '{' が 'constant' の前に必要です。
D:\tikuji.c(40) : error C2059: 構文エラー : ''
D:\tikuji.c(40) : error C2059: 構文エラー : ')'
どうかお願いします。
89 :
デフォルトの名無しさん:2005/05/25(水) 13:20:34
>>80 int seqsrch2(keytype X, keytype a[ ], int m, int n);
のXはマクロで既に定義されてあるので、変数としては使えない。
90 :
デフォルトの名無しさん:2005/05/25(水) 13:22:56
[1] 授業単元:プログラミング基礎
[2] 問題文(含コード&リンク):
>>73 上記の問題で定義したマクロは、引数にtempswap(double,temp,temp1)
に対しては正しいプログラムとはならない。
このような場合でも正しいプログラムに展開されるようにマクロの定義を
変更しなさい。(##を使用する。)
[3] 環境
[3.1] OS:Linux
[3.2] コンパイラ(バージョン):gcc ?
[3.3] 言語:C
[4] 期限:5月27日10時まで
/*
>>72 */
#include <stdio.h>
#include <stdlib.h>
/* [0,1)の乱数 */
double random(void) { return rand() / (MAX_RAND + 1.0); }
/* 確率に従い得点を求める */
int point(void) {double r = random(); return (r < 0.8) ? 1 : (r < 0.9) ? 5 : (r < 0.96) ? 10 : 20; }
/* なんか疲れてきた */
int main(void)
{
int score[2] = {0};
int player = 1;
do {
player ^= 1;
score[player] += point() + point() + point() + point();
} while (score[player] < 1000);
printf("%c の勝ち(A %d, B %d)\n", "AB"[player], score[0], score[1]);
return 0;
}
92 :
デフォルトの名無しさん:2005/05/25(水) 13:24:53
>>90 訂正
[1] 授業単元:プログラミング基礎
[2] 問題文(含コード&リンク):
>>73 上記の問題で定義したマクロは、引数にtempと言う変数が渡される
swap(double,temp,temp1)に対しては正しいプログラムとはならない。
このような場合でも正しいプログラムに展開されるようにマクロの定義を
変更しなさい。(##を使用する。)
[3] 環境
[3.1] OS:Linux
[3.2] コンパイラ(バージョン):gcc ?
[3.3] 言語:C
[4] 期限:5月27日10時まで
#define swap(t, x, y) do {t x##y; x##y = x; x = y; y = x##y} while (0)
[1] 授業単元:プログラミング1
[2] 問題文
クラスN人の試験の点数を配列grade〔 〕に
格納し、総和平均を求めよ。
さらに最高点、最低点を求められるようにせよ、
最高点の人の番号も出るようにせよ、
[3] 環境
[3.1] OS:UNIX FreeBSD
[3.2] コンパイラ(バージョン):gcc なのか。。。?
[3.3] 言語:C
[4] 期限:6月1日午後6時
配列を習ったときに出た問題なのですが・・・・
いまいちわかりません、よろしくお願いします。m( )m
95 :
デフォルトの名無しさん:2005/05/25(水) 13:36:02
96 :
80:2005/05/25(水) 13:39:26
>>89 様
ありがとうございます。
2つの「keytype X」を削除してコンパイルしましたら、
実行ファイルまで作れました。
しかし、すぐに「問題が発生したためtikuji.exeを終了します。」
と表示されるのですが、どういうことでしょうか?
なにかまずいことでもしてしまったのでしょうか?
教えてください。
>>93 あー。これではエラーがでるかswap(int, i, f)とかで。
まあいいか、だれか、直しておいて。
複数行でどう書くかは前に書いた方法参照。(めんどいのよ)
>>94 配列って、最初からデータ入ってます?
(個人的興味からだけれど・・・教科書おしえてください)
98 :
デフォルトの名無しさん:2005/05/25(水) 13:39:43
>>75 b.c:3: 文法エラー が '{' トークンの前にあります
b.c:5: `x' がここでは定義されていません (関数の中ではない)
b.c:5: 警告: データ定義が型や記憶クラスを持っていません
b.c:6: `y' がここでは定義されていません (関数の中ではない)
b.c:6: 警告: データ定義が型や記憶クラスを持っていません
b.c:7: 初期化子の要素が定数ではありません
b.c:7: 警告: データ定義が型や記憶クラスを持っていません
b.c:8: 文法エラー が '}' トークンの前にあります
?プリプロセッサ通すだけで、んなエラーでる?
>>98
100 :
デフォルトの名無しさん:2005/05/25(水) 13:44:09
いいえ
>>80 ドアホウ!keytype Xは関数の中で使ってるじゃないか。
マクロのXか変数のXとどっちか名前を変えろって
いってんだよ。
[1] 授業単元:プログラミング言語
[2] 問題文(含コード&リンク):
3] 環境
[3.1] OS:Win2000
[3.2] コンパイラ(バージョン):VC++
[3.3] 言語:C++
まず自分で以下のような入力ファイルを作成。
004 東京 20050524 00001 東京商店 15000
003 横浜 20050321 00002 横浜商店 20000
002 千葉 20050103 00001 東京商店 30000
004 東京 20050603 00003 関東商事 50000
.
.
.
.
左から、支点コード、支店名、販売日、販売先コード、販売先名、売上金額
ファイルの中身はソートされていない。
販売日と売上金額はint型、その他はchar型。
このファイルを読み込み、バブルソートを行い、新たに出力ファイルを
作成し、そのファイルにソートしたものを出力。
その際、mallocでメモリを確保すること。
入力ファイルを構造体と考えて、mallocでメモリを確保するらしいのですが
ポインタが良く分かっていないので、まったくできません。
どなたかお願いします。
>>97 自分でクラスの人数とそれぞれの点数を入力する形式みたいです。
教科書はないですね、講師が黒板に説明を延々と書いていく授業です。
104 :
デフォルトの名無しさん:2005/05/25(水) 13:50:03
>>99 結果を標準出力に出力しないといけないんですけど?
>>92 >>97 ほらよ
# define swap(type, x, y) \
do{ \
type temp ## x ## y = x; \
x = y; \
y = temp ## x ## y; \
}while(0) \
/**/
>>104 gcc -E でプリプロセッサ出力を得れば、後はコンパイルする必要ないんだろ?
107 :
デフォルトの名無しさん:2005/05/25(水) 14:06:31
[1] 授業単元:プログラミング基礎
[2] 問題文(含コード&リンク):
void itoa(int n, char s[])
{
int i, sign;
if ((sign = n) < 0)
n = -n;
i = 0;
do {
s[i++] = n % 10 + '\0';
} while ((n /= 10) > 0);
if (sign < 0)
s[i++] = '-';
s[i] = '\0';
reverse(s);
}
void reverse(char s[])
{int c, i, j;
for (i = 0, j = strlen(s) - 1; i < j; i++, j--) {
c = s[i];
s[i] = s[j];
s[j] = c;
}}
上記のitoaに変更を加え、符号無し整数nをb進数の文字表現に変更し、
sに格納する関数itob(n,s,b)を記述しなさい。bの値の範囲は2から36
までとし、10以上の数にはアルファベットを使用しなさい。
(数字とアルファベット26文字で36進数まで扱える)
[3] 環境
[3.1] OS:Linux
[3.2] コンパイラ(バージョン):gcc ?
[3.3] 言語:C
[4] 期限:5月27日10時まで
108 :
80:2005/05/25(水) 14:08:37
>>101 様
すみません。本当にドアホウです。
変数のほうのXをzに変えましたが、それでも出てきます。
どうしたらいいでしょうか?
int seqsrch2(keytype x, keytype a[ ], int m, int n)
{
・・・
}
は「C言語による最新アルゴリズム事典」に載っていたものを
使いました。
それで、探す数字を7にしたくてマクロで定義したのです。
訳も分からずプログラムを書いているドアホですみません。
109 :
デフォルトの名無しさん:2005/05/25(水) 14:09:20
[1] 授業単元:プログラミング演習
[2] 問題文:
ユーザーに 正の整数 n を入力してもらい、その階乗 n! を求めるプログラムを作成せよ。
階乗は、
n! = n * (n-1) * (n-2) * .... * 3 * 2 * 1
= 1 * 2 * 3 * 4 * ... * (n-1) * n
で定義される。 たとえば、n = 5 のときは 5 * 4 * 3 * 2 * 1 = 120 となる
[3] 環境
[3.1] OS:Linux
[3.2] コンパイラ(バージョン):cc
[3.3] 言語:C
[4] 期限:明日まで
[5] その他の制限:制御構造(繰り返し)まで習いました。
どなたかご教授お願いします。
>>107 > s[i++] = n % 10 + '\0';
は
> s[i++] = n % 10 + '0';
の間違いか?
112 :
デフォルトの名無しさん:2005/05/25(水) 14:11:58
>>75 >>106 {
t temp;
temp = x;
x = y;
y = temp;
}
としか出力されませんが?
{
double temp;
temp = one;
one = two;
two = temp;
}
と出力されて欲しいのですが
113 :
デフォルトの名無しさん:2005/05/25(水) 14:15:09
>>107 s[i] = '\0';
\はバックスラッシュです。
>>107 static const char scpcCaraTable[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
void itoa( int n, int b, char s[] )
{
int i, sign;
if ( ( sign = n ) < 0 ) n = -n;
i = 0;
do {
s[ i++ ] = scpcCaraTable[ n % b ];
} while ( ( n /= b ) > 0);
if ( sign < 0 ) s[ i++ ] = '-';
s[ i ] = '\0';
reverse( s );
}
115 :
デフォルトの名無しさん:2005/05/25(水) 14:23:25
>>91 どもです。でも
syogi-k.c:5: error: conflicting types for `random'
c:/language/djgpp/include/stdlib.h:121: error: previous declaration of `random
syogi-k.c: In function `random':
syogi-k.c:5: error: `MAX_RAND' undeclared (first use in this function)
syogi-k.c:5: error: (Each undeclared identifier is reported only once
syogi-k.c:5: error: for each function it appears in.)
なんかこんなエラーが出ました_no
116 :
デフォルトの名無しさん:2005/05/25(水) 14:27:29
>>114 ありがとうございます。
できればmainの書き方も教えてください。
>>91訂正。しかし、compileもせんと書くとボロボロですな。
/* [0,1)の乱数 */
double my_random(void) { return rand() / (RAND_MAX + 1.0); }
/* 確率に従い得点を求める */
int point(void) {double r = my_random(); return (r < 0.8) ? 1 : (r < 0.9) ? 5 : (r < 0.96) ? 10 : 20; }
>>116 #include <stdio.h>
#include <string.h>
void itoa( int n, int b, char s[] );
void reverse( char s[] );
static const char scpcCaraTable[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int main( void ) {
char iScore[ 40 ];
itoa( 10000000, 2, iScore );
printf( "%s\n", iScore );
return ( 0 );
}
void itoa( int n, int b, char s[] ) {
int i, sign;
if ( ( sign = n ) < 0 ) n = -n;
i = 0; do { s[ i++ ] = scpcCaraTable[ n % b ]; } while ( ( n /= b ) > 0);
if ( sign < 0 ) s[ i++ ] = '-';
s[ i ] = '\0'; reverse( s );
}
void reverse( char s[] ) {
int c, i, j;
for ( i = 0, j = strlen( s ) - 1; i < j; i++, j-- ) { c = s[ i ]; s[ i] = s[ j ]; s[ j ] = c; }
}
>>80 >84-86のソースで、>86の文だけ'X'を'x'とでもしてみろ。
>>73 >75を適当なファイル(仮にfoo.c)に保存し、gcc -Eを実行(先の例ではgcc -E foo.c)してみたか?
それでも>112のように出力されるのか?
>>107 直接宿題には関係ないが、>113は>110の質問の回答になってないぞ。
変なswapマクロだと思ったら、swap(int, a[0], a[1])とかはダメなのね。
出題者に減点。
123 :
デフォルトの名無しさん:2005/05/25(水) 15:20:39
>>118 あぁエラーなくいけました。ついでに
>>一回の勝負毎にどちらが勝ったかを表示させ何回で勝負がついたか
の部分はどこに何を追加すればいいんでしょうか…。
>>83 lnコマンドしらんのか? man lnして味噌。
あはは。
score[player] = ...;
の続きに、
if (player == 1) {
print1Turn(score);
}
とでもしておき、
void print1Turn(int * score)
{
printf("現時点で");
if (score[0] < score[1]) {
printf("Bがリード\n");
} else if (score[0] > score[1]) {
printf("Aがリード\n");
} else {
printf("両者タイ\n");
}
を追加すれば経過表示はできるだろ。
あーでも、最終ターンで同時に1000超えたらどうするんだろ。
まぁ頑張れw
>>123
>>127 thxです。少しだけ変えて何とか提出できる形になりました。
129 :
デフォルトの名無しさん:2005/05/25(水) 17:03:11
誰かRASP知ってる人いませんかぁ??
130 :
デフォルトの名無しさん:2005/05/25(水) 17:28:30
>>109 再帰をならってないなら、Fact2をだすとよいと思う。
#include <stdio.h>
unsigned int Fact(unsigned int n){
if(n==1) return 1;
return Fact(n-1)*n;
}
unsigned int Fact2(unsigned int n){
unsigned int i=0;
unsigned int val=1;
for(i=1;i<=n;i++){
val *= i;
}
return val;
}
int main(){
unsigned int val;
val=Fact2(5);
printf("%d",val);
return 0;
}
131 :
デフォルトの名無しさん:2005/05/25(水) 17:46:35
STLのlistは処理が重たいのでSTLのリストの簡易版のようなテンプレートリストクラスを作りました。
使用すると、
「外部参照3が未解決です」やメンバ関数に対して、未解決のシンボルが参照されました、というような
エラーが消えません。
ちなみに、
template <class data_t> class TList
を
/*template <class data_t>*/ class TList
にして、
data_t型のメンバを全部int型にして、テンプレートクラスではなく、int型にしか使えない
リストクラスとして使用すると期待通りの動きをします。
一体何が原因でリンクエラーが起こるのでしょうか?
>>94 #include <stdio.h>
#define N (10)
#define Max(a,b) ((a>b)? a:b)/*aとbのうち大きい方を返すマクロ。3項演算子*/
#define Min(a,b) ((a>b)? b:a)/*aとbのうち小さい方を返すマクロ*/
int main(){
int grade[N];
int i=0,top=0,min,max,ave,all;
printf("input... grade[%d]\n",N);
for(i=0;i<N;i++){
scanf("%d",&grade[i]);
}
puts("input end");
min= grade[0];/*最初の値を閾値とする。*/
max= grade[0];/*同上*/
all=0;
for(i=0;i<N;i++){
if(grade[top]<grade[i]){/*topの位置とiの位置とで中身の大きい方の位置をtopに記録*/
top=i;
}
min=Min(min,grade[i]);/*最小を記録*/
max=Max(max,grade[i]);/*最大を記録*/
all+=grade[i];/*総和を出す。*/
}
ave = all / N;/*平均値を出す。*/
printf("最大:%d\n最小:%d\n合計:%d\n平均%d\n最高値は%d番目でした。\n",max,min,all,ave,top+1);
return 0;
}
>>131 VCしか知らないが、
ヘッダとソースを分けるとそういうエラーに悩まされることがある。
ヘッダにじか書きすると消えると思う。
STLのlistって重たいの?
135 :
デフォルトの名無しさん:2005/05/25(水) 18:16:22
>>132 ありがとう!
既に解決してたけど、感謝するよ!
>>134 重たいと思う。VCとかでステップ実行すればわかるけど、すっごい深いところまで潜らないとデータにアクセスできなかったりする。
138 :
デフォルトの名無しさん:2005/05/25(水) 18:30:16
[1] 授業単元:コンピュータ演習
[2] 問題文(含コード&リンク):浮動小数点型データを5個入力して、最大値、最小値、平均を求めよ。
[3] 環境
[3.1] OS:Windows XP
[3.2] コンパイラ(バージョン):
[3.3] 言語:C
[4] 期限:2005年05月26日1:30まで
↑マルチはスルーで。
げ、多桁演算するのに一桁ずつリストに入れているのかよ。
ぜってぇメンテナンスしたくないコードだな。
142 :
デフォルトの名無しさん:2005/05/25(水) 19:10:02
>>140 コンパイルは通していない。
筋はあってると思うのであとは旨くやってくれ。
/*グローバル変数。*/
static Digit *NotUse;
void freenum(Digit *in){/*渡されるデータの構造はリングリストを前提にしている。*/
if(NotUse == NULL){
NotUse=in;
return;
}
NotUse->prev->next = in->next;
in->next->prev = NotUse->prev;
NotUse->prev=in;
in->next = Notuse;
return;
}
Digit *newdigit(void){
Digit *a;
if(NotUse != NULL){
a=NotUse;
if(NotUse->next != NotUse){
NotUse->next=NotUse->prev->next;
NotUse->prev=NotUse->next->prev;
}
}else{ a=(Digit *)malloc(sizeof(Digit)); }
if(a==NULL)
{
fprintf(stderr, "メモリ不足\n");
exit(1);
}
return a;
}
143 :
デフォルトの名無しさん:2005/05/25(水) 19:14:29
145 :
デフォルトの名無しさん:2005/05/25(水) 19:26:14
[1] 授業単元: プログラミング基礎
[2] 問題文(含コード&リンク):自分の姓名(例”Tarou Koudai”)を表示せよ。
ただし、配列a[]を用いて、これを文字列で初期化し、
1文字づつ出力せよ。さらにポインタpを用いて、同様に1文字づつ出力せよ。
[3] 環境
[3.1] OS:Windows XP
[3.2] コンパイラ(バージョン):
[3.3] 言語:C
[4] 期限:5月26日 A.M3:00まで できれば早めにお願いします。
レベルは低いと思いますがお願いします。
>>145 #include <stdio.h>
#include <string.h>
int main()
{
const char a[] = "hoge";
const char *p = a;
int i, length = strlen(a);
for (int i = 0; i < length; i++)
putchar(a[i]);
putchar('\n');
while (*p++)
putchar(*p);
return 0;
}
148 :
デフォルトの名無しさん:2005/05/25(水) 19:37:02
>>147 やばい。
課題2問出た?
>>146 >while (*p++)
なのに
>for (int i = 0; i < length; i++)
[1] 授業単元:情報処理実習1
[2] 問題文(含コード&リンク):
double型の変数をchar型の変数[文字列]に変更する関数について考察し、
可能ならば関数[void dtostr(double d,char str[])]を作成せよ
[3] 環境
[3.1] OS:WindowsXP
[3.2] コンパイラ(バージョン):VC++
[3.3] 言語:C
[4] 期限:2005年5月31日まで
[5] その他の制限:ポインタ、標準関数使用不可。
可能不可能だけでも、お願いします。
>>150 >[2] 問題文(含コード&リンク):
>double型の変数をchar型の変数[文字列]に変更する関数について考察し、
>可能ならば関数[void dtostr(double d,char str[])]を作成せよ
不可能
そこは問題じゃないだろ
考察
たとえば
double var;
ならば「double型の変数」とはvarを指す。
この場合「char型の変数[文字列]に変更」では"var"に変更することを指し、
「void dtostr(double d,char str[])」という関数の作成は不可能と判断する。
154 :
長いんで分割します:2005/05/25(水) 20:14:04
[1] 授業単元:プログラム演習
[2] 問題文(含コード&リンク):
整数値を扱うための線形連結リストにおいて、セルの挿入、削除を行う関数を定義し
それを利用して標準入力から入力されたデータが小さい順に並ぶようにリストにセルを挿入し、
完成したリストの内容を標準出力に出力せよ。実行結果として、以下のデータを入力した結果を示すこと。
4 1 7 9 0 6 3 5 8 2
[3] 環境
[3.1] OS:WindowsXP
[3.2] コンパイラ(バージョン):gcc
[3.3] 言語:C
[4] 期限:2005年5月27日まで
[5] その他の制限:セルの定義、挿入、削除の関数は以下のものを利用すること。
/*セルの定義*/
struct cell {
int value;
struct cell *next;
};
155 :
150:2005/05/25(水) 20:14:56
問題の意図するところは、
double型の変数dとcharの文字列strを引数とし、
dの値を文字列に変換して、strに代入する関数を作りなさい。
です。
授業中にunsigned int版をやったとき、
そういう関数が正解だったので。
わかりにくく書いてすいません。
156 :
& ◆D71jwTqGtw :2005/05/25(水) 20:15:59
/*挿入関数*/
void insert_cell(struct cell **pointer, int new_value)
{
struct cell *new_cell;
new_cell = (struct cell *)malloc(sizeof(struct cell));
new_cell->value = new_value;
new_cell->next = *pointer;
*pointer = new_cell;
}
/*削除関数*/
void delete_cell(struct cell **pointer)
{
struct cell *target;
target = *pointer;
*pointer = target->next;
free((void *)target);
}
入力する度に昇順になるよう挿入するらしいですがポインタで混乱しまくってます。
よろしくお願いします。
void dtostr(double d,char str[]){ sprintf( str, "%f", d ); }
>>157 [5] その他の制限:ポインタ、標準関数使用不可。
>>155 考察
俺には不可能と判断する。
でいいじゃん。
>>150 関数の引数の char str[] はポインタなので制限によりこの関数は作成不可能。
ただ単に作成せよではなく、可能ならば作成せよって、ずいぶん親切な
問題だね。
163 :
80:2005/05/25(水) 22:04:14
>>121 様
ありがとうございます。
ご指摘通り直したら、ちゃんと問題なくできました。
どうもありがとうございました。
ドアホなので、今から樹海に行きます。
164 :
150:2005/05/25(水) 22:05:17
>>160 ポインタは習ってないから使えないけど
この使い方はありということでお願いします。
>>161 宿題では、int型からchar型も出されて、こっちは必須で、自力でといたんですが、
double型は点数欲しければ解けという感じです。
>>136 重たいと言い切る根拠が勘かよ。
キミが思ってるより、コンパイラは頭いいよ。
人に聞いてまで点数ほしいのか。
点数が何だ、そんなことのために君は自分の倫理を貶めたいのか。
必須問題が自力で解けたんなら十分じゃないか。
それは学校の点数なんかよりはるかに価値のあることだぞ。
とか言ってみる。
倍精度浮動小数点で検索してがんばれ。
>>162 こんな感じ。
void freenum(Digit *in) {
Digit *p, *next;
for (p = in; p; p = next) {
next = p->next;
p->next = NotUse;
NotUse = p;
}
}
Digit *newdigit(void) {
Digit *a = NotUse;
if (a) {
NotUse = a->next;
}
else {
a = (Digit *)malloc(sizeof(Digit));
if (a == NULL) {
fprintf(stderr, "メモリ不足\n");
exit(1);
}
}
return a;
}
>>166 だがそれは建前だからなぁ。
いくらそんなこと言ったところで、評価は点数で決まる。
【質問テンプレ】
[1] 授業単元:C言語
[2] 問題文
[3] 環境
[3.1] OS:Windows XP
[3.2] コンパイラ(バージョン):Microsoft Visual C++
[3.3] 言語:C
[4] 期限:2005年5月26日まで
[5] 問題文は下に書きます
>>169 気張るなぁ・・・漏れは単位もらえるだけでいいや。
172 :
170:2005/05/25(水) 22:35:40
#include <stdio.h>
#define NONBLANK 'a'
int main()
{
int c, lastc;
lastc = NONBLANK;
while ((c = getchar()) != EOF){
if(c != ' ')
putchar(c);
else if(lastc != ' ')
putchar(c);
lastc = c;
}
return 0;
}
問題 連続で入力されたブランクが何故1つに置き換えられたか説明してください?
説明してください?
>>172 回答 連続で入力されたブランクを1つに置き換えるプログラムだから?
c □■■■□□□□■■■■
lastc a □■■■□□□□■■■
>176,168
ご回答ありがとうございます。
頂いたアドバイスを元に理解に勤めたいと思います。
>>173 フラグ変数であるlastcに空白文字が入っていない時に限り一文字空白を表示するから。
cに空白文字が代入されたとき、されないとき等しくlastcにバックアップを書き込んでいるため。
あと、cに空白文字が入ったときは描画をスキップしているので空白を描画できるソース中のポジションは1個しかない。
まとまりないな。
179 :
170:2005/05/25(水) 23:08:49
180 :
工大花子:2005/05/25(水) 23:36:58
1] 授業単元: コンピュータ演習
[2] 問題文(含コード&リンク): 不動小数点型データを5個入力して、最大値、平均、最小値を求めよ。
[3] 環境
[3.1] OS:Windowsxp
[3.2] コンパイラ(バージョン):
[3.3] 言語:C
[4] 期限:2005年5月26日7:00まで
[5] その他の制限:ヨロシクお願いします。
>>180 残念ながら私の環境では小数点が浮き動く型しか御座いませんのでお力にはなれません
182 :
工大花子:2005/05/25(水) 23:48:45
>>150 ちょっとやってみたけど思いのほかめんどい。
浮動小数点数の特定の桁だけ抜き出すのがなかなかうまくいかない。
しばし待たれよ。
184 :
デフォルトの名無しさん:2005/05/25(水) 23:51:07
>180
不動小数点は固定小数点と意訳せずに不動小数点と解釈しましたw
まあ、つっこみはエロイ人よろしく
#include <stdio.h>
int main()
{
int i ;
double v ;
double sum, max, min ;
sum = 0.0 ;
scanf( "%lf", &v ) ;
sum += v ;
max = min = v ;
for( i = 1 ; i < 5 ; i++ ){
scanf( "%lf", &v ) ;
sum += v ;
if( max < v ) max = v ;
if( min > v ) min = v ;
}
printf( "max=%lf,avr=%lf,min=%lf\n", max, sum / 5, min ) ;
return 0;
}
185 :
デフォルトの名無しさん:2005/05/25(水) 23:52:46
>>184 X 不動小数点は固定小数点と意訳せずに不動小数点と解釈しましたw
○ 不動小数点は固定小数点と意訳せずに浮動小数点と解釈しましたw
orz...
186 :
工大花子:2005/05/25(水) 23:53:01
>>184 本当に助かりました。ありがとうございます。
187 :
デフォルトの名無しさん:2005/05/26(木) 00:11:06
>150
過去レスで似たようなのがあったよ。
convSyouで出力先をchar[]に変えればいいんじゃない
#include <stdio.h>
#include <string.h>
void convSei( int i ){
int mask = 0x40000000 ;
for( ; mask > 0 ; mask /= 2 ){
if( ( mask <= i ) ) putchar( ( mask & i ) ? '1' : '0' ) ;
}
}
void convSyou( double d ){
putchar( '.' ) ;
int i ;
d -= (int)d;
for( i = 0 ; i < 5 ; i++ ){
d *= 2 ;
putchar( ( (int)d & 1 ) ? '1' : '0' ) ;
if( d - (int)d <= 0.0 ) break ;
}
}
int main( int argc, char* argv[] ){
double d ;
sscanf( argv[1], "%lf", &d ) ;
convSei( (int)d ) ;
convSyou( d ) ;
return 0 ;
}
>>187 ポインタを使わずに、どうやってchar str[]に入れるかが問題
char str[]だけは許されるらしいので
それを、どう上手く解釈してやるかが問題を解くポイントだと思う
>>187 元の問題には書かれていないが、10進数にするんじゃなかろうか?
そのコードはパッと見2進表示っぽいし、正の小数部分にしか対応してない。
いきなりintへのキャストが入っているのでintに入りきらない値を渡したら変な結果になりそう。
どうしても誤差が出るなぁ・・・。
intにキャストして整数部分を取って出力して...
後は10掛けながらintにキャストして整数部分を取って出力して...の繰り返し
これでできると思うけど、すんげえダセえし効率悪そうだな。
でも実数の二進表現って(まあ大抵IEEEだろうが)環境依存だしなあ
dat落ちして質問した分が見れなくなってしまったので
2と3の回答をしてくださった分を教えてください。
194 :
192:2005/05/26(木) 01:34:58
>>193 助かりました。ありがとうございました。
>>191 二進表現ってことは規定されてるんだっけ?
まー。専門教育を受けても、その道に進むとは限らんし。
200 :
150:2005/05/26(木) 06:47:12
考えてくれた方、ありがとうございます。
>188
str[i]='0'とかで入れることはできます。
>189,191
一応、10進表示です。
>199
ありがとうございます。、これを元に自分も頑張ってみます。
201 :
デフォルトの名無しさん:2005/05/26(木) 08:14:05
標準出力に出力って何のことですか?
>>144さん
ありがとうございます。
memcpyを使わないで解く方法はありませんでしょうか?
>>165 >>136の説明のどこら辺が勘なのか、頭の悪い俺に教えてくれるかな?
ちなみに、増減する敵キャラlistで管理してループさせたりすると、確実に重いぞ。
それは経験済みだ。
>>205 じゃあ聞くが、list以外にどんなコンテナを使ったら軽かったんだ?
この問いに答えられないようじゃ、お前さんの妄想と言われても仕方ないな。
>>205 自作リストだ。最初の質問の流れから言って、自作を引き合いに出すのはナシじゃないだろう?
>>207 ケッ。脳内自作かよ。せいぜいヲナニーしてろってこった。
209 :
デフォルトの名無しさん:2005/05/26(木) 14:42:39
文字を入力し、入力された文字が数字ならば、
それまでに入力された数値を総和を出力するプログラム
main()は1文字を入力させて関数count()に渡す
count()は"?"が渡された場合には0、それ以外には1を返し
main()ではその返り値が0の場合に処理を終了させる
数字のカウントと出力はcountで行う
yorosiku
>>205 減らすときは線形検索しなきゃいけないからちょっと重いが、
追加は先頭または末尾につけるだけなのでそんなに重くないはず。(末尾はそこまで移動させのがちょっとおもいかな。
独自実装なら現在指している場所に挿入とかも可能だし。
これはSTLに限らずそうだとおもうんだが。
コンテナの選択を誤ったってことじゃないだろうか。
>>209 >yorosiku
イヤダ。
テンプレよんでくれ。
>>209 #include <iostream>
#include <iterator>
#include <algorithm>
#include <functional>
#include <cctype>
using namespace std;
namespace kadai {
int count(char ch)
{ static int p;return ch=='?'?0:isdigit(ch)?!!(cout<<(p+=ch-'0')<<endl):1;}
};
int main()
{
find_if(istream_iterator<char>(cin), istream_iterator<char>(),
not1(ptr_fun(kadai::count)));
}
俺って優しいよな。
213 :
209:2005/05/26(木) 15:32:08
214 :
109:2005/05/26(木) 15:47:40
>>111 >>130 レス遅くなってすいません。
ってか教えてもらうまでもなく、自分でよく考えたら作れました。
どうもありがとうございました。
215 :
デフォルトの名無しさん:2005/05/26(木) 16:11:05
[1]授業単元
プログラミング言語
[2]問題文(含コード&リンク)
5次式の任意の係数をキーボードより入力し,
F(x)= 0.0 となる x の値を求めよ。
入力した任意の係数及び処理した結果は,
保存ファイルへ出力のこと。A=0 のとき終了,
それ以外は,繰り返しとする。
[3] 環境
[3.1] OS:Windows
[3.2] コンパイラ(バージョン):gcc
[3.3] 言語:C
[4] 期限:2005年5月30日まで
[5] その他の制限:while,for,ifまでは一応なりました。
どうかよろしくお願いします。
>一応なりました。
〔1〕授業単元 C言語
〔2〕問題文(含コード&リンク)
入力した文字列(最大20文字)を一度別の関数にうつし、そこで表示せよ。
そして、その文字のa〜z、0〜9の数字の個数を表示せよ。
例 abd2 と打ったら
abd2 ←この表示は別の関数にうつし、そこでpurintfした物
a=1
b=1
c=0
e=0
・
・
・
l=0
2=1
・
・
3] 環境
[3.1] OS:Windows
[3.2] コンパイラ(バージョン):gcc
[3.3] 言語:C
[4] 期限:5月27日
[5] その他の制限:main以外の関数を自分で作れるという事まで習いました。どのような手を使って解いてもいいと言われました。
情報科に入ったのはいいですけど、女子一人のため周りに相談できずC言語厳しいです(´・ω・`)ショボーン
一番最初の形式はわかるのですが、カウントしていく&表示するプログラムがわからないです。
218 :
デフォルトの名無しさん:2005/05/26(木) 17:46:46
>>217 要カスタマイズ。
ここでは女子とか言われても対応できないので、早く知人ができるといいね。
#include <stdio.h>
#define DATAMAX (20)
void output(char *data){/*for 7BitAscii*/
char character[128];
int i;
for(i=0;i<128;i++){
character[i]=0;
}
while(* data ) character[* data++]++;/* 添え字の*の横の空白は消しちゃだめ。*/
for(i=0;i<128;i++){
if(i% 5==4){
printf("\n");
}
printf("%d:[%c]:%d ",i,i,character[i]);/*表示部*/
}
printf("\n");
}
int main(){
char buf[DATAMAX+1];
fgets(buf,DATAMAX+1,stdin);
buf[DATAMAX]='\0';
output(buf);
}
なるほど。
その手(女性と称する)があるのか!
テンプレ追加案。
・ここにいる回答者はプログラムが得意であって他の分野に精通しているかはランダムです。
この一文入れてほしいね。
>>215 数学がわからない者に5次式と漠然といわれても理解できないです。
さらにぐぐるさんが教えてくれないようなのは絶望的。
式プリーズ。式プリーズ。
もしくは参考になるページを・・・。
以上広告の裏でした。
>>219 人によっては優先順位上がるかもね。
でもここで自称女性がいてもなんもしてやれないし。
あまり意味があるようには思えないが。
Yes!ただ書くのみ。
>>218さん
すいません、ありがとうございました。
自宅にはC言語のプログラムがないので、明日早朝に学校に行って試してみます。
正直、後半部のプログラムがさっぱりわからないので今日参考書片手に勉強しようと思います。
教科書も先生もvoid main(void)とやっていたのですが、ここのテンプレ見て勉強になりました。
これから色々と勉強していきます(`・ω・´)シャキーン
>>221 5次以上の方程式には代数的な解の公式が存在しないとのこと
近似解を出せってことなのだろうか…?
>>218 >fgets(buf,DATAMAX+1,stdin);
>buf[DATAMAX]='\0';
常套句なんだからもっと自然に書こうよ。つーか、buf[DATAMAX]はないだろ。
--
char * p;
fgets(buf, sizeof(buf), stdin);
/* 末尾の改行を取り除く処理 */
p = strchr(buf, '\n');
if (p) {
* p = '\0';
}
--
それにしても、なんで空白を消しちゃいけないんだろ。
>>225 y=(x^5*a)+(x^4*b)+(x^3*c)+(x^2*d)+(x*e)+f;
こんな式でいいのか?
もう数学なんて数年やってないんでな、不備はゆるしてくれ。
( ^記号は察してくれ。汗。)
>>224 わかり難いのは小手先のテクニックだけで、
それほど難度があるソースではないので、
がんばって解析してください。
>>227 いやね演算の優先順位にじしんがなかったんだよ。
それだけだ。汗。
>>231 うへ。勉強になった。
ドンドン怪しくなってきたな。
>>215 こんな感じか?
#include <float.h>
#include <math.h>
#include <stdio.h>
double solve(double a[], double initial_x = 0) {
double old_x = initial_x, x = old_x;
do {
old_x = x;
x = (-a[0] + old_x * old_x * (a[2] + old_x * (2 * a[3] + old_x * (3 * a[4] + 4 * old_x * a[5])))) / (a[1] + old_x * (2 * a[2] + old_x * (3 * a[3] + old_x * (4 * a[4] + 5 * old_x * a[5]))));
} while (abs(x - old_x) > DBL_EPSILON);
return x;
}
int main(void) {
FILE* fp = fopen("result", "w");
double initial_x, a[6];
int i;
for (; ; ) {
for (i = 0; i <= 5; i++) {
printf("input coefficient of x^%d:", i);
scanf("%lf", a + i);
}
if (a[5] == 0) break;
printf("input initial value:");
scanf("%lf", &initial_x);
fprintf(fp, "coefficient list:%f %f %f %f %f %f\nresult:%f\n", a[0], a[1], a[2], a[3], a[4], a[5], solve(a, initial_x));
}
fclose(fp);
return 0;
}
234 :
grass:2005/05/26(木) 18:48:13
>>225 五次式ですがこんな関数で答えだせます。
double proossess()
{
double x = 0.0; double y;
while( (y=calc(x))==0 ){ x += y/delta(x); }
return(y);
}
calc(x) は 与えられた 関数f のf(x)を求めます。
delta(x) は 与えられた 関数fの導関数で f'(x)を求めます。
たしかニュートン法っていうアルゴリズムだったと思います。
注意)
発散するような関数には使えません
f=tan(x)とか
>>226 ありがとうございます。お店で買わない限り無理かと思ってた・・・。
これで自宅学習できます(`・ω・´)シャキーン
>>227 >の部分のをーー からーーに置き換えた方がいいって事なのかな?
それにしても、配列やって関数やってなんでこんな課題出されたんだろ・・・。
知らない書き方ばっかりだし、今日は徹夜の予感ヽ(´Д`;)ノ
>>235 修正版。
#include <stdio.h>
#include <string.h>
#define DATAMAX (20)
void output(char *data){/*for 7BitAscii*/
char character[128];
int i;
printf("Input:[%s]\n",data);
for(i=0;i<128;i++){
character[i]=0;
}
while(*data ) character[*data++]++;
for(i=0;i<128;i++){
if(i% 5==4){
printf("\n");
}
printf("%d:[%c]:%d ",i,i,character[i]);/*表示部*/
}
printf("\n");
}
int main(){
char buf[DATAMAX+1];
char *p;
fgets(buf,DATAMAX+1,stdin);
/*buf[DATAMAX]='\0';*/
p=strchr(buf,'\n');
if(p) *p='\0';
output(buf);
return 0;
}
[1] 授業単元:プログラミング
[2] 問題文:
人数nを読み込んだあと、配列に身長のデータを読み込んでいき、
入力された身長を10cmごとにわけたヒストグラムを作成するプログラム。
<実行例>
150<=x<160 : *** 3名
160<=x<170 : ***** 5名
.
.
.
190<=x<200 : * 1名
[3] 環境
[3.1] OS:Linux
[3.2] コンパイラ(バージョン):cc
[3.3] 言語:C
[4] 期限:今日からだいたい1週間。
配列がいまいちわからないのでお願いします。
[1] 授業単元:プログラミング
[2] 問題文:
人数nを読み込んだあと、配列に身長のデータを読み込んでいき、
入力された身長を10cmごとにわけたヒストグラムを作成するプログラム。
<実行例>
150<=x<160 : *** 3名
160<=x<170 : ***** 5名
.
.
.
190<=x<200 : * 1名
[3] 環境
[3.1] OS:Linux
[3.2] コンパイラ(バージョン):cc
[3.3] 言語:C
[4] 期限:今日からだいたい1週間。
配列がいまいちわからないのでお願いします。
239 :
grass:234:2005/05/26(木) 18:59:18
すいません。挨拶忘れてました。
初めて書き込む grass と申すものです。
以後お見知りおきを
240 :
grass:234:2005/05/26(木) 19:04:49
>>238 具体的な答えでなくてすいません
10cmごとに区分けするのなら身長のデータを読み込む度に
身長/10 を添え字にした配列の中身をインクリメントすればカウントできます。
表示部の*は
void print_bar(int i)
{
while(i){
printf("*");
i--;
}
}
で大丈夫だと思います。
バー表示後の改行を忘れずに。
>>215 ”任意の係数をキーボードより入力”
ってどんな入力方法なんだ?
>>239 挨拶なんて別にいいから流れを読もうね。
243 :
grass:234:2005/05/26(木) 19:16:52
>>238 キーボードからデータを取り込むとしてデータ読み込み部を書きます。
double counter[20];
char buffer[16];
void read_and_prossess(int n)
{
int i;
double tall;
/* counter 初期化 */
for(i = 0;i < 20;i++){ counter[i] = 0; }
for(i = 0;i < n;i++){
gets(buffer);
tall = atof(buffer);
counter[(int)tall /10] ++;
}
}
これで配列counterにそれぞれの範囲内にいる人数が格納されます。
counter[i]には i*10<=身長<(i+1)*10 の人数が入ります。
ただしこの関数は身長200以上を入れると暴走する可能性のある不完全な物です。
>>242 はい、すみません。
244 :
デフォルトの名無しさん:2005/05/26(木) 19:35:05
>>237-238 #include <stdio.h>
PutSter(int n){
while(n){
printf("*");
n--;
}
}
int main(){
int N,i,k;
int data[30];
puts("Input N...");
scanf("%d",&N);
for(i=0;i<30;i++)data[i]=0;
for(i=0;i<N;i++){
puts("Input height...");
scanf("%d",&k);
k= k/10;
if(k<0 || k>=30){
puts("invalid data");
i--;
continue;
}
data[k]++;
}
for(i = 0;i<30;i++){
printf("%d-%d:",i*10,(i+1)*10-1);
PutSter(data[i]);
printf("\n");
}
return 0;
}
>>238 #include <stdio.h>
#include <stdlib.h>
int main(){
int i, j, c, n, imin, imax;
double *height, tmp, max, min;
scanf("%d", &n);
height = (double *)malloc(sizeof(double)*n);
for(i = 0; i < n; i++) scanf("%lf", &height[i]);
/* ぶくぶくソート */
for(i = 0; i < n-1; i++){
for(j = n-1; j > i ;j--){
if(height[j] < height[j-1]){
tmp = height[j]; height[j] = height[j-1]; height[j-1] = tmp;
}
}
}
min = height[0]; max = height[n-1]; imin = (int)min / 10 * 10; imax = (int)max / 10 * 10;
j = 0;
for(i = imin; i <= imax; i+=10){
printf("%d <=x< %d : ", i, i+10); c = 0;
while(j < n && height[j] < i+10){
printf("*"); j++; c++;
}
printf(" %d名\n", c);
}
return 0;
}
246 :
デフォルトの名無しさん:2005/05/26(木) 20:14:04
[1] 授業単元: プログラミング
[2] 問題文(含コード&リンク):文字列strと一致するファイルあるいは
ディレクトリがカレントディレクトリにあれば1を返し、なければ0を返す関数
int schfile(char *str)を作成せよ。
[3] 環境
[3.1] OS:Free BSD
[3.2] コンパイラ(バージョン): cc
[3.3] 言語:C
[4] 期限:できれば今すぐに
[5] その他の制限:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int schfile(char *str){
から書き出してください。
お願いします。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int schfile(char *str){return rand()%2;}
>>246 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
int schfile(char *str){
DIR *fp;
struct dirent *p;
int result = 0;
fp = opendir( "." );
while( ( p=readdir(fp) )!=NULL ){
if( strcmp( str, p->d_name ) ) continue;
result = 1;
break;
}
closedir(fp );
return result;
}
int main( int argc, char *argv[] )
{
printf( "result = %d\n", schfile( argv[1] ) );
return 0;
}
>>246 OSの違いを吸収できなかった。
ファイルあるかどうかだけなら簡単なんだけどね。
250 :
249:2005/05/26(木) 20:56:34
あれ?できてる??
>>248 POSIXか。
ANSI-Cのほうしかしらなかった。
252 :
246:2005/05/26(木) 21:55:39
>>249 dirent.hを使わずに出来ませんか?
>>252 リードオンリでfopenできればファイルかディレクトリがある。
254 :
デフォルトの名無しさん:2005/05/26(木) 22:23:14
>>252 じゃ、こうしろ
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int schfile(char *str){
#include <dirent.h>
DIR *fp;
>>246 ヘッダから推測すると、system(3)を使うような気がする。
257 :
初心者:2005/05/26(木) 22:56:52
学校の数値解析という授業でy=sin(x)を微分するプログラムをc言語で作れという宿題が出ました。はっきりいってまったくわからなくてこまってます。ぜひお教えください。
>>257 y'=cos(x) とかそういうことではないよな?
259 :
初心者:2005/05/26(木) 23:07:55
微分方程式y'=cos(x)を離散化して逐次計算式を用いてプログラムを作れというものでした。
説明不足で申し訳ありません。
y''=-sin(x)
書き込みの時間見るとマルチです。
527 名前:初心者 :2005/05/26(木) 22:52:39
学校の数値解析という授業でy=sin(x)を微分するプログラムを作れという宿題が出ました。はっきりいってまったくわからなくてこまってます。ぜひお教えください。
528 名前:デフォルトの名無しさん :2005/05/26(木) 23:01:19
>>527 数値的な微分でいいのか解析的な微分が必要なのかくらいは書いてくれ。
そんだけの情報じゃ私たちも全くわからなくて困ります。
529 名前:初心者 :2005/05/26(木) 23:05:06
申し訳ありませんでした。
問題は数値的な微分です。
逐次計算式を作って計算するプログラムを作れといわれました。
530 名前:デフォルトの名無しさん :2005/05/26(木) 23:05:55
>>527 宿題スレに逝け
>>259 こういうことかね?
#include <stdio.h>
#include <math.h>
#define DELTA 0.001
int main() {
double x;
for (x = -1.0; x < 1.0; x += DELTA)
printf("sin'(%f)=%f\n", x, (sin(x + DELTA) - sin(x)) / DELTA);
return 0;
}
>>253 権限がないとファイルがあっても開けない
【質問テンプレ】
[1] 授業単元: プログラミング実習
[2] 問題文(含コード&リンク):
仲の悪いaとbが映画館で出会ってしまい、空席が5席ある。
それぞれの関の番号とx,y座標は下の表のとおりである。
このなかからaとbの二人が座るべきもっとも離れた2つの座席a,bを見つけなさい
座席番号 x座標 y座標
1 1,1 5,2
5 3,4 1,6
10 2,3 2,6
15 6,4 5,7
16 7,6 7,8
[3] 環境
[3.1] OS:Unix
[3.2] コンパイラ(バージョン):知らない(´・ω・`)
[3.3] 言語:C
[4] 期限:今日のお昼過ぎOTL
[5] その他の制限:まだ5,6回の授業しかやってませんので初歩的なことしかやってません。けど漏れはぜんぜんわからない・・・
いざやろうと思ったらぜんぜんわからないです。時間ないけど、誰かお願い・・・
>>265 丸投げならいいけど、やる気があるなら「ぜんぜんわからない」ではなくちっとは考えてみよう。
例えば、二点間の距離の求め方は知ってるよな?
5点から2点の組み合わせを全部生成して、その距離を求めて最大のものを探せばいい。
#オプションでaとbが最も近い座席を考えてもいいね。
>>265 空席番号1にX座標が1,1で、Y座標が5,2ってどういうこと?
小数点?座標に小数点使うのもアレげなんだが。
よくわかんないんだが、
(ax-bx)*(ax-bx)+(ay-by)*(ay-by)の一番大きいのを求めて
その座標番号の組を表示すればいいんじゃね?
ルートがついてないのは、ルートあるなしで大小関係がかわんないため。
この問題解ける方いますか?
点数(0〜100点)を複数入力して、合計点、平均点、最高点、最低点、60点未満の件数を求め出力するプログラムを作成しなさい。なお-1が入力されたら入力終了すること。
出力結果例
30 (入力)
85 (入力)
45 (入力)
70 (入力)
-1 (入力)
合計:200点 平均:57.5点 (出力)
最高:85点 最低:30点 (出力)
60点未満:2名 (出力)
int sum = 0, count = 0, max = 0, min = 100, under60 = 0, a;
double avg;
while (scanf("%d", &a) == 1 && a > 0) {
count++;
sum += a;
if (a > max) max = a;
if (a < min) min = a;
if (a < 60) under60++;
}
avg = (double) sum / count;
printf("%d %f %d %d %d\n", sum, avg, max, min under60);
すごくやっつけ
#include<stdio.h>
int main(int argc,char **argv){
int total=0,min=100,max=0,n=0,u60=0,tmp;
do{
scanf("%d",&tmp);
if(tmp!=-1){
total+=tmp;
n++;
if(min>tmp)min=tmp;
if(max<tmp)max=tmp;
if(tmp<60) u60++;
}
}while(tmp!=-1);
if(n!=0){
printf("合計:%d点 平均:%f点\n",total,(double)total/n);
printf("最高:%d点 最低:%d点\n",max,min);
printf("60点未満:%d名\n",u60);
}else{
/* なにも入力されてません */
}
return 0;
}
>>270 だと0点が勘定に入らない a>0を どうにか変えればなんとか
ああ、ほんまや。入力数が0のときは、ゼロ除算とかやってるな。
>>270
[1] 授業単元:
[2] 問題文(含コード&リンク):標準入力から得た文字列中の数字をすべて"0"に変換するプログラムを書け
[3] 環境
[3.1] OS:Linux
[3.2] コンパイラ(バージョン):GCC
[3.3] 言語:C
[4] 期限:2005年5月29日24:59まで または 無期限 のいずれか
[5] その他の制限:特に制限なしだけど、出来るだけ短いプログラムでお願いします
>>274 int main(void)
{
int ch;
while ((ch = getchar()) != EOF)
putchar(isdigit(ch) ? '0' : ch);
return 0;
}
123hoge456->000hoge000?
123hoge456->0hoge0??
プログラム見せたらなんでvoid main(void)じゃないんだと激しく怒られました。
今、勉強してるのは組み込みマイコン系だからvoid〜でやれ、
int mainはc++の書き方とか言われました。
結局
>>236のプログラムのint mainをvoid main(void)にしてcharでDATAMAXを設定し
output(指定した変数)にして、outputをプロトコル関数に指定した最後にreturnをつけてみました。
1] 授業単元: アルゴリズム論
[2]問題文:配列に先頭から順にアルファベットの小文字を乱数発生関数を使用してランダムに20個詰め,
配列要素の値(文字)を添え字とともに表示するプログラムを作成しなさい。
ただし,同じ文字が複数回現れてもかまわない。
ヒント: 文字'a'はASCIIコードで97(十進数)で,a〜zのASCIIコードは連続していることを利用する。
つまり,'a'は97+0,'b'は97+1, ... , 'z'は97+25となる。すなわち,アルファベットは26文字
なので,乱数は0から25までを発生させ,それを利用する。
[3] 環境
[3.1] OS:WindowsXP
[3.2] コンパイラ(バージョン):
[3.3] 言語:C言語
[4] 期限:2005年5月27日18時まで
期限ぎりぎりまで考えたのですがさっぱり、、先輩方助けて下さい
279 :
278:2005/05/27(金) 16:44:32
[1] 授業単元: アルゴリズム論
[2]問題文:配列に先頭から順に0から15までの数字を乱数発生関数を使ってランダムに20個詰め,添え字と
ともに表示する。その後,キーボードから数字を入力し,線形探索を使って,その数値と一致
する要素があれば添え字を表示し(複数あれば全て表示)無ければ,No Dataと表示するプロ
グラムを作成しなさい。
[3] 環境
[3.1] OS:WindowsXP
[3.2] コンパイラ(バージョン):
[3.3] 言語:C言語
[4] 期限:2005年5月27日18時まで
2つあるのですがこちらのほうもさっぱり、、、
>>278 テスト環境はLinux。乱数初期化のとこ動かなかったら適当に替えてくれ。
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#define NUM 20
int main( void )
{
char buff[NUM+1];
int count;
srand( getpid() );
for( count=0; count<NUM; count++ )
buff[count] = 'a' + rand() % 26;
buff[NUM] = '\0';
for( count=0; count<NUM; count++ )
printf( "%2d:%c\n", count, buff[count] );
puts("");
return 0;
}
>>132 レスありがとうございました!
大変参考になりました!
282 :
278:2005/05/27(金) 16:57:42
>>280 迅速な解答、ありがとうございます。
本当にたすかります。もしよろしかったら2問目も教えて下さい。
よろしくおねがいいたします。
>>280 #include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#define NUM 20
int main( void )
{
int buff[NUM];
int count, val;
srand( getpid() );
for( count=0; count<NUM; count++ )
buff[count] = rand() % 16;
printf( "input number(0-15):" ); fflush(stdout);
scanf( "%d", &val );
for( count=0; count<NUM; count++ )
if( buff[count] == val ){
printf( "%d:%d\n", count, buff[count] );
return 0;
}
puts("No Data\n");
return 0;
}
>>279 複数対応だったな。スマソ
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#define NUM 20
int main( void )
{
int buff[NUM];
int count, val, flg;
srand( getpid() );
for( count=0; count<NUM; count++ )
buff[count] = rand() % 16;
printf( "input number(0-15):" ); fflush(stdout);
scanf( "%d", &val );
flg = 0;
for( count=0; count<NUM; count++ )
if( buff[count] == val ){
printf( "%d:%d\n", count, buff[count] );
flg = 1;
}
if( ! flg )
puts("No Data\n");
return 0;
}
>>277 自分で何とかできるならそれはそれで良し。
そういう能力はどこでも必要だし、旨いことやってくださいな。
[1] 授業単元: アルゴリズム論
[2]問題文:配列に先頭から順に150から199までの50個の整数値を入れる。その後,キーボードから入力された
整数値が入っている配列を2分探索法で探し,その添え字の番号を表示するプログラムを作成しなさい。
[3] 環境
[3.1] OS:WindowsXP
[3.2] コンパイラ(バージョン):
[3.3] 言語:C言語
[4] 期限:2005年5月27日17時50分まで
これできないと単位が、、、どなたか助けてください。
>>277 一応 int main(void)はCでも規格に採用されている正式なもの。
だから頭の片隅にでも入れておいても損は無い。
>>286 #include <stdio.h>
#define NUM 50
int main( void )
{
int data[NUM];
int count,val,start,end,pos;
for( count=0; count<NUM; count++ )
data[count]=150+count;
printf( "input number(150-199): "); fflush(stdout);
scanf( "%d", &val );
start=0; end = NUM-1;
while(1){
pos = ( end + start ) / 2;
if( data[pos] == val ){
break;
}
else if( data[pos] > val ){
end = pos - 1;
}
else {
start = pos + 1;
}
}
printf( "%d\n", pos );
return 0;
}
>>286 折角作ったからage。
#include <stdio.h>
#define NUMBASE (150)
#define NUMMAX (199)
#define ARRAYMAX (50)
int main(){
int i,in,pos,len;
int data[ARRAYMAX];
for(i=0;i<ARRAYMAX;i++){
data[i]=i+NUMBASE;
}
printf("Input Num(%d-%d)",NUMBASE,NUMMAX);
scanf("%d",&in);
if(in>NUMMAX || in<NUMBASE){
puts("invalid value");
return 0;
}
in-= NUMBASE;
pos= ARRAYMAX/2;
len=ARRAYMAX /2;
while(1){
if(pos==in) break;
len /= 2;
if(len == 0) len=1;
if(pos<in) pos+= len;
else pos -= len;
}
printf("Array[%d]=%d\n",pos,data[pos]);
return 0;
}
>>278,279,286の締め切りが微妙に違っている件について
291 :
デフォルトの名無しさん:2005/05/27(金) 19:00:18
[1] コンピューター物理学
[2]while、for、do-whileの3種類のループを用いて、
読み込んだ整数の段数を持つピラミッドを表示するプログラムを作れ。
例: inuput number of lines: 3
| * |
| *** |
| ***** |
[3]環境
[3.1]UNIX
[3.2]cc,gcc,Fortran(バージョンは分かりませんが、数年前のものです)
[3.3] 言語:C
[4] 期限:5月31日
[5] 初習者用問題なので、単純に書けると思うのですが…。
空白の空け方が分かりません。多重ループを使うと思うのですが。
| * |
| *** |
| ***** |
293 :
デフォルトの名無しさん:2005/05/27(金) 19:11:24
[1] 授業単元:プログラミング
[2]問題文:
整数nを与えると、0〜n-1の整数の中からn個を選択するという操作をし、その全ての組み合わせを画面にプリントアウトする関数を作成せよ。
数の選択では重複を認める。
[3] 環境
[3.1] OS:Linux
[3.2] コンパイラ(バージョン): gcc
[3.3] 言語: C
[4] 期限:5/30
>>291 #include <stdio.h>
int main(void){
int n, i, j;
printf("inuput number of lines:");
scanf("%d", &n);
if(n < 1) return 0;
for(i = 0; i < n; i++){
printf("|");
j = 0;
while(j++ < n - i){
printf(" ");
};
j = 0;
do{
printf("*");
}while(j++ < 2*i);
j = 0;
while(j++ < n - i){
printf(" ");
};
printf("|\n");
}
return 0;
}
[1] 授業単元: オペレーティングシステム
[2] 問題文(含コード&リンク):
(1)shellコマンド‘echo’と同じ機能を持つ、
新コマンド‘myecho’を作成せよ
(2)設定されている全環境変数を表示するプログラムを作成せよ
(3)‘pwd’と同じ機能を持つ‘mypwd’を作成せよ
[3] 環境
[3.1] OS:Linux
[3.2] コンパイラ(バージョン):gcc
[3.3] 言語:C言語
[4] 期限:5月30日まで
よろしくおねがいします。
(1)shellコマンド‘echo’と同じ機能を持つ、新コマンド
‘myecho’を作成せよ
(2)設定されている全環境変数を表示するプログラムを作成せよ
(3)‘pwd’と同じ機能を持つ‘mypwd’を作成せよ
296 :
295:2005/05/27(金) 19:25:05
すいません 問題文2回も書いてしまいました・・・。
297 :
291:2005/05/27(金) 19:33:45
>>294 うわー、すいません。
do,while,for それぞれを使い、三つのプログラムを書け、という課題です。
それと、|、はいりません。
>>297 forのみ。do whileやwhileへの書き換えは機械的にできる。
出来なければ勉強しなさい。
#include <stdio.h>
int main(void) {
int n, i, j;
printf("input number of lines:"); scanf("%d", &n);
for (i = 0; i < n; i++) {
for (j = 0; j < n - i - 1; j++)
printf(" ");
for (j = 0; j < 2 * i + 1; j++)
printf("*");
printf("\n");
}
return 0;
}
299 :
291:2005/05/27(金) 19:40:45
>>298 ありがとうございます。
分かりました。それを参考にやってみます。
>>293 #include <stdio.h>
int main( void )
{
unsigned int num, val, max, count1, count2, div;
printf( "inuput number of lines(1-100): " ); fflush(stdout);
scanf( "%d", &num );
max=1;
for( count1=0; count1<num; count1++ )
max *= num;
for( count1=0; count1<max; count1++ ) {
printf( "%d: ", count1 );
div = max;
val = count1;
for( count2=0; count2<num-1; count2++ ){
div /= num;
printf( "%d ", val/div );
val %= div;
}
printf( "%d\n", val );
}
return 0;
}
C言語で
if((num1==1&&num2==2&&num3==3)||(num1==2&&num2==3&&num3==1)||(num1==3&&num2==1&&num3==2))
これもっと簡略できませんか?馬鹿ですみません;
>>293 順列…じゃないよね?
#include <stdio.h>
#include <stdlib.h>
void hoge2(int n, int m, int depth, int *p){
int i;
if(n == depth){
for(i = 0; i < n; i++) printf("%d ", p[i]);
printf("\n");
return;
}
for(i = m; i < n; i++){
p[depth] = i;
hoge2(n, i, depth+1, p);
}
}
void hoge(int n){
int *p;
p = (int *)malloc(sizeof(int)*n);
hoge2(n, 0, 0, p);
free(p);
}
int main(void){
int n;
scanf("%d", &n);
if(n < 1) return 0;
hoge(n);
return 0;
}
>>303 if((1<<num1)|(1<<num2)|(1<<num3) == 0x0e)
307 :
306:2005/05/28(土) 00:54:02
投げてから気づいた。間違い。
num1〜3が1〜3の値しか取らないとかの制限があれば簡単にできるかも。
>303
int list[3+1]={0};
++list[num1];
++list[num2];
++list[num3];
if(list[1] && list[2] && list[3])
...マンドクセーカ orz
部分のコードだけではどーしよーもねぇな。
C言語なら俺に聞けあたりのネタだしな。
かきこしようとしたら山田警報?
とりあえずretry
tmp = ((num3 & 3) | ((num2 & 3) << 2) | ((num1 & 3) << 4));
tmp |= (tmp << 6);
if ((tmp & 63) == 27 || ((tmp >> 2 ) & 63) == 27 ||
((tmp >> 4) & 63) == 27) {
意味なし
311 :
デフォルトの名無しさん:2005/05/28(土) 11:24:20
行列A、Bを
1 3 5 9 3
A=2 5 8 B=8 4
4 6 9 7 5
とするとき、AとBの積Cを求めて表示するプログラムを制作せよ
どなたかこの問題をやってもらえませんか?よろしくお願いします
312 :
311:2005/05/28(土) 11:30:55
あ、ずれた・・・
1 3 5
2 5 8=A
4 6 9
9 3
8 4=B
7 5
正しくは↑です
>>311 テンプレ読もうね
#include <stdio.h>
int main( void )
{
int A[3][3]={{1,3,5},{2,5,8},{4,6,9}},
B[3][2]={{9,3},{8,4},{7,5}},
C[3][2], sum, row, col, count;
for( row=0;row<3;row++ )
for( col=0;col<2;col++ ){
C[row][col]=0;
for(count=0;count<3;count++)
C[row][col]+= A[row][count]*B[count][col];
}
for( row=0;row<3;row++ ){
for( col=0;col<2;col++ )
printf( "%d ", C[row][col] );
puts("");
}
return 0;
}
314 :
デフォルトの名無しさん:2005/05/28(土) 11:59:44
>>303 if(num1+num2+num3==6)
315 :
311:2005/05/28(土) 12:35:12
>>313 ありがとうございました!
これからは気をつけます
>314
2+2+2 とかだめじゃん
値域が限定しているなら、 if (num1 * num2 * num3 == 6)で。
318 :
293:2005/05/28(土) 15:04:06
>>305さんの答えが私が求めていたものです。どうもありがとうございました。
>>300さんもお答えいただいて、ありがとうございました。
>319
つまり
1,2,3
2,3,1
3,1,2
だけ判定しろってことか...orz
#define P(x) ((x) == 1 || (x) == -2)
P(num2-num1) && P(num3-num2) && P(num
#include<stdio.h>
int main(int argc,char **argv){
int num1,num2,num3;
for(num1=1;num1<10;num1++)
for(num2=1;num2<10;num2++)
for(num3=1;num3<10;num3++)
if((num3-num1+3)%3==2 && num1*num2*num3==6)
printf("num1=%d num2=%d num3=%d\n",num1,num2,num3);
return 0;
}
123
231
321
と116がおまけで付いてきてもいいなら
俺の部屋も片付けてください・・・。
大学で出された初の課題なんですが、俺はバカなのでわかりません。
問3
char型変数aにscanfを用いて一文字読み込み、文字型 2進、8進、10進、
16進に変換して出力しなさい。
出力例
a?A
文字 = A
8進 = 101
10進 = 65
16進 = 41
2進 = 1000001
b?abcdefg
文字列 = abcdefg
アルゴリズムは自力で何とかしますんで、よろしくです。。。
>>324 2進以外
#include<stdio.h>
int main(int argc,char **argv){
char a;
printf("a?");
scanf("%c",&a);
printf("文字 = %c\n",a);
printf("8進 = %o\n",a);
printf("10進 = %d\n",a);
printf("16進 = %x\n",a);
return 0;
}
>>324 2進
#include<stdio.h>
int main(void){
int flag = 0, i;
char a, tmp;
printf("a?");
scanf("%c",&a);
printf("2進 = ");
tmp = a;
for(i = sizeof(char)*8; i > 0; i--){
if(tmp&(1<<(sizeof(char)*8-1))){
printf("1");
flag = 1;
}
else if(flag) printf("0");
tmp<<=1;
}
printf("\n");
return 0;
}
>322
激しく無駄ぢゃん
元の>303見れ
>>324 全部
#include<stdio.h>
int main(void) {
int index = 0, left = 0;
char a, x, s[16], temp;
printf("a?"); scanf("%c", &a);
printf("文字=%c\n", a);
x = a;
do {
s[index++] = x % 2 + '0';
x >>= 1;
} while (x);
s[index--] = '\0';
while (left < index) {
temp = s[left];
s[left] = s[index];
s[index] = temp;
++left;
--index;
}
printf(" 2進=%s\n", s);
printf(" 8進=%o\n", a);
printf("10進=%d\n", a);
printf("16進=%x\n", a);
return 0;
}
329 :
324:2005/05/28(土) 22:23:52
[1] 授業単元:ポインタ
[2] 問題文(含コード&リンク):
1.main()において一次元配列data[10]に数値を入力し、配列の先頭アドレスと要素数の個数が入っている変数のアドレスを
因数にして配列中で最大値の格納されているアドレスを返す関数int *max_data(int *tbl,int *kosu)
2.a[]="What You See Is What You Get",b[]="=WYSIWYG"の文字列を連結してc[40]に格納する
処理は書く配列の線t脳アドレスを引数として関数void renketu(char *moji1,char *moji2,char *kekka)で文字列の連結を行い
結果はmain関数にて出力
[3] 環境
[3.1] OS:WindowsNT
[3.2] コンパイラ(バージョン):
[3.3] 言語:C/
[4] 期限:月曜
[5] その他の制限:ポインタを習い終わったばかり
線t脳アドレス
>>330 1.
int *max_data(int *tbl, int *kosu) {
int *max = tbl, i;
for (i = 1; i < *kosu; i++)
if (*max < tbl[i])
max = tbl + i;
return max;
}
2.
#include <stdio.h>
#include <string.h>
void renketu(char *moji1, char *moji2, char *kekka) {
while(*kekka++ = *moji1++){}
kekka--;
while(*kekka++ = *moji2++){}
}
int main(void) {
char a[]="What You See Is What You Get", b[]="=WYSIWYG", s[128];
renketu(a, b, s);
printf("%s", s);
}
333 :
332:2005/05/28(土) 23:45:01
#include <string.h>が余計だった。削ってくれ。
int *max_data(int *tbl,int *kosu)
{ int i,*maxPos=tbl;
for(i=1; i<*kosu; ++i) if(*(tbl+i)>*maxPos) maxPos=tbl+i;
return maxPos;
}
void renketu(char *moji1,char *moji2,char *kekka)
{ int i=0;
while(*moji1) *(kekka+(i++))=*moji1++;
while(*moji2) *(kekka+(i++))=*moji2++;
*(kekka+i)='\0';
}
>>332,334
i=1からでよかったっけ?先頭要素って*tblで参照するような気がするのだが、私の記憶違いかな。
>336
もまえはコードの意味がわかっていないだけだ
[1] 授業単元:情報システム工学実験
[2] 問題文(含コード&リンク):
2*((d^2y)/(dx^2))+0.5*(dy/dx)+2.5y=1
y(x=0)=0,dy/dx(x=0)=0.1の時、この微分方程式をルンゲッタ法によって
数値計算し、x軸=0.01刻みでyの値を表示するプログラム書け。
[3] 環境
[3.1] OS:Windows
[3.2] コンパイラ(バージョン): Visual studio .NET 2003
[3.3] 言語:C
[4] 期限:2005年5月29日23:59
[5] その他の制限:
使用できるヘッダーファイルは"stdio.h","string.h","stdlib.h","math.h"
位だと思います。
よろしくお願いします。
>>339 ルンゲッタ法に該当するページが見つかりませんでした。 by Google
>>340 多分ルンゲクッタ法の間違いだと思われる
xをどこまで動かして表示するの?
343 :
デフォルトの名無しさん:2005/05/29(日) 03:44:33
[1] 授業単元:ファイル入出力
[2] 問題文:
正方行列(2×2行列)の和、差を求める(入力、出力をファイルで行う)プログラムを作成せよ。
なお、和と差は関数にして、1つのソースプログラムで作ること。
[3] 環境
[3.1] OS:Windows
[3.2] コンパイラ(バージョン):
[3.3] 言語:C
[4] 期限:2005年5月30日まで
[5] その他の制限:
行列の要素の入出力をファイルで行うところがよくわかりません。
よろしくお願いしますm(_)m
>>343 入出力ファイルのフォーマットが分からないとどうしようもない
好きなように仮定して良いの?
345 :
856:2005/05/29(日) 04:43:09
[1] 授業単元:プログラミングU
[2] 問題文:
与えられたプログラムを以下のように直せ
・円を右から2個半円にする
・円の上に赤、下に黄の接線を引く
・一番右の半円に緑、右から2番目に青の色をつける
[3] 環境
[3.1] OS:WindowsXP
[3.2] コンパイラ(バージョン):Visual Studio .net 2003
[3.3] 言語:C
[4] 期限:2005年5月30日5:30まで
346 :
856:2005/05/29(日) 04:45:00
これがソースです
#include <windows.h>
#define APP_NAME TEXT("Sample_MainWindow")
LRESULT CALLBACK WindowProc (
HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
) {
HDC hdc;
PAINTSTRUCT ps;
switch(uMsg) {
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_PAINT:
hdc = BeginPaint(hWnd , &ps);
LineTo(hdc , 400 , 100);
347 :
856:2005/05/29(日) 04:45:27
Ellipse(hdc , 10 , 10 , 100 , 100);
Arc(hdc , 110 , 10 , 200 , 100 , 100 , 0 , 210 , 0);
Pie(hdc , 210 , 10 , 300 , 100 , 200 , 0 , 310 , 0);
Chord(hdc , 310 , 10 , 400 , 100 , 300 , 0 , 410 , 0);
EndPaint(hWnd , &ps);
return 0;
}
return DefWindowProc(hWnd , uMsg , wParam , lParam);
}
int WINAPI WinMain(
HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR lpCmdLine, int nCmdShow
) {
WNDCLASS wc;
MSG msg;
348 :
856:2005/05/29(日) 04:45:41
wc.style= CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc= WindowProc;
wc.cbClsExtra= 0;
wc.cbWndExtra= 0;
wc.hInstance= hInstance;
wc.hIcon= LoadIcon(NULL , IDI_APPLICATION);
wc.hCursor= LoadCursor(NULL , IDC_ARROW);
wc.hbrBackground= (HBRUSH)COLOR_BACKGROUND + 1;
wc.lpszMenuName= NULL;
wc.lpszClassName= APP_NAME;
if (!RegisterClass(&wc)) return 0;
if (CreateWindow(
APP_NAME , TEXT(__FILE__) ,
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
CW_USEDEFAULT , CW_USEDEFAULT,
CW_USEDEFAULT , CW_USEDEFAULT,
NULL , NULL , hInstance , NULL
) == NULL) return 0;
while(GetMessage(&msg , NULL , 0 , 0) > 0) {
DispatchMessage(&msg);
}
return msg.wParam;
}
350 :
339:2005/05/29(日) 09:42:27
>>349 すいません。エラーがたくさん出てコンパイルできないです。。。
問題なくコンパイルできるよ。コンパイラは何を使ってる?
それと、どんなエラーが出た?
352 :
339:2005/05/29(日) 10:38:22
VisualStudio.NET 2003です。
今PCがネットに繋がってないので詳しくは書けないのですが、
31〜37行目にかけて、関数へのポインタを通して実行される
呼び出しに対する引数が多すぎます。
60行目が6番目の引数をdouble(double,double,double)から
(_cdel*)(void)に変換できません。
みたいな感じで出ます。
353 :
339:2005/05/29(日) 10:42:39
すいません。
拡張子がcppになっていました。
拡張子をcに変えたら無事コンパイル出来ました。
ありがとうございました。
354 :
デフォルトの名無しさん:2005/05/29(日) 11:53:13
VCでエディットボックスを作成した時、その中に書き込まれる文字列が
同じ半角英数なのに幅が違ってしまいます。
下の例だと全て幅は同じですが。
同じ10文字なのに半角数字とアルファベットでは幅が違ってしまうのです。
これを解消するにはどうしたらいいでしょう。
例:
1234567890
ABCDEFGHIJ
abcdefghij
(ここだと横幅は全て同じ)
>>354 スレ違い。プロポーショナルフォント(MS Pとか)使うからだろ。
c言語の宿題なんですがうまくいきません。
文字列strの中に,文字cが含まれていれば(複数ある場合には,最も先頭側と する),その文字へのポインタを返し,含まれていなければ,NULLを返す関数 char *str_char(const char *str, int c) を作成せよ.
#include<stdio.h>
char *str_char(const char *str, int c){
while(*str){
if(*str== c){
return *str;
}
str++;
}
return NULL;
}
main(){
char *str;
scanf("%s", str);
printf("%s\n", *str_char(str, 'c'));
}
どこをなおせばいいですかね?
>>356 char *str; を char str[100]; とかに直してみ。
>>345 CreatePen,SelectObject,DeleteObject,
LineTo,Arcとかでできるはず
MSDNライブラリを少しは見ようよ
360 :
デフォルトの名無しさん:2005/05/29(日) 12:41:33
>>356 char *str_char(const char *str, int c)
{
while (*str)
{
if (*str== c)
{
return *str; ← これあかんでー
}
str++;
}
return NULL;
}
361 :
デフォルトの名無しさん:2005/05/29(日) 12:47:11
>>344 ファイルのフォーマットについては特に指定はありませんでした。
自分で仮定して良いのだと思います。キーボードからの入出力なら出来た
のですが、ファイル入出力がどうもうまくいかないです・・・。
よろしくお願いします。
362 :
デフォルトの名無しさん:2005/05/29(日) 13:23:53
C言語でfor文を使って例えば
for (a=0; a<10000; a=a+1){
cout << a << "\n";}
と入力したものをワードパッドなどに
格納する方法があったと思うのですが
検索にかけてもなかなか見つかりません。
本当にやろうとしているプログラムはaの範囲が
非常に大きくdatファイルでは表示しきれないんです…
もしご存知の方がいらっしゃいましたら
やり方を教えていただけませんでしょうか?
>>362 コンパイルして出来たプログラムのファイル名がhoge.exeならhoge > foo.txtとすることで
coutの出力先がコンソールからfoo.txtへ変わる。
後はそれをワードパッドで開けばいい。
364 :
339:2005/05/29(日) 13:26:25
たびたびすいませんが、コードを読んでみたのですが、内容がよく分かりません。
このfuncはdy/dxで、func2はd^2y/dx^2を表しているのでしょうか?
あと、それぞれの変数が何を表しているのかを教えていただけるとありがたいのですが。
よろしくお願いします。
365 :
デフォルトの名無しさん:2005/05/29(日) 13:37:57
>>362 2×2の正方行列の演算なら、入力に四個のA行列要素と四個のB行列要素
をファイルから読みこみ、出力にC行列の四つの要素をファイルに書き込めれば
いいわけですよね?つまりファイルにあらかじめ記入したデータを行列の配列に
格納して、計算結果の要素を見やすくファイルに出力してあげる感じですよね・・・
ソースについてはよくわからないので、教えていただけますか?
>>364 すまん
double func2( double x, double y, double dy )
{
return -0.25 *dy -1.25 * y + 0.5;
}
だったな。
テスト用のままだった。
>>364 ついでに <math.h>はいらんかったな
368 :
362:2005/05/29(日) 14:27:22
>>363さん
さっそくの解答ありがとうございます。
しかし僕が馬鹿で何をしていいのか分かりません。
保存名をfoo.txtとしてみたんですが・・・
もう少しだけ教えてくれませんでしょうか?
>>368 DOS窓とかコマンドプロンプトでぐぐれ。
もしかして、
>>362はファイルをダブルクリックして開く開き方しか
知らないのではないだろうか
foo.txtならば、
notepad foo.txtとか
start foo.txtとか(普通は関連付けで開けるはず)
ちなみに、エクスプローラー立ち上げるには
start .
な。
・・・エクスプローラーのフォルダとDOS窓のディレクトリは同一という認識がねぇかもな。
>>373 そんなことはもう試しました
そこまで初心者じゃありません
>>374 はあ?
そこ、間違ってるのは事実なんだから
だったら、間違ったままのソースのせるなよ
>>375 もういいです。私より初心者みたいですね。
>>374 まあまあ、もちつけ。
試したのか。
じゃあ、今できてる分をもいちど、さらしてみ?
と釣られてみよう。
>>377 あなたじゃ話になりません
他の方よろしくお願いしますね
なんだこりゃ。新手のツンデレ詐欺か何か?
380 :
372:2005/05/29(日) 15:12:59
>>375 質問したのは自分なのですが、374は自分じゃありません。
return str;
こうしろってことですか?ポインタを返すってよくわからないんですよね。
>>380 return *strではstrというポインタの指す値を返してしまう。
382 :
372:2005/05/29(日) 15:18:21
なるほど〜。ありがとです。
>>382 あと
>>357も忘れんといてな。
要するに、char型のポインタの指す先がまだ確保されてないので、
実行結果が不定となるため、例としてchar型の配列を使っただけ。
malloc/freeを使うのが正攻法だが、ちと初心者には面倒かも。
, -=- -─‐-、
_ ´-─ ¬く  ̄  ̄ミ- 、
,,,,/ _==-ミァ-─‐-、 \''''''''''''ー--、,,,,,_
_,,,,-''"/ , ‐''" \ \、_,,,ー''ゞ" `ゞ、
-' " / / / | \ ヽ /"`
_,,-''''''"""''''' / / / / / || | i ヽ i /
´"''、. i / / / / / / || || |│ |ノス /
'、 |// / /___, -一ァ| /! |ト、|│ | | く」/
'、 |,-‐¬ ---┘'7 |! ハ! |,、-┼十|!/\/\
, -‐ ''" し' '´_ /,ィ二l |ト、/!ヽト、\_ヽ!|!l\:.. /
,r/ __ ,イ|リ ヾハ! ヽ! ,ィ⌒ヾミリノ/:::... \
/ ||ヽ -' / ̄ )` __ |ヒノ:} '` ,;\/\/
,r ' ヾ、 ,-、____ , イ ̄,r==- ==-' レ' /| |
/ ヽ `ーソ ' | |ト、,ヘ ′"" "" / / || |
. / \_ / | ハ ヽ`゙'ヘ ' ' / / | | | 1000GET
/ / / | ヽ 川\ 0 //! | | | |
/ / / 八 \川| |`ト- .. __ , イ‐ァヘ | | || |!
/ / / / \ \ 「`ー- 、 / .〉 ト、| ヽ、
,イ /-─=¬ニヘ、_ \ 厂\ 厂ヽ /!| | `ー=ヘ
-‐  ̄ /─ '  ̄ ├- ヽ\ \ノ\ \ 人 ハ!ヽ || |-┤ ヽ
/ /!‐-- | |\ ト、_`ヽ oヽ ト、! || |‐┤- ヽ
// 〉 __ / ├‐- || | 川-‐ | | 厂7! ハ! ├:┤  ̄ヽ
/ / ー ─  ̄ ├‐- リ || ハ!ヘ | | ト┤|/′ ヾ,┤ ゙i_
‐ ' 〉‐- | / /\ .|o | /ヽ/(′ ∨ \
385 :
372:2005/05/29(日) 15:24:28
>>383 ふむふむ。指摘していただきどうも。2点治しました
386 :
856:2005/05/29(日) 15:33:47
>>359 ありがとうございます!しかし・・・
MSDNライブラリ?さっぱり・・・orz
388 :
856:2005/05/29(日) 16:11:52
>>345の問題やっぱりわからんです・・・
LineTo?を使うとこまでわかったんですが・・・
>>389 一行目激しく同意。
ぶん殴りたくなってくる。
どうすればぬるぽできるか分からないんです。
>>388 VS2003のヘルプにMSDNライブラリってないか
キーワード検索が便利だよ
どなたかこのシリーズのスレの39〜43代目のログをお持ちの方はおられないでしょうか?
この前、PCがクラッシュしたときにJaneのログも巻き込んでなくなったので…。
39と43は持ってる(datだが)
18,19,20以外のdatなら
20代目から全部ある…と思ったら
20代目…〜795
21代目…〜815
24代目…〜984
26棹 …〜984
39代目…〜964
43代目…〜945
が半端だった…orz(ちなみにこちらも全部dat)
まとめサイトお願いしたいなぁ。
402 :
デフォルトの名無しさん:2005/05/29(日) 22:03:09
VC6.0でエディットボックスを作成する際、キー入力を半角英数に固定することってできるんですか。
大文字固定にはできるんですが。
>>402 APIかMFCかはっきりさせて、当該スレへ。
21 〜992
22〜24 〜1001
25 〜961
26,27. 紛失
28〜44 〜1001
OK?
C++は役に立たないなw
407 :
404:2005/05/29(日) 23:20:25
>>406 本気で間違って吹き出した。28〜43な。
>>396 にくちゃんねるのdatじゃいかんのかい。
やはり二次元配列も変数ですよね?
グローバル変数を使うなって問題で
#include<stdio.h>
#define x 50 ←もしやこれもアウト?
int se[x][1]; ←これはやはりグローバル変数と見なされるのでしょうか
main(){
int y,z;
〜略〜
}
410 :
デフォルトの名無しさん:2005/05/30(月) 01:51:52
【質問テンプレ】
[1] 授業単元: プログラミング入門
[2] 問題文(含コード&リンク): コンピュータとジャンケンで対戦するプログラムを作成せよ。
条件:@ユーザーが糸冬 了を宣言するまで繰り返し対戦を行う。
A終了後、対戦成績を表示する。(何勝何敗何分)
Bコンピュータの手は適宜決定する。完全にランダムでもいいし、戦略的な要素を持たせてみるのも面白い。
Cユーザーの手を見てから、コンピュータが決定しないこと。(後だし禁止)
[3] 環境
[3.1] OS:Linux
[3.2] コンパイラ(バージョン): gcc
[3.3] 言語:C
[4] 期限:来週まで
[5] その他の制限:初歩的な授業で、制御構造、配列、関数まで習いました。 その程度の知識でお願いします。
よろしくお願いします…(´・ω:;.:...
>>409 #define x 50 ←セーフ
int se[x][1]; ←アウト(sexって…)
関数がわかりません。どこか練習問題と答えのってるページないですか?
>>410 前回の結果と次にプレイヤーが出した手の統計を取って、一番勝つ確率が高い手を選ぶ。
ただしそれだと逆読みされるので多少ランダムな要素も混ぜる。
相手が次に出す手が40%の精度でしかわからないときはランダム要素が強くて良いが、
相手の手が90%わかっているのならその手に偏らせたほうが勝てる確率が高い。
プレイヤーがチョキを出す確率が50%で、パーを出す確率が40%だと、
CPUはグーを出せば50%の確率で勝てるが、40%の確率で負ける。
CPUがチョキを出せば40%の確率で勝て、負ける確率はわずか10%など、
その辺も考慮してみると面白い。
>>411 どもー もう泣きそう
計算する関数を使うこと+グローバル関数使うなで集計のしようがなくて(´・ω・`)ショボーン
for(){関数}
で関数を複数回使っても一回一回その中で使った変数は破棄されるヨネ・・・戻り値で戻してまた引数として取り組む。。か
>>414 グローバル変数使うなってのはごくごく当たり前の制限だぞ。
たとえそう制限されてなくても使わないのが当然。
>>414 それ出題者はポインタの仕組みを理解して欲しいだけだと思うぞ。
main(){
int se[50][1];
int i,j;
printf();
scanf("%d",&n);
for(i=0;i<n;i++){
for(j=0;j<2;j++){
se[i][j] = input();
}
}
}
float input(void){
int a;
scanf("%f",&a);
return(a);
}
かなり省略してしまいましたがこのように二次配列に読み込むようなのを作ったとき
例えばn = 2で入力して次に 100 2 100 2と入れた時
[0][0] = 100
[0][1] = 2
まではいいのですが
[1][0] = 100
[1][1] = 2
と読み込んだ瞬間[1][0]地点で[0][1]が勝手に100になってしまい苦戦してるのですがどこか間違ったやり方してるところありますか?
かれこれこれだけに1時間以上(´;ω;`) 説明下手でスンマソン
マシーンがLinuxなんで今覚えてる限り打ち込んだので全てが一緒じゃないのですが
419 :
418:2005/05/30(月) 03:04:47
int a; → float a; printf();
>>418 int se[50][1];と書いておいてse[0][1]に代入を試みるとは何事。
↑ ↑この数字は「要素数」
>>410 以前貼ったやつ。ま、参考に。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void){
int i,m,e,w[3]={0},j;
char h[][9] = {"グー","チョキ","パー","勝ち","負け","引き分け"};
srand((unsigned)time(0));
for(i=0;i<5;i++){
printf("%s:0 %s:1 %s:2\n",h,h+1,h+2);scanf("%d",&m);
++w[j=(m==(e=(double)rand()/RAND_MAX*3)?2:(m+1)%3==e?0:1)];
printf("YOU:%s,PC:%s,%s\n\n",h+m,h+e,h+j+3);
}
printf("%s:%d,%s:%d,%s:%d,勝率:%d%%",h+3,*w,h+4,w[1],h+5,w[2],*w*100/5);
return 0;
}
>>418 >>420の言いたいことは、
int se[50][1]で使える配列ってのse[0][0]、se[1][0]、se[2][0], ... , se[49][0]の50個しかないゾということ。
int se[50][2]とすれば、se[0][0], se[0][1], se[1][0], se[1][1], ... , se[49][0], se[49][1]の100個使える。
リスト構造の「番兵」ってヤツを説明しろって言われました
なぁんかググっても説明が無いんすよ
なんすか番兵って?
[1] 授業単元:C言語
[2] 問題文(含コード&リンク):
@文字列strの中に,文字cが含まれていれば(複数ある場合には,最も先頭側と する),その添字を返し,含まれていなければ,-1を返す関数 int
str_char(const char str[], int c) を作成せよ.
A文字列str内のすべての数字文字を削除する関数 void del_digit(char str[])
を作成せよ.例えば,「AB1C9」を受け取ったら,「ABC」を返す.
[3] 環境
[3.1] OS:iMac
[3.2] コンパイラ(バージョン):gcc
[3.3] 言語:C
[4] 期限 :無期限
どうかよろしくお願いします(´・ω・`)
>>424 テストしてないケド
int str_char(const char str[], int c)
{ int i; for (i = 0; str[i]; i++) if (str[i] == c) return i; return -1; }
int is_digit(int c) {return c >= '0' && c <= '9'; }
void del_digit(char str[])
{ int i, j; for (i = j = 0; str[i]; i++) if (!is_digit(str[i])) str[j++] = str[i]; str[j] = '\0';}
429 :
423:2005/05/30(月) 09:25:28
>>426 スマソ 文章での説明が不可欠なんだがよく理解できねぇです
要点:ぐぐれ。
皆さんには、とても簡単な問題かもしれませんけどよろしくお願いします。
変数aとbにそれぞれ整数を入力し、絶対値の大きい値を表示するプログラムを作成しなさい。
出力結果
a?5
b?-15
大きい値は-15
>>431 #include <stdio.h>
#include <stdlib.h>
int
main(void)
{
int a, b;
printf("a?");
scanf("%d", &a);
printf("b?");
scanf("%d", &b);
printf("大きい値は%d\n", abs(a) > abs(b) ? a : b);
return 0;
}
433 :
431:2005/05/30(月) 10:42:36
>>432 サンクス。
何とか自分でできますた。よろしければこの問題もお願いします。
入力された値が2の倍数かつ5の倍数であればokを表示させ、それ以外であれば、errorを表示させる。
出力結果1
Input=>12
error
出力結果2
Input=>15
error
出力結果3
Input=>20
ok
>>433 #include <stdio.h>
int
main(void)
{
int a;
printf("Input=>");
scanf("%d", &a);
printf("%s\n", a % 2 == 0 && a % 5 == 0 ? "ok" : "error");
return 0;
}
0でもokになる
okになっちゃまずいのか?
0は全ての倍数だったのか
リアルで勘違いしてた
スマン
438 :
デフォルトの名無しさん:2005/05/30(月) 12:18:16
[1] 授業単元:プログラミング基礎(C)
[2] 問題文(含コード&リンク):
シーザ暗号を作ってテストしなさい
(例えばABCと入力するとBCDと変換されるように)
[3] 環境
[3.1] OS:Windows
[3.2] コンパイラ(バージョン):Visual C++
[3.3] 言語:C
[4] 期限:6/3まで
[5] その他の制限:
void angou(char *ps)⇔void kaidoku(char *ps)
こういうヒント(?)みたいなものはあるんですが…
お願いします。
439 :
438:2005/05/30(月) 13:00:05
補足です。
void angou(char *ps);
void kaidoku(char *ps);
上記ののメソッドを定義し、シーザ暗号を実装せよ。
例:IBM→HAL
対象:半角データのみ
ただしA→Z、a→z、0→9、その他の記号は処理なし
お願いします。
暗号化した文字にアルファベットとか数字以外が入っていいの?
>>438 # include <string.h>
# include <stdio.h>
const char lower[] = "abcdefghijklmnopqrstuvwxyza";
const char upper[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZA";
const char digits[] = "01234567890";
char angou_char(char x)
{
char *p;
if(p = strchr(lower, x)) return p[1];
if(p = strchr(upper, x)) return p[1];
if(p = strchr(digits, x)) return p[1];
return x;
}
char kaidoku_char(char x)
{
char *p;
if(p = strchr(lower + 1, x)) return p[-1];
if(p = strchr(upper + 1, x)) return p[-1];
if(p = strchr(digits + 1, x)) return p[-1];
return x;
}
void angou(char *ps){while(*ps){*ps = angou_char(*ps); ps++;}}
void kaidoku(char *ps){while(*ps){*ps = kaidoku_char(*ps); ps++;}}
442 :
デフォルトの名無しさん:2005/05/30(月) 15:34:47
以下のアルゴリズムを使ってxlogx-1=0の解を求めたいのですが、
自分の知識では書ききれません。誰か助けてください。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define samesign(x, y) (((x) > 0) == ((y) > 0)) /* 同符号なら真 */
double bisect(double a, double b, double tolerance, double (*f)(double), char **error){ double c, fa, fb, fc;
*error = NULL;
if (tolerance < 0) tolerance = 0;
if (b < a) { c = a; a = b; b = c; }
443 :
続き:2005/05/30(月) 15:35:12
fa = f(a);
if (fa == 0) return a;
fb = f(b);
if (fb == 0) return b;
if (samesign(fa, fb)) {
*error = "区間の両端で関数値が同符号です.";
return 0;
}
for ( ; ; ) {
c = (a + b) / 2;
if (c - a <= tolerance || b - c <= tolerance)
break;
fc = f(c);
if (fc == 0)
return c;
if (samesign(fc, fa)) {
a = c;
fa = fc;
} else {
b = c;
fb = fc;
}
}
444 :
続き:2005/05/30(月) 15:35:47
/* ゼロ点を求める関数の例 */
double func(double x){
return x * double log(double x) - 1;
}
/* テスト */
int main(){
char *error;
double x;
x = bisect(1, 2, 0, func, &error); /* $1 \le x \le 2$ の間で解を求める */
if (error){
printf("%s\n", error);
}else{
printf("x = % -24.16g\n", x);
}
return EXIT_SUCCESS;
警告文が下です。
In function func':
32:parse error before double'
In function main'
37:Parse error before double'
39:x undeclared
39:(eaxh undeclared identifier
is reported only once for each function it appears in.)
ちなみに、元はx^2-2=0の求根プログラムでした。
他人のソースを変えただけなんですが、このプログラム自体が読めません。
よかったら誰か助けてください。
445 :
続き:2005/05/30(月) 15:39:37
[1] 授業単元:アルゴリズム
[2] 問題文(含コード&リンク): 二分法を使って方程式の解を求める
[3] 環境
[3.1] OS:WindowsXP [3.2] コンパイラ(バージョン):XP5.1 コマンドプロンプト
[3.3] 言語:C[4] 期限:2005年5月30日:17時まで
[5] その他の制限:C言語を使う、二分法もしくはニュートン法を使う
以上です。
>>442 「bisect()の後に次を追加」
return c;
}
「func()のreturnを変更」
return x * log(x) - 1;
447 :
デフォルトの名無しさん:2005/05/30(月) 18:16:22
以下のプログラムは、宣言(int ai[2][3][4];)の代わりに必要
なメモリ領域だけをmallocにより確保し、
その中を配列と同様に利用しているものである。
なお、メモリ内での配列の要素の配列順序は宣言による場合と
同じにする。
(1)下線部を埋めてプログラムを完成せよ。
(2)こうした手法の利点と欠点を述べよ。(箇条書で良い)
#include<stdlib.h>
#include<stdio.h>
int *hairetu(int *ai,int i,int j,int k,int l,int m,int n)
{ return _________________________________; }
int main(void)
{
int l=2, m=3, n=4;
int *ai;
ai = __________________________________________;
*hairetu(ai,1,2,3,l,m,n)=12345;
printf("ai[1][2][3]=%d\n", *hairetu(ai,1,2,3,l,m,n));
free(ai);
return 0;
}
448 :
447:2005/05/30(月) 18:19:59
[1] 授業単元:C言語
[2] 問題文(含コード&リンク):上記
[3] 環境
[3.1] OS:Windows/Linux
[3.2] コンパイラ(バージョン):gcc
[3.3] 言語:C
[4] 期限:2005年5月31日10:00まで
>>447 #include<stdlib.h>
#include<stdio.h>
int *hairetu(int *ai,int i,int j,int k,int l,int m,int n)
{ return ( 0 <= i && i < l && 0 <= j && j < m && 0 <= k && k < n ) ? ai[ ( i * m + j ) * n + k ] : 0; }
int main(void)
{
int l=2, m=3, n=4;
int *ai;
ai = ( int * )malloc( sizeof( int ) * l * m * n ); if ( ai == NULL ) return 1;
*hairetu(ai,1,2,3,l,m,n)=12345;
printf("ai[1][2][3]=%d\n", *hairetu(ai,1,2,3,l,m,n));
free(ai);
return 0;
}
>>324のプログラムをbを足して、
簡易化してくれる方はいませんか?
451 :
449:2005/05/30(月) 18:37:52
>>447 ゴメン、間違った。
{ return ( 0 <= i && i < l && 0 <= j && j < m && 0 <= k && k < n ) ? ai[ ( i * m + j ) * n + k ] : 0; }
↓
{ return ( ai + ( 0 <= i && i < l && 0 <= j && j < m && 0 <= k && k < n ) ? ( i * m + j ) * n + k : 0 ); }
利点:
なし
欠点:
変数の無駄遣い。
関数の無駄遣い。
異常発生の可能性に対する処理が甘い。
コードを第三者が見たときに理解されるまで時間とコストの無駄である。
>>450 #include<stdio.h>
int main(void) {
int index = 0, left = 0;
char a, x, s[16], b[256], temp;
printf("a?"); scanf("%c", &a);
printf("\n文字 = %c\n", a);
printf("8進 = %o\n", a);
printf("10進 = %d\n", a);
printf("16進 = %x\n", a);
x = a;
do {
s[index++] = x % 2 + '0';
x >>= 1;
} while (x);
s[index--] = '\0';
while (left < index) {
temp = s[left];
s[left] = s[index];
s[index] = temp;
++left;
--index;
}
printf("2進 = %s\n\n", s);
printf("b?"); scanf("%s", &b);
printf("\n文字列 = %s", b);
return 0;
}
>>447 利点
・可変長配列を扱える
・動的確保のメリットを享受できる
・配列インデックスのオーバーレンジを常に検出する手法を提供できる
欠点
・直感的でない
・動的確保のデメリットを引き摺ってしまう
・オーバーヘッドが少なからず存在する
・一文字変数が混乱に拍車を掛けている
・内部構造が露呈されてしまう
結論
・こったことした割りには使えねぇなぁ
改善提案
・メモリアロケート、解放、セッター、ゲッターを一つのソースに押し込めてI/Fだけを公開することでいくつかの欠点は改善できる
(その場合、事実上C++のクラスの設計手法を流用することが検討できる)
455 :
デフォルトの名無しさん:2005/05/30(月) 18:43:53
[1] 授業単元:パソコン演習
[2] 問題文(含コード&リンク):2つの整数データのうち大きい方を選ぶ関数を作り、
これを利用して5つのデータの最大値を求めよ。
[3] 環境
[3.1] OS:Windos XP
[3.2] コンパイラ(バージョン):
[3.3] 言語:C
[4] 期限:2005年06月01日1:00まで できれば早めにお願いします。
[5] その他の制限:関数を使うということしか、わかりません。
簡単な問題だと思いますが、どうぞよろしくお願いします。
456 :
450:2005/05/30(月) 18:45:18
457 :
418:2005/05/30(月) 18:50:29
>>455 #include <stdio.h>
int max(int a, int b)
{
return a > b ? a : b;
}
int main()
{
int a, b, c, d, e;
scanf("%d%d%d%d%d", &a, &b, &c, &d, &e);
printf("%d\n", max(max(max(a, b), max(c, d)), e));
return 0;
}
459 :
291:2005/05/30(月) 19:05:49
すいません。291で書き込みしたものですが、
whileはできましたがdo-whileができません。
回答お願いします。一応自分でやってみたのも載せてみます…。
whileの中に式が3つも入っているのが間違いの原因なんだと思うんですが。
include <stdio.h>
int main(void)
{
int n, i, j;
printf("input number of lines:");
scanf("%d",&n);
do{
do{
printf(" ");
}while(j=0; j<n-i-1; j++);
do{
printf("*");
printf("\n");
}while(j=0; j<2*i+1; j++);
}while(i=0; i<n; i++);
return 0;
}
460 :
デフォルトの名無しさん:2005/05/30(月) 19:07:23
>>458 ありがとうございます。できました。関数の使い方がまったく、
わからなかったので感謝しています。
>>459 while(j=0; j<n-i-1; j++);
while(j=0; j<2*i+1; j++);
while(i=0; i<n; i++);
for文?
>>459 #include <stdio.h>
int main(void)
{
int n, i, j;
printf("input number of lines:");
scanf("%d",&n);
i=0;
do{
j=0;
do{
printf(" ");
}while(j++ < n-i);
j=0;
do{
printf("*");
}while(j++ < 2*i);
printf("\n");
}while(i++ < n);
return 0;
}
>>462 ありがとうございます。ありがとうございまず。
さて、できなかった理由を考察してみます。
[1] 授業単元:プログラミング基礎
[2] 問題文(含コード&リンク):
キーボードから入力した値の逆数を求め、答えを表示させるプログラムを作成せよ。
割り切れない場合は循環部も表示させよ。
ただし、入力する値は正の整数で、小数点以下の桁数は50桁までとする。
[3] 環境
[3.1] OS:WindowsXP
[3.2] コンパイラ(バージョン):gcc
[3.3] 言語:C
[4] 期限:2005年6月5日16:00まで
[5] その他の制限:
繰り返しにはfor文を使うこと
条件分岐はif文を使うこと
いろいろ調べてみたのですがわかりませんでした・・・。
よろしくお願いします。
465 :
424:2005/05/30(月) 19:48:58
>>425,427
ありがとうございました。無事解決することができました。
Aのほうですが、添字演算子を用いずに行うことは可能でしょうか?
466 :
デフォルトの名無しさん:2005/05/30(月) 19:59:00
〔1〕授業単元
情報処理概論T
〔2〕問題文(含コード&リンク)
秒単位で表現された時間をよみこみ、時間、分、秒の単位に変換して
結果を出力するプログラムを作りなさい
3] 環境
[3.1] OS:Windows
[3.2] コンパイラ(バージョン):gcc
[3.3] 言語:C
[4] 期限:2005年6月1日まで
[5] その他の制限:whileを途中まで習いました
#include <stdio.h>
int main(void) {
int t, h, m, s;
printf("input time:"); scanf("%d", &t);
h = t / 3600; t -= h * 3600;
m = t / 60; t -= m * 60;
s = t;
printf("%dh %dmin %dsec", h, m, s);
return 0;
}
上のプログラムのt -= h * 3600やt -= m * 60;についている
「-」と「return 0;」の意味がわからないのですが、
どういうことですか?
書いたプログラムについて説明しなければならないので未知のことは
避けたいのですが、上記のものを使わない回答もできますか?
あれば教えてください。
大変遅くなりましたが前回答えてくださった方本当にありがとうございました!!
>>466 (Value -= data ) => Value = Value - data
つまり、Valueからdata分を引いてまたValueに格納する意味を持つ。
おっと
>>467に書いてあったか。
return 0;
というのは関数からの返り値を設定している。(この場合はmainの。
void以外の返り値を設定した場合必ず関数の末尾につけなければいけない。
返り値の設定は関数の宣言したときに決定して、その後はそれに従わなければならない。
>>469 補足。
自作関数の場合は別に返り値の値は0でなくとも良い。
[1] 授業単元:C言語
[2] 問題文:テキストデータを読み込み、その内容を表示をさせる。
その際、一部の項目を昇順にソートさせて表示させる。
テキストの内容は以下の通り。ソートさせるのは「tanka」の数値。
no namae tanka
01 缶ビール 500
02 赤ワイン 1200
03 白ワイン 1000
[3] 環境
[3.1] OS:Windows XP
[3.2] コンパイラ(バージョン):bcc
[3.3] 言語:C
[4] 期限:2005年5月31日:12時まで
構造体・共用体まで習ったのですが、いまいち理解が出来てません。
よろしくお願いします。
#include <stdio.h>
#include <stdlib.h>
typedef struct { int no; char namae[100]; int tanka; } Recode;
int read_recode(FILE *fp, Recode *r, int n)
{int i;char fmt[20];sprintf(fmt, "%%d %%%ds %%d", (int) (sizeof(r->namae) - 1));
for (i = 0; i < n && fscanf(fmt, &r->no, &r->namae, &r->tanka) ; i++, r++) ;
return i;
}
void write_recode(FILE *fp, Recode *r, int n)
{
int i;
for (i = 0; i < n; i++, r++) printf("%02d %s %d\n", r->no, r->namae, r->tanka);
}
int compare_recode(const void *va, const void *vb)
{
Recode *a = (Recode *) va; Recode *b = (Recode *) vb
return a->tanka - b->tanka; /* オーバーフローするかも */
}
void sort_recode(Recode *r, int n)
{
qsort(r, n, sizeof(*r), compare_recode);
}
int main(void)
{
Recode r[100];
int n = read_recode(stdio, r, sizeof(r)/sizeof(r[0));
sort_recode(r, n);
write_recode(stdout, r, n);
return 0;
}
[1] 授業単元:C言語
[2] 問題文:
class Score {
// デフォルト属性は非公開
int scores[4];
int average;
void calc_average(){
int tmp=0;
for( int i=0; i < 4 ; i ++ )tmp+=scores[i];
average = tmp/4;
}
public: // 必要なものだけ「公開」する.
void set_score(int index, int value){
scores[index] = value;
calc_average();
}
int get_score(int index){
return scores[index];
}
int get_average(){
return average;
}
};
上記について, 領域外アクセスの危険性がなくなるよう, Scoreを改良して下さい.
[3] 環境
[3.1] OS:WinXP
[3.2] コンパイラ(バージョン):VC++
[3.3] 言語:C++
[4] 期限:一週間
領域外のアクセスが来た場合にどういう処理をして
どういう値を返せばいいのかよくわかりません。
どうぞよろしくお願いします。
>>473 BOOST::optionalを返すという手がある。
冗長な方法だと、
SetはintにしてGetをポインタにする。(Getは異常値としてNULLを返す。
ポインタにした場合、返ってきた変数の寿命を明確にするべきだと思う。(次、Setするまで有効とか。
ただ、識者はもっといい方法を知ってるかもしれないな。
>>473 マジックナンバーをconst定数にしたほうがよくないか?
477 :
デフォルトの名無しさん:2005/05/30(月) 22:24:01
[1] 授業単元: C言語
[2] 問題文(含コード&リンク):
A.宣言による場合 short d[L][M][N]
B.動的確保による場合(Aと同じサイズとする)
・short型の3次元配列を生成した場合について、以下の説明をせよ。
(AとBの両方について。short型とポインタ型のサイズはそれぞれ2バイトと4バイトとする)
(1)メモリ使用量(L,M,Nを用いて表せ)
(2)関数への渡し方
(3)関数での受け方
[3] 環境
[3.1] OS:WindowsXP/Linux
[3.2] コンパイラ(バージョン):gcc
[3.3] 言語:C
[4] 期限:明日の10時まで
[5] その他の制限:なし
プログラムではないのですが、どなたかよろしくお願いいたします。
>>477 A.宣言による場合 short d[L][M][N]
B.動的確保による場合 short (*p)[M][N}
(1)メモリ使用量(L,M,Nを用いて表せ)
A.2*L*M*N
B.2*L*M*N+4+α
(2)関数への渡し方
A.f(d);
B.f(p);
(3)関数での受け方
A.f(short (*d)[M][N])
B.f(short (*p)[M][N])
>>464 #include <stdio.h>
int main(void){
int n, i, tmp;
printf("正の整数を入力して下さい->");
scanf("%d", &n);
if(n < 1) return 0;
printf("%dの逆数は ", n);
if(n == 1){
printf("1\n");
return 0;
}
tmp = 1;
printf("0.");
for(i = 0; i < 50; i++){
tmp *= 10;
printf("%d", tmp / n);
tmp %= n;
if(tmp == 0) break;
}
printf("\n");
return 0;
}
480 :
477:2005/05/30(月) 23:02:09
>>478 動的確保による場合は、おそらくポインタのポインタのポインタを使うことを
期待されているような気がするのですが、その場合は、
メモリ使用量=L*M*N*sizeof(X)+L*M*sizeof(X *)+L*sizeof(X **)+sizeof(X ***)バイト
X:配列の型
でいいでしょうか?
もしよかったら、Xにはそれぞれ何が入るのか教えてください。
あと、その場合の関数での受け方は
f(X型 ***p)ですか?
>>480 > おそらくポインタのポインタのポインタを使うことを
> 期待されているような気がするのですが
んなこたー無いだろ。
482 :
477:2005/05/30(月) 23:18:31
授業で、動的確保による2次元配列というので
int m=2,n=3;
int **aai;
int *tmp;
aai=(int **)malloc(sizeof(int *)*m;
tmp=(int *)malloc(sizeof(int)*m*n;
というのを使っていたので、これの3次元配列を期待していると思っているのですが、
どうでしょうか?
>>480 可変配列を作るならそうだが、配列の大きさが確定なら
リニアに一度に確保する方が効率的と思わんかね。
>>482 おそらく出題者はその解答を期待しているだろうが、
「動的に確保する」という条件しか与えられていない以上、
>>478 は間違いではない。
485 :
471:2005/05/30(月) 23:45:22
>>472 早速上げていただきありがとうございました。
ところで同じ結果を求めるにあたって
構造体と共用体を両方使って書くことは可能でしょうか?
486 :
477:2005/05/30(月) 23:46:23
なるほど、確かにそうですね。
説明しろとあるのですが、
関数の渡し方と受け方はどのように説明したらよいのでしょうか?
>>485 どうしても両方使って書けと言うのなら不可能ではないが、
この問題で共用体を使うのは全く意味がない。
>>486 >>478では説明になっていないか?
仮に動的確保の方法を short ***p としたら、
渡し方: f(p)、受け方: f(short ***p)
より的確な説明があると思うか?
489 :
477:2005/05/31(火) 00:14:44
説明というと、なんでそうなるのか、などを長々と説明しなくてはいけないものだと
思っていましたが、確かにそれ以上何を説明するのかがわからないので、このまま
出そうと思います。何回もありがとうございました。
490 :
485:2005/05/31(火) 00:28:09
>>487 授業の時にこの問題の説明で、共用体に関数fopenとfputsを使ったやり方でも
出来たら解いてみよと言われたので、もしよろしかったらご教授願えないでしょうか。
491 :
442:2005/05/31(火) 01:13:21
誰か18、27代目のdatをくれまいか。
>>471 >>490 ・後から問題に付け足しするのはやめましょう。解いてもらっている方に失礼です。
(
>>1より)
ヒントだけでもあげやう。
>>472 を元にするなら、
・微妙にバグってるんでバグを取る。
・fopen()はmain()の中でやる。(サブルーチンは対応してる)
・fputs()を使うには邪道だが、write_recode()でsprintf()→fputs()を使う。
・共用体については、「この問題では使いどころがない」と注釈を入れる。
出来たのを、あげてくれると、他の人にもわかりやすいので、よろしく。
494 :
デフォルトの名無しさん:2005/05/31(火) 09:42:48
>467,468,469,470
あぁ〜なるほど。有難うございました!
[1] 授業単元: アルゴリズム論
[2] 問題文(含コード&リンク):配列に大きさの異なる10個の整数を先頭から順に詰める。この10個のデータの最小値をくり返し文をつかってさがす。
最小値とそれがはいっている配列要素の添字を表示する。しかしキーボードから入力するかわりに0~99の乱数を10個発生させるものとする。
[3] 環境
[3.1] OS:WindowsXP
[3.2] コンパイラ(バージョン):
[3.3] 言語:C言語
[4] 期限:2005年5月31日18時まで
期限ぎりぎりまで考えたのですがさっぱり、、先輩方よろしくおねがいします。
[1] 授業単元: アルゴリズム論II
[2] 問題文(含コード&リンク): 配列に0から99の乱数を10個つめなさい。
この配列をバブルソートを用いて昇順に並べ替えなさい。
[3] 環境
[3.1] OS:WindowsXP
[3.2] コンパイラ(バージョン):
[3.3] 言語:C言語
[4] 期限:2005年6月1日朝9時まで
明日までの課題なのですがさっぱり,よろしくおねがいします。
>>495 #include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
int main( void )
{
int num[10], min_idx, count1, count2, flg;
srand( getpid() );
for( count1=0; count1<10; count1++ ) {
do {
flg = 0;
num[count1] = rand() % 100;
for( count2=0; count2<count1; count2++ ){
if( num[count2] == num[count1] ) {
flg = 1;
break;
}
}
} while( flg );
}
min_idx=0;
for( count1=1; count1<10; count1++ ){
if ( num[count1] < num[min_idx] )
min_idx = count1;
}
printf( "%d %d\n", num[min_idx], min_idx );
return 0;
}
アルゴリズム論II でバブルソート・・・(あきれている)
>>496 #include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
int main( void )
{
int num[10], count1, count2, val;
srand( getpid() );
for( count1=0; count1<10; count1++ )
num[count1] = rand() % 100;
for( count1=1; count1<10; count1++ ){
printf( "%d ", num[count1] );
}
puts("");
for( count1=0; count1<10-1; count1++ )
for( count2=10-1; count2>count1; count2-- )
if( num[count2]<num[count2-1] ){
val = num[count2];
num[count2]=num[count2-1];
num[count2-1]= val;
}
for( count1=1; count1<10; count1++ ){
printf( "%d ", num[count1] );
}
puts("");
return 0;
}
500 :
デフォルトの名無しさん:2005/05/31(火) 11:05:33
キーボ ードから実数 x を入力し、ニュートン法と呼ばれる次のような反
復の式を用いて、近似的に x の平方根を求めるプログラムを作成。
--
xの平方根は、次の計算を| s(i+1)-s(i) | < ε, i=1,2,...となるまで繰
り返すことによって求めることができる。εは収束判定数である。
s(i+1) = ( s(i) + x / s(i)) / 2
ただし、s(1) = 1 。
なお、ε=0.00001として計算する。
明日の昼までにお願いします...
>>493 授業までに完成させれませんでした・・・無念。
http://pc8.2ch.net/test/read.cgi/tech/1116340323/905 マルチウザス
>905 :デフォルトの名無しさん :2005/05/31(火) 11:03:06
>これどーやるの?
>キーボ ードから実数 x を入力し、ニュートン法と呼ばれる次のような反
>復の式を用いて、近似的に x の平方根を求めるプログラムを作成せよ。
>--
> xの平方根は、次の計算を| s(i+1)-s(i) | < ε, i=1,2,...となるまで繰
>り返すことによって求めることができる。εは収束判定数である。
>
> s(i+1) = ( s(i) + x / s(i)) / 2
>ただし、s(1) = 1 とする。
>
> なお、ε=0.00001として計算すること。
なんだよマルチだったかよ
答えちゃったじゃん
ていうかこっちが宿題スレじゃん
まちがえた
504 :
デフォルトの名無しさん:2005/05/31(火) 12:02:57
プログラムとその説明とか感想は書けたけど、
プログラミングのレポートで「検討と考察」って
どういうこと書けばいいでしょう…orz
>>504 こぶしでなぐりつけたあと、くびをしめてころす
506 :
505:2005/05/31(火) 12:08:18
>>504 自分の作ったプログラムの 問題点と成りえそうな点や 問題点を
書いて、それに対する対策あん♥を書いたりしてもいいな。
[1] 授業単元:C言語
[2] 問題文:文字列str内のすべての数字文字を削除する関数 void del_digit(char str[])
を添字演算子を用いずに作成せよ.例えば,「AB1C9」を受け取ったら,「ABC」を 返す.
[3] 環境
[3.1] OS:Windows XP
[3.2] コンパイラ(バージョン):bcc
[3.3] 言語:C
[4] 期限:2005年6月1日
添字演算子を用いずにというところでつまづいています…
int is_digit(int c)
{
return c >= '0' && c <= '9';
}
void del_digit(char str[])
{
char *s, *t;
for (s = t = str; *s; s++)
if (!is_digit(*s))
*t++ = *s;
*t = '\0';
}
>>504 他の手法と比較し、今の手法を使っている理由を示す。
現在の手法の限界を書く。
同種の手法で解ける問題を書く・・・など。
510 :
太郎:2005/05/31(火) 13:36:01
[1] 授業単元:アドバンスプログラム
[2] 問題文(含コード&リンク):
3種類の括弧 (), {}, [] を含む文字列において,括弧の対応に
整合性がとれているかを判断する関数 int parenthesisCheck(char str[]) を作れ。
この関数は文字列 str 内の括弧の整合性がとれていれば 1 を,とれていなければ 0 を
関数値として返す。ただし,str 内の括弧以外の文字は無視する。
もちろん,文字列 str はヌル文字 '\0' で終了しているものとする。
たとえば, (a[b(cd){e}][f]) は整合性がとれているが,
(a[b(cd){e})][f] は整合性がとれていない。
ヒント:スタックを用いる。文字列を最初から見ていき,
開き括弧があるとそれをスタックに push する。閉じ括弧があると,
スタックからデータを pop し,それが閉じ括弧と対応するかどうかを判定する。
[3] 環境
[3.1] VineLinux最新版
[3.2] コンパイラ(バージョン) gcc
[3.3] 言語:C
[4] 期限:2005年5月31日24:00まで
お願いします。
>>510 char *ks="({]",*ke=")}]",s=1,t[256];
while(*p){for(i=0;i<3;i++){if(*p==ks[i])t[s++]=i;else if(*p==ke[i])if(t>1&&t[s-1]==i)s--;else return 0;}p++}
return 1;
int parenthesisCheck(char str[])
{
char stack[100];
int sp = 0;
for ( ; *str; str++) {
switch (*str) {
case '(': case '{': case '[':
if (sp >= sizeof(stack)/sizeof(stack[0]))
return 0; /* スタックオーバーフロー */
stack[sp++] = *str;
break;
case ')':
if (sp <= 0)
return 0;
if (*stack[--sp] != '(')
return 0;
break;
/* } や ]についても同様 */
}
}
return 1;
}
>if (*stack[--sp] != '(')
あーしまった
スタック残を忘れてた
>>512の方が優秀だな
>if (*stack[--sp] != '(')
素でボケた。
if (stack[--sp] != '(')
ね。
516 :
太郎:2005/05/31(火) 14:43:58
みなさんありがとうございます。
助かりましたー。
518 :
464:2005/05/31(火) 16:24:28
>>479 ありがとうございます。助かりました。
循環部の部分については自分でがんばってみます。
519 :
デフォルトの名無しさん:2005/05/31(火) 18:49:01
q
520 :
デフォルトの名無しさん:2005/05/31(火) 18:49:05
q
521 :
デフォルトの名無しさん:2005/05/31(火) 18:58:12
[1] 授業単元: C言語
[2] 問題文(含コード&リンク):
-9999を読み込むまで次々と整数値を読み込んでいき、合計値および平均値を表示するプログラム。
なお、最後に読み込んだ-9999は合計には加えない。do while文を使用すること。
変数は下記を使用すること。
int i; ←カウンタ
int n; ←整数値入力エリア
int sum; ←合計算出エリア
実行結果
1個目:15 2個目:65
3個目:84 4個目:96
5個目:23 6個目:45
7個目:85 8個目:-9
9個目:57 10個目:-9999
合計 : 461
平均 : 51.22
[3] 環境
[3.1] OS: WinXP
[3.2] コンパイラ(バージョン):
[3.3] 言語:C++
[4] 期限:明日まで。
[5] その他の制限:
よろしくお願いします。
522 :
デフォルトの名無しさん:2005/05/31(火) 19:02:51
[1] 授業単元: programing
[2] 問題文(含コード&リンク): 正の実係数a,bによって定義される関数f(x)=ax-bx^3を考える。
(x>=0)の定義域においてf(x)を最大化するxの値をx_0とするとき、f(x)を0からx_0まで
積分した値を求めるプログラムをお願いします。 ∫[0〜x_0]f(x)dx
[3] 環境
[3.1] OS:WinXp
[3.2] コンパイラ(バージョン): gcc
[3.3] 言語:C/C++/どちらでも可 のいずれか C
[4] 期限:yyyy年mm月dd日hh:mmまで または 無期限 のいずれか 明日
>>521 do-whileを指示する意図がわからん。実質whileだが・・・カウンタ回すならforのがいい気がする。
i = sum = 0;
do {
if (scasnf("%d", &n) != 0 && n != -9999)
break;
sum += n;
i++;
} while (1);
if (i > 0)
printf("合計 %d\n平均 %f\n", sum, (double) sum / i);
>>522 f'(x) = -2bx^2+a = 0 のところで最大がある。
このとき、x^2 = a / -2b ∴ x = ±√(a/-2b)
・・・なんか数学板のネタな気がしてきた・・・挫折。
525 :
デフォルトの名無しさん:2005/05/31(火) 19:38:27
>>522 微分するとa-2bx^2だから、x=0のときの傾きはaで正。
なので、x_0 ≠ 0。
頂点は傾きが0だから、
a-2bx^2=0
a = 2bx^2
x = ±√(a/2b)
a > 0、b >0 だから
x_0=√(a/2b)
あとは、f(x)を積分。
>>522 f(x)=ax-bx^3 とすると。
・f'(x) = a - 3bx^2 = 0 のとき、x = ±√(a/3b)
・3次関数の形が↓極小↑極大↓
・a>0, b>0
なので、x >= 0とき f(x)の最大値はx = √(a/3b)のときである。これが、x_0。
∫f(x)dx = ax^2/2 - bx^4/4 + C;
定積分してやると、
(5a^2)/(36b)
・・・うーん。なんか計算ミスしてそぉだ。
まあ、そんなわけで。
double func(double a, double b)
{
return 5.0 * a * a / 36.0 / b;
}
ってことでどーだろーか。
527 :
デフォルトの名無しさん:2005/05/31(火) 20:41:17
【質問テンプレ】
[1] 授業単元: 情報処理基礎
[2] 問題文(含コード&リンク): データの個数のnお呼びnこのデータをファイルから読み込み、
そのデータについて、データ数、最大値、最小値、平均、不偏分散、
標準偏差を計算しファイルに出力するプログラムを作成し、プログラム、
出力結果を1つのファイルにしてプリントアウトし提出せよ
[3] 環境
[3.1] OS:Windows/Linux/等々 Windous
[3.2] コンパイラ(バージョン): Borland C++compiler
[3.3] 言語:C
[4] 期限:2005年6月1日14:30まで
[5] その他の制限:
528 :
527:2005/05/31(火) 20:42:39
制限というか↓はヒント?みたいなものだと思います
void filedta(FIL *in int,int*n1,double data[])/*データを読み込みデータ数データを返す*/
voidaverage(int n,double data[],double *max double *min,double *ave,double *vor,double *sigma,FILE *out)
/*
max min ave vor sigmaを計算して結果をファイルに書き出すとともにメンプログラムに返す
*/
プログラムのアルゴリズム
使用する変数関数の宣言
|
入力ファイルの先頭アドレスを指定する←FILE*in in=fopen();使用
|
出力ファイルの先頭アドレスを指定する←FILE*out out=fopen();使用
|
入力データの読み込み n,data[]←ファイルが見つからない場合はエラーメッセージを
| プリントアウト 関数filedata()
最大値、最小値、平均、不偏分散、標準偏差の計算とファイルへの出力←関数average()
よろしくお願いします
529 :
デフォルトの名無しさん:2005/05/31(火) 20:58:51
524 早いレスありがとうございます。do-whileの課題だったので指定しました。
>>527-528 なんか指定されたものがイヤ〜ン
filedata()ってばバッファオーバーランを回避できないよなぁ。
agerage()の計算と出力を同時に行うのは・・・やっぱしイヤ。
センセ、下手な教え方せんでください。
とりあえず、要点だけ。
e に平均が入っているとして、
double s = 0; /* 偏差平方和 */
for (i = 0; i < n; i++)
s += (data[i] - e) * (data[i] - e);
*vor = s / (n - 1); /* 不偏分散 */
*sigma = sqrt(s / n); /* 標準偏差 */
平均、最大、最小の各値はの求め方はさんざん書いてあるので、これで十分でしょう。
531 :
521:2005/05/31(火) 22:35:52
>>524 この問題ってbreak文なしでも記述できるんでしょうか?
できる。がんばれ。
>>531 i = -1;
n = sum = 0;
do {
sum += n;
i++;
} while (!scanf("%d", &n) || n != -9999);
534 :
デフォルトの名無しさん:2005/05/31(火) 23:59:06
γo⌒^^^⌒o
.i ノソ~ノ ハ .)リ
从* ´ー` リノシ おやしみだっぺ
/^^ ^^\
(_つ ・ 人 ・) )
535 :
デフォルトの名無しさん:2005/06/01(水) 00:01:49
[1] 授業単元:C++
[2] 整数データを標準入力から与え,小さい順に並び替え,出力するプログラムを作りなさい。
ただし、プログラムの仕様は以下の通りです。
(1)0が入力されたら、入力の終わりとする。
(2)標準入力された正数データのみを計算の対象とし、最後に入力された0はデータには含めない。
(3)あらかじめ用意した配列サイズを越えた場合,あるいは入力が一つもない場合は,その旨,エラーを表示し
実行を終了すること。
(4)配列サイズは各自で設定して構わない。
[3] 環境
[3.1] OS:WinXP
[3.2] コンパイラ(バージョン):
[3.3] 言語:C++
[4] 期限:6月3日
よろしくお願いします。
536 :
デフォルトの名無しさん:2005/06/01(水) 00:06:48
[1] 授業単元: プログラミング
[2] 問題文(含コード&リンク):ファイルを比較するプログラムを作成せよ。
コンパイラで「dif ファイル名1 ファイル名2」と入力すれば比較することができるようにする。
[3] 環境
[3.1] OS:WindowsXP
[3.2] コンパイラ(バージョン):
[3.3] 言語:C
[4] 期限:明日まで
[5] その他の制限:
ファイルのコピー「cp ファイル名1 ファイル名2」は、検索したりして出来たのですが比較がさっぱりわかりません。
よろしくお願いします。
>>536 エラーチェックは省略。適宜追加してくれ。
#include <stdio.h>
int main(int argc, char **argv) {
FILE *fp1 = fopen(argv[1], "rb");
FILE *fp2 = fopen(argv[2], "rb");
int c1, c2;
do {
c1 = getc(fp1);
c2 = getc(fp2);
} while (c1 == c2 && c1 != EOF);
printf (c1 == c2 ? "おなじ\n" : "ちがう\n");
fclose(fp1);
fclose(fp2);
return 0;
}
538 :
デフォルトの名無しさん:2005/06/01(水) 01:11:44
[1] 授業単元:計算機科学演習
[2] 問題文(含コード&リンク):基数の変換「○進法→○進法」に
するプログラムを作りなさい。(例:3進法→5進法)
ただし、整数に限ってよい。
[3] 環境
[3.1] OS:WindowsXP
[3.2] コンパイラ(バージョン):VC++
[3.3] 言語:C
[4] 期限:2005年6月1日14:00まで
[5] その他の制限:下のアルゴリズムを使うこと。
int conv2(int d1, int m1, int x1[], int d2, int m2, int x2[])
{
int i, j, r, t;
for(i = 0; m1 > 0 && i < m2; i++){
r = 0;
for(j = m1 - 1; j >= 0; j--){
t = d1 * r + x1[j];
x1[j] = t / d2;
r = t % d2;
}
x2[i] = r;
while(m1 > 0 && x1[m1 - 1] == 0)
m1--;
}
if(m1 == 0)
return i;
else
return -1;
}
どうかお願いします。教えてください。
539 :
536:2005/06/01(水) 01:12:16
>>537 ありがとうございます。
早速やってみたんですが、「argcが使われていません」と出ました。
でも「dif ファイル名1 ファイル名2」で実行してみたら比較できました。
541 :
538:2005/06/01(水) 01:30:41
>>538のアルゴリズムの説明を付け足します。
『conv2()は,d1進m1桁の数x1[]を,d2進たかだかm2桁の数x2[]に
変換し,変換後の桁数を返す。
変換後の桁数がm2を超えれば-1を返す。』
付け足しをしてすみません。
考えても分からなかったので、助けてください。
お願いします。
542 :
デフォルトの名無しさん:2005/06/01(水) 02:09:00
[1] 授業単元:プログラミング
[2] 問題文(含コード&リンク):
英文をリダイレクションを使って、プログラムの標準入力から読み込み、
リスト構造に格納するプログラムを作成せよ。
標準入力からのテキストの読み込みには、readword関数を用いること。
例えば入力文字が「Hello, how are you doing?」の場合,
「Hello」「 how」「 are」「 you」「 doing」の5つの文字列をリスト構造に格納した後に
Hello
how
are
you
doing
と出力したいのです。
[3] 環境
[3.1] OS:Linux
[3.2] コンパイラ(バージョン):gcc
[3.3] 言語:C
[4] 期限:金曜日まで
一応プログラムを書いてみました。
リスト構造がまだよく理解できていないので、突っ込みどころ満載だと思いますが…
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/480.txt 現在コンパイル時に表示されるエラーは下の通りです。
kadai03D-1.c: In function `main':
kadai03D-1.c:26: warning: passing arg 1 of `insert' makes integer from pointer without a cast
kadai03D-1.c: In function `insert':
kadai03D-1.c:79: warning: passing arg 2 of `strcpy' makes pointer from integer without a cast
よろしくお願いします。
>>541 なんかグチャグチャでスマソ
#include <stdio.h>
#include <stdlib.h>
#define M1MAX 20
#define M2MAX 20
/* ここにconv2貼り付け */
int main(void){
int d1, d2;
int i = 0, tmp, m1, m2;
int x1[M1MAX], x2[M2MAX];
char buf[M1MAX+1];
char table[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
printf("何進数の数入力すんの?(1-36)>");
scanf("%d", &d1);
printf("%d進数の数入力すれば>", d1);
scanf("%s", buf);
while(buf[i] != '\0') i++;
m1 = i;
>>541 for(i = m1 - 1; i >= 0; i--){
tmp = m1 - i - 1;
if(buf[tmp] >= '0' && buf[tmp] <= '9'){
x1[i] = buf[tmp] - '0';
}else if(buf[tmp] >= 'A' && buf[tmp] <= 'Z'){
x1[i] = buf[tmp] - 'A' + 10;
}else{
printf("入力おかしくない?\n");
exit(2);
}
if(x1[i] > d1 - 1){
printf("これ%d進法じゃなくない?\n", d1);
exit(2);
}
}
printf("何進数の数にしたいの?(1-36)>");
scanf("%d", &d2);
m2 = conv2(d1, m1, x1, d2, M2MAX, x2);
if(m2 != -1){
for(i = m2 - 1; i >= 0; i--){
printf("%c", table[x2[i]]);
}
}
else{
printf("なんか無理っぽい");
}
printf("\n");
return 0;
}
とりあえず、
insert関数の引数のchar stringをchar *stringにすればいいよ
>>542 エラーメッセージをよく読めば分かるのに。
insert()の第一引数は、char stringになってるけど
これは間違いで、char* stringのつもり
でしょ。
547 :
546:2005/06/01(水) 02:43:15
かぶった
>>542 insert()がheadを返してるせいで、
ずっとpがNULLになってるから、p==NULLが評価されることでリストが逆順になっちゃってるね。
insert()はr(現在のノード)を返すようにして、pを変化させるのがいくない?
549 :
デフォルトの名無しさん:2005/06/01(水) 04:07:12
551 :
535:2005/06/01(水) 05:54:43
552 :
549:2005/06/01(水) 06:35:39
>>550 わかりました。私の考え方が甘かったようです。自己解決してみます。
553 :
デフォルトの名無しさん:2005/06/01(水) 10:25:48
[1]授業単元: プログラミング演習I
[2] 問題文:
問題1.複利計算
キーボードから
数値 x 円と
預ける年数 r 年と
年利率 a %
を入力してもらい、複利計算で貯金がどれくらい増えるかを計算するプログラムを作成せよ。
なお複利計算は 10000 円を年利0.8%でまわした場合
・1年後には 10000*(1+0.008) = 10080
・2年後には 10080*(1+0.008) = 10160
・3年後には 10100*(1+0.008) = 10241
となるような計算である。
問題2.qの剰余系
キーボードから、整数値Nと整数値qを入力してもらい、
1〜Nのうちで qで割り切れるものを表示させるプログラムを作成しなさい。
[3] 環境
[3.1] OS:Linux
[3.2] コンパイラ(バージョン):cc
[3.3] 言語:C
[4] 期限:6/7まで
[5] その他の制限:条件分岐と繰り返しまで習いました。
条件分岐と繰り返しの複合問題です。
昨日1日かけて考えてもわからなかったので、
2問ありますが、どなたかご教授お願いします。
一応問題1はできた。変数名や型が気に入らなかったら適宜変えてくれ。
まだ初心者だからスマートにはかけなかったが…
#include<stdio.h>
main(){
double money,rate;
int yeah,i;
printf("いくら預けますか?:");
scanf("%lf",&money);
printf("年利率を設定してください(%):");
scanf("%lf",&rate);
printf("何年預けますか?:");
scanf("%d",&yeah);
printf("%f円を年利率%f%で%d年預けます\n",money,rate,yeah);
rate=0.001*rate;
for(i=0;i<yeah;i++) money=money*(1+rate);
printf("%d年後の預金は%f円です。\n",yeah,money);
}
555 :
デフォルトの名無しさん:2005/06/01(水) 11:40:29
char *w[] = { "SUN", "MON", "TUE","WED", "THU", "FRI", "SAT", };
の"SUN", "MON", "TUE","WED", "THU", "FRI", "SAT"の部分をキーボードから
入力させるようにしたいのですが、
for( i = 0; i < 7; i++ )
{
printf( "data %d >>>", i + 1 );
gets( strings[i] );
}
のようにしてもできませんでした。どのようにすればよいでしょうか?
>>553 問題2も作った
#include<stdio.h>
main(){
int N,q,i;
printf("整数を入力してください:");
scanf("%d",&N);
printf("割る数を入力してください:");
scanf("%d",&q);
printf("1〜%dのうちで%dで割り切れる数字は以下の通りです\n",N,q);
for(i=1;i<=N;i++){
if(i%q==0) printf("%d ",i);
}
}
数値が大きくなったら処理に時間がかかるけど…まぁ、大丈夫だと思う。
…って俺は自分の課題も終わってないのに何してるんだorz
>>554 ・利率の計算が間違っている。0.001ではないな。
・預金の場合、毎年切り捨てて計算するべき。0.1円を預けるわけではないのだから。
>>555 ・説明が下手なんだから部分ではなく全体を貼れ。
・但しここは宿題スレだから初心者スレにでも逝け。
>>557 指摘サンクス!
おお…確かに利率が間違ってる。問題文に書かれたとおりに計算してしまいました
やっぱり切り捨てた方が良いですね。書く時にどっちにしようか迷ったんですけど…
ということで改良(?)版を
#include<stdio.h>
main(){
double rate;
int money,yeah,i;
printf("いくら預けますか?:");
scanf("%d",&money);
printf("年利率を設定してください(%):");
scanf("%lf",&rate);
printf("何年預けますか?:");
scanf("%d",&yeah);
printf("%d円を年利率%f%で%d年預けます\n",money,rate,yeah);
rate=0.01*rate;
for(i=0;i<yeah;i++) money=money*(1+rate);
printf("%d年後の預金は%d円です。\n",yeah,money);
}
rate=0.01*rate;
for(i=0;i<yeah;i++) money=money*(1+rate);
じゃなくて
rate=0.01*rate+1.0;
for(i=0;i<yeah;i++) money=money*rate;
のほうがいいん希ガス?
いいん希ガス?->いい希ガス
orz
[1] 授業単元:コンピュータ科学
[2] 問題文(含コード&リンク):
『ある個数のデータ群の中の最小値を見つける。さらにそのデータは何番目のデータだったかを探る』
このアルゴリズムを考えて、フローチャートまたはPADで示すこと。
使用するメモリはどんな役割を持っているかも記述すること。』
[4] 期限:2005/06/07 (金)
かなり初歩的な問題なのだろうと思いますが、教授の説明が
あまりに下手糞なので、もうお手上げ状態です。
どなたか僕に分かりやすく解説してくれませんか?
よろしくお願いします。
563 :
562:2005/06/01(水) 12:30:28
期限が間違っていました。訂正します。
[4] 期限:2005/06/03 (金)
よろしくお願いします・・・
564 :
デフォルトの名無しさん:2005/06/01(水) 12:58:36
>>564 なぜ
bool charIsPartOfWord(const char c)
にisalpha()を使わないのか悩む。
[1] 授業単元: プログラミング基礎
[2] 問題文(含コード&リンク): case文を用いて、3〜5が入力されたら春。6〜8が入力されたら夏。
9〜11は秋。12〜2は冬を表示するプログラム。
[3] 環境
[3.1] OS:Linux
[3.2] コンパイラ(バージョン):gcc
[3.3] 言語:C
[4] 期限:2005年6月2日まで
[5] その他の制限:case文の基礎まで
case文をそのまま繋げて提出したところ、(case:3 printf("春"); case:4 printf("春")…)もっとシンプルにするようにと言われてしまいました。
caseの条件をまとめるというのは可能なのでしょうか?
switch (式) {
case 3: case 4: case 5:
printf("春");
break;
/* あとはためしてみなっせ */
}
>>567 switch ( ... ) {
case 1 :
case 2 :
case 12 :
...;
break;
case 3 :
case 4 :
case 5 :
...;
break;
case 6 :
case 7 :
case 8 :
...;
break;
case 9 :
case 10 :
case 11 :
...;
break;
}
基本だ。
570 :
デフォルトの名無しさん:2005/06/01(水) 13:53:53
[1] 授業単元:C言語
[2] 問題文(1): 任意の個数の整数を入力し、それを格納した配列と要素数を返す関数うを作りなさい。また、適当なmain関数を補って実行例を示しなさい。
[2] 問題文(2): 任意の長さの1行分の文字列を任意の行数分入力し、EOFを入力すると逆順に表示するプログラムを作成せよ。
[3] 環境
[3.1] OS:WinXP SP2
[3.2] コンパイラ:VC++
[3.3] 言語:C
[4] 期限:今日中でお願いします。
両方ポインタで作成しなさい、だそうです。
宜しくお願いします。
572 :
570:2005/06/01(水) 14:04:30
>>571 はい。授業でも出てきています。
まだしっかりと理解できていませんが・・・・・。
#include <stdio.h>
int readint(FILE *fp, int *buf, int n)
{
int i;
for (i = 0; i < n && fscanf(fp, "%d", buf) == 1; i++, buf++)
;
return i;
}
int main(void)
{
int buf[100];
int n = readint(stdin, buf, 100);
/* あとはてきとーにnとbufの表示をしてください */
return 0;
}
問い2を取り掛かる前に質問。構造体習いました?あと、malloc()習いました?
574 :
570:2005/06/01(水) 14:08:28
>>573 早いレスありがとうございます。
571さんにもレスした通りですが、reallocやmallocは授業で習いました。
578 :
570:2005/06/01(水) 14:16:14
連投すみません。
構造体はまだ習っていませんが、うちの教授は習っていないことを使っても良いといっていました。
>>570 配列の伸張やるのがメンドかったので、お茶をにごす。1行が長いときは対応してない。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct List { char *line, struct List *next; };
void *ealloc(size_t) { void *p = malloc(size_t); if (p == NULL) { fprintf(stderr, "no enough memory\n"); exit(2); } return p; }
char *estrdup(char *s) { char *t = (char *) malloc(strlen(s) + 1); strcpy(t, s); return t; };
int main(void) {
char line[200];
List *head = 0, *list;
while (fgets(line, sizeof(line), stdin)) {
list = (List *) ealloc(sizeof(*list));
list->line = estrdup(line);
list->next = head;
head = list;
}
for (list = head; list; list = list->next)
fputs(list->line, stdout);
return 0;
}
581 :
570:2005/06/01(水) 14:30:03
あっ、そうか。そう書けば良かったのか・・・・・・・。
>>580サン
ありがとうございます。長い文字列の対応は、こちらで処理したいと思います。
本当に助かりました。
他の皆さんも、本当に助かりました。ありがとうございます。
582 :
デフォルトの名無しさん:2005/06/01(水) 14:30:57
>>566 わかりません。
先生がオタなので・・・。
583 :
570:2005/06/01(水) 14:38:45
すいません、580さん。
コンパイルしたところ、17エラーの1警告でした。
error C2143: 構文エラー : ':' が 'type' の前に必要です。
error C2059: 構文エラー : 'type'
error C2055: 関数定義内で仮引数リスト以外が使われていました。
error C2143: 構文エラー : ')' が 'type' の前に必要です。
error C2198: 'malloc' : 実引数が少なすぎます。
error C2059: 構文エラー : ')'
error C2065: 'List' : 定義されていない識別子です。
error C2065: 'head' : 定義されていない識別子です。
error C2106: '=' : 左のオペランドが、左辺値になっていません。
error C2065: 'list' : 定義されていない識別子です。
error C2100: 間接指定演算子 (*) の使い方が不正です。
error C2059: 構文エラー : ')'
error C2223: '->line' : 左側が構造体か共用体に対するポインタではありません。
error C2223: '->next' : 左側が構造体か共用体に対するポインタではありません。
error C2223: '->next' : 左側が構造体か共用体に対するポインタではありません。
error C2223: '->line' : 左側が構造体か共用体に対するポインタではありません。
warning C4133: 'function' : 'struct _iobuf *' と 'const char *' の間で型に互換性がありません。
error C2198: 'fputs' : 実引数が少なすぎます。
よろしかったら修正をお願いします。
584 :
デフォルトの名無しさん:2005/06/01(水) 15:04:32
typedef struct List List;
585 :
デフォルトの名無しさん:2005/06/01(水) 15:14:33
>506,509
ありがとうございます。
>506
改善できる問題点があるなら最初から良いほうのプログラムに
しなくてよいのですか?わざとあまりよくないほうを書いて
考察のところで直す、といった形をとるのでしょうか。
586 :
デフォルトの名無しさん:2005/06/01(水) 15:20:21
587 :
デフォルトの名無しさん:2005/06/01(水) 15:27:52
【授業単元】プログラム言語
【問題文】
<処理内容>
unsigned intt型の整数n、mの値を読み込み、n×mの計算を
シフト演算を用いて行う。結果はunsigned long型の変数に格納し
表示する。
n×mの計算をシフト演算で行うには次のようにする。
@x=0、s=0とする。ここで、sシフト数で、xは結果を格納する
変数である。
Anをsビット右シフトし、最右端のビットをチェックする。
1ならばmをsビット左シフトしたものにxを加える。
B Aでnをsビット右シフトしたものが0に等しければ、
xに乗算結果が格納される。さもなければ、sに1を
加えてAに戻る。
[3] 環境
[3.1] OS: windows
[3.2] コンパイラ(バージョン):Visual C++
[3.3] 言語:C
よろしくお願いします。
>>587 for ( x = 0, s = 0; n >> s; s++ ) if ( ( n >> s ) & 0x00000001 ) x += m << s;
改善できるのなら改善しる!
>>585 その後で考察書けばよろし。
590 :
553:2005/06/01(水) 16:47:13
>>554 >>556 >>557 >>559 >>560 答えてくださった方、早速の解答どうもありがとうございます。
すごく助かりました。
並びにアドバイスをくれた皆様方も、ありがとうございました。
ちなみに僕は問題1は、
for(i=0;i<yeah;i++) {money=money*rate/100+maney;}
でやってみました。
591 :
553:2005/06/01(水) 16:49:05
ミスが一箇所。
maney×→money
[1]C言語
[2]次のプログラムは外部変数に定義され、初期化された10個のint型データの平均を求め、各データと平均との差を表示するプログラムである。
このプログラムを以下のような関数の翻訳単位にファイルを分け、同様な動作をするプログラムを作成せよ。
型関数名引数・パラメータ機能戻り値
floatget_aveなし平均値を求め表示平均値
voidprint_data配列の添字、平均値1つのデータと平均値との差を求め表示なし
プログラム
/*
program : average.c
comments : 結合(linkage)を用いて、平均・差を求める。
*/
#include <stdio.h>
int score[10]={3,5,8,9,10,6,7,9,8,3};
int main(){
int i;
float ave = 0.0, dif;
for(i=0; i<10; i++) ave = ave + (float)score[i];
ave = ave / 10.0;
printf("ave = %3.1f\n",ave);
for(i=0; i<10; i++){
dif = score[i] - ave;
printf("score[%02d]=%2d Difference from average = %4.1f\n",i,score[i],dif);
}
return(0);
}
[3]環境
[3.1]MAC OS]
[3.2]gcc version 3.3 20030304 (Apple Computer, Inc. build 1666)
[3.3]C
[4]2005年6月2日am6:00あたりまで
[5]特になし
宜しくお願いします。
>>592 // 型 関数名 引数・パラメータ 機能 戻り値
// float get_ave なし 平均値を求め表示 平均値
// void print_data 配列の添字、平均値 1つのデータと平均値との差を求め表示 なし
#include <stdio.h>
int score[10]={3,5,8,9,10,6,7,9,8,3};
float get_ave(void){
int i;
float ave = 0.0, dif;
for(i=0; i<10; i++) ave = ave + (float)score[i];
ave = ave / 10.0;
printf("ave = %3.1f\n",ave);
return ave;
}
void print_data(int i, float ave){
float dif;
dif = score[i] - ave;
printf("score[%02d]=%2d Difference from average = %4.1f\n",i,score[i],dif);
}
int main(){
int i; float ave;
ave = get_ave();
for(i=0; i<10; i++) print_data(i, ave);
return(0);
}
[1] 授業単元:プログラミング
[2] 問題文:
人数nをキーボードから入力し、配列に身長のデータを読み込んでいき、
入力された身長を10cmごとにわけたヒストグラムを作成するプログラム。
<実行例>
何人の身長を入力しますか? 4
1人目の身長143
2人目の身長186
3人目の身長203
4人目の身長183
140<=x<150 : * 1名
180<=x<190 : ** 2名
200<=x<210 : * 1名
[3] 環境
[3.1] OS:Linux
[3.2] コンパイラ(バージョン):cc
[3.3] 言語:C言語
[4] 期限:なるべく早めに・・・
[5] 制限など:習った場所は、変数宣言、条件文(for if while)、配列(数配列)、
関数です。
お願いしますm(_ _)m
596 :
594:2005/06/01(水) 19:49:23
>>244さんのPutSterというのと、continueはよくわかりません・・・
初心者なのですみません。
597 :
594:2005/06/01(水) 20:09:19
598 :
工大花子:2005/06/01(水) 21:00:08
[1] 授業単元: コンピュータ
[2] 問題文(含コード&リンク): 3角形の3辺の長さa,b,cを与えて、面積areaを求める関数を作れ。ただしs=(a+b+c)/2として、area=s(s-a)(s-b)(s-c)の平方根である。
[3] 環境
[3.1] OS:Windowsxp
[3.2] コンパイラ(バージョン):
[3.3] 言語:C
[4] 期限:2005年6月1日24:00まで
[5] その他の制限:よろしくお願いします
【授業単元】C++
【問題文】
電卓を作成する。データ取り込みは標準入力(キーボード)
ー使用可能関数ー
文字列から数値への変換 double atof(char*)<stdlib.h>
べき乗double pow(double x, double y)<math.h>
文字列の比較 int strcmp(char*, char*) <string.h>
数字か否か int isdigit(unsigned int c)<ctype.h>
[3] 環境
[3.1] OS:WinXP
[3.2] コンパイラ(バージョン):VC6.0
[3.3] 言語:C++
[4] 期限:本日中にお願いします
[5] 制限など:自分で書いてみたらこのような感じになりました
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/489.txt 問題点1:一部の制御部分の行い方がわからなくなりました。
2:エラー個所をコンパイルしないようにしたのですが、処理が行われて
いないみたいです。どのようにすれば直るのかよろしくお願いします。
>>598 一応、問題文どおりに作ってみた。
#include<stdio.h>
#include<math.h>
main(){
double a, b, c, s, area;
printf("3辺の長さを入力してください\n");
printf("a =");
scanf("%lf",&a);
printf("b =");
scanf("%lf",&b);
printf("c =");
scanf("%lf",&c);
s = (a+b+c) / 2;
area = sqrt( s * (s-a) * (s-b) * (s-c));
printf("入力された三角形の面積は%fです。\n",area);
}
5秒に一回時間を表示する関数を作ってください
>>599 ぱっと見。
;忘れ、{}の整合性崩れ、returnしてない
グローバル変数と同じ変数
関数宣言ねぇ。
605 :
604:2005/06/01(水) 23:13:03
>>601 DisplayTimeEveryFiveSeconds がその関数。
当たり前だが滅多なことでは終了しないプログラムだ
#include <time.h>
#include <stdio.h>
int Sleep(double second) {
time_t start, end;
if ((start = time(NULL)) == (time_t)-1) return 0;
do {
if ((end = time(NULL)) == (time_t)-1) return 0;
} while (difftime(end, start) < second);
return 1;
}
int DisplayTimeEveryFiveSeconds(void) {
time_t t;
while ((t = time(NULL)) != (time_t)-1) {
puts(ctime(&t));
if (!Sleep(5)) return 0;
}
return 1;
}
int main(void) {
return !DisplayTimeEveryFiveSeconds();
}
606 :
デフォルトの名無しさん:2005/06/01(水) 23:18:21
608 :
544:2005/06/02(木) 00:36:53
>>545 >>546 >>548 皆さんありがとうございます!!
とりあえず、言われたとおり引数をポインタ型にしたところ
コンパイル時には問題なかったのですが、実行するとcore dumpしてしまいます。
他に不都合な点はないでしょうか…
609 :
542:2005/06/02(木) 00:38:08
間違った…544じゃなくて542でした…
>>542 せっかくcore吐いてるんならstack trace見ればいいのに。
ま、まじめに読んでねーけど
1) pが最初に初期化されてない(不定)のまま使われてる
2) 最初にmalloc()したheadのnextポインタの値が不定のままになる
ってとこじゃねーかな。あやしいのは。
>>544 >>608 >>610 最初のheadは使われてないから、最初のmalloc()の後にでもp = headとかしたらいい。
insert()をrを返すようにして、それをpでうけるようにしたら、
ループが回る度にpが最新のノードをさすようになる。
p = insert(string, p , head); headを引数にする必要はないと思うけど。
最初にp = headにすれば、pがNULLになるときがないから。
あと、insert()のr->nextは次のノードがないうちは空なんだからNULLを代入した方がいい。
[1] 授業単元: プログラミング基礎
[2] 問題文(含コード&リンク): あらかじめテキスト化された音声信号のファイル「data.txt」をリダイレクトで入力し
波形として描画するプログラムを作成せよ。
グラフィックウィンドウを簡単に書くためのヘッダファイルが用意されているのでそれを使うこと。
[3] 環境
[3.1] OS:Solaris8
[3.2] コンパイラ(バージョン):gcc
[3.3] 言語:C
[4] 期限:2005年06月04日まで
具体的なソースというよりは波形として描画するというのがよくわかりません
テキスト化された音声信号のファイル「deta.txt」は
-1
7
7
-1
0
-2
-2
0
0
2
2
こんな感じで書かれており全部で10020行あります。
この数字の意味もイマイチよくわかりません12kHzでサンプリングされた音声信号をテキスト化したものだそうです。
グラフィックウィンドウを簡単に書くためのヘッダファイルというのはどうやら先生が自作したらしく
点を打ったり、線を引いたり、円を書いたりということが簡単にできるようになっています。
X軸を時間軸、Y軸をdata.txtの内容軸としてグラフをつくればいいんですかね
信号処理のことも勉強したことないのでよくわからないんですが
アドバイスよろしくお願いします。
615 :
デフォルトの名無しさん:2005/06/02(木) 03:10:22
>>610 >>612 >>613 返信ありがとうございます!!
とりあえず、家の環境ではリダイレクションが行えないので今日でも学校でやってみたいと思います。
あと先生にメールで質問したところ、以下のようなプログラムを作るうえでのヒント(?)をもらいました。
1. まず,単語を格納する領域(以下単語格納領域)と次のデータへのポインタ(次ポインタ)を持つリスト構造を構造体で宣言する.
2. 1単語分のリスト構造体データをmalloc関数で確保する。
3. readword関数を使って1単語を読み込み,リスト構造体データの単語格納領域に保存する.
4. 1単語分の構造体データをリストの末尾に連結する.つまり,末尾データの次ポインタを追加するリスト構造体データへのアドレスに更新する.
追加されたデータの次ポインタはnullにしておく.このようにnullポインタを使うことで末尾データの目印にしておく.
なお,リスト先頭データのアドレスは,ポインター型変数headに記憶させておく.
5. 2.〜 5. の処理を繰り返し行い、単語がすべて読み込まれたら6.に行く.
6. リストの先頭から終わりまで単語を表示する。
もしかしたら最初に書いたプログラムは自分の知識が乏しいまま書いたため、この条件にあっていないようなプログラム
(特にheadに記憶させるところとか)
になっているかもしれません…大幅な改変が必要なのかもしれませんが引き続き宜しくお願いします。
>>614 はあ。まあ当然ながらそのヘッダファイルとやらがないと何も出来ないわな。
617 :
614:2005/06/02(木) 09:33:41
>>617 >X軸を時間軸、Y軸をdata.txtの内容軸としてグラフをつくればいいんですかね
その通り。とりあえず作って味噌。
ポイントだけならこんな感じになるべさ。
□■■□□□□□□□□
□□□□□□□□□□□
□□□□□□□□□□□
□□□□□□□□□□□
□□□□□□□□□□□
□□□□□□□□□■■
□□□□□□□□□□□
○○○○●○○●●○○ 0
■□□■□□□□□□□
□□□□□■■□□□□
→時間軸(データ行)
↑信号Lv(データ値)
619 :
デフォルトの名無しさん:2005/06/02(木) 10:10:31
>>618 レスありがとうございます。
なるほどやはりそういうことでしたか
音声の波形というとWindowsの録音ツールにあるような波をイメージしていたので
本当にこの考え方でいいのかなーと不安に思っていたので安心しました。
あとはX軸、Y軸の間隔の幅を調整したりして見やすくなるようにすればいいわけですよね
自宅にSolarisがないんで簡単に試せないのが痛いところです;;
WindowsやらLinuxやらで出来たらいいんですけど。。。
アドバイスありがとうございました。
またつまづいたらよろしくおねがいしますm(__)m
>>615 リダイレクションが行えない環境ってどんなだ?
コマンドプロンプトでいくらでもできると思うのだが?
622 :
デフォルトの名無しさん:2005/06/02(木) 11:31:37
[1] 授業単元: C++
[2] 問題文(含コード&リンク): 要素10の配列があり。1〜10の数値で初期化
同一配列中で右に一つずつシフトするプログラム
を作成せよ。
0 1 2 3 ・・・ 9
↓
9 0 1 2 ・・・ 8
↑の様な感じです。
[3] 環境
[3.1] OS:Windows
[3.2] コンパイラ(バージョン): Visual C++
[3.3] 言語:C++
[4] 期限:できれば今日中に
[5] その他の制限:配列まで習いました。
よろしくお願いします。
>>622 int dim[10]={0,1,2,3,4,5,6,7,8,9};
const int stock=dim[0];
for(int i=0;i<9;dim[i]=dim[i+++1]);
dim[i]=stock;
1 〜 10 で初期化じゃないのか?
あっ、1〜10だった。
>>623 > i+++1
初心者相手に、この書き方はあんまりじゃないか?
>>623 それ右じゃなくて左
正しくはこうだな。
int dim[10]={1,2,3,4,5,6,7,8,9,10};
const int stock = dim[9];
for(int i=9;i>0;dim[i]=dim[i---1]);
dim[i]=stock;
>>623 dim[i] = stock;
のところ。すでにiは無効だな。
(VC++では有効なのかもしれんが、バグだろ)
const int stok = dim[0];
これもマズ。1度しかシフト(ローテートだと思うが・・)できんやん。
>>622 問題は
要素10の配列があり。1〜10の数値で初期化
実例は
0 1 2 3 ・・・ 9
↓
9 0 1 2 ・・・ 8
このうっかりさんがー
>>629 「の様な感じです。」って書いてある。
「こうしてくれ」ではない。
631 :
692:2005/06/02(木) 13:14:31
漏れがうっかりさんだったかorz
692はうっかりさんなはず
634 :
デフォルトの名無しさん:2005/06/02(木) 13:36:38
[1] 授業単元:プログラミング演習I
[2] 問題文:
<3平方の定理が成り立つ組み合わせ>
キーボードから整数値 N を与えてもらい
a = 1〜N, b = 1〜N, c = 1〜N の範囲内で
a(2乗)+b(2乗)= c(2乗)
が成り立つ組み合わせを全て表示させなさい。
[3] 環境
[3.1] OS:Linux
[3.2] コンパイラ(バージョン):gcc
[3.3] 言語:C
[4] 期限:6/7まで
[5] その他の制限:制御構造(条件分岐と繰り返し)まで
2乗の部分はa2とかになって表示できないので、(2乗)としています。
自分ではいくら考えてみてもわからないので、
どなたかご教授お願いします。
unsigned int a, b, c ;
for ( a = 1; a <= N; a++)
for ( b = 1; b <= N; b++)
for ( c = 1; c <= N; c++)
if ( a*a + b*b == c*c)
printf("a == %d, b == %d, c == %d", a, b, c) ;
int N;
int a;
int b;
int c;
double Cdush;
N = 100;
for ( a = 1; a <= N; a++ ) {
for ( b = a; b <= N; b++ ) {
Cdush = ( double )a * ( double )a + ( double )b * ( double )b;
c = ( int )sqrt( Cdush );
if ( c > N ) break;
if ( Cdush == ( double )c * ( double )c ) {
printf( "a = %d, b = %d, c = %d\n", a, b, c );
}
}
}
637 :
デフォルトの名無しさん:2005/06/02(木) 13:58:35
>>611 ありがとうございます。
これちょっと勉強します。
638 :
634:2005/06/02(木) 14:04:33
>>635 >>636 早速のレスありがとうございます。
言い忘れてたのですが、
最初の部分は
#include <stdio.h>
int main (void)
{
で始めてください。
せっかく書いてくれたのに申し訳ありません。
よろしくお願いします。
[1] 授業単元: 基本プログラミング
[2] 問題文:
正の整数地を読み込み、その段数(1〜10)のピラミッドを表示するプログラムを作成せよ
ただし、if、switch文は使用せず、メインの繰り返しにはfor文を使用すること(他の処理で使う分にはかまわない)
また、範囲外の段数を入力した場合には”指定された段数は処理できません”と表示してプログラムを完了すること
実行例:
段数を入力してください:3
*
***
*****
段数を入力してください:12
指定された段数は処理できません
[3] 環境
[3.1] OS:unix(emacs)
[3.2] コンパイラ(バージョン):不明
[3.3] 言語:C++
[4] 期限:2005年6月3日9:00まで
[5] その他の制限:forまで習っています。あと書き出しは#include<iostream>です。
forを三回使うのかな…以外はまったくわからないので何方かご教授のほどをお願いします。
そーいや、ぼーよーセンセの本にそんな問題があったと思うが・・・
最近のヤツはiostream.hからiostreamに変更されとるんか?
>>634 <math.h>が使えない様子なので修正。
#include <stdio.h>
int main( void )
{
unsigned int N;
unsigned int a, b, c;
unsigned int AnsA, AnsB;
do {
printf( "N ( 1 ~ 46340 ) = ?" );
scanf( "%d", &N );
} while ( N < 1 || 46340 < N ) ;
for ( a = 1; a <= N; a++ ) {
for ( b = a + 1; b <= N; b++ ) {
AnsA = a * a + b * b;
for ( c = b + 1; c <= N; c++ ) {
AnsB = c * c;
if ( AnsA == AnsB ) printf("a = %d, b = %d, c = %d\n", a, b, c );
if ( AnsA <= AnsB ) break;
}
}
}
return ( 0 );
}
>>640 void
DrawPyramid(unsigned int n){
if(n==0 || n>10){
std::cout<<"指定された段数は処理できません"<<std::endl;
return;
}
unsigned inti=0;
for(i=0;i<n;++i){
std::cout<<"\n";
const unsigned int space = n-i-1,ass=i*2+1;
unsigned int k;
for(k=0;k<space;++k)
std::cout<<' ';
for(k=0;k<ass;++k)
std::cout<<'*';
}
std::cout<<std::endl;
}
#include <iostream>
using namespace std;
int main()
{
int num, cnt = 1, spaces;
cout << "段数を入力してください:";
cin >> num;
if (num > 10 || num < 1){
cout << "指定された段数は処理できません\n";
} else {
spaces = num - 1;
for (int i = 1; i <= num; i++){
for (int k = 1; k <= spaces; k++) cout << " ";
for (int j = 1; j <= cnt; j++) cout << "*";
cnt += 2;
spaces --;
putchar('\n');
}
}
return 0;
}
ありゃ被った
リロードし忘れた
646 :
デフォルトの名無しさん:2005/06/02(木) 15:50:01
>>643-644 素早い回答ありがとうございます!
分からないところが何カ所かあるけど頑張って調べてみます。
>>641 >最近のヤツはiostream.hからiostreamに変更されとるんか?
iostreamが標準で、iostream.hは互換性のために残されてる古い形式という形だったはず
規格に合わせて、本が改稿されているか? ということを聞きたかったのだが。
>>648 主語ぐらいきちんと書こうな
人に聞く前に自分で立ち読みしに行って確認しろ
恵まれた土地に住んでるなぁ。
うちの周りじゃプログラミングの本はそんなに無いな。
>>640 #include <iostream>
#include <string>
#include <iomanip>
int main()
{
int n;
std::cout << "段数を入力してください:";
std::cin >> n;
for (; 0 < n && n <= 10; )
{
for (int i = 1; i <= n; ++i)
std::cout << std::setw(n + i - 1) << std::string(std::string::size_type(2 * i - 1), '*') << std::endl;
std::cout << "段数を入力してください:";
std::cin >> n;
}
std::cout << "指定された段数は処理できません";
}
652 :
デフォルトの名無しさん:2005/06/02(木) 19:04:30
[1] 授業単元: 文字列とポインタ
[2] 問題文(含コード&リンク):
課題1 scanf() 関数で、int 型の変数は & をつけなければならないのに、文字列は & をつけないのはなぜですか? 下記のプログラムを例にして解説してください。また 下記のプログラムで ss ヘ入力するのは間違いです。なぜ間違いなのか解説してください。
#include <stdio.h>
int main()
{
int n;
char s[100];
char *ss;
scanf( "%d", &n); /* int 型では & をつける */
scanf( "%s", s); /* 文字列では & をつけない */
scanf( "%s", ss); /* なぜ誤り? */
...
}
653 :
デフォルトの名無しさん:2005/06/02(木) 19:06:25
上の続き
課題2-1 下記のプログラムは正しいプログラムですが
/* Prog. A */
#include <stdio.h>
int main()
{
char s[6]="Hello";
char *ss;
ss=s;
printf("%s\n", ss);
}
下記のプログラムは誤りです。
/* Prog. B */
#include <stdio.h>
int main()
{
char s[6];
char *ss;
ss="Hello";
s=ss;
printf("%s\n", s);
}
その理由を解説してください。
[3] 環境
[3.1] OS:Linux [3.2] コンパイラ(バージョン): 不明 [3.3] 言語:C
[4] 期限:明日
>>652 答えても良いけど、これが理解できないならこの先授業について行けまい。
それでも構わないなら答えよう・・・、この先もこのスレで答えて貰える確実性は無いが。
656 :
デフォルトの名無しさん:2005/06/02(木) 19:15:20
>>655 お願いします、明日までにレポートにして提出しないといけないのでosz
>>655 教えてあげればいいじゃん。
解説付けてあげればいいじゃん。
お前のやっていることは単なる怠惰か嫌がらせだって知ってる?
どうせ、答えない事が質問者の為になる、とか言うんだろうけど実際にはそんなこと無いんだよねぇ。
初心者のボクが答えるとこうなる
課題1
scanf( "%d", &n); アドレスを渡している
scanf( "%s", s); アドレスを渡している
scanf( "%s", ss); ポインタを渡している
課題2
#include <stdio.h>
int main()
{
char s[6];
char *ss;
ss="Hello"; これでは初期化できない
s=ss; アドレスをポインタに代入すべきなのに逆になっている
printf("%s\n", s); 配列のアドレスを渡している。ポインタを宣言している意味がない。
}
>>658 その論理は課題1で
int n, *p = &n;
scanf("%d", p); ポインタを渡している
となって破綻する。
課題2
ss="Hello"; 初期化ではないが、"Hello"という文字列リテラルの先頭
アドレスをポインタに代入するので(式としては)妥当
なのでコメントがおかしい。それから、「意味がない」ことと「誤りである」と
いうことは全く異なる。
/* Prog. A */ では
char s[6]="Hello";
/* Prog. B */ では
char s[6];
char *ss;
ss="Hello";
とやってるから
初期化したいのだろうという意を汲み取って
「ss="Hello"; これでは初期化できない 」
と書きますた
>>652 scanf("%s", ss);
が誤りなのは、ポインタssの値が不定だから。
scanf()は、引数として渡されたアドレスに解析結果を書き込む。
よって、引数としては、変数のアドレスなり配列のアドレスなり
malloc()された領域のアドレスなり、要するに書き込み可能な
領域をちゃんと指しているアドレスを渡さなければならない。
>>653 s = ss;
が間違っている。Cでは配列に対する代入はできない。
初期化では
char s[6] = "hello";
のように書くことが可能だが、代入と初期化は異なる。
662 :
デフォルトの名無しさん:2005/06/02(木) 19:41:23
>>652 まずメモリ確保の面から見ると
int n; /* int変数 1個分のメモリが確保されている。 */
char s[100]; /* char変数 100個分のメモリが確保されている。 */
char *ss; /* charへのポインタ変数 1個分のメモリが確保されている。 */
&n は int変数 n へのポインタ(先頭アドレス)
s は char変数 s[] へのポインタ(先頭アドレス)
ここで注意すべきは s は &s[0] と等価であるという事。
つまり、
scanf( "%s", s );
は
scanf( "%s", &s[0] );
と等価である。
scanf() の引数は格納すべき変数へのポインタ(先頭アドレス)である必要があるため、
ポインタ変数である ss はこのプログラム上では適切ではない。
ただし、
ss = s;
の様に、プログラム中にポインタ変数 ss に変数へのポインタを渡している場合は正しい使い方と言える。
1] 授業単元: C言語入門
[2]
[3]
[3.1] OS:UNIX
[3.2] fortran
[3.3] 言語:C言語
[4] 期限:6月5日
[5] その他の制限:基本的な数学関数まで。<math.h>。
e^x = 1 + x + (1/2!)x^2 + (1/3!)x^3 + ,,,,,+ (1/N!)x^N
問題文:
(上式のxの値を1次から5次の場合で展開し、)
(それぞれの次数の時にmath.hにあるexp関数で出した結果と比較してみる。)
xの値はファイルから入力するようにし、ファイルの最後になったら処理を終えるようにする。
xの値を書くファイルには、1行に一つの数字だけを書くようにしてみて下さい。
665 :
デフォルトの名無しさん:2005/06/02(木) 19:55:08
>>658-663 返信ありがとうございます、少しずつわかってきました。
ひとまずレポート仕上げちゃいます
>>664 [3.1] OS:UNIX
[3.2] fortran
[3.3] 言語:C言語
ワケワカンネ
>>664 では
[3.1] OS:UNIX
[3.2] コンパイラ(バージョン):不明
[3.3] 言語:C言語
ごめん、訂正。
[3.2] コンパイラ(バージョン):g77(不明)
>>664 #include <stdio.h>
#include <math.h>
int main( int argc, char *argv[] )
{
char buff[256];
FILE *fp;
double val, result, col;
int count;
fp = fopen( argv[1], "r" );
printf( " x 1次 2次 3次 4次 5次 exp\n" );
while( fgets( buff, sizeof(buff), fp ) ){
sscanf( buff, "%lf", &val );
printf( "%e", val );
result = 1.0;
col = 1.0;
for( count=1; count<=5; count++ ){
col *= ( val / (double)count );
result += col;
printf( "\t%e", result );
}
printf( "\t%e\n", exp(val) );
}
fclose( fp );
return 0;
}
670 :
デフォルトの名無しさん:2005/06/03(金) 00:20:37
[1] 授業単元: プログラミング演習T
[2] 問題文:任意の長さの整数値を読み込み、グラフ化して表示することができるプログラムを作れ。
[3] 環境
[3.1] OS:Linux
[3.2] コンパイラ:gcc
[3.3] 言語:C
[4] 無期限
[5] その他の制限:ファイルの入力はリダイレクションを利用します。
課題用に400個ほどのデータファイルが用意されていてそれを使います。
今考えているのは読み込んだ数字をnとしてn回だけFor文で*を表示させるようにしてグラフにしようと思っているのですが
読み込むデータの長さが不定の場合、一次元配列に格納してあれこれやるという方法は避けた方がいいのでしょうか?
>>670 任意なのは整数の個数なのか、整数の長さなのか?
データは数字が羅列されているだけなのか、表題もあるのか?
微妙にわからんな。
例えばどういうデータファイルになるか
>>1のアップローダーにアップしてみてくれないか?
672 :
デフォルトの名無しさん:2005/06/03(金) 00:30:00
[1] 授業単元:計算機とアルゴリズム
[2] 問題文(含コード&リンク): 円の半径を入力し、面積と円周の長さを出力するプログラムを作れ。
なお、円周率πは#define文を用いて定数宣言を利用すること。
[3] 環境
[3.1] OS:Windows XP
[3.2] コンパイラ(バージョン):??
[3.3] 言語:C
[4] 期限:明日の午後の授業には提出です。
[5] その他の制限:大学に入って初めてプログラムを知り1時間習っただけの初心者です。
回答いただいても色々質問するかもしれませんがどうかよろしくお願いします。
>>672 #include <stdio.h>
#define PI 3.1415926535898
int main(void) {
double r;
printf("半径:"); scanf("%lf", &r);
printf("面積:%f\n円周:%f", PI * r * r, 2 * PI * r);
return 0;
}
675 :
672:2005/06/03(金) 01:00:46
>>673 ありがとうございます!
PIというのは初見なのですがどういう意味があるのですか?
あと最後のreturn 0の意味を教えていただけますか、申し訳ありません。
PIを見てπを指してるということが分からないアフォが一人
677 :
670:2005/06/03(金) 01:04:58
すいません気付くべきでした・・
あと、return 0はどういう意味があるんでしょうか?
mainの戻り値だろ
ついでなんで疑問に答えておくか。
PIは
>>676に書いたとおりπのこと。日本人がパイと書くようにローマ字(abcde…のこと)を
使う人がπのことを書くときに使う書き方。
ちなみにα,β,γ,δ→alpha, beta, gamma, delta
最後の return 0; は見た通りmain関数の戻り値が0ということ。
こんな課題程度なら値は何でもいいんだが、コンパイル後のプログラムを
使ってシェルプログラムを組む時とかに利用することもあるので、普通(エラー無し)は
0を返す習慣になってる。
>>678 まぁ、return 0は書かなくても一応動くけどな
まあ警告は出ようがコンパイルは通るし、「動く」ことには変わりはない
わなあ。
この程度のおもちゃプログラムの返り値をシェルから見て何かに利用することなど
無いし、まさにどうでもいい話だ。
>>670 (固定長の)1次元配列を使う方法が素直だと思う。
・いったんメモリに読み込む
・max,minを得る
・グラフの幅とmax,minから(縮小)率を決める。
・for文で出力
ってな具合だろうけれども。
固定長の配列が嫌ならメモリの動的確保(malloc, realloc)を使うとか。
686 :
671:2005/06/03(金) 02:34:21
687 :
670:2005/06/03(金) 03:09:26
>>685さん
>>686さん
ありがとうございます!
686さんのソースを見させてもらったんですが
まだまだ勉強不足な私には理解するのに時間が掛かりそうです。
Lv1のキャラがいきなりLv50で装備できるようになる武器を
裏技で装備してしまったような感じでw
初心者の癖にこんな大作を提出すると怒られそうなんで
まずは理解できるように頑張ろうと思います。
685さんの仰るとおりに固定長の一次元配列を使ってみようと思います
任意の長さの整数値を取り扱えるようにしたいので
最初にLinuxのコマンドで行数を調べてその都度書き換えてコンパイルしなおせば
一応任意の長さに対応できるということになると思うのでw
malloc,やreallocも試してみたいのですがまだポインタがあまり理解できていないので
今回はやめておきます
お二人ともアドバイスありがとうございました!
>>688 X と Y の二次元配列を 0 で初期化。
(どのくらいの大きさなら良いかはInputを読んで計算すれば判る)
点から半径1.0の円の範囲内の配列に +1 していく。
最大値を表示する。
690 :
689:2005/06/03(金) 04:05:48
あ、ダメだ。計算したら配列が大きくなりすぎる。
二点は周上にあるとしてよい。そのような高々 2*nC2 通りの円に対してしらみつぶしする
とか言ってみるテスト。Cのソースは書けません。
693 :
688:2005/06/03(金) 08:22:33
>>692 おぉ、こんなサイトが!悲しいけど参考にします
考えてくれた方ありがとうございました(;´д⊂)
>>670 >>687 >最初にLinuxのコマンドで行数を調べてその都度書き換えてコンパイルしなおせば
>一応任意の長さに対応できるということになると思うのでw
なんかややこしいこと考えてるなぁ。
動くかしらんけど。
>>573 ってのもあるな。
for (i = 0; i < n && fscanf(fp, "%d", buf) == 1; i++, buf++)
↓
for (i = 0; i < n; && fscanf(fp, "%d", &buf[i]) == 1; i++)
とでもしとけば、ポインタ使わんで済むだろう。
695 :
デフォルトの名無しさん:2005/06/03(金) 19:11:13
[1] 授業単元: 情報処理演習
[2] 問題文(含コード&リンク): 10進数で入力した値を、n(2〜9)進数に変換するプログラムをお願いします。
[3] 環境
[3.1] OS:Windows/Linux/等々 WindowsXP
[3.2] コンパイラ(バージョン): gcc
[3.3] 言語:C/C++/どちらでも可 のいずれか C
[4] 期限:yyyy年mm月dd日hh:mmまで または 無期限 のいずれか 6月5日まで
>>695 #include <stdio.h>
char* to_base_n(int x, char* s, int n) {
int index = 0;
do {
s[index++] = x % n + '0';
x /= n;
} while (x);
s[index--] = '\0';
int left = 0;
while (left < index) {
char temp = s[left];
s[left] = s[index];
s[index] = temp;
++left;
--index;
}
return s;
}
int main(void) {
int x, i;
char s[128];
printf("数:"); scanf("%d", &x);
for (i = 2; i < 10; i++)
printf("%d進数:%s\n", i, to_base_n(x, s, i));
return 0;
}
697 :
デフォルトの名無しさん:2005/06/03(金) 20:17:40
[1] 授業単元: C言語入門
[2] e^x = 1 + x + (1/2!)x^2 + (1/3!)x^3 + ,,,,,+ (1/N!)x^N
(上式のxの値を1次から5次の場合で展開し、)
(それぞれの次数の時にmath.hにあるexp関数で出した結果と比較してみる。)
xの値はファイルから入力するようにし、ファイルの最後になったら処理を終えるようにする。
xの値を書くファイルには、1行に一つの数字だけを書くようにしてみて下さい。
[3]
[3.1] OS:UNIX
[3.2] コンパイラ:gcc(gcc Developer Station 2000 Version 1.1.2.7)
[3.3] 言語:C言語
[4] 期限:6月5日
[5]その他の制限:基本的な数学関数まで。<math.h>。
664で書き込みしたものです。
詳細が分かったので、再度書き込みました。
668でなぜか自演されました。
>>669 ありがとうございます。
コンパイルできたのですが、セグメント例外(core dumped)と表示され、
プログラムを実行することができませんでした。
それと、今やっている授業内容と比べてこれは難しいプログラムでした。
教えてもらう側で心苦しいのですが、簡単になりませんでしょうか。
700 :
デフォルトの名無しさん:2005/06/03(金) 23:45:39
バイナリー→テキスト変換する。
Cでやる方法を教えてください
>>700 int を char* にしたいなら ltoa とか sprintf とか
>>698 プログラムの引数にxの値の入ったファイル名を指定すること。
(例)
program xdata.txt
どこが難しいのか具体的に書くこと。
[1] 授業単元: 基礎プログラミングU
[2] 問題文):
f(x)=|cos(x)|を一周期積分しなさい。
[3] 環境
[3.1] OS:Windows2000
[3.2] コンパイラ(バージョン): Visual C++ Standard6.0
[3.3] 言語:C++
[4] 期限:6月4日夕方
[5] その他の制限:
ありません。とにかくC++で動くものができればOKです。
一応、シンプソンの公式推奨、とのことです。
>>704 main(int argc,char **argv)
{
printf("4\n");
}
【質問テンプレ】
[1] 授業単元: C言語
[2] 問題文(含コード&リンク): 1+1 の結果を出力せよ。
[3] 環境
[3.1] OS:Windows XP
[3.2] コンパイラ(バージョン): VC++2003
[3.3] 言語:C++
[4] 期限:2005年06月04日05:10まで
[5] その他の制限:特になし
よろしくお願いします。
>>702 ちなみに _itoa() は非標準な。
>>706 #include <stdio.h>
int main(){
printf("10");
}
709 :
デフォルトの名無しさん:2005/06/04(土) 10:35:50
バイナリ「2010200B100101」をアスキー「 」で表示させて
アスキー「 」を「2010200B100101」にもどして表示する。
要するに変換前「 」、変換後「2010200B100101」としたいです。
説明が下手ですいません。どなたかおしえてください。
>>704 暇つぶしに書いてみた。あれ、「一周期」ってゼロからパイまで?絶対値ついてるしな・・・。
まー適宜なおして。
#include <iostream>
using namespace std;
double simpson(double a, double b, int n, double (* pf)(double));
double f(double x);
int main()
{
const int M = 1000000;
cout << simpson(0, 2*M_PI, M, f) << endl;
return 0;
}
double simpson(double a, double b, int m, double (* pf)(double))
{
int n = 2 * m;
double d = (b - a) / n;
double sum = pf(a);
double x = a;
for (int i = 1; i < n; i ++)
{
x += d;
sum += (i & 1 ? 4 : 2) * pf(x);
}
sum += pf(b);
return sum * d / 3;
}
double f(double x)
{
return fabs(cos(x));
}
適宜,対応.
[1] 授業単元: C言語
[2] 問題文(含コード&リンク): 配列に1から1000までのデ‐タを格納し100ごとに表示させよ、
このとき1から100まで101から200まで、、、
という風に現在どの部分表示しているか解るように工夫せよ。
[3] 環境
[3.1] OS:Linux
[3.2] コンパイラ(バージョン):gcc
[3.3] 言語:C
[4] 期限: 無期限
とりあえず1から1000を格納して100ずつ表示するというのは出来るのですが
現在どこを表示しているのかを解るようにする方法がわかりません。
715 :
デフォルトの名無しさん:2005/06/04(土) 12:55:39
誰よりも大きな数を言った奴が勝ち
717 :
716:2005/06/04(土) 13:31:57
あ、わかった。
>とりあえず1から1000を格納して100ずつ表示するというのは出来るのですが
>現在どこを表示しているのかを解るようにする方法がわかりません。
出来てるところまで書いて。
>>714 こんなかんじ?
#include <stdio.h>
#include <stdlib.h>
#define MAX_NUM 1000
#define PRINT_NUM 100
int a[MAX_NUM];
int main()
{
int begin, end,i, cnt;
char buf[256];
for(i = 0; i < MAX_NUM; i++) a[i] = i+1;
for(;;)
{
printf("\n開始番号を入力 (-1で終了) > ");
begin = atoi(fgets(buf, sizeof(buf), stdin));
if( begin == -1 ) break;
if( begin < 1 || begin > MAX_NUM)
{
puts("\n<< 入力エラー >>");
continue;
}
end = begin + PRINT_NUM - 1;
if( end > MAX_NUM ) end = MAX_NUM;
printf("\n[ %d - %d ]\n", begin, end);
for(i = begin - 1, cnt = 0; i != end; ++i, ++cnt )
printf("%d%c", a[i], cnt % 10==9 ? '\n' : ' ');
}
return 0;
}
>>714 for ( i = 0; i < 1000; ) {
printf( "%d ~ %d\n", i, i + 99 );
do printf( "%d\t", a[i]++ ); while ( i % 100 != 0 );
getch();
}
721 :
720:2005/06/04(土) 14:05:52
間違った・・・、ま、いっか。
>>715 3→3→3→3(Chained Arrow Notation)
723 :
714:2005/06/04(土) 14:42:06
#include <stdio.h>
int main()
{
int data[1000];
int x, y, c1, c2;
for(x = 1; x <= 1000; x++){
data[x] = x;
}
c1 = 1;
c2 = 10;
for(x = 1; x <= 100; x++){
for(y = c1; y <= c2; y++){
printf("%4d", data[y]);
}
printf("\n");
c1 = c2;
c2 = c2+10;
}
return 0;
}
こんな感じです スマートじゃないかもしれませんが^^;
例えばchar型の配列に"x から yまで"と入れてxとyの部分にc1とc2の内容を入れて表示するってのは可能なんでしょうか
えーっと。要点だけ。
int data[1000 + 1];
for(x = 1; x <= 100; x++){
printf("%d - %d: ", c1, c2);
for(y = c1; y <= c2; y++){
printf("%4d", data[y]);
}
>>711 ありがとうございます。
一部間違いありましたが、ちょっと手直ししたらちゃんとうごいたっぽいです。
ありがとうございました!
#include <stdio.h>
int main(){
printf("田");
}
>>766 #include <stdio.h>
#include <string.h>
#include <stdlib.h>
int dataIndex;
int main(void){
char buffer[1024];
char **Data;
int i, max;
dataIndex = 0;
printf("How many data do you input? ->");
scanf("%d", &max);
Data = (char **)malloc(max*sizeof(char *));
while( dataIndex < max) {
scanf( "%s" , buffer );
if ( strcmp( "end" , buffer ) == 0 ) break;
Data[dataIndex] = (char *)malloc((strlen(buffer) + 1) * sizeof(char));
strcpy(Data[dataIndex], buffer);
dataIndex = dataIndex + 1;
}
printf( "----\n" );
for ( i = 0 ; i < dataIndex ; i++ ) {
printf( "%s\n" , Data[i] );
free(Data[i]);
}
free(Data);
return 0;
}
729 :
デフォルトの名無しさん:2005/06/04(土) 21:38:19
[1] 授業単元:C言語
[2] 問題文(含コード&リンク):学籍番号(3桁)と点数を学籍番号000が入力
されるまで読み込み、最高点の人の点数と学籍番号、最低点の人の点数と学籍
番号、および全員の平均点を表示しなさい。最高点、最低点が同じ人が複数いた
場合、一人だけ出力すればよい。
[3] 環境
[3.1] OS:Linux
[3.2] コンパイラ(バージョン):gcc
[3.3] 言語:C
[4] 期限: 無期限
730 :
デフォルトの名無しさん:2005/06/04(土) 21:42:43
[1] 授業単元: 情報処理演習(初級)
[2] 問題文(含コード&リンク):二つの整数を入力し、小さい方の数以上
で大きい方の数以下の整数をすべて加えた値を表示しなさい。
[3] 環境
[3.1] OS:Linux
[3.2] コンパイラ(バージョン):gcc
[3.3] 言語:C
[4] 期限: 無期限
732 :
デフォルトの名無しさん:2005/06/04(土) 22:22:02
>>731 おお、有難う御座います!!
助かりましたm(_ _)m
734 :
デフォルトの名無しさん:2005/06/04(土) 22:53:14
KMP法での一致検索でパターンテーブル作るんだけど
まず,pattern に対して以下のように情報を収集して next[i] (1 ≦ i ≦ pattern_len) という配列を作る:
1 ≦ i ≦ pattern_len に対して,0 ≦ j ≦ i - 2 の範囲で j を動かして,
pattern[0] 〜 pattern[j] と pattern[i - 1 - j] 〜 pattern[i - 1] が完全に一致するようなできるだけ大きい j を選んで,next[i] = j + 1とする.
そのような j が無いときは,next[i] = 0 とする.
どういう事やってるの?
[1] 授業単元:VCプログラミング
[2] 問題文(含コード&リンク):
起動中である自己プログラムのCRC、又はMD5値を取得し
CRC、MD5値が"111111"で無い場合、自己プログラムを終了する関数を作りなさい。
CRC,MD5値はどちらか一方を選択する事。
[3] 環境
[3.1] OS:Windows
[3.2] コンパイラ(バージョン):VC++
[3.3] 言語:C 又は C++
[4] 期限: 一ヶ月以内
終了は解っているのですがCRCなどの取得が解りません。
APIを使うんじゃないか?と思って検索しておりますが見つからず
課題前にMSDNの使い方やネットでリフェンス(英語)を見る方法だったので
それで調べるのかと思ってますが見つかりません。お力をお貸し下さいませ。
>>730 #include <stdio.h>
int main( void )
{
int min, max, sum, counter;
scanf( "%d %d", &min, &max );
sum = 0;
for( counter=min; counter<=max; counter++ )
sum += counter;
printf( "%d %d %d\n", min, max, sum );
return 0;
}
738 :
デフォルトの名無しさん:2005/06/04(土) 23:39:06
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
main()
{
int n,r,hand;
printf("ジャンケンをします\nグーは0、チョキは1、パーは2を入力してください:");
scanf("&lf",&n);
srand(time(NULL));
r = rand();
hand=rand()%3;
if (n==hand) printf("\nコンピュータは %d\n引き分けです\n\n",hand);
else if (((n==0) && (hand==1)) || ((n==1) && (hand==2)) || ((n==2) && (hand==0)))
printf("\nコンピュータは %d\nあなたの勝ちです\n\n",hand);
else if (((n==0) && (hand==2)) || ((n==1) && (hand==0)) || ((n==2) && (hand==1)))
printf("\nコンピュータは %d\nあなたの負けです\n\n",hand);
}
これなんですが、0を入力したときはちゃんと動作するんですが、1と2を入力した時はおかしな答えが出てきてしまいます
どうしてでしょうか?
ifまでしかまだ習ってないんでそこをよろしくお願いします
すみません、自己解決しました
intなのにscanf("&lf",&n)って、なにやってんだ俺……
742 :
614:2005/06/05(日) 00:21:53
以前質問した
>>614です。
一応波形のように表示させることはできたんですが
ウィンドウが640x480なのにたいして与えられるデータ値が
+ー6800前後(Y軸)、データの量が10020個(X軸)と入りきらないという事態になりました
一応クリックする度に600個づつ表示出来るようにして10020個の問題はクリアしたつもりなのですが、
X軸、Y軸の間隔の調整方法でなにか良いアイディア在りませんでしょうか?
実際の大きさp:-6800〜+6800
画面の大きさv:0〜480(上下逆の場合は適宜変える)
v=(6800+p)*480/(+6800-(-6800))
v=(6800-p)*480/(+6800-(-6800))(逆)
vがintなら割る順序に気をつけるかdoubleに変換するか
試行錯誤すると。
744 :
デフォルトの名無しさん:2005/06/05(日) 09:54:39
[1] 授業単元: コンピュ‐タ初級
[2] 問題文: 繰り返し(for文 or while文) printf scanf if文
をすべて使って 自由にプログラムを完成させよ。
[3] 環境
[3.1] OS:Linux
[3.2] コンパイラ(バージョン):
[3.3] 言語:C
[4] 期限:6月8日
[5] その他の制限:for文まで習ってます。
>>744 あんた、昨日もどっかのスレにあげてなかった?
ちょっと自分でやってみ。
で、わからんとこを質問してみろ。
747 :
デフォルトの名無しさん:2005/06/05(日) 10:58:29
[1] 授業単元:
[2] 問題文(含コード&リンク): tの値を変化させていった時の、sin((2πf)t)の波形を出力する。fは任意。
[3] 環境
[3.1] OS:windows xp
[3.2] コンパイラ(バージョン):Visual C++ 6.0
[3.3] 言語:C
[4] 期限:2005/6/5
[5] その他の制限:
一応、以下のプログラムを書いて実行したのですが、一般的なsinカーブになりません。
出力はcsvファイルにして、Excelでグラフを描けるようにしたいのですが。
どうぞ、ご教授お願いいたします。
748 :
747:2005/06/05(日) 10:59:08
自分で書いてみたものです↓
#include <stdio.h>
#include <math.h>
#include <string.h>
main()
{
FILE *fp;
char fn[1000];
int i;
double D[1000],pi,f;
pi=3.1415;
f=10;
strcpy(fn,"sin.csv");
fp=fopen(fn,"w");
for(i=0 ; i<1000 ; i++)
{
D[i]=sin((2*pi*f)*i*0.1);
fprintf(fp,"%f\n",D[i]);
}
}
D[i]=sin((2*pi*f)*i*0.1);
↓
D[i]=sin(2*pi/f*i);
(fを周期と考えたとき)
または、
D[i]=sin(2*pi*1000/f*i);
(Dの長さを単位としてfを周波数と考えたとき)
750 :
747:2005/06/05(日) 11:14:10
>>749さん
ありがとうございます。
何だかできそうなのですが、
いまいち何が悪かったのか分かりません(汗)
何かご指摘がございましたら、教えてくださいませ。
751 :
614:2005/06/05(日) 11:41:42
>>743さん
>>746さん
レスありがとうございます。
>>743さんの式を使ってみたらうまくいきました。
ただこの式の効果というか仕組がよく理解できません
よかったら教えてもらえませんか?
あとはX軸をどうやって全体表示させるか考えようとおもいます
(課題の指示に全体を表示させるようにあったので)
>>746さんのいうとおり 何段かに別けるか、
一部無視してみたりいろいろためしてみようとおもいます。
>>751 目盛りが-6800〜6800まであるグラフを目盛り0〜479がある別のグラフに形を似せて書くとき、
どういう座標変換がされるかを考えるとよい。
>>735 『C言語による最新アルゴリズム辞典』で検索。
全ソースコードが引っかかるはず。
zip内のファイル名がcrcとか着いてるのを探せばいいんでないかい?
[1] 授業単元: 情報処理演習
[2] 問題文 :ユークリッドの互除法に従って2つの自然数の最大公約数を求めるプログラムを作成せよ。
[3] 環境
[3.1] OS:UNIX
[3.2] コンパイラ(バージョン): gcc
[3.3] 言語:C
[4] 期限:2005年6月6日
[5] その他の制限:C言語を習ってまだ1ヶ月で繰り返し処理までは習っています。
>>754 int gcd (int a, int b) {
if (b == 0) return a;
else {return gcd2 (b, a%b);}
}
×else {return gcd2 (b, a%b);}
○else {return gcd (b, a%b);}
int gcd(int a, int b)
{
int tmp;
if (a < 1 || b < 1)
return 0;
while (a % b != 0) {
tmp = a % b;
a = b;
b = tmp;
}
returm b;
}
また、このアルゴリズムをアセンブリで書けば高速。
int gcd (int a, int b) {
register int g, c, e = 0;
while (a&1 + b&1 == 0) {a = a
>>1; b = b
>>1; e++;}
while (a&1 == 0) a = a
>>1;
while (b&1 == 0) b = b
>>1;
while (b != 0 && b != 1) {
c = (a-b); c = c>=0?c:-c; // c = abs (a-b);
a = a>=b?b:a; // a = min (a, b);
b = c; while (b&1 == 0) b = b
>>1;
}
if (b == 0) g = a * power (2, e);
if (b == 1) g = power (2, e);
return g;
}
int power (int a, int b) {
int n = 1;
while (b) {if (b&1) n = n*a; b = b >> 1; a = a*a;}
return n;
}
760 :
なかじま:2005/06/05(日) 13:01:36
#include<stdio.h>
#define MAX 3
int main(void)
{
int num[MAX];
int cnt;
for(cnt=0; cnt<MAX; cnt++)
{
printf("Input number %d ",cnt+1);
scanf("%d",&num[cnt]);
}
for(cnt=MAX; cnt>0; cnt--)
{
printf("number %d(%06d)\n",cnt, num[cnt]);
}
return 0;
}
number1〜3まで入力して、numbe3から1の順で格納された値を表示するというプログラムなのですが、表示のときnumber3だけ入力していない4が表示されます。すいませんアドバイスください。
761 :
754:2005/06/05(日) 13:02:12
すいませんreturn文の使い方はプログラムの最後にreturn 0と書く
ということ以外は習ってないので良く分からないです。
>>761 関数というのは、値を入力して値を出力するものを言う。
return 〜というのは関数を終了して〜を出力するという意味。
関数の中ならどこで使っても良い。
763 :
754:2005/06/05(日) 13:10:45
>>762 ありがとうございます。なんとなく分かりました。
でも授業では習ってないので、return文を使わない
方法で
>>754の問題のプログラムを教えていただきたいですm(_ _)m
int gcd(int a, int b)
{
int tmp;
if (a >= 1 && b >= 1) {
while (a % b != 0) {
tmp = a % b;
a = b;
b = tmp;
}
}
returm b;
}
>>766 習ってないものを使うとインターネットから拾ってきたものだと怪しまれるからじゃない?
みんな厳しいなw
>>769 あー。プログラミングは独学のほうがレベル高いからなぁ。
学校の場合、よい教官にあたらんとな。
>>749 >D[i]=sin(2*pi*1000/f*i);
>(Dの長さを単位としてfを周波数と考えたとき)
おいおい、fが周波数ならこんな式にはならんだろう。
>>747=748
時間軸が短いだけじゃない?
>D[i]=sin((2*pi*f)*i*0.1);
の0.1をもっと小さい値(0.01〜0.05くらい?)にすれば
多分求めてる波形が出るはず。
エラーが出て宿題ができません。
d:\home>cl a.c
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.
a.c
コマンド ラインのエラー D2027 : '.\c2' を実行できませんでした。
なんでなんじゃー。ぐすん。
773 :
735:2005/06/05(日) 13:59:21
>753
見ました。FlashDLLより解りやすそうだったのですが
CRC**t と CRC** の違いが解りません。
tが付いてるファイルは何なのでしょうか?
>>773 >753ではないけど。
チェックサムでもCRCでもMD5でもいいんだけどさ、まずは
Validator = GetValidator(自己ファイル全体)
というところをk何が得たほうがよくね?
⊂ ヽ ミ ヽ ⊂ ヽ ミ ヽ ⊂ ヽ ミ ヽ ⊂ ヽ
\\ ∧_∧ ノノノ _∧ ノノノ _∧ ノノノ _∧
╋┏┓ \ ( ´∀`) ゚∋゚)´∀`) ゚∋゚)´∀`) ゚∋゚)´∀`)
┃┣┫━━> ⌒ヽ ⌒ヽ ⌒ヽ ⌒ヽ ⌒ヽ ⌒ヽ ⌒ヽ ━━┃┃┃
╋ ┃ / . へ \ へ \ へ \ へ \ へ \ へ \ へ \. ・ ・ ・
/ / \.\ \\ .\\ \\ \\ .\\ . \\
レ ノ ノヽ_つノ ヽ_ミ ヽ_つ ヽ_ミ ヽ_つ ヽ_ミ ヽ_つ
/ / / / / / / / / / / / / /
/ /| / /| / /| / /| / . /|/ /| / /|
777 :
デフォルトの名無しさん:2005/06/05(日) 14:09:40
まず,pattern に対して以下のように情報を収集して next[i] (1 ≦ i ≦ pattern_len) という配列を作る:
1 ≦ i ≦ pattern_len に対して,0 ≦ j ≦ i - 2 の範囲で j を動かして,pattern[0] 〜 pattern[j] と pattern[i - 1 - j] 〜 pattern[i - 1] が完全に一致するようなできるだけ大きい j を選んで,next[i] = j + 1とする.
そのような j が無いときは,next[i] = 0 とする.
KMP法のテーブル表を作るんだけど教えてください
ちと便乗。
>774
GetValidatorってMSDNに載ってないけどどうやって使う?
>>775 廃刊してたと思う。
【質問テンプレ】
[1] 授業単元: データ構造とアルゴリズム
[2] 問題文(含コード&リンク):スタックのpush,pop関数を連結リストで実現せよ
[3] 環境
[3.1] OS:Linux
[3.2] コンパイラ(バージョン):gcc
[3.3] 言語:C
[4] 期限:6月7日まで
[5] その他の制限:
連結リストを使ってpop,push関数をつくりスタックを実現せよという問題なのですが、
以下のプログラムを書いて実行すると、セグメントエラー(coreを出力しました)
とでて実行できません。
順に1,3,5をプッシュしてそのあとポップを実行する、というものです
あと同様にenqueue,dequeue関数をつくりキューを実現せよというものもあり
そちらもできれば教授お願いします。
よろしくお願いいたします。
#include<stdio.h>
#include<malloc.h>
struct LIST{
int data;
struct LIST *next;
};
struct LIST *head,*tail,*new;
void push(int x)
{
new=(struct LIST *)malloc(sizeof(struct LIST));
new->data=x;
new->next=head;
head=new;
}
int pop(void){
int x;
x=head->data;
head=head->next;
return(x);
}
int main(void){
tail=NULL;
head=NULL;
push(1); push(3); push(5);
printf("stack data={%d,%d,%d}\n",head->data,
head->next->data,head->next->next->data);
printf("output data(stack)=%d\n",pop());
return(0);
}
head=NULL;
小一時間(r
どこを見ているのかと小一時間(r
struct LIST *head,*tail,*new;
784 :
781:2005/06/05(日) 15:12:21
new->next=head;
と
head->next->data
head->next->next->data
なんてやってるからてっきりそうだと思ったんでつが。違ってたならスマソ
free してない以外は良さそう
んじゃ
new=(struct LIST *)malloc(sizeof(struct LIST));
に失敗したとか(w
Linux でコンパイル、実行してみたけど、core 吐かない。
$ ./a.out
stack data={5,3,1}
output data(stack)=5
$ gcc --version
gcc (GCC) 3.3.5-20050130 (Gentoo Linux 3.3.5.20050130-r1, ssp-3.3.5.20050130-1, pie-8.7.7.1)
以下略。
必死にあおってるヤシ。欲求不満か?
>>760 答えは簡単だからヒントを…
配列の格納をもう一度かんがえてみ
scanfの段階ではnum[0]から格納しているのに対して
入力された値を出力するところではnum[3]から出力しようとしてる
num[3]には何か値を入力してるか?
テキトーなこと言ってるので突っ込んだら煽ってるといわれましたw
795 :
789:2005/06/05(日) 16:14:53
freeしてないから、メモリが足りなくなった可能性ない?
>>796 ×(struct list)
○(struct list *)
798 :
& ◆.1WWo/rNig :2005/06/05(日) 16:48:35
[1] 授業単元:
[2] 問題文(含コード&リンク):
以下のようなプログラムを書け。
形式
コマンド名 モード 行数 ファイル...
機能
モード(8進数)で指定されたアクセス権でファイルを作成し、
その内容は、各行が%一文字のみからなり(すなわち、改行文字を含めて2
バイトからなり)、行数(10進数)で指定された行数のテキストとなるよ
うにする。ファイルは1個以上任意個指定できるものとする。 同名のファ
イルがすでに存在する場合はエラーとする。 指定されたファイルが複数
の場合で、処理の途中でエラーが発生した場合でも、未作成のファイル
があれば、処理を中断することなく残りのファイルを作成すること。
[3] 環境
[3.1] vineLinux最新版
[3.2] コンパイラ(バージョン):gcc
[3.3] 言語:C
[4] 期限:2005年6月5日24:00まで
[5] その他の制限:どこまで習っているか、等々
お願いいたします。
>>796 明日提出期限なのに、今から送って間に合うのか?
800 :
796:2005/06/05(日) 16:56:24
>>799 大丈夫やと思うんだがな
以前当日に出して間に合ったし
801 :
デフォルトの名無しさん:2005/06/05(日) 17:19:03
環境 OS XP
コンパイラ Microsoft.NET Framework SDK
ちょっとお尋ねしたいのですが、ファイルからデータa.datを読み込むプログラムで
ファイルの場所を、
fp = fopen("C:\Documents and Settings\Owner\My Documents\a.out","rt");
というふうに書いて実行すると、以下のようになってしまいます
yomikomi.c
yomikomi.c(12) : warning C4129: 'D' : エスケープ シーケンスとして正しく認識され
ませんでした。
yomikomi.c(12) : warning C4129: 'O' : エスケープ シーケンスとして正しく認識され
ませんでした。
yomikomi.c(12) : warning C4129: 'M' : エスケープ シーケンスとして正しく認識され
ませんでした。
正しくファイルの場所を記述するにはfp = fopen(" ","rt");の中身をどうすればよいのでしょうか?
>>798 #include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
int main( int argc, char *argv[] )
{
mode_t mode;
int line, fd, i, j;
sscanf( argv[1], "%o", &mode );
line = atoi( argv[2] );
for ( i = 3; i < argc; i++ ) {
if ( -1 == ( fd = open( argv[i], O_WRONLY | O_CREAT | O_EXCL, mode ) ) ) {
printf( "エラー %s\n", argv[i] );
} else {
for ( j = 0; j < line; j++ ) {
write( fd, "%\n", 2 );
}
close( fd );
}
}
}
805 :
801:2005/06/05(日) 17:41:51
>>802 こういうことでしょうか?
fp = fopen("C:\\Documents and Settings\\Owner\\My Documents\\a.dat","rt");
if (fp==NULL){
printf("Error: File not found.\n");
exit(1);
}
しかし実行してもエラーになってしまうのですが・・・
a.datも確かにマイドキュメントの中です。
C:\Documents and Settings\Owner\My Documents>yomikomi.exe
Error: File not found.
ヒント
フォルダ名にスペースがある
807 :
801:2005/06/05(日) 18:02:16
"C:\\Documents and Settings\\Owner\\My Documents\\a.dat"
"C:\\DocumentsandSettings\\Owner\\MyDocuments\\a.dat"
"C:\\DocumentsandSettings\\Owner\\MyDocuments\a.dat"
破れかぶれで色々試していますが、一向にファイルが読み込めません(ノД`)
"\"C:\\Documents and Settings\\Owner\\My Documents\\a.dat\""
答えてる奴も詰まらんことで引っ張るなよと・・・
>809
ほらやっぱwindowsならではのお約束って体験してみないと身につかないし
811 :
デフォルトの名無しさん:2005/06/05(日) 18:31:26
ここは優しい人が多いインターネッツですね
以前より厨が増えたがな
なんか回答者のレベルに疑問があるね。
814 :
デフォルトの名無しさん:2005/06/05(日) 19:06:05
配列にまとめて代入するときってどうしたらいいんですか?
宣言時に int a[]={1,2,3,4,5};
はわかるのですが、
そのあとに同じようにしても代入できません
Cでは配列の初期化はできても代入はできんので、あきらめて
memcpy()はforループなどを使って明示的に初期化しる
816 :
801:2005/06/05(日) 19:53:23
>>814-815 そこでC99の複合リテラルですよ。
どうせmemcpyとかが必要だけど。
C99ってかなり合理的で自然な拡張なのに全然普及してないよな。
gccとかならもはやC++使っちゃうからでそ>C99
うむ。今やCに求められるのは互換性と移植性だろ。
わざわざ新しいCに手を出すぐらいならC++で良し。
821 :
デフォルトの名無しさん:2005/06/05(日) 23:17:22
>>820 そんなもの誰もCに期待していない。
お前素人?
互換性と移植性
むしろJava
>>820は「C++に比べて」の話だよ
Javaでいいような領域でそもそも今時Cなんぞ使うものか
まだだ、まだ終わらんよ!
826 :
デフォルトの名無しさん:2005/06/06(月) 00:30:18
[1] 授業単元:C言語
[2] 問題文(含コード&リンク):
3つの整数をキーボードから読み取って
その合計を求めるプログラムを次の条件で作りなさい
@変数は3個だけ使用 Ascanfは繰り返し処理
[3] 環境
[3.1] OS:Windows
[3.2] コンパイラ(バージョン):gcc ・・・かな?
[3.3] 言語:C
[4] 期限:2005年6月6日午後3時まで
どうしてもわかりません。よろしくお願いします。
工業高校か高専の1年生かな?
大学でそれなら諦めた方が良いよ。
教科書あるだろ?
828 :
デフォルトの名無しさん:2005/06/06(月) 00:36:19
[1] 授業単元:ファイル入出力
[2] 問題文(含コード&リンク):
int型の配列に格納された数値を効率よくファイルに書き込む
方法をご教授ください。
// データ格納バッファ
unsigned int i[50];
// 数値格納関数(定期的に1msec毎に定期的にコールされる)
void func(unsigned int j)
{
static unsigned char idx;
if(idx > 50)
idx = 0;
i[idx++] = j;
}
ファイル出力イメージは以下のとおりです。
(テキスト形式)
34
56
123
・
・
・
この場合、i[]に数値を代入する代わりにfprintf等の関数を用いれば
ファイル書き込みが可能とは思いますが、毎回ファイル書き込みにいかずに、
バッファリングされたものを効率よくファイル書き込みできる方法を
教えてください。 ファイルアクセスを極力少なくしたいと考えています。
よろしくお願いいたします。
[3] 環境
[3.1] OS:Windows
[3.3] 言語:どちらでも可
>>826 #include <stdio.h>
int main(){
int i,a,b,c;/*変数宣言*/
int *p[]={&a,&b,&c};/*ポインタを宣言*/
puts("Input...");
for(i=0;i<3;i++){
scanf("%d",p[i]);/*標準入力から入力*/
}
printf("%d",a+b+c);/*表示*/
}
fprintfは別に効率悪くないぞ。
まさに
> ファイルアクセスを極力少なく
するために、デフォルトでバッファリングを行ってくれるから。
>>829 すみませんが変数は3つでお願いします。
>>831 #include?<stdio.h>
int?main(){
????int?i,sum,tmp;/*変数宣言*/
????puts("Input...");
????for(i=0;i<3;i++){
????????scanf("%d",&tmp);/*標準入力から入力*/
????????sum += tmp;
????}
????printf("%d",tmp);/*表示*/
}
>>826 #include <stdio.h>
int main(void) {
int i, sum, n; /* 変数3つ */
sum = 0;
for( i = 0 ; i < 3 ; i++ ) {
scanf("%d", &n);
sum += n;
}
printf("Sum = %d\n", sum);
return 0;
}
#include<stdio.h>
int main(void){
int i, sum, tmp;
puts("Input...");
for(i = 0; i < 3; i++){
scanf("%d", &tmp);
sum += tmp;
}
printf("%d", sum);
return 0;
}
[1] 授業単元:プログラミング通論
[2] 問題文(含コード&リンク):
文字列s、fが与えられ、文字列sの中で文字列fが最初に現れる位置を見つけ、その位置を返す関数searchを作れ。
例:s = tractor f = act → actor
[3] 環境
[3.1] OS:Windows XP
[3.2] bcc551
[3.3] 言語:C
[4] 期限:2005年6月10日
[5]このsearchってのは要するにライブラリ関数のstrstrって奴と同じものらしいです。
以下のようなものを作ってみたのですが、コンパイルは出来るのに実行するとセグメントエラーがおきます。何故でしょうか?
#include<stdio.h>
char *search(char *s, char *f){
char *w;
if(s[0] == f[0]){
w = search(s+1, f+1);
if(w == s+1) return s;
}
return search(s+1,f);
}
int main(){
char s[] = "tractor";
char f[] = "actor";
printf("%s\n",search(s,f));
}
>>835 追ってみれば無限再帰することが分かる。ちゃんと終端チェックしないと。
文字列の長さを考えろ。
>>835 つーかあんたは lisper なのか?
再帰を使ったからと言ってlisperと決め付けるのはいかがなものか。
まあ俺も素直に書くなら二重ループになるだろうけどさ。
840 :
835:2005/06/06(月) 01:09:59
ありがとうございます。できました。
それとセグメントエラーって何なんですか?
841 :
835:2005/06/06(月) 01:11:47
>>838 必要ないと思ったので書きませんでしたが、課題の条件に必ず再帰を使うことがあったので。
本当に正確に「セグメントエラー」という用語だったの?
まあいいけどさ
普通は、参照または書き込みできないメモリにアクセスしようとした
という意味ね
基本的なメモリ保護機能のあるOSでの話だけど。
・質問は必ず【質問テンプレ】に従ってください。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
・問題文は、解いてもらう方にわかりやすいように全文を書きましょう。
~~~~~~~~~~~~~~~~~~~~
・エラーは、その詳細と発生した行を書きましょう。エラーメッセージはコピペしてください。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
・後から問題に付け足しするのはやめましょう。解いてもらっている方に失礼です。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
見てて疲れるな。もちっとスムーズに出来ん?
846 :
デフォルトの名無しさん:2005/06/06(月) 01:47:55
貧弱ゥ貧弱ゥ貧弱ゥ貧弱ゥ貧弱ゥ貧弱ゥ貧弱ゥ貧弱ゥ貧弱ゥ貧弱ゥ貧弱ゥ〜〜〜〜〜〜〜〜〜〜〜。
>>846 デバッグ中に65MBのファイルをはいたときはびびった。
あれだけ作るのに10秒かかってないし。
こえーこえー。
>>846 fflush() なしか・・・何を図ってるの?
850 :
デフォルトの名無しさん:2005/06/06(月) 02:29:50
>>828 まともな Operating System ならライブラリ関数が最適にバッファリングしてくれて
システムコール呼び出し回数を減らしてくれる
それにファイルに書き込んだからってすぐにハードディスクに書き込まれるわけじゃない
ちゃんとOSバッファリングしてる
それを制御しようとしたら Kernel レベルの実装をやってください
ちゃんとOSがバッファリングしてる
>>850 カーネルレベルのバッファリングとライブラリレベルのバッファリングは
違うので、ごっちゃにすると誤解をまねく恐れが。
stdioの場合は、ライブラリレベル、つまりユーザコードのレベルで
バッファリングが行われる。
で、そのバッファリングモードを変える方法もあるし、たんに明示的に
fflush()を呼ぶこともできる。
>>846 fflush???
一応、fprintf*DATAMAX(=50)の速度についてなんだけど、気にするほど遅くないということが出たと思ったんだが。
*-*-*-*-*-*-*-*-実験中*-*-*-*-*-*-*-*-*;
fflushをprintf("end - %d\n\n",clock());の前においてみたけど、やっぱり1clock()かかりませんでしたよ。
こんな感じじゃだめかしらん??
>>853 で、CLOCKS_PER_SEC はいくつですか?
クロックって何か分かって計測してるのかね。
>>CLOCKS_PER_SEC
1000でdefineされてた。グローバル変数だと思っていた。(汗
>>クロック
3年ほど前に習ったときはアプリ起動からのmsecと教えられたような気がする。(Windowsの40日問題もこれ系だったきがする。
CLOCKS_PER_SECが変数だと勘違いしてたので動的にその値が変わるもんだと思っていた。
よく考えてみると理解してないかもしれない。(大汗
たぶん、アプリ起動時からのmsecで良いと思う。
clock は、アプリケーションが使用したCPU時間を返す。
sleep(10) だけのプログラムの場合、プログラムの実行時間は10秒だけど、
clock は、限りなく0に近い値を返す。
この場合、ファイルI/Oのkernel処理の時間は含まれない。
time ./a.out ではかればいいだろ
>>857 ありゃ。思ってたのとぜんぜん違う。
clockが使えないとなると、WINAPI使うとかしないとだめか。うげ〜。
勉強になったよ。
レスthx。
>>858 そだね。この話もぼちぼち終わりにしておきますか。
861 :
デフォルトの名無しさん:2005/06/06(月) 03:23:52
お休み〜。
ああ
おやすみ
863 :
太郎:2005/06/06(月) 10:34:54
>>803 様
ありがとうございます。
ここのみなさんやさしい。。。
864 :
デフォルトの名無しさん:2005/06/06(月) 10:40:44
[1] 授業単元:アドバンスプログラミングA
[2] 問題文(含コード&リンク):
待ち行列を初期化する関数 void queueInitialize(queue_t *que) と,
待ち行列が空であるかどうかを判断する関数 int queueEmptyQ(queue_t *que)
とを作れ。ただし, queueEmptyQ は,待ち行列が空であるときに 1 を,空で
はないときに 0 を返すものとする。
[3] 環境
[3.1] VineLinux
[3.2] コンパイラ(バージョン):
[3.3] 言語:C
[4] 期限:2005年6月6日02:00まで
865 :
864:2005/06/06(月) 10:41:55
礼儀がなってませんでした。
遅ればせながらお願いします。
866 :
デフォルトの名無しさん:2005/06/06(月) 10:51:41
[1] 授業単元: プログラミングとその応用
[2] 問題文(含コード&リンク): 標準入力からテキストファイルを読み込んで、
ファイルに出現する各文字の出現頻度データを出力するプログラムを作成せよ。
文字コードとその出現頻度を1行ずつ並べたデータを出力するようにせよ。
なお、頻度集計の対象とするのは、コードが0〜127の範囲に入る文字に限るものとする。
出力するデータの形式は、各行は2つの数字からなり、1番目を文字コード、1文字あけて2番目をその文字の出現頻度とする。
プログラムを実行するときは、上記の形式でstdoutにデータを出力したものとすれば、
それをパイプで送り込む事で、xgraphというソフトウェアによってグラフを描く事ができる。
%./char_hist < char_hist.c | xgraph
(プログラム名をchar_histとする。)
なお文字コードと文字の対応関係は「man ascii」で調べられる。
[3] 環境
[3.1] OS:Windows/Linux/等々 :Linux
[3.2] コンパイラ(バージョン): gcc
[3.3] 言語:C/C++/どちらでも可 のいずれか:C
[4] 期限:yyyy年mm月dd日hh:mmまで または 無期限 のいずれか:今週中に
[5] その他の制限:どこまで習っているか、等々 :関数、配列などを習って、今回は「文字列と標準入出力」というところを習いました。
できるだけ簡単なプログラムでお願いします。
よろしくお願いしますm( __ __ )m
>>866 #include <stdio.h>
#include <string.h>
int main( void )
{
int code, count[128], i;
memset( &count[0], 0, sizeof( count ) );
while ( EOF != ( code = fgetc( stdin ) ) ) {
if( code >= 0 && code <= 127 ) {
count[code]++;
}
}
for ( i = 0; i < 128; i++ ) {
printf( "%d %d\n", i, count[i] );
}
}
868 :
デフォルトの名無しさん:2005/06/06(月) 12:19:54
>>866 #include <stdio.h>
#define LOWER 0
#define UPPER 127
#define MAXLEN ((UPPER-LOWER)+1)
int
main(void)
{
int c, i;
long tot, freq[MAXLEN];
/* 配列とカウンタを初期化する */
for (i = 0; i < MAXLEN; i++)
freq[i] = 0;
tot = 0;
/* 標準入力を読みこみ、データを集計する */
while ((c = getchar()) != EOF)
if (c >= LOWER && c <= UPPER)
{
++freq[c-LOWER];
++tot;
}
/* データがあれば標準出力に出力する */
if (tot > 0)
{
for (i = 0; i < MAXLEN; i++)
printf("%d %.0f\n", i, (freq[i] == 0) ? 0 : (100.0*freq[i])/tot);
}
return 0;
}
870 :
デフォルトの名無しさん:2005/06/06(月) 13:27:28
[1] 授業単元: プログラミングA
[2] 問題文(含コード&リンク): パスワードの桁数を最初に入力させ、パスワードをランダム(アルファベットと数字)に生成するプログラムを作成せよ。
[3] 環境
[3.1] OS:WindowsXP
[3.2] コンパイラ(バージョン): borland
[3.3] 言語:C
[4] 期限:今日の17時までにお願いします(T_T)
よろしくおねがいします(T_T)
>>870 mallocで確保した領域の解放は自分でやってくれ。
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char *str;
int num, i, j, c;
scanf("%d", &num);
str = (char*)malloc(sizeof(char) * num + 1);
srand(getpid());
for(i = 0; i < num; i++)
{
while(1)
{
c = rand() % 128;
if(isalnum(c) != 0)
{
break;
}
}
str[i] = c;
}
printf("%s\n", str);
return 0;
}
あ、j消すの忘れた orz
ああ、終端文字追加するの忘れてる...orzモウダメポ
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char *str;
int num, i, c;
scanf("%d", &num);
str = (char*)malloc(sizeof(char) * num + 1);
srand(getpid());
for(i = 0; i < num; i++)
{
while(1)
{
c = rand() % 128;
if(isalnum(c) != 0)
{
break;
}
}
str[i] = c;
}
str[num] = '\0';
printf("%s\n", str);
return 0;
}
>>869 867 出現回数(回)
868 出現確率(%)
AABC (改行無し)
のをWindowsXPで試してみたら
(867) (868)
65 2 50
66 1 25
67 1 25
って出た
875 :
デフォルトの名無しさん:2005/06/06(月) 14:29:27
[1] コンピュータ第1同演習
[2] unsigned char型変数を宣言し、その中のビット位置と、
ビットの状態(1か0か)を読み込み、実際にその位置のビットを
指定された状態にセットするるプログラムを作成しなさい。
[3] 環境
[3.1] OS:Windows
[3.2] コンパイラ(バージョン):
[3.3] 言語:C
[4] 期限:6月9日まで
>>871 そこまでやって解放だけしないのかよ!?
>>876 普段new/deleteだからfreeの使い方をわすr(ry
>>875 unsigned char data, mask;
int pos, bit;
/* pos と bit に入力 */
mask = 1 << pos;
if (bit == 0)
data &= ~ mask;
else
data |= mask;
/* 結果出力 */
1.授業単元:プログラミング
2.問題文:正整数n(2以上) を入力させ、nを素因数分解するプログラムを作れ。2*3*3...のように出力しなさい。
3.環境
OS:Linux
言語:C
4.期限:2005/06/08
いくら考えてもわかんないorz
884 :
デフォルトの名無しさん:2005/06/06(月) 16:10:14
【質問テンプレ】
[1] ゼミ
[2] スケールフリーネットワークを生成したいです。
これは以下の規則を持ちます。
1.ノードの初期値は2、リンク数は1。ノードは1つづつ増えていきかならず二つのリンクを得、100マデ試行を繰り返します。
2.新規ノードは二つのリンクを得ますがリンク数を多くもつノードほどリンクを張りやすい傾向にあります。
つまり一方のノードが他方の2倍のリンクを持つとき、倍もつほうはリンク数も倍の確率で得やすいということです。
ただし、リンクは重複を許しません。
3.得られたリンク数がベキ法則に従うことを図に示します。(これはエクセルに出力して図を描くので自分でやります)
[3] 環境
[3.1] OS:Windows
[3.2] コンパイラ(バージョン):
[3.3] 言語:C/C++/どちらでも可
[4] 期限:2005年6月7日の23:59まで
[5] 基礎はすべて習っています。ネ申頼みまつ
>>883 再起を使う方法
#include <stdio.h>
int iOutput = 0;
void _function_034( int v, int i )
{
while ( i < v ) {
if ( ( v % i ) == 0 ) {
if ( iOutput ) printf( " *" );
iOutput = 1;
printf( " %d", i );
_function_034( v / i, i );
break;
}
i++;
}
if ( i == v ) {
if ( iOutput ) printf( " *" );
printf( " %d\n", i );
return;
}
}
int main( void )
{
int n = 311112546;
_function_034( n, 2 );
return ( EXIT_SUCCESS );
}
つかっていいです。
>>883 環境依存だから、そのまま出すのはまずいがLinuxならgccだろうから多分動く。
#include <stdio.h>
void print_prime_factorization(int n) {
void aux(int n, int k, const char * del) {
if (n == 1) {
puts("");
return;
}
if (!(n % k)) {
printf("%s%d", del, k);
aux(n / k, k, "*");
} else {
aux(n, k + 1, del);
}
}
aux(n, 2, "");
}
int main(void)
{
int n;
scanf("%d", &n);
print_prime_factorization(n);
return 0;
}
>>883 math.h バージョン
#include <stdio.h>
#include <math.h>
int iOutput = 0;
int main( void )
{
int n = 217483645;
int i = 2;
while ( i < ( int )sqrt( ( double )n ) ) {
if ( ( n % i ) == 0 ) {
if ( iOutput ) printf( " *" );
iOutput = 1;
printf( " %d", i );
n /= i;
} else {
i++;
}
}
if ( iOutput ) printf( " *" );
printf( " %d\n", n );
return ( 0 );
}
環境も関係してくるだろうが、オレの環境だと
>>888 で大きな素数(例えば 2147483647)を入れると
Stack Overflow になる。
892 :
888:2005/06/06(月) 18:14:42
あ、ほんとだ。
末尾再帰は最適化してくれるんじゃなかったのか?>gcc
いずれにせよそのまま出せるような解答ではないわけだが。
学校の課題です。
球の半径を1から10まで1ずつ変化させ、球の表面積と体積を出力しなさい
補足 表面積S=4πr二乗 体積 V=4/3πr三乗 π=3.141592
二種類のループ(while,for,whileの無限ループ)を使いなさい。
出力例: 半径R= 表面積S= 体積V=
誰か助けて下さい。
894 :
864:2005/06/06(月) 19:08:15
すいません。期限間違えていました。
[1] 授業単元:アドバンスプログラミングA
[2] 問題文(含コード&リンク):
待ち行列を初期化する関数 void queueInitialize(queue_t *que) と,
待ち行列が空であるかどうかを判断する関数 int queueEmptyQ(queue_t *que)
とを作れ。ただし, queueEmptyQ は,待ち行列が空であるときに 1 を,空で
はないときに 0 を返すものとする。
[3] 環境
[3.1] VineLinux
[3.2] コンパイラ(バージョン): gcc
[3.3] 言語:C
[4] 期限:2005年6月7日02:00まで
です。お願いしますm(__)m
>>893 // for使用
#include <stdio.h>
#define PI 3.141592
int main(){
int r;
for(r = 1; r <= 10; r++) printf("半径R=%d 表面積S=%f 体積V=%f\n", r, 4*PI*r*r, 4*PI*r*r*r/3);
return 0;
}
// while使用
#include <stdio.h>
#define PI 3.141592
int main(){
int r = 1;
while(r <= 10){ printf("半径R=%d 表面積S=%f 体積V=%f\n", r, 4*PI*r*r, 4*PI*r*r*r/3); r++; }
return 0;
}
// while無限ループ使用
#include <stdio.h>
#define PI 3.141592
int main(){
int r = 1;
while(1){ printf("半径R=%d 表面積S=%f 体積V=%f\n", r, 4*PI*r*r, 4*PI*r*r*r/3); r++; if(r > 10) break; }
return 0;
}
>>894 queue_tってどんな風に定義されてるの?
struct queue : public std::deque{}
898 :
894:2005/06/06(月) 19:41:02
>>898 void queueInitialize(queue_t *que){
que->head = 0;
que->num = 0;
}
int queueEmptyQ(queue_t *que){
return que->num ? 0 : 1;
}
900 :
デフォルトの名無しさん:2005/06/06(月) 19:56:34
[1] 授業単元: 情報処理
[2] 問題文(含コード&リンク): 月を入力すると、その季節を表示するプログラムを作る。
不適当な数字を入力した場合もう一度入力を促すようにする。
[3] 環境
[3.1] OS:Windows
[3.2] コンパイラ(バージョン): gcc
[3.3] 言語:C
[4] 期限:今日の9時まで。
[5] その他の制限:どこまで習っているか、等々
コンパイルさえできませんでしたが。
自分でできたところまで書いてみます。
#include <stdio.h>
int main(void)
{
int month;
printf("input month:");
scanf("%d",&month);
if(month >=3 && month <=5)
puts("It is spring.");
else if(month >=6 && month <=8)
puts("It is summer.");
else if(month >=9 && month <=11)
puts("It is autumn.");
else if(month ==1 || month ==2 || month ==12)
puts ("It is winter.");
return 0;
}
? よくわからんができてるような
ああ、そういうことか
while (1){
printf("input month:");
scanf("%d",&month);
if(month >= 1 && month <= 12) break;
}
>>884 だいぶ遅れたがスケールフリーネットワークのやつ。
問題読み違えてなきゃいいけど、一応確認。
>ノードの初期値は2、リンク数は1
ってノードが二つあって1つのリンクでつながってるってことだよね?
あと、リンクは無向だよね?(有向だとつじつま合わん希ガス)
とりあえず書いた分だけ書き込んどく。
あーネットワークの構造とか一切記録してないけど。w
ネットワークの構造を保存しておきたければ
list<int> を list<Network> とかやって Network クラスつくって隣接ノードのリストでも記録しておけばいいんでないかと思う。
#include <iostream>
#include <list>
using namespace std;
typedef list<int> List;
typedef List::iterator Iter;
void rearrange_list(List & ranking, Iter & iter);
906 :
905:2005/06/06(月) 20:18:57
int main()
{
List ranking; // リンクの数が多い順にひたすらならべる。
srand((unsigned)time(0));
ranking.push_back(1);
ranking.push_back(1);
int total_links = 2;
for (int i = 0; i < 100; i ++)
{
int next = rand() % total_links; // 変数名わかりづらくてスマソ
Iter iter1, iter2;
for (iter1 = ranking.begin(); iter1 != ranking.end(); iter1 ++)
{
next -= * iter1;
if (next < 0)
{
total_links ++;
(* iter1) ++;
break;
}
}
rearrange_list(ranking, iter1); // 並び替え
907 :
905:2005/06/06(月) 20:20:09
next = rand() % (total_links - * iter1); // 重複を除外
for (iter2 = ranking.begin(); iter2 != ranking.end(); iter2 ++)
{
if (iter1 == iter2) // 重複を回避
{
continue;
}
next -= * iter2;
if (next < 0)
{
total_links ++;
(* iter2) ++;
break;
}
}
rearrange_list(ranking, iter2); // 並び替え
ranking.push_back(2);
total_links += 2;
}
908 :
905:2005/06/06(月) 20:20:43
int prev = 0;
int count = 1;
for (Iter iter = ranking.begin(); iter != ranking.end(); iter ++)
{
if (prev && * iter == prev)
{
count ++;
}
else
{
cout << * iter << " 個リンクを持つノードは " << count << "個" << endl;
prev = * iter;
count = 1;
}
}
return 0;
}
909 :
905:2005/06/06(月) 20:21:04
void rearrange_list(List & ranking, Iter & iter)
{
// インクリメントされた iter の所以外は全部ソートされてる(はず)なので、
// ひたすらリストをさかのぼる。
Iter iter_back = iter, iter_prev = iter;
iter_back --;
for (; iter_back != ranking.begin() && * iter_back < * iter; iter_back --)
{
iter_prev = iter_back;
}
if (* iter_prev < * iter)
{
ranking.splice(iter_back, ranking, iter);
}
}
901です。
ムリポ。
>>904 えーそれ以降に何繋げたらいいんでしょうか
【質問テンプレ】
[1] 言語処理
[2] 入力された文字列をランダムに入れ替えるプログラムを作れ。
<例>
input=>hello
hloel
↑が全然出来ません。
[3] 環境
[3.1] OS:Unix
[3.2] コンパイラ(バージョン):
[3.3] 言語:C
[4] 期限:2005年6月8日の23:59まで
[5] ポインタをかじったくらい
どなたか助けてください。
913 :
905:2005/06/06(月) 20:43:30
クソ長いソースはってしまって申し訳ないっす。OTL
クソ長いクセに一箇所間違ってました。
下から3行目 iter_back ではなく iter_prev でした。
とりあえず逝ってきます。
>>910 あと、
>>901にコンパイルさえできなかったって
書いてあるけど、コピペしたら
普通に動いたよん。
>>904は不正な入力したら無限ループになるぞ
百害あって一理無しでまったく意味がない
scanf()で戻り値チェックしないのはfopen()の戻り値をチェックしないのと
同じだ
>>911 #include <stdio.h>
#include <string.h>
void swap(char *a, char *b)
{
nbsp;nbsp;nbsp;nbsp;char tmp;
nbsp;nbsp;nbsp;nbsp;tmp = *a, *a = *b, *b = tmp;
}
void random_shuffle(char *start, char *last)
{
nbsp;nbsp;nbsp;nbsp;char *next = start;
nbsp;nbsp;nbsp;nbsp;size_t index;
nbsp;nbsp;nbsp;nbsp;
nbsp;nbsp;nbsp;nbsp;for (index = 2; ++next != last; ++index)
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;swap(next, first + (rand() % index));
}
int main()
{
nbsp;nbsp;nbsp;nbsp;char buff[1024];
nbsp;nbsp;nbsp;nbsp;char *p;
nbsp;nbsp;nbsp;nbsp;while (fgets(buff, sizeof buff, stdin)) {
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;if (p = strchr(buff, '\n'))
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;*p = '\0';
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;random_shuffle(buff, buff + strlen(buff));
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;puts(buff);
nbsp;nbsp;nbsp;nbsp;}
nbsp;nbsp;nbsp;nbsp;return 0;
}
917 :
916:2005/06/06(月) 20:52:29
すまん
#include <stdio.h>
#include <string.h>
void swap(char *a, char *b)
{
char tmp;
tmp = *a, *a = *b, *b = tmp;
}
void random_shuffle(char *start, char *last)
{
char *next = start;
size_t index;
for (index = 2; ++next != last; ++index)
swap(next, first + (rand() % index));
}
int main()
{
char buff[1024];
char *p;
while (fgets(buff, sizeof buff, stdin)) {
if (p = strchr(buff, '\n'))
*p = '\0';
random_shuffle(buff, buff + strlen(buff));
puts(buff);
}
return 0;
}
919 :
893:2005/06/06(月) 21:39:59
>>895さん
遅くなりましたが、どうもありがとうございました。
【質問テンプレ】
[1] 授業単元:プログラミング演習
[2] 問題文(含コード&リンク):
アラビア数字(1,2,3,4・・・)を入力すると、それに対応したローマ数字(T,U,V,W,・・・)を返すプログラムを作成せよ。
なお、配列を使って表現すること。
数字は10まで表現できればよい。
[3] 環境
[3.1] OS:Linux
[3.2] コンパイラ(バージョン):gcc
[3.3] 言語:C
[4] 期限:06月17日まで
[5] その他の制限:問題にも書きましたが、配列を必ず使わないと駄目だそうです。
よろしくお願いします。
>>920 int main(void) {
static const char *Rome[] = {"T", "U", "V", "W", "X", "Y", "Z", "[", "\"};
char buf[16];
if (fgets(buf, sizeof buf, stdin)) {
int n = atoi(buf) - 1;
if (0 <= n && n < 10) {
puts(Rome[n]);
return EXIT_SUCCESS;
}
}
fputs("エラー:1〜10の数として認識できなかった。\n", stderr);
return EXIT_FAILURE;
}
923 :
884:2005/06/06(月) 22:14:06
>>905 レス禿げしく感謝!!
#include<time.h>
が落ちていましたが、ちゃんと出力されています!dクス
[1] 授業単元:ソフトウェア演習2
[2]問題文(含コード&リンク):
1main関数およびkeyequal, keyltを実装して3.5節(次レスに書きます)で示した二分探索木のプログラムを完成させ、データの挿入・探索が行えることを確認せよ。
2格納済みのデータをkeyの順に一覧表示する関数を実装せよ。
3keyを指定して、二分探索木からデータを削除する関数を実装せよ。
4課題1,2,3のプログラムを、ローマ字表記された氏名をkeyとすることができるように変更せよ
[3] 環境
[3.1] OS:Linux
[3.2] コンパイラ(バージョン):cc
[3.3] 言語:C
[4] 期限:06月8日の午後2時まで
よろしくお願いしますm(__)m。
925 :
924:2005/06/06(月) 22:18:48
木の節構造を表す構造体は以下のようになる。ここでは教科書のサンプルに従い、typedefを使う。以後プログラム中で、struct nodeと書くところをNODEで置き換えることができる。また、木の根を指すグローバル変数rootをNULLで初期化しておく。
typedef int KEY;
typedef struct node {
KEY data;
struct node *left, *right;
} NODE;
NODE *root=NULL;
926 :
924:2005/06/06(月) 22:19:25
木の節構造を表す構造体は以下のようになる。ここでは教科書のサンプルに従い、typedefを使う。以後プログラム中で、struct nodeと書くところをNODEで置き換えることができる。また、木の根を指すグローバル変数rootをNULLで初期化しておく。
typedef int KEY;
typedef struct node {
KEY data;
struct node *left, *right;
} NODE;
NODE *root=NULL;
927 :
924:2005/06/06(月) 22:19:56
if (keyequal(key, (*p)->data))
return NULL;
else if (keylt(key, (*p)->data))
p =&(*p)->left;
else
p = &(*p)->right;
}
if ((new=malloc(sizeof(NODE))) == NULL) {
printf("Out of memory!\n");
exit(0);
}
new->left = NULL;
new->right = NULL;
new->data = key;
*p = new;
return new;
}
928 :
デフォルトの名無しさん:2005/06/06(月) 22:23:48
929 :
828:2005/06/06(月) 22:56:24
遅ればせながら、皆様からのご回答ありがとうございます。
>>830 fprintfについての知識があいまいなため、
詳細を勉強し実装検討をしてみます。
>>850 今回の実行環境はWindowsですが、
将来的にはマイコンに移植したいと考えています。
OSは未搭載の予定ですが、ファイルアクセス(open,read,write etc)に関しては
実装済み(パクリもの)となっているのでfprintfでの実装を検討してみます。
>>846 サンプルコードどうもです。
実装時の参考とさせていただきます。
[1] 授業単元:プログラミング(C)
[2] 問題文(含コード&リンク):1000以下の整数2数を入力させ、その和を出力するプログラムを作りなさい。
[3] 環境
[3.1] OS:Windows
[3.2] コンパイラ(バージョン):Visual C++
[3.3] 言語:C
[4] 期限:2005/6/10まで
以下までは組まれているのですが、ここから分かりません…お願いします。
#include <stdio.h>
int i_input();//1:integer 0:string
int char2int(char []);
main(){
char s[80];
printf("%d\n",i_input(s));
}
int i_input(char a[]){
int i;
printf("1000以下の整数を入力してください。\n");
gets(a);
i=0;
while(a[i]){
if(!(a{i]>='0' && a[i]<='9')) return 0;
i++;
}
return 1;
}
>if(!(a{i]>='0' && a[i]<='9')) return 0;
a[i]だよな?
932 :
sage:2005/06/06(月) 23:51:47
>>930 #include <stdio.h>
int main()
{
int m, n;
if (scanf("%d %d", &m, &n) != 2 || m > 1000 || n > 1000) {
fprintf(stderr, "1000以下の2数を入力してください\n");
return 1;
}
printf("%d\n", m + n);
return 0;
}
933 :
デフォルトの名無しさん:2005/06/07(火) 00:01:16
[1] 授業単元: C言語
[2] 問題文(含コード&リンク): 「コマンドラインから指定された文字列を使い、何か応答(出力)するプログラムを作れ。」
[3] 環境
[3.1] OS:unix
[3.2] コンパイラ(バージョン): gcc
[3.3] 言語:C
[4] 期限:2005年06月10日16:30まで
課題の意味がわかりません。「コマンドラインから指定」???
ランダムで表示が変わるおみくじとか作れば良いのかな?違います?
>>933 #include <stdio.h>
int main(int argc, char *argv[]){
if(argc > 1){
printf("%sなんて言う人絶対狂ってますよ!\n", argv[1]);
}
return 0;
}
935 :
デフォルトの名無しさん:2005/06/07(火) 00:08:22
>>934 ああ〜なんかそういうの見たことありますわ、サンクス。
じっくり調べてやってみます。
見当違いのレポートを出さずにすんで良かった。
有名な4桁の数字当てゲームを作りたいんですが、どうしたらいいですか?
お願いします。
>>936 お前さんがどのプログラムを有名と言っているのかは知らんが、
俺の知っている数当てゲームはコレ
#include<stdio.h>
main(){
int d, x;
unsigned int seed;
printf("number hitting game\n");
printf("Input an integer to seed = ");
scanf("%d",&seed);
srand(seed);
x = rand();
x %= 10000;
do{
printf("Hit my number(0-9999) = ");
scanf("%d", &d);
if(x > d) printf("greater than %d\n", d);
else if(x < d) printf("less than %d\n", d);
}while(x != d);
printf("Congratulations !\n");
}
七行すれで見つけた
#include <stdio.h>
int i,p,v,c,n,z,a[10];long time(long *);void srand(unsigned);void main(void){
for(srand(time(NULL)),i=0;i<10;)a[i++]=-1;for(a[z=p=rand()%9+1]=0,i=1;i<=3;)if
(a[p=rand()%10]<0){a[p]=i++;z=z*10+p;}for(c=0;c<10;){printf("[%2d] >> ",++c);
scanf("%d",&n);for(v=0,i=4;i;n/=10)v+=(a[p=n%10]==--i)?10:(a[p]>=0);if(v==40)
break;printf("%14c## %2dH %2dB\n",' ',v/10,v%10);}printf("\n <<%d>>\n",z);}
>>936 俺も何が有名かは知らんが、「数当て」でなく「数字当て」であることを考慮すると
# include <stdio.h>
# include <stdlib.h>
int main(void)
{
int digits[4];
int i;
srand((unsigned)time(0));
for(i = 0; i < 4; i++)
digits[i] = (10.0 * rand() - 1) / RAND_MAX;
while(1)
{
int abs_sum = 0;
puts("guess four numbers");
for(i = 0; i < 4; i++)
{
int input;
scanf("%1d", &input);
abs_sum += abs(input - digits[i]);
}
if(abs_sum == 0)
break;
printf("Sum of absolute difference is %d.\n", abs_sum);
}
puts("Excellent!");
return 0;
}
[1] 授業単元: C言語
[2] 問題文(含コード&リンク): 2つの自然数a,bを読み込み、1から100までの整数のうちでaで割り切れ
かつbで割り切れない整数をすべて求めるプログラムを作れ。
[3] 環境
[3.1] OS:Linux
[3.2] コンパイラ(バージョン): cc
[3.3] 言語:C
[4] 期限:2005年06月14日12:00まで
よろしくお願いしますm(__)m
941 :
894:2005/06/07(火) 03:39:01
>>899さん
遅れてすいません。
ありがとうございました。
#include <stdio.h>
int main(void)
{
int a, b, i;
printf("a = "); scanf("%d", &a);
printf("b = "); scanf("%d", &b);
for (i = 1; i <= 100; i++)
if ( i % a == 0 && i % b != 0)
printf("%d ", i);
return 0;
}
>>940 #include <stdio.h>
int main(void) {
int a,b,st=1,ed=100,p;
printf("input a b ");
scanf("%d %d",&a,&b);
if(a==b || a<1 || b<2 || a%b==0){
/* 勘弁してくれ */
}else{
p=st/a*a;
if(p<st)p+=a;
while(p<=ed){
if(p%b) printf("%d ",p);
p+=a;
}
printf("\n");
}
return 0;
}
>>303 if(num1*num2*num3==6&&(num1%3==num2%3-1||(num1==2&&num2==3))&&num1>0&&num2>0)
945 :
911:2005/06/07(火) 07:16:04
>>917 ありがとうございます!
なんとか出来ました。
[1] 授業単元: C言語
[2] 問題文(含コード&リンク): クラスカルのアルゴリズムを用いて,最小全域木を求めるプログラムを作成せよ.
* プログラムは,標準入力からグラフデータを読み込み,最小全域木を出力する.
* グラフデータは,以下の形式で与えられる:3
(0,1):13
(0,2):8
(1,2):11
* プログラムの動作例を以下に示す(上記グラフのデータファイルを graph.txt とする).
% ./kruskal < graph.txt
Min spanning tree:
(5,2) (4,0) (2,1) (4,3) (1,0)
[3] 環境
[3.1] OS:Linux
[3.2] 言語:C
[4] 期限:2005年06月10日12:00まで
[5]プログラムの雛形は以下です。「がんばって作る」のところをお願いします
#include <stdio.h>
#include <stdlib.h>
// グラフを表す構造体
typedef struct {
int numNodes; // 節の数
int numEdges; // 枝の数
char *matrix; // グラフの隣接行列表現
} GRAPH;
void loadGraph(GRAPH *graph);
void setEdge(GRAPH *graph, int x, int y, int len);
int getEdge(GRAPH *graph, int x, int y);
void destroyGraph(GRAPH *graph);
int main(int argc, char *argv[])
{
GRAPH graph;
loadGraph(&graph);
// がんばって作る
destroyGraph(&graph);
return 0;
}
void loadGraph(GRAPH *graph)
{
int x, y, len, numNodes, numEdges;
scanf("%d\n", &numNodes);
graph->numNodes = numNodes;
graph->matrix = (char *)calloc(numNodes * numNodes, sizeof(char)); // 隣接行列の確保
if (graph->matrix == NULL) {
fprintf(stderr, "%d: memory overflow!\n", __LINE__);
exit(1);
}
// 枝データの読み込み
numEdges = 0;
while (scanf("(%d,%d):%d\n", &x, &y, &len) != EOF) {
setEdge(graph, x, y, len);
numEdges++;
}
// 枝数の登録
graph->numEdges = numEdges;
}
/*
* グラフに枝 (x,y) を登録する
* 引数: graph - グラフ
* : x - 節1
* : y - 節2
* : len - 枝の長さ
*/
void setEdge(GRAPH *graph, int x, int y, int len)
{
*(graph->matrix + x * graph->numNodes + y) = (char)len;
*(graph->matrix + y * graph->numNodes + x) = (char)len;
}
int getEdge(GRAPH *graph, int x, int y)
{
return (int)*(graph->matrix + x * graph->numNodes + y);
}
void destroyGraph(GRAPH *graph)
{
free(graph->matrix);
}
>>946 * グラフデータは,以下の形式で与えられる:
3
(0,1):13
(0,2):8
(1,2):11
* プログラムの動作例を以下に示す(上記グラフのデータファイルを graph.txt とする).
% ./kruskal < graph.txt
Min spanning tree:
(5,2) (4,0) (2,1) (4,3) (1,0)
3〜5 って何?
>>946 int minX, minY, minCost;
int IndexX, IndexY, IndexCost;
printf( "Min spanning tree:\n" );
while ( graph.numEdges ) {
for ( minCost = 0, IndexX = 0; IndexX < graph.numNodes; IndexX++ ) for ( IndexY = IndexX + 1; IndexY < graph.numNodes; IndexY++ ) if ( ( IndexCost = getEdge( &graph, IndexY, IndexX ) ) > 0 && ( minCost == 0 || minCost > IndexCost ) ) {
minX = IndexX; minY = IndexY; minCost = IndexCost;
}
if ( !minCost ) break;
printf( "(%d,%d)", minX, minY ); setEdge( &graph, minX, minY, -1 ); graph.numEdges--;
for ( IndexX = 0; IndexX < graph.numNodes; IndexX++ ) {
if ( IndexX != minX && IndexX != minY ) {
if ( getEdge( &graph, IndexX, minX ) < 0 ) { setEdge( &graph, IndexX, minY, 0 ); graph.numEdges--; }
if ( getEdge( &graph, IndexX, minY ) < 0 ) { setEdge( &graph, IndexX, minX, 0 ); graph.numEdges--; }
}
}
}
printf( "\n" );
>>940 #include <stdio.h>
int
main()
{
int a, b;
if (scanf("%d%d", &a, &b) == 2) {
int i = a, j = b;
while (i < 100) {
while (j < i)
j += b;
if (i < j)
printf("%d\n", i);
i += a;
}
}
return 0;
}
953 :
デフォルトの名無しさん:2005/06/07(火) 14:48:42
[1]C言語入門
[2]数字を10個入力し、配列に格納する。隣同士を入れ換えた後
その配列を出力する。ただし、用意する配列は一つとする。
入力を格納した配列内部で実際に隣同士を入れ換えること。
出力時に入れ換えるのは不可とする。
[3]環境
[3.1]windows98
[3.2]?
[3.3]C++
[4]6月8日午前10時まで
[5]for,while,if,配列くらいしかまだ習っていません。
途中までしかできませんでした。
どうかお願いします。
954 :
デフォルトの名無しさん:2005/06/07(火) 14:48:47
羽根の角度や長さが異なる2つのミュラーリヤー図形を表示するWindowsプログラム.ただ
し,キーボードやマウスの入力によって,どちらかの図形の羽根の角度や長さを簡単に変
更できるようにしておくこと.ウィンドウの右下部分に自分の名前,名列番号を表示させ
ること.(20点満点.マウスやキーボードによる変更ができない場合は10点満点)
上の条件でレポートが出ちゃいました。このレポートが出来る方いましたら、どうかよろしくお願いします。。。
挑戦してみてください。
>>953 >隣同士を入れ換えた後
って
1 2 3 4 5 6 7 8 9 10
の順で入力したら
2 1 4 3 6 5 8 7 10 9
って入れ替えるの?
>>954 まずキーボードの入力で線分や文字列が描けるサンプルを
>>1のあぷろだに上げてほしい。
あと環境がわからないので
>>1のテンプレにそって書いてほしい。
何でもいいなら作れるかもしれないけど
採点者がそれを認めるかどうかは全くわからないので
957 :
デフォルトの名無しさん:2005/06/07(火) 15:20:40
sが英数字だったら1、そうじゃなかったら0を返す関数を作ります。
どっちがいいと思う?
1.
int chkchar(const int s)
{
if (('0' <= s && s <= '9') || ('A' <= s && s <= 'Z') || ('a' <= s && s <= 'z'))
return 1 ;
else
return 0 ;
}
2.
int chkchar(const int s)
{
if (('0' <= s && s <= '9') || ('A' <= s && s <= 'Z') || ('a' <= s && s <= 'z'))
return 1 ;
return 0 ;
}
958 :
953:2005/06/07(火) 15:20:43
960 :
957:2005/06/07(火) 15:24:43
いや、まあ課題でライブラリ関数を使わずに書きたいのです。
>>957 オレならこうする。
後から条件の追加も楽だしね。
int chkchar(const int s)
{
if ( '0' <= s && s <= '9' ) return 1;
if ( 'A' <= s && s <= 'Z' ) return 1;
if ( 'a' <= s && s <= 'z' ) return 1;
return 0 ;
}
>>957 int chkchar(const int s){
char a[]="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
int i=0;
while(a[i])
if(a[i++]==s) return 1;
return 0;
}
ASCIIでなくても何とかなる。EBCDICの呪(ry
[1] 授業単元: プログラミング基礎(C)
[2] 問題文(含コード&リンク): 二人の名前(平仮名、片仮名、漢字、アルファベット)を入力し、
相性を%(0〜100)で表示するプログラムを作りなさい。
[3] 環境
[3.1] OS:Windows
[3.2] コンパイラ(バージョン):Visual C++
[3.3] 言語:C
[4] 期限:2005年6月9日まで
よろしくお願いします
>>957 #define MYCTYPE_LOWER0x0001
#define MYCTYPE_UPPER0x0002
#define MYCTYPE_ALPHA(MYCTYPE_LOWER|MYCTYPE_UPPER)
#define MYCTYPE_DIGIT0x0004
#define MYCTYPE_XDIGIT0x0008
unsigned short MYctype_[0x100];
#define MYislower(x) ((MYctype_[(x)&0xff])&MYCTYPE_LOWER)
#define MYisupper(x) ((MYctype_[(x)&0xff])&MYCTYPE_UPPER)
#define MYisdigit(x) ((MYctype_[(x)&0xff])&MYCTYPE_DIGIT)
#define MYisalnum(x) ((MYctype_[(x)&0xff])&(MYCTYPE_DIGIT|MYCTYPE_ALPHA))
#define MYisxdigit(x) ((MYctype_[(x)&0xff])&MYCTYPE_XDIGIT)
static
void
setup_sub(char* p, unsigned short b)
{
while (*p) {
MYctype_[*p] |= b;
p++;
}
}
void
setup()
{
setup_sub("0123456789", MYCTYPE_DIGIT);
setup_sub("abcdefghijklmnopqrstuvwxyz", MYCTYPE_LOWER);
setup_sub("ABCDEFGHIJKLMNOPQRSTUVWXYZ", MYCTYPE_UPPER);
setup_sub("0123456789abcdefABCDEF", MYCTYPE_XDIGIT);
}
>>964 101で割るとかなんとか、そういうことを聞いたような…詳しくはちょっと分からなくて
すみません吊ってきますorz
[1] 授業単元:プログラミング基礎
[2] 問題文:
24ビットと8ビットのbmpファイルがある。
このどちらを読み込んでも元画像をモノクロ化したbmp画像を出力せよ。
なお、bmp画像以外のファイル、対応してない形式のbmp画像、
これらを読み込んだ時「〜という理由でファイルを生成できない」
といった内容のエラーメッセージを出力すること。
[3] 環境
[3.1] OS:Windows
[3.2] コンパイラ:Visual C++
[3.3] 言語:C++
[4] 期限:2005年06月16日まで
[5] その他の制限:mallocを使用
これを落とすと留年してしまうのでどうかよろしくお願いします!
>>953 #include <stdio.h>
int main(void) {
int a[10],i,tmp;
for(i=0;i<10;i++){
printf("input a[%d] ",i);
scanf("%d",&(a[i]));
}
for(i=0;i<5;i++){
tmp=a[2*i];a[2*i]=a[2*i+1];a[2*i+1]=tmp;
}
for(i=0;i<10;i++)
printf("%d ",a[i]);
printf("\n");
return 0;
}
[1] 授業単元:プログラミング演習
[2] 問題文: 羽根の角度や長さが異なる2つのミュラーリヤー図形を表示するWindowsプログラム.ただ
し,キーボードやマウスの入力によって,どちらかの図形の羽根の角度や長さを簡単に変
更できるようにしておくこと.ウィンドウの右下部分に自分の名前,名列番号を表示させ
ること.(20点満点.マウスやキーボードによる変更ができない場合は10点満点)
[3] 環境
[3.1] OS:windows2000
[3.2] コンパイラ:Visual C++
[3.3] 言語:C++
[4] 期限:2005年06月12日
971 :
デフォルトの名無しさん:2005/06/07(火) 17:37:48
[1] 授業単元:プログラミング基礎
[2] 縦5横7の二次元配列を適当な整数で初期化し、縦5個の要素の総和を
横7の分だけ求め出力せよ。
[3] 環境
[3.1] OS:windowsXP
[3.2] コンパイラ:Visual C++
[3.3] 言語:C++
[4] 期限:2005年06月8日
どうかよろしくお願いします
[1] 授業単元:ソフトウェアU
[2] RSSファイルはXMLで記述されているので、木構造で管理できる。
ダウンロードしたRSSを読み込んで、特定分野(社会、スポーツなど)の記事タイトルと配信時間を表示するプログラムを作成せよ。
[3] 環境
[3.1] OS:Linux
[3.2] コンパイラ:cc
[3.3] 言語:C
[4] 期限:2005年06月8日 午後1時30分
[5] 木構造で作る
よろしくお願いします。
#include <iostream>
using namespace std;
int main()
{
int array[5][7] = { {1,2,3,4,5,6,7},{1,2,3,4,5,6,7},{1,2,3,4,5,6,7},{1,2,3,4,5,6,7},{1,2,3,4,5,6,7} };
int ans = 0;
for (int i = 0; i < 5; i++){
for (int j = 0; j < 7; j++){
cout.width(3);
cout << array[i][j];
}
putchar('\n');
}
cout << "-----------------------\n";
for (int j = 0; j < 7; j++){
for (int i = 0; i < 5; i++){
ans += array[i][j];
}
cout.width(3);
cout << ans;
ans = 0;
}
return 0;
}
[1] 授業単元:C++応用
[2] 以下の式に対応した、プログラムを作成せよ。
計算例:cal2 17 + 4 more * 43 more / 3.5
計算例:cal2 17 + 4
2項目以降も計算が続く場合は継続を示す単語"more"が入力されるものとする。
2項計算の場合はmoreは必要ない。
条件:
・文字列"more"の比較にstrcmp関数は使わない。
(それ以外の文字列の比較には使用可)
・比較に使う文字列"more"はグローバル定数で定義する。:const char〜
・入力項が"more"かどうかの判定は以下の関数で行う
関数名:chk_more
引数1:比較対象の文字列
戻り値:bool型 ture:"more"/flase:"more"以外
[3] 環境
[3.1] OS:WinXP
[3.2] コンパイラ:VC++
[3.3] 言語:C++
[4] 期限:2005年06月8日 午前7時
[5] ここまで完成しました。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/509.txt しかし、注釈を書いた部分がおかしいみたいで動きません。
どのようにすればよいのかよろしくお願いします。
表示するメッセージは既に組み込み済みとなっています。
#include <string>
using namespace std;
string g_more = "more";
bool chk_more(const string& s)
{
return s == g_more;
}
977 :
974:2005/06/07(火) 22:35:02
978 :
デフォルトの名無しさん:2005/06/07(火) 22:45:09
[1] 授業単元: 情報基礎
[2] 問題文(含コード&リンク): 乗除、剰余演算は一切使わず、代わりにシフト演算とビット列演算のみを用いて、
入力された10進数の値を、2進数と16進数にそれぞれ変換するプログラムを作成せよ。
[3] 環境
[3.1] OS:Windows/Linux/等々 WindowsXP
[3.2] コンパイラ(バージョン): gcc
[3.3] 言語:C/C++/どちらでも可 のいずれか C
[4] 期限:yyyy年mm月dd日hh:mmまで または 無期限 のいずれか 6月8日まで
よろしくお願いします。
979 :
965:2005/06/08(水) 00:00:10
981 :
980:2005/06/08(水) 00:06:59
return 0;
忘れた
>>978 #include <stdio.h>
int main () {
unsigned u;
int i, n;
printf("10進数を入力しろ: ");
scanf("%u", &u);
for (n = 1; n <= 4; n += 3) {
printf("%d進数: ", 1 << n);
for (i = sizeof u * 8 - n; i >= 0; i -= n)
putchar("0123456789abcdef"[(u >> i) & ((1 << n) - 1)]);
putchar('\n');
}
return 0;
}
983 :
978:2005/06/08(水) 00:11:31
984 :
デフォルトの名無しさん:2005/06/08(水) 02:13:32
3×3の行列A、B、CのためにINT型の二次元配列を3個用意し、C=A^t(Aの転置行
列)、C=A+B(AとBの行列和)、C=A*B(AとBの行列積)の計算結果を表示するプ
ログラムを作成し、実行しなさい。ただし、配列の要素へのアクセスにはポイン
タを使用し、また、各要素は100以下であるものとします。
入出力例)
Matrix A
Please input three elements in row#1:285
Please input three elements in row#2:937
Please input three elements in row#3.678
A =
(a, b, c)
(d, e, f)
(g, h, i)
の転置って
A^t =
(a, d, g)
(b, e, h)
(c, f, i)
でおk?
おk
>>984 Please input three elements in row#1:2185
という入力はどう解釈するの?
21, 8, 5
or
2, 18, 5
or
2, 1, 85