ぼるじょあがC/C++の宿題を片付けますYO! 35代目
926 :
デフォルトの名無しさん:04/12/11 03:42:57
うまく行くときと行かないときがあります。
どこを直せばいいしょうか?
/*単語を数え、各単語の先頭だけを大文字にする。*/
#include <stdio.h>
#define N 100
int word (char *, int);
int main (void)
{
char str[N], *error="ERROR!!";
int ret;
printf("文字列を入力して最後にReturnキーを押して下さい.\n");
gets(str);
ret = word(str, N);
if (ret == -1) printf(error);
else
{
printf("%s\n", str);
printf("%d語\n", ret);
}
return 0 ;
}
927 :
デフォルトの名無しさん:04/12/11 03:43:48
//単語の先頭だけを大文字にし、単語数を返す関数
int word (char *p, int n)
{
int word = 0;
char *p_0 = p;
while (*p)
{
//アルファベットが見つかったら
if ((0x41 <= *p && *p <= 0x5a) || (0x61 <= *p && *p <= 0x7a))
{
word++;
//先頭の1文字
if (0x61 <= *p && *p <= 0x7a) //小文字なら大文字に
*p-=32;
p++;
if ((int)(p-p_0) > n) return -1;
//その単語の残りの文字
while ((0x41 <= *p && *p <= 0x5a) || (0x61 <= *p && *p <= 0x7a))
{
if (0x41 <= *p && *p <= 0x5a) //大文字なら小文字に
*p+=32;
p++;
if ((int)(p-p_0) > n) return -1;
}//アルファベットの間ループ
}
928 :
デフォルトの名無しさん:04/12/11 03:44:09
p++;
if ((int)(p-p_0) > n) //型キャストはなくてもいいんですか?
return -1; //もしかしてnじゃなくてn-1!?
}
return word;
}
>>928 「うまくいかない」とはどう「うまくいかない」のか書け。
なんか文字列長がN以上のときに悩んでるみたいだが、
自作関数のほうでなんぼチェックしても、getsの地点ですでに壊れてるから意味ないわな
fgets使っとき
もしかしたら単語と単語の間にスペースを2個以上入れるとそれが単語の数
としてカウントされてしまうという不具合か?それはアルゴリズムが間違って
いるから。
あと、0x41とか32とか、ASCII文字体系でしか動かないハードコーディングを
していて好ましくないから、isalphaとかtoupper、tolowerを使うべき。
文字列の終端はポインタの減算でチェックするより、'\0'が現れる事によって
判断した方が楽。
>>929 >>930 N以下の文字列でもERRORになることがある・・・
>>931 えっ!そうなんすか?
どこがまずいんですか?
>>932 ヌル文字でってどうやってやるんですか?
str[N]以降にアクセスしたくないんですけど、
例えばヌル文字が出るまでk++するとかだと
str[N]より前に'\0'がなかったら
str[N]を超えて調べちゃいますよね?
オレにはそんなやり方しか思いつかない、、、
あそっか、kがN以上になったらそこで止めればいいだけか…
オレはバカ……
>>933 Cの文字列は'\0'で終わるもんだ。
p[n]より手前までに'\0'がないときは、そんな引数を渡す奴が悪い。
/*単語を数え、各単語の先頭だけを大文字にする。*/
#include <stdio.h>
#include <ctype.h>
#define N 100
int word(char *p);
int main(void)
{
char str[N], *error = "ERROR!!";
int ret;
printf("文字列を入力して最後にReturnキーを押して下さい.\n");
gets(str);
ret = word(str);
if (ret == -1)
puts(error);
else {
printf("%s\n", str);
printf("%d語\n", ret);
}
return 0 ;
}
//単語の先頭だけを大文字にし、単語数を返す関数
int word(char *p)
{
int word = 0;
while (*p) {
//アルファベットが見つかったら
if (isalpha(*p)) {
word++;
//先頭の1文字は大文字に
*p = (char)toupper(*p);
p++;
while (*p && isalpha(*p)) { // 残りの文字は小文字に
*p = (char)tolower(*p);
p++;
}
}
while (*p && !isalpha(*p)) // アルファベットまたはターミネート文字が出るまで p を進める
p++;
}
return word;
}
gets()をfgets()に直すのは宿題として取っておく。
939 :
デフォルトの名無しさん:04/12/11 10:11:13
>>939 そのファイルにはどのようにデータが入っているんだ?
941 :
939:04/12/11 10:24:54
>>940 なんかfopen("h:\\○○\\kyuu-yo.dat")みたいなのを使うみたいです。
>>941 そのバイナリ・ファイルがない事にはプログラムが作れません。
どこかにうpして下さい。
943 :
939:04/12/11 10:30:50
>>942 ファイル学校行かないとないんです…。形だけでもどうにかなりませんか?
>>943 いつまでもフザケた事言ってんじゃねえよ
ファイル学校ってどんな学校や
…とか一瞬考えたのは秘密
あわれ905楽しようとしたばっかりに
寝坊した漏れに笑いのネタを提供してくれた。
いや、7時には起きたんだけどね。
>>905のレスを見ても仕様がよく分からんから
二度寝したんだよね。
別に学校の宿題くらい納期過ぎたって問題ないっしょ
自分でガン( ゚д゚)ガレ
#include <stdio.h>
int main(void)
{
int n,i;
int flag;
printf("n=");
scanf("%d",&n);
flag=0;
for(i=2;i<=n-1;i++){
if(N%i==0){
flag=1;
break;
}
}
if(flag==1){
printf("Sosuu de nai|n");
}
else{
printf("Sosuu de aru\n");
}
}
これを関数を使用したプログラムに直してくれませんか。
判定対象の整数を引数とし、判定結果(素数である場合を0,素数でない場合を1)
を辺値とする。
また数値の入力と結果の表示はmainで行う
>>947 #include <stdio.h>
int isPrime(int num){
int i;
for(i = 2; i <= num - 1; ++i)
if(num % i == 0)
return 1;
return 0;
}
int main(void){
int n;
printf("n=");
scanf("%d",&n);
if(isPrime(n))
printf("Sosuu de nai|n");
else
printf("Sosuu de aru\n");
}
>判定結果(素数である場合を0,素数でない場合を1)
!!
isPrimeの戻り値と結果表示逆にしてくれ
>>950 結果表示はそのままでよかったんじゃないんですか?
>>951 だ。自分のそそっかしさが嫌になってきたorz
>辺値
どうもありがとうございました
>>944 なんだ、できないのか。糞の役にもたたねえな。
週末に2ちゃんで人の宿題するのも(・∀・)イイ!!
どうしようもない質問者に翻弄されるのも(・∀・)イイ!!
次スレ立てちゃっていい?
ところでターミネート文字って'\0'のことで、ヌル文字とおなじことだよねえ?
1000ゲットニダ ━━<ヽ`∀´>@∀@)`ハ´)´Д`>━━!!!!
>>937 最後のほうの
while (*p && !isalpha(*p)) // アルファベットまたはターミネート文字が出るまで p を進める
p++;
って、単にp++;だけでもたぶんできますよね?
こうしたのは何か意図があるんですか?
こっちのほうが速いとか?
>>959 m9(^Д^)プギャー
小学生みたいな返しだな。そんな低脳じゃできるわけないなwww
>>965 自分が低脳である事を棚にあげて、よくそこまで開き直れるもんだ。
でも開き直ってもプログラムはできないぞ。低脳。
>>966 それがどうした無能野郎
低脳でも無能よりマシだクソッタレ
喧嘩はイイクナイ
どうせ一人でやってるんだろ。
>>964 レス遅くなってスマソ。
単にp++;だけだと、文字列の最後を越えていつまででもpをインクリメントし続け、
そのうちアクセス違反を出すと思います。
>>967 氏ね。答えを書いてもらえなかったのは、お前の質問の仕方が糞だったからだ。
まず日本語勉強ちまちょーね。あ?日本人じゃねーのか?祖国に帰った方が
ええんとちゃうか?
>>970 でも一番外側のwhile(*p)があるからだいじょぶなんじゃないんですか?
>>973 だめです。最後にホワイトスペース文字が入っている場合を
考えてみて下さい。