c言語初心者です。課題で出た問題で、生徒の人数、その後出席番号と点数を入れ、ソートしてから表示するプログラムなのですが、人数分打ち終わったあとにセグメンテーション違反になります。添削とともになぜそうなるのか教えてもらえると幸いです。
include <stdio.h>
#define MAXDATA 10000
main()
{
int stnum[MAXDATA],point[MAXDATA],mem;
int n,j,k,i,tmp,tmps;
printf("生徒数を入力してください。");
scanf("%d",&mem);
if(mem<=0){
do{
printf("もう一度生徒数を入力してください。");
scanf("%d", &mem);
}while(mem<=0);
}
for(i=0;i<mem;i++){
printf("%d人目の生徒の点数を入力してください。\n",i+1);
scanf("%d", &(point[i]));
printf("%d人目の出席番号を数字で入力してください。\n",i+1);
scanf("%d", &(stnum[i]));
}
for(i=0;i<mem-1;i++){
j=i;
}
for(k=i+1;k<mem;k++){
if(point[j]>point[k]){j=k;}
}
tmp=point[j];
point[j]=point[i];
point[i]=tmp;
for(k=i+1;k<mem;k++){
if(stnum[j]>stnum[i]){j=k;}
}
tmps=stnum[j];
stnum[j]=stnum[i];
stnum[i]=tmps;
for(i=0;i<mem;i++){
printf("%d番の点数は%d点です。", stnum[n],point[n]);
}
}
No.6ベストアンサー
- 回答日時:
#3です。
#5さんのコードでも解決しないとのことなのであなたのコードにprintfを少々つけたコードを載せますので実行してください。手入力が面倒なので使っていたNOINPUTFLAGを放置してます。"#define NOINPUTFLAG 1"にすれば適当に値をぶち込みます。
#if~#endifの部分はNOINPUTFLAGが0の時コンパイル時にあなたのコードと全く同じになるので変化はありません。
今後も何かエラーが出る場合はprintfなどで自分が何をしているのか確認してください。
/////////////////////////////////////////////
#include <stdio.h>
#define MAXDATA 10000
#define NOINPUTFLAG 0
//main()の型はintなのでそう宣言する
int main()
{
int stnum[MAXDATA],point[MAXDATA],mem;
int n,j,k,i,tmp,tmps;
printf("生徒数に1または10000を超える値を入れるとエラーになります\nもちろん数字以外の値もダメです\n");
//バッファオーバーフローですので場合によっては検知できません、1の方はjの初期化に注目
printf("生徒数を入力してください。");
scanf("%d",&mem);
if(mem<=0){
do{
printf("もう一度生徒数を入力してください。");
scanf("%d", &mem);
}while(mem<=0);
}
for(i=0;i<mem;i++){
//NOINPUTFLAGが0のとき何も変化はありません
#if NOINPUTFLAG
point[i]=i;
stnum[i]=i;
#else
printf("%d人目の生徒の点数を入力してください。\n",i+1);
scanf("%d", &(point[i]));
printf("%d人目の出席番号を数字で入力してください。\n",i+1);
scanf("%d", &(stnum[i]));
#endif
}
//NOINPUTFLAGが0のとき何も変化はありません
#if NOINPUTFLAG
printf("入力は省略しました\n");
#endif
for(i=0;i<mem-1;i++){
j=i;
}
printf("この時点でi=%d, j=%d, k=undefined。でもまだ配列にアクセスなし\n",i,j);
for(k=i+1;k<mem;k++){
if(point[j]>point[k]){j=k;}
}
printf("i+1(=%d)とmem(=%d)の大小を比べるとバブルソートを意図したと思われる処理は・・・ できたとしてもpoint[%d]は値が与えられてたっけ?\n",i+1,mem,i+1);
tmp=point[j];
point[j]=point[i];
point[i]=tmp;
printf("point[%d]とpoint[%d]を入れ替えました\n",i,j);
for(k=i+1;k<mem;k++){
if(stnum[j]>stnum[i]){j=k;}
}
printf("同じく。\ni+1(=%d)とmem(=%d)の大小を比べるとバブルソートを意図したと思われる処理は・・・\n",i+1,mem);
tmps=stnum[j];
stnum[j]=stnum[i];
stnum[i]=tmps;
printf("stnum[%d]とstnum[%d]を入れ替えました\n",i,j);
for(i=0;i<mem;i++){
printf("%d番の点数は%d点です。", stnum[i],point[i]);//改変:nはiだとのことだったので
}
return 0;//int型の返り値
}
No.5
- 回答日時:
入力した順(ソートなし)、出席番号順、得点順表示のサンプルを作ってみました。
手入力で10000件というのも大変なので、最大は100にしました。
ソートはもっと良い方法はいくらでもありますが、取りあえず、これでも出来ます。
#include <stdio.h>
#define MAXDATA 100
int main(void) {
intstnum[MAXDATA],point[MAXDATA],mem;
inti,j,tmp,tmps;
printf("生徒数を入力してください。");
scanf("%d",&mem);
while (mem<=0){
printf("もう一度生徒数を入力してください。");
scanf("%d", &mem);
}
for (i=0; i<mem; i++ ) {
printf("%d人目の出席番号を数字で入力してください。\n",i+1);
scanf("%d", &(stnum[i]));
printf("%d人目の生徒の点数を入力してください。\n",i+1);
scanf("%d", &(point[i]));
}
// Input Order
printf( "Input Oder \n" );
for ( i = 0 ; i < mem ; i++ ) {
printf( "出席番号 %3d : 得点 %3d\n", stnum[ i ],point[ i ] );
}
// Studend Number Order
for ( i = 0 ; i < mem ; i++ ) {
tmp = point[i];
tmps = stnum[i];
for ( j = i; j < mem ; j++ ) {
if (stnum[j] < tmps ) {
point[ i ] = point[ j ];
stnum[ i ] = stnum[ j ];
point[ j ] = tmp;
stnum[ j] = tmps;
tmp = point[ i ];
tmps = stnum[ i ];
}
}
}
printf( "Student Number Order \n" );
for ( i = 0 ; i < mem ; i++ ) {
printf( "出席番号 %3d : 得点 %3d\n", stnum[ i ],point[ i ] );
}
// Score Order
for ( i = 0 ; i < mem ; i++ ) {
tmp = point[i];
tmps = stnum[i];
for ( j = i; j < mem ; j++ ) {
if (point[j] > tmp ) {
point[ i ] = point[ j ];
stnum[ i ] = stnum[ j ];
point[ j ] = tmp;
stnum[ j] = tmps;
tmp = point[ i ];
tmps = stnum[ i ];
}
}
}
printf( "Score Order \n" );
for ( i = 0 ; i < mem ; i++ ) {
printf( "出席番号 %3d : 得点 %3d\n", stnum[ i ],point[ i ] );
}
return( 0 );
}
No.4
- 回答日時:
#3のものですが、修正後のコードはあくまで「意味のわかる」です。
悪いところは他にもありますが、memにいろんな値を入れて試してみてください。
No.3
- 回答日時:
なんだかfor文をわかっていない気が ・・・と言うか何がしたいのかを理解してない気が。
一応出席番号と点数は関連があるという前提のもと、意味のわかるソースにしました。
気持ち悪いのでiや\nも一部修正してます。
これが意図したものかは知りません。
インデントをつけるために全角の半角が入ってるのでそのままコピペではできません。
//////////////以下ソース//////////////////
#define _CRT_SECURE_NO_WARNINGS //一部コンパイラで必要
#include <stdio.h>
#define MAXDATA 10000
int main(){
int stnum[MAXDATA],point[MAXDATA],mem;
int j,tmp,tmps;
printf("生徒数を入力してください。\n");
scanf("%d",&mem);
while(mem<=0){
printf("もう一度生徒数を入力してください。\n");
scanf("%d", &mem);
}
for(int i=0;i<mem;i++){
printf("%d人目の生徒の点数を入力してください。\n",i+1);
scanf("%d", &(point[i]));
printf("%d人目の出席番号を数字で入力してください。\n",i+1);
scanf("%d", &(stnum[i]));
}
for(int i=0;i<mem-1;i++){
j=i;printf("j=i;を実行しました!\n");
for(int k=i+1;k<mem;k++){
if(point[i]>point[k]){
j=k;printf("j=k;を実行しました!\n");
tmp=point[k];
point[k]=point[i];
point[i]=tmp;
tmps=stnum[k];
stnum[k]=stnum[i];
stnum[i]=tmps;
}
}
}
for(int i=0;i<mem;i++){
printf("%d番の点数は%d点です。", stnum[i],point[i]);
}
printf("出席番号は関係なかったです!\n");
return 0;
}
No.1
- 回答日時:
for(i=0;i<mem-1;i++){
j=i;
}
for(k=i+1;k<mem;k++){
if(point[j]>point[k]){j=k;}
}
tmp=point[j];
point[j]=point[i];
point[i]=tmp;
for(k=i+1;k<mem;k++){
if(stnum[j]>stnum[i]){j=k;}
}
のあたりで何をしたいのかさっぱりわからない. 例えば
for(i=0;i<mem-1;i++){
j=i;
}
の結果 i や j がどんな値になるか理解できていますか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# LU分解法のピボッティングについて(C言語/gcc-9) 3 2022/07/11 23:10
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# 未解決の外部シンボル _printfが関数_mainで参照されました 1 2022/09/18 15:28
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# LU分解法のピボット選択機能実装について(C言語・gcc-9) 1 2022/07/22 15:20
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
10個出力で改行したいのですが...
-
カレンダーのプログラムについて
-
4の倍数を論理演算で表す。。
-
【C言語教えてください】sin波...
-
CTRL+Dでループを抜けるには
-
C言語です このプログラミング...
-
じゃんけんゲームをつくったの...
-
printf( " %2d", p * q );
-
defineで定数が置き換えられな...
-
printf で二進表示を行いたい。
-
一番大きい奇数を表示する
-
万年カレンダーのC言語プログラ...
-
両替プログラムなど
-
C言語初心者です。次の問題で質...
-
C言語です
-
困ってます!Cプログラミングに...
-
(C言語)めちゃくちゃな値にな...
-
TeraPadの設定方法
-
じゃんけんゲームの応用
-
C言語のじゃんけんゲームのプロ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語について
-
printf で二進表示を行いたい。
-
cshの文字列操作(0埋め)
-
10個出力で改行したいのですが...
-
コンパイルエラーについて
-
テキストカーソル位置の取得
-
strcmp
-
unsigned int型について
-
c言語でAからZまでを表示する...
-
printf( " %2d", p * q );
-
コマンドラインに出力した文字...
-
printfの出力内の文字をdefine...
-
ホームページをC言語で作りたい...
-
コマンドプロンプトがすぐ消える
-
小数点切捨て表示
-
【C言語教えてください】sin波...
-
switch分のケースを範囲数?に...
-
二つの整数値の大小比較
-
4の倍数を論理演算で表す。。
-
defineで定数が置き換えられな...
おすすめ情報