c语言例题指针三

第一题:
void fun41()
{
//定义一个长度为20的字符数组name,初始化为“tom”。
char name[20] = "tom";
int i = 0, len = strlen(name);
//显示name中字符串内容。
for (i = 0; i < len; i++)
{
printf("%c", name[i]);
}
//显示name中字符串长度。

printf("\n字符串长度为:%d", len);
//显示name字符数组的大小。
printf("\n字符数组大小为:%d", sizeof(name) / sizeof(char));
//为name重新赋值字符串“Liming”。
strcpy(name, "Liming");
//编写一个函数show,参数为一个字符串指针,函数的功能是将输入的字符串输出。
show(name);

//定义一个字符指针address,初始化为NULL。
//为address赋值“Beijing”。
char* address = NULL;
address = "Beijing";

//显示address所指向字符串的值。
show(address);

//显示address所指向字符串的长度。
printf("\naddress所指字符串长度为:%d", i);

//address求sizeof(),查看并理解结果。
printf("\nsizeof(address)=%d", sizeof(address));

//为address重新赋值“New York”。
address = "New York";

//显示address所指向字符串的值。
show(address);

//使用strcpy为address赋值“Shanghai”,查看并理解结果。
address = NULL;
char* str = "Shanghai";
strcpy(address, str);

//使用memset为address清零,查看并理解结果。
memset(address, '\0', sizeof(address));

//使用strcat为address追加字符串“street”,查看并理解结果。
strcat(*str,"street");
}

第二题:
接收一个字符串,并将其中小写字母改为大写字母,大写字母改为小写字母,其他字符不变,然

后逆序输出。
#include
#include
#include
int main(void) {
char *s, *p = s;
 printf("请输入一个字符串:\n");
 fflush(stdout);
 scanf("%s", s);
 while (*s != '\0') {
 if (*s >= 'a' && *s <= 'z')
 *s = *s - 32;
 else if (*s >= 'A' && *s <= 'Z')
 *s = *s + 32;
 s++;
 }
 printf("转换并逆序输出:\n%s", strrev(p));
return EXIT_SUCCESS;
}

第三题:
  编写一个名叫my_strcpy的函数,它类似于strcpy函数,但它不会溢出目标数组。复制

的结果必须是一个真正的字符串。
#include
#include
#include
int main(void) {
char *my_strcpy(char *dest, int dest_len, const char *src, int src_len) {
 int i;
 int len;

 if ((dest == NULL )||(src == NULL))return NULL;

 len = (dest_len - 1) > src_len ? src_len : (dest_len - 1);

 for (i = 0; i < len; i++) {
 dest[i] = src[i];
 }
 dest[i] = '\0';

 return dest;
 }

 int main() {
 char dest[10];
 char src[] = "1234567890qw";

 my_strcpy(dest, 10, src, strlen(src));
 printf("输出的字符串为:%s", dest);
 return EXIT_SUCCESS;
 }

第四题:
有一个班,3个学生,各学四门课,计算总平均分以及第n个学生的成绩。(应用指向数组的

指针)
int main(){
 void average(float *p,int n);
 void search(float(*p)[4],int n);
 float score[3][4]={{65,76,87,90},{98,89,78,68},{56,76,90,80}};
 average(*score,12);
 search(score,2);
 return 0;
 }
 void average(float *p,int n){
 float *p_end;
 float sum=0,aver;
 p_end=p+n-1;
 for(;p<=p_end;p++)
 sum=sum+(*p);
 aver=sum/n;
 printf("average=%5.2f\n",aver);
 }
 void search(float(*p)[4],int n){
 int i;
 printf("The score of No.%d are:\n",n+1);
 for(i=0;i<4;i++){
 printf("%5.2f\n",*(*(p+n)+i));
 printf("\n");
 }
 }

第五题:
在第四题的基础上,查找有一门以上课程不及格的学生,输出他们的全部课程的成绩。
int main() {
 void search(float (*p)[4], int n);
 float score[3][4] = { { 65, 76, 87, 90 }, { 98, 89, 78, 68 }, { 56, 76, 90,
 80 } };
 search(score, 3);
 return 0;
 }
 void search(float (*p)[4], int n) {
 int i, j, flag;
 for (j = 0; j < n; j++) {
 flag = 0;
 for (i = 0; i < 4; i++)
 if (*(*(p + j) + i) < 60)
 flag = 1;
 if (flag == 1) {
 printf("No.%d fails,his scores are:\n", j + 1);
 for (i = 0; i < 4; i++) {
 printf("%5.2f\n", *(*(p + j) + i));
 printf("\n");
 }
 }
 }
 }

第六题:
定义一指针数组,长度为5,并初始化。将字符串按字母顺序(由小到大)输出。
#include
#include

void fun()
{
 //将若干字符串按字母顺序(由小到大)输出。
  char *p[5]={"abc","ABC","edf","EDF","000"} ,*str=p;
   int i =0,j=0;
   for(i=0;i<5;i++)
   {  
    for(j=i+1;j<5;j++)
    {
     if(-1!=strcmp(*(p+i),*(p+j)))
     {
        str=*(p+i);
        *(p+i)=*(p+j);
       *(p+j)=(str);

     }
    }

   }
  for(i=0;i<5;i++)
  printf( " %s " ,(p[i]));

}

第七题:
有一个班的四个学生,有5门课。
(1)求第一门课的平均分,
(2)找出有两门以上课程不及格的学生,输出他们的学号和全部课程成绩及平均成绩。
(3)找出平均成绩在90分以上或全部课程在85分以上的学生。分别编写3个函数实现以上3

个要求。
int main() {
 void avsco(float *, float *);
 void avcour1(char (*)[10], float *);
 void fail2(char course[5][10], int num[], float *pscore, float aver[4]);
 void good(char course[5][10], int num[4], float *pscore, float aver[4]);
 int i, j, num[4], *pnum; //编号码是整型数据;
 float score[4][5], *pscore, *paver, aver[4]; //分数都为float类型数据;
 char (*pcourse)[10], course[5][10];
 printf("please input course:\n");
 fflush(stdout);
 pcourse = course;
 for (i = 0; i < 5; i++)
  scanf("%s", course[i]);
 printf("input NO. and score:\n");
 fflush(stdout);
 printf("NO.");
 fflush(stdout);
 for (i = 0; i < 5; i++)
  printf(",%s", course[i]);
 printf("/n");
 pnum = &num[0];
 pscore = &score[0][0];
 for (i = 0; i < 4; i++) {
  scanf("%d", pnum + i); //这是对每一个人进行编号;只需要给四个值

;所以只能放在此处;
  for (j = 0; j < 5; j++)
   scanf("%f", pscore + 5 * i + j); //分数要给20个值;
 }
 paver = &aver[0];
 printf("\n\n");
 avsco(pscore, paver);
 avcour1(pcourse, pscore);
 printf("\n\n");
 fail2(pcourse, pnum, pscore, paver);
 printf("\n\n");
 good(pcourse, pnum, pscore, paver);
 return 0;
}
void avsco(float *pscore, float *paver) {
 int i, j;
 float sum, average;

 for (i = 0; i < 4; i++) {
  sum = 0.0;
  for (j = 0; j < 5; j++)
   sum = sum + (*(pscore + 5 * i + j)); //在这个等式当中,

*(pscore+5*i+j)一定要加括号;
  average = sum / 5;
  *(paver + i) = average;
 }
}
//此处不能将char (*pcourse)[10]写成*(pcourse)[10];否则link严重错误;
void avcour1(char (*pcourse)[10], float *pscore) //此处声明不是char course[5]

[10],而是char (*pcousre)[10]);
{
 int i;
 float sum, average1;
 sum = 0.0; //sum需要初始化为0.0;
 for (i = 0; i < 4; i++)
  sum = sum + (*(pscore + 5 * i));
 average1 = sum / 4;
 printf("the first course %s average score is %f", *pcourse, average1);
}
void fail2(char course[5][10], int num[], float *pscore, float aver[4]) //因为采

用数组指针course[i],所以不能用char *(pcourse)[10];
{
 int i, j, k, label;
 printf(
   "==================Student who is fail in two

couses===================/n");
 printf("NO.");
 for (i = 0; i < 5; i++)
  printf("%11s", course[i]); //因为要用course[i]输出课程名称,所以

不能声明char *(pcourse)[10];只能是char course[5][10];
 printf("average\n");
 for (i = 0; i < 4; i++) {
  label = 0; //每个人的不及格的course 计数;
  for (j = 0; j < 5; j++)
   if (*(pscore + 5 * i + j) < 60)
    label++;
  if (label >= 2) //只能在label>=2中输出每个人的成绩和平均分;
    {
   printf("%d", num[i]);
   for (k = 0; k < 5; k++)
    printf("%11.2f", *(pscore + 5 * i + k)); //输出

这个人的课程成绩;
   printf("%11.2f", aver[i]); //因为平均成绩已经算好,保存

在aver[i]当中;所以声明也适用aver[4];
  }
 }
}
void good(char course[5][10], int num[4], float *pscore, float aver[4]) {
 int i, j, k, n;
 printf("================Students whose score is good========/n");
 printf("NO.");
 for (i = 0; i < 5; i++)
  printf("%11s", course[i]);
 printf("average\n");
 for (i = 0; i < 4; i++) {
  n = 0; //对每个人的成绩大于85计数;初值给0;
  for (j = 0; j < 5; j++)
   if (*(pscore + 5 * i + j) > 85)
    n++;
  if ((n == 5) || (aver[i] > 90)) //注意此处,aver[i]>90需要加括号

;(aver[i]>90)找出每门课程成绩>85或者平均分大于90的学生;
    {
   printf("%d", num[i]);
   for (k = 0; k < 5; k++)
    printf("%11.2f", *(pscore + 5 * i + k));
   printf("%11.2f\n", aver[i]); //此处不能与上一句加{}括号

,否则错误;
  }
 }
}

第八题:
#include
#include
int main()
{
void sort(char (*p)[81]);
char a[5][81]={"qwert","asdfg","zxcvb","yhnju","ikmlo"};
int i;
printf("5个等长的字符串如下:\n");
for(i=0;i<5;i++)
printf("%s\n",a+i);
printf("从大到下排序后输出:\n");
sort(a);
return 0;
}
void sort(char (*p)[81])
{
int i,j;
char b[81];
for(i=0;i<4;i++)
{
for(j=0;j<5-i;j++)
{
if(strcmp(*(p+j),*(p+j+1))>0)
{
strcpy(b,*(p+j));
strcpy(*(p+j),*(p+j+1));
strcpy(*(p+j+1),b);
}
}
}
for(i=0;i<5;i++)
printf("%s\n",p+i);
}

第九题:
用指针数组处理上一题目,字符串长不等。
#include
#include
char strcm(char s[10][100]){
 char a[100];
    int i,j;
    for(i=0;i<9;i++)
    for(j=i+1;j<10;j++)
    if(strcmp(s[i],s[j])>0){
     strcpy(a,s[i]);
        strcpy(s[i],s[j]);
        strcpy(s[j],a);}
 return(s[10][100]);
}
main()
{char s[10][100];
 int i;
 for(i=0;i<10;i++)
 scanf("%s",&s[i]);
 strcm(s);
 for(i=0;i<10;i++)
 printf("%s\n",s[i]);
}

你可能感兴趣的:(c语言)