• 締切済み

C言語について

ソートを使い入力した数値を並び替える。昇順、降順を選べるようにする。 順位を付けるた。ただし、複数同位があった場合にはその個数分順位が変更する。 このような問題なのですが 入力個数の部分までは自力でできたのですが、ソートを習っていないのでこの後がよく分かりません。 下のような実行結果になるようだれかわかる人お願いします。 # include <stdio.h> int main(void) { int a[100],kai=0,sentaku; printf("整数を入力(CTRL+dで終了) >> "); while(1){ if(scanf("%d",&a{kai}) == EOF )break; kai=kai+1; printf("整数を入力(CTRL+dで終了) >> "); } printf("入力個数%d回\n",kai); return 0; } 実行結果 数値>>1 数値>>3 数値>>-1 数値>>-3 数値>>10 数値>>3 数値>> 入力回数:4回 1:昇順、2:降順>>1 NO.1:-3 NO.2:1 NO.3:3 NO.3:3 NO.5:10

みんなの回答

noname#88772
noname#88772
回答No.3

こんにちは。 質問だけではアレなのでアドバイスを まず必要とする入力と出力が何かをはっきりさせましょう。 その後、処理の流れを考えましょう。 それがキチンと出来てからコーディングを行いましょう。 でないと、修正,変更時にどこを見ればいいのか解らなくなります。 ○入力:  並び替えする数字列、数字列の個数、昇順か降順か ○出力:  並び替えられた数字列 ○処理の流れ:  【数字の入力】 → 【数字列の並び替え】 → 【数字列の表示】  処理内容が解りにくかったり、処理の規模が大きい場合は  各処理を更に分解していきます。 ○コーディング:  処理の流れを基にして、C言語に翻訳していきます。 コーディング前に次の2点を確認しておいてください。  1.scanf  2.ソート  1.について、返り値が望んだものか確認してください。以下のコードで解ると思います。 私の環境では示されたコードで望んだ返り値は出ませんでした。 ------ #include <stdio.h> int main(void) { int value, retv; retv = scanf("%d", &value); printf( " value:[%d] result:[%d] EOF:[%d]\n", value, retv, EOF ); return 0; } ------  2.について検索すればいくらでもヒットしますので好きなのを選んでください。 ただし、そのソートがどのように値を変更しているのかを確認しておいてください。 配列固定+初期値入りで確認した方が解りやすいです。以下の感じで ------ int val[5] = { 1, 3, -1, -3, 10 }; /* ソート始め */ /******/ /* ループ始め */ /******/ printf(" %d, %d, %d, %d, %d\n", val[0], val[1], val[2], val[3], val[4] ); /* ループ終わり */ /******/ /* ソート終わり */ ------ ご参考までに。

noname#88772
noname#88772
回答No.2

こんにちは。 ご質問を拝見していて質問があるのですが 質問1. 問題では“ソートを使い~”なのに、 “ソートを習っていないので”って矛盾してませんか? まずソートを習ってから解くのではと思うのですが。 質問2. 実行結果の後の表示が望まれる出力ですか? このプログラムでこの出力は表示されないと思います。 以上、よろしくお願いします。

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.1

> 入力個数の部分までは自力でできた 本当ですか? > if(scanf("%d",&a{kai}) == EOF )break; コンパイル時にエラーが出ませんか? >数値>>1 >数値>>3 >数値>>-1 >数値>>-3 >数値>>10 >数値>>3 >数値>> >入力回数:4回 4回とは、どれを数えているのでしょうか?

関連するQ&A

  • C言語について  

    わからないのでよろしくお願いします。何回やってもうまく表示できません。 整数を入力し、入力された整数の数だけ「*」を横一列に表示し、最後に改行するプログラムを while 文を使って作りなさい。 但し、0または負の値が入力された場合は、「*」は表示せず、改行のみを表示すること。 ▼10が入力された場合の実行例 ********** #include<stdio.h> int main(void) { int n, kai; scanf("%d",&n); printf("\n nyuryoku=%d",n); while(0<kai){ kai=kai--; printf("*"); } kai=n; printf("\n"); }

  • C言語をお願いします

    何が違うのか教えてください。 segmentation faultになります。 よく分からないので、プログラムを作っていただければ、助かります。 問 整数を入力し、降順並び変えてに表示。 ・入力した整数は配列に入れ、その配列を使って並び変える(入力終りの印は 1000 とする)。 ・入力する整数の個数は #define NUM 100 を使いなさい。 ・使うデータは、下記の例のように、キーボードから入力すること。 #include<stdio.h> #define NUM 100 int main(void){ int d[NUM]; int temp; int i,j,n; printf("Input scores.\n"); for(i=0; i<NUM && d[i]!=1000; i++){ scanf("%d",&d[i]); } n = i; for(i = 0; i < n; i++){ for(j = i + 1; j < n;j++){ if(d[j] > d[i]){ temp = d[i]; d[j] = d[i]; d[i] = temp; } } } printf("After sort."); for(i=0; i < n; i++){ printf("%d\n",d[i]); } return 0; } 実行例 Input scores. 60 30 45 90 100 0 1000 After sort. 100 90 60 45 30 0 よろしければ 問2 並び変えをする部分を mysort 関数にしたプログラムを作ってください。 main 関数から mysort 関数には点数の個数と sort 前の配列を渡し、並び変え結果の表示はmain 関数でお願いします。 (問題の意味が分かりません) 関数はさっぱり分かりません。 では、お願い致します。

  • C言語プログラム

    2つの整数を入力させ、それらが等しい場合hitoshii、異なる場合にはhitoshikunaiと出力するプログラムを作りたいのですが、うまくいきません。間違っているところを教えてください。 #include<stdio.h> #include<conio.h> void main() { printf("整数を入力してください:"); int number1; scanf("%d",number1); printf("整数を入力してください:"); int number2; scanf("%d",number2); if(number1==number2) { printf("hitoshii"); } else { printf("hitoshikunai"); } getch(); }

  • C言語

    昇順にソートしたいのですけど、このソースだと実行しても、最後に入力した文字が、表示されます。分からないので宜しくお願いします。(例21,34 55を入力すると、55,55,55と表示されます) #include <stdio.h> void sort1(int *dt, int n) { int i,temp,exchg=0; while (exchg<n) { for (i=1; i<n; i++) { if (dt[i-1] > dt[i]) { temp=dt[i-1]; dt[i-1]=dt[i]; dt[i]=temp; } } exchg++; } }int main(void) { int data[10]; int no=3; int i,*p_data; p_data =data; printf("%d個の整数を入力してください。\n",no); for (i=0; i<no; i++) { printf("data[%d]:",i); scanf("%d", p_data); } sort1(data,no); puts("これからの値を昇順に並び替えました。"); for (i=0; i <no; i++) printf("data[%d]=%d\n", i,*p_data); return(0); }

  • c言語 for文

    /*指定された個数だけ整数を読み込んで合計値・平均値を算出*/ #include <stdio.h> int main(void) { int i; int sum=0; int num,tmp; printf("整数は何個ですか:"); scanf("%d",&num); for(i=0;i<num;i++) {printf("No.%d:",++i); scanf("%d",&tmp); sum = sum + tmp; } printf("合計値:%d\n",sum); printf("平均値:%.2f\n",(double)sum / num); return(0); } C言語の勉強を始めたばかりのものです。 指定された個数だけ読み込めません 汗 前置と後置をまぜたあたりがよくないのかなと思うのですが。。。 どうしておかしくなるのか教えてください。 内部でどういった処理が行われているのかまだあまりわからない状態です。 ちなみに4と入力した結果は以下です。 整数は何個ですか:4 No.1:4 No.3:3 合計値:7 平均値:1.75

  • c言語超初心者です。教えてください

    基本的だと思いますが教えてください。 #include <stdio.h> int main(void) { int na, nb: puts("二つの整数を入力してください."); printf("整数A:”); scanf("%d",&na); printf("整数B:”); scanf("%d",&nb); printf("それらの平均は%fです。\n,(na+nb)/2.0); return(0); } これでintの形で最後のprintfが%fなのですがintは%dとなるはずなのですがこれは2。0という実数値で割るから答えは実数値になりますよ。という意味で%fとしたのでしょうか?確かにこうしないと正しい値がでてこないのです。教えてください。

  • 教えてください。C言語初心者です。

    #include <stdio.h> int main() { int sentaku,hakoA=0,hakoB,*kiroku[10]; char *name[10]; while (sentaku !=3){ printf("1:新規登録\n"); printf("2:データ確認\n"); printf("3:終了\n"); scanf("%d",&sentaku); switch (sentaku){ case 1: printf("登録する名前を入力してください。---"); scanf("%s",name[hakoA]); printf("記録を入力してください。---"); scanf("%d",&kiroku[hakoA]); printf("登録番号は%d番です。\n",hakoA); hakoA++; printf("登録を終了します。\n"); continue; case 2: if (hakoA==0){ printf("登録されてません\n"); continue; }else{ printf("登録番号を入力して下さい。---"); scanf("%d",&hakoB); printf("%s君で記録は%dです。\n",name[hakoB],kiroku[hakoB]); continue; } case 3: break; default : printf("1~3でお願いします。\n"); continue; } } return 0; } このプログラムはコンパイルされたのですが、実行で入力してるとエラーになってしまうのです。 まだ勉強始めたばかりでちょっとなぜか解らないのです。どこかおかしいところがありましたらご教授いただけると嬉しいです。おねがいします。

  • プログラミング・C言語の配列(単純選択ソート)についてです

    最近プログラミングを勉強し始めた初心者です。 今、配列について勉強していて あるプログラムを作成しています。 それは10個の実数を入力して、入力された実数を降順に並び替えるものなのですが、 降順に並び替えることができません(泣 どこが違うのか教えていただきたいのですが・・・ よろしくお願いします。 #include <stdio.h> #define NUMBER 10 int main(void) { int i, j, min, min_a, temp; double zissu[NUMBER]; printf("%d個の実数を入力してください", NUMBER); min=i; printf("date[%d]:", i); scanf("%lf", &zissu[i]); for(j=i+1; j<NUMBER; j++) { if(zissu[j] < zissu[min]) min_a =j; } temp = zissu[min]; zissu[min] = zissu[min_a]; zissu[min_a] = temp; } for(i = 0; i < NUMBER; i++) printf("date[%d]=%lf \n", i, zissu[i]); return (0); } 【入出力例】 10個の実数を入力してください data[0]:24.2 data[1]:2 ・・・ data[9]:9 降順にソートしました data[0] = 2 data[1] = 9 data[2] = 24.2 ・・・ みたいにしたいのです。 よろしくお願いします

  • C言語プログラムについて

    wikipediaのコムソートを参考に、次のように作りました。 動きますでしょうか。動かなければ、どこをどのようにすればよいか教えていただけませんでしょうか。 プログラム「#include<stdio.h> #include<string.h> void combsort(void); void swap(void); int main(void) { combsort(); swap(); printf("データ%dの並べ替え結果は、\n%d\nです。\n"data2,data); return 0; } void combsort(){ int h,swaps,data,len,data2; printf("ソートさせる数を入力。>\n"); scanf("%d",&data); data2 = data; len = strlen(data); h = len * 10 / 13; while(true){ swapa = 0; for(i = 0;i + h <len;i++) { if(data(i) > data(i + h)) { swap(data, i, i + h); swaps +=1; } } if(h==1){ if(swaps==0){ break; } } else{ h = h * 10 / 13; } } } void swap{ int a,i,j; const int t = a[i]; a[i] = a[j]; a[j] = t; } 」 data:scanfによって入力される並べ替えを行う数値(例:0219523056810)を代入。 data2:dataのコピーで、並べ替えを行う前のデータを保管しておくもの。 また、これの反対(これが、昇順なら、降順。降順なら、昇順。)を同じようにしたいと思います。(combsort2にて)どうすればよいでしょうか。 教えていただけませんでしょうか。 お早めのご回答お待ちしております。

  • C言語の問題で困っております

    三つのint 型整数を昇順にならべかえる関数を作成せよ void sort3 (int n1, int n2, int n3) わかる方、教えてくれませんか。 説明もしてくれたらとても嬉しいです。

専門家に質問してみよう