问题是;我正在做作业。我需要读取一个数组的值,该数组的行和列的大小(2-D数组)首先是给定的。读取值后,我需要使用冒泡排序算法以降序对其进行排序。问题是;我需要为每个整数值分配一个字符(从A到Z)(对其进行命名/分类),并使用我为其分配的字符对整数值进行排序...
#include <stdio.h>
#define IL 81
#define PARTI 26
///Variables:
int partiSayisi;
/**This variable is going to take a value between [0,81]
*so it will be ROW of the array when I read values.*/
int plakaKodu;
/**This is equal to 'plakaKodu', and I'm using it as the index,
*if I use the actual variable as the index, it isn't working. (Not
*sure why...)*/
int plakaKoduIndex;
/**The 2D array which holds variables I read from input.*/
int oySiniflama[IL][PARTI] = {0};
char partiIsimleri[26]=
{'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q',
'R','S','T','U','V','W','X','Y','Z'};
///Function Prototypes:
//------------------------------------------//
void oyAl(int partiSayisi, int plakaKoduIndex); //Input Routine
//-------------------------------------------//
void ilOyGoster(int plakaKoduIndex, int partiSayisi); //Output Routine
//-------------------------------------------//
/**Bubble Sort Function:*/
void bubbleSort();
//-------------------------------------------//
///Functions.:
//-------------------------------------------//
void oyAl(int partiSayisi, int plakaKoduIndex)
{
int i;
char j='A';
for(i=0; i<partiSayisi; i++)
{
printf("%c Partisi'nin oy sayisini giriniz: ", j);
scanf(" %d", &oySiniflama[plakaKoduIndex-1][i]);
++j;
}
}
//-------------------------------------------//
void ilOyGoster(int plakaKoduIndex, int partiSayisi)
{
int i;
for(i=0; i<partiSayisi; i++)
{
printf("\n %c Partisi: %d oy.", partiIsimleri[i],
oySiniflama[plakaKoduIndex-1][i]);
}
}
//-------------------------------------------//
void bubbleSort()
{
/**Bubble Sort icin: */
int i = 0, j=0, m=0, gecici_int;
char gecici_char;
for(m=1; m<(IL*PARTI); m++)
{
for(i=0; i<IL; i++)
{
for(j=0; j<PARTI-1; j++)
{
if(oySiniflama[i][j] != 0)
{
if(oySiniflama[i][j] < oySiniflama[i][j+1])
{
gecici_int = oySiniflama[i][j];
oySiniflama[i][j] = oySiniflama[i][j+1];
oySiniflama[i][j+1] = gecici_int;
}
if(oySiniflama[i][j] < oySiniflama[i][j+1]);
{
gecici_char = partiIsimleri[j];
partiIsimleri[j] = partiIsimleri[j+1];
partiIsimleri[j+1] = gecici_char;
}
}
}
}
//For control.
for(i=0; i<IL-1; i++)
{
if (oySiniflama[i][PARTI-1] > oySiniflama[i+1][0])
{
gecici_int = oySiniflama[i][PARTI-1];
oySiniflama[i][PARTI-1] = oySiniflama[i+1][0];
oySiniflama[i+1][0] = gecici_int;
}
if (oySiniflama[i][PARTI-1] > oySiniflama[i+1][0])
{
gecici_char = partiIsimleri[i];
partiIsimleri[i] = partiIsimleri[i+1];
partiIsimleri[i+1] = gecici_char;
}
}
}
}
//-------------------------------------------//
预期的输入和输出:
预期输入
//TEST
A Partisi'nin oy sayisini giriniz: 3082
B Partisi'nin oy sayisini giriniz: 2556
C Partisi'nin oy sayisini giriniz: 1900
D Partisi'nin oy sayisini giriniz: 2581
E Partisi'nin oy sayisini giriniz: 2000
F Partisi'nin oy sayisini giriniz: 1255
G Partisi'nin oy sayisini giriniz: 12
我按照指示输入了屏幕;输入一个字符(从A到Z)以对该整数值进行分类;现在这是预期的输出:
预期产量
A Partisi 3082
D Partisi 2581
B Partisi 2556
E Partisi 2000
C Partisi 1900
F Partisi 1255
G Partisi 12
如何将char分配给整数,然后使用Bubble Sort作为我的排序算法,并使用Function和Arrays(如严格的分配规则)对它们进行排序? (而且我不能使用结构...)
〜感谢您抽出宝贵的时间...
(PS。感谢您向我解释发布规则。这是我第一次在这里写问题,很抱歉写了一个难以理解的问题……我尽快对其进行了编辑。)
(PS。[@John Bode]感谢您抽出宝贵的时间。即使我第一次写了一个不清楚的问题……现在我也对其进行了编辑,以便其他人也需要类似的帮助时也可以寻求帮助。
答案 0 :(得分:1)
如果我理解您的问题,您想要一种使用partiIsimleri
数组将字符值存储为整数值而没有的方法,对吗?
可能最简单的方法是使用struct
类型:
struct labeled_value {
int value;
char label;
};
您将oySinfiflama
声明为
struct labeled_value oySiniflama[IL][PARTI] = {{0,0}};
您将更改输入例程以使用以下内容:
for(i=0, j='A'; i<partiSayisi; i++, j++)
{
printf("%c Partisi'nin oy sayisini giriniz: ", j);
scanf(" %d", &oySiniflama[plakaKoduIndex-1][i].value);
oySiniflama[plakaKoduIndex-1][i].label = j;
}
您将按照以下方式更改气泡状泡沫的胆量:
if(oySiniflama[i][j].value < oySiniflama[i][j+1].value ) /* Azalan sirada siralamak icin, > u < e cevir. */
{
struct labeled_value gecici = oySiniflama[i][j];
oySiniflama[i][j] = oySiniflama[i][j+1];
oySiniflama[i][j+1] = gecici;
}
IOW,您在value
成员上进行比较,但是交换了整个struct
值。这使您完全摆脱了partiIsimleri
数组,因此可以完全从bubblesort
例程中删除该部分。
然后,您的输出代码将显示为:
for(i=0; i<partiSayisi; i++)
{
printf("\n %c Partisi: %d oy.", oySiniflama[plakaKoduIndex-1][i].label, oySiniflama[plakaKoduIndex-1][i].value);
}
编辑
问题出在哪里;我不能使用结构。正如我在信息中所说的;我只能使用C的基本功能以及一些中间功能(函数和数组)。规则很严格,这就是为什么我在努力……
噢,为了████,struct
的 是“ C的基本特征”。为使这项作业比需要的 1 难点给老师打耳光。
好吧,那么,您将不得不使用单独的数组来维护标签,并且它也必须是2D数组(这样,每个数字都有一个唯一的标签元素):
char partiIsimleri[IL][PARTI];
因此您的输入例程将如下所示:
for(i=0, j='A'; i<partiSayisi; i++, j++)
{
printf("%c Partisi'nin oy sayisini giriniz: ", j);
scanf(" %d", &oySiniflama[plakaKoduIndex-1][i]);
partiIsimleri[plakaKoduIndex-1][i] = j;
}
您可以收紧气泡排序:
if(oySiniflama[i][j] != 0)
{
if(oySiniflama[i][j] < oySiniflama[i][j+1]) /* Azalan sirada siralamak icin, > u < e cevir. */
{
gecici_int = oySiniflama[i][j];
oySiniflama[i][j] = oySiniflama[i][j+1];
oySiniflama[i][j+1] = gecici_int;
gecici_char = partiIsimleri[i][j];
partiIsimleri[i][j] = partiIsimleri[i][j+1];
partiIsimleri[i][j+1] = gecici_char;
}
}
也就是说,您可以在同一个循环中执行两个操作,而不是两个单独的循环来交换整数和标签。您真的不想在气泡排序中添加更多的循环。