程序设计只能靠自己上机实践、一题题的消化,没有其它方法可以取代。行动吧!做一个能学习计算机的人。
本文所指的书《C程序设计》,谭浩强,第四版、《数据结构》耿国华。
OJ网址http://218.5.241.13:8060/oj,内有分基础题basic区http://218.5.241.13:8060/oj/base/index.jsp
和普通区http://218.5.241.13:8060/oj/index.jsp,s开头是basic区,smu开头的是普通区。
一、 线性表主要的基础数据结构是:数组、函数、指针、自定义结构
一维数组:
★例S1214、求n个学生的平均年龄。
.int a[100];// 用a[0]、a[1]、……、a[99]表示100个学生的年龄,
.int sum, average;//年龄总和,平均年龄
//求和
.sum = 0;
.for(i=0;i<n;i++)
.sum = sum+a[i];
★完成S1062、S1137。
二维数组:
.int A[2][3];//表示下表中的6个变量.
A[0][0] | A[0][1] | A[0][2] |
A[1][0] | A[1][1] | A[1][2] |
★例、s1065矩阵和
.int a[10][20],b[10][20];//分别表示要加的两个矩阵.
//对两个p*q的矩阵,输出它们的和
for(i=0;i<p;i++)
{
for(j=0;j<q;j++)
printf("%d ",a[i][j]+b[i][j]);
printf("\n");
}
★选练:S1042、S1066、S1074
函数:P176
函数的操作:声明、定义、引用
★S1110 求方差。
#include<stdio.h>
double Avage(double a[100],int n)//求数组中n个数的平均数
{
double avage = 0;
int i;
for (i=0;i<n;i++)
avage += a[i];
avage /=n;
return avage;
}
double ss(double tt,double b[100],int n)//求方差,tt是平均数
{
int i;
double sum=0;
for(i=0;i<n;i++)
sum+=(tt-b[i])*(tt-b[i]);
sum/=n;
return sum;
}
void main()
{
int t,n,i,j;
double data[100],ttt,s;
while(scanf("%d",&t)!=EOF)
{
for(i=0;i<t;i++)
{
scanf("%d",&n);
for(j=0;j<n;j++)
{
scanf("%lf",&data[j]);
}
ttt=Avage(data,n);//调用函数求平均数,
s=ss(ttt,data,n);//调用函数求方差
printf("s^2=%.2lf\n",s);
}
}
}
★ 每个问题都可以独立成函数,再加以调用。大家可以任选几道(至少3道)加以训练。
指针:(这部分的内容较为抽象,要多练、多思考、动真的用指针写代码)
指针是变量的地址
★ 例、比较a、b两数的大小,看P225。复制下列代码到VC,并观察。
#include <stdio.h>
int main(){
int *p1,*p2,*p,a,b;
scanf("%d%d",&a,&b);
p1 = &a;
p2 = &b;
if(a<b){
p = p1; p1 = p2; p2 = p;
}
printf("max=%d, min=%d\n",*p1,*p2);
return 0;
}
★ 用指针完成S1004、S1010
指针作为函数的参数,P226
给你下列函数,重新完成S1004、S1010
void swap(int *p1, int *p2){
int temp;
temp = *p1;
*p1 = *p2;
*p2 = temp;
}
错:
void swap(int *p1, int *p2){
int *p;
p = p1;
p1 = p2;
p2 = p;
}
//这不可用,因为函数是单向传递,交换后传不出来
指针引用数组元素,P233~235
★例S1214、求n个学生的平均年龄。
.int a[100],*P;// 用a[0]、a[1]、……、a[99]表示100个学生的年龄,
.int sum, average;//年龄总和,平均年龄
//求和
.p = a;//
.sum = 0;
.for(p=a;p<(a+n);p++)
.sum = sum+*p;
★S1062,用指针方法排序.P244.
指向函数的指针P267
★用指针访问函数的方法重做上题,S1190
指针的动态内存分配,P287例8.30
例如生成一个int类型的指针变量
.int *p;
.p = (int *)malloc(sizeof(int));
要加头文件stdlib.h或malloc.h
★求n个学生的平均年龄,只能用指针。
n个学生的成绩变量用p = (int *)malloc(n*sizeof(int));定义.
自定义的结构(此内容是学线性表的关键):
主要操作:定义结构、声明结构变量、使用。
把整体作为一个数据,就是自定义的结构
如平面上的点(x,y),定义为
.struct point{
.int x,y;
};
.struct point p1,*p2;//定义两个点,p2是指针变量
.p1.x = 3 ;//对点p1中的x赋值
.p2->x = 3 ;// 对点p2中的x赋值
★s1105、s1106、S1136、自选题。
二、 线性表
结构定义:含有数据元素和表长的自定义结构。
线性表的主要操作有:建表、求表长、输出、查询、插入、删除、合并等。
学法:先学会定义线性表所使用的结构,然后去实现一个个操作。
★S1178、S1179、S1180、S1181、S1182、S1194、S1205、S1206、S1207、S1208、S1209……
三、 链表
结构定义:含有数据元素和表长的自定义结构。
链表的主要操作有:建表、输出、查询、插入、删除、合并等。
★可用上面的习题练,双链表用s1213
学法:先学会定义链表所使用的结构,然后去实现一个个操作。
四、 考试样例
考试要求:本次考试内容为课本的1~3章;考试成绩占整个学期的30%;考试在OJ平台上开卷进行(只能带纸质材料);考试时用户账号与IP地址绑定(即一机只能有一号,一号只能在一机上使用);考试时间约3个小时左右;考试的题量是4~5题(算法、顺序表、线性表、应用等);出题的方式见10网工1班的期末考(在OJ的contest处
http://218.5.241.13:8060/oj/contest/showContest.jsp?id=64);不出与OJ完全一致的题(会改造);考试的卷面(代码格式)占5分;只对AC的题目给分;题型如下:
1、(算法题)设计一算法求a、b最大公约数(a、b<1000000000),要求算法时间复杂度小于O(n)。参考Smu1001。
2、(算法题)设计一算法找出1~n(n<10000000000)所有素数,要求算法时间复杂度小于O(n^2)。
3、(算法题)求整数1—n(n<1000000000) 的所有偶数的和,要求算法的时间复杂度O(1) 。
4、顺序表(见OJ上的习题)。
5、链表(见OJ上的习题)。
6、线性表应用,如多项式的合并、括号的匹配。Smu1058、Smu1098
7、线性表与算法的综合应用,如《数据结构》P65例1。
附代码风格:
}要单独一行;
{后不跟代码;
{}中的句首与}对齐;
赋值语句的=两边都要有一空格;
一行有多句,句间要有空格;
要有缩进,缩进的长度以Tab键产生为准;建议把代码全部选中,用Alt+F8自动调整。
每个函数块下或一个大的内容块下要加一行空行。