C语言编程

以下均用指针方法编程:
1. 调试下列程序,使之具有如下功能:用指针法输入12个数,然后按每行4个数输出。写出调试过程。
main()
{ int j,k,a[12],*p;
for(j=0;j<12;j++)
scanf("%d",p++);
for(j=0;j<12;j++)
{ printf("%d",*p++);
if(j%4 == 0)
printf("\n");
}
}
2. 编写一个函数将给定字符串指定起始位置后的字符串复制到另一个字符串中去,主函数中输入一个字符串,调用该子函数,复制出另一字符串,后将其输出。

程序提示:
子函数形式如下:
void copystr(char*p1,char*p2,int m)
表示将p1所指向的字符串从第m个位置开始的部分复制到p2所指向的字符串。
主函数如下:
void main()
{
void copystr(char*,char*,int);
int m;
char str1[20],str2[20];
printf("input string:");
gets(str1);
printf("which character that begin to copy?");
scanf("%d",&m);
if(strlen(str1)<m)
printf("input error!");
else
{
copystr(str1,str2,m);
printf("result:%s\n",str2);
}
}

请完成子函数void copystr(char*p1,char*p2,int m)。

3. 编写一个程序,从键盘输入一个1-7之间的数字,输出其对应星期的英文。对应顺序如下表所示:
1 Monday
2 Tuesday
3 Wednesday
4 Thursday
5 Friday
6 Saturday
7 Sunday

提示:使用字符指针数组。
4. 有若干名学生,共修5门功课。他们的学号和成绩都存放在二维数组s中,每一行对应一名学生,且每行的第1列存放学生的学号,现要输出指定学生的成绩。
要求:补充完整search函数。
#include <stdio.h>
#define MAXN 3
int s[MAXN][6]={{1001,70,80,96,70,90},
{1002,40,80,50,60,80},
{1003,50,70,40,50,75}};

void search(int (*p)[6],int m,int no)
{

}
void main()
{
int num;
printf("Enter the number of student:\n");
scanf("%d",&num);
search(s,MAXN,num);
}
5. 调试下列程序,使之具有如下功能:任意输入2个数,调用两个函数分别求:
⑴ 2个数的和,
⑵ 2个数交换值。
要求用函数指针调用这两个函数,结果在主函数中输出。

main()
{ int a,b,c,void (*p)();
printf("Enter a and b:");
scanf("%d,%d",&a,&b);
p=swap;
*p(a,b);
printf("a=%d,b=%d\n",a,b);
p=sum;
*p(a,b,c);
printf("sum=%d\n",c);
}
void sum(int a,int b,int c)
{
c=a+b;
}
void swap(int a;int b)
{ int t;
t=a;
a=b;
b=t;
}
调试程序时注意参数传递的是数值还是地址。

这5道题,我全部在机子上调试通过了。。。all right!。。。你在vc++6上直接去运行,应该是没有问题的。有些题的解决方案还不算很完美,不过已经完全到达要求。
第一道:
#include "stdio.h"
main()
{ int j,k,a[12],*p;
p=&a[0]; //是p=&a[0];(或者p=a;)将指针指向数组头
for(j=0;j<12;j++)
scanf("%d",p++);
p=&a[0]; //输入之后,再次将指针指向数组头
for(j=0;j<12;j++)
{ printf("%d",*p++);
if((j+1)%4 == 0) //是j除以4求余,j从0开始的,不行。所以改成j+1
printf("\n");
}
}

第二题:编写一个函数将给定字符串指定起始位置后的字符串复制到另一个字符串中去,主函数中输入一个字符串,调用该子函数,复制出另一字符串,后将其输出。
就是写个子函数那个:
#include "stdio.h"
#include "string.h"
void main()
{
void copystr(char*,char*,int);
int m;
char str1[20],str2[20];
printf("input string:");
gets(str1);
printf("which character that begin to copy?");
scanf("%d",&m);
if(strlen(str1)<m)
printf("input error!");
else
{
copystr(str1,str2,m);
printf("result:%s\n",str2);
}
}
void copystr(char* str1,char* str2,int m)
{
char *p=str1,*q=str2;
for(int i=1;i<m;i++) //指针移动到目的位置
p++;
while((*q++=*p++)!='\0'); //开始赋值,直到结尾
}

3. 编写一个程序,从键盘输入一个1-7之间的数字,输出其对应星期的英文。对应

顺序如下表所示:
1 Monday
2 Tuesday
3 Wednesday
4 Thursday
5 Friday
6 Saturday
7 Sunday

提示:使用字符指针数组。

#include "stdio.h"

void main()
{
int m;
char str1[7][10]={"Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"};
printf("which date that begin to output,please enter 1-7:?");
scanf("%d",&m);
if (m<0 ||m>7)
printf("please enter right number!\n");
else
printf("today is :%s\n",str1[m-1]);
}
4. 有若干名学生,共修5门功课。他们的学号和成绩都存放在二维数组s中,每一

行对应一名学生,且每行的第1列存放学生的学号,现要输出指定学生的成绩。
要求:补充完整search函数。
#include <stdio.h>
#define MAXN 3
int s[MAXN][6]={{1001,70,80,96,70,90},
{1002,40,80,50,60,80},
{1003,50,70,40,50,75}};

void search(int (*p)[6],int m,int no)
{
int i;
no=no%m; //输入一个数,超过maxn的数求其余数,即 让它在数组范围内
for(i=0;i<no-1;i++)
{
p++; //指针移到选中的一组数据上,以便进行数据输入
}
printf("stuNo:\t1\t2\t3\t4\t5\n");
for(i=0;i<6;i++)
printf("%d\t",(*p)[i]); //输出选中数据
printf("\n");
}
void main()
{
int num;
printf("Enter the number of student:\n");
scanf("%d",&num);
search(s,MAXN,num);
}

5. 调试下列程序,使之具有如下功能:任意输入2个数,调用两个函数分别求:
⑴ 2个数的和,
⑵ 2个数交换值。
要求用函数指针调用这两个函数,结果在主函数中输出。
#include <stdio.h>
void main() //添加返回类型
{ int a,b,c=0; //用‘;’
void (*p)(int *a,int *b); //规范书写其相对应的函数指针
void (*q)(int *a,int *b,int *c);
void sum(int *a,int *b,int *c); //声明函数,先声明,后调用,形参用指针类型,才能使a,b互换。
void swap(int*,int *);
printf("Enter a:"); //分别输入a。和b
scanf("%d",&a);
printf("Enter b:");
scanf("%d",&b);
p=&swap; //p指向的swap函数地址,所以加一个地址运算符
p(&a,&b);
printf("a=%d,b=%d\n",a,b);
q= & sum; //这里的空格记得去掉哦,因为百度一些特殊规定,这里的& sum=∑
q(&a,&b,&c);
printf("sum=%d\n",c);
}
void sum(int *a,int *b,int *c) //这里用指针类型的形参才能使主函数的变量产生作用(赋值)
{
*c=*a+*b;
}
void swap(int *a,int *b) //形参中间应该用逗号,不是分号,同时,这里用指针类型的形参才能使主函数的变量产生作用(赋值)
{ int t;
t=*a;
*a=*b;
*b=t;
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-04-02
第一个问题:
#include <stdio.h>
void main()
{
int j,a[12],*p;
p=a;
for(j=0;j<12;j++)
scanf("%d",p++);
p=a;//重置p,因为p已经指向了a数组的末尾
for(j=0;j<12;j++)
{
printf("%d ",*p++);
if(j%4 == 3)
printf("\n");
}
}
第二个问题:加入#include <string.h>。 void copystr(char*,char*,int);这句话改成 void copystr(char*str1,char*str2,int m);并放在main函数的上边,里边的那句去掉(不可以在里边声明)。另外,字符串要初始化,这是关键。子函数的形式:
#include <stdio.h>
#include <string.h>
void copystr(char* str1,char* str2,unsigned int m);
void main()
{
unsigned int m;
char str1[20]="",str2[20]="";
printf("input string:");
gets(str1);
fflush(NULL);
printf("which character that begin to copy?");
scanf("%d",&m);
if(strlen(str1) <= m)
printf("input error!");
else
{
copystr(str1,str2,m);
printf("result:%s\n",str2);
}
}
void copystr(char* str1,char* str2,unsigned int m)
{
unsigned int i;
for (i=m-1;i<strlen(str1);i++)
{
str2[i-m+1] = str1[i];
}
}
第三个问题:
#include <stdio.h>
void main()
{
int a;
printf("Please input a number:\n");
scanf("%d",&a);
switch(a)
{
case 1:
printf("%s","Monday");
break;
case 2:
printf("%s","Tuesday");
break;
case 3:
printf("%s","Wednesday");
break;
case 4:
printf("%s","Thursday");
break;
case 5:
printf("%s","Friday");
break;
case 6:
printf("%s","Saturday");
break;
case 7:
printf("%s","Sunday");
break;
}
printf("\n");
}
第四个问题:
#include <stdio.h>
#define MAXN 3
int s[MAXN][6]={{1001,70,80,96,70,90},
{1002,40,80,50,60,80},
{1003,50,70,40,50,75}};

void search(int (*p)[6],int m,int no)
{
int i = 0,j=0;
for (i=0;i<m;i++)
{
if (no==p[i][0])
{
for (j=1;j<6;j++)
printf("%d ",p[i][j]);
}
}
printf("\n");
}

void main()
{
int num;
printf("Enter the number of student:\n");
scanf("%d",&num);
search(s,MAXN,num);
}

第五个问题:很显然你传值是不能改变形参的,另外,int a,b,c,void (*p)();这句话语法错误,int void两个返回类型?
如果你使用vc可以尝试用引用传递swap函数的ab以及sum的c,例如:void sum(int a,int b,int &c)
示例代码:
#include <stdio.h>

void sum(int a,int b,int &c);
void swap(int &a,int &b);
void (*p)(int &a, int &b);
void (*q)(int b, int a,int &c);

void main()
{
int a,b,c;
printf("Enter a and b:");
scanf("%d,%d",&a,&b);
p=swap;
(*p)(a,b);
printf("a=%d,b=%d\n",a,b);
q=sum;
(*q)(a,b,c);
printf("sum=%d\n",c);
}
void sum(int a,int b,int &c)
{
c=a+b;
}
void swap(int &a,int &b)
{ int t;
t=a;
a=b;
b=t;
}
所有问题均已解决,调试通过。希望楼主采纳
第2个回答  2011-04-01
先上第一题: 已调试通过。
int main(void) {
int j,a[12] = {0},*p = 0;

p = a;
for(j=0;j<12;j++)
scanf("%d",p++);

p = a; // 将指针指向a的头部
for(j=0;j<12;j++)
{
printf("%2d ",*p++);
if((j+1)%4 == 0)
printf("\n");
}

return 0;
}
第二题:
void copystr(char*p1,char*p2,int m)
{
char *tmp = p1+m;
while (*tmp != 0)
{
*p2++ = *tmp++;
}
}
第三题:
int main(void) {
char week[7][10] = {"Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"};
int index = 0;
printf("Please input a integer(1~7):\n");
scanf("%d",&index);
if (index >= 1 && index <= 7)
printf("The date is: %s\n", *(week+index-1));

return 0;
}
第四题:
void search(int (*p)[6],int m,int no)
{
int i=0;
while (i<m)
{
if (**p == no) break; //找到学号
p++;
i++;
}

if (i >= m)
{
printf("Can't find the student's info.\n");
return;
}

printf("the scores of the student are: \n");
for (int j=1; j<=5; j++) //j=1,从第二个开始,第一个是学号
{
printf("%d,", *(*(p)+j)); //打印成绩
}
printf("\n");
}
第五题:
void sum(int a, int b, int *c)
{
*c=a+b;
}
void swap(int *a, int *b)
{
int t;
t=*a;
*a=*b;
*b=t;
}
int main()
{
int a,b,c;
void (*p1)(int *a, int *b);
void (*p2)(int a, int b, int *c);
printf("Enter a and b:\n");
scanf("%d,%d",&a,&b);
p1=swap;
p1(&a, &b);
printf("a=%d,b=%d\n",a,b);
p2=sum;
p2(a, b, &c);
printf("sum=%d\n",c);
return 0;
}
第3个回答  2011-04-01
stdio.h>
#include<math.h>

bool is_triangle(double a,double b,double c) {
if(a+b<=c || a+c<=b || b+c<=a)
return false;
return true;
}

double SABC(double a,double b,double c) {
double p;
p=(a+b+c)/2.0;
return sqrt(p*(p-a)*(p-b)*(p-c)); //海伦公式
}

int main() {
double a,b,c;
while(1) {
printf("输入三角形的三条边(以0 0 0结束):\n");
scanf("%lf%lf%lf",&a,&b,&c);
if(a+b+c==0.0)
break;
if(is_triangle(a,b,c)) {
printf("三角形面积:%.2lf\n",SABC(a,b,c));
}
else
printf("不能构成三角形。\n");
}
return 0;
}
另外,站长团上有产品团购,便宜有保证
第4个回答  2011-04-01
stdio.h>
#include<math.h>

bool is_triangle(double a,double b,double c) {
if(a+b<=c || a+c<=b || b+c<=a)
return false;
return true;
}

double SABC(double a,double b,double c) {
double p;
p=(a+b+c)/2.0;
return sqrt(p*(p-a)*(p-b)*(p-c)); //海伦公式
}

int main() {
double a,b,c;
while(1) {
printf("输入三角形的三条边(以0 0 0结束):\n");
scanf("%lf%lf%lf",&a,&b,&c);
if(a+b+c==0.0)
break;
if(is_triangle(a,b,c)) {
printf("三角形面积:%.2lf\n",SABC(a,b,c));
}
else
printf("不能构成三角形。\n");
}
return 0;
}
相似回答