最近要期中考了,感觉自己指针没掌握多好,就先把指针部分写了,顺便复习并且加强一下一些易错点的印象。
中国大学mooc高级语言程序设计地址:https://www.icourse163.org/course/JLU-62001
第七讲:数组进阶 & 指针初步–编程题
1统计指定单词出现的次数(10分)
题目内容:输入6个单词,查找第6个单词在前5个单词中出现的次数。
输入:6个单词
输出:一个整数(第6个单词在前5个单词中出现的次数)
样例:输入:Mary Olivia Donald Olivia Linda Olivia 输出:2
#include<stdio.h>
#include<string.h>
int main(){
int i,t,r=0;
char a[100],*p,*ini,*q;
gets(a);
p=a+strlen(a)-1;//strlen函数记录的是字符串长度,而p指向位置从a[0]开始。所以这里要-1让p指向最后一个字符
ini=p;//记录条件单词位置
while(*(p--)!=' ');//消去条件单词
q=p;//记录文本位置
for(i=0;i<=4;i++){
p=ini;//初始化
t=0;//初始化
while(*p!=' ')
{
if(*(q--)!=*(p--))
{
t=1;
break;
}
}//一旦有字母不相同就给标识符命1
if(t==0)r++;//相同就给计数器加1
while(*(q--)!=' ');//保证下次检测从字符开始
}
printf("%d",r);
return 0;
}
2求矩阵所有元素平均值(10分)
题目内容:编写程序,用指针形式访问整型数组元素,计算并输出该矩阵所有元素的算数平均值(计算结果保留2位小数)。
输入:输入矩阵的行数和列数(假定行数和列数均大于0,小于等于4),以及所有元素值。
输出:输出矩阵所有元素的算数平均值及矩阵所有元素(相邻2个数据之间空一个空格)。
样例:
输入:1 1 9(1,1为行数和列数,9为矩阵元素)
输出:9.00 9(平均值为9.00,9为矩阵元素)
#include<stdio.h>
int main(){
int a[16]={0};//对矩阵数组初始化
int x,y,*p,i;
float sum=0.00;//注意平均值是浮点型
scanf("%d%d",&x,&y);//输入行与列
for(i=0;i<x*y;i++)//从左到右,从上到下嵌入元素
scanf("%d",&a[i]);
p=a;//让p指向a首地址
for(i=0;i<x*y;i++) {
sum+=*p;
p++;
}
sum=sum/x/y;
printf("%.2f ",sum);
p=a;//初始化
for(i=0;i<x*y-1;i++)//同理上面for循环
{
printf("%d ",*p);
p++;
}
printf("%d",*p);//最后一位数后面不需要空格,单独列出输出
return 0;
}
3统计一行文本的单词个数(10分)
题目内容:编写程序统计一行字符中单词的个数。所谓“单词”是指连续不含空格的字符串,各单词之间用空格分隔,空格数可以是多个。
输入:输入一行字符。(假定字符串长度最大不超过99)
输出:输出单词个数。
样例:输入:C Traps and Pitfalls 输出:4
#include<stdio.h>
#include<string.h>
int main(){
int i,t;
char *p,a[100];
gets(a);
p=a;//让p指向a首地址
while(*p!='\0')//大前提条件,\0为整条字符串结束标识
{
while(*p==' ')//小前提条件,一个空代表一个单词检查完毕
{
if(*(p-1)!=' ')t++;//必须空格前字符不是空格才给计数器加1,这里是为了防止有多个空格的情况
p++;
}
p++;
}
printf("%d",t+1);//最后一个单词由于结尾是\0没有计入,所以单词数量应是t+1
return 0;
}
第八讲:指针应用 & 结构体–编程题
1字符串长度(10分)
问题描述:编写程序求任意给定字符串长度。
输入:从键盘随机输入一个字符串。
输出:字符串的长度。
提示:string.h文件中的gets函数可以读入中间带有空格的字符串。
样例: 输入234 输出3
#include<stdio.h>
#include<string.h>
int main(){
char x[50];
gets(x);
printf("%d",strlen(x));
return 0;
}
用string.h里的strlen函数可以直接偷懒,当然用指针再命条件也是可以的。(注意字符数组结尾是\0)
char *p=x;
int t=0;
while(*(p++)!='\0')t++;
printf("%d",t);
2交换两个字符串值(10分)
问题描述:编写程序,利用指针传递参数,实现两个字符串值的交换。
输入:从键盘随机输入两个字符串值,第一行是第一个字符串值,第二行是第二个字符串值。
输出:交换后两个字符串的值。
样例:输入 1234567
abcdefghijk
输出abcdefghijk
1234567
#include<stdio.h>
void swap(char **p,char **q){
char *t=*p;
*p=*q;
*q=t;
}//通过对二维指针地址交换间接引用主函数里p和q来达到交换字符串目的
int main(){
char a[50],b[50];
gets(a);
gets(b);
char *p=a,*q=b;
swap(&p,&q);//把指针p和q的地址传入函数
puts(p);
puts(q);
}
如果有对函数传入和二维指针两个概念不熟悉的朋友,可以参看以下网址。(csdn自己里面也挺多这种解析的,百度一下你就知道)
C语言函数参数的传递详解 http://c.biancheng.net/cpp/html/494.html
C语言二级指针(指向指针的指针)详解 http://c.biancheng.net/view/2016.html