掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.25146

プログラムをチェックしてください
投稿者---山下 高志(2006/01/09 05:58:38)
なし


はじめまして、高校1年生の山下です.超初心者のC言語を勉強しているんです。
以下のプログラム、誰かにチェックしていただきたいですが.
目的:受診過程に0〜9の数字を入力し、重複することがあります.その重複した数字を削除し、診療科に出力したいのです.頑張って書いてみたんですけど、エラーがかなり多すぎで・・・だれか助けてください!

#include <stdio.h>
#include <string.h>

#define n 21
#define m 11

void main()
{
int i,j;
int process[n],department[m];

printf("現時点明白になっている受診過程を入力してください(20文字以内): ");

while (scanf("%d", &process[i]) != EOF) {
if (process[i] < 0 || process[i] > 9) {
printf("入力された数字は0から9までの数字ではありません。\n");
exit(1);
}
else { n = strlen(process);
for(i=0;i<n;i++)
{ printf("process:%d,",process[i] ); }
}
printf("\n");
}


for(i=0;i<n;i++)
{ if(strcmp( process[i], process[i+1] ) == 0 )
{ department[j]=process[i];department[j+1]=process[i+2]; }
else { department[j]=process[i]; }
m = strlen(department);
}
}

printf("必要な診療科を表示する(11文字以内)\n");

for(j=0;j<m;j++)

{ printf("department:%d,",department[j]);
printf("\n"); }
return;
}




この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:プログラムをチェックしてください 25147 ぽへぇ 2006/01/09 07:20:55
<子記事> Re:プログラムをチェックしてください 25148 rvr_driver 2006/01/09 09:22:28
<子記事> Re:プログラムをチェックしてください 25149 επιστημη 2006/01/09 09:40:02
<子記事> Re:プログラムをチェックしてください 25151 RiSK 2006/01/09 10:38:23


No.25147

Re:プログラムをチェックしてください
投稿者---ぽへぇ(2006/01/09 07:20:55)



>ソースの添付は「HTML変換ツール」で字下げします。
を守ってください。読む気になれません。
元のソースでも字下げされていないのなら、
字下げ(インデント)する癖をつけましょう。

> while (scanf("%d", &process[i]) != EOF) {
iが初期化されていない。

>else { n = strlen(process);
定数(21)を変数扱いしている。

このような間違いを防ぐためには
n, m ではなく、もっとわかりやすい
意味のある名前にするといいでしょう。
(この場合なら、例えば MAX_PROCESS とか)

それから、stlenにint型? 文字と数値をごっちゃにしてない?
>{ if(strcmp( process[i], process[i+1] ) == 0 )
これもそうだね。




この投稿にコメントする

削除パスワード

No.25184

Re:プログラムをチェックしてください
投稿者---山下 高志(2006/01/10 03:12:55)
なし



>> while (scanf("%d", &process[i]) != EOF) {
>iが初期化されていない。

ご指導、ありがとうございました。
今日丸1日頑張ってたが、完成しました。

#include <stdio.h>
#include <stdlib.h>
#define N 10

int main(void) {

int i, n, process, num[N];

/* 配列の初期化 */
for (i=0; i<N; i++) {
num[i] = 0;
}

/* データの入力 */
printf("現時点明白になっている受診過程を入力してください。\n");
printf("入力を終えるときにはCtrl-zを押してください。\n");

n = 0;
while (scanf("%d", &process) != EOF) {
if (process < 0 || process > 9) {
printf("入力された数字は0から9までの数字ではありません。\n");
exit(1);
} else {
num[process/1]++;
n++;
}
}

/*結果の表示*/
for (i=0; i<N; i++) {
printf("%8d = %3d回\n", i, num[i]);
}

printf("--------------------------------\n");
printf("受診科数 = %3d\n", n);

printf("必要な診療科を表示してください。\n");
printf("department:");

for (i=0; i<n+1-num[i]; i++){
if ( num[i] !=0 ) {
printf("%3d",i);}
}
printf("\n");
return (0);
}

本当に超初心者でしょう?地道なプログラムですよね。でも、高校生だから・・・



この投稿にコメントする

削除パスワード

No.25148

Re:プログラムをチェックしてください
投稿者---rvr_driver(2006/01/09 09:22:28)


>目的:受診過程に0〜9の数字を入力し、重複することがあります.その重複した数字を削除し、診療科に出力したいのです.頑張って書いてみたんですけど、エラーがかなり多すぎで・・・だれか助けてください!

エラーはそのままメッセージを掲載したほうがいいですよ。
それと環境(OSとコンパイラ)は何を使用しているのでしょうか?

for文、if文などのブロックの書き方も分りにくいです。
そのため括弧がきちんと対応していないようですね。
ブロックの書き方(というよりソースの書式?)を教科書などを参考に統一したほうがいいかも。


この投稿にコメントする

削除パスワード

No.25154

Re:プログラムをチェックしてください
投稿者---山下 高志(2006/01/09 12:47:27)
なし


>エラーはそのままメッセージを掲載したほうがいいですよ。
>それと環境(OSとコンパイラ)は何を使用しているのでしょうか?

window2000です。

>for文、if文などのブロックの書き方も分りにくいです。
>そのため括弧がきちんと対応していないようですね。
>ブロックの書き方(というよりソースの書式?)を教科書などを参考に統一したほうがいいかも。

わかりました。


この投稿にコメントする

削除パスワード

No.25149

Re:プログラムをチェックしてください
投稿者---επιστημη(2006/01/09 09:40:02)


>はじめまして、高校1年生の山下です.超初心者のC言語を勉強しているんです。
>以下のプログラム、誰かにチェックしていただきたいですが.

- 文字
- 文字列
- 数値

の三者をものの見事に混同しています。
チェックしてどうなるものではありません。
基本からきっちりやり直し。



この投稿にコメントする

削除パスワード

No.25151

Re:プログラムをチェックしてください
投稿者---RiSK(2006/01/09 10:38:23)


何をしたいのか分かりませんでした。
「数値」だけで十分だと思ったのですが、以下のコードと(あなたが)やりたいことは同じですか?
/*
 * 目的:受診過程に0〜9の数字を入力し、重複することがあります.その重複した数字を削除し、
 * 診療科に出力したいのです.
 */
#include<stdio.h>
#define N 10
int main(void){
    int t,i,n=0,a[N]={0};
    while(n<N&&scanf("%d",&t)==1){
        for(i=0;i<n&&t!=a[i];++i);
        if(i>=n){
            a[i]=t;
            ++n;
        }
    }
    for(i=0;i<n;++i)printf("%2d %d\n",i+1,a[i]);
}



この投稿にコメントする

削除パスワード

No.25153

Re:プログラムをチェックしてください
投稿者---επιστημη(2006/01/09 11:34:36)


参考にならない"ご参考(C++版)"

---- unique.cpp ---
#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>

int main() {
 std::vector<int> table;
 std::copy(std::istream_iterator<int>(std::cin),
      std::istream_iterator<int>(),
      std::back_inserter(table));
 std::sort(table.begin(), table.end());
 std::copy(table.begin(),
      std::unique(table.begin(), table.end()),
      std::ostream_iterator<int>(std::cout, " "));
 return 0;
}

--- 実行結果
> cl -MD -EHsc -GR unique.cpp
>echo 1 3 2 4 5 2 3 1 0 9 9 | unique
0 1 2 3 4 5 9



この投稿にコメントする

削除パスワード

No.25155

Re:プログラムをチェックしてください
投稿者---山下 高志(2006/01/09 12:51:54)
なし


>参考にならない"ご参考(C++版)"
>
>---- unique.cpp ---
>#include <iostream>
>#include <vector>
>#include <iterator>
>#include <algorithm>
>
>int main() {
> std::vector<int> table;
> std::copy(std::istream_iterator<int>(std::cin),
>      std::istream_iterator<int>(),
>      std::back_inserter(table));
> std::sort(table.begin(), table.end());
> std::copy(table.begin(),
>      std::unique(table.begin(), table.end()),
>      std::ostream_iterator<int>(std::cout, " "));
> return 0;
>}
>
>--- 実行結果
>> cl -MD -EHsc -GR unique.cpp
>>echo 1 3 2 4 5 2 3 1 0 9 9 | unique
>0 1 2 3 4 5 9

せっかく教えていただいたのに、ぼくはC++のこと、分かりません。どうかCにしていただけるかな.


この投稿にコメントする

削除パスワード

No.25156

Re:プログラムをチェックしてください
投稿者---επιστημη(2006/01/09 13:02:05)


>せっかく教えていただいたのに、ぼくはC++のこと、分かりません。どうかCにしていただけるかな.

ごめんなさい。
参考にならないのは百も承知。"C++ならこう書ける"を示したに過ぎません。

これをCで"忠実に再現"するとなると数百行(いやそれ以上?)のコードになります。

…で、やりたいことは要するに:

- 数を一つ読む
- その数が記録に残っていなければ、記録に追加

を繰り返すダケのはず。
おそらく難しく考えすぎてるんじゃないかと。



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧