Bubble sorting (Index exceeds the number of array elements)

3 ビュー (過去 30 日間)
Karou
Karou 2018 年 11 月 9 日
コメント済み: Luna 2018 年 11 月 11 日
I'm supposed to write a program that bubblesorts surnames. Porg file contains surnames while Klucze file contains keys assigned to surnames.
global Staff
global keys
fid = fopen ('Porg.csv')
fid2 = fopen ('Klucze.csv')
i=2
while ~feof(fid); ~feof(fid2)
sd=fgetl(fid);
zd=fgetl(fid2)
tet(1:3)=strsplit(sd,';');
zet(1:3)=strsplit(zd,' ');
Staff(i).surname=tet(1);
Staff(i).name=tet(2);
keys(i).key=zet(1);
i=i+1;
end
for x=2:(i-1)
v(1)=Staff(x).surname;
v(2)=Staff(x).name;
v(3)=keys(x).key;
disp(v);
end
This code displays surnames together with names and assigned keys. Tried to bubble sort it by changing the last loop, and I keep getting an error "Index exceeds the number of array elements (1)". Does anyone know how to fix it? Probably it's a rookie mistake (I'm a newbie when it comes to programming)
g = length('Porg.csv')
for j=2:(g-1);
if j(g)>j(g+1);
temp=Staff(j).surname;
Staff(j).surname = Staff(j+1).surname;
Staff(j+1).surname = temp
end
v(2)=Staff(h).name;
v(3)=keys(h).key;
disp(v);
end
  3 件のコメント
Stephen23
Stephen23 2018 年 11 月 9 日
What do you expect this to do?:
g = length('Porg.csv')
Please upload some sample data files by clicking the paperclip button.
Karou
Karou 2018 年 11 月 9 日
Well, I was hoping for Matlab to read 36 columns from Porg file as one variable, but I guess that's not the solution. As I said, I'm new to programming so I don't know which function should I use to get the results I want. Added files, changed words in the first file cause the original one contains personal data.

サインインしてコメントする。

採用された回答

Luna
Luna 2018 年 11 月 9 日
Hi Karolina,
I always use xlsread instead of fopen. It is always easier to see what's going on with cell arrays or table structs.
Please try below code:
[~, ~ , Porg] = xlsread('Porg.csv'); % gets raw Porg data
[~, ~ , Klucze] = xlsread('Klucze.csv'); % gets raw Klucze data
mergedTable = horzcat(Porg,Klucze); % merges two tables together horizontally
sortedTable = sortrows(mergedTable,1); % sorts by first column (surname)
newProg = sortedTable(:,1:3); % seperates first 3 column into new Prog data
newKlucze = sortedTable(:,4); % seperates last column into new Klucze data
xlswrite('newPorg.csv',newPorg); % saves your new cell array into a csv file again.
xlswrite('newKlucze.csv',newKlucze);
  4 件のコメント
Luna
Luna 2018 年 11 月 11 日
I think I misspelled the word newPorg to newProg above. Sorry.
Here is the code and also it creates struct arrays as you are expecting. You can comment out Staff(k).weight line as you wish.
[~, ~ , Porg] = xlsread('Porg.csv'); % gets raw Porg data
[~, ~ , Klucze] = xlsread('Klucze.csv'); % gets raw Klucze data
mergedTable = horzcat(Porg,Klucze); % merges two tables together horizontally
sortedTable = sortrows(mergedTable,1); % sorts by first column (surname)
newPorg = sortedTable(:,1:3); % seperates first 3 column into new Prog data
newKlucze = sortedTable(:,4); % seperates last column into new Klucze data
xlswrite('newPorg.csv',newPorg); % saves your new cell array into a csv file again.
xlswrite('newKlucze.csv',newKlucze);
%%Creating Struct Array for Staff and the Keys with sorted table
for k = 1:size(sortedTable,1)
Staff(k).surname = sortedTable{k,1};
Staff(k).name = sortedTable{k,2};
Staff(k).weight = sortedTable{k,3}; % I don't know what you are using this 3rd column for. There are some numbers but they are not the keys
keys(k).key = sortedTable{k,4};
end
Luna
Luna 2018 年 11 月 11 日
According to your error message, zet(1:2)=strsplit(zd,';'). It does not give me an error on this line. Please try again with clearing your workspace.
g = length('Porg.csv') -> this line gives you g = 8. It is because Porg.csv is 8 characters. I did not understand why you want to use this for.

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

Help Center および File ExchangeShifting and Sorting Matrices についてさらに検索

製品


リリース

R2018b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by