第一题:
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]);
}