ぼるじょあがC/C++の宿題を片付けますYO! 35代目

このエントリーをはてなブックマークに追加
925デフォルトの名無しさん:04/12/11 03:06:57
>>923
氏ねよマルチ野郎
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;
}
929デフォルトの名無しさん:04/12/11 04:36:14
>>928
「うまくいかない」とはどう「うまくいかない」のか書け。
930デフォルトの名無しさん:04/12/11 04:56:09
なんか文字列長がN以上のときに悩んでるみたいだが、
自作関数のほうでなんぼチェックしても、getsの地点ですでに壊れてるから意味ないわな

fgets使っとき
931デフォルトの名無しさん:04/12/11 04:58:45
もしかしたら単語と単語の間にスペースを2個以上入れるとそれが単語の数
としてカウントされてしまうという不具合か?それはアルゴリズムが間違って
いるから。
932デフォルトの名無しさん:04/12/11 05:00:24
あと、0x41とか32とか、ASCII文字体系でしか動かないハードコーディングを
していて好ましくないから、isalphaとかtoupper、tolowerを使うべき。

文字列の終端はポインタの減算でチェックするより、'\0'が現れる事によって
判断した方が楽。
933926-928:04/12/11 08:43:11
>>929
>>930
N以下の文字列でもERRORになることがある・・・

>>931
えっ!そうなんすか?
どこがまずいんですか?

>>932
ヌル文字でってどうやってやるんですか?
str[N]以降にアクセスしたくないんですけど、
例えばヌル文字が出るまでk++するとかだと
str[N]より前に'\0'がなかったら
str[N]を超えて調べちゃいますよね?
オレにはそんなやり方しか思いつかない、、、
934デフォルトの名無しさん:04/12/11 09:00:26
あそっか、kがN以上になったらそこで止めればいいだけか…
オレはバカ……
935デフォルトの名無しさん:04/12/11 09:00:52
>>933
Cの文字列は'\0'で終わるもんだ。
p[n]より手前までに'\0'がないときは、そんな引数を渡す奴が悪い。
936デフォルトの名無しさん:04/12/11 09:17:20
/*単語を数え、各単語の先頭だけを大文字にする。*/

#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 ;
}
937デフォルトの名無しさん:04/12/11 09:17:40
//単語の先頭だけを大文字にし、単語数を返す関数
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;
}
938デフォルトの名無しさん:04/12/11 09:18:35
gets()をfgets()に直すのは宿題として取っておく。
939デフォルトの名無しさん:04/12/11 10:11:13
誰か>>905をお願いします。
940デフォルトの名無しさん:04/12/11 10:17:53
>>939
そのファイルにはどのようにデータが入っているんだ?
941939:04/12/11 10:24:54
>>940
なんかfopen("h:\\○○\\kyuu-yo.dat")みたいなのを使うみたいです。
942デフォルトの名無しさん:04/12/11 10:26:39
>>941
そのバイナリ・ファイルがない事にはプログラムが作れません。
どこかにうpして下さい。
943939:04/12/11 10:30:50
>>942
ファイル学校行かないとないんです…。形だけでもどうにかなりませんか?
944デフォルトの名無しさん:04/12/11 10:36:09
>>943
いつまでもフザケた事言ってんじゃねえよ
945デフォルトの名無しさん:04/12/11 11:44:38
ファイル学校ってどんな学校や
…とか一瞬考えたのは秘密
946906:04/12/11 12:21:30
あわれ905楽しようとしたばっかりに
寝坊した漏れに笑いのネタを提供してくれた。

いや、7時には起きたんだけどね。
>>905のレスを見ても仕様がよく分からんから
二度寝したんだよね。

別に学校の宿題くらい納期過ぎたって問題ないっしょ
自分でガン( ゚д゚)ガレ
947デフォルトの名無しさん:04/12/11 13:55:31
#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で行う
948926-928:04/12/11 14:17:52
>>936-938
ありがとうございます。かなり参考になるっす。
949 ◆zKht1y/vIY :04/12/11 14:27:46
>>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");
}
950 ◆zKht1y/vIY :04/12/11 14:30:11
>判定結果(素数である場合を0,素数でない場合を1)
!!
isPrimeの戻り値と結果表示逆にしてくれ
951デフォルトの名無しさん:04/12/11 14:57:19
>>950
結果表示はそのままでよかったんじゃないんですか?
952 ◆zKht1y/vIY :04/12/11 15:27:12
>>950
ホントだ。俺の最初のが間違ってた。
953 ◆zKht1y/vIY :04/12/11 15:28:02
>>951
だ。自分のそそっかしさが嫌になってきたorz
954デフォルトの名無しさん:04/12/11 15:28:36
>辺値
955デフォルトの名無しさん:04/12/11 15:28:40
どうもありがとうございました
956デフォルトの名無しさん:04/12/11 15:38:52
>>944
なんだ、できないのか。糞の役にもたたねえな。
957デフォルトの名無しさん:04/12/11 15:41:00
>>954
じゃあまちがってる?
週末に2ちゃんで人の宿題するのも(・∀・)イイ!!
どうしようもない質問者に翻弄されるのも(・∀・)イイ!!
959デフォルトの名無しさん:04/12/11 16:35:46
>>956
お前が糞。
960デフォルトの名無しさん:04/12/11 17:16:10
次スレ立てちゃっていい?
961デフォルトの名無しさん:04/12/11 17:28:39
962デフォルトの名無しさん:04/12/11 17:55:36
ところでターミネート文字って'\0'のことで、ヌル文字とおなじことだよねえ?
963デフォルトの名無しさん:04/12/11 18:10:15
1000ゲットニダ ━━<ヽ`∀´>@∀@)`ハ´)´Д`>━━!!!!
964デフォルトの名無しさん:04/12/11 18:12:32
>>937
最後のほうの

while (*p && !isalpha(*p)) // アルファベットまたはターミネート文字が出るまで p を進める
p++;

って、単にp++;だけでもたぶんできますよね?
こうしたのは何か意図があるんですか?
こっちのほうが速いとか?
965デフォルトの名無しさん:04/12/11 18:45:38
>>959
m9(^Д^)プギャー
小学生みたいな返しだな。そんな低脳じゃできるわけないなwww
966デフォルトの名無しさん:04/12/11 19:22:14
>>965
自分が低脳である事を棚にあげて、よくそこまで開き直れるもんだ。
でも開き直ってもプログラムはできないぞ。低脳。
967デフォルトの名無しさん:04/12/11 22:20:25
>>966
それがどうした無能野郎
低脳でも無能よりマシだクソッタレ
968デフォルトの名無しさん:04/12/11 22:29:41
喧嘩はイイクナイ
969デフォルトの名無しさん:04/12/11 23:20:28
どうせ一人でやってるんだろ。
970デフォルトの名無しさん:04/12/12 01:02:31
>>964
レス遅くなってスマソ。
単にp++;だけだと、文字列の最後を越えていつまででもpをインクリメントし続け、
そのうちアクセス違反を出すと思います。
971デフォルトの名無しさん:04/12/12 02:18:13
>>967
氏ね。答えを書いてもらえなかったのは、お前の質問の仕方が糞だったからだ。
まず日本語勉強ちまちょーね。あ?日本人じゃねーのか?祖国に帰った方が
ええんとちゃうか?
972デフォルトの名無しさん:04/12/12 02:22:42
>>967,971
梅ご苦労様です
973デフォルトの名無しさん:04/12/12 12:10:02
>>970
でも一番外側のwhile(*p)があるからだいじょぶなんじゃないんですか?
974デフォルトの名無しさん
>>973
だめです。最後にホワイトスペース文字が入っている場合を
考えてみて下さい。