ı是初学者。我想创建一个小型数据库,并从中选择满足某些要求。它包含一些东西的定义,因此看起来很长,但事实并非如此。我认为就像有对象一样,我们向它添加Thins,然后比较属性。 C是否适合此任务。
#include<stdio.h>
typedef struct{
char isim;
int adet;
int odunc_alinma_sayisi;
int sayfa;
char yazar;
}kitap_ozellikleri;
kitap_ozellikleri a;
kitap_ozellikleri c;
kitap_ozellikleri y;
kitap_ozellikleri e;
kitap_ozellikleri t;
kitap_ozellikleri k;
/*int range(int maks){
if(maks==1) {
return 1;
}
int sayilar[maks];
sayilar[maks-1] = maks;
sayilar[maks-2] = range(maks-1);
return sayilar[];
}
*/
void ozellik_tanimla(){
a.adet = 50;
a.isim = 'a';
a.odunc_alinma_sayisi = 30;
a.sayfa = 280;
a.yazar = 'e';
c.adet = 82;
c.isim = 'c';
c.odunc_alinma_sayisi = 88;
c.sayfa = 150;
c.yazar = 'g';
y.adet = 99;
y.isim = 'y';
y.odunc_alinma_sayisi = 123;
y.sayfa = 119;
y.yazar = 'k';
e.adet = 53;
e.isim = 'e';
e.odunc_alinma_sayisi = 33;
e.sayfa = 268;
e.yazar = 'r';
t.adet = 24;
t.isim = 't';
t.odunc_alinma_sayisi = 42;
t.sayfa = 159;
t.yazar = 'o';
k.adet = 55;
k.isim = 'k';
k.odunc_alinma_sayisi = 110;
k.sayfa = 296;
k.yazar = 'o';
}
int main(){
ozellik_tanimla();
char liste[6] = {'a','c','y','e','t','k'};
char yazar_liste[6] = {'e','g','k','r','o','o'};
int n = 0;
for(n=0;n<6;n++){
int z = 0;
for(z=0;z<6;z++){
if(yazar_liste[n]==yazar_liste[z]){
kitap_ozellikleri gecici1 = yazar_liste[n]-> ;
kitap_ozellikleri gecici2 = yazar_liste[z]->;
gecici1.sayfa += gecici2.sayfa;
}
}
}
return 0;
}
我想了解这个错误是什么以及为什么会发生?
答案 0 :(得分:2)
欢迎堆栈溢出。
我想我可以从对问题和其他答案的评论中识别出您的意图,并且我相信您想要的核心循环更像是这样:
kitap_ozellikleri gecici1;
kitap_ozellikleri liste[6] = {a, c, y, e, t, k}; // no 'quotes'
char yazar_liste[6] = {'e', 'g', 'k', 'r', 'o', 'o'};
for(n=0; n<6; n++) {
for(z=0; z<6; z++) {
if(yazar_liste[n] == liste[z].yazar){
gecici1.sayfa += liste[z].sayfa;
}
}
}
您知道为什么我将liste
更改为kitap_ozellikleri[]
并删除了该数组成员周围的''
引号吗?
这会编译(在添加int n, z;
之类的开销之后),但是按编写时的原样,它计算yazar_liste[]
中列出的所有作者编写的总页数。但是,它还会对作者“ o”进行双重计数,因为该作者在yazar_liste[]
中被列出两次。
这里是完整版本,其中包含来自各种评论的建议,打印出每个作者的计数:
代码
#include<stdio.h>
typedef struct{
char isim;
int adet;
int odunc_alinma_sayisi;
int sayfa;
char yazar;
}kitap_ozellikleri;
kitap_ozellikleri a = { 'a', 50, 30, 280, 'e' };
kitap_ozellikleri c = { 'c', 82, 88, 150, 'g' };
kitap_ozellikleri y = { 'y', 99, 123, 119, 'k' };
kitap_ozellikleri e = { 'e', 53, 33, 268, 'r' };
kitap_ozellikleri t = { 't', 24, 42, 159, 'o' };
kitap_ozellikleri k = { 'k', 55, 110, 296, 'o' };
int main(){
int n, z, tot;
kitap_ozellikleri liste[6] = {a, c, y, e, t, k}; // no 'quotes'
char yazar_liste[6] = {'e', 'g', 'k', 'r', 'o'};
for(n=0; n<5; n++) {
tot = 0;
for(z=0; z<6; z++) {
if(yazar_liste[n] == liste[z].yazar){
tot += liste[z].sayfa;
}
}
printf("total pages for sayfa %c is : %d\n", yazar_liste[n], tot);
}
return 0;
}
输出
total pages for sayfa e is : 280
total pages for sayfa g is : 150
total pages for sayfa k is : 119
total pages for sayfa r is : 268
total pages for sayfa o is : 455
要改为按作者计数 store (例如,供程序稍后使用),则需要引入一种跟踪多个计数器的方法。我将其留给您练习;但是当然,如果您在尝试后仍有疑问,请随时发布另一个单独的SO问题,详细说明您尝试过的内容,结果以及预期的结果。
答案 1 :(得分:1)
这两行无效:
kitap_ozellikleri gecici1 = yazar_liste[n]-> ;
kitap_ozellikleri gecici2 = yazar_liste[z]->;
只需删除->
。这些无效,因为yazar_liste
不是指向结构的指针。
如果您希望它编译(它可能会或可能不会工作),请更改您的main
函数,如下所示:
int main(){
ozellik_tanimla();
char liste[6] = {'a','c','y','e','t','k'};
char yazar_liste[6] = {'e','g','k','r','o','o'};
int n = 0;
for(n=0;n<6;n++){
int z = 0;
for(z=0;z<6;z++){
if(yazar_liste[n]==yazar_liste[z]){
kitap_ozellikleri gecici1 = { .yazar = yazar_liste[n] };
kitap_ozellikleri gecici2 = { .yazar = yazar_liste[z] };
gecici1.sayfa += gecici2.sayfa;
}
}
}