C/C++の宿題を片付け ..
231:デフォルトの名無しさん
07/05/17 03:07:06
【質問テンプレ】
[1] 情報基礎論演習
[2] 課題1:2つの正方行列の和・差・積を求め、計算結果を見やすく画面に表示するプログラムを作成せよ。
ただし、両行列の要素はプログラム実行時にキー入力するものとする。(scanf)また、行列のサイズは4×4とする。
課題2:1で作成したプログラムを以下のように修正せよ。
・行列の要素はキー入力ではなくファイルから読み込む。(入力ファイルは自分で作成)
・計算結果は画面でなくファイルに出力すること。
[3] 環境
[3.1] Windows
[3.2] cygwin
[3.3] C
[4] 期限:5月18日
[5] 特になし
前に書いたのですが、スルーされてしまったのでもう一度書かさせてもらいます。
非常に困ってます。どうかよろしくお願いします。
232:デフォルトの名無しさん
07/05/17 03:08:46
>書かさせてもらいます
さ入れ言葉
233:デフォルトの名無しさん
07/05/17 05:26:00
>>231
/*
正方行列の和・差・積を表示するプログラム
*/
#include <stdio.h>
/* ユーザ定義型宣言 */
#define DIM 4
typedef struct
{
int element[DIM][DIM];
}matrixSquare;
/* 関数宣言部 */
matrixSquare AddSqu(matrixSquare* m1, matrixSquare* m2);
matrixSquare SubSqu(matrixSquare* m1, matrixSquare* m2);
matrixSquare MulSqu(matrixSquare* m1, matrixSquare* m2);
void inputMatrixSquare(matrixSquare* ms);
void putMatrixSquare(matrixSquare ms);
234:デフォルトの名無しさん
07/05/17 05:26:21
/* メイン関数 */
int main(void)
{
matrixSquare ma, mb;
/* 正方行列に数値を入力する */
{
printf("4x4の正方行列aを空白で区切って1行ずつ入力.\n"); inputMatrixSquare(&ma);
printf("4x4の正方行列bを空白で区切って1行ずつ入力.\n"); inputMatrixSquare(&mb);
/* 入力バッファに溜まるので、一気に全ての要素を入力しても良い */
}
/* 和・差・積を表示する */
{
printf("aとbの和\n"); putMatrixSquare(AddSqu(&ma, &mb));
printf("aとbの差\n"); putMatrixSquare(SubSqu(&ma, &mb));
printf("aとbの積\n"); putMatrixSquare(MulSqu(&ma, &mb));
}
return 0;
}
235:デフォルトの名無しさん
07/05/17 05:27:06
/* */
/* 関数の実装 */
/* */
matrixSquare AddSqu(matrixSquare* m1, matrixSquare* m2)
/* 正方行列同士の和を返す */
{
matrixSquare mRes;
int y, x;
for(y=0; y!=DIM; y++)
{
for(x=0; x!=DIM; x++)
{
mRes.element[y][x] = m1->element[y][x] + m2->element[y][x];
}
}
return mRes;
}
236:デフォルトの名無しさん
07/05/17 05:27:37
matrixSquare SubSqu(matrixSquare* m1, matrixSquare* m2)
/* 正方行列同士の差を返す */
{
matrixSquare mRes;
int y, x;
for(y=0; y!=DIM; y++)
{
for(x=0; x!=DIM; x++)
{
mRes.element[y][x] = m1->element[y][x] - m2->element[y][x];
}
}
return mRes;
}
237:デフォルトの名無しさん
07/05/17 05:27:54
matrixSquare MulSqu(matrixSquare* m1, matrixSquare* m2)
/* 正方行列同士の積を返す */
{
matrixSquare mRes;
int x, y, k;
for(y=0; y!=DIM; y++)
{
for(x=0; x!=DIM; x++)
{
int tmp;
for(k=0, tmp=0; k!=DIM; k++)
{
tmp += m1->element[k][x] * m2->element[y][k];
}
mRes.element[y][x] = tmp;
}
}
return mRes;
}
238:デフォルトの名無しさん
07/05/17 05:29:31
void inputMatrixSquare(matrixSquare* ms)
/* 正方行列を一行単位で入力する */
{
int i;
for(i=0; i!=DIM; i++)
{
printf("%d行目>", i+1);
scanf("%d %d %d %d", &(ms->element[i][0]), &(ms->element[i][1]), &(ms->element[i][2]), &(ms->element[i][3]));
}
printf("\n");
}
239:デフォルトの名無しさん
07/05/17 05:30:12
void putMatrixSquare(matrixSquare ms)
/* 正方行列を標準出力へ書き出す */
{
int x, y;
for(y=0; y!=DIM; y++)
{
for(x=0; x!=DIM; x++)
{
printf("%10d ", ms.element[y][x]);
}
printf("\n");
}
}
[EOF]
240:デフォルトの名無しさん
07/05/17 05:55:40
>238訂正
void inputMatrixSquare(matrixSquare* ms)
/* 正方行列を一行単位で入力する */
{
int i, j;
for(i=0; i!=DIM; i++)
{
printf("%d行目>", i+1);
for(j=0; j!=DIM; j++)
{
scanf("%d", &(ms->element[i][j]));
}
}
printf("\n");
}
241:デフォルトの名無しさん
07/05/17 05:56:55
うpロダ使えYO!
242:216
07/05/17 06:06:30
>>227 ありがとうございます無事できました。
クラスをnewで作成したとします。(仮に*test)とします。
これをクラス内のメソッドで消す方法はありませんか?
つまり、自クラスで自分をdeleteするということです。
自分は自信の名前を知らないので、
delete test ; と記述することが出来ません。
あらかじめprivate変数として自信の名前を記録しておく他ないのでしょうか?
243:デフォルトの名無しさん
07/05/17 06:50:35
delete This;
244:デフォルトの名無しさん
07/05/17 06:51:24
↑間違い
delete this;
です。
245:デフォルトの名無しさん
07/05/17 06:54:03
てかこれは基本中の基本であってもう一度C++勉強し直せ
246:デフォルトの名無しさん
07/05/17 08:01:23
>>231
問2。
URLリンク(kansai2channeler.hp.infoseek.co.jp)
247:デフォルトの名無しさん
07/05/17 09:10:59
[1] 授業単元:プログラミング
[2] 問題文(含コード&リンク):
【処理方式】
@ int型変数に値を入力する。(0〜9)
A chg関数に、入力した値を渡す。(ポインタ)
B その値が2で割って余りが0なら10倍し、余りが1なら5倍する。
C Main関数にてchgにて計算された値を表示する。
【処理結果】
Cnt =>XXXX
cnt(chg後) :XXXX
[3] 環境
[3.1] OS: WindowsXP
[3.2] コンパイラ名とバージョン: Borland C++ Compiler 5.5
[3.3] 言語: C言語
[4] 期限: 5/18
[5] その他の制限: 特にないです
248:デフォルトの名無しさん
07/05/17 09:41:50
>>247
#include<stdio.h>
void chg(int *cnt){
*cnt *= *cnt%2 ? 5 : 10;
}
int main(){
int cnt;
printf("Cnt =>");
scanf("%d",&cnt);
if(cnt<0 && 9<cnt) return 1;
chg(&cnt);
printf("cnt(chg後) :%d\n",cnt);
return 0;
}
249:デフォルトの名無しさん
07/05/17 09:46:33
>>247
>@ int型変数に値を入力する。(0〜9)
ってあるけど、
>Cnt =>XXXX
これと矛盾しない?
250:デフォルトの名無しさん
07/05/17 11:08:22 BE:31055982-2BP(222)
>>221
漠然としすぎててわからんと何度も言ってるわけだが。
>根付き木で、
そういうことじゃなくて、子は何人までとか、親子関係、兄弟関係の決め方とかが
わからんとやりようがねえって言ってんだよ。
その意味すら分からないなら単位落として退学しろクズ。
251:デフォルトの名無しさん
07/05/17 11:09:22
[1] 授業単元: C言語
[2] 問題文(含コード&リンク):
正負それぞれ、万、億の位まで対応できる読み上げ文字列生成プログラムを作成せよ。
[3] 環境
[3.1] OS: (Windows/Linux/等々) Linux
[3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等)gcc
[3.3] 言語: (C/C++/どちらでも可 のいずれか) C言語
[4] 期限: ([yyyy年mm月dd日hh:mmまで] または [無期限] のいずれか)明日の昼
[5] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々)
・「数値読み上げ」とは、数値を入力したときにその数字の読み方を表す文字列を生成して出力するプログラムで、
たとえば、「1」と入力したら「ICHI」、「1024」と入力したら「SEN NIJYU YON」と出力するプログラムです。
・拡張性やライブラリ化の容易さを考えて、生成した文字列を一旦文字配列変数に格納し、
読み上げ文字列が完成したあとでまとめて出力する形式でお願いしますorz
(引数として数値を与えて呼び出すと、return値として読み上げ文字列へのポインタを返すような関数を作成し、main関数からこれを呼び出す)
・各桁ごとの数字の文字列生成や4桁ごとに現れる千百十の単位の文字列生成のように、
繰り返し出現すつ処理は出来る限り1箇所にまとめてモジュール化する
制限多いですがよろしくおねがいしますm(__)m
252:デフォルトの名無しさん
07/05/17 11:18:50
>>250
もちつけw
>>221
>10個の整数データを木構造に保存し、
>順に木をなぞる再起プログラミングを作成せよ.
10個の整数データがあるのは解った。
深さ優先探索ってのも解った。
で、この10個の整数とやらをどうやって木にするんだ?
rootから順に、何らかの基準によって、
ある要素の子になったり、ある要素と同レベルの要素になったりするわけだろ?
それがわからなきゃコードなんか書きようがないだろ。
そもそも探索対象の木が作れないんだから。
で、これでもまだ理解できないなら、単位は諦めな。
もう一回受けるのが君のためだ。
253:デフォルトの名無しさん
07/05/17 12:00:30
[1] 授業単元: プログラミング
[2] 問題文(含コード&リンク):
次の無限等比級数の和を求めなさい。
∞ 1
Σ ━
n=1 n^4
[3] 環境
[3.1] OS: Windows
[3.2] コンパイラ名とバージョン: unix
[3.3] 言語: (C/C++/どちらでも可 のいずれか)
[4] 期限: (5/18)
[5] その他の制限: あまり詳しくありませんが、FILE *to; を使って記述するみたいです。
254:デフォルトの名無しさん
07/05/17 12:20:57
>>253 あまり賢くない方法で
#include <stdio.h>
#include <math.h>
int main()
{
FILE *to = fopen("output.txt", "wt");
double sum = 0, min = pow(10, -8);
long int n;
for(n = 1; 1/pow(n, 4) > min; n++)
sum += 1/pow(n, 4);
fprintf(to, "%.20f\n", sum);
return 0;
}
255:sage
07/05/17 13:06:29
>>254
すばやい対応ありがとうございました。
すいませんよろしければ教えてほしいのですが、
このときn^4のところが(n^4+2)となったらどのように記述したらよろしいでしょうか?
256:それくらいできないなら技術系の職には向いてないと言うことだ
07/05/17 13:37:48
>>255
n^4のときにpow(n, 4)と書いたのだから、(n^4+2)ならおなじようにすればいいんでない?
257:247
07/05/17 13:39:51
>>247
#include<stdio.h>
void chg(int *cnt){
*cnt *= *cnt%2 ? 5 : 10;
}
この意味を教えてもらっていいですか?
258:デフォルトの名無しさん
07/05/17 13:42:28
>B その値が2で割って余りが0なら10倍し、余りが1なら5倍する。
259:デフォルトの名無しさん
07/05/17 13:55:01
*cnt *= *cnt%2 ? 5 : 10;
この表記だと
参照はずしの* と *= との順位とか 参照はずしの* と % との順位で不安を感じるな
260:デフォルトの名無しさん
07/05/17 14:02:59
>>218お願いします><
261:247
07/05/17 14:13:47
>>259
参照はずしとはなんですか?
262:デフォルトの名無しさん
07/05/17 14:14:37
>>261
>参照はずしとはなんですか?
*
263:デフォルトの名無しさん
07/05/17 14:48:06 BE:29115735-2BP(222)
ここは宿題解説スレじゃないので答えもらったらさっさと持って帰れ。
264:デフォルトの名無しさん
07/05/17 15:33:04
>>218 >>260
#include <stdio.h>
typedef enum {false, true} bool;
bool isLowestTerm(int n, int d){
int i;
if(n == d && d != 1) return false;
for(i=n; i!=1; i--)
if(n%i == 0 && d%i == 0) return false;
return true;}
void PLT2(int num, int denomi){
if(num!=1) PLT2(num-1, denomi);
if(isLowestTerm(num, denomi))
printf("%d/%d\n", num, denomi);}
void PutLowestTerm(int n){
if(n != 1) PutLowestTerm(n-1);
PLT2(n, n);}
int main(void){
int n;
printf("n := "); scanf("%d", &n);
PutLowestTerm(n);
return 0;}
265:デフォルトの名無しさん
07/05/17 15:44:16
うぅむ、0が正しく処理されてないので訂正。
#include <stdio.h>
typedef enum {false, true} bool;
bool isLowestTerm(int n, int d){
int i;
if(n == 0) return (d == 1) ? true : false;
if(n == d && d != 1) return false;
for(i=n; i!=1; i--)
if(n%i == 0 && d%i == 0) return false;
return true;}
void PLT2(int num, int denomi){
if(num!=0) PLT2(num-1, denomi);
if(isLowestTerm(num, denomi))
printf("%d/%d\n", num, denomi);}
void PutLowestTerm(int n){
if(n != 1) PutLowestTerm(n-1);
PLT2(n, n);}
int main(void){
int n;
printf("n := "); scanf("%d", &n);
PutLowestTerm(n);
return 0;}
266:デフォルトの名無しさん
07/05/17 16:56:56
>>259
不安なら括弧つければいいじゃん
制限無しだったしそこまで丁寧にはやってないぞ
267:デフォルトの名無しさん
07/05/17 17:23:31
初めまして。大学1年生です。
プログラミングの授業で課題が出されました。
【質問テンプレ】
[1] 授業単元:プログラミング
[2] 問題文(含コード&リンク):
キーボードから文字列を入力し、それを逆順に表示するプログラムを作成せよ。
表示には必ずポインタを用いること。
[3] 環境
[3.1] OS:Windows xp
[3.2] コンパイラ名とバージョン:Microsoft Visual Studio .NET 2003を使っております。
[3.3] 言語:C言語
[4] 期限:[2006年05月23日17時まで]
[5] その他の制限:なし
よろしくお願いします。
268:デフォルトの名無しさん
07/05/17 17:31:54
#include <stdio.h>
int main()
{
char buf[100], *p;
fgets(buf, sizeof(buf), stdin);
for (p = buf; *p != '\n'; p++);
for (;p >= buf; p--)
putchar(*p);
return 0;
}
こうですか?
269:デフォルトの名無しさん
07/05/17 17:34:57
>>267
#include <stdio.h>
#include <string.h>
int main()
{
char buf[100];
if (fgets(buf, sizeof(buf), stdin) == NULL) return 1;
int ic = strlen(buf) - 1;
if (buf[ic] == '\n') --ic;
for (; ic >= 0; --ic) {
putchar(buf[ic]);
}
return 0;
}
270:デフォルトの名無しさん
07/05/17 17:42:46 BE:23292162-2BP(222)
>>267
URLリンク(c-kadai.sakura.ne.jp)
271:デフォルトの名無しさん
07/05/17 17:45:50
>267
#include <stdio.h>
int main(void)
{
char str[1024];
char *p;
scanf("%s", str);
p = str;
while(*p) p++;
while(p!=str) putchar(*--p);
return 0;
}
272:デフォルトの名無しさん
07/05/17 18:00:26
#include <stdio.h>
#define MAX_INPUT 1024
void
reverse(char *buf)
{
if (*(buf) == '\n')
return;
reverse(buf + 1);
putchar(*buf);
}
int
main()
{
char buf[MAX_INPUT];
if (fgets(buf, MAX_INPUT, stdin) == NULL)
return 1;
reverse(buf);
putchar('\n');
return 0;
}
273:デフォルトの名無しさん
07/05/17 18:15:20
>>267
void rp(char *s){
if(*++s)rp(s);
putchar(*--s);
}
int main(){
char s[256];
fgets(s,256,stdin);
rp(s);
return 0;
}
携帯だから遅い上に未確認 orz
274:デフォルトの名無しさん
07/05/17 18:50:27
プログラミングの授業で課題が出されたのですが、
コンパイルできても自分の思ってるとおりに動いてくれません。
何処が違うのか、また、どのように直せばいいのか指摘をお願いいたします。
【質問テンプレ】
[1] 授業単元:プログラミング
[2] 問題文(含コード&リンク):
連結リストの挿入・削除・表示を行う。
[3] 環境
[3.1] OS:Windows xp
[3.2] Borland C++ と BCC Developer
[3.3] 言語:C言語
[4] 期限:[2006年05月25日17時まで]
[5] その他の制限:なし
よろしくお願いします。
275:デフォルトの名無しさん
07/05/17 18:53:27
ソースうぷすれ
276:デフォルトの名無しさん
07/05/17 18:53:47
>>274
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct CELL{
struct CELL *next;
int value;
}
main(void){
int or,banti,mval,y,z;
struct CELL *header,*p,*q,*new,b,c,d;
header->next = &b;
header->value = 130;
b.next = &c;
b.value = 90;
c.next = &d;
c.value = 55;
d.next = NULL;
d.value = 160;
for(;;){
/*qを現在、pを次のポインタに設定*/
p = header->next;
q = header;
277:デフォルトの名無しさん
07/05/17 18:55:04
printf("[0]=挿入、[0以外]=削除\n");
scanf("%d",&or);
printf("何番目の要素[0〜]?\n");
scanf("%d",&banti);
if(or == 0){
printf("値を入力してください\n");
scanf("%d",&mval);
if(banti == 0){
/*リストの先頭に新しいセルを挿入する場合*/
if((q = malloc(sizeof(struct CELL))) == NULL){
printf("メモリーが足りない\n");
exit(0);
}
new->value = mval;
new->next = header;
header = new;
}else{
/*ポインタqで記されたセルの直後に新しいセルを挿入する*/
for(y = 1;y <= banti;y++){
q = p;
p = p->next;
}
if((p = malloc(sizeof(struct CELL))) == NULL){
printf("メモリーが足りない\n");
exit(0);
}
new->value = mval;
new->next = p;
q->next = new;
}
278:デフォルトの名無しさん
07/05/17 18:55:12
>276
headerは何を指してるの?
279:デフォルトの名無しさん
07/05/17 18:56:03
}else{
/*連結リストからの削除*/
if(banti == 0){
/*リストの先頭の削除*/
if(header == NULL){
printf("リストが空なので削除できない\n");
exit(0);
}
q = header;
header = q->next;
free(q);
}else{
/*ポインタqで記されたセルの直後のセルを削除する*/
z=1;
while(z < banti){
q = p;
p = p->next;
z++;
}
if(q->next == NULL){
printf("セルが無いから削除できない\n");
exit(0);
}
q->next=p->next;
free(p);
}
}
printf("表示\n");
for(p=header;p!=NULL;p=p->next){
printf("%3d\n",p->value);}}}
280:デフォルトの名無しさん
07/05/17 18:59:05
>>278
14行目のことなら、仮の連結リストをつくって、そこから挿入や削除をしていこうかと。
普通に変数とか構造体のポインタの使い方を間違えてるかもしれないので…
281:デフォルトの名無しさん
07/05/17 19:04:51
>header->next = &b;
>header->value = 130;
このときのheaderは何を指してるの?
282:デフォルトの名無しさん
07/05/17 19:06:32 BE:52408139-2BP(222)
>>280
>仮の連結リストをつくって
つくってないじゃん。
283:デフォルトの名無しさん
07/05/17 19:07:35
>>281
何かを指しているわけではなく単独でヘッダーという変数を作っただけです。
header > b > c > d という感じの連結リストになっているのですが…
あ、確かにこれは変な挙動起こしそう…直してきます。
284:デフォルトの名無しさん
07/05/17 19:09:16
>>283
>何かを指しているわけではなく単独でヘッダーという変数を作っただけです。
初期化してないポインタに代入しちゃ鼻から悪魔だお
285:デフォルトの名無しさん
07/05/17 19:09:49
どなたかおしえてください。
typedef double fp(double)
これどういうこと?
286:デフォルトの名無しさん
07/05/17 19:13:25
>>284
headerがポインタであることを忘れてました。
何でこれでコンパイルできたんだろうなぁ…
main(void){
int or,banti,mval,y,z;
struct CELL *header,*p,*q,*new,a,b,c,d;
header = &a;
a.next = &b;
a.value = 130;
b.next = &c;
b.value = 90;
c.next = &d;
c.value = 55;
d.next = NULL;
d.value = 160;
これでここのところは大丈夫でしょうか?
287:デフォルトの名無しさん
07/05/17 19:19:56
>>251
お願いしますm(_ _)m
288:デフォルトの名無しさん
07/05/17 19:26:19
>277
for(y = 1;y <= banti;y++){ → for(y = 1;y < banti;y++){
if((p = malloc(sizeof(struct CELL))) == NULL){
→ if((new = malloc(sizeof(struct CELL))) == NULL){
>279
free(p) → free(q)
これで多分大丈夫
289:デフォルトの名無しさん
07/05/17 19:33:06
>>285
識別子 fp を、double を引数とし double を返す関数の型として宣言
290:デフォルトの名無しさん
07/05/17 19:53:29 BE:54348847-2BP(222)
>>283
>何かを指しているわけではなく
何かを指さないと連結できないだろが。
291:デフォルトの名無しさん
07/05/17 19:54:06 BE:38820454-2BP(222)
>>287
今やってる。思いの外大変だ。
292:267
07/05/17 19:56:19
>>268様
>>269様
>>270様
>>271様
>>272様
>>273様
ご回答ありがとうございました。
いろんな答えは、今後の勉強になります!!
ありがとうございました。
293:デフォルトの名無しさん
07/05/17 20:17:11
>>291
ありがとうございます!!
待ってますm(_ _)m
294:デフォルトの名無しさん
07/05/17 20:25:33
入力した文章中の単語を1行に一つずつ印字するプログラムを書け。
(ここでの単語とは、ブランク,タブ,改行文字で区切られた文字)
例えば、
This is a book.
と入力すると、
This
is
a
book.
と表示される。
while((c=getchar()) != EOF)
という文を使って文章を入力し、while文終了後に一気に表示させたいのですが、どうやって表示させればいいのかわかりません。
教えてください。
295:274
07/05/17 20:32:55
>>281様
>>283様
>>288様
etc…様
ご回答ありがとうございます!
でも、まだ実際に動かしてみると
部分部分で可笑しな挙動をしてたりしてますが、
初期の状態よりは随分とマシになったような気がいたします。
しばし、自分の力で頑張ってみようと思いますが、
しばらくこのスレを見ながらプログラムをうってますので
どこか変な場所が見つかればご指摘お願いいたします。
またわからなくなった時は聞きにきますので
その時は宜しくお願いします。ありがとうございました。
296:デフォルトの名無しさん
07/05/17 20:34:40
>>294
#include <stdio.h>
#include <ctype.h>
int main(void)
{
int c;
printf("Input strings > ");
while((c=getchar()) != EOF) {
if( isspace(c) ) putchar('\n');
else putchar(c);
}
return 0;
}
297:デフォルトの名無しさん
07/05/17 20:43:25
>>296でwhileを抜けるには最後に Ctrl+Z とかでEOFを入力しておいてね
298:デフォルトの名無しさん
07/05/17 20:46:45 BE:46584364-2BP(222)
>>251>>287 できた。
#include<stdio.h>
#include<stdlib.h>
char* reading4(int d, char* add){
char* result = NULL;char* restmp;
char* places[]={"SEN","HYAKU","JU",""};
char* digits[]={NULL,"","NI","SAN","YON","GO","ROKU","NANA","HACHI","KYU",};
char* reed[4]={NULL,NULL,NULL,NULL};char tmp[256];int i,len;size_t total=0;
sprintf(tmp,"%i",d);len=(int)strlen(tmp);for(i=0;i<len&&i<4;i++){
if(tmp[len-i-1]-'0'){reed[3-i]=digits[tmp[len-i-1]-'0'];
total+=strlen(reed[3-i])+strlen(places[3-i])+1;}}
if(len>3&&tmp[len-4]=='1'){reed[0]="IS";total+=2;}if(len&&tmp[len-1]=='1'){
if(add&&add[0]){char ls[1024];sprintf(ls,"I%c%s",add[0],add);reed[3]=ls;
total+=strlen(ls);}else{reed[3]="ICHI";total+=4;}}
result=(char*)malloc(total+1);restmp=result;for(i=0;i<4;i++){if(reed[i]){
restmp+=sprintf(restmp,"%s%s ",reed[i],(tmp[i]-'0')?places[i]:"");}}
return result;}
int main(void){char tmp[256];char* places[]={"CHO ","OKU ","MAN ",""};
char* reed[4]={NULL,NULL,NULL,NULL};int data,i;fgets(tmp,256,stdin);
data=atoi(tmp);if(data){for(i=0; data>0 && i<4; i++){if(data%10000){
reed[3-i]=reading4(data%10000,(i==0)?places[3-i]:"");data/=10000;}}
for(i=0;i<4;i++){if(reed[i]){fputs(reed[i],stdout);fputs(places[i],stdout);
free(reed[i]);}}}else{fputs("ZERO",stdout);}putchar('\n');return 0;}
299:294
07/05/17 20:47:38
>>296
これだと、Enterを押したときにひょうじされませんか
300:デフォルトの名無しさん
07/05/17 20:56:00
>>299
標準入力にて EOF を検出したら while ループ終了でしょ?
ちゃんと最後のEOFを入力してちょうだいな。
301:294
07/05/17 20:58:42
>>300
できれば、whileループ終了後にまとめて表示したいのですが
302:デフォルトの名無しさん
07/05/17 21:00:06
>>301
だからその終了の条件が EOF が入力されたという条件でしょ?
EOFを入力してくれよ
303:デフォルトの名無しさん
07/05/17 21:01:24
>>301
入力された文字を格納する文字配列でも必要ってこと?
304:294
07/05/17 21:02:48
>>302
EOFを入力したらプログラムが終わってしまいます。
Enterを押したときに表示するのでなく、EOFを入力したときに表示したいのです
305:デフォルトの名無しさん
07/05/17 21:03:08
>>298
ありがとうございます!!
でも100とか1000とか表示されません…
あと、1300とかはISSEN SANHYAKUではなくてISSEN SANBYAKUのように表示しないと
いけないんですorz
306:デフォルトの名無しさん
07/05/17 21:10:06
>>304 んなこたぁ〜ねぇべ、ちゃんと入力した文字は空白ごとに改行されて表示すっぺ。
まぁ、こんな漢字で文字配列に格納してやってみるがや
#include <stdio.h>
#include <ctype.h>
int main(void) {
char c,buf[1024],i;
printf("Input strings > ");
while((c=getchar()) != EOF) {
if( isspace(c) ) buf[i++]='\n';
else buf[i++]=c;
}
buf[i]='\0';
puts(buf);
return 0;
}
307:デフォルトの名無しさん
07/05/17 21:13:08
>>306の最初の i=0; を忘れてたがや。まぁ、while以外の条件もちゃんと書いてやぁ。
あと>>1のフォームさ忘れるでねぇ
308:294
07/05/17 21:19:10
>>307
ありがとうございます。
質問用のテンプレ忘れてすみません
309:デフォルトの名無しさん
07/05/17 21:24:39
>>306
ちょっとダサイけど、こんな風にしたら改行が続かずに済むよ。
int flag = 0;
while ((c=getchar()) != EOF) {
if (isspace(c))
flag = 1;
else {
if (flag == 1) {
buf[i] = '\n';
++i;
}
flag = 0;
buf[i] = c;
++i;
}
}
310:デフォルトの名無しさん
07/05/17 21:24:46
>>251
#include "stdio.h"
#include "stdlib.h"
char *num[] = {
0, "", "ni", "san", "yon", "go", "roku", "nana", "hachi", "kyuu"
};
char *po10[] = {"", "juu", "hyaku", "sen"};
char *po10_4[] = {"", "man", "oku", "chou"};
char *get_kurai(int n)
{
if (n % 4) return po10[n % 4];
else return po10_4[n / 4];
}
続く
311:310
07/05/17 21:26:05
char *do_yome(int x, int n)
{
char *yomi, *tmp, *xnum, *kurai;
int l;
if (x < 10) {
kurai = get_kurai(n); xnum = num[x];
if (!*xnum && n >= 4) xnum = "ichi";
yomi = malloc(strlen(xnum) + strlen(kurai) + 1);
strcat(strcpy(yomi, xnum), kurai);
return yomi;
}
yomi = do_yome(x / 10, n + 1); xnum = num[x % 10];
if (xnum) {
if (n == 0 && !*xnum) xnum = "ichi";
kurai = get_kurai(n);
tmp = malloc(strlen(xnum) + strlen(kurai) + strlen(yomi) + 2);
strcat(strcat(strcat(strcpy(tmp, yomi), " "), xnum), kurai); free(yomi);
yomi = tmp;
}
return yomi;
}
312:311
07/05/17 21:27:14
char *yome(x)
{
char *yomi, *minus;
if (x == 0) return strdup("zero");
if (x < 0) yomi = do_yome(-x, 0);
else yomi = do_yome(x, 0);
if (x < 0) {
minus = malloc(strlen("mainasu ") + strlen(yomi) + 1);
strcat(strcpy(minus, "mainasu "), yomi); free(yomi);
yomi = minus;
}
return yomi;
}
int main(int ac, char **av)
{
int x;
char *yomi;
x = atoi(av[1]);
yomi = yome(x);
printf("%s\n", yomi);
free(yomi);
}
313:デフォルトの名無しさん
07/05/17 22:12:29
何遍も言うとろうが!
読みの例外処理せんといかんて!
お前らアホか!
314:デフォルトの名無しさん
07/05/17 22:13:45
宿題で例外処理とか・・・
315:デフォルトの名無しさん
07/05/17 22:15:28
こんなところで宿題を○投げすることそのものが例外であります!
316:デフォルトの名無しさん
07/05/17 22:24:46
じゃあ、例外処理をしないとな
317:デフォルトの名無しさん
07/05/17 22:25:32
>>294
#include <stdio.h>
#include <ctype.h>
int main()
{
int c;
FILE *fp = tmpfile();
while ((c = getchar()) != EOF) {
if (isspace(c)) {
while (isspace(c = getchar()))
;
ungetc(c, stdin);
putc('\n', fp);
} else
putc(c, fp);
}
rewind(fp);
while ((c = getc(fp)) != EOF)
putchar(c);
fclose(fp);
return 0;
}
318:デフォルトの名無しさん
07/05/17 22:27:51
>>317
さぁ、ティムポ、もとい、テムポファイルの詳細を書いて頂こうではないか
> tmpfile();
319:デフォルトの名無しさん
07/05/17 22:28:48
>>318
処理系依存です。
320:デフォルトの名無しさん
07/05/17 22:30:58
そぉ〜かそうかぁ、大きさや形は人それぞれ、個人依存ってやつか。ほぉ〜れ、俺のは○×いぞぉ〜
はっはっは(ダイバスターの博士風に
321:デフォルトの名無しさん
07/05/17 22:31:02
>>318
tmpfile()がANSI/ISO C標準関数であることを知らないのではあるまいな
322:デフォルトの名無しさん
07/05/17 22:32:38
>>321
URLリンク(www.bohyoh.com)
知っとるぞ。さぁ、次のお題だが・・・
323:デフォルトの名無しさん
07/05/17 22:34:33
>>317
> int main()
括弧の中がANSI、ISO準拠でない点について。
324:デフォルトの名無しさん
07/05/17 22:38:28
>>264-265
dクスです!><
325:デフォルトの名無しさん
07/05/17 22:38:31
>>323
C89はK&Rスタイルを許してるんでなかったっけか?
326:デフォルトの名無しさん
07/05/17 22:44:13
gcc -Wallで-ansiとか-std=c99とかつけても何も言われないみたいだな
>>317のソース
327:デフォルトの名無しさん
07/05/17 22:47:20
>>321
> tmpfile()がANSI/ISO C標準関数
っとANSI / ISOの話を持ち出すならなおさらパラメーターがなければ
int main(void) 、あれば int main(int argc, char * argv[])というのは過去スレで既出が
もう議論はせんぞぉ〜。では、次の問題だが・・・ANSI、ISO準拠を無視したら動かないコンパイラは何か?
ダイバスター出動!
328:デフォルトの名無しさん
07/05/17 22:48:35
>>327
いやだから、K&Rスタイルは別に規格無視ではないのでは?
C++なら明白に違法だけど。
329:デフォルトの名無しさん
07/05/17 22:49:26
ていうか>>318は結局何が聞きたかったのやら。
意図が分からない。
330:デフォルトの名無しさん
07/05/17 22:56:01
>>328
C++でプロトタイプ無しは違法だが、
int main()に関しては、Cのint main(void)と同じだから、
C++でも違法ではないわな。
331:デフォルトの名無しさん
07/05/17 22:58:12
ただの宿題で泥沼になったわな
332:デフォルトの名無しさん
07/05/17 23:01:00
またmainの規格議論か!
333:デフォルトの名無しさん
07/05/17 23:01:38
ANSI Cでプロタイプを必須にしていれば、
voidなどという引数宣言を作らずに、C++同様にする
こともできたはず。
Denis Ritchieもそれを醜いと認めていたようだしね。
334:デフォルトの名無しさん
07/05/17 23:05:02
>>328
ANSI、ISO標準の話を持ち出す場合はint mainについてもそれ準拠が望ましいという話だが?
これ以上は議論せんぞ。自分で言っていて墓穴を掘るくらいならしゃべらない方が良いぞ。
では次の問題だが・・・ANSI、ISO準拠で書かれていないソースをウェブサイトや書物で公開しちゃっている
のは、いったい何者か?ダイバスター出動!
335:デフォルトの名無しさん
07/05/17 23:06:54
>>332
残念、mainの規格ではなくANSI、ISO準拠(それに応じて従って)で記述するソースなら
なおさらという話だ。tmpfile()がANSI/ISO C標準関数といっておきながら、プログラムの主体となる
main関数がANSI、ISO準拠でないのはこれいかに?
336:デフォルトの名無しさん
07/05/17 23:07:02
>>334
> ANSI、ISO標準の話を持ち出す場合はint mainについても
> それ準拠が望ましいという話だが?
んな脳内ルールを押し付けられてもな。
そんな話にこだわってんの、あんた一人みたいだし。
で、あんたは>>318で結局何を言いたかったの?
337:デフォルトの名無しさん
07/05/17 23:08:05
>>334
カーニハンとリッチー。
知ってる?とっても有名な人ですが。
ANSI C準拠のK&R第二版の先頭のサンプルは
main()
ではじまります。
338:デフォルトの名無しさん
07/05/17 23:08:16
もはや、ここは宿題を片付けてくれるようなスレではない
339:デフォルトの名無しさん
07/05/17 23:09:40
そう、詰まる話が、自分でANSI、ISO C標準関数の話を持ち出したのに
mainがANSI、ISO C標準関数の形式で書かれていないのが引っかかったわけだ。
だがこれ以上それについては議論せんぞ。ANSI、ISO準拠のmain関数の記述は
ISOのページにもしっかりと引数があるかないかで
int main(void) または int main(int argc, char * argv[]) と記されておったからな。
では次の問題だ。このスレはいったい何のスレか?ダイバスター出動!
340:デフォルトの名無しさん
07/05/17 23:10:10
まぁ明日の昼頃には収まってるだろうから、
丸投げしたい人はそれまで自分で努力してみるんだ
無駄だと思うけど。
341:デフォルトの名無しさん
07/05/17 23:11:10
>>339
で、>>318は何だったわけ?
なんか君、自分がものすごーく的外れなこと言ったからって
誤魔化しに走ってるだけじゃないの?
いつもの下らないmain()議論でお茶濁そうとして。
342:デフォルトの名無しさん
07/05/17 23:13:39
ANSI、ISO標準の話を持ち出したのにint main()必死だなw
343:デフォルトの名無しさん
07/05/17 23:16:40
>>342
> ANSI、ISO標準の話を持ち出したのにint main()必死だな
tmpfile()の説明をするんなら、標準関数だと説明するのが手っ取り早いでしょ。
で、K&Rスタイルでmain()を記述することは違法ではないし、
そんなのはかのカーニハンとリッチーが、ANSI C対応版と謳ってる
K&R第二版でやっとるわけです。
こんなところで下らない議論を続けるのなら、彼らに文句を言ったらどうかな?
344:デフォルトの名無しさん
07/05/17 23:18:30
JIS X3010:2003では、関数定義で括弧の中が空なら、
引数がないものとして扱うというような規定があり、
このことから俺は、関数定義時なら()と(void)は同じでは、と思うのだがどうだろう?
345:デフォルトの名無しさん
07/05/17 23:20:39
>>344
つまり
C89ではK&Rスタイルが許されているので合法である。
C99ならvoidと解釈されるのでC++と同じ意味で合法になる、ということですか?
さっきから暴れているいつもの人は、なんなんでしょう。
346:デフォルトの名無しさん
07/05/17 23:21:10
321 名前:デフォルトの名無しさん 投稿日:2007/05/17(木) 22:31:02
>>318
tmpfile()がANSI/ISO C標準関数であることを知らないのではあるまいな
ANSI、ISO標準関数を持ち出すならなおさらプログラムの開始のmain関数が
int main(必要に応じた引数)というのを知らないではあるまいな
347:デフォルトの名無しさん
07/05/17 23:22:23
>>339
宿題スレだ
だから帰れ
348:デフォルトの名無しさん
07/05/17 23:25:05
ANSI、ISO準拠の話にC89ではK&Rスタイルの話を持ち込んでくる奴わろすwwwwwwww
お前のスタイルをはっきりしろよw
349:デフォルトの名無しさん
07/05/17 23:25:43
こりゃ明日の朝まで放置、だな……
350:デフォルトの名無しさん
07/05/17 23:26:36
328 名前:デフォルトの名無しさん 投稿日:2007/05/17(木) 22:48:35
>>327
いやだから、K&Rスタイルは別に規格無視ではないのでは?
C++なら明白に違法だけど。
C++なら明白に int main()の過去の中がなくてもOKなんすけど?
こいつわかってねーわ、話にならねーから仕様書に目を通してないなら黙ってろ。
351:デフォルトの名無しさん
07/05/17 23:26:45
>>348
規格/言語仕様とスタイルの区別がついてない厨房って以前もいたなぁ
確かボコボコに突っ込まれてたけど
352:デフォルトの名無しさん
07/05/17 23:27:40
>>350
その
> C++なら明白に違法だけど
は、
> K&Rスタイル
にかかっているのです。
353:デフォルトの名無しさん
07/05/17 23:40:27
この流れ秋田
354:デフォルトの名無しさん
07/05/17 23:51:21
いまだ!ANSI、ISO標準とか言っておきながら肝心のmain関数がANSI、ISO準拠になっていない奴
ぬるぽ!
355:デフォルトの名無しさん
07/05/17 23:51:46
こまち
356:デフォルトの名無しさん
07/05/17 23:56:43
職場でいじめられたストレスを解消しにきたんだろ。
きっとまた同じハゲの犯行。
357:デフォルトの名無しさん
07/05/18 00:38:08
[1] 授業単元:構文解析
[2] 問題文(含コード&リンク):
次のプログラムを書き換えて、自然数の足し算を行うプログラムを作成せよ。
また、自然数の足し算、引き算そして掛け算を行えるよう拡張せよ。
URLリンク(kansai2channeler.hp.infoseek.co.jp)
[3] 環境
[3.1] OS:WindowsXP
[3.2] コンパイラ名とバージョン: gcc
[3.3] 言語: C
[4] 期限: 2007/05/18
[5] その他の制限: スタックやキューまで
358:デフォルトの名無しさん
07/05/18 00:45:32
【質問テンプレ】
[1] 情報基礎論演習
[2] 課題1:2つの正方行列の和・差・積を求め、計算結果を見やすく画面に表示するプログラムを作成せよ。
ただし、両行列の要素はプログラム実行時にキー入力するものとする。(scanf)また、行列のサイズは4×4とする。
課題2:1で作成したプログラムを以下のように修正せよ。
・行列の要素はキー入力ではなくファイルから読み込む。(入力ファイルは自分で作成)
・計算結果は画面でなくファイルに出力すること。
[3] 環境
[3.1] Windows
[3.2] cygwin
[3.3] C
[4] 期限:5月18日
[5] 特になし
231で書いたのですが、課題2を1つのmain関数内に入れてできないでしょうか?できるだけわかりやすくポインタを使わずに作って欲しいです。どうかよろしくお願いします。
359:デフォルトの名無しさん
07/05/18 00:49:06
わかりやすくして欲しいのにmain関数だけで書けとは・・・
360:358
07/05/18 01:03:32
すいません。
課題1をmain関数だけで書いてしまったもので・・・
矛盾してるかもしれないけどよろしくお願いします。
361:>358
07/05/18 01:15:12
コマンドラインで
も前の作ったプログラム.exe < 入力ファイル > 出力ファイル
ではいかんのか?
362:デフォルトの名無しさん
07/05/18 01:23:29
プログラムを修正しろという制限があるから厳しいのでは?
363:デフォルトの名無しさん
07/05/18 01:25:33
>>358
main()の先頭をこんな感じに汁。
その後は、課題1と全く同じでOKのはずだ。
int main(int argc, char **argv)
{
if (argc < 3 || !freopen(argv[1], "r", stdin)
|| !freopen(argv[2], "w", stdout))
return 1;
364:358
07/05/18 01:30:03
まず、入力ファイルの作り方がわかりません。
後、ファイルを読み込む時のプログラムと書き込む時のプログラムがどのように書けばいいのか分かりません。
C言語初心者なんですみません。
なにかわかりやすい例やサイトなどでもあったら紹介してください。よろしくお願いします。
365:357
07/05/18 01:30:14
>>357
よろしくお願いします。
366:>364
07/05/18 01:34:16
>363 試したか?
367:デフォルトの名無しさん
07/05/18 01:43:58
>>364
cygwinということだが
cygwinのbash(シェル)だとかgcc(コンパイラ)だとかの使い方は分かるのか?
> まず、入力ファイルの作り方がわかりません
ということは、それ以前の問題のようだが
368:デフォルトの名無しさん
07/05/18 01:51:07
>>360
> 課題1をmain関数だけで書いてしまったもので・・・
えーと、つまり、漏れがやった課題1はガン無視っつう事でゴザルですか?
369:デフォルトの名無しさん
07/05/18 01:58:45
無視とは最低な奴だな
スルーでいこ
370:364
07/05/18 02:07:46
すみません学校から帰ってたもので書き込み遅くなってしまいました
371:364
07/05/18 02:09:49
368さん
void関数やforループを参考にさせていただきました。ありがとうございます。
ただ自分には高度なやり方だったのですべてを理解することができませんでした。すみません。
今から363さんのをやってみたいと思います。
372:364
07/05/18 02:14:01
367さん
コンパイルなどの仕方は分かります。
ただ要素の入ったファイルはどのように書けばいいのか分からないのです。
373:デフォルトの名無しさん
07/05/18 02:17:26
>>251
やっとできた。これだけ共通化すれば文句ないだろう・・・
int ct[] = {
6166,1803,30,32,37,34,39,36,43,35,25,1155,1157,1162,1159,1164,
1161,1168,1160,27,1245,49307,1252,1249,2008,1251,2009,1250,1848,
1200,43322,1207,1204,1209,1206,1874,1205,1008,910,29901303,
};
int pt[][2] = {
{0,0},{0,82},{0,69},{0,73},{0,67},{0,72},{0,78},{0,83},{0,65},
{0,89},{0,79},{0,71},{0,75},{0,85},{0,74},{0,66},{0,80},
{0,90},{0,77},{9,13},{12,13},{2,6},{8,6},{8,20},{9,23},
{14,19},{7,21},{5,24},{1,10},{5,8},{6,3},{6,22},{7,22},
{9,10},{11,10},{12,19},{31,8},{33,6},{4,5},{28,20},{38,3},
{7,26},{16,16},{29,40},{42,24},
};
void Print(int n, unsigned char **b)
{
int *p;
for ( ; n; n /= 45)
if (*(p = pt[n % 45])) Print(p[0], b), Print(p[1], b);
else *(*b)++ = p[1];
}
void PrintTok(int n, unsigned char **b)
{
Print(n, b); *(*b)++ = ' ';
}
374:デフォルトの名無しさん
07/05/18 02:18:40
>>372
っつーか、要素の入ったファイルの形式は?どのようにファイルに書き出せば良いのか
こっちがわからん。4行4列って指定があるから、単純に上から4行4列ずつ
8行4列に空白なりで区切られた値のファイルを読み込めば良いノカー
375:373
07/05/18 02:20:13
void Yomiage1000(int num, unsigned char **buf)
{
int i, n, d;
for (i = 27, n = 1000; n; i -= 9, num %= n, n /= 10)
if((d = num / n) != 0) PrintTok(ct[i + d], buf);
}
unsigned char *Yomiage(int num, unsigned char *buf)
{
int i, n, d;
unsigned char *b = buf;
if (num == 0) Print(ct[0], &b);
else {
if(num < 0) PrintTok(ct[39], &b), num = -num;
for (i = 38, n = 100000000; n; i --, num %= n, n /= 10000)
if ((d = num / n) != 0) {
Yomiage1000(d, &b);
if (1 < n) PrintTok(ct[i], &b);
}
}
*b = '\0';
return buf;
}
376:373
07/05/18 02:20:59
int main(void)
{
unsigned char buf[1000];
printf("%s\n", Yomiage(123456789, buf));
return 0;
}
377:デフォルトの名無しさん
07/05/18 02:23:00
[1] 授業単元: プログラミング
[2] 問題文(含コード&リンク):
課題1:4行4列の行列Aの各要素を入力して、その転置行列A’を計算して出力するプログラムを作成せよ。
[3] 環境
[3.1] OS: Windows
[3.2] コンパイラ名とバージョン:わかりません
[3.3] 言語: C++
[4] 期限: 2007年5月18日10:00まで
課題あること忘れててヤバイです。お願いします。m(__)m
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
4192日前に更新/299 KB
担当:undef