程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程綜合問答 >> c-C初學者編程問題 指針對應修改問題 求思路

c-C初學者編程問題 指針對應修改問題 求思路

編輯:編程綜合問答
C初學者編程問題 指針對應修改問題 求思路

#include
#include
//閱讀程序,在讀懂程序的基礎上運行程序,
//觀察運行結果,發現其中出現的問題,並解決:
//修改BubbleSort函數(函數頭也可修改),使得
//在對成績排序時,各成績對應的人名也做相應調整
//typedef int INT;
//typedef char * PCHAR;
typedef char STR[10];
typedef STR * PSTR;

//輸入成績的函數
float* inputScore(int* n)
{
int m, i;
printf("請輸入人數:");
scanf("%d", n);
float score =NULL;
m = *n;
score = (float *)malloc(
sizeof(float)*m);
for (i = 0; i < m; ++i)
{
scanf("%f", &score[i]);
}
return score;
}
STR
inputNames(int n)
{
STR* s=NULL;
int i;
s=(STR* )malloc(sizeof(STR)*n);
while(getchar()!='\n');
printf("請輸入%d個名字(一行一個):\n",n);
for(i=0;i<n;i++)
gets(s[i]);
return s;
}
void printRecord(STR *s,float a[], int m)
{
int i;
for (i = 0; i < m; ++i)
printf("%s\t%-6.1f\n",s[i],a[i]);
putchar('\n');
}
void printNames(STR s[], int n)
{ int i;
for(i=0;i<n;i++)
puts(s[i]);
return;
}
//修改這個函數(函數頭也可修改),使得
//在對成績排序時,各成績對應的人名也做相應調整
void BubbleSort(float a[], int n)
{
int i,j;
float t;
for(i=0;i<n-1;i++)
{
for(j=0;j<n-i-1;j++)
{
if(a[j]<a[j+1])
{
t = a[j];
a[j] = a[j+1];
a[j+1]=t;
}
}
}
}

int main()
{
int n;
float *p = inputScore(&n);
STR * names=NULL;
names = inputNames(n);
printRecord(names,p, n);
//printNames(names, n);
BubbleSort(p,n);
printRecord(names,p, n);
return 0;
}


最佳回答:


排序那個地方,就不說了啦,如果你真打算這麼做,也可以,將兩個數組都傳過去,在交換分數的時候,也交換名字就可以了。

值得一提的是,你這代碼估計編譯都不過

1. 輸入分數的函數 float score =NULL; 應該是 float score =NULL;

2. 函數inputNames返回類型應該是PSTR

3. 還是輸入名字這個函數裡,你知道這個s=(STR
)malloc(sizeof(STR)*n);是什麼意思嗎?申請一個10*n這麼大的連續空間。

你想和分數一一對應沒錯,但是如果這樣做的話,交換分數的時候,名字要來回拷貝的。

倒不如這樣做:

s=(PSTR* )malloc(sizeof(PSTR)*n);首先生成這麼大的一塊指針,然後每個名字s[i]再申請sizeof(STR)的大小的地方

到時候,你i交換分數的時候,將s也交換了,就行了。

還有gets是一個很危險的函數,盡量做好長度判斷,到時候越界就不好辦了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved