结构体
1、结构体的定义
只是规定了数据类型的模型,不会分配存储空间。
例如
struct date//date是自定义结构标记,与struct一起构成类型名
{
int year;
int month;
int day;
};//必须有分号
struct student
{
char num[9];
char name[21];
char sex;
int age;
float score;
char address;
struct date birthday;
};//必须有分号
2、结构体变量的定义
三种方法
//方法一
struct student
{
};
struct student stu1,stu2;
//方法二
struct student
{
}stu1,stu2;
//方法三
struct
{
}sty1,stu2;
每个结构体变量在内存中所占的字节数为其所包含的所有成员的字节数之和。
3、结构体变量的初始化及引用
允许部分初始化
main()
{
struct student stu1={"04121022","li si",'m',18,92,1996,9,1};//初始化
struct student stu2={"04121023","wang wu"};
stu1.age=18;//赋值
strcpy(stu1.name,"li si");
}
输入时,可用gets函数,例如:
gets(stu1.name);
不允许对结构体整体进行此类操作。
1.P1059 [NOIP2006 普及组] 明明的随机数
根据题目要求,需要对输入的数据进行排序和去重,先用冒泡排序法对数据进行排序,再利用a[i]!=a[i-1]进行去重。
#include <stdio.h>
int main(void)
{
int n,i,j=0,t,a[100];
scanf("%d",&n);
for(i=0;i<n;i++)//生成n个随机数
{
scanf("%d",&a[i]);
}
for(i=0;i<n;i++)//进行冒泡排序
{
for(j=0;j<n-i-1;j++)
{
if(a[j]>a[j+1])
{
t=a[j+1];
a[j+1]=a[j];
a[j]=t;
}
}
}
printf("%d ",a[0]);
for(i=1;i<n;i++)//去重
{
if(a[i]!=a[i-1])
{
printf("%d ",a[i]);
}
}
return 0;
}
2.P2670 [NOIP2015 普及组] 扫雷游戏
定义二维数组,输入雷区排布情况,遍历数组元素,若为雷,给数组b的八个方向分别加一,注意需要保证不能越界。
#include <stdio.h>
int main(void)
{
int n,m,i,j;
scanf("%d %d",&n,&m);//输入行、列
char a[100][100];
int b[100][100]={0};//赋初值
for(i=0;i<n;i++)//输入雷区排布情况
{
scanf("%s",a[i]);
}
for(i=0;i<n;i++)//计数,给数组b赋值
{
for(j=0;j<m;j++)
{
if(a[i][j]=='*')
{
if(i-1>=0)
b[i-1][j]++;
if(i+1<n)
b[i+1][j]++;
if(j-1>=0)
b[i][j-1]++;
if(j+1<m)
b[i][j+1]++;
if(i-1>=0&&j-1>=0)
b[i-1][j-1]++;
if(i-1>=0&&j+1<m)
b[i-1][j+1]++;
if(i+1<n&&j-1>=0)
b[i+1][j-1]++;
if(i+1<n&&j-1>=0)
b[i+1][j+1]++;
}//给相邻八个格子加一
}
}
for(i=0;i<n;i++)//输出
{
for(j=0;j<m;j++)
{
if(a[i][j]=='*')
printf("*");
else
printf("%d",b[i][j]);
}
printf("\n");
}
return 0;
}
3.P2676 [USACO07DEC]Bookshelf B
根据题意,要最少的奶牛使之超过书架的高度,先进行降序排序,再对数组中的元素从第一个开始加,直到超过书架的高度。
#include <stdio.h>
int main(void)
{
int n,i,j,t,b,s=0,k=0;
scanf("%d %d",&n,&b);
int a[n];
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<n;i++)//先排好序,降序
{
for(j=0;j<n-i-1;j++)
{
if(a[j]<a[j+1])
{
t=a[j+1];
a[j+1]=a[j];
a[j]=t;
}
}
}
while(s<b)//循环,当奶牛的总高大与书架的高度循环停止
{
s=s+a[k];
k++;
}
printf("%d",k);
return 0;
}
4.P1116 车厢重组
本质上是冒泡排序法,只需在排序的时候计数,输出排列的次数即可。
#include <stdio.h>
int main(void)
{
int n,i,j,t,count=0;
scanf("%d",&n);
int a[n];
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<n;i++)//冒泡
{
for(j=0;j<n-i-1;j++)
{
if(a[j]>a[j+1])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
count++;//计数
}
}
}
printf("%d",count);
return 0;
}
5.P1085 [NOIP2004 普及组] 不高兴的津津
将每天的学习时间加起来,如果大于8,放入c数组,再进行比较,输出最不高兴的那一天。如果没有大于8的,输出0。
#include <stdio.h>
int main(void)
{
int a[7][2],i,j,b[7],c[7],k=0,max,day;
for(i=0;i<7;i++)//输入
{
for(j=0;j<2;j++)
{
scanf("%d",&a[i][j]);
}
}
for(i=0;i<7;i++)//向c数组中添加不高兴的元素
{
b[i]=a[i][0]+a[i][1];
if(b[i]>=8)
{
c[i]=b[i];
k++;
}
}
if(k==0)
printf("0");
else
{
max=c[0];
for(i=0;i<k;i++)
{
if(c[i]>max)//找出最不高兴的那一天
{
max=c[i];
day=i;
}
}
printf("%d",day+1);//记得要加1,数组下标从零开始
}
return 0;
}
6.P1046 [NOIP2005 普及组] 陶陶摘苹果
若陶陶的身高加上凳子的高大于苹果的高度,方可摘到苹果。
#include <stdio.h>
int main(void)
{
int a[10];
int i,h,x=0;
for(i=0;i<10;i++)
{
scanf("%d",&a[i]);
}
scanf("%d",&h);
for(i=0;i<10;i++)
{
if(a[i]<=h+30)
x++;
}
printf("%d",x);
return 0;
}
7.P1152 欢乐的跳
定义三个数组,计算相邻数组a两个元素之差的绝对值赋给数组b,去重后为数组c,判断c中是否有不在n到n-1的元素。
#include <stdio.h>
#include <math.h>
#include <string.h>
int main(void)
{
int a[1000],b[1000],c[1000];
int n,i,j,k=0,flag=1,t,l;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i+1<n;i++)
{
b[k]=abs(a[i]-a[i+1]);
k++;
}
for(i=0;i<n-1;i++)//排序
{
for(j=0;j<n-i-2;j++)
{
if(b[j]>b[j+1])
{
t=b[j+1];
b[j+1]=b[j];
b[j]=t;
}
}
}
for(i=0;i<n-1;i++)//去重
{
if(b[i+1]!=b[i])
{
c[k]=b[i];
k++;
}
}
l=strlen(c);
for(i=0;i<l;i++)
{
if(c[i]<1||c[i]>n-1)
{
printf("Not jolly");
flag=0;
}
}
if(flag==1)
printf("Jolly");
return 0;
}
8.P1089 [NOIP2004 提高组] 津津的储蓄计划
分类,没钱花与有钱花,money>0有钱花,看是否可以存钱
#include <stdio.h>
int main(void)
{
int i,cost,money=0,recharge=0;
for(i=1;i<=12;i++)
{
scanf("%d",&cost);
money=money+300-cost;
if(money<0)//没钱了
{
printf("-%d",i);
return 0;
}
else
recharge=recharge+money/100;
money=money%100;
}
printf("%d",120*recharge+money);
return 0;
}
9.P1428 小鱼比可爱
考察快速排序,若元素前面的元素小于该元素,则b[i]++,最后输出数组b。
#include<stdio.h>
int main(void)
{
int n,i,j;
scanf("%d",&n);
int a[n],b[100]={0};
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<n;i++)
{
for(j=0;j<i;j++)
{
if(a[j]<a[i])
{
b[i]++;
}
}
}
for(i=0;i<n;i++)
{
printf("%d ",b[i]);
}
return 0;
}
10.P4325 [COCI2006-2007#1] Modulo
#include <stdio.h>
int main(void)
{
int a[10],b[10];
int i,j,t,k=0;
for(i=0;i<10;i++)
{
scanf("%d",&a[i]);
b[i]=a[i]%42;
}
for(i=0;i<10;i++)
{
for(j=0;j<9-i;j++)
{
if(b[j]>b[j+1])
{
t=b[j];
b[j]=b[j+1];
b[j+1]=t;
}
}
}
for(i=1;i<10;i++)
{
if(b[i]!=b[i-1])
k++;
}
printf("%d",k+1);
return 0;
}