c语言常用函数 这个函数第一处哪里错了?

求助 :这个函数为什么错了_c语言吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:442,557贴子:
求助 :这个函数为什么错了收藏
/*编辑联系人,如果该联系人存在才可以编辑,如果不存在则不需要编辑*/void editContact(struct contacts[],char *name)
//错误2{int i,k=0,flag=0;
struif(count==0){printf(&通讯录是空的!\n&);}for(i=0;i&i++)if(strcmp(name,contacts[i].name)==0)
//错误1和错误3 {
flag=1;}if(flag=1){printf(&\n请输入新的信息\n&);printf(&请输入姓名:&);scanf(&%s&,mycontact.name);printf(&请输入联系电话:&);scanf(&%s&,mycontact.telephone);printf(&输入生日\n&);printf(&请输入出生年份:&);scanf(&%d&,&mycontact.birthday.year);printf(&请输入出生月份:&);scanf(&%d&,&mycontact.birthday.month);printf(&请输入出生日期:&);scanf(&%d&,&mycontact.birthday.day);printf(&\n已成功修改!\n&);}else
printf(&此联系人不存在!\n&);}错误提示:
[错误1]C:\Program Files\Microsoft Visual Studio\MyProjects\qq\作业.cpp(110) : error C2275: 'contacts' : illegal use of this type as an expression[错误2]
C:\Program Files\Microsoft Visual Studio\MyProjects\qq\作业.cpp(100) : see declaration of 'contacts'[错误2]
C:\Program Files\Microsoft Visual Studio\MyProjects\qq\作业.cpp(110) : error C2228: left of '.name' must have class/struct/union type执行 cl.exe 时出错.作业.obj - 1 error(s), 0 warning(s)
------来自 爱贴吧HD for Windows8
福利不只是穿多穿少,还要有迷人的微笑!
name是个指针吧,,错误一那里是不是要加上个*号?
void editContact(struct contact contacts[], const char *name)不过你这里实际上并没有修改,没有将 mycontact 对应的值赋给 contacts[i]。
终于 改好了./* Note:Your choice is C IDE */#include &stdio.h&#include&string.h&struct date{};struct contact{char name[10];char telephone[12];};int count = 0;void addContact(struct contact contacts[]);void editContact(struct contact contacts[], char *name);void deleteContact(struct contact contacts[], char *name);void searchContact(struct contact contacts[], char *name);void main(){
char name[10];
struct contact contacts[50];
printf(&功能:1:添加
0:退出\n&);
printf(&请按数字键0-4选择功能:&);
scanf(&%d&,&choice);
switch(choice)
case 1:addContact(contacts);
deleteContact(contacts,name);
case 2:printf(&请输入要编辑的姓名:&);
scanf(&%s&,name);
editContact(contacts,name);
case 3:printf(&请输入要删除的姓名:&);
scanf(&%s&,name);
deleteContact(contacts,name);
case 4:printf(&请输入要查询的姓名:&);
scanf(&%s&,name);
searchContact(contacts,name);
}while(choice!=0);
printf(&谢谢使用通讯录!\n&);}//增加联系人 如果已经有50个联系人了提示联系人已经满了void addContact(struct contact contacts[]) //case 1:增加联系人
if(count==50)
printf(&通讯录已满!&);
printf(&输入姓名:&);
scanf(&%s&,mycontact.name);
printf(&请输入联系电话&);
scanf(&%s&,mycontact.telephone);
printf(&请输入生日的年份&);
scanf(&%d&,&mycontact.birthday.year);
printf(&请输入月份&);
scanf(&%d&,&mycontact.birthday.month);
printf(&请输入日期&);
scanf(&%d&,&mycontact.birthday.day);
contacts[count]=
//这行是什么意思?
printf(&\n已成功添加一个联系人\n&);
} ///编辑联系人 void editContact(struct contact contacts[],char *name){int i,k=0,flag=0;
struif(count==0){printf(&通讯录是空的!\n&);}for(i=0;i&i++)if(strcmp(name,contacts[i].name)==0){
flag=1;}if(flag=1){
printf(&\n请输入新的信息\n&);printf(&请输入姓名:&);scanf(&%s&,mycontact.name);printf(&请输入联系电话:&);scanf(&%s&,mycontact.telephone);printf(&输入生日\n&);printf(&请输入出生年份:&);scanf(&%d&,&mycontact.birthday.year);printf(&请输入出生月份:&);scanf(&%d&,&mycontact.birthday.month);printf(&请输入出生日期:&);scanf(&%d&,&mycontact.birthday.day);printf(&\n已成功修改!\n&);}else
printf(&此联系人不存在!\n&);}/*查询联系人*/void searchContact(struct contact contacts[], char*name){int i,flag=0;if(count==0){printf(&通讯录是空的!\n&);}for(i=0;i&i++)if(strcmp(name,contacts[i].name)==0){/*找到联系人*/
flag=1;}if(flag=1){printf(&姓名:%s\t&,contacts[i].name);printf(&电话:%s\n&,contacts[i].telephone);printf(&生日:%d年%d月%d日\n&, contacts[i].birthday.year,contacts[i].birthday.month, contacts[i].birthday.day);}elseprintf(&此联系人不存在!\n&);}/*删除联系人,如果联系人存在才可以删除,如果不存在则不需要删除*/void deleteContact(struct contact contacts[],char*name){int i,k=0,flag=0;if(count==0){printf(&通讯录是空的!\n&);}for(i=0;i&i++)if(strcmp(name,contacts[i].name)==0){
flag=1;}if(flag=1){for(k=i;k&k++){contacts[k]=contacts[k+1];}count--;printf(&\n已成功删除一个联系人\n&);}else
printf(&此联系人不存在!\n&);}
------来自 爱贴吧HD for Windows8
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或qsort包含在&stdlib.h&头文件中,此函数根据你给的比较条件进行快速排序,通过指针移动实现排序。排序之后的结果仍然放在原数组中。使用qsort函数必须自己写一个比较函数。
函数原型:
void qsort ( void * base, size_t num, size_t size, int ( * comparator ) ( const void *, const void * ) );
函数一共四个参数,没返回值。一个典型的qsort的写法如下:
void qsort(s,n,sizeof(s[0]),cmp);
其中第一个参数是参与排序的数组名(或者也可以理解成开始排序的地址,因为可以写&s[i],这个问题下面有说明);第二个参数是参与排序的元素个数; 第三个参数是单个元素的大小(推荐使用sizeof(s[0])这样的表达式,下面也有说明);第四个参数就是很多人觉得非常困惑的比较函数,关于这个函数,还要说的比较麻烦...
下面来讨论cmp这个比较函数(写成cmp是我的个人喜好,你可以随便写成什么,比如qcmp什么的)。典型的cmp的定义是:
int cmp(const void *a,const void *b);
返回值必须是int,两个参数的类型必须都是const void *,那个a,b是我随便写的两个参数。&假设是对int排序的话,如果是升序,那么就是如果a比b大返回一个正值,小则负值,相等返回0,后面有例子来说明对不同的类型如何进行排序。
在函数体内要对a,b进行强制类型转换后才能得到正确的返回值,不同的类型有不同的处理方法。具体情况请参考后面的例子。
**** 关于快排的一些小问题 ****
1、快排是不稳定的,这个不稳定一个表现在其使用的时间是不确定的,最好情况(O(n))和最坏情况(O(n^2))差距太大,我们一般说的O(nlog(n))都是指的是其平均时间。
2、快排是不稳定的,这个不稳定表现在如果相同的比较元素,可能顺序不一样,假设我们有这样一个序列,3,3,3,但是这三个3是有区别的,我们标记为3a,3b,3c,快排后的结果不一定就是3a,3b,3c这样的排列,所以在某些特定场合我们要用结构体来使其稳定(No.6的例子就是说明这个问题的)。
3、快排的比较函数的两个参数必须都是const void *的,这个要特别注意,写a和b只是我的个人喜好,写成cmp也只是我的个人喜好。推荐在cmp里面重新定义两个指针来强制类型转换,&特别是在对结构体进行排序的时候。
4、快排qsort的第三个参数,那个sizeof,推荐是使用sizeof(s[0])这样,特别是对结构体,往往自己定义2*sizeof(int)这样的会出问题,用sizeof(s[0)既方便又保险。
5、如果要对数组进行部分排序,比如对一个s[n]的数组排列其从s[i]开始的m个元素,只需要在第一个和第二个参数上进行一些修改:
void qsort(&s[i],m,sizeof(s[i]),cmp);
*** 标程,举例说明 ***
No.1、手工实现QuickSort:
基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
#include&stdio.h&
#include&stdlib.h&
void QuickSort(int *A,int left,int right)
if(left&=right) return;
int x=A[(left+right)&&1],low=left,high=
while(low&high)
while(A[low]&x)
while(A[high]&x)
if(low&=high)
int Temp=A[low];
A[low]=A[high];
QuickSort(A,left,high);
QuickSort(A,low,right);
int main()
int length,i,r[10000];
scanf("%d",&length);
for(i=1;i&=i++)
scanf("%d",&r[i]);
QuickSort(r,1,length);
for(i=1;i&=i++)
printf(" %d",r[i]);
printf("\n");
system("pause");
#include&stdio.h&
#include&stdlib.h&
int QKPass(int r[],int left,int right)
int low,high,x;
x=r[left];//选择基准记录
while(low&high)
while(low&high&&r[high]&=x)//从右到左找到小于x的记录
if(low&high)
r[low]=r[high];//找到后进行替换
while(low&high&&r[low]&x)
if(low&high)
r[high]=r[low];
r[low]=x;//将基准记录保存在low=high的位置
return//返回基准记录的位置
int QKSort(int r[],int low,int high)
if(low&high)
pos=QKPass(r,low,high);
QKSort(r,low,pos-1);
QKSort(r,pos+1,high);
int main()
int length,i,r[10000];
scanf("%d",&length);
for(i=1;i&=i++)
scanf("%d",&r[i]);
QKSort(r,1,length);
for(i=1;i&=i++)
printf("%-3d",r[i]);
printf("\n");
system("pause");
No.2、最常见的,对int数组排序&:
#include&stdio.h&
#include&stdlib.h&
int s[10000],n,i;
int cmp(const void *a, const void *b)
return(*(int *)a-*(int *)b);
//return(*(int *)b-*(int *)a); //降序
int main()
scanf("%d",&n);
for(i=0;i&n;i++)
scanf("%d",&s[i]);
qsort(s,n,sizeof(s[0]),cmp);
for(i=0;i&n;i++)
printf("%d ",s[i]);
printf("\n");
system("pause");
No.3、对double型数组排序,原理同int:
这里做个注释,本来是因为要判断如果a==b返回0的,但是严格来说,两个double数是不可能相等的,只能说fabs(a-b)&1e-20之类的这样来判断,所以这里只返回了1和-1&
#include&stdio.h&
#include&stdlib.h&
double s[1000];
int cmp(const void * a, const void * b)
return((*(double*)a-*(double*)b&0)?1:-1);
int main()
scanf("%d",&n);
for(i=0;i&n;i++)
scanf("%lf",&s[i]);
qsort(s,n,sizeof(s[0]),cmp);
for(i=0;i&n;i++)
printf("%.2lf ",s[i]);
printf("\n");
system("pause");
return(0);
No.4、对一个字符数组排序.原理同int:
#include&stdio.h&
#include&string.h&
#include&stdlib.h&
char s[10000],i,n;
int cmp(const void *a,const void *b)
return(*(char *)a-*(char *)b);
int main()
scanf("%s",s);
n=strlen(s);
qsort(s,n,sizeof(s[0]),cmp);
printf("%s",s);
printf("\n");
system("pause");
No.5、对结构体排序(一级排序):
很多时候我们都会对结构体排序,比如2010年校赛的那个根据几个参数排序,一般这个时候都在cmp函数里面先强制转换了类型,不要在return里面转换,我也说不清为什么,但是这样程序会更清晰,并且绝对是没错的。 这里同样请注意double返回0的问题:
#include&stdio.h&
#include&stdlib.h&
struct node
int cmp(const void *a,const void *b)
struct node *aa=(node *)a;
struct node *bb=(node *)b;
return(((aa-&data)&(bb-&data))?1:-1);
int main()
scanf("%d",&n);
for(i=0;i&n;i++)
s[i].no=i+1;
scanf("%lf",&s[i].data);
qsort(s,n,sizeof(s[0]),cmp);
for(i=0;i&n;i++)
printf("%d %lf\n",s[i].no,s[i].data);
system("pause");
No.6、对结构体排序(二级排序)。加入no来使其稳定(即data值相等的情况下按原来的顺序排):
#include&stdio.h&
#include&stdlib.h&
struct node
int cmp(const void *a,const void *b)
struct node *aa=(node *)a;
struct node *bb=(node *)b;
if(aa-&data!=bb-&data)
return(((aa-&data)&(bb-&data))?1:-1);
return((aa-&no)-(bb-&no));
int main()
scanf("%d",&n);
for(i=0;i&n;i++)
s[i].no=i+1;
scanf("%lf",&s[i].data);
qsort(s,n,sizeof(s[0]),cmp);
for(i=0;i&n;i++)
printf("%d %lf\n",s[i].no,s[i].data);
printf("\n");
system("pause");
如果有字符串的话,就这样写:
int cmp(const void *a,const void *b)
struct node *aa=(node *)a;
struct node *bb=(node *)b;
if(aa-&data!=bb-&data)
return(((aa-&data)&(bb-&data))?1:-1);
return((aa-&no)-(bb-&no));
return strcmp(aa.str,bb.str);
//return strcmp(aa-&str,bb-&str);
//按照结构体中字符串str的字典顺序排序
No.7、对字符串数组的排序(char s[][]型):
#include&stdio.h&
#include&string.h&
#include&stdlib.h&
char s[100][100];
int cmp(const void *a,const void *b)
return(strcmp((char*)a,(char*)b));
int main()
scanf("%d",&n);
for(i=0;i&n;i++)
scanf("%s",s[i]);
qsort(s,n,sizeof(s[0]),cmp);
for(i=0;i&n;i++)
printf("%s\n",s[i]);
printf("\n");
system("pause");
No.8、对字符串数组排序(char *s[]型):
#include&stdio.h&
#include&string.h&
#include&stdlib.h&
char *s[100];
int cmp(const void *a,const void *b)
return(strcmp(*(char**)a,*(char**)b));
int main()
scanf("%d",&n);
for(i=0;i&n;i++)
s[i]=(char*)malloc(sizeof(char*));
scanf("%s",s[i]);
qsort(s,n,sizeof(s[0]),cmp);
for(i=0;i&n;i++)
printf("%s\n",s[i]);
printf("\n");
system("pause");
阅读(...) 评论()下面这两句话错在哪,为什么?1.c语言程序总是从第一个定义的函数开始执行2.在c语言程序中,要调用的函数必须在main()函数中定义
兮后宫の倮
1.c语言程序总是从第一个定义的函数开始执行→c语言程序总是main函数开始执行2.在c语言程序中,要调用的函数必须在main()函数中定义 →2.在c语言程序中,要调用的函数可以在任何地方定义 ,但在必须在main函数调用的前面有定义或声明
为您推荐:
其他类似问题
扫描下载二维码后使用快捷导航没有帐号?
只需一步,快速开始
查看: 1969|回复: 10
主题帖子精华0积分25C币24 枚在线时间1 小时注册时间最后登录性别保密
新人 Lv.0, 积分 25, 距离下一级还需 39 积分
主题帖子C币24 枚在线时间1 小时
买了一本C语言书,有点不明白,怎么书本跟实际不一样?怎么一按回车就关闭,不是scanf会获取输入的数据的么?
下面是按书本来做的。
生成程序后,一按回车就会关闭程序,但是书本上是说会获取输入的数据,但是我输入了数据,回车就会关闭程序?请教高手,谢谢。
完整代码如下。#include &stdio.h&
void main(void)
{
& & int i=0;
& & printf(&\n Please input a number:&);
& & scanf(&%d&,&i);
& & printf(&\nI got the number you inputed,it is %d&,i);
& & getchar();
}复制代码
附件: 你需要才可以下载或查看附件。没有帐号?
主题帖子精华1积分1661C币1521 枚在线时间140 小时注册时间最后登录性别男居住地陕西省&宝鸡市
头像被屏蔽
主题帖子C币1521 枚在线时间140 小时
提示: 作者被禁止或删除 内容自动屏蔽
主题帖子精华0积分755C币721 枚在线时间34 小时注册时间最后登录性别保密
资深专家 Lv.4, 积分 755, 距离下一级还需 269 积分
主题帖子C币721 枚在线时间34 小时
代码没问题,我用VC运行了,应该是你的编译器问题了!
专业建站 seo优化 软件设计 推广&&学在囧途
主题帖子精华0积分25C币24 枚在线时间1 小时注册时间最后登录性别保密
新人 Lv.0, 积分 25, 距离下一级还需 39 积分
主题帖子C币24 枚在线时间1 小时
学在囧途 发表于
代码没问题,我用VC运行了,应该是你的编译器问题了!
VC可以编写C语言吗?
主题帖子精华0积分25C币24 枚在线时间1 小时注册时间最后登录性别保密
新人 Lv.0, 积分 25, 距离下一级还需 39 积分
主题帖子C币24 枚在线时间1 小时
lichao890427 发表于
/question/.html
/question/.html?an=0 ...
那你用啥编写C语言?
主题帖子精华0积分755C币721 枚在线时间34 小时注册时间最后登录性别保密
资深专家 Lv.4, 积分 755, 距离下一级还需 269 积分
主题帖子C币721 枚在线时间34 小时
lujunjie1993 发表于
VC可以编写C语言吗?
专业建站 seo优化 软件设计 推广&&学在囧途
主题帖子精华0积分14C币14 枚在线时间0 小时注册时间最后登录性别男
新人 Lv.0, 积分 14, 距离下一级还需 50 积分
主题帖子C币14 枚在线时间0 小时
关闭程序?编译器?还是?如果编译器关闭那么就是编译器的问题,否则是否类似的tc的alt+F5?不明白为什么定义时赋值干嘛。没意义
主题帖子精华0积分25C币24 枚在线时间1 小时注册时间最后登录性别保密
新人 Lv.0, 积分 25, 距离下一级还需 39 积分
主题帖子C币24 枚在线时间1 小时
本帖最后由 lujunjie1993 于
16:57 编辑
lsnbing 发表于
关闭程序?编译器?还是?如果编译器关闭那么就是编译器的问题,否则是否类似的tc的alt+F5?不明白为什么定 ...
不是,是编译后,出现问题了,我加了两个getchar();就可以了。这奇怪了。如果一个getchar();就会输入数字后就会关闭。但是两个getchar();就会获取到输入的数据,然后显示出来,在按回车就关闭了。不是编译器的原因,是代码的原因。
主题帖子精华0积分25C币24 枚在线时间1 小时注册时间最后登录性别保密
新人 Lv.0, 积分 25, 距离下一级还需 39 积分
主题帖子C币24 枚在线时间1 小时
学在囧途 发表于
代码没问题,我用VC运行了,应该是你的编译器问题了!
不是,是编译后,出现问题了,我加了两个getchar();就可以了。这奇怪了。如果一个getchar();就会输入数字后就会关闭。但是两个getchar();就会获取到输入的数据,然后显示出来,在按回车就关闭了。不是编译器的原因,是代码的原因。
主题帖子精华0积分329C币304 枚在线时间25 小时注册时间最后登录性别保密
IT精英 Lv.3, 积分 329, 距离下一级还需 183 积分
主题帖子C币304 枚在线时间25 小时
你引用一个io.h(或者是iostream.h)的头文件,最后加一个system(&pause&);
试试,不知道是不是这个问题
&第一个不行就用第二个头文件的名称,看你编译器里的是哪个&
( 粤ICP备号-2 )请编写函数fun,该函数的功能是:统计各年龄段的人数。N个年龄通过调用随机函数获得,并放入主函数的age数组中。要求函数把0~9岁年龄段的人数放在d[0]中,把10~19岁年龄段的人数放在d[1]中,把20~29岁年龄段的人数放在d[2]中,依此类推,把100岁(含100岁)以上年龄的人数都放在d[10]中。结果在主函数中输出。&br&#include &stdio.h&&br&# define N
50&br&# define M
11&br&void fun(int *a,
int *b)&br&{&br&&br&
for(i=0;i&11;i++)&br&
b[i]=0;&br&
for(i=0;i&M;i++)&br&
switch(a[i]/10)&br&
case 0:b[0]+=1;&br&
case 1:b[1]+=1;&br&
case 2:b[2]+=1;&br&
case 3:b[3]+=1;&br&
case 4:b[4]+=1;&br&
case 5:b[5]+=1;&br&
case 6:b[6]+=1;&br&
case 7:b[7]+=1;&br&
case 8:b[8]+=1;&br&
case 9:b[9]+=1;&br&
defult:b[10]+=1;&br&}&br&double
rnd()&br&{&br&
static t=29,c=217,m=1024,r=0;&br&
r=(r*t+c)%m;
return((double)r/m);&br&}&br&void main()&br&{ &br&
FILE *&br&
int age[N], i,d[M];&br&
int b[N]={32,45,15,12,86,49,97,3,44,52,17,95,63};&br&
for(i=0; i&N; i++)
age[i]=(int)(115*rnd());
/*产生一个随机的年龄数组*/&br&
printf(&The original data :\n&);&br&
for(i=0; i&N; i++)
printf((i+1)%10==0? &%4d\n&:&%4d&,age[i]);
/*每行输出10个数*/&br&
printf(&\n\n&);&br&
fun(age,d);&br&
for(i=0; i&10; i++)
printf(&%4d---%4d
:%4d\n&, i*10, i*10+9,d[i]);&br&
printf(&Over 100
%4d\n&,d[10]);&br&/******************************/&br&
wf=fopen(&out.dat&,&w&);&br&
fun(b,d);&br&
for(i=0; i&10; i++)
fprintf(wf,&%4d---%4d
:%4d\n&, i*10, i*10+9,d[i]);&br&
fprintf(wf,&Over 100
%4d&,d[10]);&br&
fclose(wf);&br&/*****************************/&br&}
请编写函数fun,该函数的功能是:统计各年龄段的人数。N个年龄通过调用随机函数获得,并放入主函数的age数组中。要求函数把0~9岁年龄段的人数放在d[0]中,把10~19岁年龄段的人数放在d[1]中,把20~29岁年龄段的人数放在d[2]中,依此类推,把100岁(含100岁)以上年龄的人数都放在d[10]中。结果在主函数中输出。#include &stdio.h&# define N
50# define M
11void fun(int *a,
for(i=0;i&11;i++)
for(i=0;i&M;i++)
switch(a[i]/10)
case 0:b[0]+=1;
case 1:b[1]+=1;
case 2:b[2]+=1;
case 3:b[3]+=1;
case 4:b[4]+=1;
case 5:b[5]+=1;
case 6:b[6]+=1;…
你的 switch 之下,有不止一個 case,且 case 後不止一句,所以,應該用 "{}" 包圍起來。否則,編譯器無法知道第一個 continue 和後面每一句是屬於這個在 for 循環裏的 switch 。而且,為了一目瞭然,這個 switch 所在的 for 循環,也用 "{}" 包圍起來比較好。像這樣:
for ( i = 0; i & M; i++ ) {
switch ( a[i] / 10 ) {
b[0] += 1;
b[1] += 1;
b[2] += 1;
b[3] += 1;
b[4] += 1;
b[5] += 1;
b[6] += 1;
b[7] += 1;
b[8] += 1;
b[9] += 1;
b[10] += 1;
另外,你貼在問題裏的程序,"default" 有拼錯。rnd() 裏面 t, c, m, r 們沒有寫上變量類型。
已有帐号?
无法登录?
社交帐号登录}

我要回帖

更多关于 c语言常用函数 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信