二级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); }