#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define NAMELEN 32
struct Currency
{
char name[NAMELEN];
double exchange_rate;
int action;
};
void printCurrency(struct Currency *cur);
void readCurrency(struct Currency *cur);
int mystrcmp(const char* s1, const char *s2);
int compareCurrency(struct Currency *c1, struct Currency *c2);
void sortCurrency(struct Currency *carr[],int n);
int main(void) {
int i = -1, size = 0;
struct Currency a, b, list[] = { { "Polish Zloty", 1.f, 0 },{ "United States dollar", 4.2f, 1 },{ "Euro", 4.4f, 0 },
{ "Turkish Lira", 2.f, 1 },{ "Japanese Yen",2.3f ,0 },{ "Swedish krona",2.0f,1 },
{ "Swiss frank",2.4f,0 },{ "Singapore dollar",2.2f,0 },{ "Euro", 4.f, 1 },
{ "Swedish krona",2.5f,0 },{ "Swiss frank",2.2f,1 },{ "Singapore dollar",2.8f,1 },
{ "Singapore dollar",2.4f,1 },{ "Polish Zloty", 1.1f, 1 } };
i++;
size = sizeof(list) / sizeof(struct Currency);
readCurrency(&a);
printCurrency(&a);
puts("");
{
char* s1 = "aliot";
char* s2 = "ali";
puts("\nTest mystrcmp():");
printf("%s %s : %d\n", s1, s1, mystrcmp(s1, s1));
printf("%s %s : %d\n", s2, s1, mystrcmp(s2, s1));
printf("%s %s : %d\n\n", s1, s2, mystrcmp(s1, s2));
}
readCurrency(&b);
puts("Test comparing currencies:");
printCurrency(&b);
puts("\nand");
printCurrency(&a);
printf("\nResult (a,b)%d (b,a)%d (b,b)%d\n", compareCurrency(&a, &b), compareCurrency(&b, &a), compareCurrency(&b, &b));
puts("\nUnsorted list");
for (i = 0; i < size; i++) {
printCurrency(&list[i]);
puts("");
}
sortCurrency(list, size);
puts("\nSorted list");
for (i = 0; i < size; i++) {
printCurrency(&list[i]);
puts("");
}
/**/
return 0;
}
void readCurrency(struct Currency *cur) {
scanf("%s %lf %d", cur->name, &cur->exchange_rate, &cur->action);
}
void printCurrency(struct Currency* cur) {
printf("currency name :%s \ncurrency rate : %f\n", cur->name, cur->exchange_rate);
if (cur->action == 0)
printf("action : buy");
else
printf("action : sell");
}
int mystrcmp(const char* s1, const char *s2) {
int i = 0;
while(s1[i]==s2[i]){
if(s1[i] == '\0')
return 0;
i++;
}
return (int)s1[i] - (int)s2[i];
}
int compareCurrency(struct Currency *c1, struct Currency *c2) {
if(mystrcmp(c1->name,c2->name) == 0 ){
if(c1->exchange_rate == c2->exchange_rate){
return 0;
}
else
return c1->exchange_rate - c2->exchange_rate;
}
}
void sortCurrency(struct Currency *carr[],int n){
int i,j;
struct Currency tmp;
for(i = 1 ; i < n ; i++){
tmp = carr[i];
for(j = i - 1 ; j < n - 1 ; j++){
if(compareCurrency(carr[j],carr[j+1]) > 0){
tmp = carr[j];
carr[j] = carr[j + 1];
carr[j + 1] = tmp;
}
}
}
}
你好朋友,
我有一些由struct定义的类型的预定义货币列表列表,在函数sortCurrency
中我需要根据exchange_rate
对所有这些货币进行排序,但是我得到了一些错误。
错误:
inlab.c: In function ‘main’:
inlab.c:67:15: warning: passing argument 1 of ‘sortCurrency’ from incompatible pointer type [-Wincompatible-pointer-types]
sortCurrency(list, size);
^~~~
inlab.c:25:6: note: expected ‘struct Currency **’ but argument is of type ‘struct Currency *’
void sortCurrency(struct Currency *carr[],int n);
^~~~~~~~~~~~
inlab.c: In function ‘sortCurrency’:
inlab.c:116:9: error: incompatible types when assigning to type ‘struct Currency’ from type ‘struct Currency *’
tmp = carr[j];
^
inlab.c:118:17: error: incompatible types when assigning to type ‘struct Currency *’ from type ‘struct Currency’
carr[j + 1] = tmp;
输出我想要获得
Compare your program's output with the following (user input highlighted in bold):
Give: name exchange_rate buy or sell (0 or 1)
Bitcoin 52000 1 // user input
Bitcoin 52000.000000 sell
Test mystrcmp():
Ala Ala : 0
Alan Ala : 110
Ala Alan : -110
Give: name exchange_rate buy or sell (0 or 1)
Ethereum 1500 0 // user input
Test comparing currencies:
Ethereum 1500.000000 buy
and
Bitcoin 52000.000000 sell
Result (a,b)-3 (b,a)3 (b,b)0
Unsorted list
Polish Zloty 1.000000 buy
United States dollar 4.200000 sell
Euro 4.400000 buy
Turkish Lira 2.000000 sell
Japanese Yen 2.300000 buy
Swedish krona 2.000000 sell
Swiss frank 2.400000 buy
Singapore dollar 2.200000 buy
Euro 4.000000 sell
Swedish krona 2.500000 buy
Swiss frank 2.200000 sell
Singapore dollar 2.800000 sell
Singapore dollar 2.400000 sell
Polish Zloty 1.100000 sell
Sorted list
Euro 4.400000 buy
Euro 4.000000 sell
Japanese Yen 2.300000 buy
Polish Zloty 1.000000 buy
Polish Zloty 1.100000 sell
Singapore dollar 2.200000 buy
Singapore dollar 2.400000 sell
Singapore dollar 2.800000 sell
Swedish krona 2.500000 buy
Swedish krona 2.000000 sell
Swiss frank 2.400000 buy
Swiss frank 2.200000 sell
Turkish Lira 2.000000 sell
United States dollar 4.200000 sell
答案 0 :(得分:0)
你必须听编译抱怨。
我修复了基本类型不匹配问题,这些问题可以让你编译并进行更远的测试:
void sortCurrency(struct Currency *carr[],int n);
已更改为:
void sortCurrency(struct Currency carr[], int n);
已调整对compareCurrency
的调用。
if(compareCurrency(&carr[j],&carr[j+1]) > 0){
您需要调试排序,因为它不起作用。 这是修改后的程序及其当前输出:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define NAMELEN 32
struct Currency
{
char name[NAMELEN];
double exchange_rate;
int action;
};
void printCurrency(struct Currency *cur);
void readCurrency(struct Currency *cur);
int mystrcmp(const char* s1, const char *s2);
int compareCurrency(struct Currency *c1, struct Currency *c2);
void sortCurrency(struct Currency carr[], int n);
int mystrcmp(const char* s1, const char *s2) {
int i = 0;
while(s1[i]==s2[i]){
if(s1[i] == '\0')
return 0;
i++;
}
return (int)s1[i] - (int)s2[i];
}
int compareCurrency(struct Currency *c1, struct Currency *c2) {
if(mystrcmp(c1->name,c2->name) == 0 ){
if(c1->exchange_rate == c2->exchange_rate){
return 0;
}
else
return c1->exchange_rate - c2->exchange_rate;
}
}
void sortCurrency(struct Currency carr[],int n){
int i,j;
struct Currency tmp;
for(i = 1 ; i < n ; i++){
tmp = carr[i];
for(j = i - 1 ; j < n - 1 ; j++){
if(compareCurrency(&carr[j],&carr[j+1]) > 0){
tmp = carr[j];
carr[j] = carr[j + 1];
carr[j + 1] = tmp;
}
}
}
}
void readCurrency(struct Currency *cur) {
scanf("%s %lf %d", cur->name, &cur->exchange_rate, &cur->action);
}
void printCurrency(struct Currency* cur) {
printf("currency name :%s \ncurrency rate : %f\n", cur->name, cur->exchange_rate);
if (cur->action == 0)
printf("action : buy");
else
printf("action : sell");
}
int main(void) {
int i = -1, size = 0;
struct Currency a, b;
struct Currency list[] =
{
{ "Polish Zloty", 1.f, 0 },{ "United States dollar", 4.2f, 1 },{ "Euro", 4.4f, 0 },
{ "Turkish Lira", 2.f, 1 },{ "Japanese Yen",2.3f ,0 },{ "Swedish krona",2.0f,1 },
{ "Swiss frank",2.4f,0 },{ "Singapore dollar",2.2f,0 },{ "Euro", 4.f, 1 },
{ "Swedish krona",2.5f,0 },{ "Swiss frank",2.2f,1 },{ "Singapore dollar",2.8f,1 },
{ "Singapore dollar",2.4f,1 },{ "Polish Zloty", 1.1f, 1 }
};
i++;
size = sizeof(list) / sizeof(struct Currency);
readCurrency(&a);
printCurrency(&a);
puts("");
{
char* s1 = "aliot";
char* s2 = "ali";
puts("\nTest mystrcmp():");
printf("%s %s : %d\n", s1, s1, mystrcmp(s1, s1));
printf("%s %s : %d\n", s2, s1, mystrcmp(s2, s1));
printf("%s %s : %d\n\n", s1, s2, mystrcmp(s1, s2));
}
readCurrency(&b);
puts("Test comparing currencies:");
printCurrency(&b);
puts("\nand");
printCurrency(&a);
printf("\nResult (a,b)%d (b,a)%d (b,b)%d\n", compareCurrency(&a, &b), compareCurrency(&b, &a), compareCurrency(&b, &b));
puts("\nUnsorted list");
for (i = 0; i < size; i++) {
printCurrency(&list[i]);
puts("");
}
sortCurrency(list, size);
puts("\nSorted list");
for (i = 0; i < size; i++) {
printCurrency(&list[i]);
puts("");
}
/**/
return 0;
}
输出:
zloty 4.3 1
dollar 2.2 0
currency name :zloty
currency rate : 4.300000
action : sell
Test mystrcmp():
aliot aliot : 0
ali aliot : -111
aliot ali : 111
Test comparing currencies:
currency name :dollar
currency rate : 2.200000
action : buy
and
currency name :zloty
currency rate : 4.300000
action : sell
Result (a,b)22 (b,a)-22 (b,b)0
Unsorted list
currency name :Polish Zloty
currency rate : 1.000000
action : buy
currency name :United States dollar
currency rate : 4.200000
action : sell
currency name :Euro
currency rate : 4.400000
action : buy
currency name :Turkish Lira
currency rate : 2.000000
action : sell
currency name :Japanese Yen
currency rate : 2.300000
action : buy
currency name :Swedish krona
currency rate : 2.000000
action : sell
currency name :Swiss frank
currency rate : 2.400000
action : buy
currency name :Singapore dollar
currency rate : 2.200000
action : buy
currency name :Euro
currency rate : 4.000000
action : sell
currency name :Swedish krona
currency rate : 2.500000
action : buy
currency name :Swiss frank
currency rate : 2.200000
action : sell
currency name :Singapore dollar
currency rate : 2.800000
action : sell
currency name :Singapore dollar
currency rate : 2.400000
action : sell
currency name :Polish Zloty
currency rate : 1.100000
action : sell
Sorted list
currency name :Polish Zloty
currency rate : 1.000000
action : buy
currency name :Euro
currency rate : 4.400000
action : buy
currency name :Japanese Yen
currency rate : 2.300000
action : buy
currency name :Singapore dollar
currency rate : 2.200000
action : buy
currency name :Euro
currency rate : 4.000000
action : sell
currency name :Singapore dollar
currency rate : 2.800000
action : sell
currency name :Polish Zloty
currency rate : 1.100000
action : sell
currency name :Singapore dollar
currency rate : 2.400000
action : sell
currency name :Swedish krona
currency rate : 2.000000
action : sell
currency name :Swedish krona
currency rate : 2.500000
action : buy
currency name :Swiss frank
currency rate : 2.400000
action : buy
currency name :Swiss frank
currency rate : 2.200000
action : sell
currency name :Turkish Lira
currency rate : 2.000000
action : sell
currency name :United States dollar
currency rate : 4.200000
action : sell