首页 > 其他分享 >c语言高级应用实验报告

c语言高级应用实验报告

时间:2023-02-18 18:33:20浏览次数:57  
标签:语言 错误 int void 高级 stu printf 实验报告 输入

题目一:按要求将程序补充完整。有n个整数,使前面各数顺序向后移动m个位置,余下n-m个数变成最前面的数。写一个函数void moveNumber(int *pnum,int n,int m)实现以上功能。

 

程序代码:

#include <stdio.h>
#define MAXNUM 100
main()
{
  int  num[MAXNUM],*pnum,n,m,i;
  void moveNumber(int *pnum,int n,int m);
    printf("请输入数组长度n(n<%d)",MAXNUM);
    scanf("%d",&n);
    printf("请输入需移动数的个数m(m<n):");
    scanf("%d",&m);
    printf("请输入%d个整数,按空格分开:\n",n);
    //以下使用指针移动法访问数组元素,请仔细研究体会
    pnum=num;                          
    for (i=0;i<n;i++)

{
        scanf("%d",pnum);  //用户输入的数放入当前pnum指向的位置
        pnum++;
    }  
    pnum=num;    
    moveNumber(pnum,n,m);  //调用函数移动m个数
    printf("\n移动最后%d个数到前面后,数组变为:\n",m);
    for (i=0;i<n;i++)
        printf("%d ",*(num+i)); //指针运算法访问数组元素
}
void moveNumber(int *pnum,int n,int m)
{//算法思路:用一个与主函数中num等大的数组temp,利用pt和pn指针,将num的数按要求赋值到temp中后,再拷贝回num数组
  int temp[MAXNUM];   
  int *pt ; //用来指向temp数组
  int *pn; //用来 指向num数组
  int i;
  pn=pnum+n-m;
  pt=temp;
  for(i=0;i<m;i++)
   {
   *pt=*pn;pt++;pn++;
}
  pn=pnum;
  for(i=0;i<n-m;i++)
   {
   *pt=*pn;pt++;pn++;
}
  pt=temp;
  for(i=0;i<n;i++)
  {
   *pnum=*pt;
   pt++;pnum++;
  }
 } 

  

 

题目二:指针方法编写一个程序,输入3个整数,将它们按由小到大的顺序输出。(提示可以编写一个交换函数swap(int *a,int *b)来实现)

程序代码:

#include<stdio.h>

int main()
{
  void swap(int *p1,int *p2);
  int a=0,b=0,c=0;
  int *p1,*p2,*p3;
  printf("请输入3个整数a,b,c:");
  scanf("%d %d %d",&a,&b,&c);
  p1=&a;
  p2=&b;
  p3=&c;
  if(a>b)
  {
    swap(p1,p2);
  }
  if(a>c)
  {
    swap(p1,p3);
  }
  if(b>c)
  {
    swap(p2,p3);
  }
  printf("从小到大的排序为:%d %d %d\n",a,b,c);
  return 0;
}
void swap(int *p1,int *p2)
{
  int temp;
  temp=*p1;
  *p1=*p2;
  *p2=temp;
}

  

 

 

 

 

题目三:输入n(不大于20)个单精度数存入一维数组,用指针变量处理数组元素的方式将其逆序存放后输出,n从键盘输入。

程序代码: 

#include<stdio.h>
void oppsite(float *a,int N);
 main()
{
 float a[20];
 float *p=a;
 int i=0, N=0;
 printf("请输入元素个数:");
 scanf("%d",&N);
 printf("请输入数组元素:");
 for(i=0;i<N;i++)
  scanf("%f",&a[i]);
  oppsite(a,N);
 for(i=0;i<N;i++)
  printf("%f\n",a[i]);
 return 0;

}
void oppsite(float *p,int N)
{
int temp=0,i=0,m=N/2;
for(i=0;i<m;i++)
{
temp=*(p+i);
*(p+i)=*(p+N-1-i);
*(p+N-1-i)=temp;
}

}

  

调试错误:

错误一:[Error] cannot convert 'float*' to 'int*' for argument '1' to 'void oppsite(int*, int)'

更正错误:第一次定义函数声明时将数组名和另一变量(本来应该都是一个变量)搞混,在后面进行函数调用时发现牛不对马嘴,调用时写的是函数定义的另一变量,改正后写成数组名;在初函数定义时将定义类型写成了int 后面调用发现错误,因为在main内又定义数组名为float型,调用不了,将函数定义改成了float

错误二:[Error] declaration of 'int N' shadows a parameter

更正错误:这里忽略了主函数已经定义N,在oppsite函数中又重新定义一个一样的N变量,导致错误,换一个变量进行定义

错误三:[Error] ld returned 1 exit status

更正错误:在oppsite函数调用时将形参定义为int导致错误,更改为float

 

题目四:已知,char name[20]="DELHIk";int length;char*cptr=name;,编写程序,使用指针来确定字符串的长度。

程序代码:

#include <stdio.h>
int main()
{
char name[20]="DELHIk";
int length;
char*cptr=name;/*这里是将字符数组s的首地址赋给指针p,就是指针p指向字符数组*/
while(1)
{
if(*cptr !='\0')/*cptr指向字符数组的结束符‘\0’的地址,而s为字符数组的首地址*/
{
length++;
cptr++;
}
else
  break;
}
printf("字符串长度为:%d",length=cptr-name);/*二者相减可以得出两个地址之间的字符个数,就是被测字符数组的长度*/
return 0;

}

调试错误:无

调试结果:

 

 

题目五:编写一个程序,用12个月份的英文名称初始化一个字符指针数组,当键盘输入整数为1到12 时,显示相应的月份名,键入其他整数时显示错误信息。

程序代码:

#include <stdio.h>
#include <stdlib.h>
char *getmonth(int n);
int main()
{
     char *month[12]={"January","February","march","April","may","June","July","August","September","October","November"," December"};
     int n ;
     printf("请输入1-12数字:");
     scanf("%d",&n);
     while(1)
     {
      if(n>12||n<1)
      {
      printf("输入错误,请检查!\n");
 }
 printf("%s\n",month[n-1]);
 return 0;

 }
}

调试错误:

错误一:[Error] lvalue required as decrement operand

更改错误:将month【month--】改成month【n--】

调试结果:

 

题目六:学生信息统计

程序代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 10
#define M 3
#define H 10
//按照顺序为project1为高数 project2英语 project3 C语言
typedef struct student
{
    long num;//xuehao
    char name[10];
    int score[M];
    char sex[10];
    char age[H];
}inform;
void Input (inform stu[],int n,int m);//shuru
void totalc (inform stu[],int n,int m);//meimenkechen
void everystu (inform stu[],int n,int m);
void ranking (inform stu[],int n,int m);
void statistis (inform stu[],int n,int m);
void List (inform stu[],int n,int m);
int main()
{
    int n,c,m;
    char name[10];
    inform stu[N];
    printf("输入学生人数:");
    scanf("%d",&n);
    printf("输入考试科目:");
    scanf("%d",&m);
    printf("1.输入信息\n");
    printf("2.计算每门科目的总分和平均分\n");
    printf("3.每个学生的考试情况\n");
    printf("4.查看排名\n");
    printf("5.查看成绩占比\n");
    printf("6.全部输出\n");
    printf("0.Exit\n");
    printf("请输入序号:\n");
    printf("\n");
    for(;;)
    {
        scanf("%d",&c);
        switch(c)
        {
            case 1:                 //录入学生信息和各科成绩
            Input (stu,n,m);
            printf("请输入序号:\n");
            break;
            case 2:                //计算每门课程的总分和平均分
            totalc (stu,n,m);
            printf("请输入序号:\n");
            break;
            case 3:               //计算每个学生的总分和平均分
            everystu (stu,n,m);
            printf("请输入序号:\n");
            break;
            case 4:                //按每个学生的总分由高到低排出名次表
            ranking (stu,n,m);
            printf("请输入序号:\n");
            break;
            case 5:                //成绩分析  所占百分比
            statistis (stu,n,m);
            printf("请输入序号:\n");
            break;
            case 6:                  //全部输出
            List (stu,n,m);
            totalc (stu,n,m);
            printf("请输入序号:\n");
            break;
        case 0:
            exit(0);
        }
    }
    return 0;
}
void Input (inform stu[],int n,int m)    //1
{
    int i,j;
    for(i=0;i<n;i++)
    {
        printf("输入学号,名字,年龄,性别,成绩:");
        scanf("%ld",&stu[i].num);
        scanf("%s",&stu[i].name);
        scanf("%s",&stu[i].age) ;
        scanf("%s",&stu[i].sex);
        for(j=0;j<m;j++)
            scanf("%d",&stu[i].score[j]);
    }
}
void totalc (inform stu[],int n,int m)     //2.计算每门课程的总分和平均分
{
    int i,j,sum[M];
    double ave[M];
    for(j=0;j<m;j++)
    {
        sum[j]=0;
        for(i=0;i<n;i++)
        {
            sum[j]=sum[j]+stu[i].score[j];
        }
        ave[j]=(double)sum[j]/n;
    }
    for(i=0;i<m;i++)
        printf("科目%d的总分=%d,课程的平均分=%f\n",i+1,sum[i],ave[i]);
}
void everystu (inform stu[],int n,int m)     //3.计算每个学生的总分和平均分
{
    int i,j,sum[N];
    double ave[N];
    for(i=0;i<n;i++)
    {
        sum[i]=0;
        for(j=0;j<m;j++)
        {
            sum[i]=sum[i]+stu[i].score[j];
        }
        ave[i]=(double)sum[i]/m;
    }
    for(i=0;i<n;i++)
        printf("学号为%ld,姓名为%s的总分=%d,其平均分=%f\n",stu[i].num,stu[i].name,sum[i],ave[i]);
}
void ranking (inform stu[],int n,int m)          //4.按每个学生的总分由高到低排出名次表
{
    int i,j,k,h,sum[N];
    inform t;
    for(i=0;i<n;i++)
    {
        sum[i]=0;
        for(j=0;j<m;j++)
        {
            sum[i]=sum[i]+stu[i].score[j];
        }
    }
    for(i=0;i<n;i++)
    {
        k=i;
        for(j=i+1;j<n;j++)
        {
            if (sum[j]>sum[k])
                k=j;
        }
        if(i!=k)
        {
            t=stu[i],h=sum[i];
            stu[i]=stu[k],sum[i]=sum[k];
            stu[k]=t,sum[k]=h;
        }
    }
    for(i=0;i<n;i++)
        printf("学号:%7ld,名字:%s,分数:%d,年龄:%s,性别:%s\n",stu[i].num,stu[i].name,sum[i],stu[i].age,stu[i].sex);//以长整形打印用%ld
}

void statistis (inform stu[],int n,int m)   
{
    int a=0,b=0,c=0,d=0,e=0,i,j;
    double A,B,C,D,E;
    for(j=0;j<m;j++)
    {
        for(i=0;i<n;i++)
        {
            if(stu[i].score[j]>=90)
                a++;
            else if(stu[i].score[j]>=80)
                b++;
            else if(stu[i].score[j]>=70)
                c++;
            else if(stu[i].score[j]>=60)
                d++;
            else
                e++;
        }
        A=(double)a/n*100;
        B=(double)b/n*100;
        C=(double)c/n*100;
        D=(double)d/n*100;
        E=(double)e/n*100;
        printf("project %d\n",j+1);
        printf("优秀人数%d,百分比:%f%%\n",a,A);
        printf("良好人数%d,百分比:%f%%\n",b,B);
        printf("中等人数%d,百分比:%f%%\n",c,C);
        printf("及格人数%d,百分比:%f%%\n",d,D);
        printf("不及格人数%d,百分比:%f%%\n",e,E);
    }
}
void List (inform stu[],int n,int m)         
{
    int i,j,sum[N];
    double ave[N];
    for(i=0;i<n;i++)
    {
        sum[i]=0;
        for(j=0;j<m;j++)
        {
            sum[i]=sum[i]+stu[i].score[j];
        }
        ave[i]=(double)sum[i]/m;
    }
    for(i=0;i<n;i++)
    {
        printf("num:%10ld,name:%s\n",stu[i].num,stu[i].name);
        for(j=0;j<m;j++)
        {
            printf("score:%d\n",stu[i].score[j]);
        }
        printf("总分=%d\n平均分%f\n",sum[i],ave[i]);
    }
}

  

调试错误:

错误一:年龄输出为随机数

更改错误:实在是不知道怎么改了,把数字输入改为了字符输入避免了输出的时候随机值的生成

错误二:[Error] expected primary-expression before '[' token

更改错误:修改结构体内容,定义更为详细,防止结构体内的信息被当成别名

错误三:[Error] expected ',' or '...' before numeric constant

更改错误:定义了两个相同变量,更改其中一个变量名

调试结果:

 

 

 

 

 

 

 

 

 

标签:语言,错误,int,void,高级,stu,printf,实验报告,输入
From: https://www.cnblogs.com/librakeep/p/17091976.html

相关文章