質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

1862閲覧

C++ 構造体の二次元配列に値を入れ昇順に並び替えたら値が0になる

BRAK

総合スコア98

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/11/19 13:03

c++で構造体の二次元配列に値を入れ昇順に並び替えたら値が0になる

ポインタを使って構造体にアクセスして初期値をいれたあと、その合計値の高い順に並び変えたのですが何故か2次元配列の中の値が最初の数字以外全部0になります。

初期値を入れた後に再度値が入っているかを確認した際に値が入っていたので並び替えのときに二次元配列がおかしくなっているような気がします。
それか、ただ単に値は入っているけど表示の仕方が誤っているかです。
わからないので教えてください。

C++

1コード 2header 3 4#pragma once 5#include <iostream> 6using namespace std; 7//メイン関数 8void HowToStruct_EX02(); 9 10//初期値を入れる関数 11void SetInit(struct empl* pe, int array[5][6]); 12//値を表示する関数 13void ShowStruct(struct empl* p, int x, int y); 14//並び替え関数 15void HowToStruct_Sort2(struct empl* p, int n);

C++

1コード 2Cpp 3 4//残業時間 5struct zangyo { 6 int hours[5][6]; 7 float ave; 8}; 9 10//残業社員を求める------ 11struct empl { 12 string name; 13 string section; 14 zangyo times; 15}; 16 17 18void HowToStruct_EX02() { 19 20 //月の残業時間 21 int hours[5][6] = { 22 {23,89,50,10,30,75}, 23 {10,50,90,62,20,83}, 24 {40,55,36,44,80,15}, 25 {90,60,86,78,26,49}, 26 {58,81,76,11,66,99} 27 }; 28 29 float average[5] = { 0 }; 30 31 //残業 32 struct zangyo times[5] = { 33 {hours[0][0],average[0]}, 34 {hours[1][0],average[1]}, 35 {hours[2][0],average[2]}, 36 {hours[3][0],average[3]}, 37 {hours[4][0],average[4]} 38 }; 39 40 //社員 41 struct empl zangyo[5] = { 42 //名前//部署//月の残業 43 {"阿部","人事",times[0]}, 44 {"加藤","経理",times[1]}, 45 {"須藤","総務",times[2]}, 46 {"西川","技術",times[3]}, 47 {"田島","営業",times[4]}, 48 }; 49 50 struct empl* pe; 51 pe = zangyo; 52 53 cout << "氏名|" << "部門|" << "1月|" << "2月|" << "3月|" 54 << "4月|" << "5月|" << "6月" << endl; 55 56 SetInit(pe, hours); 57 ShowStruct(pe, 6, 5); 58 59 cout << "残業が多い順に並べると" << endl; 60 61 HowToStruct_Sort2(pe, 5); 62 63 ShowStruct(pe, 6, 5); 64} 65 66//構造体の初期化 67void SetInit(struct empl* pe,int array[5][6]) { 68 for (int i = 0; i < 5; i++) 69 { 70 int sum = 0; 71 for (int j = 0; j < 6; j++) 72 { 73 pe->times.hours[i][j] = array[i][j]; 74 sum += pe->times.hours[i][j]; 75 } 76 pe->times.ave = sum; 77 pe++; 78 } 79} 80 81//現在の構造体の中身を表示 82void ShowStruct(struct empl* pe,int x,int y) { 83 84 for (int i = 0; i < y; i++) 85 { 86 //残業の合計を保存するための変数 87 cout << pe->name << "|"; 88 cout << pe->section << "|"; 89 for (int j = 0; j < x; j++) 90 { 91 cout << pe->times.hours[i][j] << " |"; 92 } 93 cout << pe->times.ave; 94 95 cout << endl; 96 pe++; 97 } 98} 99 100//残業が多い順に組み替える -----------------------------★★★★★ここがおかしい気がします★★★★★ 101void HowToStruct_Sort2(struct empl* pe, int n) { 102 103 struct empl tmp; 104 105 for (int i = 0; i < 5; i++) 106 { 107 for (int j = 0; j < 5; j++) 108 { 109 if ((pe + i)->times.ave >(pe + j)->times.ave) { 110 tmp = *(pe + i); 111 *(pe + i) = *(pe + j); 112 *(pe + j) = tmp; 113 } 114 } 115 } 116}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

初期化時zangyo[i](i=0~4)に対する残業時間はzangyo[i].times.hours[i][j](j=0~5)に格納しています。
ソート後は並び順が変わるのでzangyo[i].times.hours[i]には期待する値が入っていません。


各個人は自分の残業時間だけ保持すればいいので二次元にする必要はありません。

diff

1//残業時間 2struct zangyo { 3- int hours[5][6]; 4+ int hours[6]; 5 float ave; 6}; 7 8//構造体の初期化 9void SetInit(struct empl* pe, int array[5][6]) { 10 for (int i = 0; i < 5; i++) 11 { 12 int sum = 0; 13 for (int j = 0; j < 6; j++) 14 { 15- pe->times.hours[i][j] = array[i][j]; 16+ pe->times.hours[j] = array[i][j]; 17- sum += pe->times.hours[i][j]; 18+ sum += pe->times.hours[j]; 19 } 20 pe->times.ave = sum; 21 pe++; 22 } 23} 24//現在の構造体の中身を表示 25void ShowStruct(struct empl* pe, int x, int y) { 26 27 for (int i = 0; i < y; i++) 28 { 29 //残業の合計を保存するための変数 30 cout << pe->name << "|"; 31 cout << pe->section << "|"; 32 for (int j = 0; j < x; j++) 33 { 34- cout << pe->times.hours[i][j] << " |"; 35+ cout << pe->times.hours[j] << " |"; 36 } 37 cout << pe->times.ave; 38 39 cout << endl; 40 pe++; 41 } 42}

このあたりも不要ですね。

diff

1- float average[5] = { 0 }; 2 //残業 3- struct zangyo times[5] = { 4- {hours[0][0],average[0]}, 5- {hours[1][0],average[1]}, 6- {hours[2][0],average[2]}, 7- {hours[3][0],average[3]}, 8- {hours[4][0],average[4]} 9- }; 10 //社員 11 struct empl zangyo[5] = { 12 //名前//部署//月の残業 13- {"阿部","人事",times[0]}, 14+ {"阿部","人事",}, 15- {"加藤","経理",times[1]}, 16+ {"加藤","経理",}, 17- {"須藤","総務",times[2]}, 18+ {"須藤","総務",}, 19- {"西川","技術",times[3]}, 20+ {"西川","技術",}, 21- {"田島","営業",times[4]}, 22+ {"田島","営業",}, 23 };

投稿2020/11/19 14:29

編集2020/11/19 15:00
SHOMI

総合スコア4079

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

BRAK

2020/11/19 14:42

あ!たしかにそうですね。timesのhoursの中に配列があるから二次元配列じゃなくて全然よかったです。 ありがとうございます!
BRAK

2020/11/19 14:43

あと、型名と変数名をよくよく見たら同じだったので気をつけます。
BRAK

2020/11/19 15:02 編集

あ、もう直で代入できるのか
SHOMI

2020/11/19 15:11 編集

struct zangyo times[5] = {~}; の箇所、times[0~4].hours[0]にhours[0~4][0]、hours[0~4][1]にave[0~4]が代入されてしまっています。 その後のSetInit()で正しく設定し直しているので動いてはいますが…
BRAK

2020/11/19 15:14

色々こんがらがって、そもそもfloat average[5] = {0};にも何も入れてなかったですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問