1、结构体内的变量和指针
结构体内是变量
struct School
{
char s_name[20];
int s_age;
};
void Init_School(struct School *sx)
{
char name[20] = "ligong";
strcpy_s(sx->s_name, 20, name);
sx->s_age = 90;
}
void Print_School(struct School *sx)
{
printf("name:%s\n", sx->s_name);
printf("age:%d\n", sx->s_age);
}
int main()
{
struct School sx;
Init_School(&sx);
Print_School(&sx);
return 0;
}
结构体内是指针
char name[20] = { "ligong" };
struct School
{
char *s_name;
int s_age;
};
void Init_School(struct School *sp)
{
//static char name[20] = { "tulun" };//静态关键字static,使得变量name的生存期延长,
sp->s_name = name;
sp->s_age = 90;
}
void Print_School(struct School* sp)
{
printf("name:%s\n", sp->s_name);
printf("age:%d\n", sp->s_age);
}
int main()
{
struct School sx;
Init_School(&sx);
Print_School(&sx);
return 0;
}
2、学生结构体
1.编写函数打印学生信息
2.计算全班同学的总成绩、平均成绩和140分以下的人数。
3.按成绩升序排序,成绩相同按年龄降序排序。
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<string.h>
struct Student
{
char s_name[20];
int age;
float score;
};
//打印学生信息
void Print_Cla(struct Student* cla, int n)
{
for (int i = 0; i < n; ++i)
{
printf("第%d个学生:\n", i+1);
printf("姓名:%s \n", cla[i].s_name);
printf("年龄:%d \n", cla[i].age);
printf("成绩:%3.1f \n", cla[i].score);
}
}
//计算总成绩
float Sum(const struct Student* cla, int n)
{
float sum = 0.0;
for (int i = 0; i < n; ++i)
{
sum += cla[i].score;
}
return sum;
}
//计算平均成绩
float Aver(float sum, int n)
{
float aver = 0.0;
aver = sum / n;
return aver;
}
//计算140分以下的人数
int Np(const struct Student* cla, int n)
{
int np = 0;
for (int i = 0; i < n; ++i)
{
if (cla[i].score < 140.0)
{
np += 1;
}
}
return np;
}
//按成绩升序排序,成绩相同按年龄降序排序。
void Swap(struct Student* cla,int i,int j)
{
struct Student tmp;
tmp = cla[i];
cla[i] = cla[j];
cla[j] = tmp;
}
void Sort(struct Student* cla, int n)
{
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < n - i - 1; ++j)
{
if (cla[j].score > cla[j + 1].score)
{
Swap(cla, j, j + 1);
}
}
}
for (int i = 0; i < n - 1; ++i)
{
if (cla[i].score == cla[i + 1].score)
{
if (cla[i].age < cla[i + 1].age)
{
Swap(cla, i, i + 1);
}
}
}
}
int main()
{
struct Student cla[] =
{
{"Tu lun", 18, 145.5 },
{"Cheng Lei", 20, 130.5 },
{"Wang ling", 19, 140.0 },
{"Zhang ping",17, 134.5 },
{"Yang yang", 19, 135.0 },
{"Hu Ming", 18, 140.0 },
};
int num = 0;
float sum = 0.0;
float aver = 0.0;
int np = 0;
num = sizeof(cla) / sizeof(cla[0]);
printf("一共%d个学生。\n", num);
Print_Cla(cla, num);
printf("\n");//分隔
sum = Sum(cla, num);
printf("总成绩为:%5.1f\n", sum);
printf("\n");//分隔
aver = Aver(sum, num);
printf("平均成绩为:%f\n", aver);
printf("\n");//分隔
np = Np(cla, num);
printf("140分以下的人数为:%d\n", np);
printf("\n");//分隔
Sort(cla, num);
printf("排序后;\n");
Print_Cla(cla, num);
return 0;
}
3、两数之和
给定一个有序数组,其中任意两个数相加的和各不相同。
给定一个数,进入数组查找是否有两个数之和等于目标数据。
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
struct Coord
{
int fir;
int sec;
};
int Subscript_Top(int* ar, int n, int num)
{
int m = 0;
if (ar[n] < num)
{
m = n - 1;
}
else
{
for (int i = 0; i < n; ++i)
{
if (ar[i] < num && num < ar[i + 1])
{
m = i;
}
}
}
return m;
}
void Seek(int* ar, int t, int num, struct Coord *c)
{
int l = 0;
int r = t;
c->fir = -1;
c->sec = -1;
while (l < r)
{
if (ar[l] + ar[r] == num)
{
c->fir = l;
c->sec = r;
break;
}
else if (ar[l] + ar[r] < num)
{
if (ar[l + 1] + ar[r] <= num)
{
l += 1;
}
else
{
r -= 1;
}
}
else
{
r -= 1;
}
}
}
void Print(struct Coord* c,int num)
{
if (-1 == (c->fir))
{
printf("%d not find!\n", num);
}
else
{
printf("ar[%d]+ar[%d]=%d\n", c->fir, c->sec, num);
}
}
int main()
{
const int n = 10;
int ar[n] = { 1,2,4,8,16,32,64,128,256,512 };
int num = 0;
struct Coord c = { 0,0 };
int t = 0;
int d = 0;
num = 1;
t = Subscript_Top(ar, n, num);
Seek(ar, t, num, &c);
Print(&c, num);
num = 3;
t = Subscript_Top(ar, n, num);
Seek(ar, t, num, &c);
Print(&c, num);
num = 79;
t = Subscript_Top(ar, n, num);
Seek(ar, t, num, &c);
Print(&c, num);
num = 80;
t = Subscript_Top(ar, n, num);
Seek(ar, t, num, &c);
Print(&c, num);
num = 768;
t = Subscript_Top(ar, n, num);
Seek(ar, t, num, &c);
Print(&c, num);
num = 900;
t = Subscript_Top(ar, n, num);
Seek(ar, t, num, &c);
Print(&c, num);
return 0;
}