哪位大佬能帮看看这道c语言?

作者&投稿:裔嘉 (若有异议请与网页底部的电邮联系)
C语言求助,哪位大佬帮我看看这道题?一直搞不清楚~

#include
#include
#include

#define M 3

FILE *fp;
char filename[50] = {""};

typedef struct message {
char name[16];
char telephone[16];
char email[24];
char address[24];
int postcode;
struct message *next;
} *LinkList,*pNode;

void ReadData(pNode p) {
printf("姓 名 : ");
scanf("%s",p->name);
printf("电话号码 : ");
scanf("%s",p->telephone);
printf("邮箱号码 : ");
scanf("%s",p->email);
printf("地 址 : ");
scanf("%s",p->address);
printf("邮政编码 : ");
scanf("%d",&p->postcode);
}

void ShowLine(int n) {
int i;
for(i = 0; i < n; ++i)
printf("*");
printf("
");
}

void ShowData(pNode p) {
printf("%-16s",p->name);
printf("%-16s",p->telephone);
printf("%-24s",p->email);
printf("%-24s",p->address);
printf("%-8d
",p->postcode);
}

void ShowAll(LinkList head) {
pNode p;
ShowLine(88);
for(p = head->next; p; p = p->next)
ShowData(p);
ShowLine(88);
}

LinkList GetEmptyList() {
LinkList head = (pNode)malloc(sizeof(struct message));
head->next = NULL;
head->name[0] = 0;
head->address[0] = 0;
head->postcode = 0;
head->telephone[0] = 0;
head->email[0] = 0;
return head;
}

void Addmember(LinkList head) { // 按telephone增序添加,可用于创建新链表
pNode q,p = (pNode)malloc(sizeof(struct message));
ReadData(p);
q = head;
while(q->next) {
if(strcmp(q->next->telephone,p->telephone) == 0) {
ShowData(p);
printf("***** 这个电话号码已经存在。
");
return;
}
if(strcmp(q->next->telephone,p->telephone) > 0) {
p->next = q->next;
q->next = p;
return;
}
}
q->next = p;
p->next = NULL;
}

pNode SearchName(LinkList head,char name[]) {
pNode p;
if(head == NULL) return NULL;
for(p = head->next; p; p = p->next) {
if(strcmp(p->name,name) == 0) {
ShowData(p);
return p;
}
}
return NULL;
}

pNode SearchTelephone(LinkList head,char telephone[]) {
pNode p;
if(head == NULL) return NULL;
for(p = head->next; p; p = p->next) {
if(strcmp(p->telephone,telephone) == 0) {
ShowData(p);
return p;
}
}
return NULL;
}

void ModifyListName(LinkList head) {
pNode p;
char name[24];
printf("被修改人的姓名 : ");
scanf("%s",name);
p = SearchName(head,name);
if(p == NULL) printf("XXXXX 没有找到姓名为%s的记录!
",name);
else {
ShowData(p);
ReadData(p);
}
}

void ModifyListTelephone(LinkList head) {
pNode p;
char telephone[16];
printf("被修改的电话号码 : ");
scanf("%s",telephone);
p = SearchTelephone(head,telephone);
if(p == NULL) printf("***** 没有找到电话号码为%s的记录!
",telephone);
else {
ShowData(p);
ReadData(p);
}
}

void ModifyList(LinkList head) {
int select;
do {
printf("1、按姓名修改,2、按电话号码修改,0、返回
");
printf("请选择:");
scanf("%d",&select);
switch(select) {
case 1 : ModifyListName(head);
case 2 : ModifyListTelephone(head);
}
}while(select);
}

int EraseTelephone(LinkList head,char telephone[]) { // 删除电话号码为telephone的结点
int an;
pNode p,q;
if(head->next == NULL) {
printf("号码本为空。
");
return 0;
}
for(p = head; p->next; p = p->next) {
if(strcmp(p->next->telephone,telephone) == 0) {
ShowData(p);
printf("1.删除, 0.不删除 : ");
scanf("%d",&an);
if(an == 1) {
q = p->next;
p->next = q->next;
free(q);
return 1;
}
else return 0;
}
}
printf("***** 没有找到电话号码为%s的记录!
",telephone);
return 0;
}

void LoadData(LinkList head) { // 传送文件的内容到内存
pNode p,tmp;
int an,flag;
if(filename[0] == '\0') {
printf("要传送的数据文件名 : ");
scanf("%s",filename);
}
else {
printf("加载文件%s? 1.是,0不是 :",filename);
scanf("%d",&an);
if(an == 1) {
fp = fopen(filename,"rb");
if(fp == NULL) {
printf("XXXXX 打开文件%s失败。
",filename);
return;
}
}
else {
printf("文件名 : ");
scanf("%s",filename);
fp = fopen(filename,"rb");
if(fp == NULL) {
printf("XXXXX 打开文件%s失败。
",filename);
return;
}
}
}
if(head->next == NULL) {
p = head;
tmp = (pNode)malloc(sizeof(struct message));
while(fread((void *)tmp,sizeof(struct message),1,fp) == 1) {
p->next = tmp;
p = p->next;
tmp = (pNode)malloc(sizeof(struct message));
}
fclose(fp);
p->next = NULL;
free(tmp);
return;
}
printf("1.添加,2.覆盖 : ");
scanf("%d",&an);
if(an == 1) {
tmp = (pNode)malloc(sizeof(struct message));
while(fread(tmp,sizeof(struct message),1,fp) == 1) {
flag = 1;
for(p = head; p->next && flag; p = p->next) {
if(strcmp(p->next->telephone,tmp->telephone) == 0) {
printf("***** 因电话号码相同,本条信息未添加:
");
ShowData(tmp);
flag = 0;
break;
}
if(strcmp(p->next->telephone,tmp->telephone) > 0) {
tmp->next = p->next;
p->next = tmp;
flag = 0;
break;
}
}
if(flag) {
p->next = tmp;
tmp->next = NULL;
}
tmp = (pNode)malloc(sizeof(struct message));
}
fclose(fp);
free(tmp);
return;
}
if(an == 2) {
p = head->next;
while(p) {
tmp = p;
p = p->next;
free(tmp);
}
p = head;
tmp = (pNode)malloc(sizeof(struct message));
while(fread(tmp,sizeof(struct message),1,fp) == 1) {
p->next = tmp;
p = p->next;
tmp = (pNode)malloc(sizeof(struct message));
}
free(tmp);
p->next = NULL;
fclose(fp);
}
}

void SaveData(LinkList head) { // 保存内存到文件
int an;
char mode[5];
pNode p;
if(filename[0] == 0) {
printf("请输入文件名 : ");
scanf("%s",filename);
fp = fopen(filename,"wb");
if(fp == NULL) {
printf("XXXXX 打开文件%s失败。
",filename);
return;
}
for(p = head->next; p; p = p->next)
fwrite(p,sizeof(struct message),1,fp);
fclose(fp);
return;
}
else {
printf("1.覆盖文件%s
2.追加文件%s
3.新建
4.无操作返回
",filename,filename);
printf("请选择 : ");
scanf("%d",&an);
if(an 3) return;
if(an == 3) {
printf("请输入文件名 : ");
scanf("%s",filename);
fp = fopen(filename,"wb");
if(fp == NULL) {
printf("XXXXX 打开文件%s失败。
",filename);
return;
}
for(p = head->next; p; p = p->next)
fwrite(p,sizeof(struct message),1,fp);
fclose(fp);
return;
}
else {
if(an == 1) strcpy(mode,"wb");
else if(an == 2) strcpy(mode,"ab");
fp = fopen(filename,"wb");
if(fp == NULL) {
printf("XXXXX 打开文件%s失败。
",filename);
return;
}
for(p = head->next; p; p = p->next)
fwrite(p,sizeof(struct message),1,fp);
fclose(fp);
return;
}
}
}

void Sort(LinkList head) { // 按姓名增排序
pNode p,q,pt;
if(head == NULL) return;
p = head;
while(p->next) {
q = p->next->next;
while(q->next) {
if(strcmp(p->next->telephone,q->next->telephone) > 0) {
pt = p->next;
p->next = q->next;
q->next = q->next->next;
p->next->next = pt;
}
else q = q->next;
}
p = p->next;
}
}

void FreeList(LinkList head) {
pNode p = head,q;
while(p) {
q = p;
p = p->next;
free(q);
}
}

void menu(LinkList head) {
int choice;
do {
printf("┌─────────────────────────────────┐
");
printf("│ │
");
printf("│ 欢迎使用通讯录管理软件 │
");
printf("│ │
");
printf("│ 编写 xoalyg │
");
printf("│ │
");
printf("└─────────────────────────────────┙
");
printf("



");
printf("1、新建
");
printf("2、浏览
");
printf("3、修改
");
printf("4、添加
");
printf("5、排序
");
printf("6、加载
");
printf("7、保存
");
printf("0、退出
");
printf("
请选择 : ");
scanf("%d",&choice);
switch(choice) {
case 1 : Addmember(head); break;
case 2 : ShowAll(head); break;
case 3 : ModifyList(head); break;
case 4 : Addmember(head); break;
case 5 : Sort(head); break;
case 6 : LoadData(head); break;
case 7 : SaveData(head); break;
}
}while(choice);
}

int main() {
LinkList head = GetEmptyList();
menu(head);
FreeList(head);
return 0;
}

#include int main(){ int rate; while( scanf("%d", &rate) != EOF ) { if( rate < 1200 ){ puts("ABC"); }else if( rate < 2800 ){ puts("ARC"); }else{ puts("AGC"); } } return 0;}

按题意,既利用指针将b中每个元素按照升序插入到a数组对应位置。

思路:

a,b都是默认输入升序的数(题目没要求验证,我的代码也不验证,请按升序输入,如需验证升序输入,只需定义一个变量记录输入的数字,并在下次循环输入时比大小。)

所以,定义2个指针分别指向a,b最后一个输入的元素地址,嵌套循环,分别往前移动,同时比较两数组元素,每次找到对应位置就将a移位并插入b的位置。

ps:由于存在b小于a的所有元素这种特殊情况,循环外还有a数组全部后移的情况。故位移写成单独函数,符合编程习惯。

下面是代码:

#include <stdio.h>

void move1(int *bp,int a[],int len)//从bp开始往后移动1位

{

    int *ep=&a[len-1];

    if(bp>=a && bp<=ep)

        while(ep>bp)//a当前元素之后的元素向后移1位

        {

            *ep=*(ep-1);

            ep--;

        }

}

int main()

{

    int i=0,m=50,a[50],b[3],*pa=NULL,*pb=&b[2],flag;

    while(m>47) printf("请输入m值(>=47):"),scanf("%d",&m);

    printf("请给a数组输入%d个整数(确保升序排列,输入无验证!):
",m);

    i=m;

    while(i--) scanf("%d",&a[m-i-1]);

    printf("请给b数组输入3个整数(确保升序排列,输入无验证!):
"),scanf("%d%d%d",&b[0],&b[1],&b[2]);

    while(pb>=b)//从b最大数开始

    {

        pa=&a[m-1];//初始指向a最大数

        while(pa>=a)//从a最大数开始

        {

            flag=0;

            if(*pa<=*pb)//找到第一个a小于等于b,就把b元素插入到a元素后面(a移位)

            {

                flag=1;

                move1(pa+1,a,50);//a当前元素之后的元素向后移1位

                 *(pa+1)=*pb;

                break;

            }

            pa--;

        }

        if(!flag)//如未发生位移,说明该b元素小于所有a元素,插入再a数组开始位置,a所有元素后移1位

            move1(a,a,50),a[0]=*pb;

        pb--;

    }

    pa=a;

    printf("合并后的a数组为:
");

    while(pa<=&a[m+3-1]) printf("%d ",*pa++);

    return 0;

}



简单粗暴思路:直接将b数组的数字放到a数组m到m+2位置,然后对长度m+3的a数组进行排序。

#include "stdafx.h"

#include <iostream>

using namespace std;

void swap(int*p, int*q);

int main()

{

int a[50], b[3],m;

int *p, *q;

p = a;

q = b;

cout << "m:";

cin >>m;

cout <<"a:";

for (int i = 0; i < m; i++)

cin >> *(p+i);

cout  << "b:";

for (int i = 0; i < 3; i++)

{

cin >>*(q+i);

*(p+m+i)=*(q+i);

}

for (int i = 0; i < m + 3; i++)

cout << *(p + i)<<" ";

cout << endl;

for (int i = 0; i < m + 3; i++)

{

for (int j = 0; j < m + 3 - i; j++)

if (*(p + i) > *(p + i + j))

swap(p + i, p + i + j);

}

for (int i = 0; i < m + 3; i++)

cout << *(p + i)<<" ";

cout << endl;

system("pause");

    return 0;

}

void swap(int*p, int*q)

{

int temp;

temp = *p;

*p = *q;

*q = temp;

}




哪位大佬能帮看看这道c语言?
flag=1;move1(pa+1,a,50);\/\/a当前元素之后的元素向后移1位 (pa+1)=*pb;break;} pa--;} if(!flag)\/\/如未发生位移,说明该b元素小于所有a元素,插入再a数组开始位置,a所有元素后移1位 move1(a,a,50),a[0]=*pb;pb--;} pa=a;printf("合并后的a数组为:\\n");while(pa<=&a...

一道语文题,哪位大佬帮我看看这道题选哪个,在线等,急。谢谢各位的帮助...
a不对zhuan写;b不对mu样;c不对tiao学

哪位大佬能帮我看看,这道题咋写?初中数学
3m+n=-1 两边同时乘以2德尔6m+2n=-2 3×m×(-1)²+(-1)+n=0 3m+n=1 两边同时乘以2得 6m+n=2

请各位英语大佬帮我看看这道题选什么?
1. let's开头的祈使句,反意部分,固定使用shall we?(因为let's=let us,意思是让我们. .)所以符合的有A和C。2. 过去完成时是有条件的,表示过去的过去,不能随便用,比如我到车站时,车已经开走了。所以不选C,而选A(现在完成时表示已经约人了)。

大佬们帮我看看,这道题怎么做?
∵2³=8,3³=27 ∴³√10的整数部分x=2 则y=³√10 - 2 ∴x+y=2 + (³√10 - 2)=³√10 则(x+y)³=(³√10)³=10

求大佬看看这道高数题
自己的作业自己做,自己的作业自己做,自己的作业自己做自己的作业自己做

求大佬看看这道高数题
首先,积分曲面是椭球面。被积函数是常数8a²,代入。现在就需要求椭球面表面积,设三个半轴长度是a,b,c,椭球面表面积公式s=4π\/3(ab+bc+ca)

麻烦各位大佬们看一下这道题?
7*2的格子,题目说列的组合会有重复,那我们关注列。先将三种颜色两两搭配,对于一个1*2的格子,因为第一行,和第二行是不同的,所以例如:红蓝,蓝红,是两个不同的颜色组合,那么我将会得到6个不同的颜色组合,而我们有七个列,肯定至少会有两个重复。如果是正在学习排列组合,明显是A32,6种...

C语言求助,哪位大佬帮我看看这道题?一直搞不清楚
printf("\\t*** 这个电话号码已经存在。\\n"); return; } if(strcmp(q->next->telephone,p->telephone) > 0) { p->next = q->next; q->next = p; return; } } q->next = p; p->next = NULL;}pNode SearchName(LinkList head,char name[]) { pNode p; if(head == NULL) return...

大佬帮我看看这两道题谢谢高中的
很简单,以A为原点做空间直角坐标系

元江哈尼族彝族傣族自治县14788128179: 哪位高手帮看一下,这道C语言题目可否帮解释详细点?结果是多少呢? -
机汪冻干: 源文件就有问题. 最后结果是abcbcc程序改为如下,在VS2005下可以运行#include <string.h> //包含string,所以就可以用strcpy这个字符串复制函数 #include <stdio.h> //包含stdio.h,这样就可以用printf void main() {char ch[]="abc",x[3][4];...

元江哈尼族彝族傣族自治县14788128179: 各位高手,各位同行,谁来帮我看看这道C语言题 -
机汪冻干: 直接给你程序:#include <stdio.h> void print(int* a) { int i=0; for(i=0;i<10;++i) printf("%d ",a[i]); } void backMove1(int a[10],int m) { int i=0; int b[10]; for(i=0;i<10;++i) b[i] = a[i]; for(i=m;i<10+m;++i) { a[i%10] = b[i-m]; } print(a); } void backMove2(int* a,...

元江哈尼族彝族傣族自治县14788128179: 求求大佬看看这道c语言怎么做 -
机汪冻干: 答案是A 2143;解析:①、main一开始赋值x=1,y=2; ②、传递进fun函数是:fun(2,1)(注意这里传递参数y在前x在后) ③、对fun子函数而言,接收到是fun(2,1),也就是fun的x=2,y=1.所以先打出21;④、fun子函数中,最后赋值x=3,y=4,对应到main函数中是y=3,x=4;⑤、最后打出x y就是43;连起来就是打出2143

元江哈尼族彝族傣族自治县14788128179: 谁会这道C语言题目?求高手解答.有1000元人民币100元面值,50元面值,20元面值,10元面值,模拟有多少种组合.最后用printf("一百元有%d张,五... -
机汪冻干:[答案] 可以给你思路 用for循环嵌套定义4个变量int i,j,k,l,分别用来表示100,50,20,10的张数,然后嵌套 for(i=0,i

元江哈尼族彝族傣族自治县14788128179: 求大佬看一下这个C语言题目.要求:根据出生年份判断多名学生属相.求代码. -
机汪冻干: int i;int yea8;while(1){printf("输入年份:");scanf("%d",&year);printf("%d\r\n",year%12);switch(year%12+1){case 0: printf("未羊\r\n"); break;case 1: printf("申猴\r\n"); break;case 2: printf("酉鸡\r\n"); break;case 3:...

元江哈尼族彝族傣族自治县14788128179: 麻烦看下这道c语言的题目. (39)以下语句或语句组中,能正确进行字符串赋值的是___D___. -
机汪冻干:[选项] A. char *sp;*sp="right!"; B. char s[10];s="right!"; C. char s[10];*s="right!"; D. char *sp="right!"; 这道题选D?如果是的话说下为什么? 谢谢~~~

元江哈尼族彝族傣族自治县14788128179: 各位大哥帮我看看这个c语言程序,是输出一个9行菱形的*,有很多不懂. -
机汪冻干: #include<stdio.h> void main(void) { int i,j; for(i=0;i<=9/2;i++)//9/2和4是一样的,用9/2只是为了让你理解这是输出菱形的上半部分;9/2=4 { for(j=i;j<9/2;j++) { printf(" "); } for(j=0;j<=2*i;j++) { printf("*"); } printf("\n"); } for(i=0;i<9/2;i++) { for(j=0;j<=i...

元江哈尼族彝族傣族自治县14788128179: 一道超简单的c语言各位大佬帮忙看下哪里错了~ -
机汪冻干: double fm=1,fz=1;#include<stdio.h>#include<math.h> main(){ double eps,sum=1.0,flat=1.0,a; double fm=1,fz=1; scanf("%lf",&eps); while(fabs(a=fz/fm)>eps){ flat*=-1; fm+=3; sum+= fz/fm*flat; } printf("sum = %.6lf",sum); }

元江哈尼族彝族傣族自治县14788128179: 一个简单的c语言题求好心大佬看看0.0 -
机汪冻干: #include#include int main() { char instr[80 + 1]; char b; int i, j = -1; // j = -1 int len; gets(instr); scanf("%c", &b); len = strlen(instr); for (i = 0; i<len; i++) { if (b == instr[i]) { j = i; break; } } if (j == -1) // -1 printf("Not found"); else { for (i = j; i<len; i++) printf("%c", instr[i]); } }

元江哈尼族彝族傣族自治县14788128179: 请大神帮我看一下这道C语言题目!!!求n个数的最小公倍数!!!在线等!!! -
机汪冻干: 这是因为虽然最后的结果是32位整数,但是a*b的结果不一定是啊,有可能会超,所以lcm函数中的计算顺序需要调换一下,return a/gcd(a, ...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网