开始学c 第一天

二级c语言上机题

1,求平均值:去掉一个最高分,去掉一个最低分,求平均值

问题:1,通过指针访问数组:*(p+i)

        2,去掉高分:使得max和min为0即可

        3,向数组输入数据前,先声明一个足够大的数组;

#include <stdio.h>
void del(int *p,int n)
{
    int i,max=0,min=0;
    for(i=1;i<n;i++)
    {
        if(*(p+i)>*(p+max))max=i;
        else if(*(p+i)<*(p+min))min=i;
    }
    *(p+max)=0;
    *(p+min)=0;
}
float av(int *p,int n)
{
    int i;
    float s=0;
    for(i=0;i<n;i++)
        s=s+p[i];
    s=s/(n-2);
    return s;
}
void main() 
{
    int i,n;
    float sc;
    int *p;
    int x[100];
    p=x;
    scanf("%d",&n);
    for(i=0;i<n;i++)
        scanf("%d",x+i);
    del(p,n);
    sc=av(p,n);
    printf("the score is:%.2f",sc);
    
}

 

2,创建带头结点的单链表

问题:1,指针使用前需要分配空间

         2,结构体内字符串数据直接由scanf函数输入

        3,结构体的表示方法

typedef struct Node
{
  int data;
  char name[20];
  struct Node * pNext;
} NODE,*PNODE;

        4,插入结点方法:a 为头结点分配空间;b 建立指向头结点的指针p;c 开始循环:每新加入一个结点new,分配一块空间,输入所需数据,再插到p后面。

# include <stdio.h>
# include <malloc/malloc.h>
# include <stdlib.h>
typedef struct Node
{
  int data;//数据域
  char name[20];
  struct Node * pNext;//指针域
} NODE,*PNODE;//NODE等价于struct Node  PNODE等价于struct Node *
PNODE cre()
{
    int i,len,val;
    char n[20];
    PNODE head=(PNODE)malloc(sizeof(NODE));
    PNODE tail=head;
    tail->pNext=NULL;
    scanf("%d",&len);
    for(i=0;i<len;i++)
    {
        PNODE new=(PNODE)malloc(sizeof(NODE));
        scanf("%s %d",new->name,&new->data);
        tail->pNext=new;
        new->pNext=NULL;
        tail=new;
    }
    return head;
}
void main()
{
    
    PNODE tail;
    tail=cre();
    while(NULL!=tail)
    {
        printf("%s's point is:%d\n",tail->name,tail->data);
        tail=tail->pNext;
    }
}

 

3,将字符串前面的*号移动到字符串后面

问题  1,字符串函数:strlen求长度,strcmp比较字符串

       2,统计*号个数,用while语句,累加用count++,确保count处值为新字符串第一个字符。

       3,字符串移位后,末尾+'\0'结束字符串

# include <stdio.h>
# include <string.h>
void del(char *s)
{
    int i=0,cou=0,k;
    int len=strlen(s);
    while(s[i++]=='*')cou++;
    k=cou;
    for(i=0;k<len;k++,i++)
        s[i]=s[k];
    for(i=len-cou;i<len;i++)
        s[i]='*';
}
void main()
{
    char ss[100];
    scanf("%s",ss);
    del(ss);
    printf("\n%s",ss);
}

 

4,按照姓名查找学生列表中某学生的成绩

问题 1,结构数组的初始化:NODE stu[]={{"will",100},{"tom",85},{"lim",90}};

      2,跳出for循环最快捷方式:return

# include <stdio.h>
# include <string.h>
#define N 3
typedef struct Node
{
  char name[20];
  int data;
  struct Node * pNext;//指针域
} NODE,*PNODE;//NODE等价于struct Node  PNODE等价于struct Node *
void find(NODE *stu)
{
    int i;
    char n[20];
    printf("insert the name:");
    scanf("%s",n);
    printf("\n");
    for(i=0;i<N;i++)
    {
        if(!strcmp(stu[i].name,n))
        {
            printf("it's %d",stu[i].data);
            return;
        }
    }
    if(i=N)printf("-1");
}
void main()
{
    char n[20];
    NODE stu[]={{"will",100},{"tom",85},{"lim",90}};
    find(stu);
}

 

5,求素数:i*i《=n代替sqrt函数

6,数列1+1/2+...+1/n

问题:1,令a保存每一次循环的1/i,令b累加

7,求结构数组中data的最大值

问题:1,p-》data是数据而不是地址

        2,p+i可以循环输入各结构的数据

#include <stdio.h>
#include <math.h>
struct list
{
    float sc;
    struct list *next;
};
typedef struct list STR;
float max(STR *p,int n)
{
    int i;
    float max=0;
    STR *q;
    q=p;
    for(i=0;i<n;i++)
    {
        if((q+i)->sc>max)max=(q+i)->sc;
    }
    return max;
}
void main()
{
    int i,n;
    float m;
    STR st[50];
    STR *p;
    p=st;
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        scanf("%f",&(p+i)->sc);
    }
    p=st;
    m=max(p,n);
    printf("%.2f",m);
}

 

8,将字符串中所有奇数下标的字符后移到下一个奇数下标中问题:1,后移方法:判断最后一个字符下标,如果是偶数就找前一个奇数下标字符,保存最后一个奇数下标字符,依次替换到第3个字符,最后赋值保存的字符到第1个字符。

# include <stdio.h>

void del(char *s)
{
    int i,len=strlen(s);
    char t;
    if(len%2!=0)len=len-1;
    t=s[len-1];
    for(i=len-1;i>1;i=i-2)
        s[i]=s[i-2];
    s[1]=t;
}
void main()
{
    char ss[20];
    scanf("%s",ss);
    del(ss);
    printf("\n%s",ss);
}

 

   

转载于:https://www.cnblogs.com/smile-loser/archive/2013/03/18/2966696.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值