<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Genelbilge.com &#124; nedir, tanımı, anlamı,nasıl yapılır &#187; Programlama</title>
	<atom:link href="http://www.genelbilge.com/category/blgsyr/programlama/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.genelbilge.com</link>
	<description></description>
	<lastBuildDate>Wed, 08 Sep 2010 20:45:59 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Developing a Simple Example</title>
		<link>http://www.genelbilge.com/developing-a-simple-example.html/</link>
		<comments>http://www.genelbilge.com/developing-a-simple-example.html/#comments</comments>
		<pubDate>Tue, 31 Aug 2010 16:56:25 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Programlama]]></category>
		<category><![CDATA[Application Internet]]></category>
		<category><![CDATA[Chat Client]]></category>
		<category><![CDATA[Chat People]]></category>
		<category><![CDATA[Chat Program]]></category>
		<category><![CDATA[Chat Room]]></category>
		<category><![CDATA[Chat Systems]]></category>
		<category><![CDATA[Gentle Introduction]]></category>
		<category><![CDATA[Import Java]]></category>
		<category><![CDATA[Inputstreamreader]]></category>
		<category><![CDATA[Internet Chat]]></category>
		<category><![CDATA[Java Util]]></category>
		<category><![CDATA[Message Oriented Middleware]]></category>
		<category><![CDATA[O Reilly]]></category>
		<category><![CDATA[Participant]]></category>
		<category><![CDATA[Preface]]></category>
		<category><![CDATA[Quality Service]]></category>
		<category><![CDATA[Simple Chat]]></category>
		<category><![CDATA[Source Code]]></category>
		<category><![CDATA[Virtual Chat Rooms]]></category>
		<category><![CDATA[Web Based Chat]]></category>

	<!-- AutoMeta Start -->
	<category></category>
	<!-- AutoMeta End -->
	
		<guid isPermaLink="false">http://www.genelbilge.com/?p=15017</guid>
		<description><![CDATA[In this chapter: The Chat Application Now that you understand Message-Oriented Middleware and some JMS concepts, you are ready to write your first JMS application. This chapter provides a gentle introduction to JMS using the publish-and-subscribe messaging model. You will get your feet wet with JMS and learn some of the basic classes and interfaces. [...]]]></description>
			<content:encoded><![CDATA[<p><script type="text/javascript"><!--
google_ad_client = "pub-7007661218174820";
/* 336x280, oluşturulma 27.06.2010 */
google_ad_slot = "2581656522";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></p><p>In this chapter:<br />
The Chat Application<br />
Now that you understand Message-Oriented Middleware and some JMS concepts, you are ready to write your first JMS application. This chapter provides a gentle introduction to JMS using the publish-and-subscribe messaging model. You will get your feet wet with JMS and learn some of the basic classes and interfaces. Chapter 4, Publish-and-Subscribe Messaging, covers publish-and-subscribe in detail, and Chapter 5, Point-to-Point Messaging, covers the point-to-point message model.<br />
As with all examples in this book, example code and instructions specific to several vendors is provided in the book download at O&#8217;Reilly&#8217;s web site (see the Preface for details). You will need to install and configure your JMS provider according to the instructions provided by your vendor.<br />
The Chat Application<br />
Internet chat provides an interesting application for learning about the JMS pub/sub messaging model. Used mostly for entertainment, web-based chat applications can be found on thousands of web sites. In a chat application, people join virtual chat rooms where they can &#8220;chat&#8221; with a group of other people. <span id="more-15017"></span><br />
To illustrate how JMS works, we will use the JMS pub/sub API to build a simple chat application. The requirements of Internet chat map neatly onto the publish-and-subscribe messaging model. In this model, a producer can send a message to many consumers by delivering the message to a single topic. A message producer is also called a publisher and a message consumer is also called a subscriber. In reality, using JMS for a chat application would be overkill, since chat systems don&#8217;t require enterprise quality service.<br />
The following source code is a JMS-based chat client. Every participant in a chat session uses this Chat program to join a specific chat room (topic), and deliver and receive messages to and from that room:<br />
package chap2.chat;</p>
<p>import javax.jms.*;<br />
import javax.naming.*;<br />
import java.io.*;<br />
import java.io.InputStreamReader;<br />
import java.util.Properties;</p>
<p>public class Chat implements javax.jms.MessageListener{<br />
    private TopicSession pubSession;<br />
    private TopicSession subSession;<br />
    private TopicPublisher publisher;<br />
    private TopicConnection connection;<br />
    private String username;</p>
<p>    /* Constructor. Establish JMS publisher and subscriber */<br />
    public Chat(String topicName, String username, String password)<br />
    throws Exception {<br />
        // Obtain a JNDI connection<br />
        Properties env = new Properties( );<br />
        // &#8230; specify the JNDI properties specific to the vendor</p>
<p>        InitialContext jndi = new InitialContext(env);</p>
<p>        // Look up a JMS connection factory<br />
        TopicConnectionFactory conFactory =<br />
        (TopicConnectionFactory)jndi.lookup(&#8220;TopicConnectionFactory&#8221;);</p>
<p>        // Create a JMS connection<br />
        TopicConnection connection =<br />
        conFactory.createTopicConnection(username,password);</p>
<p>        // Create two JMS session objects<br />
        TopicSession pubSession =<br />
        connection.createTopicSession(false,<br />
                                      Session.AUTO_ACKNOWLEDGE);<br />
        TopicSession subSession =<br />
        connection.createTopicSession(false,<br />
                                      Session.AUTO_ACKNOWLEDGE);</p>
<p>        // Look up a JMS topic<br />
        Topic chatTopic = (Topic)jndi.lookup(topicName);</p>
<p>        // Create a JMS publisher and subscriber<br />
        TopicPublisher publisher =<br />
            pubSession.createPublisher(chatTopic);<br />
        TopicSubscriber subscriber =<br />
            subSession.createSubscriber(chatTopic);</p>
<p>        // Set a JMS message listener<br />
        subscriber.setMessageListener(this);</p>
<p>        // Intialize the Chat application<br />
        set(connection, pubSession, subSession, publisher, username);</p>
<p>        // Start the JMS connection; allows messages to be delivered<br />
        connection.start( );</p>
<p>    }<br />
    /* Initialize the instance variables */<br />
    public void set(TopicConnection con, TopicSession pubSess,<br />
                    TopicSession subSess, TopicPublisher pub,<br />
                    String username) {<br />
        this.connection = con;<br />
        this.pubSession = pubSess;<br />
        this.subSession = subSess;<br />
        this.publisher = pub;<br />
        this.username = username;<br />
    }<br />
    /* Receive message from topic subscriber */<br />
    public void onMessage(Message message) {<br />
        try {<br />
            TextMessage textMessage = (TextMessage) message;<br />
            String text = textMessage.getText( );<br />
            System.out.println(text);<br />
        } catch (JMSException jmse){ jmse.printStackTrace( ); }<br />
    }<br />
    /* Create and send message using topic publisher */<br />
    protected void writeMessage(String text) throws JMSException {<br />
        TextMessage message = pubSession.createTextMessage( );<br />
        message.setText(username+&#8221; : &#8220;+text);<br />
        publisher.publish(message);<br />
    }<br />
    /* Close the JMS connection */<br />
    public void close( ) throws JMSException {<br />
        connection.close( );<br />
    }<br />
    /* Run the Chat client */<br />
    public static void main(String [] args){<br />
        try{<br />
            if (args.length!=3)<br />
                System.out.println(&#8220;Topic or username missing&#8221;);</p>
<p>            // args[0]=topicName; args[1]=username; args[2]=password<br />
            Chat chat = new Chat(args[0],args[1],args[2]);
<p>            // Read from command line<br />
            BufferedReader commandLine = new<br />
              java.io.BufferedReader(new InputStreamReader(System.in));</p><p style="float: left;"><script type="text/javascript"><!--
google_ad_client = "pub-7007661218174820";
/* 336x280, oluşturulma 27.06.2010 */
google_ad_slot = "2581656522";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></p></p>
<p>            // Loop until the word &#8220;exit&#8221; is typed<br />
            while(true){<br />
                String s = commandLine.readLine( );<br />
                if (s.equalsIgnoreCase(&#8220;exit&#8221;)){<br />
                    chat.close( ); // close down connection<br />
                    System.exit(0);// exit program<br />
                } else<br />
                    chat.writeMessage(s);<br />
            }<br />
        } catch (Exception e){ e.printStackTrace( ); }<br />
    }<br />
}<br />
Getting Started with the Chat Example<br />
To put this client to use, compile it like any other Java program. Then start your JMS server, setting up whatever topics, usernames, and passwords you want. Configuration of a JMS server is vendor-dependent, and won&#8217;t be discussed here.<br />
The Chat class includes a main( ) method so that it can be run as a standalone Java application. It&#8217;s executed from the command line as follows:<br />
java chap2.chat.Chat topic username password<br />
The topic is the destination that we want to publish-and-subscribe to; username and password make up the authentication information for the client. Run at least two chat clients in separate command windows and try typing into one; you should see the text you type displayed by the other client.<br />
Before examining the source code in detail, a quick explanation will be helpful. The chat client creates a JMS publisher and subscriber for a specific topic. The topic represents the chat room. The JMS server registers all the JMS clients that want to publish or subscribe to a specific topic. When text is entered at the command line of one of the chat clients, it is published to the messaging server. The messaging server identifies the topic associated with the publisher and delivers the message to all the JMS clients that have subscribed to that topic. As Figure 2-1 illustrates, messages published by any one of the JMS clients are delivered to all the JMS subscribers for that topic.<br />
Figure 2-1. The Chat application </p>
<p>Examining the Source Code<br />
Running the Chat example in a couple of command windows demonstrates what the Chat application does. The rest of this chapter examines the source code for the Chat application so that you can see how the Chat application works.<br />
Bootstrapping the JMS client<br />
The main( ) method bootstraps the chat client and provides a command-line interface. Once an instance of the Chat class is created, the main( ) method spends the rest of its time reading text typed at the command line and passing it to the Chat instance using the instance&#8217;s writeMessage( ) method.<br />
The Chat instance connects to the topic and receives and delivers messages. The Chat instance starts its life in the constructor, which does all the work to connect to the topic and set up the TopicPublisher and TopicSubscribers for delivering and receiving messages.<br />
Obtaining a JNDI connection<br />
The chat client starts by obtaining a JNDI connection to the JMS messaging server. JNDI is an implementation-independent API for directory and naming systems. A directory service provides JMS clients with access to ConnectionFactory and Destinations (topics and queues) objects. ConnectionFactory and Destination objects are the only things in JMS that cannot be obtained using the JMS API&#8211;unlike connections, sessions, producers, consumers, and messages, which are manufactured using the JMS API. JNDI provides a convenient, location-transparent, configurable, and portable mechanism for obtaining ConnectionFactory and Destination objects, also called JMS administered objects because they are established and configured by a system administrator.<br />
Using JNDI, a JMS client can obtain access to a JMS provider by first looking up a ConnectionFactory. The ConnectionFactory is used to create JMS connections, which can then be used for sending and receiving messages. Destination objects, which represent virtual channels (topics and queues) in JMS, are also obtained via JNDI and are used by the JMS client. The directory service can be configured by the system administrator to provide JMS administered objects so that the JMS clients don&#8217;t need to use proprietary code to access a JMS provider.<br />
JMS servers will either work with a separate directory service (e.g., LDAP) or provide their own directory service that supports the JNDI API. For more details on JNDI, see the sidebar &#8220;Understanding JNDI.&#8221;<br />
The constructor of the Chat class starts by obtaining a connection to the JNDI naming service used by the JMS server:<br />
Understanding JNDI<br />
JNDI is a standard Java extension that provides a uniform API for accessing a variety of directory and naming services. In this respect, it is somewhat similar to JDBC. JDBC lets you write code that can access different relational databases such as Oracle, SQLServer, or Sybase; JNDI lets you write code that can access different directory and naming services, such as LDAP, Novell Netware NDS, CORBA Naming Service, and proprietary naming services provided by JMS servers.<br />
In JMS, JNDI is used mostly as a naming service to locate administered objects. Administered objects are JMS objects that are created and configured by the system administrator. Administered objects include JMS ConnectionFactory and Destination objects like topics and queues.<br />
Administered objects are bound to a name in a naming service. A naming service associates names with distributed objects, files, and devices so that they can be located on the network using simple names instead of cryptic network addresses. An example of a naming service is the DNS, which converts an Internet hostname like www.oreilly.com into a network address that browsers use to connect to web servers. There are many other naming services, such as COSNaming in CORBA and the Java RMI registry. Naming services allow printers, distributed objects, and JMS administered objects to be bound to names and organized in a hierarchy similar to a filesystem. A directory service is a more sophisticated kind of naming service.<br />
JNDI provides an abstraction that hides the specifics of the naming service, making client applications more portable. Using JNDI, JMS clients can browse a naming service and obtain references to administered objects without knowing the details of the naming service or how it is implemented. JMS servers are usually be used in combination with a standard JNDI driver (a.k.a. service provider) and directory service like LDAP, or provide a proprietary JNDI service provider and directory service.<br />
JNDI is both virtual and dynamic. It is virtual because it allows one naming service to be linked to another. Using JNDI, you can drill down through directories to files, printers, JMS administered objects, and other resources following virtual links between naming services. The user doesn&#8217;t know or care where the directories are actually located. As an administrator, you can create virtual directories that span a variety of different services over many different physical locations.<br />
JNDI is dynamic because it allows the JNDI drivers for specific types of naming and directory services to be loaded dynamically at runtime. A driver maps a specific kind of naming or directory service into the standard JNDI class interfaces. Drivers have been created for LDAP, Novell NetWare NDS, Sun Solaris NIS+, CORBA COSNaming, and many other types of naming and directory services, including proprietary ones. Dynamically loading JNDI drivers (service providers) makes it possible for a client to navigate across arbitrary directory services without knowing in advance what kinds of services it is likely to find.<br />
// Obtain a JNDI connection<br />
Properties env = new Properties( );<br />
// &#8230; specify the JNDI properties specific to the vendor</p>
<p>InitialContext jndi = new InitialContext(env);<br />
Creating a connection to a JNDI naming service requires that a javax.naming.InitialContext object be created. An InitialContext is the starting point for any JNDI lookup&#8211;it&#8217;s similar in concept to the root of a filesystem. The InitialContext provides a network connection to the directory service that acts as a root for accessing JMS administered objects. The properties used to create an InitialContext depend on which JMS directory service you are using. The code used to create a JNDI InitialContext in BEA&#8217;s Weblogic naming service, for example, would look something like this:<br />
Properties env = new Properties( );<br />
env.put(Context.SECURITY_PRINCIPAL, &#8220;guest&#8221;);<br />
env.put(Context.SECURITY_CREDENTIALS, &#8220;guest&#8221;);<br />
env.put(Context.INITIAL_CONTEXT_FACTORY,<br />
   &#8220;weblogic.jndi.WLInitialContextFactory&#8221;);<br />
env.put(Context.PROVIDER_URL, &#8220;t3://localhost:7001&#8243;);</p>
<p>InitialContext jndi = new InitialContext(env);<br />
When SonicMQ is used in combination with a third party LDAP directory service, the connection properties would be very different. For example, the following shows how a SonicMQ JMS client would use JNDI to access JMS administered objects stored in a LDAP directory server:<br />
Properties env = new Properties( );<br />
env.put(Context.SECURITY_PRINCIPAL, &#8220;guest&#8221;);<br />
env.put(Context.SECURITY_CREDENTIALS, &#8220;guest&#8221;);<br />
env.put(Context.INITIAL_CONTEXT_FACTORY,<br />
    &#8220;com.sun.jndi.ldap.LdapCtxFactory&#8221;);<br />
env.put(Context.PROVIDER_URL,<br />
     &#8220;ldap://localhost:389/o=acme.com&#8221;);</p>
<p>InitialContext jndi = new InitialContext(env);<br />
NOTE: Alternatively, the InitialContext( ) can be created without properties (no-arg constructor). In this case JNDI will read the vendor-specific JNDI properties from a special file in the classpath named jndi.properties. This eliminates provider-specific code in JMS clients, making them more portable.<br />
The TopicConnectionFactory<br />
Once a JNDI InitialContext object is instantiated, it can be used to look up the TopicConnectionFactory in the messaging server&#8217;s naming service:<br />
TopicConnectionFactory conFactory =<br />
(TopicConnectionFactory)jndi.lookup(&#8220;TopicConnectionFactory&#8221;);<br />
The javax.jms.TopicConnectionFactory is used to manufacture connections to a message server. A TopicConnectionFactory is a type of administered object, which means that its attributes and behavior are configured by the system administrator responsible for the messaging server. The TopicConnectionFactory is implemented differently by each vendor, so configuration options available to system administrators vary from product to product. A connection factory might, for example, be configured to manufacture connections that use a particular protocol, security scheme, clustering strategy, etc. A system administrator might choose to deploy several different TopicConnectionFactory objects, each configured with its own JNDI lookup name.<br />
The TopicConnectionFactory provides two overloaded versions of the createTopicConnection( ) method:<br />
package javax.jms;</p>
<p>public interface TopicConnectionFactory extends ConnectionFactory {<br />
   public TopicConnection createTopicConnection( )<br />
      throws JMSException, JMSSecurityException;<br />
   public TopicConnection createTopicConnection(String username,<br />
      String password) throws JMSException, JMSSecurityException;<br />
}<br />
These methods are used to create TopicConnection objects. The behavior of the no-arg method depends on the JMS provider. Some JMS providers will assume that the JMS client is connecting under anonymous security context, while other providers may assume that the credentials can be obtained from JNDI or the current thread.[1] The second method provides the client with a username-password authentication credential, which can be used to authenticate the connection. In our code, we choose to authenticate the connection explicitly with a username and password.<br />
The TopicConnection<br />
The TopicConnection is created by the TopicConnectionFactory :<br />
// Look up a JMS connection factory<br />
TopicConnectionFactory conFactory =<br />
(TopicConnectionFactory)jndi.lookup(&#8220;TopicConnectionFactory&#8221;);</p>
<p>// Create a JMS connection<br />
TopicConnection connection =<br />
conFactory.createTopicConnection(username, password);<br />
The TopicConnection represents a connection to the message server. Each TopicConnection that is created from a TopicConnectionFactory is a unique connection to the server.[2] A JMS client might choose to create multiple connections from the same connection factory, but this is rare as connections are relatively expensive (each connection requires a network socket, I/O streams, memory, etc.). Creating multiple Session objects (discussed later in this chapter) from the same connection is considered more efficient, because sessions share access to the same connection. The TopicConnection is an interface that extends javax.jms.Connection interface. It defines several general-purpose methods used by clients of the TopicConnection. Among these methods are the start( ), stop( ), and close( ) methods:<br />
// javax.jms.Connection the super interface<br />
public interface Connection {<br />
    public void start( ) throws JMSException;<br />
    public void stop( ) throws JMSException;<br />
    public void close( ) throws JMSException;<br />
    &#8230;<br />
}</p>
<p>// javax.jms.TopicConnection extends javax.jms.Connection<br />
public interface TopicConnection extends Connection {<br />
    public TopicSession createTopicSession(boolean transacted,<br />
                                           int acknowledgeMode)<br />
    throws JMSException;<br />
    &#8230;<br />
}<br />
The start( ), stop( ), and close( ) methods allow a client to manage the connection directly. The start( ) method turns the inbound flow of messages &#8220;on,&#8221; allowing messages to be received by the client. This method is used at the end of the constructor in Chat class:<br />
   &#8230;<br />
   // Intialize the Chat application<br />
   set(connection, pubSession, subSession, publisher, username);</p>
<p>   connection.start( );</p>
<p>}<br />
It is a good idea to start the connection after the subscribers have been set up, because the messages start to flow in from the topic as soon as start( ) is invoked.<br />
The stop( ) method blocks the flow of inbound messages until the start( ) method is invoked again. The close( ) method is used to close the TopicConnection to the message server. This should be done when a client is finished using the TopicConnection; closing the connection conserves resources on the client and server. In the Chat class, the main( ) method calls Chat.close( ) when &#8220;exit&#8221; is typed at the command line. The Chat.close( ) method in turn calls the TopicConnection.close( ) method:<br />
public void close( ) throws JMSException {<br />
   connection.close( );<br />
}<br />
Closing a TopicConnection closes all the objects associated with the connection including the TopicSession, TopicPublisher, and TopicSubscriber.<br />
The TopicSession<br />
After the TopicConnection is obtained, it&#8217;s used to create TopicSession objects:<br />
// Create a JMS connection<br />
TopicConnection connection =<br />
conFactory.createTopicConnection(username,password);</p>
<p>// Create two JMS session objects<br />
TopicSession pubSession =<br />
connection.createTopicSession(false,<br />
                              Session.AUTO_ACKNOWLEDGE);<br />
TopicSession subSession =<br />
connection.createTopicSession(false,<br />
                              Session.AUTO_ACKNOWLEDGE);<br />
A TopicSession object is a factory for creating Message, TopicPublisher, and TopicSubscriber objects. A client can create multiple TopicSession objects to provide more granular control over publishers, subscribers, and their associated transactions. In this case we create two TopicSession objects, pubSession and subSession. We need two objects because of threading restrictions in JMS, which are discussed in the &#8220;Sessions and Threading&#8221; section later in the chapter.<br />
The boolean parameter in the createTopicSession( ) method indicates whether the Session object will be transacted. A transacted Session automatically manages outgoing and incoming messages within a transaction. Transactions are important but not critical to our discussion at this time, so the parameter is set to false, which means the TopicSession will not be transacted. Transactions are discussed in more detail in Chapter 6, Guaranteed Messaging, Transactions, Acknowledgments, and Failures.<br />
The second parameter indicates the acknowledgment mode used by the JMS client. An acknowledgment is a notification to the message server that the client has received the message. In this case we chose AUTO_ACKNOWLEDGE, which means that the message is automatically acknowledged after it is received by the client.<br />
The TopicSession objects are used to create the TopicPublisher and TopicSubscriber. The TopicPublisher and TopicSubscriber objects are created with a Topic identifier and are dedicated to the TopicSession that created them; they operate under the control of a specific TopicSession:<br />
TopicPublisher publisher =<br />
    pubSession.createPublisher(chatTopic);<br />
TopicSubscriber subscriber =<br />
    subSession.createSubscriber(chatTopic);<br />
The TopicSession is also used to create the Message objects that are delivered to the topic. The pubSession is used to create Message objects in the writeMessage( ) method. When you type text at the command line, the main( ) method reads the text and passes it to the Chat instance by invoking writeMessage( ). The writeMessage( ) method (shown in the following example) uses the pubSession object to generate a TextMessage object that can be used to deliver the text to the topic:<br />
protected void writeMessage(String text) throws JMSException{<br />
   TextMessage message = pubSession.createTextMessage( );<br />
   message.setText(username+&#8221; : &#8220;+text);<br />
   publisher.publish(message);<br />
}<br />
Several Message types can be created by a TopicSession. The most commonly used type is the TextMessage.<br />
The Topic<br />
JNDI is used to locate a Topic object, which is an administered object like the TopicConnectionFactory :<br />
InitialContext jndi = new InitialContext(env);<br />
.<br />
.<br />
// Look up a JMS topic<br />
Topic chatTopic = (Topic)jndi.lookup(topicName);<br />
A Topic object is a handle or identifier for an actual topic, called a physical topic, on the messaging server. A physical topic is an electronic channel to which many clients can subscribe and publish. A topic is analogous to a news group or list server: when a message is sent to a news group or list server, it is delivered to all the subscribers. Similarly, when a JMS client delivers a Message object to a topic, all the clients subscribed to that topic receive the Message.<br />
The Topic object encapsulates a vendor-specific name for identifying a physical topic in the messaging server. The Topic object has one method, getName( ), which returns the name identifier for the physical topic it represents. The name encapsulated by a Topic object is vendor-specific and varies from product to product. For example, one vendor might use dot (&#8220;.&#8221;) separated topic names, like &#8220;oreilly.jms.chat&#8221;, while another vendor might use a completely different naming system, similar to LDAP naming, &#8220;o=oreilly,cn=chat&#8221;. Using topic names directly will result in client applications that are not portable across brands of JMS servers. The Topic object hides the topic name from the client, making the client more portable.<br />
As a convention, we&#8217;ll refer to a physical topic as a topic and only use the term &#8220;physical topic&#8221; when it&#8217;s important to stress its difference from a Topic object.<br />
The TopicPublisher<br />
A TopicPublisher was created using the pubSession and the chatTopic:<br />
// Look up a JMS topic<br />
Topic chatTopic = (Topic)jndi.lookup(topicName);</p>
<p>// Create a JMS publisher and subscriber<br />
TopicPublisher publisher =<br />
    pubSession.createPublisher(chatTopic);<br />
A TopicPublisher is used to deliver messages to a specific topic on a message server. The Topic object used in the createPublisher( ) method identifies the topic that will receive messages from the TopicPublisher. In the Chat example, any text typed on the command line is passed to the Chat class&#8217;s writeMessage( ) method. This method uses the TopicPublisher to deliver a message to the topic:<br />
protected void writeMessage(String text) throws JMSException{<br />
   TextMessage message = pubSession.createTextMessage( );<br />
   message.setText(username+&#8221; : &#8220;+text);<br />
   publisher.publish(message);<br />
}<br />
The TopicPublisher objects deliver messages to the topic asynchronously. Asynchronous delivery and consumption of messages is a key characteristic of Message-Oriented Middleware; the TopicPublisher doesn&#8217;t block or wait until all the subscribers receive the message. Instead, it returns from the publish( ) method as soon as the message server receives the message. It&#8217;s up to the message server to deliver the message to all the subscribers for that topic.<br />
The TopicSubscriber<br />
The TopicSubscriber is created using the subSession and the chatTopic:<br />
// Look up a JMS topic<br />
Topic chatTopic = (Topic)jndi.lookup(topicName);</p>
<p>// Create a JMS publisher and subscriber<br />
TopicPublisher publisher =<br />
    pubSession.createPublisher(chatTopic);<br />
TopicSubscriber subscriber =<br />
    subSession.createSubscriber(chatTopic);<br />
A TopicSubscriber receives messages from a specific topic. The Topic object argument used in the createSubscriber( ) method identifies the topic from which the TopicSubscriber will receive messages.<br />
The TopicSubscriber receives messages from the message server one at a time (serially). These messages are pushed from the message server to the TopicSubscriber asynchronously, which means that the TopicSubscriber does not have to poll the message server for messages. In our example, each chat client will receive any message published by any of the other chat clients. When a user enters text at the command line, the text message is delivered to all other chat clients that subscribe to the same topic.<br />
The pub/sub messaging model in JMS includes an in-process Java event model for handling incoming messages. This is similar to the event-driven model used by Java beans.[3] An object simply implements the listener interface, in this case the MessageListener, and then is registered with the TopicSubscriber. A TopicSubscriber may have only one MessageListener object. Here is the definition of the MessageListener interface used in JMS:<br />
package javax.jms;</p>
<p>public interface MessageListener {<br />
    public void onMessage(Message message);<br />
}<br />
When the TopicSubscriber receives a message from its topic, it invokes the onMessage( ) method of its MessageListener objects. The Chat class itself implements the MessageListener interface and implements the onMessage( ) method:<br />
public class Chat implements javax.jms.MessageListener{<br />
    &#8230;<br />
    public void onMessage(Message message){<br />
        try{<br />
            TextMessage textMessage = (TextMessage)message;<br />
            String text = textMessage.getText( );<br />
            System.out.println(text);<br />
        } catch (JMSException jmse){jmse.printStackTrace( );}<br />
    }<br />
    &#8230;<br />
}<br />
The Chat class is a MessageListener type, and therefore registers itself with the TopicSubscriber in its constructor:<br />
TopicSubscriber subscriber = subSession.createSubscriber(chatTopic);</p>
<p>subscriber.setMessageListener(this);<br />
When the message server pushes a message to the TopicSubscriber, the TopicSubscriber invokes the Chat object&#8217;s onMessage( ) method.<br />
It&#8217;s fairly easy to confuse the Java Message Service with its use of a Java event model. JMS is an API for asynchronous distributed enterprise messaging that spans processes and machines across a network. The Java event model is used to synchronously deliver events by invoking methods on one or more objects in the same process that have registered as listeners. The JMS pub/sub model uses the Java event model so that a TopicSubscriber can notify its MessageListener object in the same process that a message has arrived from the message server.<br />
The Message<br />
In the chat example, the TextMessage class is used to encapsulate the messages we send and receive. A TextMessage contains a java.lang.String as its body and is the most commonly used message type. The onMessage( ) method receives TextMessage objects from the TopicSubscriber. Likewise, the writeMessage( ) method creates and publishes TextMessage objects using the TopicPublisher:<br />
public void onMessage(Message message){<br />
   try{<br />
      TextMessage textMessage = (TextMessage)message;<br />
      String text = textMessage.getText( );<br />
      System.out.println(text);<br />
   } catch (JMSException jmse){jmse.printStackTrace( );}<br />
}<br />
protected void writeMessage(String text) throws JMSException{<br />
   TextMessage message = pubSession.createTextMessage( );<br />
   message.setText(username+&#8221; : &#8220;+text);<br />
   publisher.publish(message);<br />
}<br />
A message basically has two parts: a header and payload. The header is comprised of special fields that are used to identify the message, declare attributes of the message, and provide information for routing. The difference between message types is determined largely by their payload, i.e., the type of application data the message contains. The Message class, which is the superclass of all message objects, has no payload. It is a lightweight message that delivers no payload but can serve as a simple event notification. The other message types have special payloads that determine their type and use:<br />
Message<br />
This type has no payload. It is useful for simple event notification.<br />
TextMessage<br />
This type carries a java.lang.String as its payload. It is useful for exchanging simple text messages and also for more complex character data, such as XML documents.<br />
ObjectMessage<br />
This type carries a serializable Java object as its payload. It&#8217;s useful for exchanging Java objects.<br />
BytesMessage<br />
This type carries an array of primitive bytes as its payload. It&#8217;s useful for exchanging data in an application&#8217;s native format, which may not be compatible with other existing Message types. It is also useful where JMS is used purely as a transport between two systems, and the message payload is opaque to the JMS client.<br />
StreamMessage<br />
This type carries a stream of primitive Java types (int, double, char, etc.) as its payload. It provides a set of convenience methods for mapping a formatted stream of bytes to Java primitives. It&#8217;s an easy programming model when exchanging primitive application data in a fixed order.<br />
MapMessage<br />
This type carries a set of name-value pairs as its payload. The payload is similar to a java.util.Properties object, except the values must be Java primitives or their wrappers. The MapMessage is useful for delivering keyed data.<br />
Sessions and Threading<br />
The Chat application uses a separate session for the publisher and subscriber, pubSession and subSession, respectively. This is due to a threading restriction imposed by JMS. According to the JMS specification, a session may not be operated on by more than one thread at a time. In our example, two threads of control are active: the default main thread of the Chat application and the thread that invokes the onMessage( ) handler. The thread that invokes the onMessage( ) handler is owned by the JMS provider. Since the invocation of the onMessage( ) handler is asynchronous, it could be called while the main thread is publishing a message in the writeMessage( ) method. If both the publisher and subscriber had been created by the same session, the two threads could operate on these methods at the same time; in effect, they could operate on the same TopicSession concurrently&#8211;a condition that is prohibited.<br />
A goal of the JMS specification was to avoid imposing an internal architecture on the JMS provider. Requiring a JMS provider&#8217;s implementation of a Session object to be capable of safely handling multiple threads was specifically avoided. This is mostly due to one of the intended uses of JMS&#8211;that the JMS API be a wrapper around an existing messaging system, which may not have multithreaded delivery capabilities on the client.<br />
The requirement imposed on the JMS provider is that the sending of messages and the asynchronous receiving of messages be processed serially. It is possible to publish-and-subscribe using the same session, but only if the application is publishing from within the onMessage( ) handler. An example of this will be covered in Chapter 4.<br />
________________________________________<br />
1. Thread-specific storage is used with the Java Authentication and Authorization Service ( JAAS) to allow security credentials to transparently propagate between resources and applications.<br />
2. The actual physical network connection may or may not be unique depending on the vendor. However, the connection is considered to be logically unique so authentication and connection control can be managed separately from other connections.<br />
3. Although the in-process event model used by TopicSubscriber is similar to the one used in Java beans, JMS itself is an API and the interfaces it defines are not Java beans.</p>
<p style="text-align: center;"></p>]]></content:encoded>
			<wfw:commentRss>http://www.genelbilge.com/developing-a-simple-example.html/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Performance Optimization</title>
		<link>http://www.genelbilge.com/performance-optimization.html/</link>
		<comments>http://www.genelbilge.com/performance-optimization.html/#comments</comments>
		<pubDate>Fri, 27 Aug 2010 17:36:18 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Delphi]]></category>
		<category><![CDATA[Programlama]]></category>
		<category><![CDATA[Algorithms And Data Structures]]></category>
		<category><![CDATA[Application Doesn]]></category>
		<category><![CDATA[Compiler Options]]></category>
		<category><![CDATA[Data Structures And Algorithms]]></category>
		<category><![CDATA[Database Application]]></category>
		<category><![CDATA[Dll Ocx]]></category>
		<category><![CDATA[Five Steps]]></category>
		<category><![CDATA[Internet Environment]]></category>
		<category><![CDATA[Linker Options]]></category>
		<category><![CDATA[Maximum Efficiency]]></category>
		<category><![CDATA[Neck Areas]]></category>
		<category><![CDATA[Performance Bottlenecks]]></category>
		<category><![CDATA[Performance Improvements]]></category>
		<category><![CDATA[Performance Optimization]]></category>
		<category><![CDATA[Performance Result]]></category>
		<category><![CDATA[Profiler]]></category>
		<category><![CDATA[Specific Solution]]></category>
		<category><![CDATA[Statement Blocks]]></category>
		<category><![CDATA[Timing Tool]]></category>
		<category><![CDATA[Windows Environment]]></category>

	<!-- AutoMeta Start -->
	<category>optimization</category>
	<category>optimization</category>
	<category>performance</category>
	<!-- AutoMeta End -->
	
		<guid isPermaLink="false">http://www.genelbilge.com/?p=14998</guid>
		<description><![CDATA[First of all, we must divide the process of performance optimization into seven phases: We need to customize our Delphi compiler and linker options for maximum efficiency. Furthermore, we need to familiarize ourselves with the Windows environment itself we&#8217;re targeting. We must identify bottlenecks, using Turbo Profiler or another profiling or timing tool. We will [...]]]></description>
			<content:encoded><![CDATA[<p>First of all, we must divide the process of performance optimization into seven phases:</p>
<ol>
<li>We need to customize our Delphi <strong>compiler and linker options</strong> for maximum efficiency. Furthermore, we need to familiarize ourselves with the Windows environment itself we&#8217;re targeting. <a href="http://www.drbob42.com/delphi/#2"></a></li>
<li>We must identify bottlenecks, using Turbo Profiler or another profiling or timing tool. We will examine tools to measure the number of times a statement block is executed, and several methods of timing these statement blocks. Statement blocks may be statements, but also procedures, functions, units and whole programs. We can find the performance bottlenecks using these techniques. It will turn out that even small improvements in these bottlenecks will often have more effect than big improvements in non-bottle-neck areas. <a href="http://www.drbob42.com/delphi/#3"></a></li>
<li>We should examine the data structures and algorithms of the bottlenecks found in step 2, and try to find more efficient equivalents. We will see that the largest performance improvements can come from changing algorithms and data structures. A more specific solution to a problem might be less flexible, but can often be an order of a magnitude faster! <a href="http://www.drbob42.com/delphi/#4"></a></li>
</ol>
<p>After we performed the first four or five steps, we know for certain that the (stand-alone!) executable (EXE, DLL, OCX) is as fast as possible. Yet, this doesn&#8217;t mean that the application doesn&#8217;t need fine-tuning. Especially in a Client/Server, or N-tier (internet) environment, we need to perform additional steps to ensure maximum efficiency.<br />
During the Delphi Efficiency session in San Diego, we&#8217;ll spend some time exploring steps 6. and 7. by building a 2-Tier database application, using TClientDataSet and Providers.<span id="more-14998"></span></p>
<p>A step can fail in two ways. One way if it simply cannot be done, and another way if it doesn&#8217;t deliver the required performance result.</p>
<p><strong>Step 1. Prepare!</strong><br />
Before we even start to think about Performance Optimization, it is time to check out the compiler options of Delphi on our development machine. Although compiler options have less impact than a bad algorithm, it can seriously slow down our code and expand our total code size.<br />
My personal project options for Delphi 32 (Delphi 2.x and higher) are as follows (note the checked &#8220;Default&#8221;, which means that these options are now default for every new project in Delphi on my machine):<br />
Delphi 4 Project Options</p>
<p>Compared to the 16-bits Delphi <em>Project Options &#8211; Compiler</em> page, there are a few new things. There is now an <strong>&#8220;Optimization&#8221;</strong> option. Frankly, I don&#8217;t know why we should want to have this one turned off. It only takes a fraction longer to debug) the application with and without optimization if needed.<br />
Another change is the <strong>&#8220;Aligned record fields&#8221;</strong> option, that will align fields within records to 32-bit boundaries. In Win32 land, this field alignment means faster writing files that contain these (previously non-aligned) records. We must use the new keyword <strong>packed</strong> in these cases, to make sure the records are packed like before.</p>
<p><strong>Algorithm Analysis</strong><br />
Algorithm analysis focuses on the run-time behavior of the algorithm in space and time efficiency. We often use the Big-Oh notation to express the running-time O(log N) if it takes only &#8220;log N&#8221; steps to perform the task at hand; like searching honestly, have you ever used binary search when looking for a person&#8217;s phone number in the phone book?). We can distinguish the following important O(N) running-time behaviors:</p>
<table border="1" cellpadding="0">
<tbody>
<tr>
<td width="89"><strong>O(N)</strong></td>
<td width="137">
<h1>Behavior</h1>
</td>
<td width="24" valign="top"></td>
<td width="8" valign="top"></td>
<td width="11" valign="top"></td>
</tr>
<tr>
<td width="89">C</td>
<td width="137">Constant</td>
<td width="24" valign="top"></td>
<td width="8" valign="top"></td>
<td width="11" valign="top"></td>
</tr>
<tr>
<td width="89">log N</td>
<td width="137">Logarithmic</td>
<td width="24" valign="top"></td>
<td width="8" valign="top"></td>
<td width="11" valign="top"></td>
</tr>
<tr>
<td width="89">N</td>
<td width="137">Linear</td>
<td width="24" valign="top"></td>
<td width="8" valign="top"></td>
<td width="11" valign="top"></td>
</tr>
<tr>
<td width="89">N log N</td>
<td width="137">linear-logarithmic</td>
<td width="24" valign="top"></td>
<td width="8" valign="top"></td>
<td width="11" valign="top"></td>
</tr>
<tr>
<td width="89">N*N</td>
<td width="137">Quadratic</td>
<td width="24" valign="top"></td>
<td width="8" valign="top"></td>
<td width="11" valign="top"></td>
</tr>
<tr>
<td width="89">N*N*N</td>
<td width="137">Cubic</td>
<td width="24" valign="top"></td>
<td width="8" valign="top"></td>
<td width="11" valign="top"></td>
</tr>
<tr>
<td width="89">2**N</td>
<td width="137">Exponential</td>
<td width="24" valign="top"></td>
<td width="8" valign="top"></td>
<td width="11" valign="top"></td>
</tr>
</tbody>
</table>
<p>In practice, we&#8217;ll mostly meet algorithms with a Logarithmic, Linear, Linear-logarithmic or Quadratic behavior. An algorithm with a Big-Oh slower than quadratic is often not very practical (even quadratic is often not usable for large input sets).  Using this Big-Oh information, we can predict that an algorithm will be slower or faster than another algorithm. A Bubble Sort of O(N2), for example,</p>
<p>is much slower than a Quick Sort which has an average case of O(N log N). Just fill in N=1000 for a list of 1000 elements that needs to be sorted, and we&#8217;ll see that Bubble Sort will need O(1,000,000) operations, while Quick Sort can do it in</p>
<p>O(10,000) &#8211; the difference between one second and two minutes! For operations, we can substitute a certain amount of work that need to be done in the so-called inner loop of the algorithm.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.genelbilge.com/performance-optimization.html/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Soru Sorma Ve Soruya Cevap Arama</title>
		<link>http://www.genelbilge.com/soru-sorma-ve-soruya-cevap-arama.html/</link>
		<comments>http://www.genelbilge.com/soru-sorma-ve-soruya-cevap-arama.html/#comments</comments>
		<pubDate>Tue, 06 Jul 2010 17:42:35 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Programlama]]></category>
		<category><![CDATA[Albatros]]></category>
		<category><![CDATA[Cevap]]></category>
		<category><![CDATA[Cita]]></category>
		<category><![CDATA[Clauses]]></category>
		<category><![CDATA[Evet]]></category>
		<category><![CDATA[Eylem]]></category>
		<category><![CDATA[Iyi]]></category>
		<category><![CDATA[Penguen]]></category>
		<category><![CDATA[Predicates]]></category>
		<category><![CDATA[Readln]]></category>
		<category><![CDATA[Renk]]></category>
		<category><![CDATA[Sari]]></category>
		<category><![CDATA[Sorma]]></category>
		<category><![CDATA[Sorular]]></category>
		<category><![CDATA[Sut]]></category>
		<category><![CDATA[Symbol Symbol Symbol]]></category>
		<category><![CDATA[Tiger]]></category>
		<category><![CDATA[Ucar]]></category>
		<category><![CDATA[Uzun Boylu]]></category>
		<category><![CDATA[Zebra]]></category>

	<!-- AutoMeta Start -->
	<category>cevap</category>
	<!-- AutoMeta End -->
	
		<guid isPermaLink="false">http://www.genelbilge.com/?p=14242</guid>
		<description><![CDATA[Çeşitli sorular sorularak yedi hayvandan biri bulunacak. DATABASE xpositif(symbol,symbol) xnegatif(symbol,symbol) PREDİCATES nondeterm aranan_canli(symbol) nondeterm canli_turu(symbol) soru_sor(symbol,symbol,symbol) sakla(symbol,symbol,symbol) positif(symbol,symbol) negatif(symbol,symbol) olgulari_sil basla CLAUSES aranan_canli(cita):- canli_turu(memeli), canli_turu(etobur), positif(sahiptir,sari_kahverengi_renklere), positif(sahiptir,siyah_benekler). aranan_canli(tiger):- canli_turu(memeli), canli_turu(etobur), positif(sahiptir,sari_kahverengi_renklere), positif(sahiptir,siyah_seritli). aranan_canli(zurafa):- canli_turu(tirnakli), positif(sahiptir,uzun_boylu), positif(sahiptir,uzun_bacaklı), positif(sahiptir,siyah_benekler). aranan_canli(zebra):- canli_turu(tirnakli), positif(sahiptir,siyah_seritli). aranan_canli(devekusu):- canli_turu(kus), negatif(eylem,ucar), positif(sahiptir,uzun_boylu), positif(sahiptir,uzun_bacaklı), positif(sahiptir,siyah_beyaz_renk). aranan_canli(penguen):- canli_turu(kus), negatif(eylem,ucar), pozitif(eylem,yuzer), positif(sahiptir,siyah_beyaz_renk). aranan_canli(albatros):- canli_turu(kus), pozitif(eylem,iyi_ucar). canli_turu(memeli):- [...]]]></description>
			<content:encoded><![CDATA[<p>Çeşitli sorular sorularak yedi hayvandan biri bulunacak.</p>
<p>DATABASE<br />
	xpositif(symbol,symbol)<br />
	xnegatif(symbol,symbol)<br />
PREDİCATES<br />
	nondeterm aranan_canli(symbol)<br />
	nondeterm canli_turu(symbol)<br />
	soru_sor(symbol,symbol,symbol)<br />
	sakla(symbol,symbol,symbol)<br />
	positif(symbol,symbol)<br />
	negatif(symbol,symbol)<br />
	olgulari_sil<br />
	basla<br />
CLAUSES<br />
	aranan_canli(cita):-<span id="more-14242"></span><br />
		canli_turu(memeli),<br />
		canli_turu(etobur),<br />
		positif(sahiptir,sari_kahverengi_renklere),<br />
		positif(sahiptir,siyah_benekler).<br />
	aranan_canli(tiger):-<br />
		canli_turu(memeli),<br />
		canli_turu(etobur),<br />
		positif(sahiptir,sari_kahverengi_renklere),<br />
		positif(sahiptir,siyah_seritli).<br />
	aranan_canli(zurafa):-<br />
		canli_turu(tirnakli),<br />
		positif(sahiptir,uzun_boylu),<br />
		positif(sahiptir,uzun_bacaklı),<br />
		positif(sahiptir,siyah_benekler).<br />
	aranan_canli(zebra):-<br />
		canli_turu(tirnakli),<br />
		positif(sahiptir,siyah_seritli).<br />
	aranan_canli(devekusu):-<br />
		canli_turu(kus),<br />
		negatif(eylem,ucar),<br />
		positif(sahiptir,uzun_boylu),<br />
		positif(sahiptir,uzun_bacaklı),<br />
		positif(sahiptir,siyah_beyaz_renk).<br />
	aranan_canli(penguen):-<br />
		canli_turu(kus),<br />
		negatif(eylem,ucar),<br />
		pozitif(eylem,yuzer),<br />
		positif(sahiptir,siyah_beyaz_renk).</p>
<p>	aranan_canli(albatros):-<br />
		canli_turu(kus),<br />
		pozitif(eylem,iyi_ucar).<br />
	canli_turu(memeli):-<br />
		positif(sahiptir,tuylu).<br />
	canli_turu(memeli):-<br />
		positif(eylem,sut_verir).<br />
	canli_turu(kus):-<br />
		positif(sahiptir,kus_tuyleri).<br />
	canli_turu(kus):-<br />
		positif(eylem,ucar),<br />
		positif(eylem,yumurtlar).<br />
	canli_turu(etobur):-<br />
		positif(eylem,et_yer).<br />
	canli_turu(kus):-<br />
		positif(sahiptir,sivri_dislere),<br />
		positif(sahiptir,pencelere),<br />
		positif(sahiptir,patlak_gozlere).<br />
	canli_turu(tirnakli):-<br />
		canli_turu(memeli),<br />
		positif(eylem,gevis_getirme).<br />
	positif(X,Y):-<br />
		xpositif(X,Y),!.<br />
	positif(X,Y):-<br />
		not(xnegatif(X,Y)),<br />
		soru_sor(X,Y,evet).<br />
	negatif(X,Y):-<br />
		xnegatif(X,Y),!.<br />
	negatif(X,Y):-<br />
		not(xpositif(X,Y)),<br />
		soru_sor(X,Y,hayir).<br />
	soru_sor(X,Y,evet):-<br />
		!,<br />
		write(X,”aranan canlı:”Y’\n’),<br />
		readln(Cevap),nl,<br />
		fontchar(Cevap,’e’,_),<br />
		sakla(X,Y,evet).<br />
	Soru_sor(X,Y,hayir):-<br />
		!,<br />
		write(X,”aranan canlı:”Y’\n’),<br />
		readln(Cevap),nl,<br />
		fontchar(Cevap,’h’,_),<br />
		sakla(X,Y,hayir).<br />
	sakla(X,Y,evet):-<br />
		assertz(xpositif(X,Y)).<br />
	sakla(X,Y,hayir):-<br />
		assertz(xnegatif(X,Y)).<br />
	olgulari_sil:-<br />
		write(“\n\nBitirmek icin space tusuna basiniz\n”),<br />
		retractall(_dbasedom),readchar(_).<br />
	basla:-<br />
		aranan_canli(X),!,<br />
		write(“\n Aradiginiz canli bir “,X,” olabilir.”);<br />
		nl,nl,olgulari_sil.</p>
<p>	basla:-<br />
		write(“\n Aradiginiz canliyi  bulmak mumkun degil\n\n.”);<br />
		olgulari_sil.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.genelbilge.com/soru-sorma-ve-soruya-cevap-arama.html/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Oracle Ürünleri</title>
		<link>http://www.genelbilge.com/oracle-urunleri.html/</link>
		<comments>http://www.genelbilge.com/oracle-urunleri.html/#comments</comments>
		<pubDate>Wed, 16 Jun 2010 16:34:54 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Bilgisayar]]></category>
		<category><![CDATA[Programlama]]></category>
		<category><![CDATA[Ase]]></category>
		<category><![CDATA[Database Management Systems]]></category>
		<category><![CDATA[Delphi]]></category>
		<category><![CDATA[Hizmet]]></category>
		<category><![CDATA[Ilk]]></category>
		<category><![CDATA[Informix Corporation]]></category>
		<category><![CDATA[Lerin]]></category>
		<category><![CDATA[Oracl]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Oracle 8]]></category>
		<category><![CDATA[Oracle Corporation]]></category>
		<category><![CDATA[Relational Database Management]]></category>
		<category><![CDATA[Relational Database Management Systems]]></category>
		<category><![CDATA[Sybase Inc]]></category>
		<category><![CDATA[Veri]]></category>

	<!-- AutoMeta Start -->
	<category></category>
	<!-- AutoMeta End -->
	
		<guid isPermaLink="false">http://www.genelbilge.com/oracle-urunleri.html/</guid>
		<description><![CDATA[Örnek VTYS&#8217;ler Giriş Teknolojinin her dalında olduğu gibi VTYS alanında da çok hızlı gelişmeler yaşanmaktadır. Bu haftaki dersimizde size bazı güncel VTYS&#8217;leri bir miktar tanıtmaya çalışacağız. Tabii ki bu tanıtımda örnek VTYS&#8217;lerin tüm özelliklerini tanıtma iddiasında değiliz. Sadece temel ve ayırdedici özelliklerini tanıtmayı amaçlıyoruz. Daha ayrıntılı bilgiyi VTYS&#8217;nin web sitesinden veya ilgili şirketlerden edinebilirsiniz. Örnek [...]]]></description>
			<content:encoded><![CDATA[<p>Örnek VTYS&#8217;ler<br />
Giriş<br />
Teknolojinin her dalında olduğu gibi VTYS alanında da çok hızlı gelişmeler yaşanmaktadır. Bu haftaki dersimizde size bazı güncel VTYS&#8217;leri bir miktar tanıtmaya çalışacağız. Tabii ki bu tanıtımda örnek VTYS&#8217;lerin tüm özelliklerini tanıtma iddiasında değiliz. Sadece temel ve ayırdedici özelliklerini tanıtmayı amaçlıyoruz. Daha ayrıntılı bilgiyi VTYS&#8217;nin web sitesinden veya ilgili şirketlerden edinebilirsiniz.<br />
Örnek VTYS&#8217;lerimiz:<br />
ORACLE &#8211; Oracle Corporation<br />
INFORMIX &#8211; Informix Corporation<br />
ASE &#8211; Sybase, Inc.<br />
ORACLE <span id="more-13617"></span><br />
İlişkisel Veritabanı Yönetim Sistemleri (Relational Database Management Systems &#8211; RDBMS) büyük miktarlardaki verilerin güvenli bir şekilde tutulabildiği, bilgilere hızlı erişim imkanlarının sağlandığı, bilgilerin bütünlük içerisinde tutulabildiği ve birden fazla kullanıcıya aynı anda bilgiye erişim imkanının sağlandığı programlardır. Oracle veritabanı da bir ilişkisel veri tabanı yönetim sistemidir.<br />
	Oracle veritabanının özellikleri şunlardır:<br />
•	Büyük miktarda veri tutabilmekte ve verilerin depolandığı alanları ayarlama imkanı vermektedir.<br />
•	Aynı anda çok sayıda kullanıcıya verilerin bütünlüğünü bozmadan hizmet verebilmektedir. Oracle 8 sürümü ile birlikte on binlerce kullanıcıya hizmet verebilmektedir.<br />
•	Günün 24 saati ve haftalar boyu hiç kapatılmadan çalışabilmektedir.<br />
•	İşletim sistemi, veri erişim dilleri ve ağ iletişim protokolleri standartlarıyla uyumludur.<br />
•	Yetkisiz erişimleri engelleme ve kontrol edebilme imkanı sağlamaktadır.<br />
•	Bütünlüğü veritabanı düzeyinde sağlayabilmektedir, böylece daha az kod yazılmaktadır.<br />
•	İstemci/Sunucu mimarisinin bütün avantajlarını kullanabilmektedir.<br />
Oracle ile ilk defa karşılaşan kullanıcılar genellikle Delphi, Visual Basic gibi görsel programlama dillerine benzeyen uygulamalarla karşılaşmayı umarlar. Oysa ki yukarıda da belirttiğimiz gibi Oracle bir ilişkisel veritabanı yönetim sistemidir. Yani bir programlama dili değildir. Fakat Oracle tarafından geliştirilen ve Oracle’ın kendi uygulama geliştirme araçları içerisinde kullanılan bir programlama dili vardır. Oracle ürünleri genellikle büyük çaplı veri kontrolünü gerektiren uygulamalarda kullanılır. Öncelikle bir ağda Oracle veritabanı sadece sunucu olarak adlandırılan bilgisayara yüklenir. Bu sunucu Oracle’ın desteklediği herhangi bir işletim sistemiyle çalışıyor olabilir. Yani Oracle’ın faklı işletim sistemleri için farklı sürümleri vardır. Bu sunucu bilgisayara kurulan veritabanı üzerinde tablolar, indeksler, eşanlamlar,tablo uzayları ve ihtiyaç duyulan kayıtlı prosedürler oluşturulur. Bunlar raporun sonraki bölümlerinde anlatılmaktadır. Oracle’ın bu veritabanına erişerek uygulama programı geliştirmeye yarayan diğer ürünleri de istemci bilgisayarlara kurulur. Tabi sunucu bilgisayara da isteğe bağlı olarak bu ürünler kurulabilir.<br />
Oracle Ürünleri<br />
	Aşağıda şu an kullanımı en güncel olan değişik Oracle ürünleri tanıtılımıştır.<br />
Oracle RDBMS<br />
Oracle ilişkisel veritabanı yönetim sistemi Oracle şirketinin ana ürünüdür. Bu ürünün şu an en yeni sürümü Oracle9i RDBMS’dir. Biz bu çalışmada bir önceki sürüm olan Oracle8i’yi esas alacağız. Oracle 8i’den bir önceki sürüm Oracle 7 ve onun bir önceki sürümü de Oracle 6’dır.<br />
Oracle Uygulama Geliştirme Araçları<br />
	Oracle’ın veritabanı uygulamaları geliştirmek için görsel ürünleri bu grupta yer alır. Oracle’ın program geliştirmek için kullanılan bu ürünlerinin eski adı Oracle Power Objects idi. Daha sonra Oracle Developer 2000 ve sonra da Oracle Developer 6 ürünleri geliştirildi. Developer 2000 ve Developer 6 içerisinde Form Builder, Report Builder, Graphics Builder, Procedure Builder ve Schema Builder ürünlerini içerir. Form Builder kullanıcıya sunulacak arayüzlerin geliştirildiği programdır. İşte bu uygulama görsel bir programlama dilinin uygulama geliştirme ortamına benzer. Report Builder ürünü veritabanından elde edilen bilgiler ile raporlar hazırlamaya yarar. Özellikle banka ve kamu kuruluşlarının ihtiyacı olan fatura, evrak gibi belgelerin hazırlanıp, çıktı alınması için geliştirilmiş bir programdır. Procedure Builder sürekli kullanılacak kodların prosedürler halinde oluşturulup, kütüphaneler olarak kaydedilmesi işlemine yarayan bir programdır. Schema Builder ise veritabanı nesnelerinin görsel olarak oluşturulabilmesi için geliştirilmiş bir uygulamadır. Burada tablo, görüntü, eşanlam oluşturma, tablolar arası ilişki kurma,tablo kısıtlamaları oluşturma işlemleri görsel olarak yapılabilir.<br />
SQL*Plus<br />
	SQL*Plus, Oracle veritabanında sorgulama yapmak ve SQL komutlarını çalıştırmak için kullanılan bir araçtır. SQL*Plus’da SQL komutlarının yanısıra PL/SQL komutları da kullanılabilmektedir. Bu çalışmanın diğer bölümlerinde anlatılan SQL komutları SQL*Plus kullanılarak hazırlanmıştır.<br />
PL/SQL<br />
	PL/SQL (Procedural Language/SQL), yapısal dillere ait özelliklerin standart SQL’e eklenmesiyle ortaya çıkan Oracle’a has bir dildir. PL/SQL Oracle firmasının piyasaya sürdüğü her üründe önemli bir yere sahiptir. Kullanıcılar PL/SQL’i kullanarak programlarına bir çok yeni özellikler katmaktadırlar. Bunlar arasında;<br />
•	PL/SQL tabanlı kaydedilmiş yordamlar(stored procedures) ve veritabanı tetiklemeleri(triggers) ile önemli iş kurallarını programlamak<br />
•	Oracle Developer ürünleri ile güçlü ve kolay kullanılabilir görsel ortamlarla programları detaylandırmak ve daha rahat kontrol etmek<br />
•	Oracle tabanlı uygulamalarda nesne-tabanlı(object-oriented) tasarımlar yapma Web sayfalarından Oracle veritabanlarına link yapma<br />
PL/SQL’in belki de en önemli özelliği istemci-sunucu ortamları tasarlama ile ağ üzerinde dağıtık işlemler yapma ve bir çok sorguyu çalıştırma imkanı sunmasıdır. PL/SQL dili Ada dilinden sonra tasarlanmıştır. PL/SQL’de en gelişmiş yordamsal dillerde olan veri tipleri, blok yapısı, şartlara bağlı ve bağlı olmayan kontrol cümleleri, bir çok döngü tipi, hata durumlarında kullanılacak yordamlar ve kullanıcı tarafından tanımlanabilecek nesneler yer almaktadır.<br />
Net8<br />
	Net8 Oracle’ın bir ağ ürünüdür. Farklı bilgisayarların veritabanına bağlantı kurması ve ve istemci-sunucu arasında veri alışverişinin sağlanabilmesi Net8’in ana görevidir. Net8 ağdaki her bilgisayara kurulur. Ağ bağlantısı sağlandığında NET8 istemci ile sunucu arasında bir veri taşıyıcısı gibi işlem görür.</p>
<p>Ağ üzerinde bir istemcinin sunucudaki veritabanına erişebilmesi için, sunucuda bir ağ servis adının(Net Service Name) ve bir dinleyicinin(LISTENER) oluşturulması gerekir. Oracle Enterprise Edition ile birlikte gelen Net8 Assistant ile bu gerçekleştirilebilir. Ağ servis adları, veritabanı gibi bir servisi ağda tanımlamak amacıyla basit bir yöntem olarak kullanılır.<br />
Aşağıda Ne8 Assistant görüntüsü verilmiştir. Verilen şekilde ağ erişimi oluşturmak için gereken işlemler oldukça basittir. </p>
<p>SQL*Net<br />
	SQL*Net Net8’in yardımcı programıdır. Bir istemci bilgisayara Oracle Forms ürününün yüklendiğini düşünelim. Bunun için istemci bilgisayar SQL*Net ile oluşturulan veritabanı takma adını(alias) kullanır. Yukarıda Net8 konfigürasyonunun istemci bilgisayarlarda da yapılması gerektiğini söylemiştik. İşte bu konfigürasyon istemci bilgisayarlarda SQL*Net sayesinde yapılır. Burada veritabanına verilecek takma isim, protokol adı, ana bilgisayar adı (veritabanının bulunduğu) ve veritabanının SID olarak girilen ismi bilgileri girilerek düzenleme yapılır.</p>
<p>Oracle8i Enterprise Edition ve Gerekli Donanım<br />
Bu rapor Oracle8i Enterprise Edition for Windows NT Release 8.1.5 sürümü üzerine düzenlenmiştir. Oracle8i Enterprise Edition CD’sinde üç farklı ürün yer almaktadır:<br />
•	Oracle8i Enterprise Edition (Server)<br />
•	Oracle8i Client<br />
•	Oracle Programmer </p>
<p>Oracle8i Enterprise Edition(Windows NT)</p>
<p>	Yükleme Türü	Açıklama<br />
Typical 	Tam anlamıyla bir veritabanı kullanmak isteyenler için tavsiye edilen yükleme türüdür. Bir başlangıç veritabanı, ağ servisleri, Oracle yardımcı ürünleri ve yardım dokümanları yüklenir.720 MB yer kaplar. Pentium 133 ya da Pentium 166 işlemci ile kurulabilir. Önerilen işlemci Pentium 200 dür. 96 MB RAM ile çalışabilir. Tavsiye edilen bellek ise 128 MB ‘tır.<br />
Minimal 	Minimum veritabanı paketi kullanmak isteyenler için önerilir. Bir başlangıç veritabanı, ağ servisleri ve bazı yardımcı ürünleri içerir. 520 MB yer kaplar. Pentium 133 ya da Pentium 166 işlemci ile kurulabilir. Önerilen işlemci Pentium 200 dür. 64 MB RAM ile çalışabilir. Tavsiye edilen bellek ise 96 MB ‘tır.<br />
Oracle8i Client(Windows NT ve Windows 95/98)</p>
<p>Yükleme Türü	Açıklama<br />
Typical 	Veritabanı yöneticileri için veritabanına bağlanma ve veritabanı yönetim işlerini gerçekleştirme araçlarını yükler. 299 MB yer kaplar. Intel 80486 işlemci ile çalıştırılabilir. Tavsiye edilen Pentium 133 ya da Pentium 166 dır. En az 32 MB RAM ile çalıştırılabilir. Önerilen 64 MB’tır.</p>
<p>Oracle Programmer(Windows NT ve Windows 95/98)</p>
<p>Yükleme Türü	Açıklama<br />
Typical 	Veritabanına erişebilen geliştirme araçları ve ara yüzlerini yükler. Bu paket, ön derleyicileri(precompilers), ağ servislerini ve yardım dokümanlarını içerir. 267 MB yer kaplar. Intel 80486 işlemci ile çalıştırılabilir. Tavsiye edilen Pentium 133 ya da Pentium 166 dır. En az 32 MB RAM ile çalıştırılabilir. Önerilen 64 MB’tır.</p>
<p>Oracle Veritabanı Yapısı<br />
Oracle veritabanının, işletim sistemi tarafından bakıldığında, biri fiziksel diğeri mantıksal olmak üzere iki bölümü vardır. Fiziksel bölüm, işletim sisteminden görünen kısımdır. Bunlar Data File(Veri Dosyası), Control File(Kontrol Dosyası) ve Log File(Log Dosyası) ‘dan oluşmaktadır. Mantıksal Bölüm, bir ya da daha fazla tablo uzayı(Tablespace) ve tablolar(table), görüntüler(view), sıralar(sequence), eşanlamlar(synonym), indeksler(index), kümeler(cluster), veritabanı bağlantıları (database link), prosedürler(procedure), fonksiyonlar(function), ve paketlerden(package) oluşan şema nesnelerinden oluşmaktadır. Fiziksel bölüm işletim sistemi tarafından görülebilmesine rağmen, mantıksal bölüm ancak Oracle’a bağlanıp, SQL komutları çalıştırılarak görülebilmektedir. Yani, Oracle kurulu herhangi bir makinede, SQL bilgisi olmayan bir insan, Oracle’ın sadece fiziksel bölümünü görebilmektedir.<br />
	Oracle veritabanındaki her nesnenin bir sahibi(kullanıcı olarak bahsedilir) vardır. Her kullanıcı bir veya daha fazla tablo uzayına sahip olabilir. Her nesne, ait olduğu kullanıcının herhangi bir tablo uzayında (mantıksal olarak) bulunur. Her tablo uzayı da, kendisine sahip olan kullanıcının nesnelerini tutmak için işletim sisteminde bir veya daha fazla veri dosyasına sahip olabilmektedir.<br />
	Sonuç itibariyle, veritabanındaki her nesnenin bir kullanıcısı vardır ve bu nesneler mantıksal olarak o kullanıcının sahip olduğu tablo uzaylarının herhangi birinin (hangisi olduğu komutlarla öğrenilebilir) içerisinde, fiziksel olarak da o kullanıcının sahip olduğu tablo uzayının herhangi bir veri dosyasında bulunur. Fakat, o veri dosyasının içerisine işletim sisteminden bu nesneyi bulmak için bakılamaz. Bu nesnenin sahibi ve mantıksal yeri “DML”(veri işleme dili) komutları ile bulunabilmektedir.</p>
<p>Fiziksel Bölüm<br />
	Fiziksel bölüm veritabanını oluşturan işletim sistemi dosyalarıdır. Bir Oracle veritabanı fiziksel olarak bir ya da daha fazla veri dosyası, iki ya da daha fazla log dosyası, bir ya da daha fazla kontrol dosyasından oluşur.<br />
Veri Dosyaları(Data Files)<br />
	Veri dosyaları veri tabanındaki tüm verileri tutan dosyalardır. Tablo, indeks gibi mantıksal veritabanı yapılarının içerisindeki veriler fiziksel olarak veri dosyalarında tutulurlar. Bir veri dosyası kendisi için ayrılan alan dolduğunda,  kendi sahip olduğu alanı artırabilecek özelliklere sahiptir. Bir ya da daha fazla veri dosyası mantıksal bir veritabanı depolama ünitesi olan bir tablo uzayını oluşturular.<br />
	Normal veritabanı işlemleri boyunca bir veri dosyası içerisindeki veriler okunur ve Oracle için ayrılan belleğe getirilirler. Örneğin bir kullanıcının veritabanındaki bir tablonun verilerine erişmek istediğini varsayalım. Eğer istenilen veriler bellekte yer almıyorsa, ancak o zaman uygun veri dosyasından okunur ve belleğe getirilirler.<br />
	Değişikliğe uğrayan veriler ya da yeni eklenen veriler veri dosyalarına hemen yazılmazlar. Sabit diske erişimi azaltmak ve böylece sistemin performansını artırmak için veriler bellek havuzunda tutulur ve gerektiğinde hepsi birden uygun veri dosyalarına kaydedilirler. Bunu Oracle artalan işlemleri belirler.<br />
Kontrol Dosyaları(Control Files)<br />
	Tüm Oracle veritabanları kontrol dosyasına sahiptir.  Bir kontrol dosyası veritabanı adı, veri dosyaları ve log dosyalarının adı ve diskteki yeri, veritabanının oluşturulma tarihi vb. veritabanı ile ilgili bilgileri tutar.<br />
	Her veritabanı oturumu açıldığında Oracle bu dosyayı kontrol ederek gerekli bilgileri alır. Eğer veritabanında fiziksel bir değişme olursa(yeni bir log dosyası ya da veri dosyası oluşturulması gibi), yapılan değişiklikler Oracle tarafından otomatik olarak kontrol dosyalarına yansıtılır.<br />
Log Dosyaları(Log Files)<br />
	Redo Log dosyaları olarak bilinen bu dosyaların amacı veriler üzerinde yapılan tüm değişiklikleri kaydetmektir. Eğer veri dosyalarına kalıcı olarak kaydedilmiş olan, değişikliğe uğramış kayıtlarda bir bozukluk olursa yapılan değişiklikler redo log dosyalarından sağlanabilir ve işlemler kaybolmaz. Birden fazla tekrarlanan bozukluk durumlarında redo log dosyalarının da bozulmasını engellemek için Oracle farklı diskler üzerinde redo log dosyalarının birden fazla kopyasının alınmasına olanak sağlar.<br />
	Bir veritabanı işlemi sırasında elektrik kesilirse, bellekteki veriler veri dosyalarına kaydedilmeyecek ve verilerin kaybolması durumuyla karşılaşılacaktır. Oracle veritabanı tekrar açıldığında redo log dosyalarında yapılan son değişiklikler veri dosyalarına yansıtılarak verilerin kaybolması engellenir.<br />
Mantıksal Bölüm<br />
	Oracle veritabanının mantıksal yapısı tablo uzaylarını(tablespaces), şema nesnelerini(schema objects), veri bloklarını(data blocks), genişlemeleri(extents) ve parçaları(segments) içerir.<br />
Tablo Uzayı(TableSpace)<br />
	Bir veritabanı, ilişkili mantıksal yapıların gruplanmasını sağlayan ve tablo uzayı olarak bilinen mantıksal depolama ünitelerine bölünmüştür.</p>
<p>	Yukarıdaki şekil veritabanı, tablo uzayı ve veri dosyaları arasındaki ilişkiyi açıklamaktadır. Buna göre:<br />
•	Bir veritabanı bir ya da daha fazla tablo uzayına bölünmüştür.<br />
•	Tablo uzayı içerisindeki tüm mantıksal yapıları fiziksel olarak depolayabilmek için, her tablo uzayı bir ya da daha fazla veri dosyasına sahip olabilir.<br />
•	Tablo uzaylarının toplam kapasitesi, sahip oldukları veri dosyalarının toplam kapasitesine eşittir.(Yukarıdaki şekil için SYSTEM tablo uzayı 2MB, USERS tablo uzayı 4MB).<br />
•	Tablo uzaylarının toplam kapasitesi veritabanının toplam kapasitesini belirler.(6 MB)<br />
	Bir tablo uzayı açık ya da kapalı olabilir. Tablo uzayı kapalı olduğunda bu tablo uzayının içerisindeki nesnelere erişilemez. Bir tablo uzayı yönetim amaçlı olarak kapalı duruma alınabilir.<br />
Veri Tabanı Şema Nesneleri<br />
	Şema nesneleri mantıksal veri depolama yapıları olarak bilinir. Veritabanı üzerinde kullanıcının belirli işleri yapabilmesi için tanımlanan bu yapılar tablolar, görüntüler, sıralar, eşanlamlar, indeksler, kümeler, veritabanı bağlantıları, prosedürler, fonksiyonlar, ve paketlerdir. Bir şema ise bu nesnelerin oluşturduğu gruptur.</p>
<p>Küme(CLUSTER)<br />
	Aynı anda sorgulanan birden fazla tablonun bir arada kaydedilmesine “cluster” denir. Bu yapı, beraber sorgulanan tablolarda hız kazanmak için çok önemlidir. Örneğin “isci” tablosu ile “bolum” tablosunun(bu tabloların yapısı için SQL bölümüne bkz.) her ikisi de ortak olarak “bolum” ve “bolumno” alanlarını içermekte. Yani “isci” tablosundaki “bolum”, “bolum” tablosundaki “bolumno” alanına karşılık geliyor. Burada oluşturulacak bir cluster’da her iki tablo veritabanında yan yana getirilerek aynı veri bloğu içerisine kaydedilir.Böylece daha hızlı erişim sağlanır.<br />
İndeks(INDEX)<br />
İndeksler tablo ve cluster’lar için kullanılan veri tabanı nesneleridir. Burada amaç aranılan bir kayda daha hızlı erişimdir. Özellikle üzerinde çok arama yapılan alan veya alanlar üzerinde indeks oluşturmak çok etkilidir.  İndeks oluşturulduğunda ilgili tablonun kayıtları yer değiştirmez. Sadece ilgili kayıtların kayıt numaraları olarak adlandırılan “rowid” ‘ler alınarak sıralama yapılır.<br />
	Bir tablo üzerinde oluşturulabilecek indeks sayısı sütunların kombinasyonları farklı olduğu müddetçe sınırsızdır. Bir sütun diğer sütunlarla değişik kombinasyonlarda kullanıldığı müddetçe birden fazla indeks içerisinde yer alabilir.  Aynı sütun kombinasyonlarının indeksi, faklı indeks ismi kullanarak oluşturulmaya çalışılsa bile gerçekleştirilemez.<br />
	İndeksleme işleminin gerçekleştirilmesinde Oracle çoğunlukla B-tree indeksleme metodunu kullanır. Bunun yanında “hash cluster indexes”, “reverse key indexes”, ve “bitmap indexes” yöntemlerini de kullandığı bilinmektedir.<br />
	İndeksler mantıksal ve fiziksel olarak oluşturuldukları tablodan bağımsızdırlar. Eğer bir indeks silinirse, ilgili tablo zarar görmez, çalışmaya devam eder. Fakat indeks olmadığı için veri erişim süresi artacaktır.<br />
	Oracle bir indeks oluşturulduğunda onu otomatik olarak kullanmaya başlar ve  indeksin oluşturulduğu tablodaki silme, güncelleme ve ekleme işlemleri indekse otomatik olarak yansıtılır.<br />
Rol(ROLE)<br />
	Oracle veritabanında her nesnenin ait olduğu bir kullanıcı vardır. Bir kullanıcı bir başka kullanıcının nesneleri üzerinde işlem yapmak isterse buna hakkı olması gerekir. Bir nesne üzerinde işlem yapabilme yetkisine hak denir. Örneğin veritabanına bağlanma, tablo oluşturma, bir başkasına ait tablodan kayıt listeleme, bir başkasının prosedürünü çalıştırma birer haktır. Bu haklar kullanıcılara atanmak suretiyle kullanıcıların bu işlemeleri gerçekleştirmeleri sağlanır. Hakların kullanıcılara atanması iki şekilde olabilir. Birinci olarak  bir tabloya kayıt ekleme, kayıt silme vb. haklar bir kullanıcıya ya da kullanıcılara ayrı ayrı atanır. İkinci şekilde ise verilmek istenen haklar bir rol altında birleştirilir ve bu rol istenen kullanıcılara aktarılır.<br />
	Haklar “sistem hakları” ve “nesne hakları” olmak üzere ikiye ayrılır. Sistem hakları veritabanı ile ilgili olarak önceden tanımlanmış rollerdir. Oracle’da 60’tan fazla sistem hakkı tanımlanmıştır. Nesne hakları ise veri tabanı nesneleri üzerinde işlem yapma haklarıdır. “Create Table”, “Create TableSpace”, “Drop Any Index” gibi haklar sistem haklarına örnek olarak verilebilir.  Nesne hakları ise 8 çeşittir. “Select”, “Insert”, “Update”, “Delete”, “Alter”, “Index”, “Execute”, “References”, “All” çeşittir. “All” ayrı bir hak olarak adlandırılmaz. Diğer tüm hakları kapsar. Bu haklar sırayla kayıt seçme, kayıt güncelleme, kayıt silme, nesnelerin yapısını değiştirme, indeks oluşturma, alt program çalıştırma, yabancı anahtar tanımlayabilme işlemlerini içerirler. Rol tanımlama ve hak verme komutları ileride ayrıntılı olarak işlenecektir.<br />
Geri Alma Parçası(ROLLBACK SEGMENT)<br />
	Oracle veritabanının güvenliği açısından “Select”, “Insert”, “Update”, “Delete” gibi işlemlerin yedeğini almaktadır. Alınan bu yedeklerin konulduğu yerlere geri alma parçası denir. Kullanıcı bu tip işlemleri yaptıktan sonra	“Rollback” komutunu uygularsa, yaptığı değişiklikler geri alma parçalarından getirilir ve böylece kayıtlar eski haline dönmüş olur. Kullanıcı “Commit” komutunu verirse yaptığı değişiklikler geri alma parçalarından geri getirilemez. Her veritabanında bir ya da birkaç tane geri alma parçası olabilir.<br />
Sıra(SEQUENCE)<br />
	Tablolardaki kayıtlar için otomatik sıra numarası verilmesi isteniyorsa sıra nesnesi kullanılabilir. Bu sıra numarası veritabanı tarafından otomatik olarak üretilir.  Özellikle çok kullanıcılı ortamlarda tekil olarak numara üretilmek istendiğinde çok kullanışlıdır.  Birden fazla kullanıcı aynı anda böyle bir sayı üretmek isterse bunun program koduyla yapılması işlem hızını yavaşlatır. Çünkü bir kullanıcı diğeri işini bitirene kadar beklemek zorundadır. Sıra nesnesi bu işi otomatik olarak ve çok seri bir şekilde başarır.<br />
	Sıra numaraları Oracle’da tanımlı 38 rakama kadar tamsayılardan oluşur. Bir sıra tanımlaması sıranın adını, artan ya da azalan olacağını, iki sayı arasındaki fark miktarını içerir. Oracle tüm sıra numarası tanımlarını SYSTEM tablo uzayının içerisindeki bir veri sözlüğü tablosuna kaydeder. SYSTEM tablo uzayı sürekli çalışır durumda olduğu için tüm sıra numaraları da aktiftir. Sıra numaraları tablolardan bağımsız olarak üretilir. Yani bir sıra numarası bir ya da daha çok tablo için kullanılabilir.</p>
<p>Kayıtlı Fonksiyonlar(STORED FUNCTION) ve Kayıtlı Prosedürler(STORED PROCEDURE)<br />
	Bir grup SQL ya da PL/SQL komutunun belli bir işi gerçekleştirmek için bir araya getirilip veritabanına kaydedilmesi kayıtlı prosedürler ve fonksiyonlar sayesinde olur. Birden fazla uygulama programı içerisinde aynı işi yapan kodları sürekli yazmak yerine kayıtlı prosedür ve fonksiyonlar bir kere yazılır ve tüm uygulamalar tarafından kullanılır. SQL*Plus, Oracle Forms ya da Oracle Reports içerisinden bu prosedürler çağrılabilir. Prosedürler geriye birden fazla değer döndürebilirken, fonksiyonlar  sadece bir değer döndürürler.<br />
Eşanlam(SYNONYM)<br />
	Eşanlam bir tablo, görüntü, sıra, prosedür, fonksiyon ya da paket için “alias” olarak adlandırılan bir takma isimdir. Eşanlam bir takma isim olduğu için veri sözlüğü içerisindeki tanımının kapladığı yer haricinde, veritabanında yer kaplamaz. Eşanlamlar güvenlik ve daha rahat kod yazma amacıyla kullanılırlar. Bir eşanlam kullanıldığında ilgili nesnenin adı ve sahibi gizlenir ve SQL komutu içerisinde kullanımı kolaylaşır.<br />
	Eşanlamlar genel(Public) ve özel(Private) olarak tanımlanabilirler. “Genel” olarak tanımlanan eşanlamlara tüm veritabanı kullanıcıları erişebilir. “Özel” olarak tanımlanan eşanlamlara sadece ilgili nesnenin sahibi ve sahibi tarafından hak verilmiş bir başka kullanıcı erişebilir.<br />
	Bir nesnenin adı değiştirilmek istendiğinde ya da silinmek istendiğinde, bu nesneyi kullanan tüm uygulama programları değiştirilmek zorundadır. Oysa ki bu nesnenin bir eşanlamı oluşturulursa ve uygulama programları bu eşanlamı kullanırsa, eşanlam üzerinde yapılacak değişikliklerle bu silme vb. işlemlerden uygulama programlarının etkilenmesi önlenebilir.<br />
	Bir kullanıcı bir başka kullanıcının nesnesini kullanmak istediğinde “kullanıcı_adı.nesne_adı” şeklinde bir yazım kuralına uymak zorundadır. Eğer bir “genel” olarak bir eşanlam tanımı yapılırsa tüm kullanıcılar direk eşanlam ismini kullanarak işlemlerini gerçekleştirebilirler.<br />
Tablo(TABLE)<br />
 	İlişkisel Veri Tabanı Yönetim Sistemleri’nde veriler tablolar içerisinde yer alır. Her tablo bir isimle tanımlanır ve her biri  bir “kayıt” olarak adlandırılan satırlar ile bu kayıtlardaki verilerin özelliklerini belirleyen sütunlardan oluşur. Her tablo bir ya da daha fazla sütuna sahip olabilir. Her sütunun bir adı ve veri tipi vardır.<br />
	Bir tablo oluşturulduğunda Oracle verileri depolamak için bir tablo uzayı içerisinde bir veri segmenti ayırır. Veri segmentinin değerleri değiştirilerek bir tablo için ayrılacak yer miktarı da değiştirilebilir.<br />
Görüntü(VIEW)<br />
	Görüntü bir ya da birkaç tablodan istenilen alanların alınmasıyla oluşturulan sanal bir tablodur. Görüntü bu tablolar üzerinde gerçekleştirilen bir sorgu sonucu oluşturulur. Bir görüntü üzerinde silme, güncelleme gibi işlemler yapılamaz. Çünkü görüntü oluşturulduğu tabloların sadece o anlık görüntüsüdür ve veritabanında kendi tanımının kapladığı yer haricinde yer kaplamaz. </p>
<p>Oracle8  : Veri Tabanı Yönetim Sistemi, günümüzün dinamik çalışma grubu çevrelerinden yüksek hacimli  ‘ online transaction&#8217; ve sorgulama bazlı veri ambarı sistemlerine kadar uzanan geniş bir yelpazede en uygun, en iyi performansa ulaşmak için esnek, açık, ölçeklenebilir, bağımsız, güvenli bir ortam yaratan, Web-enabled uygulama yaratımını destekleyen ve kolay kullanılabilir yönetim araçları içeren güçlü bir veri tabanı yönetim sistemine sahiptir. Oracle VTYS, 130’dan fazla donanım üzerinde (UNISYS, IBM, DEC, HP, SUN, MAC, Sequent, PC, Mainframe&#8230;..) ve tüm işletim sistemlerinde çalışmakta, değişik  performans ihtiyaçları için tek işlemcili donanımlar’dan, Simetrik Çoklu İşlemcili sistemler üzerinde çalışabilmektedir<br />
Oracle’ın Kominikasyon Aracı, SQL*Net ürünü, client/server ve server/server Oracle veri iletişimini gerçekleştir.  SQL*Net, yagın Kullanılan Tüm İletişim Protokollerini  Destekler : TCP/IP, OS, APPLETALK, XODIAC,ve diğerleri<br />
Oracle8 VTYS’nin mimarisi yüksek performans sağlayacak bütün teknolojileri kullanmaktadır: </p>
<p>Contention-Free Queries: Oracle8 VTYS&#8217;de sorgulamalar güncelleştirmeleri ve güncelleştirmeler sorgulamaları bloke etmediği için işlemler birbirlerini beklemek zorunda kalmazlar.<br />
Paylaşımlı Derlenmiş SQL: Oracle VTYS, OLTP ortamlarda olduğu gibi çok sayıda kullanıcının aynı grup SQL cümlelerini kullandığı durumlarda bu kullanıcıların SQL cümlelerinin derlenmiş ve ortak bellekte tutulan tek bir kopyasını paylaşmalarına olanak verir. Bu shared compiled SQL yapısı sayesinde hem bellek kullanımı azalır hemde performans artar.<br />
On-line Backup/On-line Recovery: Oracle VTYS, OLTP aktivitenin en yüksek olduğu zamanlarda bile kullanıcıları etkilemeyecek şekilde on-line backup (yedekleme) ve on-line recovery (kurtarma) işlemlerini gerçekleştirebilmektedir.<br />
Otomatik Sıra Numarası Üretimi: Oracle VTYS, veri tabanında sıra numaraları üretilirken herhangi bir tablonun kilitlenmesine gerek olmadığından bu açıdan bir performans darboğazına girmemektedir.</p>
<p>Oracle, veri tabanı kaynaklarına, tablolarına ve verilerine yetkisiz ve kaçak erişimi engellemek ve denetleyebilmek ayrıca DDL komutlarının (create, select, delete vb) kullanım haklarının denetlenmesi için rol bazında güvenlik yöntemini kullanmaktadır. Bu yöntem her kullanıcının her tablo için erişim hakkının sisteme girilmesini gerekli kılan klasik yaklaşıma göre çok daha düşük maliyet getirmektedir. Oracle8 VTYS, güvenlik ve gizlilik nedeniyle erişim ve güncelleştirme için değişik şifrelerle korunma sağlamaktadır. Veri tabanı objelerine erişim yetkileri roller bazında tanımlanabilir (role-based security). Oracle8 VTYS, ANSI/ISO SQL3 güvenlik standardını desteklemektedir.</p>
<p>Rol, bir iş grubunu temsil eder. Veri tabanı kullanıcılarına daha önce tanımlanmış roller verilir. Böylece kullanıcının bulunduğu iş grupları kendisine verilen rollere bağlı olarak tanımlanmış olur. Bir role verilebilecek veri tabanı objelerine değişik erişim yetkileri verilebilir.<br />
Oracle VTYS veri tabanı bütünlüğüne (Integrity) sahiptir. Bir alan üzerinde verilebilecek kısıtlama sayısında herhangi bir limit yoktur. Oracle VTYS veri tabanı bütünlüğüne ilişkin bilgiler aşağıda verilmiştir</p>
<p>Oracle Veri Bütünlüğü Uygulatımı<br />
Oracle VTYS, veri bütünlüğü kurallarının herbirini tanımlamaya ve uygulamaya olanak sağlar. Bu kuralların büyük bir kısmı, bütünlük kısıtlamaları kullanılarak tanımlanır. Bütünlük kısıtlamaları aşağıda sunulmuştur; </p>
<p>Bütünlük Kısıtlamaları (Integrity Constraints)<br />
Bir bütünlük kısıtlaması, bir tablonun bir kolonu için bir kural tanımlamanın bildirimsel (declarative) bir yöntemidir. Bir bütünlük kısıtlaması, Oracle VTYS tarafından veri tabanının temel tablolarına geçersiz veri girişini engellemekte kullanılan bir mekanizmadır. Bütünlük kısıtlamaları, bir veri tabanındaki bilgiler ile ilgili iş kurallarını uygulatmak amacıyla tanımlanabilir. Eğer bir ifade, yürütümünün sonuçlarından herhangi biri bir bütünlük kısıtlamasını ihlal ederse, ifadeye ilişkin değişiklikler ortadan kaldırılır (rollback) ve bir hata kodu döndürülür.<br />
Veri tabanı idarecisinin ya da uygulama geliştiricisinin kolon değerlerinin girdisi üzerinde sınırlamalar koymak için kullanabileceği çeşitli veri bütünlüğü kısıtlamaları vardır.<br />
Oracle VTYS tarafından desteklenen bütünlük kısıtlamaları şunları içerir:<br />
NOT NULL Default olarak, bir tablodaki kolonların tümü &#8220;null&#8221; değere olanak verir. Yani o kolonlara veri girilmesi zorunlu değildir. Bir NOT NULL kısıtlaması, bir tablonun bir kolonundaki null değere izin verilmemesi anlamına gelir. Örneğin, A tablosundaki her kayıt için, B kolonuna, mutlaka bir değerin girilmesini gerektiren bir NOT NULL kısıtlaması tanımlanabilir.<br />
UNIQUE Anahtar Bir UNIQUE anahtar kısıtlaması, bir tablo içinde belirlenen bir kolon ya da kolon seti içinde yinelenen değerlerin olmamasını sağlar. UNIQUE anahtar kısıtlamasının tanımına dahil edilen kolon ya da kolon seti UNIQUE anahtar olarak adlandırılır. Eğer söz konusu UNIQUE anahtar kısıtlaması birden fazla kolondan oluşuyorsa, kısıtlama karma unique anahtar (composite unique key) olarak adlandırılır.<br />
BİRİNCİL (PRIMARY) Anahtar Bir veri tabanı içindeki her tablo, tek bir BİRİNCİL ANAHTAR kısıtlamasına sahip olabilir. Bir tablonun kayıtları, BİRİNCİL ANAHTAR bütünlük kısıtlaması ile yönetilen değerleri kullanarak tanımlanabilir ya da referans edilebilir. BİRİNCİL ANAHTAR&#8217;ın bütünlük kısıtlaması, Oracle VTYS uygulamalarına şunları garanti eder:<br />
Bir kolonun hiçbir iki kaydı belirlenen kolon ya da kolon seti içinde yinelenen değer içermeyecektir. Birincil anahtar kolonu/kolonları null değerlere izin vermeyecektir (yani, her kayıtta birincil anahtar kolonları için bir değer olmalıdır).<br />
YABANCI (FOREIGN) Anahtar Oracle, aşağıdakiler dahil olmak üzere referans bütünlüğü işlemleri tanımlama amacına yönelik YABANCI ANAHTAR bütünlük kısıtlaması kullanımını desteklemektedir: </p>
<p>Referans Bütünlüğü Kısıtlamaları Tarafından Tanımlanan İşlemler<br />
Referans bütünlüğü kısıtlamaları, referans verilen ana anahtar değerinin değiştirilmesi durumunda, bir alt tablo içindeki bağımlı kayıtlar üzerinde gerçekleştirilen özel işlemleri de belirler. Oracle VTYS&#8217;in YABANCI ANAHTAR bütünlük kısıtlamaları ile desteklenen referans işlemleri şunları içerir: GÜNCELLEŞTİR (UPDATE), SİLMEYİ KISITLA (DELETE RESTRICT) ve BASAMAKLI SİL (DELETE CASCADE)<br />
Basamaklı Silme (Cascading Deletes) Basamaklı silme işlemi, referans edilen ana anahtar değerlerini içeren kayıtlar silindiğinde, bağımlı yabancı anahtar değerlerine sahip alt tablolardaki tüm değerlerin de silineceğini belirtir. Örneğin, eğer ana tablodaki bir kayıt silinirse, bu kaydın ana anahtar değeri alt tablo içindeki bir ya da birden çok yabancı anahtar değeri tarafından referans alınmışsa, alt tablo içinde ana anahtar değerini referans alan kayıtlar da alt tablodan silinir. </p>
<p>Oracle8 VTYS, bir tablonun veri dağılımı ve saklama indekslere ve istatistiklere dayanarak SQL ifadeleri için otomatik olarak bir yürütme planı seçmektedir. Bu özellik, otomatik maliyet-esaslı eniyileyici (Cost-based optimizer) olarak adlandırılmaktadır. Kullanılan istatistikler arasında tablo ebatı, kolonların seçiciliği, verilerin indekslenen değerlerin etrafında fiziksel olarak kümelenme derecesi, vb. yer almaktadır. En etkin erişim yolunu seçerek, sorgulamanın performansını, sorgulama cümlesinin yazılım şeklinden (sözdiziminden) bağımsız hale getirmektedir. Tabloları birleştirme (join) ya da tablo erişim yolu gibi noktalarda eniyileyicinin kararlarını yönlendirmek için, SQL ifadeleri içinde bulunan ve kullanıcı tarafından verilen ipuçları kullanılmaktadır. Oracle8 VTYS&#8217;nin cost-based optimizer&#8217;ı istatistik oluştururken verinin uniform olduğunu farz etmemektedir.<br />
Oracle veri tabanı ailesi ilişkisel mimarinin yanı sıra, nesne yönetimli teknolojiyi de  tamamen destekleyen bir mimariye sahiptir. Endüstri eğilimi ve beklentileri sonucunda Oracle hem ilişkisel hem nesnesel mimariyi; paralellik, devamlılık güvenlik, ölçeklenebilirlik, kolay yönetilebilirlik, yüksek performans ve yeni veri tipleri ile birleştirerek bilgi çağında yarattığı devrimin yanı sıra evrensel bir yaklaşım sunmaktadır<br />
Oracle8 ORDBMS, standart veri tipleri dışında kullanıcı tarafından tanımlanmış veri tipleri kullanımına imkan vermektedir. Kullanıcı tarafından tanımlanan veri tipleri ile gerçek nesnelerin modellenmesi mümkün olmaktadır. Bu amaçla Oracle, SQL3 standartları çerçevesinde SQL diline ekler getirmektedir</p>
<p>Kompleks veri nesnelerinin modellenmesi amacıyla, Oracle8 yeni veri tipleri ile veritabanını genişletmek (user-defined veri tipleri) imkanı sunmaktadır. Bu yapı altında; Harici prosedürlerde Object veritipleri tanımlanması, Index-only tablolar, Nested tablolar, Array veri tipleri tanımlanabilmektedir.<br />
Oracle8, mevcut ilişkisel veriler üzerinde Object View’ler yaratarak, ilişkisel ve object (nesne) verilerin bir arada kullanılmasına olanak verir<br />
Hükümet ve ticari güvenlik ihtiyaçlarını karşılamak amacıyla çok seviyeli güvenlik yaklaşımını destekleyen Oracle veri tabanı ailesinin kişisel bilgisayar ihtiyaçlarına da karşılık veren aynı kernel&#8217;e sahip versiyonu mevcuttur.<br />
Ne<br />
twork Computing Architecture (NCA)&#8217;ın anahtar bileşeni olan Oracle8 Enterprise Edition, network-merkezli bilgisayım ve nesne geliştirim yöntemlerinin peformansını, güvenilirliğini ve  ölçeklenebilirliğini karşılamak üzere tasarlanmıştır. İster geleneksel şirket uygulamaları ister Web üzerinde elektronik ticaret olsun Oracle8 Enterprise Edition ve NCA; en çok gereksinim duyulan uygulamalara destek vermek üzere performans, güç, network bütünleşmesi ve esneklik sağlar. </p>
<p>Veri depolama uygulamaları, yüklü miktarda veri ile çalışan karmaşık, anlık  sorgulamalara bağlı olarak OLTP uygulamalarından daha farklı işleme tekniklerine gereksinim duyarlar. Bu özel gereksinimleri karşılamak üzere Oracle8 çok çeşitli sorgu işleme teknikleri, veri erişim yolunu seçmek üzere incelikli sorgu optimizasyonu ve paralel donanım konfigürasyonundan tam anlamıyla yararlanan ölçeklenebilir bir mimari sunmaktadır. </p>
<p>Oracle8 ile geliştiriciler ve son kullanıcılar fiziksel olarak dağıtımlı veritabanını tek bir mantıksal veritabanı olarak ele alırlar ve dağıtımlı ağ ortamındaki her türlü veriye tek bir lokal makina üzerindeymişçesine erişim sağlarlar ve verinin güncellemesini aynı kolaylıkla yerine getirirler. Üretim uygulamaları da çoklu sistemler üzerine dağıtılabilir.<br />
Personal Oracle8, Oracle8 veritabanının masaüstü sürümü olup yeni sezgisel kullanıcı arabiriminin yanı sıra ileri veri kopyalama özellikleri sunmaktadır. </p>
<p> Personal Oracle8 üzerinde geliştirilen uygulamalar yeni yapılandırmaya gerek kalmadan diğer Oracle8 platformlarında da çalışmaktadır. Personal Oracle8 istemci/sunucu uygulamalarında ideal geliştirim platformudur. P O 8  sayesinde ;<br />
Veritabanı nesnelerini yönetebilirisiniz. Tablo verisi izleyebilir ve düzenleyebilirsiniz. Uzaktaki çoklu bağlantıları yönetebilirsiniz. Otomatik veri uyumu konfigürasyonu yapabilirsiniz.  </p>
<p>Personal Oracle Lite bir megabyte bellekten daha azına sığabilen tek kullanıcılı nesne-ilişkisel veritabanıdır.. Personal Oracle Lite az yer kaplayan aygıtlarda tek kullanıcılı, küçük çaplı uygulamalar geliştirmek isteyenler için ideal bir yazılımdır.<br />
Personal Oracle Lite çalışma grupları ve şirketler için kullanılan Oracle veritabanıyla veri kopyalanmasını desteklemektedir. İstemci veritabanı altında kullabılmak üzere geliştirilmiş mükemmel bir gömülü veritabanıdır (embedded database) 1MBtan az bellekten daha azına gereksinim duyan Oracle Personal Lite hem hafif hem de çok güçlüdür. Bu sayede uygulamalar çok az bellek kaynağı gerektirirken istemci veritabanı kullanmanın avantajlarına da sahip olurlar. Personal Oracle Lite SQL nin set-tabanlı ilişkisel özelliklerinin gücünü karmaşık veri temsili birleştirir ve C++ gibi nesne-yönelimli programlama dillerinden doğrudan dolaşma (navigation) erişimine izin verir. Personal Oracle Liteın sahip olduğu bu nesne teknolojisi yeni kuşak Oracle nesne yönelimli araçların, bağlanırlığın ve sunucu ürünlerinin tamamlayacaktır. </p>
<p> Oracle ConText option, Oracle8 ilişkisel veritabanınızın bütün  gücünü kullanarak, metin bilgi kaynaklarını yapısal  verilerde olduğu kadar kolay ve hızlı kullanımına olanak veren metin yönetimidir. Haber arşivlerinden önemli Web içeriklerine kadar her tür bilgi kaynağına ulaşım ve yönetim için idealdir</p>
<p>The Oracle Video Option, kullanıcıların firma ağı üzerinden istemcilere gerçek zamanlı, tam ekran video ve yüksek kaliteli seslerin saklanması, yönetimi ve kullanımına çözüm sağlayan yazılımdır. Oracle8 Server’a opsiyon olarak Oracle Video Option geleneksel veri modelini yüksek kalitede ses ve video kullanarak geliştirir.</p>
<p>Oracle Advanced Networked Option, firma dizin hizmetleri, tek oturumla açılan hizmetler, network şifreleme, jeton ve kullanıcının biyometrik doğrulanması sayesinde tek kaynaklı bütünleşme ve Oracle8nin OSF Distributed Environmet (DCE) ile birleşimine olanak verir<br />
Oracle değişik bireysel teknolojiler kullanılarak bu tür hizmetler sağlamanın bir çok yolu olduğunun bilincindedir. Advanced Networking Option her bir hizmetin yürütülmesinde bir çok yol sunan &#8220;tabii teknoloji&#8221;dir.  Bunun sonucunda,  ağ ortamlarına ve güvenlik yazılımlarına yaptığınız yatırımları korurken, yeni teknolojileri de çıktıkça sisteminize katabilirsiniz. </p>
<p>ORACLE UYGULAMA GELİŞTİRME ARAÇLARI<br />
Oracle’ın ölçeklenir uygulama geliştirim çözümü içerisinde iki ürün grubu yer almaktadır: Oracle Designer/2000 ve Oracle Developer/2000™. designer/2000™ iş süreci yeniden yapılandırması (BPR), analiz ve tasarım diyagramcıları ile karmaşık sistemlerin modellenmesine destek verir.<br />
Developer/2000 organizasyonların iş gruplarından şirketlere, çeşitli ölçeklerde, hızlı ve üretken bir biçimde incelikli sistemler üretmelerini sağlar. Ortak bir depo, esnek modelleme ve yöntembilim desteği ve portatif açık mimari sayesinde Designer/2000 ve Developer/2000 endüstrinin tek ikinci kuşak istemci/sunucu ve geliştirim araçlarıdır.     </p>
<p>Üretkenlik<br />
Developer/2000in güçlü bildiri yeteneği kullanılarak veritabanı tanımlamalarından, tek bir kod satırı yazmadan, uygulama yaratımı gerçekleştirilebilir.<br />
İstemci/Sunucu Ölçeklenirliği<br />
Ölçkelenirlik Developer/2000 geliştiricileri için oldukça basit bir işlemdir, çünkü ürünün mimarisi içerisinde bu özellik içsel olarak  mevcuttur. Dizi getirme, veritabanı imleçleri, bağ değişkenleri, kayıt noktaları ve sıralar olarak  sunucu işlevselliği  paralel olamayan desteğinde belirtilmiştir<br />
Taşınabilir Olma<br />
Taşınabilir olma ve küresel yaygınlaştırım  Oracle ürünlerinin ticari markalarıdır.<br />
Birleşik İstemci/Sunucu Düzenleme ve Hata Ayıklama<br />
Developer/2000 uygulamalarınızın özgün hale getirilmesi sunucu nesnelerinizin değiştirilmesi kadar kolaylaşmıştır.<br />
Tam Bir GUI Desteği<br />
Developer/2000, Windows, Macintosh ve Motif üzerinde doğal bir biçimde taşınanbilir uygulamalar ve character mode sağlar.<br />
Model Yöneltimli Geliştirim<br />
Geliştiriciler depo tanımlamalarından tam bir Developer/2000 uygulamasını gerçekleştririken Designer/2000 kullanmayı seçebilirler. Herhangi bir başka ürünle bu kadar karmaşık, belgelenmiş, standart hale getirilmiş, serbest kullanımlı uygulamalar yaratmanıza olanak yoktur.<br />
Kolay Bütünleşme<br />
Uygulamalarınızın becerilerini genişleten açık mimari sayesinde Developer/2000 esneklik garantisi vermektedir.<br />
Takım Geliştirimi<br />
Developer/2000 uygulamalarınız, uygulama mantığı ve kullanıcı arabirim nesnelerini paylaşabilmekte, bu sayede size takım geliştirim standartlarını tanımlama ve güçlendirme ve uygulama nesnelerini ya da kodunu bir anda yeniden kullanma olanağı vermektedir.<br />
Türdeş Olmayan Veri Erişimi<br />
Developer/2000 yalnızca güçlü  Oracle8 veritabanı becerilerini kullanmak üzere değil aynı zamanda formatı ve konumu ne olursa olsun organizasyonunuz içerisindeki tüm veriye erişim sağlamak üzere tasarlanmıştır.  DB/2, SQL Server, DB2/400, Access ve RDB dahil olmak üzere seçiminizin gerektirdiği veri kaynakları ile iletişim kurmak üzere Open Client Adapter™, Oracle Open Gateway™ teknoloji ya da uygulama programlama arabirimler (API’ler) kullanır.<br />
Bunun yanısıra;<br />
İlişkendirilmiş veritabalarındaki verileri yönetilen bilgilere dönüştürmeyi mümkün kılıyor. Oracle Express in güçlü olanaklarıyla doğan Discoverer, kullanıcıların tek kaynaktan tüm olası iş araçlarına ulaşmasını sağlıyor. Discoverer ın predictive query governer (tahmini sorgulama yönetimi) özelliği, bir sorgulamanın sonuçlanmasının ne kadar süreceğini bildiriyor ve sorgulamanın tamamlanması kararını kullanıcıya bırakıyor. Bu özellik, sistemi yavaşlatan çok uzun süreli taramalardan tasarruf sağlıyor.<br />
Web yayınlama özelliği sayesinde  kullanıcılar Oracle discoverer dan son raporları Web üzerinde yayınlama olanağı buluyor. Bu sayede organizasyon içinde çok fazla kişinin standart Web tarayıcısı kullanarak sonuçlara ulaşmasını sağlıyor. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.genelbilge.com/oracle-urunleri.html/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Seri Porttan Veri Gönderimi Nasıl Yapılır</title>
		<link>http://www.genelbilge.com/seri-porttan-veri-gonderimi-nasil-yapilir.html/</link>
		<comments>http://www.genelbilge.com/seri-porttan-veri-gonderimi-nasil-yapilir.html/#comments</comments>
		<pubDate>Fri, 20 Nov 2009 18:32:43 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		<br />
<b>Warning</b>:  Invalid argument supplied for foreach() in <b>/home/genelbil/public_html/wp-content/plugins/autometa/autometa.php</b> on line <b>300</b><br />
		<category><![CDATA[Bilgisayar]]></category>
		<category><![CDATA[Programlama]]></category>
		<category><![CDATA[Baud Rate]]></category>
		<category><![CDATA[Belli]]></category>
		<category><![CDATA[Biri]]></category>
		<category><![CDATA[Bit Rate]]></category>
		<category><![CDATA[Biten]]></category>
		<category><![CDATA[Byte]]></category>
		<category><![CDATA[Fiber Optik]]></category>
		<category><![CDATA[Kendi]]></category>
		<category><![CDATA[Lsb]]></category>
		<category><![CDATA[Rs 232]]></category>
		<category><![CDATA[Telli]]></category>
		<category><![CDATA[Ucuz]]></category>
		<category><![CDATA[Veri]]></category>
		<category><![CDATA[Veya]]></category>
		<category><![CDATA[Ya]]></category>
		<category><![CDATA[Yeni Bir]]></category>

	<!-- AutoMeta Start -->
	<!-- AutoMeta End -->
	
		<guid isPermaLink="false">http://www.genelbilge.com/?p=11926</guid>
		<description><![CDATA[LİNK İki bilgisayar arasındaki link, fiziksel olarak , bir takım teller veya başka bir ortamla, bunların bilgisayara bağlanmasını sağlayan bir arabirimden oluşur. Çoğu linklerde ucuz, sarılmış iki telli bakır kablolar kullanılır. Tellerden biri veri iletimi, diğeri de toprak içindir. Bir diğer seçenek fiber-optik kablodur. Bunlarda veri, ışığın varlığı ve yokluğuna göre kodlanmıştır. Seri bir linkteki [...]]]></description>
			<content:encoded><![CDATA[<p>LİNK<br />
    İki bilgisayar arasındaki link,  fiziksel olarak , bir takım teller veya  başka bir ortamla, bunların bilgisayara bağlanmasını  sağlayan bir arabirimden oluşur. Çoğu  linklerde ucuz, sarılmış iki telli bakır kablolar kullanılır. Tellerden biri  veri iletimi,  diğeri de  toprak  içindir. Bir diğer seçenek fiber-optik kablodur. Bunlarda veri, ışığın varlığı ve yokluğuna göre kodlanmıştır.<br />
    Seri bir linkteki verici veya sürücü, belli bir anda bir bit olmak üzere bitleri sırayla yollar.<br />
ASENKRON İLETİM<br />
    Linkte saat hattı olmaz. Çünkü  her uç kendi sinyalini sunmaktadır. Ancak uçların saat frekanslarında anlaşmaları ve saatlerin de uyumlu olmaları gerekir. İletilen her byte’ta  saatleri eşlemek üzere bir start biti ve iletimin bittiğini bildirmek üzere bir veya daha fazla stop biti bulunur.<br />
     PC’lerdeki  RS-232  portlar modemlerle ve diğer cihazlarla iletişimde asenkron formatları kullanır. Bunlar arasında senkron veri transferi de yapabilirler.<span id="more-11926"></span><br />
     Bir asenkron  transfer  çeşitli formatlarda olabilir. Bunların en yaygını 8-N-1’dir.Bu formatta gönderici cihaz her bir byte’ı ,1 adet start bitini takiben 0 nolu bitten(LSB)başlayarak 8 veri biti ve 1 adet stop biti olarak yollar.<br />
     Çoğu seri port 5 ile 8 arasındaki  veri bitlerinden birini ve bir parite bitini destekleyebilmektedir.<br />
     Bir linkin bit hızı(bit rate), birim zamanda iletilen bit sayısıdır(bps). Baud  hızı (baud rate), saniyedeki veri geçişini ya da mümkün olayların sayısını anlatır. Bir çok linkte ikisi de aynı anlama gelir. Çünkü böyle linklerde  her bir geçiş periyodu  yeni bir biti  temsil eder.<br />
     Start bitiyle başlayıp stop bitiyle biten aralıktaki değere word  denir. Word  içindeki veri bitleri  bir karakter tanımlarlar. Bunlar, kimi linklerde metin (harf ya da rakam) karakterilerini<br />
Temsil ederken ,diğer linklerde metin karekterleriyle hiç  ilgisi olmayan ikili(binary) değerleri temsil ederler. Transfer edilen   karakter sayısı, bit  hızıyla  worddeki bitlerin sayısına eşittir. Her  iletilen  byte’a bir start bir de stop biti eklemek iletim süresini %25 artırır.(çünkü word’de bu iki bitle birlikte 10 bit bulunur.)8-N-1 formatında bir byte’ın iletim süresi bitin iletim süresinin 1/10 ‘u dur. Yani 9600 bps hızda, saniyede 960 byte iletilebilmektedir.<br />
VERİ KAYBININ ENGELLENMESİ<br />
     Seri linklerdeki bilgisayarlar  veri almayı  beklemek dışında işlerde yaparlar .Alıcı meşgulken iletimde bulunmak istemesi pek ala mümkündür. Bir linkte her alıcının gönderilen veriyi görebilmesi ve verinin de hatasız iletilmesi gerekir. Bunu sağlamanın çeşitli yolları vardır .El sıkışma  yolu da bunlardan biridir.<br />
El Sıkışma: El sıkışma  sinyalleri ile vericiler veri göndermeye, alıcılar ise almaya hazır olduklarını belirtirler.<br />
     El sıkışma seçenekleri;<br />
     RTS’ye set edilirse, iletime hazır olduğu zaman belirlemek için CTS’yi  gönderime  hazır olduğu zamanı başka  bir düğüme bildirmek için RTS’yi kullanır.<br />
     RTS false iken diğer ucun gönderimi sona erdirmesi gerekir. CTS ve RTS donanım el sıkışmalarıdır. Xon /Xoff yazılım el sıkışmalarıdır. Alınan bir Xoff karakter bir Xon  olana kadar gönderime aravermesine sebep olur.<br />
SİNYALLER<br />
     PC&#8217;nin seri portunda ve diğer birçok arabirimde kullanılan dokuz sinyal:</p>
<p>Pin(9-pin)    	Pin(25-pin) 	Signal 	Source 	Type 	Description<br />
1 	8 	CD 	DCE 	Control 	Carrier  detect<br />
2 	3 	RD 	DCE 	data 	Received data<br />
3 	2 	TD 	DTE 	data 	Transmitted data<br />
4 	20 	DTR 	DTE 	control 	Data terminal ready<br />
5 	7 	GND 	- 	- 	Signal ground<br />
6 	6 	DSR 	DCE 	control 	Data set ready<br />
7 	4 	RTS 	DTE 	control 	Reguest to send<br />
8 	5 	CTS 	DCE 	control 	Clear to  send<br />
9 	22 	RI 	DCE 	control 	Ring Indicator<br />
- 	1, 9-19, 21, 23-25 	unused	- 	- 	-<br />
Cross Bağlama: İki bilgisayarı seri portlarından bağlarken kablolar cross bağlanmalıdır. Cross bağlarken seri portun birinin alan pini(received data) diğerinin gönderen(transmitted data) pinine karşılık gelecek şekilde bağlanmalıdır. Groundları(toprakları)ortak bağlanır.CTS ve RTS sinyallerini biz projemizde kullanmadık.Çünkü iki bilgisayar haberleşirken bu sinyallere gerek yoktur. Bilgisayar ile diğer bir araç haberleşirken kullanılması gerekir.</p>
<p>DTE ve DCE<br />
     Standart, terminal ucuna veri terminal ekipmanı, DTE adını vermiştir. Modem ucu ise veri devre tamamlama ekipmanı, DCE(Data Circuit-terminating Equipment) olarak adlandırılmıştır.      Linkteki hangi cihazın DTE hangisinin DCE olduğu önemsizdir. İkisinin birden olması önemlidir.Tip, konnektördeki sinyallerin hangisinin giriş hangisinin çıkış olduğunu belirler.<br />
       TD(Transmit Data), bir DTE’de  çıkışken, bir DCE’de giriş olur. RD(Receive Data ) bir DTE’de giriş bir DCE’ de çıkıştır.<br />
        PC seri portları (istisnalar kaideyi bozmaz) DTE olarak yapılanmıştır. Modem  seri portları ise DCE olarak belirlenmiştir. Çevre birimlerinin büyük çoğunluğu da DCE grubundadır.<br />
2 yollu iletişimin zorunlu 3 sinyali vardır:<br />
        TD : Veriyi DTE’den DCE’ ye taşır.TX  ya da TXD de denilmektedir.<br />
        RD:  Veriyi DCE’ den  DTE’ye taşır.(RX yada RXD)<br />
        SG:  Toprak sinyali, (GND veya SGND)<br />
        Bunlar dışındaki sinyaller seçimlik kontrol sinyalleridir ve bir cihazın iletişim anındaki durumuyla veya telefon hattındaki taşıyıcı  sinyalin ya da zil sinyalinin mevcudiyetiyle ilgilidir.<br />
        İki çift el sıkışma sinyali vardır: DTR/DSR ile RTS/CTS<br />
       DTR True iken veri terminali hazırdır. Kontrol eden cihaz,sinyali true yapmak için hattı yükseltir. DTR  false iken veri terminali hazır değildir. Sinyali False yapmak için,hat kontrol cihazı tarafından alçaltılır.<br />
         DTE-terminal<br />
         DCE-modem<br />
       DTR/DSR el sıkışma sinyalleri modeme ulaşan telefon hattının yada diğer bir iletişim  kanalının  durumu hakkında bilgi verme amacını taşır. Terminal DTR’yi yükselterek modemi iletişim kanalına bağlanmaya çağırır. Buna karşılık modem de DSR’yi yükselterek bağlandığını bildirir. Modem kanala girmediyse yada bir hata  varsa, DSR sinyali false olur.<br />
        Terminal RI zil sinyaline karşılık olarak da DTR’yi yükseltir ve modemin çağrıyı yanıtlamasını isteyebilir. Bazı linklerde DTR ve DSR cihazların açılmasıyla yükseltilir. Böylece cihazlar birbirlerinin durumlarından haberdar olurlar.<br />
        RTS/CTS ise cihazların veri almaya  hazır olup olmadıklarına ilişkin ek bilgiler içeren el sıkışma sinyalleridir.2 yaygın kullanımları vardır:<br />
       1. Bu sinyal çifti tam el sıkışma sağlarlar. Terminal veri göndermeye hazır olduğu zaman RTS (gönderme talebi) yollar. Buna karşılık modem almaya hazır olduğunu gösteren CTS(gönderime açık) sinyalini yollar. İletişim sona erdiğinde terminal RTS’yi düşürür. Modem aldığı veriyi işlemesinin ardından CTS’yi düşürerek bir sonraki RTS’ye yanıt vermeye hazır olduğunu belirtir. RTS,False ise terminal yeni gönderim için RTS’yi yükseltmeden önce CTS’nin  False olmasını beklemek durumundadır .Yarı çift yönlü bir linkte,modem  yalnızca RTS’nin false olması halinde veri gönderebilir.<br />
        2. Cihazlar veri göndermeye hazır olduklarını bildirmek üzere çıkışlarını  serbest  bir şekilde kullanırlar. CTS’nin  işlevi aynıdır: DCE’nin veri almaya hazır olduğunu gösterir. RTS farklıdır: DTE’nin alıma hazır olduğunu belirtir. Uçlar gönderime başlamadan önce birbirlerinin sinyallerine bakarlar.(kullanılan budur.)<br />
        CD (taşıyıcı algılandı) sinyali; Modem telefon hattından beklediği frekansta bir sinyal algıladığı zaman CD’yi yükselterek uzaktaki modemle bağlantının kurulduğunu belirtir.<br />
        Tüm sinyaller tarafından kullanılan toprak sinyali SG&#8217;dir.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.genelbilge.com/seri-porttan-veri-gonderimi-nasil-yapilir.html/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Visual Basic Detaylı Anlatım</title>
		<link>http://www.genelbilge.com/visual-basic-detayli-anlatim.html/</link>
		<comments>http://www.genelbilge.com/visual-basic-detayli-anlatim.html/#comments</comments>
		<pubDate>Fri, 20 Nov 2009 17:04:34 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Bilgisayar]]></category>
		<category><![CDATA[Programlama]]></category>
		<category><![CDATA[Visual Basic]]></category>
		<category><![CDATA[Bile]]></category>
		<category><![CDATA[Bunda]]></category>
		<category><![CDATA[Dil]]></category>
		<category><![CDATA[Haline]]></category>
		<category><![CDATA[Hep]]></category>
		<category><![CDATA[Ilk]]></category>
		<category><![CDATA[Kabul]]></category>
		<category><![CDATA[Programlama Dili]]></category>
		<category><![CDATA[Standard Exe]]></category>
		<category><![CDATA[Visual Basic 6]]></category>
		<category><![CDATA[Visual Basic Programlama]]></category>
		<category><![CDATA[Yeni]]></category>
		<category><![CDATA[Zaman]]></category>

	<!-- AutoMeta Start -->
	<category></category>
	<!-- AutoMeta End -->
	
		<guid isPermaLink="false">http://www.genelbilge.com/?p=11902</guid>
		<description><![CDATA[ÖNSÖZ Çıktığı günden beri büyük beğeni toplayan ve programcılığı zevke dönüştüren Visual Basic programlama dili,programcılık korkulacak,sıkıcı bir iş olmaktan çıkıp herkesin ilgisi haline gelmiştir. Bunda Visual Basic dilinin katkısı azımsanamayacak kadar çoktur. Visual Basic hem Basic dilinin getirdiği kolaylığı hem de Windows ortamının getirdiği görselliği en üst seviyede programcıya sunabilmektedir. Eskiden Basic dili ile başlangıç [...]]]></description>
			<content:encoded><![CDATA[<p>ÖNSÖZ<br />
Çıktığı günden beri büyük beğeni toplayan ve programcılığı zevke dönüştüren Visual Basic programlama dili,programcılık korkulacak,sıkıcı bir iş olmaktan çıkıp herkesin ilgisi haline gelmiştir. Bunda Visual Basic dilinin katkısı azımsanamayacak kadar çoktur. Visual Basic hem Basic dilinin getirdiği kolaylığı hem de Windows ortamının getirdiği görselliği en üst seviyede programcıya sunabilmektedir. Eskiden Basic dili ile başlangıç olarak kabul edilir ancak ciddi denebilecek hiçbir uygulama Basic dili ile yazılamazdı. Halbuki Visual Basic hem başlangıç seviyesinde bir dil olma özelliğini korurken hem de en profosyonel uygulamaları bile geliştirebilecek kapasitede bir dildir. Günümüzde Visual Basic ile yapılmış bir çok modern uygulama görebilir ve kendiniz de kolayca yapabilirsiniz.<br />
Windows ‘un Visual Basic Programlama yapısının programlamaya getirdiği yeni boyut programlama dillerinin monotonluktan kurtarmış ve her versiyonda büyük yeniliklerin ve kolaylıkların programlama dilleri içerisinde yer almasına sebep olmuştur. Visual Basic in ilk versiyonu ile bugün ulaştığı (Visual Basic Pro 6.0)  versiyonu arasında gerçekten çok büyük bir gelişme yaşanmıştır ve uzun bir süre yenilik ve kolaylıkların <span id="more-11902"></span>devam edeceği de görülmektedir. Eskiden kullanılan programlama dilinin versiyonu önem taşımazdı, ancak şimdi her versiyonda büyük yenilikler yaşanmakta ve programcı haklı olarak hep en son versiyonla program yapma isteği duymaktadır.</p>
<p>Visual BASİC 6.0 PROJE TASARIM PENCERESİNE<br />
BAKIŞ<br />
Visual BASIC 6.0 açıldığı zaman karşınıza Şekil 1.1’de görülen ekran görüntüsü gelecektir.</p>
<p>Şekil 1.1 –Visual Basic açılış ekranı</p>
<p>Örnekler Standard EXE projeleri ile oluşturulacaktır. Visual basıc tasarım penceresi açıldığında göze ilk çarpan önemli özellik tasarım ortamının MDI modunda açılmasıdır.(Şekil 1.2) </p>
<p>5</p>
<p>Şekil 1.2 Visual BASIC 6.0 Proje Tasarım Penceresi</p>
<p>MENÜ SATIRI:  11 adet ana menü başlığı ve herbirinin alt menülerini içerir. Visual BASIC ortamında proje(yazılım) geliştirirken yararlanılabilecek çeşitli fonksiyonları vardır.</p>
<p>KONTROL NESNELERİ: Visual BASIC ortamına önceden yerleştirilmiş neslerdir. Bu kontrollerden gerekli olanları form üzerine taşınır ve yazılım icrası esnasında istenilen fonksiyonları yerine getirebilmeleri için bu kontrollere bağlı bilgisayar programları(kodlarcodes) da oluşturulur.</p>
<p>FORM: Visual basıc pojesinin temel nesnesidir. Proje ile ilşkili tüm nesneler form üzerine yerleştirilir. Bir projede, gerekiyorsa birden fazla form da bulunabilir.</p>
<p>PROJECT: O anda aktif formla ilişkili olarak bazı  işlevleri yerine getirir. Pencere başlığının hemen altında iki guruba ayrılmış üç buton bulunur. Bunlardan View  code butonu seçilirse  , o<br />
esnada aktif olan nesneye bağlı olarak oluşturulmuş bilgisayar programı(kodu) görüntülenir.<br />
View Object  butonu seçilirse de, bu durumda tasarım aşamasında o an için seçilmiş olan nesne x<br />
görüntülenecektir.<br />
Tolggle Folders  butonu ile ise proje içinde kullanılan genel  maksatlı modüller, ormlar, ınıflar ve kaynak dosyaları gibi proje bileşenleri bir dizin mantığı içinde ayrıntılı veya toplu halde görüntülenir.</p>
<p>ÖZELLİKLER : o anda aktif durumdaki (seçilmiş) Visual BASIC kontrolünün tüm özellikleri görüntülenir.<br />
IMMEDIATE: breake modda (tasarım ortamında program akışının kesilmesi) otomatik olarak boş olarak açılır.Debug,reset ve  komut satırındaki işlemler uygulanabilir veya program akışını kalındığı yerden devam edilebir.<br />
LAYOUT:  Formların ekrandaki pozisyonlarını mouse yardımı ile ayarlanabilir.</p>
<p>MENÜ SATIRI<br />
FİLE(DOSYA) MENÜSÜ:<br />
Şekil 1.3’deki alt menülerden oluşur.</p>
<p>EDİT  MENÜSÜ</p>
<p>VİEW MENÜSÜ</p>
<p>PROJECT MENÜSÜ</p>
<p>FORMAT MENÜSÜ</p>
<p>DEBUG MENÜSÜ</p>
<p>TOOLS MENÜSÜ</p>
<p>ADD-INS MENÜSÜ</p>
<p>WİNDOW MENÜSÜ</p>
<p>HELP MENÜSÜ</p>
<p>Visual Basic (Bölüm-2) PROJELER VE BİLEŞENLERİ<br />
Visual Basic’te bir uygulama geliştirmek proje denilen yapı içerisinde gerçekleştirilir. O halde yeni uygulama  yeni bir proje oluşturmayı gerekli kılacaktır. Bir Visual BASİC Projesi,formlar,Formlar üzerine yerleştirlen kontrol nesneleri, nesnelere bağlı kodlar (event procedures-olay prosedürleri) ile bağımsız modüllerden oluşur. Visual BASİC ‘te proje dosyalarının uzantıları .max ya da . vbp şeklindedir. </p>
<p>		Şekil 2.1’-Başlangıç Penceresi</p>
<p>Şekil 2.1’de görülen başlık satırı o anda aktif olan projenin adını göstermektedir.<br />
Menü Satırı:  11 adet ana menü başlığı ve herbirinin alt menülerini içerir. Visual BASIC ortamında proje(yazılım) geliştirirken yararlanılabilecek çeşitli fonksiyonları vardır.<br />
Araçlar Satırı: Menü içerisinde yer alan bazı işlemleri kullanıcının daha hızlı gerçekleştirebilmesi için kullanabileceği ikonları içerir.  Bu ikonlardan herhangi biri üzerine götütürseniz mouse’yi bu ikonun gerçekleştireceği menü seçeneğinin ne olduğunu görebilirsiniz.</p>
<p>Özellikler Penceresi:O esnada ilgi odağı olan (seçilmiş, aktif)nesneye ait özellikler ve o andaki değerlerini listeler. Ekranda bu pencere yoksa View/Properties Window menü adımları ile çağırılabilir.<br />
Proje Penceresi: o esnada aktif durumda olan proje ile ilişkili dosyaların listesini görüntüler. Bu dosyalar , projeye ait nesneler (form, kontroller vb) ya da bağımsız modüllere ait dosyalardır. Proje penceresi o esnada yoksa  View/Properties Explorer menü adımları ile çağırılabilir.<br />
Araçlar kutusu:Visual BASİC uygulamasını geliştirirken oluşturduğunuz projede kullanabileceğiniz Visual BASİC kontrol nesnelerini içermektedir. Eğer yoksa view /Toolbox menü adımları ile onu ekrana getirebilirsiniz. </p>
<p>ÖZELLİKLER PENCERESİ<br />
Özellikler: penceresi, o esnada ilgi odağı olan (seçilmiş,aktif) nesnenin sahip olduğu özellikleri ve bu özelliklerin o andaki değerlerini görüntüler. Özellikler penceresini View /Properties Window menü yolu ile ya da F4  tuşuna basarak ekrana getirmek mümkündür.<br />
Aşağıdaki özellikler penceresinin başlığı Form1’dir. Form1 başlık satırının bir alt satırında ise Form1 Form ibaresi görülmektedir.Bunun anlamı başlıklı nesnenin Form türünde bir nesne olduğudur. Özellikler penceresi bir kontrolün özelliklerini iki farklı diziliş sırasında listeleyebilir. Bunlardan ilki Alphabetic seçeneğidir. Adındanda anlaşılacağı gibi penceredeki özellikleri alfabetik olarak takip etme imkanı sağlar Categorized seçeneği ise özellikleri, Appearance (görünüş) behavior (davranış),DDE,FONT vb. bazı ortak gruplar altında listelemek için kullanılır.Özellikler penceresine dikkat edilirse, iki sütuna sahip olduğunu  göreceksiniz. Bu sütunlardan soldaki özelliklerin adlarını (Caption, name, height vb), sağdaki ise bu özelliklerin o esnada sahip olduğu değerleri göstermektedir.<br />
PROPERTİES (ÖZELLİKLER PENCERESİ)</p>
<p>BİR ÖRNEK PROGRAM<br />
Visual Basic’in form penceresini Run ettiğimizde form penceresini mouse ile her tıkladığımızda “Halk Eğitimi Merkezi”yazıp bir alt satırına ‘Mouse’u iki kez tıklatın” yazmasını istiyorsak yapılacak işlem şunlardır.<br />
1-Basit bir kod, bir procedure örneği oluşturalım .Form üzerindeyken Mouse’yi iki kez tıkla-tınız.Karşınıza Project isimli bir pencere gelecektir.Load yazan yerin (Proc kutusu)ok İşa-retini tıklatın ve oradakiDblClickseçeneğini seçip işlem satırına yazarız. Aşağıda olduğu gibi<br />
2-Run menüsünden Start’ı seçerek kodu(projeyi)çalıştırınız.<br />
3-Şimdi, ekran göstergesi form üzerinde iken, mouse sol tuşunu iki kez tıklatınız. </p>
<p>KONTROL NESNELERİ</p>
<p>Geliştirilen uygulamanın kullanıcı açısından kolay kullanılır ve sempatik görünümde olabilmesi için, kullanıcının uygulama ile karşı karşıya kalacağı diyalog pencerelerinin özenle tasarlanması gerekir.Kontrol nesneleri, standart kontroller ve dışardan eklenen kontroller olarak iki gruba ayrılabilir.<br />
Standart kontrol nesneleri, Visual Basic’in yüklenmesi ile hemen kullanılabilecek olan kontrol nesneleridir.<br />
Dışardan eklenen kontroller ise, standart nesnelerin sağladığı imkanların ötesine geçebilen, Microsoft firmasınca yada  başka şirketler tarafından üretilmiş ve Visual Basic uygulamasına sonradan herhangi bir zamanda eklenebilecek nesnelerdir.<br />
Her iki tip kontrol nesnesinin de müşterek özelliği, daha önceden kendilerine yüklenmiş belirli özelliklere sahip olmalarıdır.<br />
FORM ÜZERİNE KONTROL NESNELERİNİ YERLEŞTİRMEK<br />
Form üzerine kontrol nesneleri yerleştirmek, oldukça kolay olarak gerçekleştirilen bir işlemdir. Aşağıdaki şekilde gerçekleştirilir.<br />
1)Form üzerine yerleşitirilecek olan kontrol nesnesi, mouse-click (sol tuşu bir kez tıklatma)işlemi ile araç kutusundan(Toolbox)seçilir.</p>
<p>2)Mouse yardımı ile, ekran göstergesi form üzerine getirilir. Mouse sol tuşu basılı tutularak mouse hareket ettirilerek kontrol nesnesinin form üzerinde arzu edilen büyüklüğe erişmesi sağlanır. Sonra mouse sol tuşu serbest bırakılır.<br />
STANDART KONTROL NESNELERİ VE İŞLEVLERİ</p>
<p> 	GÖSTERGE</p>
<p>Form üzerine aktarılıp görüntülenemeyen yegane kontrol nesnesidir. Form üzerine çizilmiş bir kontrol nesnesinin boyutunu değiştirmek veya bu kontrol nesnesini hareket ettirmek gerektiği zaman yararlanılır.<br />
 	RESİM KUTUSU (PİCTURE BOX)</p>
<p>Resim kutusu nesnesi yardımı ile form üzerinde grafikleri görüntülemek mümkündür. Ayrıca, diskinizin herhangi bir dizini içinden çağıracağınız bir bitmap, ikon(icon) ,bir resimde yükleyebilirsiniz</p>
<p> 	ETİKET(LABEL)</p>
<p>Etiket kontrol nesnesi, kullanıcı tarafından değiştirilemeyecek bir metni görüntülemek ya da icra esnasında uygulama tarafından değiştirilemeyecek bir metni görüntülemek amacı ile kullanılabilir.</p>
<p>  METİN KUTUSU(TEXT BOX)</p>
<p>Metin kutusu kontrol nesnesi iki ayrı amaç için kullanılabilir<br />
1)Kullanıcı tarafından, uygulamanın icrası esnasında, bilgi girişi amacı ile<br />
2)Uygulama tarafından üretilen bilgilerin ekranda, form üzerinde görüntülenmesi amacı ile<br />
Metin kutusunun Properties penceresinde Multiline özelliği True haline getirilmelidir. </p>
<p>   ÇERÇEVE (FRAME)</p>
<p>Çerçeve nesnesi, form üzerine yerleştirilecek kontroller için görsel ve fonksiyonel anlamda bir grup oluşturma imkanı sağlar. Bu anlamda, çerçeve içine alınan kontroller, diğerlerinden kolayca ayırdedilirler. </p>
<p> 	KOMUT BUTONU(COMMAND BUTTON)</p>
<p>Komut butonu, kullanıcı tarafından seçildiği zaman, belirli bir işlemi yerine getirir. Bu işlem, kendisine bu olaya bağlı olarak yüklenmiş olan kod ile gerçekleştirilir. Komut butonu mouse yardımı ile bir kez tıklatma(click)işlemi gerçekleştirilebilir. Çeşitli diyalog pencerelerinde karşımıza çıkan  OK ve CANCEL butonları komut butonlarına örnektir.</p>
<p>   KONTROL KUTUSU (CHECK BOX) </p>
<p>Kontrol kutusu, açma ya da kapama gibi ya da seçme ve iptal gibi ikili bir kontrole ihtiyaç duyulan uygulamalarda kullanılır. Kullanıcı , belirtilen seçeneği seçerse, kutu içinde bir işaret sembolü görüntülenir. Kullanıcıya Evet/Hayır gibi seçenekler vermek için kullanılır.</p>
<p> 	OPSİYON BUTONU(OPTİON BUTTON)</p>
<p>Option butonları bir grup halinde kullanılırlar. Bu grup içersinde, her buton bir seçeneği temsil eder. Kullanıcı seçtiği seçeneği, ilgili opsiyon butonunu işaretleyerek belirtir. </p>
<p>   KOMBİNE KUTU (COMBO BOX)</p>
<p>Bir kombine kutu, metin kutusu(text box) ve liste kutusunun (list box) özelliklerini bir araya toplar. Örneğin, kullanıcı metin kutusu gibi içine metin yazabilir ya da liste kutusu gibi, kutu içine yerleştirilmiş isimlerden istediklerini seçebilir.</p>
<p>   LİSTE KUTUSU (LİST BOX) </p>
<p>Liste kutusu, kullanıcının içinden bir ya da daha fazla isim seçebileceği bir liste içerir. Listeye yeni isimler eklenebilir ya da listedeki bazı isimler çıkartılabilir. Örneğin, bir liste kutusu ile çeşitli ülke isimlerini listeleyebilirsiniz Kullanıcı bir isim seçince, o ülke isimlerini listeleyebilirsiniz. Kullanıcı bir isim seçince, o ülkenin özellikleri listelenebilir.</p>
<p>   YATAY KAYDIRMA ÇUBUKLARI(HORİZONTAL SCROLL BARS)</p>
<p>Kullanıcıya, listeler içinde veya büyük miktarda bilgi boyunca yatay hareket imkanı sağlar. Bu anlamda, bir fonksiyonun değerlerinin görüntülenmesini, bir yatay hareket çubuğunun hareketi ile ilişkili olarak gerçekleştirebilirsiniz.</p>
<p>   DÜŞEY HAREKET ÇUBUKLARI(VERTİCAL SCROLL BARS)</p>
<p>Düşey hareket çubukları, yatay hareket çubukları için söylenen işlemleri düşey olarak gerçekleştirirler.</p>
<p>  ZAMANLAYICI (TİMER)</p>
<p>Uygulamanın çalışması esnasında, zamana bağlı olarak belirli aralıklarla, belirli eylemlerin gerçekleşmesini denetlemek amacı ile kullanılır.</p>
<p>   SÜRÜCÜ LİSTELEME KUTUSU</p>
<p>İcra esnasında, geçerli sürücülerin bir listesini sunmak ve sürücüler arasında geçiş yapmak amacı ile kullanılır . Sürücü listeleme kutusu, bir dosyayı belleğe yüklemek (açmak-open)amacı ile oluşturulan bir diyalog penceresinin bir parçası olarak kullanılabilir.</p>
<p>    DİZİN LİSTELEME kutusu(DİRECTORY LİST BOX)</p>
<p>İcra esnasında, aktif durumdaki sürücünün yolunu(path)ve dizinlerini (Directories)görüntüler.  Bu kontrol nesnesi, kök dizinden (root directory) seçilmiş bir yolu izleyerek hiyerarşik olarak<br />
dizin listesini görüntületmek amacı ile kullanılabilir. Aynı zamanda doğal olarak bir dosya açma diyalog penceresinin bir parçası olarak ta kullanılabilir.</p>
<p>   DOSYA LİSTELEME KUTUSU (FİLE LIST BOX)</p>
<p>Verilen bir dizin içindeki tüm dosyaları listeler. Kullanıcı, listelenmiş dosyalar içinden bir dosya seçebilir. Bu kontrol nesnesi de, bir dosya açma diyalog penceresinin bir parçası olarak kullanılabilir.</p>
<p>   ŞEKİL (SHAPE)</p>
<p>Tasarım (desing)zamanında görünür olan bir kontrol nesnesidir. Tasarım esnasında, form üzerine , kare,daire,elips,dikdörtgen gibi şekilleri yerleştirmek amacı ile kullanılır.</p>
<p>    ÇİZGİ(LİNE)</p>
<p>Çizgi kontrol nesnesi, tasarım esnasında, form üzerine yatay, düşey ya da eğik çizgi yerleştirmek amacı ile kullanılır.  Çizgi kontrol nesnesi formu parçalara ayırmak amacı ile kullanılabilir.</p>
<p>   GÖRÜNTÜ (IMAGE )</p>
<p>Bir resmi görüntüleyebilen grafik tipte bir kontrol nesnesidir. Bu açıdan resim kutusuna (picture box) benzer. Fakat, resim kutusuna oranla daha az sistem kaynağı kullanılır. Mouse ile clicklendiği zaman, komut butonuna benzer özellik gösterir. Örneğin bir firma, firmanın logosunu görüntü nesnesi içine yerleştirerek, resim üzerine mouse ile click işlemi gerçek-leştirildiğinde firma hakkında bazı bilgiler listeleyen bir tanıtım yazılımı oluşturabilir. </p>
<p>   VERİYE ERİŞİM (DATA ACCESS)</p>
<p>Sistemde mevcut olan veri tabanlarına erişerek, bilgi güncelleme, edit ya da bilgi görüntüleme işlemlerinin yapılabilmesine olanak sağlar.</p>
<p>   	OLE İSTEMCİSİ (OLE CLİENT)</p>
<p>Nesneyi bağlama ve yerleştirme yöntemi, Windows işletim sistemince kullanılan yeni bir teknolojidir. Bu teknoloji sayesinde, bir windows uygulama programı (Mesela Visual Basic 6.0) ile geliştirilen bir proje içine başka bir windows uygulama programından nesneler aktarmak mümkündür.</p>
<p>Visual BASİC’TE VERİ YAPILARI VE VERİ TİPLERİ</p>
<p>Her programlama dilinde olduğu gibi Visual BASİC’te de çeşitli veri yapıları ve veri tipleri mevcuttur. Programcının dilin imkanlarına daha iyi hakim olabilmesi için bu yapıları tanıması zorunludur.<br />
SABİTLER(CONSTANTS)</p>
<p>Program içinde değeri değiştirilemeyen, çeşitli tipteki veri yapılarıdır. Örneğin<br />
	1234 şeklindeki bir sabit , Visual BASİC açısından bir tam sayı sabittir. “5666” sabiti veya “Türkiye” sabiti ise string  türü sabitler, çift tırnak sembolleri içinde yazılırlar ve matematiksel işlemlere sokulmazlar.<br />
Visual BASİC’te çoğu kez, sabitlere bir isim atanarak, program boyunca, bu isimle çağırmak ta yaygın bir uygulamadar. Bu iş için Const  bildiri sözcüğüne ihtiyaç vardır.<br />
	Örn: PiSayisi=3.14159<br />
Sabit tanımlama sözcüğünün başına private ya da Public sözcükleri konularak, sabitin sadece tanımlandığı modülde ya da tüm modüllerde tanınması sağlanabilir.<br />
	Private Const BnSabit=60<br />
	Public Const BxSabit=80<br />
Puplic: türü bildiriler, sadece standart modüllerin General kısmında tanımlanabilir.  Private sabitler ise, her tür modülün General kısmında tanımlanabilir. </p>
<p>DEĞİŞKENLER(VARIABLES)<br />
Programın akışı içerisinde, değerleri sürekli olarak değişebilen veri yapısıdır.<br />
Örneğin	x=23		y=12<br />
		X=x+3		y=y+x<br />
Bu değişkenlere yeni bir değer atanırsa , bu değişkenin öncek değeri silinecektir.</p>
<p>DEĞİŞKENLERE İSİM VERME<br />
Visual Basic 6.0 değişkenlere isim vermek için aşağıdaki kurallar geçerlidir.<br />
 1-Değişken isminin ilk karakteri bir harf olmalıdır.<br />
 2-Değişken ismi oluşturulurken, diğer karakterler, harf, rakam ya da alt çizgi (-) sembolü olabilir.<br />
3-Kullanılan harflerin küçük ya da büyük harf olmasının önemi yoktur.<br />
4-Değişken isim uzunlukları 255 karaktere kadar olabilir.<br />
5-Değişken isimleri içinde diğer semboller(+,-,/      ,boşluk vb)bulunmamalıdır.<br />
ÖRNEK:	Geçerli Değişken İsimleri<br />
		MAAŞ<br />
		Yaş1<br />
		NetMaaş<br />
		Genel_Toplam</p>
<p>		Geçersiz Değişken İsimleri<br />
		1X<br />
		A-1<br />
		Brut Maaş<br />
DEĞİŞKEN TÜRLERİ<br />
Bu bölümde, Visual BASİC değişkenleri için kullanılabilecek veri türleri tanıtılacaktır.</p>
<p>INTEGER(TAM SAYI):Bir değişkenin sonunda % sembolü varsa bu değişkenin türü integer olacaktır. Integer değişkenler, bellekte 2 Byte yer kaplar ve alacakları değerler –32768 ile +32767 aralığında olabilir. Integer türü değişkenlerle daha hızlı hesaplama yapılır.<br />
ÖRNEK	Deflnt A,B<br />
		D%=5678<br />
		A=789<br />
		B=50000’ Hatalı atama<br />
LONG INTEGER (UZUN TAM SAYI)<br />
Sonundaki sembol &#038;  sembolü olan ya da Deflng sözcüğü ile tanımlanmış olan değişkenlerdir. Bellekte 4 byte yer kaplarlar. Alabilecekleri değerler, -2,147,483,648 ile +2,147,483,647 aralığında olabilir.<br />
Örnek:	DefLng A-C    	Bu örnekte, DefLng A,B veya C olan tüm değişkenler<br />
	A=234555566		Long integer olarak tanımlanmıştır.<br />
		B=567777777<br />
SINGLE PRECISION(TEK DUYARLIKLI)<br />
Değişkenin sonunda ! sembolü varsa, veya DefSng bildiri deyimi ile tanımlanmışsa bu değişken tek duyarlıklı tipte değişkendir. Bu tip değişkenler, bellekte 4 Byte yer kaplar. Değer aralığı negatif sayılar için –3.402823E-38 ile 3. 402823E-45 arasındadır. Pozitif sayılar içinse bu aralık 1.401298E-45 ile 3. 402823E38 arasındadır. İlk 7 haneye kadar hassastırlar.<br />
X!=12390638.234 şeklindeki bir atamada,sonraki 8.234 kısmı yuvarlanacaktır.</p>
<p>DOUBLE PRECISION(ÇİFT DUYARLIKLI)<br />
İsmi sonundaki sembol # sembolü olan ya da DefDbl bildiri sözcüğü ile tanımlanmış olan değişkenlerdir.<br />
STRİNG(KARAKTER ZİNCİRİ)<br />
Sonunda $ sembolü bulunan yada DefStr bildiri sözcüğü tanımlanmış olan değişkenlerdir. Genellikle metin bilgileri için kullanılır.<br />
ÖRNEK	X$=Text12.Text<br />
CURRENCY (PARASAL FORMAT)<br />
Değişken ismi sonundaki sembol @ sembolü olan ya da DefCur bildiri sözcüğü ile tanımlanmış olan değişkenlerdir. Ondalık noktadan önce 15 ve ondalık noktadan sonra 4 hane olacak şekilde formatlanmıştır.<br />
DATE(TARİH)<br />
Tarih ve zaman türündeki bilgileri saklamak için kullanılan değişkenlerdir. 1 Ocak 100 ile 31 Ocak 9999 arasındaki zamanlar için kullanılır.<br />
ÖRNEK:	DefDate T<br />
		Tar=#February 3,1996#<br />
BYTE<br />
Byte değişken türü, Visual BASİC 6.0 ile gelmiş bir yeniliktir. 0 ile 255 arasındaki işaretsiz tam sayıları saklamak için kullanılır.DefByte bildiri sözcüğü ile tanımlanır.</p>
<p>BOOLEAN<br />
DefBool olarak tanımlanır. Sadece Doğru (True) Yanlış(False) değerlerinden birini alabilir. </p>
<p>VARİANT<br />
DefVar olarak tanımlanmıştır. Bir değişken için hiçbir tip bildiriminde bilinilmamışsa, tipi Variant olarak kabul edilir. Her türlü bilgi (Date,numerik,string)yüklenebilir. Variant tipi bir değişken içine hangi tip veri yüklendiği ise IsNumeric,IsDate vb gibi kontrol edilebilir.<br />
KULLANICI TARAFINDAN BELİRLENEN VERİ TİPİ(USER DEFINED TYPES)<br />
Çeşitli değişkenleri bir araya getirerek bir isim altında toplamak! Elde edilen bu yeni veri tipine Kayıt(Record) adı verilir. Bir kayıt tanımlamak için önce bir kod modülünün Declarations kısmında aşağıdaki gibi bir bildirimde bulunulur:<br />
	Type PerKayıt<br />
	   Sicil    As  Integer<br />
	   Ad      As  String*10<br />
	   Soyad As  String*12<br />
	   Brut    As  Double<br />
	  Adres  As  String *50<br />
     	End Type<br />
Daha sonra herhangi bir form ya da modülün Declarations kısmında<br />
	Private Per As PerKayıt veya<br />
	Puplic   Per As PerKayıt<br />
Şeklinde bildirimde bulunulursa PerKayıt ile tanımlanmış bir şablon veri yapısı türünden Per adlı gerçek bir veri tanımlanmış olur.<br />
Private per As PerKayıt<br />
per.Sicil = 123<br />
per.Ad = &#8220;ahmet&#8221;<br />
per.soyad = &#8220;Caner&#8221;<br />
TİP BİLDİRİMİ İÇİN DİM DEYİMİ<br />
İyi bir program oluşturmak için, değişkenlerin tiplerini önceden bildirmek faydalı bir alışkanlıktır. Tip bildiriminde bulunulmazsa değişkenin tipi variant olarak kabul edilir ve gereksiz yere bellek kullanılır. Değişkenlerin tipini belirtmek için alternatif bir yol Dim  deyimini kullanmaktadır;<br />
		Dim x As İnteger<br />
		Dim y As Currency<br />
		Dim z As String<br />
DEĞİŞKEN İSİMLERİNE GÖRE TİP ATAMA<br />
Def  tipi bildirim komutları aşağıdaki örneklerdi gibidir.<br />
ÖRNEK :	DefInd  A-D  Bu ifade ile A,B,C,D harfleri Integer olarak tanımlanmıştır<br />
		DefDate  S,T  S ve T harfleri ile başlayan değişkenler Date türünden tanımlanacaktır.<br />
PROSEDÜRLER ARASI MÜŞTEREK DEĞİŞKENLER<br />
Bazı değişkenlerin,prosedürler arasında müşterek kullanımı gerekebilir. Bu tip müşterek kullanılabilen değişkenlere form düzeyinde veya modül düzeyinde değişkenler denir. Form düzeyinde değişken tanımlamak için, formun General,Declaration bölümüne, bu değişkenleri Dim deyimi ile yerleştirmek gerekir. Burada tanıtılan tüm örnekler bütün prosedürler tarafından kullanılacaktır.<br />
ÖRNEK:	 </p>
<p>PRIVATE  SÖZCÜĞÜ<br />
Private sözcüğü ile, form düzeyinde değişkenler belirleyebilirsiniz. Formun General, Declaration kısmında Dim  yerine Private sözcüğünü kullanarak ta değişkenleri form düzeyinde geçerli kılabilirsiniz. </p>
<p>Project penceresindeki Dim komutunun yerine Static komutunu yerleştirirseniz programı her RUN edişinizde rakamları unutmadan üzerine 10 koyarak toplar.<br />
SABİT UZUNLUKLU STRİNGLER<br />
Sabit uzunluklu string tanımlamak, bası uygulamalar için gerekli olabilir.<br />
Dim ad As String * 8<br />
Ad değişkeni 8 karekter uzunluğundadır.<br />
BİRDEN ÇOK FORM İLE ÇALIŞMA<br />
Uygulamamızın kapsamı genişledikçe, tek form üzerinde tasarım yapmak imkansız hale gelebilir. Bu durumda doğal olarak projemize yeni bir form eklememiz gerekecektir.(Form1-Form2). Bunun için Project menüsünden Add Form seçeneğini kullanmanız gerekecektir.<br />
FORMLAR ÜZERİNDE UYGULANABİLEN METOTLAR<br />
Bu bölümde, özellikle çok sayıda form kullanıldığında, kullanılması zorunlu olacak bazı form metotları açıklanacaktır.<br />
SHOW METODU<br />
Formun ekranda görüntülenmesini sağlar. Yazılış biçimi<br />
	FormAdı.Show   şeklindedir.<br />
LOAD METODU<br />
Formu bellege yükler fakat ekranda görüntülemez. Yazılış biçimi<br />
	Load . FormAdı         şeklindedir.<br />
HIDE METODU<br />
Formu ekrandan uzaklaştırır fakat bellekten silmez!Yazılış biçimi,<br />
	Form.Adı.Hide                 şeklindedir.<br />
UNLOAD METODU<br />
Formu bellekten siler. Bu durumda, form düzeyinde atanmış olan tüm bilgi silinecektir. Yazılış biçimi,<br />
	Unload.FormAdı                şeklindedir.<br />
Visual BASİC’te SAYILAR VE ARİTMETİKSEL İŞLEM OPERATÖRLERİ<br />
Bir tamsayı değişkenine, bir ondalik sayı atanırsa, otomatik olarak yuvarlatılır. Örneğin,<br />
	Dim x As Integer<br />
	X=123.789		ataması sonucu x 124 değerini alır.<br />
String türü bir bilgi numerik olarak kullanılacaksa VAL fonksiyonu ile dönüştürülür. Örneğin,<br />
	X=12*”120” 		ifadesinin hatalı olmasına rağmen<br />
	X=12*VAL(“120”)	ifadesinin sonucu ise 1440 olacaktır .<br />
VAL burada “120” değeri tırnak içine alındığı için karakter olarak tanınmıştır ama VAL komutu bunu sayısal bir değere çevirmiştir<br />
STR Numerik bir ifadeyi Stringe yani karaktere çevirir. Pozitif sayıları dönüştürürken önlerine bir bşluk yerleştirilir.<br />
ÖRNEĞİN  STR(1280) ifadesinin sonucu “  1280) stringi olacaktır.<br />
FORMAT fonksiyonu ile, sayılar belirli bir forma dönüştürülerek görüntülenebilirler. Örneğin<br />
S1$=Format(2457.9,”##,##0.00”) ifadesi ile S1$ stringi, “2,457.90” şeklinde<br />
	S2$=Format(876.9,”###0.00”) ifadesi ile S1$stringi,”2,457.90” şeklinde<br />
	S3$=Format(7.”0.00%”) ifadesi ile de S3$ stringi “700.00%” şeklinde olacaktır.<br />
TARİH TÜRÜ DEĞİŞKENLERLE İŞLEMLER<br />
Tarih türü değişkenler üzerinde de aritmetiksel işlemler tanımlanabilir. Örneğin,<br />
	Dim tar As Date		print bar ifadeleri ile, tar değişkenine, bulunulan günün tarihi atan-<br />
	Dim bar As Date		makta,ilk print ile bulunulan günden 7 gün önceki ve ikinci print<br />
	tar=Now			ile de, bulunulan günden 7 gün sonraki günün tarihi yazdırılacak.<br />
	bar=tar-7<br />
	Print bar<br />
	Bar=tar+7</p>
<p>ÖRNE	K  Y=   3</p>
<p>İfadesini, x‘in klavyeden girilecek değeri için hesaplatın yazdıran bir uygulama geliştiriniz.<br />
ÇÖZÜM<br />
1-Form üzerine bir komut butonu yerleştiriniz. Bu butonu seçerek Properties penceresini getiriniz ve<br />
Caption özelliğini seçerek bu özelliği HESAPLA olarak değiştiriniz.</p>
<p>2- komut butonu yukarıdaki pencerede belirtilmiştir.<br />
3-Daha RUN ederek çalıştırınız. Sonuç yukarıdaki penceredeki gibidir.<br />
BİLGİ GİRİŞ VE ÇIKIŞI KONTROL KOMUTLARI<br />
InputBox(MESAJ) FONKSİYONU<br />
Visual BASİC programının icrası esnasında, klavyeden bilgi girişi yapılmasını sağlayan bir fonksiyondur. Mesaj kısmı kullanılmışsa bu  kısım , bilgi giriş penceresinde aynen görünecektir. Bilgi girişinde girilen bilgi string (karakter zinciri) türünde kabul edilir. Eğer nümerik olarak kullanılacaksa VAL fonksiyonu ile nümeriğe dönüştürülmelidir.</p>
<p>MsgBox Mesaj, Görünüm, Başlık KOMUTU<br />
Bir programın çalışması sonucu elde edilen bazı sonuçları ya da gerekli mesajları ekrana aktarmak için kullanılır. Görünüm parametresinin kullanımı zorunlu değildir.<br />
ÖRNEK:Bir üstde kullanılan örnek bunun için geçerlidir.<br />
KULLANICI İLE ETKİLEŞİMLİ MESAJLAR- MsgBox() FONKSİYONU<br />
Pekçok uygulamada, ekrana yazdırılan mesaj sonucunda kullanıcının mesajı pasif olarak izlemesinden ziyade mesaja aktif olarak cevap vermesi ve bu cevaba göre de bir işlem yapılması söz konusu olmaktadır Bu tür bir işlemi gerçekleştirebilmek için MsgBox fonksiyonu kullanılır. Fonksiyonun yazılış biçimi aşağıdaki gibidir:<br />
	Cevap%=MsgBox(Mesaj$,Görünüm%,Başlık$)</p>
<p>Visual BASİC 6.0 PROJE TASARIM PENCERESİNE BAKIŞ</p>
<p>Visual BASIC 6.0 açıldığı zaman karşınıza ekran görüntüsü gelecektir.</p>
<p>Örnekler Standard EXE projeleri ile oluşturulacaktır. Visual basıc tasarım penceresi açıldığında göze ilk çarpan önemli özellik tasarım ortamının MDI modunda açılmasıdır </p>
<p>MENÜ SATIRI:  11 adet ana menü başlığı ve herbirinin alt menülerini içerir. Visual BASIC ortamında proje(yazılım) geliştirirken yararlanılabilecek çeşitli fonksiyonları vardır.</p>
<p>KONTROL NESNELERİ: Visual BASIC ortamına önceden yerleştirilmiş neslerdir. Bu kontrollerden gerekli olanları form üzerine taşınır ve yazılım icrası esnasında istenilen fonksiyonları yerine getirebilmeleri için bu kontrollere bağlı bilgisayar programları(kodlarcodes) da oluşturulur.</p>
<p>FORM: Visual basıc pojesinin temel nesnesidir. Proje ile ilşkili tüm nesneler form üzerine yerleştirilir. Bir projede, gerekiyorsa birden fazla form da bulunabilir.</p>
<p>PROJECT: O anda aktif formla ilişkili olarak bazı  işlevleri yerine getirir. Pencere başlığının hemen altında iki guruba ayrılmış üç buton bulunur. Bunlardan View  code butonu seçilirse  , o<br />
esnada aktif olan nesneye bağlı olarak oluşturulmuş bilgisayar programı(kodu) görüntülenir.<br />
View Object  butonu seçilirse de, bu durumda tasarım aşamasında o an için seçilmiş olan nesne x<br />
görüntülenecektir.<br />
Tolggle Folders  butonu ile ise proje içinde kullanılan genel  maksatlı modüller, ormlar, ınıflar ve kaynak dosyaları gibi proje bileşenleri bir dizin mantığı içinde ayrıntılı veya toplu halde görüntülenir.</p>
<p>ÖZELLİKLER : o anda aktif durumdaki (seçilmiş) Visual BASIC kontrolünün tüm özellikleri görüntülenir.<br />
IMMEDIATE: breake modda (tasarım ortamında program akışının kesilmesi) otomatik olarak boş olarak açılır.Debug,reset ve  komut satırındaki işlemler uygulanabilir veya program akışını kalındığı yerden devam edilebir.<br />
LAYOUT:  Formların ekrandaki pozisyonlarını mouse yardımı ile ayarlanabilir.</p>
<p>MENÜ SATIRI</p>
<p>FİLE(DOSYA) MENÜSÜ:</p>
<p>New project:Yeni bir Visual BASIC projesi başlatmak amacı ile  kullanılır.<br />
Open Project:Daha önceden diskte saklamış olduğunuz bir VB uygulamasını tekrar aktif hale getirir.<br />
Add Project:Proje penceresi birden fazla proje içerdiğinde ikinci bir projeyi ekler.<br />
Remove Project:Aktif uygulamamız içindeki bir projeyi uygulama içinden çıkarmak için kullanılır.<br />
Save Project Group:O esnada uygulamada kullanılan proje ve projelerle ilişkili tüm dosyaları ve ilişkili Visual BASIC bilgilerini tek bir isim altında saklamak amacı ile kullanılır. Bir kez kayıt edilince group yazısı bir daha gelmez.<br />
Save Project Group As:Aktif çalışılan bir projeyi son hali ile diskten farklı tüm uygulama bileşenlerini yeni bir isimle saklamayı saglar.<br />
Save (Form1)Dosya İsmi :Sadece o esnada aktif proje penceresinde seçilmiş olan bir nesneyi saklar.<br />
Save (Form1)Dosya İsmi As: Daha önce saklanmış olan bir dosya yeni bir isimle yeniden saklanabilir.<br />
Print:Project ile ilgili istenilen (kod sayfasını,formu) bölümleri yazıcıya gönderir.<br />
Print Setup:Uygulamanızı yazıcıya aktarma durumunda yazıcı tipini, yazıcıdaki kagıt baskısını,yatay,dikey durumunun ayarı.<br />
Make Project..exe:Çalıştığımız Visual Basic uygulamasını EXE haline çevirerek Visual BASIC ortamından bağımsız çalışılmasını sağlar.<br />
Make Project Group:Uygulamamız birden fazla project içeriyorsa görüntülenir. Uygulamanızda oluşturmak istediğiniz projeleri seçmenizi sağlar.<br />
Exıt:Visual BASIC ortamından çıkışı sağlar.</p>
<p>EDİT  MENÜSÜ</p>
<p>Undo Delete(Gerial):Yapılan son işlemi geri  alır.<br />
Can’t Redo(Yinele): Geri alınan işlemi tersine çevirir.<br />
Cut(Kes): Seçilen  alanı silip panoya alır.<br />
Copy(Kopyala): Seçilen alanı panoya kopyalar.<br />
Paste(Yapıştır):Panodaki bilgileri yazdırır.<br />
Paste Link(Özel Yapıştır):Panodaki bilgileri istenilen biçimde yapıştırır.<br />
Delete: Seçilmiş metin yada nesneyi siler.<br />
Select All: Aktif kod penceresindeki bütün kodu veya form üzerindeki bütün kontrolleri seçmek için kullanılır.<br />
Find(Ara): Visual BASIC kodu içerisinde bir metni aramak için kullanılır.<br />
Find Next(Aramaya Devam): Find ile yapılan arama işlemine kaldığı yerden devam etmek için kullanılır.<br />
Replace(Değiştir): Bir metin içinde bir sözcüğü aratıp, bulunduğu takdirde başka sözcükle değitirmek.<br />
Indent(Tab):Tab tuşunun görevini yapar.<br />
Outdent(Shift Tab): Tab tuşunun ilerlettiği sutun miktarı kadar sola kaydırır.<br />
Insert File(Dosya Birleştir):  Çalışılan kod sayfasının içerisine başka bir dosyada bulunan  kodu eklemek için kullanılır.<br />
List properties/Methods: Kod penceresine her uygun ifadenin ardından bu ifadeden sonra yazılabilecek mümkün diğer ifadeleri içeren bir yardım kutucuğu görüntüler.(data1. sonra gelecek menü)<br />
List Constants:Kod penceresinde,yazılan ifadenin alabileceği sabit değerleri içeren yardımcı bir pencere görüntüler.<br />
Quick Info: Kod penceresinde seçilen fonksiyonların,metodların,prosedürlerin ve değişkenlerin yazılımını gösteren yardımcı bir pencere görüntüler..<br />
Parameter Info: Kod penceresinde yazılan veya ifadelerin ,çerdikleri parametreleri gösteren yardımcı bir pencere görüntüler.<br />
Complate Word: VB, yazmakta olduğunuz ifadeden kelimeyi bulmaya çalışır. Ve kullanmanızı sağlar.<br />
 Go to Row: Satıra git (Birinci,Önceki,Sonraki,Yeni)<br />
Bookmark:Program kodunun çok sık kullanıldığı satırlarına kolay bir şekilde ulaşmak için kullanılır.</p>
<p>VİEW MENÜSÜ</p>
<p>Code: O esnada seçilmiş olan form ya da modülün Code Penceresini(prg. Yazıldığı pencere)görüntülemek amacı ile kullanılır.<br />
ObJect:  Aktif kod ile ilişkili olan nesneyi(form gibi)görüntülemek için kullanılır.<br />
Definition: Form yada modülün Code Penceresinde kürsörün bulunduğu aktif prosedüre ait kod penceresini görüntüler.(Recordset,Data1)<br />
Last Position: Kod penceresinde en son noktaya yeniden sıçrama yapmak istediğinizde kullanılır.<br />
Object Browser: Bu seçenek ile Object Browser(Nesne Gözatıcısı)penceresi ekrana gelir.<br />
Immediate Window: Bu menü alternatifi ile Immediate (hata ayıklama penceresi) ekrana gelecektir.<br />
Locals Window: O esnada aktif prosedürde ki bütün değişkenleri ve değerlerini gösterir.<br />
Watch Window: B-Break Modda, daha aönceden gözlem amacı ile tanımlanmış değişken ya da ifadenin o andaki değerini görüntülemek için kullanılır.<br />
Calc Stack: Projeniz içinde, o esnada aktif olan prosedür çağrılarının listesini gönderir.<br />
Project Explorer:Project (proje) başlıklı pencereyi ekrana getirir.<br />
Properties Window: Properties(Özellikler) başlıklı pencereyi ekrana getirir. Bu pencerede o esnada aktif  olan nesne için geçerli olan özelliklerin bir listesini ve bu özelliklere o esnada atanmış olan değerleri incelemek mümkümdür.<br />
Form Layout Window:Daha öncede söylendiği gibi Layout penceresinde Formların ekrandaki pozisyonları mouse yardımı ile ayarlanabilir.<br />
Property Pages: Tasarım ortamında kullanıcı tarafından oluşturulmuş bir kontrolün özelliklerinde değişiklik yapmak amacı ile özellik sayfalarını listeler.<br />
Table<br />
Zoom<br />
Show Panes<br />
Toolbox:Araç kutusunu görünür hale getirir.<br />
Color Palette:Seçilmiş Visual BASIC nesnelerinin renklerini değiştirmek üzere, renk paletini ekrana getirir.<br />
Toolbar:Visual BASIC kullandığı araç çubuğu gruplarından biri ekranda görüntülenebilir veya silinebilir.</p>
<p>PROJECT MENÜSÜ</p>
<p>Add Form:Aktif projenin içine yeni veya mevcut bir form katmak için kullanılır. (Form1 varken Form 2 ye geçilebilir.)<br />
Add MDI Form: Bu menü alternatifi ile bir Multiple Document Interface (çoksayıda Doküman İçeren Arayüz) oluşturulabilir veye mevcut bir MDI formu uygulamaya ekleyebilirsiniz.<br />
Add Module: Visual Basic/in bir forma ya da nesneye bağlı olmayan ve uygulamanın tüm bileşenleri tarafından kullanılabilen kodların modul adı verilmektedir.<br />
Add Class Module: Bu menü alternatifi ile Sınıf Modülü (Class Module) denilen özel tipte bir modül oluşturmak mümkün olmaktadır. Sınıf modülünde, projenin tüm bileşenleri tarafından kullanılabilecek bir sınıf ile ilişkili tanımlar bulunabilir.<br />
Add User Control: Sadece kendi projenizde kullanabileceğiniz ActiveX kont- rolleri oluşturmak için kullanılır. Active X kontrollerini başka tasarım ortam-larında da kullanmak için projenizi ActiveXConrol olarak başlatmanız gerekir.<br />
Add Property Page:  Oluşturduğunuz ActıveX kontrolleri için Özellik sayfası isimlendireceğimiz Property Page/ler oluşturmak için kullanılır.<br />
Add User Document:  Bu menu komutu Standart EXE modülü dışındaki proje modülleri ile beraber kullanılır. Projeye yeni yeni bir ActiveX dökümanı eklemek için kullanılır.<br />
Add File:  Daha önceden hazırlanmış genel maksatlı modüller, formlar, sınıf modülleri ve kaynak dosyalar gibi bileşenleri, o esnada aktif olan projenizin içine katma imkanı sağlar.<br />
Remove (Dosya Adı)Form..(1,2,3) : Aktif projenizin içindeki bir dosyayı bu proje içinden  çıkarma imkanı sağlar. Çıkarılan dosya disketten silinmez.<br />
References: Projenizin içerisine başka uygulama programları ya da nesne kütüphanelerinden nesneler katma imkanı sağlar.<br />
Components: Visual BASIC’te kullanabileceğimiz kontrol nesnelerinin sayı ve çeşidini arttırmak ve DLL uzantılı tasarımları projeye eklemek amacı ile kullanılır.<br />
Project1 Properties: Visual BASIC projesi ile ilgili düzenlemeler yapmak için kullanılır. Diyalog penceresinin BAŞLIK ÇUBUĞU, Project Explorer penceresinde seçili aktif projenin ismini gösterir.</p>
<p>FORMAT MENÜSÜ</p>
<p>Aling:Form üzerinde seçilmiş nesnelerin pozisyonları,enson seçilen nes-neyi referans alacak şekilde aşağıdaki alternatifler bazalınarak hizalan-dırılır.<br />
Left sol,Centers ortala,Tops Üst köşe,Middles üst alt orta noktaları eşit, Buttoms Alt köşe,To Grid en yakın Grid üst köşe noktası<br />
Make Same Size: Bu menü alternatifi ile seçilen nesnelerin boyutlarında ayarlama yapılır.<br />
Width Genişlik,Height Yükseklik,Both seçilen nesnelerin boyutları referans alınan nesne ile aynı yapılır<br />
Size To Grid  Seçilen nesneleri otomatik olarak formun en yakın grid noktalarına yerleştirir.<br />
Horizontal Spacing Seçilen nesnelerin kendi aralarındaki yatay boşluklar istenilen  alternatiflere göre ayarlanır.<br />
Make equal:Seçilen nesnelerin kendi aralarındaki yatay boşlukları eşit hale getirir.<br />
Increase:Seçilen nesnelerin kendi aralarındaki yatay boşluğu, kabul edilen bir grid hücresinin eni kadar artırır.<br />
Decrease:Seçilen nesnelerin kendi aralarındaki yatay boşluğu kabul edilen bir grid hücresinin eni kadar azaltır.<br />
Remove:Seçilen hücrelerin kendi aralarındaki yatay boşlukları kaldırır.<br />
Vertical Spacing: Yukarıdaki menü seçeneğine eşdeğer bir fonksiyonu vardır. Sadece boşluk ayarlamaları düşey noktada yapılır.<br />
Center in Form:Seçilmiş nesne grubu, bu grubun içindeki en dış nesnelere göre form üzerinde ortalanır.<br />
	Horizontaly: Seçilmiş nesne grubu içinde en sol dışdaki nesne ile  en sağ dışdaki nesnenin, sırası ile üst ve alt köşe noktalarına göre tüm seçilmiş nesneleri yatay olarak ortalar.<br />
	Verticaly: Seçilmiş nesne grubu içinde en üst dışdaki nesne ile en alt dıştaki nesnenin,sırası ile üst ve alt köşe noktalarına göre bir ayarlama yapılır.<br />
Order:Order menu seçeneği ikiye ayrılır.<br />
	Bring to Front:Seçilmiş olan nesneyi, formda mevcut diğer nesnelerin önüne getirir.<br />
	Send to Back: Seçilmiş olan nesneyi, diğer nesnelerin arkasına yerleştirir.<br />
Lock Controls:Form üzerindeki kontrolleri, bulundukları pozisyonda kilitler.Öyle ki, kontroller bu komuttan sonra form üzerinde hareket ettirilemez.</p>
<p>DEBUG MENÜSÜ</p>
<p>Step Into:Tasarım esnasında Visual BASIC kodundaki o esnada kürsörün İşaret etmiş olduğu komutu çalıştırır.<br />
Step Over: Step info komutuna benzer. Farkı, icra edilen aktif komutu, bir prosedür çağırma komutu ise, o prosedür tek bir komut gibi bütünü ile icra edildikten sonra, esas koddaki bir sonraki deyime geçilir.<br />
Step Out: O esnada icra edilen fonksiyonun içinde kürsörün işaret etmiş olduğu komuttan itibaren bütün komutlar çalıştırılır ve fonksiyonun çağrıldığr esas kodda bir sonraki deyime geçilir.<br />
Run To Cusor: Gene sadece tasarım anında kullanılabilecek bir komuttur. Programın icrası durmuş iken(Break Mode) icrayı yeniden başlatarak bir sonraki durma noktasının hangi komut olacağını belirler.<br />
Add Watch:Bir değişken yada ifadenin programın icrası esnasında hangi değerleri aldığını izlemek üzere bir gözlemci mekanizma kurar.<br />
Edit Watch: Gözlemci tanımı ile ilişkili değişiklik ya da düzeltme yapmak gerektiğinde kullanılır.<br />
Quick Watch:Brake modda üzerinde durduğu değişkenin, özelliğin veya başka bir ifadenin değerini gösteren bir diyalog penceresi görüntüler.<br />
Toggle Breakpoint:Tasarım esnasında kullanılabilen bir komuttur. Kod üzerinde ki durma noktalarını belirlemek için kullanılır.<br />
Clear All Breakpoints:Toggle breakpoint komutu ile yerleştirilmiş olan bütün durma noktalarını iptal eder.<br />
Set Next Statement:Sadece Break modunda kullanılabilir. Break moduna şu durumlarda erişilir.<br />
Show Next Statement:Gene sadece break modda kullanılabilecek bir komuttur. İcra edilecek bir sonraki deyimi gösterilir.</p>
<p>TOOLS MENÜSÜ<br />
Visual Data Manager: Bu menü alternatif, Visual BASIC içine, veri tabanlarının yönetimi konusunda çok yetenekli bir yazılım modülü olan<br />
Visual Data Manager’ın eklenmesini sağlar.<br />
Add-In Manager:Bağımsız yazılım modüllerinin Visual Basic ortamına katılmasını ya da bu ortamdan çıkarılmasını sağlar. </p>
<p>ADD-INS MENÜSÜ</p>
<p>Start:Geliştirdiğimiz projeyi icra etmek amacı ile kullanılır.F5 kullanılır.<br />
Start With Full Compile:Start komutu ile Visual Basic sadece aktif kodu ve ilişkili kısımları derler. Belli bir anda projenizin tümünün derlenerek çalıştırılması istiyorsanız bu alternatifi seçmelisiniz.<br />
Break:Normal akışını sürdüren programı durdurur ve programın çalışmasını breake modda sürdürülür.<br />
End:İcra edilen programı durdurarak Visual BASIC’in kullandığı tüm sistem kaynaklarını iade eder.<br />
Restart: İcrası durdurulmuş olan programın yeniden icra edilmesini sağlar.</p>
<p>Add Procedure:Kod penceresi içine bir prosedür yerleştirmek amacı ile kullanılır.<br />
Procedure Attributes:Belirtilen herbir özellik veya metod için ayarlamalar yapabileceğiniz veya mevcut attribute’leri(nitelikleri) gözlemleyebileceğizi bir diyalog penceresi görüntüler.<br />
Menu Editor:Geliştirdiğiniz uygulama içinde Visual BASIC ve Windowsun menülerine benzer şekilde menüler oluşturmak istediğinizde Menü Editörü size büyük kolaylık sağlayacaktır.<br />
Options: Bu menü seçeneği kullanılırsa Visual BASIC ortamında çalışırken mevcut olan çeşitli sistem parametrelerini değiştirmek imkanı sağlayan diyalog penceresi karşınıza gelecektir.</p>
<p>WİNDOW MENÜSÜ<br />
Split: Sadece kod penceresi(programın yazıldığı pencere)açık iken aktif olur. Kod penceresini yatay olarak ikiye ayırır.Eski hali için split seçilir.<br />
Tile Horizontally:MDI modda,açık pencereleri yatay olacak şekilde eşit pencere boyutlarında ekrana yerleştirir.<br />
Tile Vertically:Yukarıdaki menü seçeneği ile eşdeğerdir. Farklı olarak pencere ayarlamaları düşey olacak şekilde gerçekleştirilir.<br />
Cascade:MDI modda, açık pencerelerin ekrandaki yerlerini üst üste cascade bir tarzda yeniden ayarlar.<br />
Arrange Icons: MDI modda minimize edilmiş pencere ikonlarını anapencerenin alt sol köşesine göre yeniden düzenler.<br />
WindowList: Bütün açık pencereleri listeler. Aktif yapılmak istenen pencere seçilirse ilgili pencere isminin sol yanında o esnada atif pencereyi gösteren işareti gözükecektir.</p>
<p>HELP MENÜSÜ</p>
<p>Visual BASIC konuları hakkında yardımcı bilgiler sunar.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.genelbilge.com/visual-basic-detayli-anlatim.html/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Game Programming Tutorials</title>
		<link>http://www.genelbilge.com/game-programming-tutorials.html/</link>
		<comments>http://www.genelbilge.com/game-programming-tutorials.html/#comments</comments>
		<pubDate>Tue, 20 Oct 2009 12:43:52 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		<br />
<b>Warning</b>:  Invalid argument supplied for foreach() in <b>/home/genelbil/public_html/wp-content/plugins/autometa/autometa.php</b> on line <b>300</b><br />
		<category><![CDATA[Bilgisayar]]></category>
		<category><![CDATA[Programlama]]></category>
		<category><![CDATA[Action Moves]]></category>
		<category><![CDATA[Arkanoid]]></category>
		<category><![CDATA[Beginner Level]]></category>
		<category><![CDATA[Character Sketches]]></category>
		<category><![CDATA[Clones]]></category>
		<category><![CDATA[Expert Programmers]]></category>
		<category><![CDATA[Flatmates]]></category>
		<category><![CDATA[Freecell]]></category>
		<category><![CDATA[Game Programming Tutorials]]></category>
		<category><![CDATA[Good Game]]></category>
		<category><![CDATA[Implementation Techniques]]></category>
		<category><![CDATA[Infomercials]]></category>
		<category><![CDATA[Interface Concepts]]></category>
		<category><![CDATA[Level Programmers]]></category>
		<category><![CDATA[Old Game]]></category>
		<category><![CDATA[Originality]]></category>
		<category><![CDATA[Program Game]]></category>
		<category><![CDATA[Programming Technique]]></category>
		<category><![CDATA[Slamm]]></category>
		<category><![CDATA[Slapshot]]></category>

	<!-- AutoMeta Start -->
	<!-- AutoMeta End -->
	
		<guid isPermaLink="false">http://www.genelbilge.com/?p=11316</guid>
		<description><![CDATA[Hello everybody, here is my old game programming Tutorials if you missed them last time. They discuss coming up with ideas, through to, simple implementation techniques. I hope they are still some use. Which arm is longer? Ideas Ideas are the starting point of any program – game or not. Some ideas are more original [...]]]></description>
			<content:encoded><![CDATA[<p>Hello everybody, here is my old game programming Tutorials if you missed them last time.<br />
They discuss coming up with ideas, through to, simple implementation techniques. I hope they are still some use.<br />
Which arm is longer?<br />
Ideas<br />
Ideas are the starting point of any program – game or not. Some ideas are more original than others &#8211; Doom clone anyone?<br />
Originality is great, but you need a good game. Despite the latest in modern gaming I had to offer, my flatmates most popular game was DX-Ball, an arkanoid clone (try www.windows95.com). (They were playing DX-Ball because they were bored with freecell!)<span id="more-11316"></span></p>
<p>I may seem to be arguing with myself in the two previous paragraphs, but this is merely friendly discussion. I propose that originality of the individual idea is not required as long as you think you can implement that idea better than those before you have.<br />
So what I am saying is;<br />
•	Intermediate, beginner level programmers should come up with an original idea to be successful – people don’t want clones that aren’t as good as the real thing.<br />
•	Expert programmers can afford to release Slamm III and Slapshot 98, just a bit more advanced than last years version for a proven market.<br />
What are ideas anyhow?<br />
Well don’t worry this is not a metaphysical discussion – here is David’s definition of ideas;<br />
&#8220;what you think you’re going to do &#8211; before you do it.&#8221;<br />
Ideas form the blueprint for your game. These ideas may include plot or character sketches, action moves, diagrams of puzzles, interface concepts, dialog, even a specific programming technique to exploit.<br />
How do I get them?<br />
If you are anything like me, you will probably have way to many ideas, both for projects to do, and for aspects of those projects. But lets face it you are better off finishing 1 game than starting 30. (I really should learn from that)<br />
Here’s a simple three step process to better abs… ideas, (too many American infomercials) you can repeat as many times as you require;<br />
1.	Stimulation (e.g. play other games, watch videos, movies, read books, music whatever)<br />
2.	Scribble (write down a bunch of stuff you are thinking of so you can remember it later)<br />
3.	Discuss ( brainstorm – with a group of people to refine your ideas and come up with new ones)<br />
Just hope that the people you brainstorm with aren’t too critical of your lame ideas, even the most stupid suggestion may surprise you. Who would have thought a game with odd shaped falling blocks would take the world by storm (Tetris for those of you who don’t remember the 8-bit days).</p>
<p>The real world<br />
With these wonderful ideas firmly in mind you go about implementing your program. You will probably find it’s just not possible to do it the way you had planned, or you come up with better ideas along the way.<br />
This is probably a good thing, if you were able to achieve your ideas exactly you would have to be a master at planning. It is almost inevitable that as you develop your game you find your ideas were perhaps a bit ambitious or you think of a new idea or twist (within reason say the schedulers among us).<br />
Now you have ideas, what makes a game?<br />
For more on this topic see Greg Costikyan’s article &#8220;I have no words &#038; I must design&#8221;<br />
What’s not a game<br />
•	Puzzles – puzzles are static, not interactive. Good games probably have puzzle elements, but they should not be JUST a puzzle.<br />
•	Toys – toys are interactive, but have no goal. e.g. playing with blocks, sim-city.<br />
•	Stories – stories are linear, games are not. Any presentation of narrative should still allow for the user to make their own decisions.<br />
What is a game<br />
•	Decision making &#8211; Interaction in itself does not make a game, the interaction must have outcomes. Hence the player makes a decision about what action to take which results in an outcome.<br />
•	Goals – There needs to be goals in a game so players can mark their progress – the quality of their decisions. E.g. points, survival, increased functions.<br />
•	Opposition – It is no fun playing with yourself. Remember it should be a struggle, it is also no fun to win too easily.<br />
•	Managing Resources – Part of the decision making progress is management of resources. E.g. should you use the extra ammo?, the health shield?, send those extra troops to the front?, spend the money on new tyres?.<br />
•	Information – A player needs information to make decisions. Information adds to the experience and realism of the game, also as a player becomes more experienced the information can be understood at greater levels of subtlety resulting in better tactics. E.g. use the wind meter when making the golf shot, listen for screams round the corner in an action game, read up background biographies in an adventure game.<br />
What can make a better game<br />
•	Diplomacy – Multi-player games should encourage diplomacy (read social interaction). e.g. gang up on someone, go easy on a new member, perhaps help another group in an RPG although the long term goal may be different.<br />
•	Art – Not just graphic art, but the art of presentation. Anyone prefers a game with atmosphere that looks and sounds great &#8211; and plays easily (read good user interface).<br />
•	Simulation – This is taking real (or fictional) situations which people are familiar with and handing them the controls. This immediately gives you a basis of communication – famous characters or objects, the history and background, and the basic premise. E.g. fly a plane, control a city, command an army…<br />
•	Variety – Well this stands to reason, tic-tac-toe won’t keep people interested for long. You can provide variety in several ways, a) variety through random elements e.g. bonuses, good fortune, luck, b) through complexity of environment, c) progressive gameplay, e.g. the game changes as you progress<br />
•	Role-playing – Role playing is not simply presenting the player with a persona to assume e.g. batman, duke nukem, but putting the player in a social environment were they play a role in respect to their interactions with other players. E.g. the player is Barry the barbarian or Tracy the ruthless tycoon.<br />
•	Socializing – It is an interesting aspect that most computer games have been a solitary pass time, yet other forms of games are almost all social in nature, e.g. sport, cards, board games… The Internet is now making multiplayer gaming a technical possibility, but I would suggest they will really take off when the social aspect is exploited. I don’t know about you, but after my first game of Net Doom with my friends, the big difference I noticed was not the improvement over computer AI (infact charging the enemy.. or walls with rocket launchers seemed very popular) but the social aspect (never yelled over a computer game before).<br />
•	Tension – Just like at the movies, the key element of an exciting story is to keep the tension rising until reaching the dramatic ending. Try and save the toughest problems for last, e.g. beat the end of level bad guy, disarm the bomb, save the world.<br />
Basic game categories<br />
Games generally fall into basic categories. You should keep these in mind as far as implementing your game, but you may choose to mix and match parts of each genre.<br />
•	Platform Games &#8211; Run, Jump and Avoid e.g. Mario, Jazz Jackrabbit, Prince of Persia. Can be non-violent and non-threatening.<br />
•	Shooting – If it moves shoot it, you know doom, quake…<br />
•	Adventure – Multiple locations, objects, characters and actions aimed at a goal in a specific carefully defined world. Kings Quest, Sam and Max…<br />
•	RPG – Multiple locations, objects, characters and actions in a more free form exploration of a usually larger less defined world. Ultima..<br />
•	Strategy – Combination of planning, analysis resource management or logic. Chess, Tetris, Civilization, Command and Conquer..<br />
•	Fighting – Spinning back kick to the jaw, Mortal Kombat, Street Fighter…<br />
•	Simulation – General term to describe &#8220;real world games&#8221;, flying, driving, sports..<br />
Two basic implementation techniques<br />
You can generally divide the graphics of games programming into two distinct areas (although a game may combine aspects of both.)<br />
•	2D – Sprites, scrolling, bitmaps, video and animation &#8211; FLAT<br />
•	3D – Free viewpoint, textured polygons &#8211; NOT FLAT<br />
That may seem simplistic, but basically 2D and 3D graphics are very different techniques.<br />
We will cover the basics of 2D graphics later on. Its basically a fairly straightforward concept – images (like paper cut-outs) are located where you want on the screen…<br />
3D games meanwhile involve a lot more work (and maths!). Luckily (?) there are all sorts of people trying to develop 3D API’s for you to use.<br />
I will be including some samples of Microsoft’s Direct3D Retained Mode interface (the easy one) and have a look at OpenGL (despite Microsoft’s claims, a competing API). Thanks to Patrice Scribe for the wonderful type libraries that make this possible.<br />
Implementing your ideas<br />
Where do you start?<br />
Technique<br />
You need to establish early on (read start) of your project what techniques you will use – and you need to make sure you can do it.<br />
The techniques required may be obvious from your ideas, or they may still be undefined. E.g. will your adventure game be first person like Myst (scale and character not required), will characters be able to walk around like in Sam and Max, or will you have a little 2D square playing field like Indiana Jones’s desktop adventures?<br />
Now you need to research and test until you have a mock up of the technique sufficient to satisfy you that you can do the whole project. There is no point starting on a quake clone, 6 months into the project with music, textures and 3D models – but no hope of a 3D engine.<br />
Research is not as bad as it sounds, there are tonnes of books, articles, web sites and source code to point you in the right direction. I will even include a modest sample of 2D stuff later on including three worked examples. You never know you may have some new ideas everyone else might want to hear.	 </p>
<p>Brief<br />
Its time to do a rough plan. Before you commit all you spare time for months to a project, sketch out a storyboard for your game, illustrating it cool points – and its basic premise.<br />
Draw up a list or resources required Personnel (you may need artists, music gurus, programmers, writers…), time (you know that stuff that there is NEVER enough of &#8211; unless you’re at the dentist), and equipment (computers, software, video, midi keyboards..) </p>
<p>Reality Check<br />
Right &#8211; you have got your technique tested, you have a concise brief describing your game &#8211; now check the following.<br />
1.	Possible – just make sure (again) you genuinely think you can pull off the technical bits<br />
2.	Practical – is the scope of the project within your grasp, remember the best game is a finished game<br />
3.	Property – do you have the money and resources (or the right contacts). Remember video equipment, artists, ILM special effects and Arnold Schwarzenegger don’t come cheap.<br />
4.	Potential – what do your friends (publisher, co-worker..) think of your game, would they want to play what you are describing?<br />
This stage can save a lot of disappointment and lost work. Should you fail the reality check its time to rework your brief.<br />
How do you start?<br />
Break your game into components<br />
Basic categories of &#8220;components&#8221; that you will need for your planning include;<br />
•	Game engine<br />
•	Extra programming (installation, extra puzzles..)<br />
•	User Interface design<br />
•	Assets (Models, Art, Sound Effects, Music, Video)<br />
•	Content editor and utilities (e.g. level editor and sound conversion..)<br />
•	Content designs (e.g. level’s)<br />
Plan, Plan and Plan some more<br />
If your game is a large project, especially if your team is larger than one person, you owe it to yourselves to get organised. Get some idea on a timeline of who does what when. E.g. tell your artist roughly what art, when, what size, resolution and colour depth.. etc<br />
Evaluate Key techniques in detail<br />
Well you have made sure you can blit a screen full of diamond tiles fast enough, now its time to add buildings and trees and get the whole thing scrolling.<br />
Early on in the implementation phase you need to break the back of the main technical issues, these will make planning difficult. If you don’t know how to do it, how can you estimate how long it will take?<br />
If its not working fast enough, or just not working then you need to;<br />
1.	do some more research,<br />
2.	buy some technology, or<br />
3.	scale down your game.<br />
Huh?<br />
If at this point you are wondering what you missed (where are all the explanations of how to MAKE A GAME? ) well that’s still pretty much up to you, programming is fairly creative and there are lots of different styles and techniques.<br />
Don’t worry though, here are some links to some good places to start, and I have even included some basic techniques along with some worked examples.<br />
Following through<br />
Working in teams<br />
Milestones<br />
Tie up the loose ends<br />
Some programming techniques for you to use<br />
Classes &#038; collections<br />
Relatively new to VB is the ability to take advantage of classes, your own little object templates. MS has also been considerate enough to provide collections, the ability to dynamically manage a group of objects.<br />
Very quick OOP tutorial<br />
A class is a template from which you can create objects.<br />
Each object has its own data space for its properties, and shares the methods and event code with other objects of the same class.<br />
Think state housing, you can take the blueprint of a state house and build 30 different identical buildings. You can then go through and alter the properties of the individual objects (houses) and paint each one a different, disgusting pastel shade.	 </p>
<p>The VB manual even describes classes and &#8220;user-defined types with attitude&#8221; because you can store the events and methods along with the data (encapsulation).<br />
So why bother?<br />
Well collections make all this new-age OOP stuff worthwhile. They provide a simple way to dynamically manage objects. Collections also provide indexing so you can find specific objects quickly in large collections.<br />
Because objects can contain collections of other objects you can create structures that you would have needed pointers (urgh) for before.</p>
<p>For example in a RPG;<br />
Player Class contains properties like name, age, gender, height, experience, speed, agility, strength, stamina… and a collection called holding<br />
This collection contains a group of other objects like clothes, knife, backpack. Each of these objects has their own properties. The backpack for example contains properties like size, colour AND a collection called holding. This collection can in turn &#8220;hold&#8221; other objects!<br />
Even better VB5 provides a class wizard that makes it easy to create and maintain the interfaces to your classes.<br />
Some Source Code!<br />
Here’s some fragments of code you will want to get familiar with;<br />
•	Dim my_axe as Axe (dimension a variable of type Axe)<br />
•	Set my_axe as new Axe (set the variable to a new instance of a Axe class, a new object)<br />
This means you now have a working and ready to use object, my_axe which is explicitly of type Axe (your class). If you want to be really flexible you can define my_axe as Object. This means you can set my_axe to any new object.<br />
•	Dim my_axe as Object (dimension a variable of type any object)<br />
•	Set my_axe as new Whatever (set the variable to a new instance of any object)<br />
However this uses late binding, because it does not know what object will be used until you do the set statement. This is slightly slower, so if you can help it try and be explicit as above.<br />
p.s. now you have an object you can use it just like other vb objects, e.g. text1.text=&#8221;test&#8221; or my_axe.sharpness=400.<br />
What about collections? Right, good point.<br />
•	Dim holding As New Collection<br />
I now have a variable called holding which is a collection which can contain a group of any sort of objects.<br />
•	holding.Add my_axe, &#8220;axe&#8221; (adds a new objects, my_axe, and an optional text index &#8220;axe&#8221;)<br />
•	holding.count (tells you how many objects in the collection)<br />
•	holding.remove &#8220;axe&#8221; (removes the object from the collection which has a text index &#8220;axe&#8221;, you could equally remove the item in ordinal position, e.g. holding.remove 2 removes the 2nd item in the collection.)</p>
<p>p.s. before you could add the item my_axe, you have to dimension a variable my_axe as axe, and set my_axe = new axe – then set any properties you want for that specific axe before you add it to the collection.<br />
That’s how to add, count and remove items in a collection. But I have saved the best till last – the for each construct.<br />
•	For Each player In players<br />
•	Next<br />
Where players is a collection of objects of class player. You can now write code that will work on each object in a collection.<br />
•	For Each player In players<br />
o	If player.speed < 50 Then<br />
	player.die<br />
o	End If<br />
•	Next<br />
BitBlt<br />
The taxonomy of a bitblt. Lets just say that bltblt’s are still faster than the new VB paintpicture method. Essentially what you are doing is copying a chunk of memory from one place to another. This chunk is visually rectangular in shape.<br />
Declare Function BitBlt Lib &#8220;gdi32&#8243; (ByVal hDestDC As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long<br />
Public Const SRCAND = &#038;H8800C6 &#8216; (DWORD) dest = source AND dest<br />
Public Const SRCCOPY = &#038;HCC0020 &#8216; (DWORD) dest = source<br />
Public Const SRCINVERT = &#038;H660046 &#8216; (DWORD) dest = source XOR dest<br />
Declare Function sndPlaySound Lib &#8220;winmm.dll&#8221; Alias &#8220;sndPlaySoundA&#8221; (ByVal lpszSoundName As String, ByVal uFlags As Long) As Long<br />
Add these declares to a BAS module in you project. (I added the sndPlaySound function cause it’s a really easy way of playing wave files, just tmp&#038;=sndPlaySound(&#8220;mywave.wav&#8221;,1))<br />
Right, what does the different parameters of the bitblt do?<br />
•	HDestDC this is the destination HDC (handle to a Device Context) read &#8211; form or picture box<br />
•	X,Y is the position the destination rectangle will start at<br />
•	NWidth, nHeight is the width and height of the rectangle<br />
•	HSrcDC is the source HDC – read form or picturebox<br />
•	XSrc, ySrc provide the offset, or position the source rectangle starts at<br />
•	DwRop is the Raster Operation – read what boolean operation to apply<br />
The key to using bitblt easily is that pictureboxes make great sources for BitBlting. If you make a picturebox autoredraw=true and visible=false then load a picture into the picturebox, it will create an offscreen buffer for you to blt from.<br />
e.g. tmp&#038; = bitblt(form1.hdc,10,10,20,20,picture1.hdc,0,0,srccopy)<br />
Now, form1 is the destination for the bitblt, (where you want the picture to appear). 10,10 is the pixel offset into form1 while the rectangle will be 20 pixels square. Picture1 (invisible and autoredraw=true) is the source image, the chunk taken from 0,0 and srccopy the operation. (srccopy just copies the data)<br />
Sprites<br />
Whats a sprite<br />
Well now that you know a bit about bitblting, lets find out how to blt sprites. Sprites are little irregular images, i.e. NON rectangular.<br />
To make these irregular shaped images we need some trickery, now while you may eventually, or already have, custom routines to blt sprites rotated, sheared, transparent and lit – I am going to focus on using bitblt.<br />
The technique I will show is called masking. The idea is that an image has an associated mask. This mask is applied first, leaving a hole for the image. This is achieved through ROP&#8217;s or raster operations. This is boolean logic on a large scale.<br />
Masks are designed white, with black where they should leave a &#8220;hole&#8221;. To apply the mask to the destination image, rather than just copying the image, we need to SCRAND the mask with the image. This means to make a logical AND of each pixel. The result is that the destination pixel AND&#8217;ed with white is the destination pixel, while the destination pixel AND&#8217;ed with black is black (the &#8220;hole&#8221;).<br />
The image can then be applied. The image should be designed to be black where the mask was white, and coloured where the mask was black. Once again a straight copy is not appropriate as this would not be irregularly shaped. We use SCRINVERT, this is a logical XOR. The result of this is that the destination XOR&#8217;ed with the black surroundings is the destination, and equally the black destination pixels from our mask, XOR&#8217;ed with the coloured centre of the sprite result in the coloured centre of the sprite.<br />
Here&#8217;s a diagram, </p>
<p>Check out the example programs later on for some source code. (whackarat)<br />
Double Buffering<br />
Well the problem with masking, and games in general is that things move around all the time, if computers were infinitely fast this would not be a problem – but as we well know, they bloody well are not. Hence to stop a nasty looking kind of partial redrawing, half done, flickery kind of look, adding buffering to your games is a good plan.<br />
This can be easily described – draw it offscreen, then when you have done all the messy stuff, copy the whole lot to screen.	 </p>
<p>To see some samples of this in use, check out the examples later on. (whackarat)<br />
DirectDraw<br />
Well MS have come to the &#8220;rescue&#8221; of beleaguered game developers, providing a standard hardware independent API for fast gaming. However despite its critics, it has made Windows95 gaming a reality. Whats more all that masking and double buffering stuff above is BUILT IN!<br />
Now thanks to Patrice Scribe VB programmers can use DirectX too. I am just going to stick to DirectDraw (the basics) for now. I would recommend downloading the MS SDK to find out more.<br />
Remember you need Patrice Scribes type libraries.&#8212;<br />
Steps<br />
•	Choose windowed, or a specific full screen mode (e.g. 640 x 480, 16 bit colour)<br />
•	Dimension a directdraw object<br />
•	Make some DirectDraw surfaces<br />
•	Load bitmaps into some surfaces (apply a transparent colour key if required)<br />
•	Do your bitblting in a game loop until game finishes<br />
•	Set objects to nothing<br />
•	Restore the screen<br />
Sounds easy?, well I hope so, cause that’s a real simple overview of the main steps. Luckily, you can just use code from someone else, you don’t really need to know the details of what each bit does.<br />
Hence heres a simple framework to download don&#8217;t forget to check out the menace sample code.<br />
Here is the code and descriptions of what It does.<br />
Boring Declares, you need to add your variables, and any surfaces for bitmaps you want to add.<br />
Dim u As Long<br />
Dim blnend As Boolean<br />
&#8216; Win32<br />
Const IMAGE_BITMAP = 0<br />
Const LR_LOADFROMFILE = &#038;H10<br />
Const LR_CREATEDIBSECTION = &#038;H2000<br />
Const SRCCOPY = &#038;HCC0020<br />
Private Type BITMAP<br />
bmType As Long<br />
bmWidth As Long<br />
bmHeight As Long<br />
bmWidthBytes As Long<br />
bmPlanes As Integer<br />
bmBitsPixel As Integer<br />
bmBits As Long<br />
End Type<br />
&#8216; GDI32<br />
Private Declare Function GetPixel Lib &#8220;gdi32&#8243; (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long<br />
Private Declare Function CreateCompatibleDC Lib &#8220;gdi32&#8243; (ByVal hdc As Long) As Long<br />
Private Declare Function DeleteDC Lib &#8220;gdi32&#8243; (ByVal hdc As Long) As Long<br />
Private Declare Function DeleteObject Lib &#8220;gdi32&#8243; (ByVal hObject As Long) As Long<br />
Private Declare Function GetObject Lib &#8220;gdi32&#8243; Alias &#8220;GetObjectA&#8221; (ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As Long<br />
Private Declare Function SelectObject Lib &#8220;gdi32&#8243; (ByVal hdc As Long, ByVal hObject As Long) As Long<br />
&#8216; USER32<br />
Private Declare Function GetDC Lib &#8220;user32&#8243; (ByVal hwnd As Long) As Long<br />
Private Declare Function LoadImage Lib &#8220;user32&#8243; Alias &#8220;LoadImageA&#8221; (ByVal hInst As Long, ByVal lpsz As String, ByVal un1 As Long, ByVal n1 As Long, ByVal n2 As Long, ByVal un2 As Long) As Long<br />
Private Declare Function StretchBlt Lib &#8220;gdi32&#8243; (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal nSrcWidth As Long, ByVal nSrcHeight As Long, ByVal dwRop As Long) As Long<br />
Private Declare Function ShowCursor Lib &#8220;user32&#8243; (ByVal bShow As Long) As Long<br />
Const ResolutionX = 640 &#8216; Width for the display mode<br />
Const ResolutionY = 480 &#8216; Height for the display mode<br />
Dim dd As DirectDraw2 &#8216; DirectDraw object<br />
Dim ddsdFront As DDSURFACEDESC &#8216; Front surface description<br />
Dim ddsFront As DirectDrawSurface2 &#8216; Front buffer<br />
Dim ddsBack As DirectDrawSurface2 &#8216; Back buffer<br />
Dim ddCaps As DDSCAPS &#8216; Capabilities for search<br />
Dim fx As DDBLTFX<br />
‘******************************<br />
‘your own surfaces here , e.g.<br />
Dim aDDS As DirectDrawSurface2 &#8216; Images to blit<br />
Dim tDDS As DirectDrawSurface2 &#8216; tiles to blit<br />
&#8216; Loads a bitmap in a DirectDraw surface<br />
Private Function CreateDDSFromBitmap(dd As DirectDraw2, ByVal strFile As String) As DirectDrawSurface2<br />
Dim hbm As Long &#8216; Handle on bitmap<br />
Dim bm As BITMAP &#8216; Bitmap header<br />
Dim ddsd As DDSURFACEDESC &#8216; Surface description<br />
Dim dds As DirectDrawSurface2 &#8216; Created surface<br />
Dim hdcImage As Long &#8216; Handle on image<br />
Dim mhdc As Long &#8216; Handle on surface context<br />
Dim clr As Long &#8216;hold the colour top left to be made transparent<br />
&#8216; Load bitmap<br />
hbm = LoadImage(ByVal 0&#038;, strFile, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE Or LR_CREATEDIBSECTION)<br />
&#8216; Get bitmap info<br />
GetObject hbm, Len(bm), bm<br />
&#8216; Fill surface description<br />
With ddsd<br />
.dwSize = Len(ddsd)<br />
.dwFlags = DDSD_CAPS Or DDSD_HEIGHT Or DDSD_WIDTH<br />
.DDSCAPS.dwCaps = DDSCAPS_OFFSCREENPLAIN<br />
.dwWidth = bm.bmWidth<br />
.dwHeight = bm.bmHeight<br />
End With<br />
&#8216; Create surface<br />
dd.CreateSurface ddsd, dds, Nothing<br />
&#8216; Create memory device<br />
hdcImage = CreateCompatibleDC(ByVal 0&#038;)<br />
&#8216; Select the bitmap in this memory device<br />
SelectObject hdcImage, hbm<br />
&#8216; Restore the surface<br />
dds.Restore<br />
&#8216; Get the surface&#8217;s DC<br />
dds.GetDC mhdc<br />
&#8216; Copy from the memory device to the DirectDrawSurface<br />
StretchBlt mhdc, 0, 0, ddsd.dwWidth, ddsd.dwHeight, hdcImage, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY<br />
&#8216;get the top left colour<br />
clr = GetPixel(mhdc, 0, 0)<br />
&#8216; Release the surface&#8217;s DC<br />
dds.ReleaseDC mhdc<br />
&#8216; Release the memory device and the bitmap<br />
DeleteDC hdcImage<br />
DeleteObject hbm<br />
&#8216;make surface transparent<br />
Dim mhddck As DDCOLORKEY<br />
mhddck.dwColorSpaceLowValue = clr &#8216;really works only for 24 bit colour<br />
mhddck.dwColorSpaceHighValue = clr &#8216;but as sprites have black is all 0 at any rate<br />
dds.SetColorKey DDCKEY_SRCBLT, mhddck<br />
&#8216; Returns the new surface<br />
Set CreateDDSFromBitmap = dds<br />
End Function<br />
Private Sub Form_KeyPress(KeyAscii As Integer)<br />
&#8216;quit out for now<br />
blnend = True<br />
End Sub<br />
Add you own images to be loaded in here, and any data you may want to load like maps…<br />
Private Sub Form_Load()<br />
ShowCursor 0<br />
&#8216; Create the DirectDraw object<br />
DirectDrawCreate ByVal 0&#038;, dd, Nothing<br />
&#8216; This app is full screen and will change the display mode<br />
dd.SetCooperativeLevel Me.hwnd, DDSCL_EXCLUSIVE Or DDSCL_FULLSCREEN<br />
&#8216; Set the display mode (16 is the bit depth)<br />
dd.SetDisplayMode ResolutionX, ResolutionY, 16, 0, 0<br />
‘ *****************************<br />
&#8216; Load your own images, e.g.<br />
Set aDDS = CreateDDSFromBitmap(dd, App.Path &#038; &#8220;\menace.BMP&#8221;)<br />
Set tDDS = CreateDDSFromBitmap(dd, App.Path &#038; &#8220;\tiles.BMP&#8221;)<br />
&#8216; Fill front buffer description structure&#8230;<br />
With ddsdFront<br />
&#8216; Structure size<br />
.dwSize = Len(ddsdFront)<br />
&#8216; Use DDSD_CAPS and BackBufferCount<br />
.dwFlags = DDSD_CAPS Or DDSD_BACKBUFFERCOUNT<br />
&#8216; Primary, flipable surface<br />
.DDSCAPS.dwCaps = DDSCAPS_PRIMARYSURFACE Or DDSCAPS_FLIP Or DDSCAPS_COMPLEX Or DDSCAPS_SYSTEMMEMORY<br />
&#8216; One back buffer (you can try 2)<br />
.dwBackBufferCount = 1<br />
End With<br />
&#8216; Create front buffer<br />
dd.CreateSurface ddsdFront, ddsFront, Nothing<br />
&#8216; Retrieve the back buffer object<br />
ddCaps.dwCaps = DDSCAPS_BACKBUFFER<br />
ddsFront.GetAttachedSurface ddCaps, ddsBack<br />
End Sub<br />
Heres where everything happens, insert your game here! The drawnextframe subroutine is called in a tight loop – updating as fast as possible.<br />
I have put a stupid example in here for you, painting the backbuffer black, and copying a bit of bitmap to the same place every frame.<br />
Useless I know, but I included the clearbackbuffer, as it may come in handy for asteroids type games where you want to start with a new black screen every frame.<br />
The sample bltfast routine is just to show you how it works. You basically use the RECT to describe where from your surface you want to pull the graphics from. You then reference ddsBack (the back buffer you draw on, and we later flip to the front) method bltfast with the x and y position for the sprite, your sprite surface, the aforementioned RECT and some constants.<br />
p.s. If you want your blit to be a solid rectangle rather than irregular use DDBLTFAST_NOCOLORKEY instead of DDBLTFAST_SRCCOLORKEY<br />
Private Sub DrawNextFrame()<br />
&#8216;you may wish to clear the beackground first e.g.<br />
ClearBackBuffer<br />
&#8216;do your bltting in here. This is where all the good<br />
&#8216;stuff goes e.g. a simple example<br />
Dim t As RECT<br />
t.Top = 10<br />
t.Left = 10<br />
t.Right = 100<br />
t.bottom = 100<br />
ddsBack.BltFast xx%, yy%, tDDS, t, DDBLTFAST_SRCCOLORKEY Or DDBLTFAST_WAIT<br />
&#8216;beware BltFast relies on you making sure<br />
&#8216;the rectangle is not bigger than the<br />
&#8216;screen.<br />
&#8216;flip the buffers<br />
Do<br />
ddsFront.Flip Nothing, 0<br />
If Err.Number = DDERR_SURFACELOST Then ddsFront.Restore<br />
Loop Until Err.Number = 0<br />
End Sub<br />
Sub ClearBackBuffer()<br />
Dim t As RECT<br />
&#8216;On Error Resume Next<br />
&#8216; Clear the back buffer<br />
With fx<br />
.dwSize = Len(fx)<br />
.dwFillColor = RGB(0, 0, 0)<br />
End With<br />
t.Top = 0<br />
t.Left = 0<br />
t.bottom = ResolutionY<br />
t.Right = ResolutionX<br />
ddsBack.Blt t, Nothing, t, DDBLT_COLORFILL, fx<br />
End Sub<br />
Here’s the main tight loop, followed by the clean up stuff…<br />
Private Sub Timer1_Timer()<br />
Timer1.Enabled = 0<br />
&#8216;Render loop<br />
While Not blnend<br />
DrawNextFrame<br />
u = DoEvents<br />
Wend<br />
&#8216;clean up<br />
Set aDDS = Nothing<br />
Set tDDS = Nothing<br />
dd.FlipToGDISurface<br />
dd.RestoreDisplayMode<br />
dd.SetCooperativeLevel 0, DDSCL_NORMAL<br />
Set ddsBack = Nothing<br />
Set ddsFront = Nothing<br />
Set dd = Nothing<br />
ShowCursor 1<br />
Unload Form2</p>
<p>End Sub</p>
]]></content:encoded>
			<wfw:commentRss>http://www.genelbilge.com/game-programming-tutorials.html/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C ortamında Yazılım geliştirme Nayıl Yapılır</title>
		<link>http://www.genelbilge.com/c-ortaminda-yazilim-gelistirme-nayil-yapilir.html/</link>
		<comments>http://www.genelbilge.com/c-ortaminda-yazilim-gelistirme-nayil-yapilir.html/#comments</comments>
		<pubDate>Sat, 17 Oct 2009 22:16:10 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Bilgisayar]]></category>
		<category><![CDATA[Programlama]]></category>
		<category><![CDATA[Algoritma]]></category>
		<category><![CDATA[Descartes]]></category>
		<category><![CDATA[Discourse On Method]]></category>
		<category><![CDATA[Genel]]></category>
		<category><![CDATA[Hemen]]></category>
		<category><![CDATA[Kabul]]></category>
		<category><![CDATA[Latince]]></category>
		<category><![CDATA[Mehmet]]></category>
		<category><![CDATA[Nin]]></category>
		<category><![CDATA[Tahmin]]></category>
		<category><![CDATA[Yy]]></category>

	<!-- AutoMeta Start -->
	<category></category>
	<!-- AutoMeta End -->
	
		<guid isPermaLink="false">http://www.genelbilge.com/?p=11208</guid>
		<description><![CDATA[Problem Çözme Problem çözmede, soruna hemen girişmek yerine, dikkatli ve sistematik yaklaşım ilke olmalıdır. Problem iyice anlaşılmalı ve mümkün olduğu kadar küçük parçalara ayırılmaladır. Descartes tarafından &#8220;Discourse on Method&#8221; isimli kitabında anlatılan problem çözme teknikleri;[2] 1. Doğruluğu kesin olarak kanıtlanmadıkça, hiçbir şeyi doğru olarak kabul etmeyin; tahmin ve önyargılardan kaçının. 2. Karşılaştığınız her güçlüğü mümkün [...]]]></description>
			<content:encoded><![CDATA[<p>Problem Çözme<br />
	Problem çözmede, soruna hemen girişmek yerine, dikkatli ve sistematik yaklaşım ilke olmalıdır.  Problem iyice anlaşılmalı ve mümkün olduğu kadar küçük parçalara ayırılmaladır.<br />
Descartes tarafından &#8220;Discourse on Method&#8221; isimli kitabında anlatılan problem çözme teknikleri;[2]<br />
1. Doğruluğu kesin olarak kanıtlanmadıkça, hiçbir şeyi doğru olarak kabul etmeyin; tahmin ve önyargılardan kaçının.<br />
2. Karşılaştığınız her güçlüğü mümkün olduğu kadar çok parçaya bölün.<br />
3. Düzenli bir biçimde düşünün; anlaşılması en kolay olan şeylerle başlayıp yavaş yavaş daha zor ve karmaşık olanlara doğru ilerleyiniz.<br />
4. Olaya bakışınız çok genel, hazırladığınız ayrıntılı liste ise hiçbir şeyi dışarıda bırakmayacak kadar kusursuz ve eksiksiz olsun.<br />
<span id="more-11208"></span><br />
1.2  Algoritmalar<br />
	Belirli bir görevi yerine getiren sonlu sayıdaki işlemler dizisidir.<br />
İ.S. 9.yy da İranlı Musaoğlu Horzumlu Mehmet<br />
(Alharezmi adını araplar takmıştır) problemlerin çözümü için genel kurallar oluşturdu.  Algoritma Alharezmi&#8217;nin Latince okunuşu.<br />
Her algoritma aşağıdaki kriterleri sağlamalıdır.<br />
1. Girdi: Sıfır veya daha fazla değer dışarıdan verilmeli.<br />
2. Çıktı: En azından bir değer üretilmeli.<br />
3. Açıklık: Her işlem (komut) açık olmalı ve farklı anlamlar içermemeli.<br />
4. Sonluluk: Her türlü olasılık için algoritma sonlu adımda bitmeli.<br />
5. Etkinlik: Her komut kişinin kalem ve kağıt ile yürütebileceği kadar basit olmalıdır.<br />
Not: Bir program için 4. özellik geçerli değil. işletim sistemleri gibi program sonsuza dek çalışırlar .</p>
<p>Örnek 1.2.1 : 1&#8242;den 100&#8242;e kadar olan sayıların toplamını veren algoritma.<br />
1. Toplam T, sayılar da i diye çağırılsın.<br />
2. Başlangıçta T&#8217;nin değeri 0 ve i&#8217;nin değeri 1 olsun.<br />
3. i&#8217;nin değerini T&#8217;ye ekle.<br />
4. i&#8217;nin değerini 1 arttır.<br />
5. Eğer i&#8217;nin değeri 100&#8242;den büyük değil ise 3. adıma git.<br />
6. T&#8217;nin değerini yaz.<br />
	Algoritmaların yazım dili değişik olabilir. Günlük konuşma diline yakın bir dil olabileceği gibi simgelere dayalı da olabilir.  Akış şeması eskiden beri kullanıla gelen bir yapıdır. Algoritmayı yazarken farklı anlamlar taşıyan değişik şekildeki kutulardan yararlanılır.  Yine aynı amaç için kullanılan programlama diline yakın bir (sözde kod = pseudo code) dil , bu kendimize özgü de olabilir, kullanılabilir.</p>
<p>Aynı algoritmayı aşağıdaki gibi yazabiliriz.<br />
1. T=0 ve i=0<br />
2. i&#8217;nin değerini T&#8217;ye ekle.<br />
3. i&#8217;yi 1 arttır.<br />
4. i<101  ise  2.adıma git.<br />
5. T'nin değerini yaz.</p>
<p>Algoritmayı bir de akış şeması ile gerçekleyelim.</p>
<p>	T=0<br />
	İ=0</p>
<p>      İ’nin Değrini T’ye ekle</p>
<p>          İ’yi bir arttır</p>
<p>             İ<101</p>
<p>       T’yi yaz</p>
<p>Örnek 1.2.2 : ax2+bx+c=0 tipi bir denklemin köklerini veren algoritma.<br />
Girdi : a, b ve c katsayıları       Çıktı : denklemin kökleri<br />
1. a, b ve c katsayılarını al.<br />
2. D = b2-4ac değerini hesapla.<br />
3. D<0 ise gerçel kök yok.  7. adıma git.<br />
4.<br />
5 .<br />
6.   değerlerini yaz.<br />
7. Dur.<br />
Döngü Gösterimi<br />
Tekrarlanan adımlar<br />
n	Koşul sağlandığı sürece<br />
	n.1 ...<br />
	n.2 ...    		tekrarlanan adımlar<br />
		n.3 ...</p>
<p>Örnek 1.2.3 : İki tamsayının çarpma işlemini sadece toplama işlemi kullanarak gerçekleyin.<br />
Girdi : iki tamsayı<br />
Çıktı : sayıların çarpımı<br />
1	a ve b sayılarını oku<br />
2	c =0<br />
3	b>0 olduğu sürece tekrarla<br />
	.3.1. c=c + a<br />
	 3.2. b = b-1<br />
4.  c değerini yaz ve dur</p>
<p>Örnek 1.2.4 : Bir tamsayının faktoriyelini hesaplayınız.<br />
Girdi : Bir tamsayı<br />
Çıktı : sayının faktoriyel<br />
İlgili formul: Faktoriyel(n)=1*2*&#8230;*n<br />
1	n değerini oku<br />
2	F=1<br />
3	n >1 olduğu sürece tekrarla<br />
	.3.1. F=F*n<br />
	 3.2. n= n-1<br />
4	F değerini yaz<br />
Örnek 1.2.5 : İki tamsayının bölme işlemini sadece çıkarma işlemi kullanarak gerçekleyin. Bölüm ve kalanın ne olduğu bulunacak.<br />
1. a ve b değerlerini oku<br />
2. m=0<br />
3. a>=b olduğu sürece tekrarla<br />
1	a=a-b<br />
2	 m = m + 1<br />
4. kalan a ve bölüm m &#8216;yi yaz</p>
<p>Örnek 1.2.6 :  100 tane sayıyı okuyup, ortalamasını bul<br />
1	T=0,	i=0<br />
2	i<101 olduğu sürece tekrarla<br />
3	  m değerini oku<br />
4	 T = T + m<br />
5	 i = i + 1<br />
6	T = T / 100<br />
7	Ortalama T ‘yi yaz<br />
8	Dur</p>
<p>Örnek 1.2.7 : Bir sınava giren öğrencilerin not ortalamasının hesaplanması<br />
1	Tüm sınav kağıtlarını inceleyip notların toplamını hesapla<br />
2	Ortalamayı notların toplamını incelenen sınav kağıdına bölerek hesapla<br />
3	Ortalamayı yaz.</p>
<p>1	Notların toplamını ve incelenen sınav kağıdı sayısını sıfır kabul et<br />
2	Sıradaki sınav kağıdının notunu notların toplamına ekle<br />
3	İncelenen sınav kağıdı sayısını Bir arttır<br />
4	İncelenecek sınav kağıdı var ise 2. Adıma git<br />
5	Ortalamayı notların toplamını incelenen sınav kağıdına bölerek hasapla<br />
6	Ortalamayı yaz</p>
<p>1	Notların toplamını ve incelenen sınav kağıdı sayısını sıfır kabul et<br />
2	Her bir sınav kağıdı için<br />
3	Sıradaki sınav kağıdının notunu notların toplamına ekle<br />
4	İncelenen sınav kağıdı sayısını bir arttır<br />
5	Ortalamayı notların toplamını incelenen sınav kağıdına bölerek hesapla<br />
6	Ortalamayı yaz</p>
<p>Koşul Gösterimi</p>
<p>n	Koşul doğru ise<br />
	n.D.1<br />
	n.D.2		doğru olduğunda işlenen adımlar<br />
	n.D.3<br />
aksi halde<br />
	n.Y.1<br />
	n.Y.2		yanlış olduğunda işlenen adımlar<br />
	n.Y.3</p>
<p>Kök bulma örneğinde 3. Adımı tekrar yazarsak<br />
3	D>=0 ise<br />
	3.D.1<br />
3.D.2<br />
aksi halde<br />
	3.Y.1  Reel kök yoktur</p>
<p>Sorular:<br />
* Girilen üç sayıdan en büyüğünü bulan algoritmayı yazınız.<br />
* Tamsayılarda üs alma işlemini gerçekleştiren algoritmayı yazınız ( ab ).<br />
*  1-100 arasında tutulan bir sayıyı tahmin eden algoritmayı yazınız.</p>
<p>Örnek 1.2.8 : Aracın otopark ücretinin hesaplanması. Araçların en fazla 24 saat kaldığını varsayın.<br />
	0 &#8211; 2 saat	150 bin<br />
	2 &#8211; 8 saat	300 bin<br />
	8-24 saat	500 bin</p>
<p>1	Aracın kaç saat kaldığını öğren ( t olsun ).<br />
2	t <= 2 ise<br />
      2.D.1. ücret = 150 bin<br />
Aksi halde<br />
      2.Y.1. t<=8 ise<br />
                2.Y.1.D.1. ücret = 300 bin<br />
      Aksi halde<br />
                2.Y.1.Y.1. ücret = 500 bin</p>
<p>3	ücreti yaz<br />
4	Dur</p>
<p>Örnek 1.2.9: Sınavdaki en büyük notun bulan algoritma.</p>
<p>1	En büyük = ilk sınav kağıdındaki not   (ya da olabilecek en düşük değer kabul edilebilir).<br />
2	İncelenecek sınav kağıdı var ise<br />
3	Sınav kağıdındaki not > En büyük ise En büyük = Sınav kağıdındaki not</p>
<p>3	En büyük değerini yaz.<br />
4	Dur</p>
<p>Algoritmanın yazımı daha simgesel olabilir.  Ni  i. Öğrencinin notu olsun.</p>
<p>1	EB = N1<br />
2	i = 2<br />
3	İncelenecek sınav kağıdı var ise<br />
4	Ni>EB => EB = Ni<br />
5	i = i + 1</p>
<p>4	EB’ yi yaz.<br />
5	Dur</p>
<p>Örnek 1.2.10 : Programın C dili ile yazılıp çalışır hale getirilmesi.</p>
<p>1	Programı bilgisayara gir<br />
2	Kaynak dosya olarak kaydet<br />
3	Kaynak dosyayı derle ( compile)<br />
4	Derleme sonucunda hata var ise<br />
5	  Hataları düzelt<br />
6	  3. Adıma git<br />
7	Oluşan amaç dosyasına diğer dosyaları bağla (link)<br />
8	Bağlama sonucunda hata var ise<br />
9	Hataları düzelt<br />
10	Hatalar kaynak dosya ile ilgili ise 2. adıma aksi halde 5. adıma git<br />
11	Program çalıştırılmaya hazır</p>
<p>2-   Programlamaya Giriş</p>
<p>Program : Belirli bir problemi çözmek için bir bilgisayar dili kullanılarak yazılmış deyimler dizisi.<br />
Önceki bölümde bir problemin çözümü ile ilgili teknikler sunmuştuk.  Bir problemi bilgisayar ile çözmek için geliştireceğimiz programın yazımında izleyeceğimiz adımlar:</p>
<p>i) Problemin ne olduğunu kavra. Çözüm için gereksinimleri belirle.<br />
ii) Problemin girdilerini, çıktılarını ve diğer kısıtlama ve gereksinimleri belirle ( bilgilerin giriş ve çıkış biçimlerinin nasıl olacağına kadar).<br />
iii) Problemin çözümünü veren algoritmayı yaz.<br />
iv) Algoritmayı bir programla dili ile yaz.<br />
v) Programın doğru çalışıp çalışmadığını test et. Bu testi değişik veriler (girdiler) için tekrarla.</p>
<p>2.1  İlk Program Örneği<br />
#include <stdio.h>                      Kullanılan işlevler ile ilgili başlık dosyası<br />
main()<br />
{<br />
	int i ;                            Değişken tanımı<br />
	scanf(&#8220;%d&#8221;,&#038;i);          Programın gövdesi<br />
	i:=i*i;<br />
	printf(&#8220;%d&#8221;,i);<br />
}</p>
<p>BCPL    B (1967 Ken Thompson)   C (Denis Ritchie unix i yazmak için)<br />
az sayıda saklı sözcük kısa ve etkin program çok sayıda işleç assembler e yakın kod taşınabilir kod	kullanıcıya bırakılan kontroller (dizinin boyutu gibi ) düşük okunabilirlik<br />
    source   &#8212;&#8211;>    compiler   &#8212;&#8211;>    object    &#8212;&#8211;>  link<br />
     kaynak             derleyeci               amaç              bağlama<br />
kaynak kod : C dili ile yazılmış olan program.<br />
derleyeci      : Kaynak kodu makina koduna çevirir<br />
amaç kodu   : Kaynak kodun makina dilindeki karşılığı<br />
bağlama       : Birden fazla amaç kodu dosyasının tek dosyada birleştirilmesi<br />
2.2  Veri Tipleri  </p>
<p>Veri tiplerini vermeden önce yazılan bir programın geçtiği aşamalara göz atalım.</p>
<p>2.2.1  Int Tip<br />
Integer = Tamsayı<br />
Tamsayıları içerir. Bellekte 2 Byte tutar.<br />
5 , -19 , 25000 gibi<br />
Minimum   : -231     = -32768<br />
Maksimum :  231-1   =  32767</p>
<p>2.2.2  Gerçel Tipler (Float, Double)<br />
Gerçel sayıları içerirler.<br />
float    : Bellekte 4 Byte yer tutar. 3.4E-38 ile 3.4E+38 aralığında değer alır. Hassasiyet 7-8 basamaktır.<br />
double :  Bellekte 8 Byte ter tutar. 1.7E-308 ile 1.7E308 aralığında değer alır. Hassasiyet 15-16 basamaktır.</p>
<p>218.1 , -5.2 , 4.0</p>
<p>Bilimsel gösterim biçimi   2.5*103  = 2.5E3                                        2.5*10-3  = 2.5E-3</p>
<p>2.2.3  Char  Tip<br />
Char : Karakter   : Alfanumerik karakterleri içerir.<br />
&#8217;5&#8242; , &#8216;*&#8217; , &#8216;K&#8217;</p>
<p>2.3  Sabitler (CONST)</p>
<p>#include <stdio.h><br />
main()<br />
{<br />
const float PI=3.14;                                                Tanımlama kısmı<br />
float   r, Alan;<br />
scanf(&#8220;%f&#8221;,r);<br />
alan := PI*r*r;<br />
printf((&#8216;Alan = %f&#8217;, alan);<br />
}<br />
CONST (sabit) : Değeri programın çalışması boyunca değiştirilemez. Kullanım biçimi<br />
const tip Belirleyici=değeri;<br />
const  float PI=3.14;<br />
Tip belirtilmez ise tamsayı kabul edilir.</p>
<p>2.4  Değişkenler<br />
Değeri programın çalışması boyunca değiştirilekir. Kullanım biçimi:<br />
Tip Belirleyici [,Belirleyici]  ;<br />
int i;<br />
float alan;</p>
<p>2.5  Belirleyiciler (Identifier)<br />
Bileşenlere isim verme.  (Sabit, değişken, altprogram, etiket,  tipler (kullanıcı tanımlı)).</p>
<p>2.5.1  Kısıtlamalar<br />
. İlk karakteri rakam olamaz<br />
. Sadece harfler, rakamlar ve _ (underscore) karakterinin birleşiminden oluşabilir.<br />
. C diline ait saklı (reserved) sözcükler kullanılamaz.<br />
. En fazla 31 karakter olabilir.<br />
. Küçük &#8211; büyük harf ayırımı vardır.</p>
<p>2.5.2  isimlerin Seçimi<br />
. Belirleyicinin kullanım amacına uygun anlamlı isim seçin. (Hungarian notation)<br />
. Ne fazla kısa ne de fazla uzun olsun. 3 &#8211; 10 karakter uzunluğunda olmasını alışkanlı edinin.<br />
2.6  Matematiksel ifadeler<br />
Matematiksel ifadeleri günlük hayattaki biçimde bilgisayarda yazamadığımız için belli bir kurallar uymamız gerekir.  Kullandığımız matematiksel işlemler ve anlamları şöyledir:<br />
+ , &#8211; , * , /         toplama, çıkarma, çarpma,  bölme<br />
%   tamsayı bölme sonucundaki kalanı verir (modulus)<br />
7. / 2   &#8212;> 3.5         (nokta sayının gerçel yorumlanmasını sağlar)<br />
7 / 2    &#8212;> 3             (sayılar int kabul edilip sonuçta int tipine dönüştürülür)<br />
7 % 2  &#8212;> 1<br />
2 % 7  &#8212;> 2<br />
2 / 7    &#8212;> 0<br />
Matematiksel ifadeler hesaplanırken izlenen adımlar:<br />
1. Önce parantez içindeki ifadeler hesaplanır. İçiçe parantezler var ise hesaplamaya en içteki parantezden başlanır.<br />
2. ilk önce * , /  ve % işlemleri daha sonra + ve &#8211; işlemleri yapılır.<br />
3	Öncelik sırası aynı olan işlemlerde hesaplama soldan sağa doğru yapılır.                   5./2*3   &#8211;>  7.5</p>
<p>Bir C Programının Genel Yapısı</p>
<p>başlık dosyaları. Kullanılan deyimler ile ilgili<br />
main()<br />
{<br />
	sabitler ;		sabitlerin tanımlama bölümü<br />
	değişkenler; 	değişkenleri tanımlama bölümü<br />
	deyimler;	Program gövdesi<br />
}</p>
<p>2.7  Atama Deyimi (Assignment)<br />
Bir değişkene bir değer(sabit, değişken, ifade) vermek.<br />
DeğişkenAdı = değer;<br />
x = 8 ;<br />
y = x + 15 ;<br />
y = (8 &#8211; x) / (2 &#8211; x) ;</p>
<p>Örnek 2.7.1:   5&#215;2+2 fonksiyonunun x=4.8 noktasındaki değerini main() {    float x, y ;    x = 4.8;    y = 5 * x * x + 2; } 	Örnek 2.7.2:  Vize ve final notlarınından geçme notu main() {   float vize, final, ort;   vize = 50;   final = 60;   ort = vize * 0.4 + final * 0.6; } 	Örnek 2.7.3:  1998 yılına kadar geçen gün sayısı main() {   float gun;   int yil = 1996;   gun = 365 * (yil &#8211; 1);   gun = gun + (yil -1 ) / 4; }</p>
<p>2.8  printf  işlevi<br />
Program içinde istenen değerleri çıktı birimlerine göndermek için kullanılır.  Normal kullanımında çıktı birimi olarak ekran kabul edilir. Kullanım biçimi:</p>
<p>  prinf( kontrol,
<parametreler>)<br />
<kontrol> ile belirtilen bilgiye göre parametreleri yazar. Kontrol metini iki kısımdan oluşur.<br />
     o  sıradan karakterler: doğrudan yazılırlar.<br />
     o  dönüşüm/biçim belirleyici karakterler: Değerlerin nasıl yazılacağı bildirilir.</p>
<p>  printf(&#8221; sonuç =  %d&#8221;, k);<br />
                             &#8212;  integer değer yazılacaktır<br />
              &#8212;&#8212;&#8212;          ekrana aynen aktarılır</p>
<p>Dönüşüm belirlemek için önce % karakteri ve ardından dönüşümün nasıl<br />
olacağını belirten karakter verilir. Bu karakterlerden bazıları:</p>
<p>         d : decimal (integer)<br />
         u : unsigned decimal<br />
         c : char (tek karakter)<br />
         s : string<br />
         e : float/double sayıyı bilimsel gösterimde yaz<br />
         f : float/double sayıyı [-] mmm.nnnnn biçiminde yaz<br />
        ld : long integer<br />
        lu : unsigned long integer<br />
        Le,Lf : long double</p>
<p>ESC dizileri : \n  : satır başı,   \a : zil   , \t : tab,  \b : bir karakter geri</p>
<p>program parçası                        ekranda görünen / imleçin konumu<br />
i = 5 ;<br />
printf(&#8220;%d&#8221;,i) ;                           5<br />
printf(&#8220;&#8216;i=%d&#8221;,i) ;                      i=5<br />
printf(&#8220;i=&#8221;) ;<br />
printf(&#8220;%d&#8221;,i) ;                           i=5 -</p>
<p>printf(&#8220;i=\n&#8221;) ;                             i=<br />
printf(&#8220;%d&#8221;,i) ;                           5     alt satıra geçer</p>
<p>printf(&#8216;i=%d\n&#8221;,i) ;                         i=5  alt satıra geçer</p>
<p>printf(&#8220;%d  &#8211;  %d&#8221;,i, 5*i);                5  &#8211;  25</p>
<p>Biçimli yazdırma<br />
% karakteri ile dönüşüm karakteri arasına aşağıdaki karakterler de kullanılabilir.</p>
<p>        &#8211;  : sola dayalı yaz<br />
        m  : yazılacak değer için ayırılan alan<br />
        n  : değerin kaç karekteri yazılacağı</p>
<p>    s = &#8220;ABCDEF&#8221;<br />
   printf(&#8220;%10s  &#8220;,s);                     . . . . A B C D E F</p>
<p>   printf(&#8220;%10.3s  &#8220;,s);                 . . . . . . . A B C</p>
<p>x = 128.5 ;<br />
printf(&#8220;%7.2f&#8221;,x) ;                                 # 128.50</p>
<p>x = 85.47 ;<br />
printf(&#8220;%6.3f&#8221;,x) ;                                85.470</p>
<p>printf(&#8220;%6.1f&#8221;,x) ;                               ## 85.5                                                    </p>
<p>Örnek 2.8.1 : Yarıçapı belli dairenin alanını hesaplayan programı yazınız. (ilk yazılan program)<br />
#include <stdio.h><br />
main()<br />
{<br />
const float PI=3.14;<br />
float   r, alan;<br />
r = 7;<br />
alan := PI*r*r;<br />
printf((&#8216;Alan = %f&#8217;, alan);<br />
}</p>
<p>Örnek 2.8.2 : En fazla dört basamak olabilen sayının basamak değerlerini yazdır. % ve / işlemlerinin  kullanımı.<br />
#include <stdio.h><br />
main()<br />
{<br />
  int i,y;</p>
<p>       y=1985;<br />
       i= y / 1000;<br />
       printf(&#8220;%d&#8221;,i);<br />
       y= y-i*1000;<br />
       i= y / 100;<br />
       printf(&#8221; %d&#8221;,i);<br />
       y = y-i*100;<br />
       i= y / 10;<br />
       printf(&#8221; %d&#8221;,i);<br />
       y = y-i*10;<br />
       printf(&#8221; %d\n&#8221;,y);<br />
       i = 1985;<br />
       printf(&#8220;%d &#8220;,i / 1000);<br />
       printf(&#8220;%d &#8220;,(i / 100) % 10);<br />
       printf(&#8220;%d &#8220;,(i / 10) % 10);<br />
       printf(&#8220;%d\n&#8221;,i  % 10);<br />
}</p>
<p>Örnek 2.8.3: ax2+bx+c=0 tipi bir denklemin köklerini veren programı yazınız.<br />
Girdi : a, b ve c katsayıları<br />
Çıktı : denklemim kökleri<br />
Algoritma :<br />
1. a, b ve c katsayılarını oku.<br />
2. Delta=  değerini hesapla.<br />
3. x1 ve x2 değerlerini hesapla.<br />
4. Kökleri yaz.</p>
<p>Programın kodlanması:</p>
<p>#include <stdio.h>             /* printf işlevi için */<br />
#include<br />
<math.h>             /* sqrt işlevi için     */<br />
main()<br />
{<br />
   float a, b, c;<br />
   float x1, x2;<br />
   float d;</p>
<p>   a = 1;<br />
   b = -3;<br />
   c = 2;<br />
   d = b * b &#8211; 4 * a * c;<br />
   x1 = (-b + sqrt(d)) / (2 * a);<br />
   x2 = (-b &#8211; sqrt(d)) / (2 * a);</p>
<p>   printf(&#8220;Kökler = %f ,  %f&#8221;,x1, x2);<br />
 }<br />
C dilinde karekök almak için bir deyim yoktur. Örnekte bunu yerine getiren C diline eklenmiş olan sqrt() fonksiyonu kullanılmştır.  Aşağıda buna benzer artık C derleyecilerinde  standart olmuş bazı fonksiyonlar verilmiştir. Bu işlevler math.h başlık dosyasında tanımlıdır.<br />
Fonksiyon                x ,y             Sonuç<br />
abs(x)	int	int	x&#8217;in mutlak değeri<br />
fabs(x)	double	double	x&#8217;in mutlak değeri<br />
pow(x, y)	double	double	xy<br />
sqrt(x)	double	double	x&#8217;in karekökü<br />
exp(x)	double	double               ex değeri<br />
log(x)	double	double               ln(x) değeri<br />
log10(x)	double	double               log10(x) değeri<br />
ceil(x)	double	double	x ten büyük ilk tamsayı<br />
floor(x)	double	double	x ten küçük ilk tamsayı</p>
<p>Örnekler:<br />
ceil(5)	5<br />
ceil(5.2)	6<br />
ceil(-5.2)	-5<br />
floor(5)	5<br />
floor(5.2)	5<br />
floor(-5.2)	-6</p>
<p>2.9  scanf  İşlevi<br />
Klavyeden veri okumak için kullanılır. Yapı olarak printf işlevi ile hemen hemen aynıdır. Kullanım biçimi:</p>
<p>  scanf( kontrol, <değişkenler>)</p>
<p>Girilen karakterler <kontrol> metininde belirtilen biçimlere göre değişkenlere aktarılır.<br />
Değişkenler işaretçi tipinde olmalıdır. Yani parametre olarak değişkenin adresi gönderilmelidir.<br />
Ayırıcılar  boşluk, tab, enter</p>
<p>  scanf(&#8220;%f %f %f &#8220;, &#038;a, &#038;b, &#038;c);</p>
<p>  scanf işlevinin değeri<br />
      0 ise hiçbir değişkene değer atanmamış<br />
     >0 ise başarılı bir şekilde değer atanan değişken sayısı<br />
int a,b,c;<br />
float m,n;<br />
scanf(&#8220;%d&#8221;, &#038;a);                  Klavyeden tamsayı okur. Girilen değer a değişkenine aktarılır.<br />
scanf(&#8220;%d %d&#8221;,&#038;a,&#038;b)        Klavyeden girilen ilk değer a değişkenine, ikinci değer b değişkenine aktarılır.<br />
scanf(&#8220;%f %d&#8221;, &#038;m, &#038;a);     Klavyeden ilki gerçel, ikincisi tamsayı olmak üzere iki değer okur.</p>
<p>İkinci dereceden denklem çözümünün yapıldığı örnekte katsayıları klavyeden okutmak istersek</p>
<p>scanf(&#8220;%f %f %f &#8220;, &#038;a, &#038;b, &#038;c);</p>
<p>Farklı kullanıcı arayüzünde yazarsak</p>
<p>printf(“Katsayıları sırasıyla giriniz (a  b  c) :” );   scanf(&#8220;%f %f %f &#8220;, &#038;a, &#038;b, &#038;c);</p>
<p>printf(“a katsayısını giriniz : “);  scanf(“%f”, &#038;a);<br />
printf(“b katsayısını giriniz : “);  scanf(“%f”, &#038;b);<br />
printf(“c katsayısını giriniz : “);  scanf(“%f”, &#038;c);</p>
<p>Örnek 2.9.1:  Vize ve final notlarınından ortalamayı hesaplayan programda değerlerin klavyeden okunmuş hali.<br />
main()<br />
{<br />
  float vize, final, ort;<br />
  printf(“Vize notunu giriniz “);  scanf(“%f”, &#038;vize);<br />
  printf(“Final notunu giriniz “);  scanf(“%f”, &#038;final);<br />
  ort = vize * 0.4 + final * 0.6;<br />
  printf(“Ortalaması = &#038;f\n”, ort);<br />
}</p>
<p>2.10 Mantıksal ifadeler<br />
Sonucu Doğru  veya Yanlış olan ifadelerdir.  Sonuç sıfır ise yanlış aksi halde doğru kabul edilir.<br />
İlişkisel işleçler(operatör) : iki değer arasındaki ilişkiyi test etmek için kullanılır.<br />
	işleç	anlamı<br />
	>	büyük<br />
	>=	büyük &#8211; eşit<br />
	==	eşit<br />
	<	küçük<br />
	<=	küçük - eşit<br />
	!=	eşit değil</p>
<p>	x=8,  y=5 için<br />
	x > y	Doğru<br />
	x < y	Yanlış<br />
	x !=y	Doğru</p>
<p>Mantıksal işleçler : İki mantıksal ifade arasındaki ilişki üzerindeki ilişkide kullanılır.<br />
!       DEĞİL  (NOT)<br />
&#038;&#038;  VE         (AND)<br />
||       VEYA   (OR)</p>
<p>	(X>0) &#038;&#038; (X>Y)<br />
(X>0) || (Y>0)</p>
<p>İfadelerde işleçlerin yürütülme sırası<br />
	işleç			Önceliği<br />
	(  )		en yüksek (ilk yürütülür)<br />
	!<br />
	*, /, %<br />
	+, &#8211;<br />
	<, <=,  >=, ><br />
	==, !=<br />
	&#038;&#038;, ||<br />
	=		en düşük (son yürütülür)<br />
= işleci sağdan sola, diğerleri soldan sağa doğru yürütülür.<br />
Görüldüğü gibi ifadelerde  matematiksel ve mantıksal işlemler bittikten sonra ilişki test edilir.<br />
	X=50, Y=80, Z=45 için<br />
	( ( X / 4 + Y / 4 + Z / 2 ) >= 50  ) &#038;&#038; ( Z >= 50 )</p>
<p>3 &#8211;  Döngü ve Koşul Deyimleri</p>
<p>	Programlar (algoritmalar) üç temel blok kullanılarak gerçekleştirilebilirler. Bunlar; ardarda, bir koşula bağlı olarak ve sonlu sayıda yineleme (döngü) dir.</p>
<p>3.1  Koşul Deyimleri </p>
<p>	Birkaç seçenekten birini seçmek veya bir deyimin bir koşula bağlı olarak işlemek için kulanılır.</p>
<p>3.1.1  if-then-else Deyimi</p>
<p>	if (<mantıksal ifade>)<br />
	     blok_doğru;<br />
	else<br />
	     blok_yanlış;	</p>
<p>Mantıksal ifade doğru ise blok_doğru, yanlış ise else sözcüğünden sonraki blok_yanlış yürütülür. else kısmı seçimlidir, gerekmiyorsa kullanılmayabilir.</p>
<p>Örnek 3.1. 1.1  Girilen sayının tek/çift olduğunu yazan program<br />
#include <stdio.h><br />
main()<br />
{<br />
   int i;<br />
   scanf(&#8220;%d&#8221;, &#038;i);<br />
   if ( i % 2 == 1)<br />
      printf(&#8220;Tek&#8221;);<br />
   else<br />
       printf(&#8220;Çift&#8221;);<br />
}</p>
<p>Bileşik (Compound) Deyimler</p>
<p>{ ve  } karakterleri ile sınırlandırılmış bir dizi deyimden oluşur.<br />
{<br />
     i = 5;<br />
     j = i/2;<br />
     k = i+1;<br />
}   </p>
<p>Eğer bloklarda  birden fazla deyim kullanmak gerektiğinde bileşik deyim kullanılır.</p>
<p>	if (yil % 4 == 0) 	   {<br />
		subat =29;<br />
		gunyil = 366;<br />
	     }<br />
	else     {<br />
		subat =28;<br />
		gunyil = 365;<br />
	     }<br />
Örnek 3.1.1.2 : İkinci dereceden denklemin köklerinin bulunması. 	</p>
<p>	if (delta<0)<br />
   	    printf("Gerçel kök yoktur.\n");<br />
	else<br />
	     {<br />
	       	x1 = (-b + sqrt(delta)) / (2 * a);<br />
                  	x2 = (-b - sqrt(delta)) / (2 * a);<br />
	           	printf("Birinci kök = %f\n" , x1);<br />
	            	printf("ikinci kök  = %f\n" , x2);<br />
	     }</p>
<p>Örnek 3. 1.1.3 : Klavyeden girilen karakterin rakam olduğunun tesbiti.</p>
<p>	char c;<br />
	c = getch();<br />
	if ((c>=&#8217;0&#8242;) &#038;&#038; (c<='9')<br />
	     printf("Rakam girdiniz.");</p>
<p>Örnek 3. 1.1.4 : Girilen üç sayıdan en küçüğünün bulunması (İçiçe IF kullanımı).</p>
<p>	scanf("%d%d%d", &#038;s1, &#038;s2, &#038;s3);<br />
	if ((s1<s2) &#038;&#038; (s1<s3))<br />
        	    ek =s1;<br />
	else<br />
	    if (s2<s3)<br />
	        ek =s2;<br />
	    else<br />
	        ek = s3;<br />
	printf('En küçük olanı = %f", ek);</p>
<p>II. yol :<br />
	scanf("%d%d%d", &#038;s1, &#038;s2, &#038;s3);<br />
	ek = s1;<br />
	if (ek>s2)<br />
        	    ek =s2;<br />
	if (ek>s3)<br />
	     ek =s3;<br />
	printf(&#8216;En küçük olanı = %f&#8221;, ek);</p>
<p>Örnek 3. 1.1.5:  Fonksiyonun girilen t değeri için aldığı değeri hesaplayıp yazan program.</p>
<p>	main() {   float y, x;    printf(“x değerini giriniz”);   scanf(“%f”, &#038;x);   if (x > -1  &#038;&#038; x<2)       y = 2/3 * (x + 1);   else    if (x>2 &#038;&#038; x<=3)       y = 2;    else      y = 0;    printf(“Fonksiyonun değeri = &#038;f”, y); }</p>
<p>Örnek 3. 1.1.6: Vergi iadesini hesaplan programı yazınız. (elseif  yapısı)<br />
(0-60 bin : %10, 60-120 bin : %,120-200 bin : %12,>200 bin : %5)</p>
<p>main()<br />
{<br />
  float fat_top, vergi_iade;<br />
  printf(&#8220;Fatura toplamlarını giriniz &#8220;);<br />
  scanf(&#8220;%f&#8221;, &#038;fat_top);<br />
  if (fat_top < 60000)<br />
     vergi_iade = fat_top * 0.10;<br />
  else if (fat_top < 120000)<br />
     vergi_iade = 6000 + (fat_top - 60000) * 0.20;<br />
  else if(fat_top < 200000)<br />
     vergi_iade = 18000 + (fat_top - 120000) * 0.12;<br />
  else<br />
     vergi_iade = 27600 + (fat_top - 200000) * 0.05;</p>
<p>  printf("Ödenecek vergi iadesi = %f\n", vergi_iade);</p>
<p>}</p>
<p>Örnek 3. 1.1.7: Girilen tarihteki günün adını veren programı yazınız.</p>
<p>#include <studio.h><br />
main ( )<br />
{<br />
   int gun, ay, yıl ;<br />
  long gt ;<br />
  printf(“Tarihi gir”) ; scanf ( “%d %d %d “,&#038;gun)</p>
<p>/* oncekı yıllardakı gun sayısını hesapla */</p>
<p>  gt=( yıl*1)*365 + yıl/4;</p>
<p>/* bu yildaki aylardaki gunleri ekle */</p>
<p>if (ay==2)<br />
	gt = gt + 31 ;<br />
else if (ay ==3)<br />
	gt = gt + 31 + 28 ;<br />
else if (ay ==4)<br />
	gt = gt + 31 + 28 +31;<br />
else if (ay ==5)<br />
	gt = gt + 31 + 28 +31+ 30 ;<br />
else if (ay ==6)<br />
	gt = gt + 31 + 28 +31+ 30 +31;<br />
else if (ay ==7)<br />
	gt = gt + 31 + 28 +31+ 30 +31+ 30 ;<br />
else if (ay ==8)<br />
	gt = gt + 31 + 28 +31+ 30 +31+ 30 + 31 ;<br />
else if (ay ==9)<br />
	gt = gt + 31 + 28 +31+ 30 +31+ 30 + 31+30 ;<br />
else if (ay ==10)<br />
	gt = gt + 31 + 28 +31+ 30 +31+ 30 + 31+30 + 31;<br />
 else if (ay ==11)<br />
	gt = gt  + 31 + 28 +31+ 30 +31+ 30 + 31+30 + 31+ 30 ;<br />
else if (ay ==12)<br />
	gt = gt + 31 + 28 +31+ 30 +31+ 30 + 31+30 + 31+ 30 +31;</p>
<p>/*Bu ayı ekle */<br />
gt = gt+ gun;<br />
if(yıl%4==0 &#038;&#038; ay>2),<br />
	gt =gt+1;<br />
gt=gt %7,<br />
if(gt==1)<br />
printf(“Pazar”);<br />
else if(gt==2)<br />
printf(“Pazartesi”);<br />
else if(gt==3)<br />
printf(“Salı”);<br />
else if(gt==4)<br />
printf(“Carsamba”);<br />
else if(gt==5)<br />
printf(“Persembe”);<br />
else if(gt==6)<br />
printf(“Cuma”);<br />
else if(gt==7)<br />
printf(“Cumartesi”);<br />
}</p>
<p>3.1.2  switch Deyimi </p>
<p>	switch(<seçici>) {<br />
		case seçenek1 : Deyim;<br />
		case seçenek2 : Deyim;<br />
		    .<br />
		    .<br />
		    .<br />
		default :     Deyim;<br />
	}</p>
<p>Seçicinin aldığı değere eşit seçeneğin olup olmadığına bakar. Var ise o noktadan sonraki deyimler yürütülür. switch deyiminin sonuna gelindiğinde veya break deyimi ile karşılaşıldığında yürütme işlemi durur ve programın akışı switch deyimini izleyen deyim ile devam eder. 	</p>
<p>switch(i) {<br />
   case 1 : printf(&#8220;Bir&#8221;);<br />
   case 2 : printf(&#8220;İki&#8221;);<br />
   default : printf(&#8220;Hiçbiri&#8221;);<br />
}</p>
<p>i=1 ise çıkış  BirİkiHiçbiri<br />
i=2 ise çıkış  İkiHiçbiri</p>
<p>Sorunu ortadan kaldırma için her durum için break deyimi eklenmeli.</p>
<p>	. Seçici Ordinal tiplerden biri olmalıdır (Ordinal tip: tüm değerleri listelenebilinen 			veri tipleri &#8211; integer, char).<br />
	. Seçici ile seçenekler aynı tipte olmalıdır.<br />
	. default kısmı seçimliktir. Seçeneklerin hiçbiri uygun değil ise yürütülür.</p>
<p>#include <stdio.h><br />
main()<br />
{<br />
  char islem;<br />
  int s1, s2, s3;<br />
  printf(&#8220;Önce işlemi sonra sayıları girin &#8220;);<br />
  scanf(&#8220;%c%d%d&#8221;,&#038;islem, &#038;s1, &#038;s2);<br />
  switch (islem) {<br />
     case &#8216;+&#8217; : s3 = s1 + s2; break;<br />
     case &#8216;-&#8217; : s3 = s1 &#8211; s2; break;<br />
     case &#8216;*&#8217; : s3 = s1 * s2; break;<br />
     case &#8216;/&#8217; : s3 = s1 / s2; break;<br />
     default : printf (&#8220;Hatalı işlem&#8221;);<br />
  }<br />
  printf(&#8220;\nSonuç = %d&#8221;,s3);<br />
}</p>
<p>Örnek 3.1.2.1: Mevsimleri yaz.</p>
<p>	scanf(&#8220;%d&#8221;, &#038;ay);<br />
	switch (ay) {<br />
		case 3:<br />
		case 4:<br />
		case 5: printf(&#8220;ilkbahar&#8221;); break;<br />
		case 6:<br />
		case 7:<br />
		case 8: printf(&#8220;yaz&#8221;); break;<br />
		case 9:<br />
		case 10:<br />
		case 11: printf(&#8220;sonbahar&#8221;); break;<br />
		case 12:<br />
		case 1:<br />
		case 2: printf(&#8220;kış&#8221;); break;<br />
	}<br />
switch deyimi yerine if deyimi kullanılabilir. Ancak switch deyimi programı daha okunabilir kıldığı için gerekli olduğu durumlarda kullanılmalıdır.</p>
<p>Örnek 3.1.2.2 : 16&#8242;lık sistemdeki rakamın 10&#8242;luk sistemdeki karşılığı (char tipinin sayı gibi davranışı).<br />
switch(c) {<br />
   case &#8217;0&#8242;:<br />
   case &#8217;1&#8242;:<br />
   . . .<br />
   case &#8217;9&#8242;: i = c &#8211; &#8217;0&#8242;; break;<br />
   case &#8216;a&#8217;:<br />
   case &#8216;A&#8217;: i = 10; break;<br />
   . . .<br />
   case &#8216;f&#8217;:<br />
   case &#8216;F&#8217;: i = 15; break;<br />
}</p>
<p>Örnek 3.1.2.3: Sınav notunu harfe dönüştüren programı yazınız.<br />
( >=90 :AA, 85-89:BA, 80-84:BB, 75-79:CB, 70-74:CC, 60-69:D, <60 :F )</p>
<p>Örnek 3.1.2.4: Belirtilen tarihin hangi güne denk geldiğini bulan programı yazınız.<br />
else if yapısı yerine switch kullanarak</p>
<p>3.2  Döngü Deyimleri (Yineli)</p>
<p>	Bir ya da birden fazla deyimin tekrar edilemesini sağlarlar. C dilinde while, for ve do-while deyimleri döngü işlevini saşlar. Tekrar edilen deyimlere döngü gövdesi denir.</p>
<p>3.2.1  while Deyimi</p>
<p>	while <mantıksal ifade><br />
		Deyim</p>
<p>	Mantıksal ifade doğru olduğu sürece Deyim yürütülür. Eğer yanlış ise kontrol bir sonraki deyime geçer.</p>
<p>Örnek 3.2.1.1 :  1&#8242;den 100&#8242;e kadar olan sayıların toplamı.</p>
<p>i =1 j = 0 i < 101 olduğu sürece    j = j + i    i = i + 1 4. Toplam j ‘ yi yaz 	 main()  {      int i, j;      i =1;      j = 0;        while (i<101) {             j =j+i;             i =i+1      }       printf("Toplam = %d",j);  } </p>
<p>Örnek 3.2.1.2: Toplama ve çarpma kullanarak çarpma işmeini gerçekleyiniz.<br />
a ve b sayılarını oku c =0 b>0 olduğu sürece tekrarla  .3.1. c=c + a   3.2. b = b-1 4.  c değerini yaz ve dur	main() {   int a, b, c;   printf (“iki sayıyı giriniz “);  scanf(“%d%d”, &#038;a, &#038;b);   c = 0;   while (b > 0) {     c = c + a;     b = b &#8211; 1;   }   printf(“Sonuç = &#038;d\n”, c); }</p>
<p>Örnek 3.2.1.3: Girilen sayının faktoriyelini hesaplayan programı yazınız.<br />
n değerini oku F=1 n >1 olduğu sürece tekrarla  .3.1. F=F*n   3.2. n= n-1 F değerini yaz 	main() {   int n;   long f;   printf (“sayıyı giriniz “);  scanf(“%d”, &#038;n);   f = 1;   while (n > 1) {     f = f * n;     n = n &#8211; 1;   }   printf(“Sonuç = &#038;d\n”, f); }</p>
<p>Örnek 3.2.1.4: Klavyeden girilen sayıları oku. Sayıların toplamı 21&#8242;den büyük veya eşit olduğu zaman dur.<br />
	main()<br />
	{<br />
	     int i, j = 0;<br />
	     while (j<21) {<br />
		scanf("%d",&#038;i);<br />
		j =j+i;<br />
  	     }<br />
	     printf("Toplam = %d",j);<br />
	}<br />
Örnek 3.2.1.5: 1993 yılı itibarı ile ülke nüfüsu 60 milyondur. Yıllık nüfüs artış oranı %2.3 tür. Sonraki 10 yılda ülke nüfüsunu yıllara göre listeleyen program.</p>
<p>/* Nufus Tablosu  */<br />
#include <stdio.h><br />
main()<br />
{<br />
  int       i;   /* sayac */<br />
  int     yil;   /* yillar */<br />
  float nufus;   /* nufus miktari */<br />
  float artis;   /* artis orani */</p>
<p>  artis = 0.023;<br />
  yil = 1993;<br />
  nufus = 60000000;<br />
  printf(&#8220;%d &#8211; %10.0f\n&#8221;,yil,nufus);<br />
  i = 1;<br />
  while (i < 11)<br />
    {<br />
      nufus = nufus * (1 + artis);<br />
      printf("%d - %10.0f\n",yil + i,nufus);<br />
      i = i + 1;<br />
    }<br />
}</p>
<p>Örnek 3.2.1.6 : Girilen tamsayının mükemmel sayı olup olmadığının söyleyen programı yazınız.<br />
(mükemmel sayı = tam bölenlerin toplamı sayının kendisine eşit)</p>
<p>Örnek 3.2.1.7 : Girilen tamsayının kaç basamaktan oluıştuğunu söyleyen programı yazınız.</p>
<p>Örnek 3.2.1.8 : Girilen tamsayı içerisinde kaç tane 1 olduğunu söyleyen programı yazınız.</p>
<p>Örnek 3.2.1.9: Girilen tamsayının son üç basamağını yuvarlayan programı yazınız.<br />
son üç basamağı >=500 > 1000 e, <500 ise 0 a yuvarlayacak<br />
(2560  3000, 2490  2000 )</p>
<p>Örnek 3.2.1.10: Sınavın ortalamasını hesaplayan programı yazınız.<br />
1	Durum : sınava giren öğrenci sayısı belli </p>
<p>main()<br />
{<br />
  int i, ogr_say, not_top, not;<br />
  float ort;<br />
  not_top = 0;<br />
  i = 0;<br />
  printf(“Öğrenci sayısını giriniz “); scanf(“%d”, &#038;ogr_say);<br />
  while (i < ogr_say) {<br />
	printf”Sıradaki öğrencinin notu  = “); scanf(“%d”, &#038;not);<br />
	not_top = not_top + not;<br />
	i = i + 1;<br />
   }<br />
   ort = float (not_top) / ogr_say;<br />
   printf(“Ortalama = &#038;f\n”, ort);<br />
}<br />
2	Durum : sınava giren öğrenci sayısı belli değil</p>
<p>Bu durumda girişin bittiğini gösterir bir bilgiye (işarete) ihtiyaç vardır. Sınav notu için 0 dan küçük bir değer girildiğinde girme işleminin sona erdiğinin varsayalım.</p>
<p>ogr_say = 0;<br />
printf”Sıradaki öğrencinin notu  = “); scanf(“%d”, &#038;not);<br />
while (not >= 0) {<br />
	not_top = not_top + not;<br />
	ogr_say = ogr_say + 1;<br />
printf”Sıradaki öğrencinin notu  = “); scanf(“%d”, &#038;not);<br />
}</p>
<p>3.2.2  For Deyimi</p>
<p>  for (ifade1 ; ifade2 ; ifade3 )<br />
      ifade;</p>
<p>  ifade2 doğru ( veya farklı 0) olduğu sürece ifade yürütülür (bitiş koşulu).<br />
  Döngünün ilk adımından önce ifade1 yürütülür ( başlangıç adımı).<br />
  Döngünün her adımında ifade3 yürütülür (artış miktarı).</p>
<p>  for (i = 1; i < 5; i++)<br />
      printf("%d ",i);</p>
<p>  ifade1, ifade2 ve ifade3 seçimliktir. ifade2 belirtilmez ise herzaman<br />
doğru olduğu ( == 1 ) kabul edilir. Yani sonsuz döngü oluşur.</p>
<p>  for (i = 1; ; i++)<br />
      printf("%d ",i);</p>
<p>Örnek 3.2.2.1:  1'den 100'e kadar olan sayıların toplamı.</p>
<p>	j =0;<br />
	for (i=1; i<=100; i=i+1)<br />
                      j =j+i;<br />
	printf("Toplam %d",j); 	</p>
<p>Örnek 3.2.2.2:  Girilen sayının faktöriyelini bulunuz.</p>
<p>	    fact =1;<br />
	    for (j=1; j<=i; j++)<br />
		fact =fact*j;<br />
	    printf("Faktöriyel  =%f",fact);<br />
	}</p>
<p>Örnek 3.2.2.3:  Çarpım tablosu. (içi içe döngüler)</p>
<p>	main()<br />
	{<br />
	    int i,j;<br />
	    for (i=1; i<=10; i++) {<br />
 	         for (j =1; j<=10; j++)<br />
		printf("%4.0d",i*j);<br />
	         printf("\n");<br />
	    }<br />
	}</p>
<p>Örnek 3.2.2.4:   ? işlevini çiziniz(0-8 noktaları arasında).</p>
<p>3.2.3  do-while Deyimi</p>
<p>	Bir koşul doğru olana kadar döngü yürütülür.</p>
<p>	do<br />
	     Deyim<br />
	while (<mantıksal ifade>)</p>
<p>	Mantıksal ifade doğru olduğu sürece döngü tekrar edilir. Yanlış olduğunda while sözcüğünden<br />
sonraki deyim yürütülür.    </p>
<p> 5 sayısı girilene kadar oku</p>
<p>	do<br />
	    scanf(&#8220;%d&#8221;,&#038;i);<br />
	while (i!=5);</p>
<p>	i =1;<br />
	do {<br />
	    printf(&#8220;%d&#8221;,i*i);<br />
	    i =i+1;<br />
	} while (i<=10);</p>
<p>Örnek 3.2.3.1: Sadece +, - kullanarak * işlemini gerçekleştirme.</p>
<p>main()<br />
{<br />
   int a, b;<br />
   int c;<br />
   scanf("%d%d", &#038;a, &#038;b);<br />
   c = 0;<br />
   do {<br />
      c = c + a;<br />
      b = b - 1;<br />
   } while (b>0);<br />
   printf(&#8220;%d\n&#8221;, c);<br />
}<br />
Karşılaştırma<br />
	 while : Koşul başlangıçta test ediliyor. Döngü sıfır veya daha fazla yürütülüyor.<br />
	 do-while : Koşul sonda test ediliyor. Döngüye en az bir defa kesin giriliyor.</p>
<p>Örnek 3.2.3.2: 0 &#8211; 100 arasında tutulan sayının tahmini.<br />
main()<br />
{<br />
  int       tahmin;   /*  tahminimiz  */<br />
  int          min;   /*  Tahminin alt siniri  */<br />
  int          max;   /*  Tahminin ust siniri  */<br />
  char       cevap;   /*  Kullanicinin cevabi  */<br />
  min = 0;   max = 100;<br />
  do {<br />
    tahmin = (max &#8211; min) / 2 + min;<br />
    printf(&#8220;Tahminim %d\n&#8221;,tahmin);<br />
    printf(&#8220;Buyuk / Kucuk / Esit &#8220;);<br />
    scanf(&#8220;%c&#8221;,&#038;cevap);<br />
    if (cevap == &#8216;B&#8217;)<br />
       max = tahmin &#8211; 1;<br />
     else<br />
        if (cevap == &#8216;K&#8217;)<br />
          min = tahmin + 1;<br />
  } while (cevap != &#8216;E&#8217;);<br />
}<br />
Örnek 3.2.3.3: Sin(x) fonksiyonun belli bie x için değerini seri açılımı ile hesaplayınız. Serinin ilk 10 terimini kullanınız.  n tek sayı.<br />
main()<br />
{<br />
  float    x;        /* fonksiyonun hesaplanacağı değer */<br />
  float sinx;        /*  sin(x) in değeri */<br />
  float   xt;        /* eklenen terimin payı */<br />
  float fakt;        /* eklenen terimin paydası, faktoriyel */<br />
  int isaret;        /* terimin +/- olmasını sağlar */<br />
  int      i;<br />
  clrscr();<br />
  printf(&#8220;Hesaplanacak değer : &#8220;);<br />
  scanf(&#8220;%f&#8221;,&#038;x);<br />
  sinx = x;<br />
  isaret = -1;<br />
  fakt = 1;<br />
  xt = x;<br />
  for (i = 2; i<=10; i++) {<br />
      xt = xt * x * x;<br />
      fakt = fakt * (2 * i - 2) * (2 * i - 1);<br />
      sinx = sinx + isaret * xt / fakt;<br />
      isaret = -isaret;<br />
  }<br />
  printf("Değeri = %f\n",sinx);<br />
}<br />
Örnek 3.2.3.4 : Aynı örneği belli sayıda terim için değil, sonucu 4 basamak hassasiyetle hesaplayınız.<br />
4 -  İşlevler</p>
<p>	Problem çözmenin ilkelerinden biri problemi mümkün olduğu kadar çok parçaya bölmek idi. Daha sonra bu parçalar bağımsız olarak düşünülüp çözümleri elde edilebilir. C'de bu bölme işlemi işlev kullanarak yapılır.<br />
	Belli bir işi gerçekleştiren program deyimlerinin karmaşık programları düzenlemek ve basitleştirmek için programın bir birimi olarak gruplandırılması.</p>
<p>(işlev kullanmanın temel nedenleri : divide and conquer ,  software reusability )</p>
<p>Örnek 4.1 : Bir tamsayının faktöriyelini hesaplayan işlev</p>
<p>main() {   int i;   prinf(“Sayıyı giriniz “); scanf(“%d”, &#038;i);   printf(“%d\n”, fakt(i)); }	long fakt ( int n) {    int j;     long f = 1;   for ( j = 2; j < =n; j = j  + 1),        f = f * j;   return f;   }</p>
<p>Örnek 4.2 : Bir tamsayının kübünü veren işlev<br />
#include <stdio.h><br />
main()<br />
{<br />
 int sayi;<br />
 int kub(int); /* işlevin prototipi */</p>
<p> printf(&#8220;sayıyı gir &#8220;);<br />
 scanf(&#8220;%d&#8221;, &#038;sayi);</p>
<p> printf(&#8220;Kübü = %d\n&#8221;, kub(sayi));<br />
}</p>
<p>int kub(int i)<br />
{  return i*i*i; }</p>
<p>İşlevin tanımlanma biçimi</p>
<p>   dönüş_tipi işlev_adı(parametreler)<br />
   {<br />
     yerel tanımlamalar<br />
     deyimler<br />
   }</p>
<p>dönüş_tipi: Eğer işlev bir değer geri gönderecek ise değerin tipini belirtir. Belirtilmez ise Int kabul edilir. Eğer 		işlev değer göndermeyecek ise dönüş_tipi yerine void yazılır.</p>
<p>işlev_adı: İşlev çağırılırken kullanılacak ad (belirleyici).</p>
<p>parametreler: İşlev için gerekli değerleri içerir. Her parametre değişken tanımlar gibi tanımlanır. Herbirinin  		arasında &#8216;,&#8217; kullanmak gerekir.<br />
yerel tanımlamalar:  Bu işleve özgü(değişken,sabit) tanımlamalar.</p>
<p>Eğer işlev bir değer gönderecek ise bu return deyimi ile yapılır.</p>
<p>      return değer;</p>
<p>İşlevin Prototipi<br />
Tanımlana bir işlevin ana modül içerisinde prototipinin yazılması gerekir. Prototip ile işlevin dönüş değeri ve aldığı parametrelerin tipleri tanımlanır. Bu bilgiye göre C derleyecisi işlev çağırıldığında değerlerin uygun olduğunu sınar.<br />
int kub(int)         kub işlevi int bir değeri alır ve yine int bir değer üretir.</p>
<p>Örnek 4.3 : Üç sayıdan en büyüğünü veren işlev.<br />
Girdi : üç tane tamsayı<br />
Çıktı : girdilerin en büyüğü</p>
<p>int max(int s1, int s2, int s3)<br />
{<br />
 if (s1>s2 &#038;&#038; s1>s2)<br />
    return s1;<br />
 else<br />
    if (s2>s3)<br />
       return s2;<br />
    else<br />
       return s3;<br />
}</p>
<p>Bu işlevi kullanan bir program<br />
#include <stdio.h><br />
main()<br />
{<br />
 int max(int, int, int);<br />
 clrscr();<br />
 printf(&#8220;%d \n&#8221;, max(1,2,3));<br />
 printf(&#8220;%d \n&#8221;, max(14,8,12));<br />
 printf(&#8220;%d \n&#8221;, max(1,6123,3123));<br />
}<br />
&#8230;<br />
işlevin tanım bloğu<br />
&#8230;</p>
<p>Örnek 4.4: Üs alma işlevini gerçekleyen işlev (üs bilgisi tamsayı).<br />
Girdi : taban ve üs değeri<br />
Çıktı : tabanın üs. kuvveti<br />
float us (float a, int  b)<br />
{<br />
    int i;<br />
    float r;</p>
<p>    r = 1;<br />
    for (i = 1; i<=b; i++)<br />
        r = r * a;<br />
     return  r;<br />
} </p>
<p>Fonksiyonun program içinden çağırılışı<br />
    d = us(2,3);<br />
    d = us(a, 4);<br />
    d = d * us(3,4);   	</p>
<p>Üs alma işlemini gerçeklemenin diğer yolu</p>
<p>ab = eblna  = Exp(b * Ln(a))<br />
Exp(x : Real) : Real       ex<br />
Ln(x : Real) : Real         Ln(x)</p>
<p>float us (float a, float  b)<br />
{<br />
    if (a>0)<br />
        return= exp( b * log (a ));<br />
    else<br />
        return= -1;<br />
}</p>
<p>Genel değişken (global): Her yerde (main ve diğer işlevler) geçerlidir, değerine erişilebilir.<br />
			Programın en başında, main işlevinin dışında tanımlanır.<br />
Yerel değişken (local): Sadece tanımlandığı modülde geçerlidir, değerine erişilebilir.<br />
			Modül içinde tanımlanır.</p>
<p>int a;   /*tüm işlevlerden değerine erişilebilir, değeri değiştirilebilir.  (global) */</p>
<p>main()<br />
{<br />
   int b;  /* sadece main işlevi içerisinden erişilebilir  (local ) */<br />
   &#8230;<br />
}</p>
<p>islev1(&#8230;);<br />
{<br />
   int b;   /* sadece islev1 işlevi içerisinden erişilebilir. main işlevindeki değişkendan bağımsızdır  (local ) */<br />
   int c;   /* sadece islev1 işlevi içerisinden erişilebilir  (local ) */<br />
   &#8230;<br />
}</p>
<p>Örnek 4.5  : 8 bit olarak girilen bir sayıya eşlenik (parity) bitini ekleyen programı yazınız (çift eşlenik)<br />
Eşlenik biti en düşük anlamlı bit olarak eklenecektir.</p>
<p>Algoritma<br />
	1. Sayıyı oku.<br />
	2. Sayıdaki birlerin sayısını bul.<br />
	3. Birlerin sayısı tek ise 1, çift ise 0 ekle.</p>
<p>Programı yazarken 2. ve 3. adımlar işlev olarak yazılacaktır.</p>
<p>/* Eşlenik biti ekleme */<br />
int bulbir ( int );<br />
int eklebir ( int , int );</p>
<p>main()<br />
{<br />
  int girsayi, birler;</p>
<p>  clrscr();<br />
  scanf(&#8220;%d&#8221;, &#038;girsayi);<br />
  birler = bulbir(girsayi);<br />
  girsayi = eklebir(birler, girsayi);<br />
  printf(&#8220;%d\n&#8221;, girsayi);<br />
}</p>
<p>int bulbir ( int sayi)<br />
{<br />
   int kacbir = 0;<br />
   while (sayi>0) {<br />
       kacbir = kacbir + (sayi % 2 );<br />
       sayi = sayi / 2;<br />
   }<br />
   return kacbir;<br />
} /* BulBir */</p>
<p>int eklebir ( int birler, int sayi)<br />
{<br />
   return (2 * sayi + (birler % 2));<br />
} /* Eklebir */</p>
<p>* Karşı taraf için gereken algoritmayı yaz (sayı doğru mu, doğru ise değeri).	 </p>
<p>Örnek 4.6  : A işyerindeki bir personelin hangi dilimden gelir vergisi ödeyeceğini (yüzdesini) belirten fonksiyonu yazınız.</p>
<p>Girdi : personelin birikmiş vergi matrahı<br />
Çıktı : Kesinti yüzdesi<br />
İlgili bilgi :  0-20 Milyon %25,  20-40 Milyon %30, 40-80 Milyon %35,  80-160 Milyon %40<br />
                 >180 Milyon %45</p>
<p>int  v_oran ( float bvd);<br />
{<br />
   int i;<br />
    if (bvd < 20000000)<br />
        i = 25;<br />
    else if  (bvd < 40000000)<br />
        i = 30;<br />
    else if  (bvd < 80000000)<br />
        i =  35;<br />
     else  if  (bvd < 160000000)<br />
         i =  40;<br />
     else<br />
         i = 45;<br />
     return i;<br />
}<br />
Örnek 4.7  :  Gelir vergisi matrahı ve önceki aylara ait birikmiş vergi matrahı belli bir personelin gelir vergisini hesaplayan fonksiyonu yazınız.<br />
        Vergi := Gelir vergisi matrahı * Vergi oranı<br />
Not : Eğer personel bu ay dilim değiştiriyorsa gelir vergisi gerektiği şekilde eski ve yeni dilime paylaştırılarak kesinti hesaplanmalıdır.</p>
<p>Örnek 4.8 : Girilen harfi büyük harfe dönüştüren fonksiyon<br />
Girdi : karakter<br />
Çıktı : karakter ( girdi harf ise büyük harfe dönüştürülmüş)</p>
<p>char  buyuk(char c);<br />
{<br />
    if (c >= &#8216;a&#8217;  &#038;&#038; c <= 'z')<br />
        return c - 32;<br />
    else<br />
        return c;<br />
}</p>
<p>Örnek 4.9:<br />
Girdi : iki sayı ve aralarındaki işlem<br />
Çıktı: iki sayı arasındaki işlemin sonucu</p>
<p>int calculate(char islem, int a, ibt b, int c)<br />
{<br />
   int s;<br />
    switch( islem )<br />
        case '+' : s = a + b ; break;<br />
        case '-' : s = a - b ; break;<br />
        case '*' : s = a * b ; break;<br />
        case '/' : s = a / b ; break;<br />
       default : s = 0;<br />
   }<br />
   return s;<br />
}</p>
<p>Çağırma biçimi<br />
     a = calculate ('+',4,8');<br />
     a = calculate ('/', 4,2) * calculate ('*', 2,2);</p>
<p>Örnek 4.10:  Bir işlevin köklerinden birini Newton yönetimi ile bulan prg. ( x2-2 )</p>
<p>#include <stdio.h><br />
#include<br />
<math.h>
<p>double fn(double);<br />
double fnt(double);</p>
<p>main()<br />
{<br />
 double x,x0;<br />
 double hata;</p>
<p> hata = 0.0001;        /* izin verilen hata */<br />
 x = 8;                     /* başlangıç değeri */<br />
 do {<br />
   x0 = x;<br />
   x = x0 &#8211; fn(x0)/fnt(x0);<br />
 } while (fabs(x-x0)>hata);</p>
<p> printf (&#8220;Sonuç = %f\n&#8221;, x);<br />
 printf (&#8220;f(x)  = %f\n&#8221;, fn(x));<br />
}</p>
<p>double fn(double x) /* işlevin değeri */<br />
{<br />
 return x*x-2;<br />
}</p>
<p>double fnt(double x)  /* işlevin türevinin değeri */<br />
{<br />
  return 2*x;<br />
}</p>
<p>Örnek :4.11:  İki sayının ortak katlarının en küçüğünü veren işlevi yazınız.</p>
<p>#include <stdio.h><br />
long okek(long, long);<br />
main()<br />
{<br />
  long i, j;<br />
  clrscr();<br />
  printf(&#8220;İki tamsayı giriniz :&#8221;);<br />
  scanf(&#8220;%ld%ld&#8221;, &#038;i, &#038;j);<br />
  printf(&#8220;sayıların okeki = %ld \n&#8221; okek(i, j));</p>
<p>}</p>
<p>long okek(long p, long q)<br />
/* p < q olmali. Degil ise yerlerini değiştir. */<br />
{<br />
  long i, k;<br />
  if (p>q) {<br />
      i=p;<br />
      p=q;<br />
      q=i;<br />
  }</p>
<p>  /* p nin öyle bir katını bul ki q sayısına tam bölünsün<br />
     2 sayısından itibaren taranmaya başlanabilir fakat<br />
     p/q yeterli<br />
  */</p>
<p>  i = q / p;<br />
  do {<br />
    k = p*i;<br />
    i = i+1;<br />
  } while ( k % q != 0);<br />
  return k;</p>
<p>Örnek :4.12: İstenen sayıdaki asal sayıyı listeleyen programı yazınız.</p>
<p>#include <stdio.h></p>
<p>int asal(int);<br />
main()<br />
{<br />
  int i ;    /* asal olup olmadığı sınanacak sayılar */<br />
  int kac; /* ilk kaç asal sayının listeleneceği bilgisi */<br />
  int j;      /* listelenen asal sayıların adetini tutar */</p>
<p>  clrscr();<br />
  printf(&#8220;ilk kaç asal sayı listelenecek : &#8220;);<br />
  scanf(&#8220;%d&#8221;, &#038;kac);</p>
<p>  /* for deyiminde ifade3 kısmında döngü değişkeni yerine<br />
     farklı bir değişkenin değeri değiştiriliyor. Döngü değişkeni<br />
     ide incelenen sayı asal ise arttırılıyor<br />
  */</p>
<p>  i = 2;<br />
  for (j = 1; j<=kac;i++)<br />
      if (asal(i)) {<br />
         printf("%d \n", i);<br />
         j++;<br />
      }<br />
}<br />
int asal(int n)<br />
/* sayı asal ise 1 değilk ise 0 değerini alır */<br />
{<br />
        int i;<br />
        if (n % 2 == 0)<br />
                return (n==2);<br />
        if (n % 3 == 0)<br />
                return (n==3);<br />
        if (n % 5 == 0)<br />
                return (n==5);<br />
        for (i=7; i*i <= n; i+=2)<br />
                if (n % i == 0)<br />
                        return 0;<br />
        return 1;<br />
}</p>
<p>Örnek :4.13: Belirtilen tarihteki ayın kaç gün sürdüğünü veren işlevi yazınız.<br />
Girdi : Ay ve yıl<br />
Çıktı : Aydaki gün sayısı</p>
<p>int aydakigun(int ay, int yil)<br />
{<br />
  int i;<br />
  switch (ay) {<br />
      case 1:<br />
      case 3:<br />
      case 5:<br />
      case 7:<br />
      case 8:<br />
      case 10:<br />
      case 12 : i = 31;break;<br />
      case 2 :<br />
              if (yil % 4 == 0)<br />
                 i = 29;<br />
              else<br />
                 i = 28;<br />
              break;<br />
      default : i = 30;<br />
  }<br />
  return i;<br />
}</p>
<p>Örnek :4.14: Önümüzdeki yılda Ramazan Bayramı nın hangi tarihte kutlanacağını hesaplayan programı yazınız. Bu yılki tarih klavyeden gün ay ve yıl olarak okunacakır.<br />
Girdi: Bu yıl kutlanılan tarih<br />
Çıktı : Sonraki tarih</p>
<p>#include <stdio.h></p>
<p>int aydakigun(int, int);</p>
<p>main()<br />
{<br />
  int gun,ay, yil;<br />
  int i, j ;</p>
<p>  clrscr();<br />
  printf(&#8220;Bu yılki tarihi giriniz (G A Y) : &#8220;);<br />
  scanf(&#8220;%d %d %d&#8221;,&#038;gun, &#038;ay, &#038;yil);<br />
  yil = yil + 1;<br />
  gun = gun &#8211; 11;<br />
  if (gun < 1 ) {<br />
     ay = ay - 1;<br />
     if (ay < 1 ) {<br />
        ay = 12;<br />
        yil = yil - 1 ;<br />
     }<br />
     gun = gun + aydakigun(ay, yil);<br />
  }<br />
  printf("\nGelecek bayram = %d/%d/%d\n",gun,ay,yil);<br />
}</p>
<p>Örnek :4.15: Girilen bir tamsayının basamaklarının sırasının tersinin oluşturduğu sayıyı veren işlevi yazınız.<br />
#include <stdio.h><br />
long tersi(long);<br />
main()<br />
{<br />
  long s;<br />
  clrscr();<br />
  printf(&#8220;Sayıyı giriniz : &#8220;);<br />
  scanf(&#8220;%ld&#8221;, &#038;s);<br />
  printf(&#8220;Basamaklarının ters çevirilmişi  = %ld \n&#8221;, tersi(s));<br />
}</p>
<p>long tersi(long k)<br />
{<br />
  long a, b;<br />
  a = 0;<br />
  while (k>0) {<br />
     b = k % 10;<br />
     a = a * 10 + b;<br />
     k = k / 10;<br />
  }<br />
  return a;<br />
}</p>
<p>4.2 Özyineleme (Recursive) İşlevler</p>
<p>	Kendini çağıran fonksiyonlardır.</p>
<p>Örnek 4.2.1: Faktoriyel hesabı</p>
<p>long fakt(long i)<br />
/* fakt = i! */<br />
{<br />
  if (i<2)<br />
     return 1;<br />
  else<br />
     return i*fakt(i-1);<br />
}</p>
<p>Örneğin n=4 için fonksiyonun kendisini çağırdığı satır şöyledir:<br />
       4 * fakt(3),  3 * fakt(2),  2 * Fakt(1)<br />
24 = 4 *   6  <--  3 *   2  <--   2 *   1  	</p>
<p>Örnek 4.2.2: Ortak bölenlerin en büyüğünü bulan program (Euklid yöntemi).<br />
gcd = greatest common divisor</p>
<p>long gcd (long m, long n )<br />
/* m ve n sayılarının ortak bölenlerinin en büyüğü*/<br />
{<br />
  if (n == 0)<br />
     return m;<br />
  else<br />
     return gcd( n, m % n);<br />
}</p>
<p>Örnek 4.2.3:    İki sayı göreceli asal olup olmadığını veren fonksiyon (relativeli prime = gcd() = 1 )</p>
<p>Örnek 4.2.4:    Sayının 9 un katı olup olmadığının basamak toplamlarının 9 olması ile bulunması (Özyinelemeye örnek olsun)</p>
<p>int kati9(long s)<br />
{<br />
  int t;<br />
  if ( s < 10)<br />
     return ( s == 9);<br />
  else {<br />
       t = 0;<br />
       while ( s > 0) {<br />
             t = t + s % 10;<br />
             s = s  / 10;<br />
       }<br />
       s = kati9(s);<br />
  }<br />
}</p>
<p>5-   Diziler</p>
<p>Şu ana kadar basit değişkenler kullandık ( her değişkinin bir değeri var).</p>
<p>Yapısal değişken: benzer verilerin tek bir değişken altında gruplandırılması.</p>
<p>Dizi  veri yapısı: Aynı tip verilerin toplanıp tek isim verilmesi. </p>
<p>5.1  Dizi Tanımı ve Kullanımı</p>
<p>    Tip_Adı   değişken[boyut];</p>
<p>Örneğin</p>
<p>    float  a[100];</p>
<p>Bu tanımlama ile a isimli değişkeni 100 gerçel değerin saklandığı bir diziyi gösterir. Bu 100 veriye a değişkeni ile erişilir.</p>
<p>Dizinin herhangi bir elemanına erişmek veya değiştirmek için kaçıncı eleman olduğunu gösterir indis bilgisini vermek gerekir. İlk elemanın indisi 0 dır.</p>
<p>	A[4]   dizinin 5. elemanı<br />
	A[0]   dizinin ilk elemanı<br />
	A[1] := 45;   dizinin 2. elemanına 45 atanır<br />
	A[7] := A[7] + A[1];   dizinin 8. elemanına kendisi ile 2. elemanın toplamı atanır </p>
<p>Dizinin eleman değerler tanımlama anında yapılabilir.<br />
int a[10] = {25, 18, 20, 0, 29, 5, 4, 8,19,13}</p>
<p>0	1	2	3	4	5	6	7	8	9<br />
25	18	20	0	29	5	4	8	19	13</p>
<p>Dizi Kullanıma Örnekler</p>
<p>Örnek:  Dizi elemanlarına değer ata, yazdır.</p>
<p>/* 1-10 arsındaki sayıların karesini dizi elemanlarına yükle yazdır */<br />
main()<br />
{<br />
  int a[10];<br />
  int i;</p>
<p>  for (i=0; i<=9; i++)<br />
      a[i] = (i+1)*(i+1);</p>
<p>  for (i=0; i<=9; i++)<br />
      printf("%d . elemanın değeri = %d\n", i, a[i]);<br />
}</p>
<p>Ekranda çıkacak görüntü</p>
<p>0 . elemanın değeri  = 1<br />
1 . elemanın değeri  = 4<br />
...<br />
9 . elemanın değeri = 100</p>
<p>Örnek : Dizide ilk 20 Fibonacci  sayıyı oluştur</p>
<p>/* ilk 20 Fibonacci<br />
   f[0] = 0, f[1] = 1, f[i+1] = f[i] + h[i-1] */<br />
#include <stdio.h><br />
main()<br />
{<br />
  int fib[20];<br />
  int i;</p>
<p>  fib[0] = 0;<br />
  fib[1] = 1;<br />
  for (i=2; i<=19; i++)<br />
      fib[i] = fib[i-1] + fib[i-2];</p>
<p>  clrscr();<br />
  for (i=0; i<=19; i++)<br />
      printf("%d . Fibonacci sayısı = %d\n", i, fib[i]);<br />
}</p>
<p>Ekranda çıkacak görüntü<br />
0. Fibonacci sayısı = 0<br />
1. Fibonacci sayısı = 1<br />
2. Fibonacci sayısı = 1<br />
...<br />
19. Fibonacci sayısı = 4181</p>
<p>Örnek :  Klavyeden 10 sayı oku. Tersten yazdır.<br />
#include <stdio.h><br />
main()<br />
{<br />
  int a[10];<br />
  int i;</p>
<p>  for (i=0; i<=9; i++) {<br />
      printf("%d. sayıyı gir ",i);<br />
      scanf("%d", &#038;a[i]);<br />
  }</p>
<p>  printf("\n-----------------------\n");</p>
<p>  for (i=9; i>=0; i&#8211;)<br />
      printf(&#8220;%d . sırada girilen sayı = %d\n&#8221;, 9-i, a[i]);<br />
}</p>
<p>Diziyi Bir İşleve Gönderme</p>
<p>Şu ana kadar öğrenilen bilgi çerçevesinde işlevlere gönderilen parametrelerin içeriklerinin işlev içerisinde değiştirilmesi mümkün değildir. İşleve değişkenin değeri gönderilir. İşlev içerisindeki işlemlerden parametre etkilenmez.</p>
<p>Dizilerde durum böyle değildir. Normal kullanımda (şu ana kadar görülen) dizi işleve gönderildiğinde elemanlar değiştirilebilir (referans). Dizinin sadece herhangi bir elemanı gönderildiğinde ise değeri değiştirilemez (değer)</p>
<p>Diziyi işleve gönderirken sadece adını parametre olarak yazmak yeterlidir.</p>
<p>Örnek:  işlev içerisnde dizi eleman değerlerinin değiştirilmesi<br />
#include <stdio.h><br />
void kareleri(int []);<br />
main()<br />
{<br />
  int a[10];<br />
  int i;</p>
<p>  for (i=0; i<=9; i++)<br />
      a[i] = i + 1 ;</p>
<p>  clrscr();<br />
  printf("Dizinin elemanlarının değerleri\n");<br />
  for (i=0; i<=9; i++)<br />
      printf("%d  ",a[i]);</p>
<p>  kareleri(a);</p>
<p>  printf("\n\nKare alma işlemi sonrası dizinin elemanlarının değerleri\n");</p>
<p>  for (i=0; i<=9; i++)<br />
      printf("%d  ",a[i]);<br />
}</p>
<p>void kareleri(int a[])<br />
{<br />
  int i;</p>
<p>  for (i=0; i<=9; i++)<br />
      a[i] = a[i] * a[i];<br />
}</p>
<p>Ekranda çıkacak görüntü<br />
Dizinin elemanlarının değerleri<br />
1  2  3  ..                                       10</p>
<p>Kare alma işlemi sonrası dizinin elemanlarının değerleri<br />
1  4  9  ..                                                 100<br />
Notlar</p>
<p>*  Tanımlanan dizi boyutunun dışında bir eleman kullanımı durumunda C dili hata vermez (uyarmaz).<br />
*  İlk indisin değerinin sıfır olması dolayısıyla  dizinin n. elemanın indisi n değil n-1 dir.<br />
*  Gerektiği durumlarda dizi elemanlarının ilklendirilmesi (sıfırlamak) unutulmamalı<br />
	- tanımlama anında  int a[10] = {13, 45 ..};    /* fazla eleman yazılırsa hata oluşur */<br />
	  	                 int a[] = { 13, 45, 56};   /* boyut belirtilen değer kadar olur */<br />
	- giriş yaptırarak      scanf("%d", &#038;a[i]);<br />
	- doğrudan değer atayarak  a[i] = 4;</p>
<p>Dizinin Boyutunu Değişken Kılma</p>
<p>#define önişlemcisi direktifi (preprocessor directive)</p>
<p>Simgesel sabit tanımlanmasını sağlar. C dili deyimlerinden biri değildir (#include gibi). Kullanım biçimi</p>
<p>#define SabitAdı  Değeri</p>
<p>Program çalıştırıldığınde derleme işlemi öncesinde program içerisinde SabitAdı simgesinim geçtiği yerlere Değeri konur.</p>
<p>Örnek : 25 kişilik bir sınıftaki öğrencilerin sınav sonuçlarını okuyup ortalamasını bulan program.<br />
	* not bilgilerin saklanacağı veri yapısını belirle ve tipi tanımla<br />
	* notları girdiren yöntemi yaz<br />
	* Ortalamayı bulan fonksiyonu yaz</p>
<p>#include <stdio.h><br />
#define OGR_SAY 25</p>
<p>void giris(int []);<br />
float ortalama(int []);<br />
main()<br />
{<br />
  int ogr[OGR_SAY];</p>
<p>  clrscr();</p>
<p>  giris(ogr);</p>
<p>  printf(&#8220;Ortalama = %f\n&#8221;, ortalama(ogr));<br />
}</p>
<p>void giris(int ogr[])<br />
{<br />
  int i;</p>
<p>  for (i=0; i<OGR_SAY; i++)  /* 0 dan başladığı için < kullanıldı */<br />
  {<br />
      printf("%d. öğrencinin notunu gir : ",i+1);<br />
      scanf("%d", &#038;ogr[i]);<br />
  }<br />
}<br />
float ortalama(int ogr[])<br />
{<br />
  float x;<br />
  int i;</p>
<p>  x = 0;<br />
  for (i=0; i<OGR_SAY; i++)<br />
      x = x + ogr[i];<br />
  return x / OGR_SAY;<br />
}</p>
<p> * 50'den küçük değerleri yazan işlev<br />
 * 50'den küçük değerlerin sayısını veren işlev<br />
 * en yüksek notu veren işlev<br />
 * Standart sapmayı veren işlen ( (abs(Xi - Xort) / OGR_SAY))</p>
<p>Örnek : İki dizinin toplamını üçüncü bir diziye yazan programı yazınız (A, B aynı tip dizi, C = A + B ).<br />
Doğrudan C := A + B yazılamayacağı için dizinin ilgili elemanlarını tek tek toplamalıyız.</p>
<p>#include <stdio.h><br />
#define MAX 20<br />
void dizitopla(int [], int [], int []);<br />
main()<br />
{</p>
<p>  int a[MAX], b[MAX], c[MAX];<br />
  int i;</p>
<p>  for (i=0; i<MAX; i++) {<br />
      a[i] = i;<br />
      b[i] = 2 * i;<br />
  }</p>
<p>  dizitopla(a, b, c);</p>
<p>  clrscr();<br />
  for (i=0; i<MAX; i++)<br />
      printf(" %4d + %4d = %4d \n", a[i], b[i], c[i]);<br />
}</p>
<p>void dizitopla(int a[], int b[], int c[])<br />
/* c = a +b */<br />
{<br />
  int i;</p>
<p>  for (i=0; i<MAX; i++)<br />
      c[i] = a[i] + b[i];<br />
}</p>
<p>5.3  Sıralama<br />
	Dizi elemanlarının küçükten büyüğe veya büyükten küçüğe doğru dizilmesi işlemi. Farklı performansa sahip birçok yöntem vardır. Şimdilik en basit olanlardan biri incelenecektir.</p>
<p>Selection  Sort (seçim)</p>
<p>Dizinin en küçük elemanı bulunur ve birinci eleman ile yer değiştirilir. Bu işlem (n-1). elemana kadar tekrar edilir. Her adımda en küçük eleman dizinin kalan elemanlarından bulunur. Örneğin aşağıda 4 elemanlı bir diziye  yöntemin uygulanması gösterilmiştir.</p>
<p>Buble Sort</p>
<p>Bu yöntemde ardışıl iki eleman karşılaştırılır. Eğer önceki eleman sonrakinden büyük ise elemanlar yer değiştirilir. Bu şekilde dizi taranır. Eğer herhangi bir değişiklik yapılmış ise işlem tekrar edilir.</p>
<p>Başlangıç	1. adım	2. adım	3. adım<br />
34	21	18	18<br />
21	18	21	21<br />
18	25	25	25<br />
25	34	34	34</p>
<p>Görüldüğü gibi, bu yöntemde dizi sıralandıktan sonra bir defa daha taranıyor.</p>
<p>Selection Sort Kodlaması</p>
<p>1. Dizinin en küçük elemanının indisini veren işlev<br />
2. Bu işlevi kullanarak diziyi sıralama</p>
<p>Bubble Sort Kodlaması</p>
<p>5.4  Çok Boyutlu Diziler</p>
<p>	Çok boyutlu bilgileri veya veri tablolarını saklamak için kullanılır.  İki boyutlu diziler daha sık kullanılır. Örneğin; yıllara ve aylara enflasyon rakamının takibi, matematikteki matriş işlemlerinin gerçeklenmesi, öğrenciler ve aldıkları derslerin takibi.</p>
<p>Tanımlama biçimi :  İki türlü yapılabilir.</p>
<p>    Tip  Değişken_Adı[ indis1 ][ indis2 ][ indisn ];</p>
<p>Örneğin ;</p>
<p>     float Enf[5][12];</p>
<p>Enf tipi iki boyutlu bir dizidir. Birinci boyut ( satır ) yılları, ikinci boyut ( sütun ) ayları gösterir.</p>
<p>	1.Ay	2.Ay	3.Ay	4.Ay	5.Ay	6.Ay	7.Ay	8.Ay	9.Ay	10.Ay	11.Ay	12.Ay<br />
1<br />
2<br />
3<br />
4<br />
5												</p>
<p>C dilinde boyut sayısında bir sınır yoktur. Biligisayarın belleği boyutu sınırlar. </p>
<p>Dizilerin bellekte saklanma biçimi :<br />
Erişimin kolay olması için dizinin tüm elemanları peşpeşe saklanır. Burada önce satır sonra sütunlar (tanımlanış sırasına göre) saklanır .  </p>
<p>!!! Çok boyutlu dizileri bir işleve gönderirken ilk boyut dışındaki boyutların büyüklüklerini vermek zorunludur.</p>
<p>Örnek :  İki boyutlu dizi üzerine.</p>
<p>#include <stdlib.h></p>
<p>#define SATIR 5<br />
#define SUTUN 5</p>
<p>double enbuyuk(double [][SUTUN], int );<br />
void  matris_oku(double [][SUTUN]);</p>
<p>main()<br />
{<br />
  double a[SATIR][SUTUN];<br />
  double b[SATIR];  /* satirlardaki en buyuk elemanlar */<br />
  double c[SATIR];  /* satirlardaki sutunlarin toplami */<br />
  int   i, j;</p>
<p>  matris_oku(a);</p>
<p>  for (i = 0; i < SATIR; i++)<br />
      b[i] = enbuyuk(a,i);</p>
<p>  /* Satirdaki elemanlarin toplamlarinin olusturdugu matris */<br />
  for (i = 0; i < SATIR; i++)<br />
     {<br />
       c[i] = 0;<br />
       for (j = 0; j < SUTUN; j++)<br />
           c[i] = c[i] + a[i][j];<br />
     }</p>
<p>  clrscr();</p>
<p>  for (i = 0; i < SATIR; i++) {<br />
      for (j=0; j<SUTUN; j++)<br />
          printf("%3.0f ", a[i][j]);                            /* Biçimli yazdırma */</p>
<p>      printf("  %4.0f  %4.0f\n",b[i],c[i]);<br />
  }</p>
<p>}</p>
<p>double enbuyuk(double a[][SUTUN], int sat)<br />
{<br />
  double  r;<br />
  int     i;</p>
<p>  r = a[sat][0];   /*  ilk eleman en buyuk  */<br />
  for (i = 1; i < SUTUN; i++)<br />
      if (a[sat][i] > r)<br />
         r = a[sat][i];<br />
  return r;<br />
}   /* Function EnBuyuk */</p>
<p>void  matris_oku(double a[][SUTUN])<br />
{<br />
  int i, j;</p>
<p>  for (i = 0; i < SATIR; i++)<br />
      for (j = 0; j < SUTUN; j++)<br />
          a[i][j] = random(10);<br />
}  /* matris_oku */</p>
<p>Örnek : Bir kare matrisin</p>
<p>  o. Matrisin simetrik olup olmamasını sınayan program<br />
  o. Matrisin transpozesini bir diğer matrise kopyalayan program<br />
  o. İki matrisinin çarpımını gerçekleştiren program<br />
  o. köşegeninin alt kısmındaki elemanları sıfırlayan yöntemi,<br />
  o. Determinantını hesaplayan fonksiyonu,<br />
  o. M<=P ve N<=Q olmak üzere A matrisi MxN ve B matrisi PxQ    boyutlarındadır. B matrisi içerisinde A 		matrisininin olup olmadığı    belirlenecektir.  A matrisinin B matrisi içerisinde kaç kez    bulunduğunu ve 		bunların B matrisi içerisinde başlangıç konumlarını    (satır ve sütun olarak) veren programı yazınız.<br />
  o. MxN elemanlı bir matrisi tek boyutlu bir diziye dönüştüren program<br />
  o. P elemanlı bir diziyi MxN boyutlu matrise dönüştüren program (P sayısı M ve N e tam bölünür).</p>
<p> /* Program Matris-2  */</p>
<p>#include <stdlib.h></p>
<p>#define SATIR 3<br />
#define SUTUN 3</p>
<p>void  matris_oku(int [][SUTUN]);<br />
void matris_yaz(int [][SUTUN]);<br />
int simetrik(int [][SUTUN]);      /* matrisin simetrikliğini sınar */<br />
void transpoze(int [][SUTUN], int [][SUTUN]); /* 2. = 1.nin transpozesi */<br />
void matris_carp(int [][SUTUN], int [][SUTUN], int [][SUTUN]); /* 3 = 1*2 */<br />
/*<br />
  alt_ucgen_sifirla(a);</p>
<p>  matris_yaz(a);<br />
  printf(&#8220;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;\n&#8221;);</p>
<p>  transpoze(a, b);</p>
<p>  matris_yaz(b);</p>
<p>  matris_carp(a, b, c);</p>
<p>  printf(&#8220;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;\n&#8221;);</p>
<p>  matris_yaz(c);</p>
<p>  if (simetrik(a))<br />
     printf(&#8220;Simetriktir\n&#8221;);<br />
  else<br />
     printf(&#8220;Simetrik değildir\n&#8221;);</p>
<p>*/</p>
<p>  getch();</p>
<p>}</p>
<p>void  matris_oku(int a[][SUTUN])<br />
{<br />
  int i, j;</p>
<p>  for (i = 0; i < SATIR; i++)<br />
      for (j = 0; j < SUTUN; j++)<br />
          a[i][j] = 1 + random(5);<br />
}  /* matris_oku */</p>
<p>void matris_yaz(int mat[][SUTUN])<br />
{<br />
  int i, j;</p>
<p>  for (i = 0; i<SATIR; i++) {<br />
      for (j = 0; j<SUTUN; j++)<br />
          printf("%3d ",mat[i][j]);<br />
      printf("\n");<br />
  }<br />
}<br />
int simetrik(int a[][SUTUN])<br />
{<br />
  int i,j;<br />
  int durum;</p>
<p>  durum = 1; /*simetrik olduğunu varsay */</p>
<p>  for (i = 0; i<SATIR; i++)<br />
      for (j = 0; j<SUTUN; j++)<br />
          if (a[i][j] != a[j][i]) {<br />
             durum = 0;<br />
             break;<br />
          }</p>
<p>  return durum;<br />
}   /* simetrik */</p>
<p>void transpoze(int a[][SUTUN], int b[][SUTUN])<br />
{<br />
  int i, j;</p>
<p>  for (i = 0; i<SATIR; i++)<br />
      for (j = 0; j<SUTUN; j++)<br />
          b[i][j] = a[j][i];<br />
}</p>
<p>void matris_carp(int a[][SUTUN], int b[][SUTUN], int c[][SUTUN])<br />
/* c = a * b */<br />
{<br />
  int i, j, k;</p>
<p>  for (i = 0; i<SATIR; i++)<br />
      for (j = 0; j<SUTUN; j++) {<br />
          c[i][j] = 0;<br />
          for (k=0; k<SUTUN; k++)<br />
              c[i][j] = c[i][j] + a[i][k]*b[k][j];<br />
      }</p>
<p>}</p>
<p>void alt_ucgen_sifirla(int a[][SUTUN])<br />
{<br />
  int i,j;</p>
<p>  for (i = 0; i<SATIR; i++)<br />
      for (j = 0; j<i; j++)<br />
          a[i][j] = 0;</p>
<p>}</p>
<p>int det(int a[][SUTUN])<br />
{<br />
  int i, j, k;<br />
  int s, sx1, sx2;</p>
<p>  s = 0;</p>
<p>/*<br />
  for (j = 0; j<SUTUN; j++) {<br />
      sx1 = 1;<br />
      sx2 = 1;<br />
      for (k = 0; k<SATIR; k++) {<br />
          i = (j + k) % SUTUN;<br />
          sx1 = sx1 * a[k][i];<br />
          sx2 = sx2 * a[k][SATIR-k];<br />
      }<br />
      s = s + sx1 - sx2;<br />
  }</p>
<p>*/<br />
  return s;<br />
}</p>
<p>6.   Karakter işleme</p>
<p>	Birçok program sayıların yanı sıra metinler üzerine işlem yapar. İlk akla gelen bir kelime işlem programıdır. Bu tür bir programda metinlerle ilgili olarak, araya karakter girme, silme, değiştirme ve arama gibi işlemler tanımlıdır. C dilindeki char  tipi bu tür verilerin saklanması için kullanılır.</p>
<p>6.1 Tanımlamalar ve Kullanım </p>
<p>karakter: Bilgisayarda tanımlı herhangi bir karakteri gösterir. Karakter sabitler tek tırnak içinde belirtilir.<br />
              	'A',  '0'<br />
	'\65'     :   \ işaretinin ardından belirtilen ASCII kodlu karakter<br />
	C dili karakterleri ayrıca int değer gibi de görür. 'A' karakteri sayısal olarak A harfinin ASCII 		tablosundaki karşılığı olan 65 olarakta yorumlanabilir.</p>
<p>dizgi (string): Bir dizi karakterden oluşur. '\0' karakteri dizginin sonunu gösterir.Dizgi sabitler çift tırnak içinde gösterilir.<br />
	"ALİ",   "Bir sayı girin"</p>
<p>	  Bu idafede dil \0 karakterini otomatik koyar.</p>
<p>Karakter ile dizgi birbirinden farklı şeylerdir. Dizginin sonunda herzaman \0 karakteri vardır.<br />
'A' ile "A" birbirinin aynısı değildir. 'A' karakterini gösteren 65 değerinde bellekte int olarak salanırken "A" ise bir dizgi olup A ve \0 karakterlerini içerir.</p>
<p>Tanımlama biçimi:</p>
<p>1. Dizi şeklinde tanımlama</p>
<p>char a[7] = {'K','O',,'C','A','E','L','İ'};<br />
char a[8] = "KOCAELİ";           /* Son eleman olrak \0 karakteri eklendiği için  eleman sayısını bir fazla belirtmeli */					2. İşaretçi olarak tanımlama</p>
<p>char *değişken;</p>
<p>char *a;	</p>
<p>Doğrudan Değer Atama</p>
<p>char a[20];<br />
char *b;</p>
<p>a[0] = 'A';    /* dizinin bir elemanına değer verir gibi ve tek tırnak içinde ( karakter sabiti) */<br />
	       \0 karakteri ayrıca belirtilmelidir.</p>
<p>Dizi biçiminde tanımlı dizgiye sabir bir dizgi atarma için strcpy işlevi kullanılır.</p>
<p>strcpy(char *hedef, const char *kaynak);   kaynak bilgisini hedef değişkenine kopyalar  (string.h)<br />
                                                                Hedef dizgisinde kaynak dizgisini içerecek kadar yer olmalıdır.<br />
strcpy(a, "ALİ");</p>
<p>b = "ALİ";   /* çift tırnak içinde atanacak değer . \0 karakteri otomatik eklenir */</p>
<p>Değerini Yazdırma </p>
<p>printf("%s", a);<br />
puts(a); 		sonu \0 ile biten karakter dizisini ekrana yazar ve imleçi alt satıra geçirir         ( stdio.h )</p>
<p>Klavyeden Değer Atama</p>
<p>scanf("%s", a);          /* Boşluk karakterine kadar okuma yapacağı için içerisinde bu karakterin geçmesi olası                                                        girişlerde doğru çalışmaz. Adres operatörü kullanılmıyor */ </p>
<p>gets(a) ;           Satır sonu karakterine kadar (ENTER tuşu) basılan karakterleri okur ( stdio.h )</p>
<p>Karakter Dizisinin Herhangi Bir Karakterine Erişme</p>
<p>Dizilerde olduğu gibi erişilmek istenen karakterin indisi bildirilir.</p>
<p>a[2] = 'G';    b[2] = 'G';<br />
a[4] = '\0';<br />
printf("%c ", b[3]);            /*  b'nin 4. elemanını yazar */</p>
<p>Örnek 6.1.1 : Girilen bir metnin uzunluğunu veren programı yazınız.</p>
<p>#include <stdio.h><br />
main()<br />
{<br />
  char *s;<br />
  int i;<br />
  gets(s);<br />
  i = 0;                                                             		for (i=0; s[i]!=&#8217;\0&#8242;; i++)<br />
  while (s[i]!=&#8217;\0&#8242;)                                                  		  {}                            /* boş işlem */<br />
    i++;</p>
<p>  printf(&#8220;Uzunluk %d \n&#8221;, i);<br />
}</p>
<p>strlen ( char *) : Gönderilen değerin uzunluğunu verir. (string.h)</p>
<p>Örnek 6.1.2: Girilen bir metni tersten yazdıran programı yazınız.</p>
<p>#include <string.h><br />
#include <stdio.h><br />
main()<br />
{<br />
  char *s;<br />
  int i;<br />
  gets(s);<br />
  for (i=strlen(s)-1; i>=0; i&#8211;)<br />
       printf(&#8220;%c&#8221;, s[i]);<br />
  printf(&#8220;\n&#8221;);<br />
}</p>
<p>Örnek 6.1.3 : Girilen cümleyi oluşturan kelimelerin sadece ilk harflerini yazdıran program.<br />
1. c = sıradaki karakteri oku<br />
2. Eğer  c boşluk ise 4. adıma git<br />
3. Hiç karakter yazılmaış ise c&#8217;yi yaz.<br />
4. Eğer son karakter ise dur aksi halde bir sonraki karakteri göster ve 1.adıma git.<br />
Yukarıdaki algoritmada çözümün en önemli noktası herhangi bir kelimenin ilk karakterinin yazılıp yazılmadığıdır. Bunun izlenmesi için bir değişken kullanalım.</p>
<p>/* Girilen cümlenin ilk harflerini yaz */<br />
main()<br />
{<br />
  int i;<br />
  int yaz; /* 1/0 -> karakteri yaz/yazma */<br />
  char *s;</p>
<p>  clrscr();<br />
  gets(s);<br />
  yaz = 1;<br />
  for (i = 0; i<strlen(s); i++)<br />
      if (s[i] == ' ')<br />
         yaz = 1;<br />
      else<br />
         if (yaz) {<br />
            printf("%c", s[i]);<br />
            yaz = 0;<br />
         }<br />
}</p>
<p>Örnek 6.1.4: Girilen cümleyi, kelimeleri bozmadan tersten yazdıran program.<br />
	Ali zil çaldı --> çaldı zil Ali</p>
<p>İki Dizginin Karşılaştırılması</p>
<p>C dilinde diziler doğrudan karşılaştırılamazlar. Her bir elemanını ayrı ayrı karşılaştırılmalıdır. Küçüklük-büyüklük bilgisi ASCII tabloda önce-sonra bulunma bilgisine özdeştir. Karşılaştırma  amacıyla  strcmp(dizgi1, dizgi2)<br />
işlevi kullanılır. İşlev üç değer alır.<br />
<0  ise dizgi1 < dizgi2<br />
 =0 ise dizgi1 = dizgi2<br />
 >0 ise dizgi1 > dizgi2</p>
<p>Örnek  6.1.5:<br />
int main()<br />
 { char *s1 = &#8220;aaa&#8221;,  *s2 = &#8220;aba;<br />
    int i;<br />
    i = strcmp(s1, s2);<br />
    if (i > 0)<br />
       printf(&#8220;s1 büyük \n&#8221;);<br />
    else if (i<0)<br />
       printf("s2 büyük\n");<br />
    else<br />
       printf("eşitler\n");<br />
 }<br />
İki Dizgiyi Toplama (ekleme)</p>
<p>Dizgiler ile ilgili diğer sık kullanılan işlev strcat(hedef, kaynak) tir. kaynak dizgisini hedeh dizgisine ekler.<br />
Hedef dizgisinde kaynak dizgisini içerecek kadar yer olmalıdır. </p>
<p>int main()<br />
 {<br />
    char *s1 = "aaa   ",  *s2 = "bbb";<br />
    int i;<br />
    strcat(s1, s2);              /* (string.h) */<br />
    printf("%s\n", s1);<br />
 }</p>
<p>6.2  atoi , atof, atol .. İşlevlerini Gerçekleme</p>
<p>	Genellikle bir programın akışı boyunca bazı verilerin tiplerinin değiştirilmesi gerekir. Bu değişim string tipindeki bir değişkenin sayısal tipe dönüştürülmesi veya tersi biçiminde olabilir.  Sayısal string : içeriği C'nin sayı gösterimine uygun olan metin.  	'5.87'  ,  '0.3E5'  , '3423'</p>
<p>Örnek 6.2.1: String tipi bir değişkenin değerini  tamsayısal tipe dönüştüren işlevi yazınız.(atoi (stdlib.h))<br />
Girdi : Tamsayısal string<br />
Çıktı : Karşılık gelen sayı</p>
<p>#include <stdlib.h><br />
#include <string.h><br />
int deger (char *);<br />
main()<br />
{<br />
  char *c;<br />
  int i;</p>
<p>  c=&#8221;93t54&#8243;;<br />
  i=deger(c);<br />
  printf(&#8220;%s dizi katarının sayısal karşılığı %d \n&#8221;,c, i);<br />
}<br />
int deger( char *s)<br />
{<br />
  int i,j;<br />
  int x;   /*sayı */<br />
  x = 0;<br />
  for (i = 0; i<strlen(s); i++) {<br />
      j = s[i] - '0';<br />
      x = x * 10 + j ;<br />
  }<br />
  return x; }</p>
<p>Örnek 6.2.2 : Önceki örnekteki değer işlevini ondalık sayıları da (nokta dikkate alınacak) işleyecek şekilde geliştiriniz.</p>
<p>Yukarıda yazmaya çalıştığımız işlevin C dilinde  karşılığı mevcuttur (stdlib.h).<br />
int atoi(char *s) : tamsayıya dönüştürür.<br />
long int atol(char *s) : uzun tamsayıya dönüştürür.<br />
double atof(char *s) : gerçel sayıya dönüştürür.<br />
Bu işlevler dönüştürme işlemine s içerisinde geçersiz bir karakter ile karşılaşıldığında son verir. Ve bu noktaya<br />
kadar karakterlerin oluşturduğu sayıyı verir. İlk karakter geçersiz ise işlevin değeri tanımsızdır. Aynı işlevlerin biraz daha gelişmişleri ise; </p>
<p>double strtod(const char *s, char **ss) :<br />
long int strtol(const char *s, char **ss, int base) :<br />
unsigned int strtol(const char *s, char **ss, int base) : </p>
<p>s  : string bilgi<br />
ss : s değişkeninde ilk geçersiz karakter ve sonrasında katar dizini gösterir<br />
base : dönüşümün hangi tabana göre yapılacağını belirtir.</p>
<p>Örnek 6.2.3: atoi, atol, atof işlevlerinin davranışları.<br />
main()<br />
{<br />
  char *s;<br />
  int i;<br />
  long x;<br />
  double f;</p>
<p>  s="5";<br />
  printf("%d   %ld   %f\n",atoi(s),atol(s),atof(s));<br />
  s="5.4";<br />
  printf("%d   %ld   %f\n",atoi(s),atol(s),atof(s));<br />
  s="5.2e4=KL";<br />
  printf("%d   %ld   %f\n",atoi(s),atol(s),atof(s));<br />
}<br />
s değeri                    çıktı<br />
--------------------------------------------------<br />
   5                        5      5      5.000000<br />
   5                        5      5      5.400000<br />
   5                        5      5      52000.000000</p>
<p>Giriş İşlevleri</p>
<p>main()<br />
{<br />
  char c1, c2;<br />
  char s[10];<br />
  clrscr();<br />
  c1 = getchar(); /* klavyeden ENTER tuşuna basılana kadar tuş bekler */<br />
                  /* cursor on, karakter yazılır */<br />
  c2 = getchar(); /* klavyenin tamponundaki sıradakini okur */<br />
  printf("\n%c  ,  %c\n",c1,c2);<br />
  c1 = getche(); /* tuş basılmasını bekler,  ENTER beklenmez*/<br />
                  /* cursor on, karakter yazılır */<br />
  c2 = getche(); /* tuş basıldıktan sonra kontrol bu satıra geçer */<br />
  printf("\n%c  ,  %c\n",c1,c2);<br />
  c1 = getch(); /* tuş basılmasını bekler,  ENTER beklenmez */<br />
                  /* cursor on, karakter yazılmaz    x  int putch(int c): c ekrana yazılır*/<br />
  c2 = getch(); /* tuş basıldıktan sonra kontrol bu satıra geçer */<br />
  printf("\n%c  ,  %c\n",c1,c2);<br />
}</p>
<p>Örnek 6.2.4: Tamsayı bir değeri dizgiye dönüştüren programı yazınız. (ecvt, fcvt, gcvt var ancak ANSI C değil)<br />
#include <stdio.h></p>
<p>int main()<br />
 {<br />
    char *s;<br />
    int i;<br />
    i = 2137;<br />
    itostr(s, i);<br />
    printf(&#8220;%d   %s\n&#8221;,i, s);<br />
}<br />
itostr(char *hedef, int sayi)<br />
{<br />
  int i, j, kb;<br />
  j = sayi;<br />
  for (kb = 0; j>0; kb++)<br />
      j = j / 10;<br />
  i = sayi;<br />
  for (j=kb-1; j>=0; j&#8211;) {<br />
      hedef[j] = &#8217;0&#8242; + i % 10;<br />
      i = i / 10;<br />
  }<br />
  hedef[kb] = &#8216;\0&#8242;;<br />
}</p>
<p>sprintf işlevi : sayısal değeri dizgiye dönüştürmek için kullanılabilir. Yapısı;</p>
<p>sprintf( dizgi, kontrol, değişkenler)</p>
<p>Kullanım şekli printf işlevine yakındır. Kontrol ve değişken bilgisine göre ekrana yazılması gereken bilgi parametre olarak gönderilen dizgiye kopyalanır.</p>
<p>char *s;<br />
int i = 57;<br />
sprintf(s, &#8220;%d&#8221;, i);</p>
<p>ifadesi sonunda s dizgisinde &#8220;57&#8243; değeri oluşur.</p>
<p>float f = 2.1;<br />
sprintf(s, &#8220;%f&#8221;, f);</p>
<p>ifadesi sonunda s dizgisinde &#8220;2.100000&#8243; değeri oluşur.</p>
<p>Örnek 6.2.5: Bir dizginin belirli bir parçasını veren işlev. (strncpy(s2, s1, n))<br />
#include <stdio.h><br />
int main()<br />
 {<br />
    char *s1;<br />
    char *s2;<br />
    s1 = &#8220;01234567890&#8243;;<br />
    altdizgi(s2, s1, 0, 5);<br />
    printf(&#8220;%s\n&#8221;,s2);<br />
}<br />
void altdizgi(char *hedef, char *kaynak, int bas, int uzunluk)<br />
{<br />
  int i;<br />
  for(i = 0; i < uzunluk &#038;&#038; kaynak[bas + i] != '\0'; i++)<br />
        hedef[i] = kaynak[i + bas];<br />
  hedef[i] = '\0';<br />
}</p>
<p>Örnek 6.2.6: Bir metin içerisinde bir metin parçasın bulma (konumunu belirleme).<br />
Girdi : . aranacak metin parçası  (String) , aramanın  yapılacağı metin (String)<br />
Çıktı : aranan bilgi var ise başlangıç konumu (Integer) =-1 ise yok demektir<br />
main()<br />
{<br />
  char *a="12345";<br />
  char *b="34";<br />
  printf("%s   %s\n",a, b);<br />
  printf("%d\n",kon(a, b));<br />
}</p>
<p>int  kon(char *s1, char *s2)<br />
{<br />
  int i = 0, j, konum = -1;<br />
  while (i < strlen(s1) - strlen(s2))<br />
    {<br />
      konum = i;<br />
      for (j = 0; j < strlen(s2); j++)<br />
          if (s1[i + j] != s2[j])<br />
             konum = -1;<br />
      if (konum >= 0)<br />
         break;<br />
      else i = i + 1;<br />
    }<br />
  return konum;<br />
}<br />
C dilinde benzer bir işlevi sağlayan deyim</p>
<p>char *strstr(const char *dizgi1, const char *dizgi2)</p>
<p>dizgi1 içerisinde dizgi2 yi arar. Var ise işlev dizgi1 içerisinde dizgi2 nin başladığı konumdan sonraki dizgiyi işaret eder. Yok ise işlevin değeri NULL dır.</p>
<p>NULL : işaretçinin herhangi bir yeri göstermemesi. Değerinin boş olması.</p>
<p>Örnek 6.2.7:  Bir dizgi içerisindeki bir karakterin bulunması.  i harfini İ ile değiştiren program.<br />
#include <string.h><br />
#include <stdio.h><br />
int main()<br />
 {<br />
    char *s1, *s2, *s3;<br />
    int i;<br />
    clrscr();<br />
    s1=&#8221;ali zil çaldi&#8221;;<br />
    strcpy(s2, s1);<br />
    for (i=0; i<strlen(s1); i++)<br />
        if (s1[i] == 'i')<br />
            s1[i] = 'İ';<br />
    printf("%s\n",s1);</p>
<p>char *strchr(char *s, char c) :  s dizgisi içerisinde c karakterinin konumunu gösteren dizgiyi gönderir.</p>
<p>    while (strchr(s2, 'i') !=NULL) {<br />
          s3 = strchr(s2, 'i');<br />
          s3[0] = 'İ';<br />
    }<br />
    printf("%s\n",s2);<br />
 }</p>
<p>Örnek 6.2.8: Bir cümledeki tüm küçük harfleri büyüye çeviren program.<br />
(int tolower(int c) , int toupper(int c)  ) 	(ctype.h)</p>
<p>#include <string.h><br />
#include <stdio.h></p>
<p>void buyuk(char *);<br />
int main()<br />
 {<br />
    char *s1, *s2, *s3;<br />
    int i;<br />
    clrscr();<br />
    s1=&#8221;ali zil çaldi&#8221;;<br />
    strcpy(s2, s1);<br />
    for (i=0; i<strlen(s1); i++)<br />
        printf("%c",toupper(s1[i]));</p>
<p>    buyuk(s2);<br />
    printf("\n%s",s2);<br />
    getch();<br />
 }<br />
void buyuk(char *s)<br />
{<br />
  int i;<br />
  for (i=0; i<strlen(s); i++)<br />
      s[i] = toupper(s[i]);<br />
}</p>
<p>Örnek 6.2.9: Girilen metindeki harflerin sıklığını (frekansını) hesaplar.<br />
#include <strinh.h> main() {   char *s;   char *harfler = “abcdefghijklmnopqrstuvwxyz”;   char c;   int fr[26] = {0,};   int i;   clrscr();	  gets(s);   for (i = 0 ; i <strlen(s); i++) {      c = tolower(s[i]);      if (strchr(harfler, c) != NULL)          fr[c - ‘a’]++;   }   for (i = 0; i < 26; i++)       printf(“%c   -  %d\t\t”, ‘a’+i, fr[i]); }</p>
<p>7. Diğer Veri Tipleri</p>
<p>   Standart C dilinde şu ana kadar öğrendiğimiz veri tiplerine ek olarak aşağıdaki tipler mevcuttur.</p>
<p>7.1 C de Tanımlı Veri Tipleri</p>
<p>Veri Tipleri</p>
<p>Tip	Aralık	Uzunluk(Byte)<br />
 unsigned char    char    enum    unsigned int   short int   int    unsigned long    long         float         double     long double 	    0 .. 255 -128 .. 127 -32,768 .. 32,767            0 .. 65,535 -32,768 .. 32,767 -32,768 .. 32,767                         0 .. 4,294,967,295 -2,147,483,648 .. 2,147,483,647 3.4 * (10**-38) .. 3.4 * (10**+38) 1.7 * (10**-308) .. 1.7 * (10**+308) 3.4 * (10**-4932) .. 1.1 * (10**+4932)	1 1 2 2 2 2 4 4 4 8 10</p>
<p>printf işlevinde dönüşüm karakteriden önce</p>
<p>	h   short<br />
	u   unsigned<br />
	l    long integer<br />
	L    long double</p>
<p>u dönüşüm karakteri unsigned	 </p>
<p>7.2 Kullanıcı Tanımlı Veri Tipleri</p>
<p>Enumerated (Sıralı, Numaralandırılmış) Tipler</p>
<p>Programın okunabilirliğini arttırmak için değerlerin sıralı bir küme olarak tanımlanması.</p>
<p>enum [tip_adi] { sabit adı [= değer],...} [değişken listesi];</p>
<p>değer : sabite otomatik atanan değer. Belirtilmez ise 0'dan başlar. Sıradaki sabit öncesinin bir fazlasına eşittir.</p>
<p>Belirtilen tipte tanımlı bir değişken ancak listedeki değerleri alır.</p>
<p>enum  renk {BEYAZ, SARI, SIYAH};</p>
<p>tanımlaması ile oluşan enum renk tipinde BEYAZ 0, SARI 1 ve SIYAH 2 değerlerine eşit sabitlerdir.<br />
Listedeki sabitler belirkeyici olmalıdır. Sayısal, karakter ve string bilgi yazılamaz.<br />
enum renk = {"Beyaz", "Sari"};    X<br />
enum renk = {0, 1, 2};                  X</p>
<p>. İlişkisel işleçler tanımlıdır.	Beyaz < Siyah,  Sari > Beyaz</p>
<p>Bu tip değişkenler switch ve for deyimlerinde kontrol değişkeni olarak kullanılabilir.</p>
<p>Bu tipte bir değişken bilinen yapıda tanımlanır.</p>
<p>enum  renk {BEYAZ, SARI, SIYAH};<br />
enum renk a;</p>
<p>a değişkeni BEYAZ, SARI ve SIYAH değerlerinden birini alabilir.</p>
<p>Örnek 7.2.1: enum kullanımı.<br />
main()<br />
{</p>
<p>  enum gunler {PAZAR,PAZARTESI,SALI,CARSAMBA,PERSEMBE,CUMA,CUMARTESI };<br />
  enum gunler gun;</p>
<p>  clrscr();</p>
<p>  for (gun = PAZAR; gun <= CUMARTESI; gun++)<br />
      printf("%d ", gun);<br />
  printf("\n");</p>
<p>  for (gun = PAZAR; gun <= CUMARTESI; gun++)<br />
      switch (gun) {<br />
          case PAZAR:       printf("Pazar"); break;<br />
          case PAZARTESI:   printf("Pazartesi"); break;<br />
          case SALI:        printf("Sali"); break;<br />
          case CARSAMBA:    printf("Carsamba"); break;<br />
          case PERSEMBE:    printf("Persembe"); break;<br />
          case CUMA:        printf("Cuma"); break;<br />
          case CUMARTESI:   printf("Cumartesi"); break;<br />
       }   /* Case */<br />
}</p>
<p>Örnek 7.2.2: enum kullanımı.</p>
<p>main()<br />
{<br />
  enum gunler {PAZAR,PAZARTESI,SALI,CARSAMBA,PERSEMBE,CUMA,CUMARTESI };<br />
  enum gunler gun;<br />
  char *gunad[]={"Pazar","Pazartesi","Sali","Carsamba",<br />
                 "Persembe","Cuma","Cumartesi"};<br />
  clrscr();<br />
  for (gun = PAZAR; gun <= CUMARTESI; gun++)<br />
      printf("%s\n", gunad[gun]);<br />
}</p>
<p>Örnek 7.2.3: Sabitlere farkli değerler atama</p>
<p>enum renkler { sari = 4, mavi, kirmizi };<br />
enum renkler i;<br />
main()<br />
{<br />
  i = mavi;<br />
  printf("%d  \n", i);<br />
}</p>
<p>Ekrana 5 yazar.</p>
<p>Problem : Bu tip değişkenler doğrudan okunup yazılamazlar.</p>
<p>* Okumak ise yazmaya oranla biraz daha zordur. Okuma işlemi diğer standart tipler kullanılarak dolaylı  bir şekilde gerçekleştirilir.</p>
<p>8-   Yapılar (struct)</p>
<p>Farklı tipte birden fazla verinin oluşturduğu bütün.</p>
<p>Veri tipi olarak daha önce diziyi tanımlamıştık. Dizide birbirinin aynı tipi olan veriler peşpeşe saklanıyordu.<br />
Yapılar da aynı dizi gibi birbirleriyle ilgili olan verileri içerir. Fakat diziden farkı, tek bir yapı elemanı birbirnden farklı tipte birden fazla veriyi içerir. Bu sayede bilgiler daha düzenli şekilde gösterilir.<br />
Yapı yeni bir tip olmayıp var olan standart tiplerden oluşur.</p>
<p>8.1  Yapı Tanımı</p>
<p>Bir öğrencinin numarasını, adını ve sınavdan aldığı notu içeren bir yapı tanımlaması aşağıdaki gibidir.</p>
<p>struct ogryapi {<br />
	char numarasi[10];<br />
	char adi[20];<br />
	int notu ;<br />
}</p>
<p>struct ogryapi ogr;</p>
<p>Artık ogryapi isimli bir veri tipi vardır ve üç  üyeden (alandan) oluşmaktadır ( member =üye : kayıdı oluşturan farklı veri tiplerinin her biri).<br />
   * Tanımlamada her alanın adı ve tipi belirtilir.<br />
   * Yapı tipi olduğunu gösterir struct saklı sözcüğü kullanılır.<br />
    * Aynı alan adı farklı yapılarda (bağımsız olarak) kullanılabilir.</p>
<p>Tanımlama genel olarak</p>
<p>struct Yapı_Adı {<br />
         Alan1;<br />
         Alan2;<br />
                . . .<br />
         Alan_n;<br />
};<br />
Bu tipte bir değişken ise<br />
	struct Yapı_Adı Deği_Adı;<br />
şeklinde yapılır.</p>
<p>Tanımlanan tipte bir değişken tanımlandığınıda, değişken için bellekte tüm alanları içerecek şekilde yer ayırılır.<br />
İlgili değişkendeki herhangi bir alan üzerinde işlem yapmak için  aralarında nokta karakteri olmak koşuluyla sırasıyla değişkenin adı ve ilgili alanın adı verilir. Yukarıdaki  öğrenci örneğinde öğrecinin numarasına<br />
ogr.numarasi  şeklinde erişilir.</p>
<p>Örnek 8.1.1:  Karmaşık sayılarda toplama işlemi gerçekleştirme.<br />
main()<br />
{<br />
  struct complex {<br />
    float real, imag;<br />
  };<br />
  struct complex z1, z2, z3;</p>
<p>  clrscr();<br />
  printf("1. sayının reel ve imajiner kısımları gir ");<br />
  scanf("%f %f", &#038;z1.real, &#038;z1.imag);<br />
  printf("2. sayının reel ve imajiner kısımları gir ");<br />
  scanf("%f %f", &#038;z2.real, &#038;z2.imag);</p>
<p>  z3.real = z1.real + z2.real;<br />
  z3.imag = z1.imag + z2.imag;<br />
  printf("%2.0f + %2.0fj\n",z3.real, z3.imag);<br />
}</p>
<p>Örnek 8.1.2: Yapı içerisinde başka bir yapı kullanımı.</p>
<p>  struct tarih {<br />
     int   gun;<br />
     int   ay;<br />
     int   yil;<br />
  };<br />
  struct kisiler {<br />
     char adi[21];<br />
     struct tarih  dogum;<br />
  };<br />
main()<br />
{<br />
   struct kisiler  a;<br />
   strcpy(a.adi,"veli");<br />
   a.dogum.gun = 15;<br />
   a.dogum.ay = 8;<br />
   a.dogum.yil = 1905;</p>
<p>   printf("%s %d\n",a.adi,a.dogum.yil);<br />
   getch();<br />
}</p>
<p>Diğer bir tanımlama şekli</p>
<p>struct  {<br />
         Alan1;<br />
         Alan2;<br />
                . . .<br />
         Alan_n;<br />
} değişkenler;</p>
<p>  struct {<br />
    float real, imag;<br />
  }z1, z2, z3;</p>
<p>Örnek 8.1.3:  Öğrenci ile ilgili olarak numara ve sınav notu oku.  Sınavın ortalamasını ve ortalamayı geçenleri listele</p>
<p>#define OGRSAY  3<br />
main()<br />
{<br />
   struct ogrenci{<br />
     char no[10];<br />
     int  notu;<br />
   };</p>
<p>   struct ogrenci ogr[OGRSAY];<br />
   int i, j;<br />
   float t, ort;</p>
<p>   clrscr();</p>
<p>   for (i=0; i<OGRSAY; i++) {<br />
       printf("%d. öğrencinin numarası ve notu : ", i+1);<br />
       scanf("%s%d",ogr[i].no, &#038;ogr[i].notu);<br />
   }</p>
<p>   t = 0;<br />
   for (i=0; i<OGRSAY; i++)<br />
       t = t + ogr[i].notu;</p>
<p>   ort = t / OGRSAY;<br />
   printf("--------------------------------------------\n");<br />
   printf("Ortalama = %f\n", ort);<br />
   printf("--------------------------------------------\n");<br />
   printf("Ortalamayı geçen öğrenciler\n");<br />
   for (i=0; i<OGRSAY; i++)<br />
       if (ogr[i].notu > ort)<br />
          printf(&#8220;%s\t\t%d\n&#8221;, ogr[i].no, ogr[i].notu);</p>
<p>   getch();<br />
}</p>
<p>Tanımlama Anında Yapı Değişkenine Değer Atama</p>
<p>struct ogryapi   a = {&#8220;95003&#8243;, 56};</p>
<p>Veri Tiplerine Yeni İsim Verme</p>
<p>  C dilinde var olan veri tiplerini yeni bir isim vermekmümkündür. Tanımlama biçimi:</p>
<p>  typedef tanımlı_tip yeni_ismi;</p>
<p>  typedef int tamsayi;</p>
<p>Artık tamsayı isminde bir veri tipi vardır. Değişken tanımlamada kullanılabilir.</p>
<p>  tamsayi i, j;</p>
<p>  typedef unsigned char byte;<br />
  byte x;</p>
<p>Yapılar ile kullanımı</p>
<p>  struct complexyapi {<br />
	float re, im;<br />
  };<br />
  tydef struct complexyapi complex;<br />
  complex z1, z2;</p>
<p>  veya</p>
<p>  typedef struct { float re, im } complex;<br />
  complex z;</p>
<p>Örnek 8.1.4: İşlevin değerinin yapı olması durumu</p>
<p>typedef struct {<br />
  float re, im;<br />
} complex;</p>
<p>main()<br />
{<br />
  complex topla(complex, complex);<br />
  complex cikart(complex, complex);<br />
  complex carp(complex, complex);</p>
<p>  complex z1={1,1}, z2={2,2};<br />
  complex z3;</p>
<p>  clrscr();<br />
  printf(&#8220;%3.0f %3.0fj   %3.0f %3.0fj\n&#8221;,z1.re,z1.im,z2.re,z2.im);</p>
<p>  z3 = topla(z1, z2);<br />
  printf(&#8220;%3.0f  %3.0f\n&#8221;,z3.re,z3.im);</p>
<p>  z3 = cikart(z1, z2);<br />
  printf(&#8220;%3.0f  %3.0f\n&#8221;,z3.re,z3.im);</p>
<p>  z3 = carp(z1, z2);<br />
  printf(&#8220;%3.0f  %3.0f\n&#8221;,z3.re,z3.im);<br />
  getch();<br />
}<br />
complex topla(complex a, complex b)<br />
{<br />
 complex z;<br />
 z.re = a.re + b.re;<br />
 z.im = a.im + b.im;<br />
 return z;<br />
}<br />
complex cikart(complex a, complex b)<br />
{<br />
 complex z;<br />
 z.re = a.re &#8211; b.re;<br />
 z.im = a.im &#8211; b.im;<br />
 return z;<br />
}<br />
complex carp(complex a, complex b)<br />
{<br />
 complex z;<br />
 z.re = a.re * b.re &#8211; a.im * b.im;<br />
 z.im = a.re * b.im + a.im * b.re;<br />
 return z;<br />
}</p>
<p>Union: Değişken Yapısı</p>
<p>Bir yapıdaki üyelerin hepsi aynı durumda kullanılmayabilir. Üyelerin bir bölümü belirli bir durum için geçerli iken bir kısmı farklı bir durum için geçerlidir. Gereksiz yer harcamalarına karşı union tipi kullanılabilir.<br />
Tanımlama biçimi:</p>
<p>  union ad {<br />
      tip değişken_1;<br />
      tip değişken_2;<br />
      &#8230;<br />
      tip değişken_n<br />
   };</p>
<p>  Aynı yerde belirtilen alanlardan herhangi biri saklanır. En uzun alan ne ise o kadar yer ayrılır.</p>
<p>union ikisi {<br />
    int kisa;<br />
    long uzun;<br />
};<br />
union ikisi i;<br />
main()<br />
{<br />
  i.uzun = 32768;<br />
  printf(&#8220;%d  %ld \n&#8221;,i.kisa, i.uzun);  {-32768 32768 }<br />
}</p>
<p>Union Değişkenin Tanımlama Anında Değer Alması</p>
<p>Değişkene tanımlama anında değer atandığında alanlardan ilki kullanılıyor gibi davranır dil. Bu nedenle atanacak değerin tipine dikkat edilmelidir.</p>
<p>  union sayilar {<br />
     int i;<br />
     float f;<br />
  };<br />
  union sayilar a = {2};    /* a.i = 2 anlamındadır */</p>
<p>  union sayilar a = {2.7};    /* a.i = 2 değeri atanır. */</p>
<p>Bitler Üzerine Çalışmalar</p>
<p>VE , VEYA ve DEĞİL işleçleri mantıksal ifadeleri bağlamakta kullanıldığı gibi doğrudan tamsayılar üzerinde de kullanılabilir. Bu kullanımda işleçler doğrudan tamsayıyı oluşturan bitleri etkiler. </p>
<p> x &#038;  y  : x ve y tamsayılarının bitlerinin sırayla VE işlemine tutar.  (AND)<br />
 x | y      : x ve y tamsayılarının bitlerinin sırayla VEYA işlemine tutar.  (OR)<br />
~ x        : x  tamsayının her bir bitinin tersini alır (NOT)<br />
x ^ y      : x ve y tamsayılarının bitlerinin sırayla dışlayan VEYA işlemine tutar.  (exclusive OR)<br />
x <<  n  : x sayısını n bit sola kaydırır. Boşalan yerlere 0 gelir.<br />
x >> n   : x sayısını n bit sağa kaydırır. Boşalan yerlere 0 gelir.</p>
<p>x	y	&#038;	|	^<br />
0	0	0	0	0<br />
0	1	0	1	1<br />
1	0	0	1	1<br />
1	1	1	1	0</p>
<p>     5   &#038;     3   = 1<br />
(101) &#038;  (011) = (001)<br />
          |             = (111) yani 7<br />
5 << 1 = 10 --> (101) shl 1 = (1010)</p>
<p>Hex-Octal gösterim<br />
0xn : n 16 lıdır (HEXADECIMAL)   	0&#215;11 : 17<br />
0n   : n 8 lidir   (OCTAL)			011   : 9<br />
n     : n 10 ludur (DECIMAL)		  11 :  11 </p>
<p>Klavyedeki  tuşların durumunu gösterir bilgi bellekten okunduğunda her bitin anlamı şöyledir.<br />
       Bit No<br />
        0        sağ shift basılı/basılı değil<br />
        1        sol shift basılı/basıldı değil<br />
        2        kontrol tuşu basılı/basılı değil<br />
        3        alt tuşu basılı/basılı değil<br />
        4        scroll tuşu açık/kapalı<br />
        5        num lock tuşu açık/kapalı<br />
        6        caps lock tuşu açık/kapalı</p>
<p>Bu durumda num lock tuşunun açık olup olmadığını anlamak için okunan bilginin 5. bitinin değerini sınamak gerekecektir. Okunan bilginin x olduğunu varsayr ise;</p>
<p>if (x &#038; 32)<br />
    printf(&#8220;num lock açık&#8221;);<br />
else<br />
    printf(&#8220;num lock kapalı&#8221;);</p>
<p>x &#038; 32 işlemine x değerinin 32 sayısı ile maskelenmesi denir. 32 değeri maske diye çağırılır. 32 sayısının 8 bit olduğunu düşünürsel sayının sadece 5. biti bir olup diğerleri sıfırdır.</p>
<p>32 = (0010 0000)</p>
<p>x &#038; 32 işlemi ile x değerinin 5. bitinin bir olup olmaması sınanır. Bir ise sonuç 32 (farklı sıfır), sıfır ise sonuç 0 olur.</p>
<p>Örnek 8.1.5: Klavyedeki Num Lock tuşunun durumunu söyleyen programı yazınız.<br />
#include <dos.h><br />
main()<br />
{<br />
 unsigned int b1;<br />
 clrscr();<br />
 b1 = peek(0&#215;0040, 0&#215;0017);  /* dos.h> */<br />
 if (b1 &#038; 32)<br />
   printf(&#8220;Num lock açık\n&#8221;);<br />
 else<br />
   printf(&#8220;Num lock kapalı\n&#8221;);<br />
 getch();</p>
<p>İlgili işlevler<br />
	poke (segment, offset, int value)		X 	peek  (segment, offset)<br />
	pokeb (segment, offset, char value)		X	peekb(segment, offset)</p>
<p>Örnek 8.1.6: Öğrencinin doğum tarihi 2 Byte tamsayı olarak saklanmaktadır.<br />
         Bu bilginin kodlaması şöyledir.<br />
                   bit       anlamı<br />
                  0 &#8211; 4       gün<br />
                  5 &#8211; 8       ay<br />
                 9 -15       yıl (+1970)</p>
<p>Böyle bir bilgiyi çözen program. </p>
<p>#include <dos.h><br />
main()<br />
{<br />
 unsigned int i;<br />
 clrscr();<br />
 scanf(&#8220;%d&#8221;, &#038;i);</p>
<p> printf(&#8220;%2d&#8221;, i&#038;0x1f);<br />
 i = i >> 5;<br />
 printf(&#8220;/%2d&#8221;, i&#038;0x1f);<br />
 i = i >> 4;<br />
 printf(&#8220;/%4d&#8221;, i+1970);</p>
<p>}</p>
<p>Örnek 8.1.7<br />
unsigned swap(unsigned)	: gönderilen tamsayının düşük ile yüksek sekizlisinin yerini değiştirilmişini  verir<br />
unsigned max(unsigned) 	: gönderilen tamsayının düşük sekizlisi ile yüksek sekizlisinden büyüğünü verir</p>
<p>main()<br />
{<br />
  unsigned i, j;</p>
<p>  i = 0xAA11;<br />
  clrscr();<br />
  printf(&#8220;%x   %x  %x\n&#8221;, i, swap(i), max(i));</p>
<p>  getch();<br />
}</p>
<p>unsigned swap(unsigned a)<br />
{<br />
 return (a>>8) | (a<<8);<br />
}<br />
unsigned max(unsigned a)<br />
{<br />
  unsigned lo, hi, m;</p>
<p>  lo = a &#038; 0x00FF;<br />
  hi = a >> 8;<br />
  m = (lo>hi) ? lo:hi;<br />
  return m;<br />
}</p>
<p>Örnek 8.1.8: Aşağıdaki işlevlerin gerçekleştirilmesi.</p>
<p>void binary_yaz(unsigned x); { x tamsayısının 2li düzendeki karşılığını yazar }<br />
unsigned copybits(x, b, n)   { x sayısının sağdan b. bitinden itibaren n bitini verir}<br />
unsigned ters(x, b, n):         { x sayısının sağdan b. bitinden itibaren n bitini tersini alır}<br />
unsigned rdon(x,  n):          { x sayısını n bit sağa döndürür}</p>
<p>/* Programın başlangıcı */<br />
typedef unsigned int word; /* kolaylık i.in */</p>
<p>void binary_yaz(word);<br />
word copybits(word x, word b, word  n);<br />
word ters(word x, word b, word n);<br />
word rdon(word x, word n);<br />
word sdon(word x, word n);</p>
<p>main()<br />
{<br />
  word  i, j;</p>
<p>  clrscr();</p>
<p>  for (i=16; i>0; i&#8211;)<br />
      printf(&#8220;%x&#8221;, i-1);<br />
  printf(&#8220;\n&#8221;);</p>
<p>  i = 0xee;<br />
  binary_yaz(i); printf(&#8220;\n&#8221;);<br />
  j = copybits(i, 5, 4);  binary_yaz(j); printf(&#8221; copybits(i, 5, 4) \n&#8221;);</p>
<p>  j = ters(i, 5, 4);  binary_yaz(j); printf(&#8221; ters(i, 5, 4)\n&#8221;);</p>
<p>  j = rdon(i, 4);  binary_yaz(j); printf(&#8221; rdon(i, 4)\n&#8221;);</p>
<p>  getch();</p>
<p>}<br />
word copybits(word x, word b, word  n)<br />
/*  x sayısının sağdan b. bitinden itibaren n bitini verir.  */<br />
/*  ilk bitin numarası 0  */<br />
{<br />
  word i;</p>
<p>  i = x >> (b + 1 &#8211; n);   /*  ilgili bit bloğunun sağa dayalı olacak  */<br />
                            /*  biçimde kaydır.                         */</p>
<p>  i = i &#038; ~(~(0) << n);   /*  sağdaki n bit için maske oluştur  */<br />
  return i;<br />
}   /*  End Of copybits  */</p>
<p>word ters(word x, word b, word n)<br />
/*  x'in b. bitinden itibaren n bitin tersini alır  */<br />
{<br />
  word p, r;</p>
<p>  p = ~(x);<br />
  r = ~(~(0) << n) << (b - n + 1);   /*  seçilen bitler için maske */<br />
  p = p & r;</p>
<p>  x = x &#038; ~(r);<br />
  return x | p;<br />
/*<br />
8 bit için ters(. ,5,4)<br />
      76543210<br />
x = 0110 1000<br />
p = 1001 0111<br />
r =  00111100    ~(~(0) << n) << (b - n + 1)<br />
p = 00010100       p = p &#038; r<br />
x = 0100 0000      x &#038; ~(r)<br />
   = 01010100       x | p  dönen<br />
}   /*  End of test  */</p>
<p>word rdon(word x, word n)<br />
/*  x'i n bit sağa döndürür  */<br />
{<br />
  word i;<br />
  for (i = 1; i <= n; i++)<br />
    {<br />
       if (x % 2 == 1)<br />
          {<br />
            x = x / 2;<br />
            x = x | 0x8000;<br />
          }<br />
       else<br />
          x = x / 2;<br />
    }<br />
  return x;<br />
}   /*  End of rdon  */</p>
<p>word sdon(word x, word n)<br />
/*  x'i n bit sağa kaydırır. RDon fonksiyonun başka biçimi */<br />
{<br />
  word i;</p>
<p>  i = copybits(x,n - 1,n);<br />
  x = x >> n;<br />
  i = i << (16 - n + 1);<br />
  return x | i;<br />
}   /*  End of RDon  */</p>
<p>void binary_yaz(word x)<br />
{<br />
  int i;<br />
  word m;</p>
<p>  m = 0x8000;<br />
  for (i = 0; i<16; i++) {<br />
      if (x &#038; m)<br />
         printf("1");<br />
      else<br />
         printf("0");<br />
      m = m >> 1;<br />
  }<br />
}</p>
<p>9. Pointer (gösterici, işaretçi) </p>
<p>9.1 Tanımlanması ve Kullanımı</p>
<p>    Bir veri bloğunun bellekte bulunduğu adresi içeren (gösteren) veri tipidir. Tanımlama biçimi:</p>
<p>     veri tipi  *p;</p>
<p>p değişkeni <veri tipi> ile belirtilen tipte bir verinin bellekte saklandığı adresi içerir.</p>
<p>     int *iptr;<br />
     float *fptr;</p>
<p>Bu kadar tanımla sonucunda bellekte p değişkeni mevcuttur. Ancak işaret ettiği veri bloğu yoktur. Bunun için iki yol vardır. Birincisi  kullanılan herhangi bir değişkeni işaret etmek, ikincisi ise  veri bloğunu boş belleği kullanarak oluşturmak.</p>
<p>1.  İşaretçi değişkenin var olan bir değişkenin bulunduğu adresi göstermesi.</p>
<p>Bu işlemi yapabilmek için var olan değişkenin adresinin bilinmesi gerekmektedir. </p>
<p>&#038; işleci : Bir değişkenin adresinin belirlenmesi için kullanılır. Kullanım biçimi:</p>
<p>	&#038;değişken</p>
<p>&#038;i  : i değişkenin adresini verir.</p>
<p>main()<br />
{<br />
  int i;<br />
  int *iptr;<br />
  i = 5;<br />
  iptr = &#038;i;<br />
  clrscr();<br />
  printf(&#8220;i değişkeninin adresi    %p\n&#8221;, &#038;i);<br />
  printf(&#8220;iptr değişkeninin değeri %p\n&#8221;, iptr);<br />
}</p>
<p>Bellek modeline göre SSSS:OOOO veya OOOO biçiminde adres yazar.</p>
<p>8FF8:1000</p>
<p>2. Veri bloğunu boş belleği kullanarak oluşturmak.</p>
<p>Bu yolla veriler için dinamik yer ayırılır. Bunun için malloc işlevi kullanılır<br />
void *malloc(n) : Boş bellekten n byte yer ayırıp başlangıç adresini döndürür.<br />
iptr = (*int) malloc(2);<br />
!!!!!!!!!    Daha sonra dönüş yapılacak. sizeof,  cast işleci (*tip) &#8230; </p>
<p>Veriye işaretçi değişken yoluyla erişim</p>
<p>Bir işaretçinin gösterdiği adresteki veriye erişmek için işaretçi değişkeninin önüne * karakteri konur.<br />
main()<br />
{<br />
  int i;<br />
  int *iptr;<br />
  iptr = &#038;i;<br />
  *iptr = 8;<br />
  printf(&#8220;i değişkeninin değeri %d\n&#8221;, i);<br />
  printf(&#8220;iptr adresinin içeriği %d\n&#8221;, *iptr);</p>
<p>}</p>
<p>Ekranda çıktı :<br />
i değişkeninin değeri 8<br />
iptr adresinin içeriği 8</p>
<p>!!! İşaretçi değişkenin gösterdiği adresin içeriği değişken ilklendirmeden kullanılmamalıdır</p>
<p>9.2 İşaretçi Aritmetiği</p>
<p>İşaretçi değişkenler üzerinde toplama ve çıkartma işlemleri (++, &#8211;)  geçerlidir. Ancak eklenecek değer tamsayı olmalıdır.<br />
İşaretçi değişkenin değeri 1 arttırıldığı zaman değişken bir sonraki veri bloğunu işsaret eder. Değişkenin alacağı yeni değer işaretçi değişkenin ne tip bir veri bloğunu işaret ettiğine bağlıdır.</p>
<p>int *iptr, i;<br />
&#8230;<br />
iptr = &#038;i;                   i değişkenin adresinin 1000 olduğunu varsayalım. iptr nin değeri 1000 dir.<br />
iptr++;                       iptr nin değeri 1002 olur. (  int değeri işaret ettiği için)  </p>
<p>aynı örneği double için yaparsak<br />
double *iptr, i;<br />
&#8230;<br />
iptr = &#038;i;                   i değişkenin adresinin 1000 olduğunu varsayalım. iptr nin değeri 1000 dir.<br />
iptr++;                       iptr nin değeri 1008 olur. (  double değeri işaret ettiği için)  </p>
<p>int *iptr, i, j;<br />
&#8230;<br />
iptr = &#038;i;                   i değişkenin adresinin 1000 olduğunu varsayalım. iptr nin değeri 1000 dir.<br />
*(iptr+4)=2;             1008 adresinin içeriğini 2 yapar.</p>
<p>!!! Arttırma işaret edilen veri bloğuna göre yapılır Yani bir sonraki veri bloğunun gösterilmesi sağlanır.</p>
<p>iptr++ ;       bir sonraki veri bloğunu göster<br />
(*iptr)++;   iptr değişkeninin gösterdiği adresteki değeri 1 arttır</p>
<p>9.3 İşaretçiler ve Diziler</p>
<p>İşarteçiler üzerinde geçerli aritmetik yardımıyla dizilere işaretçi değişkenler ile erişmek mümkündür.</p>
<p>#include <stdio.h><br />
main()<br />
{<br />
  int i[10], j;<br />
  int *iptr;</p>
<p>  for (j=0; j<10; j++)<br />
       i[j]=j;</p>
<p>  /* Dizinin başlangıç adresine erişmek için ilk elemanın adresi kullanılabilir  &#038;i[0]  veya doğrudan */</p>
<p>  iptr = i; </p>
<p>  clrscr();</p>
<p>  for (j=0; j<10; j++) {<br />
      printf("%d ", *iptr);<br />
      iptr++;<br />
  }<br />
  printf("\n");<br />
/* iptr artık dizinin başını göstermez */</p>
<p>  iptr = i;<br />
  for (j=0; j<10; j++)<br />
      printf("%d ", *(iptr+j));</p>
<p>  printf("\n");<br />
/* iptr hala dizinin başını gösterir */<br />
  getch();<br />
}</p>
<p>Örnek 9.3.1: İşaretçi ve dizgi kullanımı.<br />
#include <stdio.h><br />
main()<br />
{<br />
  char *a=&#8221;1234567890&#8243;;<br />
  char b[11];<br />
  char *p1, *p2;</p>
<p>  printf(&#8220;%s\n&#8221;, a);<br />
  p1 = a;<br />
  p2 = b;<br />
  while (*p1 != &#8216;\0&#8242;) {<br />
      *p2 = *p1;<br />
      p1++;<br />
      p2++;<br />
  }<br />
  printf(&#8220;%s\n&#8221;, b);<br />
}</p>
<p>9.4 İşlevleri Referans Yoluyla Çağırma</p>
<p>Şu ana yazdığımız işlevlerde gönderilen parametrelerin (diziler hariç) değerlerinin değiştirilmesi mümkün değil idi. İşlev çağırıldığı zaman parametrelerin bir kopyası çıkartılıp işleve gönderiliyordu. Bir işlevin birden fazla değer gönderebilmesi için işaretçilere gereksinimiz vardır.</p>
<p>void arttir(int);<br />
main()<br />
{<br />
  int i;<br />
  i = 5;<br />
  printf(&#8220;öncesi %d\n&#8221;, i);<br />
  arttir(i);<br />
  printf(&#8220;sonrası %d\n&#8221;, i);<br />
  getch();<br />
}<br />
void arttir(int k)<br />
{<br />
  k++;<br />
}</p>
<p>Çıktı :<br />
öncesi 5<br />
sonrası 5</p>
<p>Gönderilen parametrenin kopyası işleve gönderildiği için işlev içerisinde yapılan değişiklikler işlevin çağırıldığı yeri etkilemez. Eğer parametredeki değişikliklerin işlevin çağırıldığı yerde de geçerli olmasını istiyorsak işleve parametrenin adresini göndermek gerekir.</p>
<p>void arttir(int*);<br />
main()<br />
{<br />
  int i;<br />
  i = 5;<br />
  printf(&#8220;öncesi %d\n&#8221;, i);<br />
  arttir(&#038;i);<br />
  printf(&#8220;sonrası %d\n&#8221;, i);<br />
  getch();<br />
}<br />
void arttir(int *k)<br />
{<br />
  (*k)++;<br />
}</p>
<p>öncesi 5<br />
sonrası 6</p>
<p>Örnek 9.4.1: Sayısal dizgiyi tamsayıya dönüştüren işlevde iyileştirme. Geçersiz karakterin konumu da verilsin.<br />
int deger(char *s, int *konum)<br />
konum = -1 ise tüm karakterler rakam<br />
            >=0 ise geçersiz karakterin konumu</p>
<p>Örnek 9.4.2 : Sıraya dizme. Yer değişikliği işlevde ve parametrelere referans yolu ile erişim.</p>
<p>#include <stdio.h><br />
#include <conio.h></p>
<p>#define N 20<br />
void degistir (int *, int *);</p>
<p>main()<br />
{<br />
   int s[N];<br />
   int i, k;</p>
<p>   clrscr();</p>
<p>   for (i=0; i<N; i++) {<br />
       s[i] = rand() % 100;<br />
       printf("%4d",s[i]);<br />
   }<br />
   printf("\n");<br />
   k=1;<br />
   do {<br />
      k=0;<br />
      for (i=0; i<N-1; i++)<br />
          if (s[i] > s[i+1]) {<br />
             degistir (&#038;s[i], &#038;s[i+1]);<br />
             k = 1;<br />
          }<br />
   } while (k);</p>
<p>   for (i=0; i<N; i++)<br />
       printf("%4d",s[i]);<br />
   printf("\n");<br />
   getch();<br />
}</p>
<p>void degistir (int *a, int *b)<br />
{<br />
  int gec;<br />
  gec = *a;<br />
  *a = *b;<br />
  *b = gec;<br />
}</p>
<p>!!! Dizilerde işaretçi olduğu için a değişkeni bir dizi(veya işaretçi ise)<br />
a[i] ile *(a+i) ifadeleri aynı anlamı taşır.</p>
<p>Örnek 9.4.3: İşleve gönderilen dizinin işlev içerisinde işaretçi olarak kullanımı.</p>
<p>#include <stdio.h><br />
#include <conio.h></p>
<p>#define N 5</p>
<p>float ort (int *);</p>
<p>main()<br />
{<br />
   int s[N];<br />
   int i, k;</p>
<p>   clrscr();<br />
   for (i=0; i<N; i++) {<br />
       s[i] = rand() % 100;<br />
       printf("%4d",s[i]);<br />
   }<br />
   printf("\n");<br />
   getch();<br />
}</p>
<p>float ort (int *a)<br />
{<br />
  int i;<br />
  float t = 0;</p>
<p>  for (i=0; i<N; i++)<br />
      t = t + *(a+i);</p>
<p>  return t/N;<br />
}</p>
<p>Örnek 9.4.5: işleve gönderilen işaretçinin işlev içerisinde dizi olarak kullanımı .</p>
<p>void malloc(n):  En az n byte uzunluğunda bellekten yer ayırır. İşlevin değeri<br />
		>0 ise bloğun bellekteki yeri, NULL yer yok demektir.</p>
<p>int *i;<br />
i = (int *) malloc(2000) ;    2000 byte yer ayırıp bloğun başlangıç adresini i &#8216;ye atar<br />
                                             ( 1000 elemanlı int dizisi )<br />
double *x;<br />
x = (double *) malloc(8*2000);  2000 elemanlı double dizi</p>
<p>sizeof(n) : n ifadesinin/tipinin byte olarak uzunluğunu verir.<br />
i = (int *) malloc(1000*sizeof(int)) ;    1000 tane int değer içerecek bellek uzunluğu</p>
<p>x = (double *) malloc(2000*sizeof(double));  2000 elemanlı double dizi</p>
<p>void free (void *block) : mallock işlevivi tersi. Block değişkenin tuttuğu yeri boş belleğe gönderir</p>
<p>#include <stdio.h><br />
#include <conio.h><br />
#define N 8<br />
float ort (int []);</p>
<p>main()<br />
{<br />
   int *s;<br />
   int i, k;</p>
<p>   s = (int *) malloc(2*N);<br />
   clrscr();<br />
   for (i=0; i<N; i++) {<br />
       s[i] = rand() % 10;<br />
       printf("%4d",*(s+i));<br />
   }<br />
   printf("\n");</p>
<p>   printf("Ortamala = %.2f\n",ort(s));</p>
<p>   getch();<br />
}</p>
<p>float ort (int a[])<br />
{<br />
  int i;<br />
  float t = 0;</p>
<p>  for (i=0; i<N; i++)<br />
      t = t + a[i];<br />
  return t/N;<br />
}</p>
<p>Örnek 9.4.6 : Bir dizinin elemanlarının işaretçi olması.</p>
<p>Daha önce yapılan bir örnekte ay isimleri bir dizide saklanmıştı.</p>
<p>main()<br />
{<br />
  char *aylar[] = {"", "Ocak", "ªubat", "Mart", "Nisan",<br />
                   "Mayıs", "Haziran", "Temmuz", "Ağustos",<br />
                   "Eylül", "Ekim", "Kasım", "Aralık"};<br />
  int i;<br />
  printf("Ayın sırasını gir "); scanf("%d", &#038;i);<br />
  if (i>0 &#038;&#038; i<13)<br />
     printf("%s\n", aylar[i]);<br />
  getch();<br />
}</p>
<p>Benzer şekilde  </p>
<p>	float *a[100];</p>
<p>tanımlaması her bir elemanı bellekte bir 'float' sayıyı gösteren işaretçi olan 100 elemanlı bir dizidir.</p>
<p>Örnek 9.4.7 : Bir işaretçinin adresini içeren işaretçiler.</p>
<p>main()<br />
{<br />
  int i;<br />
  int *iptr;<br />
  int **iptrptr;</p>
<p>  i = 5;<br />
  iptr = &#038;i;<br />
  iptrptr = &iptr;</p>
<p>  clrscr();<br />
  printf("    i    ve    &#038;i    :  %d   %p\n", i, &#038;i);<br />
  printf("  *iptr  ve   iptr   :  %d   %p\n", *iptr, iptr);<br />
  printf("*iptrptr ve  iptrptr :  %p   %p\n", *iptrptr, iptrptr);</p>
<p>  getch();<br />
}</p>
<p>Ekrana çıktı:<br />
        i    ve    &#038;i     :  5   8FDD:1000<br />
    *iptr  ve   iptr    :  5   8FDD:1000<br />
*iptrptr ve  iptrptr :  8FDD:1000   8FDD:0FFC</p>
<p>9.5 İşaretçiler ve Yapılar</p>
<p>Bir işaretçi işleve parametre olarak gönderildiğinde basit değişken gibi değişkenin kopyası alınıp gönderiliyordu. Yapının büyük olduğu durumlarda bu da sorun çıkartır. İşaretçinin bir yapı verisini göstermesi.</p>
<p>   struct ogrenci{<br />
     char no[10];<br />
     int  notu;<br />
   };</p>
<p>   struct ogrenci *a</p>
<p>Tanımlamasında a değişkenini oluşturan alanlara erişmek için, bilinen yol:</p>
<p>	*a.notu=56;<br />
	strcpy((*a).no, "95001");</p>
<p>Bunun farklı kullanımı:<br />
	a->notu=56;<br />
	strcpy(a->no, &#8220;95001&#8243;);</p>
<p>Örnek 9.5.1 :  Yapının adresinin işleve gönderilmesi.</p>
<p>#include <stdio.h><br />
typedef struct {<br />
    char adi[35];<br />
    char adres1[40];<br />
    char adres2[40];<br />
    char tel[15];<br />
    float borc;<br />
} kisiler;<br />
void yaz(kisiler *z);<br />
main()<br />
{<br />
   kisiler  a;<br />
   clrscr();<br />
   printf(&#8220;Adını gir  : &#8220;); gets(a.adi);<br />
   printf(&#8220;Adres-1    : &#8220;); gets(a.adres1);<br />
   printf(&#8220;Adres-2    : &#8220;); gets(a.adres2);<br />
   printf(&#8220;Telefonu   : &#8220;); gets(a.tel);<br />
   printf(&#8220;Borcu      : &#8220;); scanf(&#8220;%f&#8221;, &#038;(a.borc));</p>
<p>   yaz(&#038;a);<br />
}<br />
void yaz(kisiler *z)<br />
{<br />
  clrscr();<br />
  printf(&#8220;Adı        : &#8220;); puts(z->adi);<br />
  printf(&#8220;Adresi     : &#8220;); puts(z->adres1);<br />
  printf(&#8221;           : &#8220;); puts(z->adres2);<br />
  printf(&#8220;Telefonu   : &#8220;); puts(z->tel);<br />
  printf(&#8220;Borcu      : &#8220;); printf(&#8220;%.0f\n&#8221;, z->borc);<br />
}</p>
<p>9.6 Dinamik bellek kullanımı </p>
<p>Üç boyutlu dizi tanımı ve kullanımı.</p>
<p>Üç boyut &#8211;> Gerilim &#8211; Akım &#8211; Zaman</p>
<p>Örnek 9.6.1: Tek boyutlu diziyi üç boyutlu gibi kullanma.</p>
<p>/* Üç boyutlu dinamik dizi kullanımı. Her boyut farklı uzunlukta<br />
   Dizi tek boyutlu gözüküyor. Ancak indis, hesaplanarak bulunuyor</p>
<p>   Yani</p>
<p>       *(a + i*y*z + j*z +k)<br />
               ^       ^<br />
               ^       ^ 3. boyutun uzunluğu<br />
               ^2. boyutun uzunluğu</p>
<p>   şeklinde kullanılabilir.<br />
*/</p>
<p>#define x    4<br />
#define y    5<br />
#define z    9<br />
void matris_yaz(int *);<br />
main()<br />
{<br />
  int *a;<br />
  int i, j, k;</p>
<p>  a=(int *) malloc(x * y * z * sizeof(int)); /* eleman sayisi kadar yer ac */</p>
<p>  clrscr();</p>
<p>  for (i=0; i<x; i++) {<br />
      printf("i = %d \n", i);<br />
      for (j=0; j<y; j++) {<br />
          for (k=0; k<z; k++) {<br />
              *(a + i*y*z + j*z +k) = i*j*k;<br />
              printf("%5d ",*(a + i*y*z + j*z +k));<br />
          }<br />
          printf("\n");<br />
      }<br />
  }</p>
<p>  matris_yaz(a);</p>
<p>}</p>
<p>void matris_yaz(int *m)<br />
{<br />
  int i, j, k;</p>
<p>  clrscr();<br />
  for (i=0; i<x; i++) {<br />
      printf("i = %d \n", i);<br />
      for (j=0; j<y; j++) {<br />
          for (k=0; k<z; k++) {<br />
              printf("%5d ",*m);<br />
              *m++;<br />
          }<br />
          printf("\n");<br />
      }<br />
      getch();<br />
  }<br />
}</p>
<p>Örnek 9.6.2:<br />
/* Uc boyutlu dinamik dizi kullanimi. Her boyut farkli uzunlukta<br />
   Bu yontem ile diziye normal dizi gibi erismek mumkun<br />
   Yani<br />
       a[i][j][k]<br />
   seklinde kullanilabilir.<br />
*/</p>
<p>#define x    8<br />
#define y    4<br />
#define z   10<br />
main()<br />
{<br />
/*<br />
  typedef int *boyut1;<br />
  typedef boyut1 *boyut2;<br />
  typedef boyut2 *boyut3;</p>
<p>  boyut3 a;<br />
*/<br />
  double ***a;</p>
<p>  int i,j,k;</p>
<p>  a=(double *) malloc(x*sizeof(double*));            /* 1. boyut icin yer ayir  (işaretçiler)   */<br />
  for (i=0; i<x; i++)                                             /* 2. boyut icin yer ayir.  (işaretçiler)  */<br />
      *(a+i)=(double *) malloc(y*sizeof(double*)); /* 1. boyutun her elemani n   */<br />
                                                                          /* elemanli diziyi gosterir   */</p>
<p>  for (i=0; i<x; i++)                        /* 3. boyut icin yer ayir (matrisin elemanlar)    */<br />
      for (j=0; j<y; j++)<br />
          *(*(a+i) + j) = (double *) malloc(z*sizeof(double));</p>
<p>  clrscr();</p>
<p>  for (i=0; i<x; i++)<br />
      for (j=0; j<y; j++)<br />
          for (k=0; k<z; k++)<br />
              *(*(*(a + i) + j) + k) = i*j*k;<br />
  for (i=0; i<x; i++) {<br />
      printf("i = %d \n", i);<br />
      for (j=0; j<y; j++) {<br />
          for (k=0; k<z; k++)<br />
              printf("%4.1f ",a[i][j][k]);<br />
          printf("\n");<br />
      }<br />
      getch();<br />
  }<br />
}</p>
<p>9.7 İşaretçilerle İlgili Diğer Konular</p>
<p>İşaretçinin Belirli Bir Adresi Göstermesi</p>
<p>#include <dos.h><br />
#include <stdio.h><br />
char far *ekran;<br />
void kaydir_Y(void);<br />
void kaydir_A(void);<br />
void main()<br />
{<br />
   int i, j;<br />
   char c;</p>
<p>   ekran = MK_FP(0xB800, 0);<br />
   clrscr();<br />
   for (i=0; i<25; i++)<br />
       for (j=0; j<80; j++)<br />
           ekran[160*i+2*j] = 65+i;</p>
<p>   while (1) {<br />
      c = toupper(getch());<br />
      switch(c) {<br />
          case 'A' :  /* yukari */<br />
                      kaydir_Y();<br />
                      break;<br />
          case 'Z' :  /* asagi */<br />
                      kaydir_A();<br />
                      break;<br />
          case 'Q' : exit(0);<br />
      }<br />
   }<br />
}<br />
void kaydir_Y(void)<br />
{<br />
  int i, j;<br />
  for (i=8; i<=12; i++)<br />
      for (j=30; j<60; j++)<br />
          ekran[160*(i-1) + 2*j] = ekran[160*i + 2*j];<br />
}<br />
void kaydir_A(void)<br />
{<br />
  int i, j;<br />
  for (i=12; i>=8; i&#8211;)<br />
      for (j=30; j<60; j++)<br />
          ekran[160*(i+1) + 2*j] = ekran[160*i + 2*j];<br />
}</p>
<p>İşlev İşaretçileri</p>
<p>İşaretçinin bir işlevin bulunduğu adresi içermesi durumudur.  Normal işaretçi gibi işlevin adresini içeren değişken tanımı yapılmalıdır. Örneğin;</p>
<p>	int (*fnptr) (int, int)</p>
<p>fnptr değişkeni iki tane int parametresi olup bir int değer geri gönderen bir işlevin adresini içerebilir.</p>
<p>(int *fnptr (int, int) : iki int parametresi olup int işaretçi geri gönderir )</p>
<p>Örnek 9.7.1: Aynı isim ile farklı iki işlevi çağırma.</p>
<p>int kare(int);<br />
int kub(int);<br />
main()<br />
{<br />
  int (*islem)(int);              /* bir int değer alıp geriye int değer gönderen   bir işlevin adresi  */<br />
  int i;<br />
  char c;</p>
<p>  clrscr();</p>
<p>  printf("1 / 2 : kare / küb hesabı : ");</p>
<p>  c = getch();<br />
  printf("\nSayıyı gir : ");<br />
  scanf("%d", &#038;i);</p>
<p>  if (c == '1')<br />
     islem = kare;      /* kare işlevinin adresi islem değişkenine kopyalanır */<br />
  else<br />
     islem = kub;</p>
<p>  printf("Sonuç = %d\n", islem(i));</p>
<p>  getch();<br />
}</p>
<p>int kare(int s)<br />
{<br />
 return s*s;<br />
}</p>
<p>int kub(int s)<br />
{<br />
 return s*s*s;<br />
}</p>
<p>Void İşaretçiler </p>
<p>İşaretçiler void olarak tanımlanabilir. Bu biçimde tanımlanan işaretçilerin gösterdiği adresteki değere erişmek için veri tipi belirtilmelidir.</p>
<p>main()<br />
{<br />
  void *a;</p>
<p>  a = (char*) malloc(10);<br />
  strcpy(a,"12345");</p>
<p>  printf("%s\n",  a);<br />
  free(a);</p>
<p>  a = (double*) malloc(sizeof(double));<br />
  *(double*)a = 3.123;                 /* değere erişirken veri tipi belirt */<br />
  printf("%f\n", *(double *)a);</p>
<p>  getch();<br />
}</p>
<p>10.  Daha Önce Geçmeyen Konular</p>
<p>Deyimler<br />
continue: Döngünün herhangi bir satırında iken, bir sonraki döngü admını geçilmesini sağlar.</p>
<p>Örnek 10.1:<br />
#include <stdio.h><br />
int main()<br />
{<br />
int i;</p>
<p>   for(i = 1 ; i < 10 ; i++)<br />
   {<br />
      if (i == 5)<br />
         break;<br />
      printf("%d\n", i);<br />
   }</p>
<p>   for(i = 1 ; i < 10 ; i++)<br />
   {<br />
      if (i == 5)<br />
         continue;<br />
      printf("%d\n", i);<br />
   }<br />
}</p>
<p>gotoxy(x, y) : İmleci metin ekranında istenilen noktaya taşır.<br />
void gotoxy(int x, int y)<br />
gotoxy(25, 23);<br />
printf("Bir tuşa basınız.");</p>
<p>wherex(), wherey() : Bulunulan yer</p>
<p>exit: Herhangi bir yerde programın çalışmasını sonlandırır.<br />
void exit(int durum); : Dosyalar kapatılır, durum parametresinin değeri programın çağırıldığı yere geri gönderilir.</p>
<p>goto : Programın herhangi bir yerinden başka bir yere atlanmasını sağlar ( aynı işlev içerisinde).<br />
Gidilecek yerin tanımlanması gerekir. Kulanım şekli;<br />
	goto son            programın akışı son: etiketinin alduğu yerden devam eder<br />
	...<br />
	son :<br />
	return;</p>
<p>Örnek: Matriste sıfırdan küçük değerli ilk elemanın yerini bulan program.<br />
#include <stdlib.h><br />
main()<br />
{<br />
  int a[10][10];<br />
  int i, j;</p>
<p>  randomize();</p>
<p>  for (i = 0; i<10; i++)<br />
      for (j = 0; j<10; j++)<br />
          a[i][j] = (rand() % 100) - 20;</p>
<p>  for (i = 0; i<10; i++)<br />
      for (j = 0; j<10; j++)<br />
          if (a[i][j] < 0)<br />
             goto bulundu;</p>
<p>  printf("Sıfırdan küçük sayı yok\n");<br />
  goto son;</p>
<p>bulundu:<br />
  printf("Sayının konumu ve değeri (%d, %d) =  %d  \n",i, j, a[i][j]);</p>
<p>son:<br />
  return 0;<br />
}</p>
<p>? : İşleci<br />
değişken = mantıksal ifade ? ifade1 : ifade2<br />
mantıksal ifade doğru is değişkene ifade1, yanlış ise ifade2 değeri atanır.</p>
<p>a = (i == 5) ? 1 : 0;<br />
Eğer i'nin değeri 5 ise a'ya 1, aksi halde 0 atanır. Aynı ifade açık olarak yazılırsa;<br />
if (i ==5)<br />
    a = 1;<br />
else<br />
    a = 0;</p>
<p>Örnek 10.2:<br />
main()<br />
{<br />
  int a;<br />
  int i, j;</p>
<p>  scanf("%d%d", &#038;i, &#038;j);</p>
<p>  a = (i > j) ? i : j;</p>
<p>  printf(&#8220;%d\n&#8221;, a);<br />
}</p>
<p>Bileşik Atama İşleci<br />
a = a + b  işlemi a += b şeklinde de yazılabilir. = işleci ile birlikte bu şekilde kullanılabilen diğer işleçler;<br />
  *      /    %    +    &#8211;    <<    >>    &#038;    ^    |</p>
<p>Bu işleçler için<br />
	a = a işleç b   ile<br />
	a işleç= b<br />
aynı anlamı taşır.</p>
<p>Virgül İşleci<br />
Şu ana kadar kullanılan biçim dışında,<br />
Birden fazla deyimin aynı ifadede yürütülmesini sağlar. İfade tek bir sonuç verecek ise parantez içerisine alınmalıdır. İfadeler soldan sağa yürütülür ve son ifade parantez içi ifadenin değeri olur.</p>
<p>i = (5, 3, 8);      i = 8<br />
i = (j = 2; j = j + 5);   i = 7</p>
<p>for döngüsünün bölümlerinde birden fazla deyim yürütmede kullanılır.</p>
<p>for (t = 0, i = 0; i<100; i++)<br />
      t = t + i;</p>
<p>Geçici Veri Tipi Değiştirme<br />
(type cast)<br />
Bir değerin tipinin geçici olarak değiştirmek mümkündür. Kullanım şekli,.<br />
(veri tipi) ifade;</p>
<p>ifade (değişken, sabit) tipi belirtilen tipe dönüştürülür.</p>
<p>Örnek 10.3:<br />
#include <stdlib.h><br />
main()<br />
{<br />
  float a, b;<br />
  int i, j;</p>
<p>  i = 500;<br />
  j = 500;</p>
<p>  a = i * j;<br />
  b = (float) i*j;</p>
<p>  printf(&#8220;%f   %f\n&#8221;, a, b);</p>
<p>}<br />
-12144.000000   250000.000000</p>
<p>İfade İçerisinde Atama Deyimi Kullanma</p>
<p>#include <stdlib.h><br />
main()<br />
{<br />
  char c;<br />
  while ((c=getch()) != &#8216;S&#8217;)<br />
        printf(&#8220;%c&#8221;, c);<br />
  printf(&#8220;\n%c tuşuna bastınız\n&#8221;, c);<br />
getch();<br />
}</p>
<p>((c=getch()) != &#8216;S&#8217;) ifadesinde ilk önce en içteki parantez c = getch() yürütülür. Daha sonra karşılaştırma işlemi yapılır.</p>
<p>++ / &#8212; İşleçleri</p>
<p>İfade içerisinde değişkenin<br />
	ardında ise değişkenin değeri ifadede kullanılır ve değeri bir arttırılır<br />
	önünde ise değişkenin değeri  değeri bir arttırılır ve yeni değeri ifadede kullanılır.<br />
i = 2;<br />
k = 5*i++;     &#8211;> k = 10<br />
k = 5*++i;     &#8211;> k = 15</p>
<p>#define Önişlemcisi</p>
<p>define önişlemcisi ile işlev benzeri makrolar yazmalar mümkündür.</p>
<p>#define kub(x)  ((x)*(x)*(x))<br />
main()<br />
{<br />
  int i;</p>
<p>  i = 5;<br />
  printf(&#8220;%d \n&#8221;, kub(i));<br />
}<br />
Makro tanım satırında parametrelerin parantez içerisine alınması unutulmalı.</p>
<p>Makro kub(i+1) biçiminde çağırıldığında, i=2 için</p>
<p>((x)*(x)*(x))   &#8211;>  (i+1)*(i+1)*(i+1)  &#8211;> 27</p>
<p>(x * x * x)       &#8211;>  (i+1* i+ 1* i+1)   &#8211;> 6</p>
<p>#define ustal(a, b)  (pow((a), (b)))</p>
<p>11. Grafik</p>
<p>Basit grafik işlemleri nasıl gerçekleştirilir (sorumlu değiller).<br />
Normal çalışma anında text ekranda (25, 80) boyutlarında.<br />
* void textbackground(int newcolor);              : alt zemin rengi<br />
* void textcolor(int newcolor);                        : yazı rengi<br />
* void textattr(int newattr);  8 bitlik sayı. hem alt zemin hem de yazı rengi<br />
			       verilir Bbbbffff (B = blink)</p>
<p>* void highvideo(void);  Yazı parlaklığı<br />
* void lowvideo(void);<br />
* void normvideo(void);</p>
<p>Bu işlevler doğrudan ekrana yazan deyimlere yöneliktir (cprintf, cput)<br />
#include <conio.h><br />
main()<br />
{<br />
  int i;<br />
  textbackground(BLACK);</p>
<p>  clrscr();</p>
<p>  for (i=0; i<=15;i++) {<br />
      textcolor(i);<br />
      cputs("HÜSEYİN PEKTAŞ\r\n");<br />
  }</p>
<p>  getch();<br />
}</p>
<p>Grafik çizimi için bilgisayarın grafik modunda olması gerekir.</p>
<p>/*<br />
* void far initgraph(int far *graphdriver, int far *graphmode, char far *pathtodriver);<br />
	Grafik sistemini verilen degerlere gore ayarlar. Grafik komutlarini  kullanmadan once calistirilmalidir.</p>
<p>* closegraph;               Grafik sistemini kapatir.<br />
* graphresult: int;        Grafik islemi ile ilgili  bilgi verir.<br />
* char *far grapherrormsg(int errorcode); Belirtilen grafik hatasi icin mesaji verir.</p>
<p>* line(x1, y1, x2, y2);<br />
* lineto(x, y);           Bulunulan yerden (x,y) ye kadar çizer<br />
* linerel(x, y);          Bulunulan yerin (x,y) ötesine kadar çizer<br />
* moveto(x, y);</p>
<p>* void far cleardevice(void); Grafik ekranını siler</p>
<p>* circle(x, y , r);</p>
<p>* putpixel(x, y, renk);<br />
* getpixel(x, y);      Belirtilen noktanin piksel degerini verir</p>
<p>* getx;   Bulunulan<br />
* gety;      noktalar</p>
<p>* getmaxx;  Maksimum olabilecek<br />
* getmaxy;       noktalar</p>
<p>* outtext(char far *)         : Bulunulan yere metni yazar<br />
* outtextxy(x, y, char far *) : Belirtilen yere metni yazar</p>
<p>* int far getcolor(void);        : çizim rengi öğren<br />
* void far setcolor(int color);  : çizim rengini değiştir</p>
<p>* int far getbkcolor(void);      : alt zemin rengini öğren<br />
•	void far setbkcolor(int color);: alt zemin rengini değiştir</p>
<p>EGA_BLACK          EGA_BLUE          EGA_GREEN  EGA_CYAN  EGA_RED  EGA_MAGENTA  EGA_LIGHTGRAY  EGA_BROWN 	0 1 2 3 4 5 7 20	EGA_DARKGRAY    EGA_LIGHTBLUE    EGA_LIGHTGREEN EGA_LIGHTCYAN   EGA_LIGHTRED      EGA_LIGHTMAGENTA  EGA_YELLOW     EGA_WHITE         	56 57 58 59 60 61 62 63</p>
<p>#include <graphics.h><br />
#include <stdlib.h><br />
#include <stdio.h><br />
#include <conio.h></p>
<p>main()<br />
{<br />
   int gd, gm, hata;<br />
   int x, y;</p>
<p>   gd = DETECT;  /* ekran sürücüsünü otomatik tanı */<br />
		 /* CGA, HERC, VGA..*/</p>
<p>   initgraph(&#038;gd, &#038;gm, &#8220;c:\\diller\\tc3\\bgi\\&#8221;);<br />
   /* gd         gm<br />
      VGA    ¦ VGALO    ¦  0  ¦  640 x 200 ¦ 16 color¦  2<br />
         9       ¦ VGAMED ¦  1  ¦  640 x 350 ¦ 16 color¦  2<br />
                  ¦ VGAHI     ¦  2  ¦  640 x 480 ¦ 16 color¦  1<br />
   */<br />
    hata = graphresult();</p>
<p>   if (hata != grOk)  /* grOk = 0 tanımlı */<br />
   {<br />
      printf(&#8220;Grafik hatası: %s\n&#8221;, grapherrormsg(hata));<br />
      getch();<br />
      exit(1);<br />
   }</p>
<p>   x = getmaxx();<br />
   y = getmaxy();</p>
<p>   setbkcolor(EGA_RED);<br />
   setcolor(EGA_YELLOW);<br />
   cleardevice();</p>
<p>   line(0, 0, 0, y);<br />
   line(0, y, x, y);<br />
   line(x, y, x, 0);<br />
   line(x, 0, 0, 0);</p>
<p>   getch();</p>
<p>   cleardevice();</p>
<p>   moveto(50, 50);<br />
   lineto(50, 100);<br />
   lineto(100,100);<br />
   lineto(100,50);<br />
   lineto(50, 50);</p>
<p>   getch();</p>
<p>   closegraph();<br />
}</p>
<p>Örnek 11.1: İşlev çizimi<br />
#include <graphics.h><br />
#include <stdlib.h><br />
#include <stdio.h><br />
#include<br />
<math.h>
<p>double fonk(double x);<br />
double fonk1(double x);</p>
<p>main()<br />
{<br />
   int gd, gm, hata;<br />
   double x, y;<br />
   int orgx, orgy;</p>
<p>   gd = DETECT;<br />
   initgraph(&#038;gd, &#038;gm, &#8220;c:\\diller\\tc3\\bgi\\&#8221;);<br />
   hata = graphresult();<br />
   if (hata != grOk)<br />
   {<br />
      printf(&#8220;Grafik hatası: %s\n&#8221;, grapherrormsg(hata));<br />
      getch();<br />
      exit(1);<br />
   }</p>
<p>   orgx = 20;<br />
   orgy = getmaxy() / 2;</p>
<p>   line(0, orgy, getmaxx(), orgy);   /* x ekseni */<br />
   line(20, 0, 20, orgy+50);           /* y ekseni */</p>
<p>   outtextxy(getmaxx()-50, orgy-10, &#8220;Zaman&#8221;);<br />
   outtextxy(22, 0, &#8220;Volt&#8221;);</p>
<p>   for (x = 0; x< 6.28; x = x + 0.005)  {<br />
       y = fonk1(x);<br />
       putpixel(orgx + 80*x, orgy - y, 2);  /* renk yeşil   EGA_GREEN*/<br />
			     /* - çünkü eksenin üzerinde çizsin */</p>
<p>   }</p>
<p>   getch();</p>
<p>   closegraph();<br />
}</p>
<p>double fonk(double x)<br />
{<br />
  double y;<br />
  y = 100 * sin(10 * x);<br />
  return y;<br />
}<br />
double fonk1(double x)<br />
{<br />
  double y;<br />
  y = 1 - exp(-x);<br />
  return 200*y;<br />
}</p>
<p>12. KÜTÜKLER</p>
<p>12.1 TEXT Kütükler<br />
 (sıralı erişim, ascii, metin)</p>
<p>Kütük(file): Bilgilerin diskte saklanış biçimi.</p>
<p>Text kütüğü :<br />
       - karakterlerden oluşur.<br />
       - her satırın sonunda satır sonunu gösterir özel karakter '\n'  vardır.<br />
       - kütüğün sonunda kütük sonunu gösterir özel karakter 'eof' vardır.</p>
<p>Örnek:<br />
Birinci satır<\n><br />
Bu da ikincisi<\n><eof><br />
Diskte satırlar peşpeşedir. İlk satırdaki <\n> karakterinden hemen sonra ikinci satırın ilk karakteri gelir.</p>
<p>Kütüklerin Kullanımı</p>
<p>Bir kütüğü kullanmadan önce iki işlemim yapılması germektedir. Kütük ile ilgili işaretçinin tanımlanması ve kütüğün açılması.</p>
<p>Tanımlı FILE tipinde işaretçi değişken tanımlayarak ilk işlem gerçekleştirilir.<br />
    FILE *kp;           /*FILE yapısı stdio.h içerisinde tanımlı */</p>
<p>İkinci aşamada kütük açma deyimi kullanılır.<br />
    kp = fopen(kütük adı, mod)	</p>
<p>kütük adı : açmak istediğimiz kütüğün adı (string).  Büyük &#8211; küçük harf ayrımı yok.<br />
mod        : kullanım amacı (string). Okuma, yazma değişiklik &#8230;</p>
<p>   r	:  okumak için<br />
   w	: yazmak için. Kütük yok ise oluşturulur, var ise içeriği silinir. </p>
<p>   a	: eklemek için. Kütük yok ise oluşturulur , var ise sondan itibaren yazılır<br />
   r+	: Var olan bir kütüğü okumak ve yazmak için<br />
   w+	: Okumak ve yazmak için yeni bir kütük oluştur. Dosya var ise içeriği silinir.<br />
   a+	: Eklemek için. Okuma ve yazma yapılabilir. . Dosya yok ise oluşturulur..</p>
<p>Örnek 12.1.1 : Kütüğe yazma<br />
#include <stdio.h><br />
main()<br />
{<br />
  FILE *kp;<br />
  char *s;<br />
  int i;</p>
<p>  kp = fopen(&#8220;dene&#8221;, &#8220;w&#8221;); /* NULL ise işlem başarısız */<br />
  if (kp == NULL)<br />
     exit(1);</p>
<p>  for (i=0; i<5; i++) {<br />
      gets(s);<br />
      fprintf(kp, "%s\n", s);<br />
  }<br />
  getch();<br />
  fclose(kp);  /* kütüğü kapatır. Program sona erdiğinde otomatik kapatılır */<br />
   /* fcloseall() hepsini kapatır. Dönen , kapanan kütük sayısı.  Hata var ise EOF döner<br />
*/<br />
}</p>
<p>Yazarken kullanılan fprintf deyiminin çalışması printf gibidir. Sadece ilk parametre olarak kütük değişkenini vermek gerekir.</p>
<p>Benzer kütük işlevleri</p>
<p>int fgetc(FILE *stream);<br />
int fputc(int c, FILE *stream);<br />
char *fgets(char *s, int n, FILE *stream);    n-1 karakter veya satır sonuna kadar okur<br />
int fputs(const char *s, FILE *stream);         satır sonu bilgisini ayrıca yazmak gerekir</p>
<p>Örnek 12.1.2: Kütükten okuma</p>
<p>#include <stdio.h><br />
main()<br />
{<br />
  FILE *kp;<br />
  char *s;<br />
  int i;</p>
<p>  kp = fopen(&#8220;dene&#8221;, &#8220;r&#8221;);<br />
  if (kp == NULL)<br />
     exit(1);</p>
<p>  clrscr();<br />
  for (i=0; i<5; i++) {<br />
      fscanf(kp, "%s", s);<br />
      printf("%s\n", s);<br />
  }</p>
<p>  /* Kütükteki kayıt sayısı bilimiyor ise */<br />
  rewind(kp);<br />
  /*   fseek(stream, 0L, SEEK_SET)<br />
                         SEEK_SET 0 baştan<br />
                         SEEK_CUR 1 bulunulan yerden<br />
                         SEEK_END 2 sondan<br />
  */<br />
  fscanf(kp, "%s", s);<br />
  while (!feof(kp)) {<br />
      printf("%s\n", s);<br />
      fscanf(kp, "%s", s);<br />
  }<br />
  getch();<br />
}</p>
<p>int feof(FILE *) : kütüğün sonuna erişilmiş ise sıfırdan farklı bir değer alır. Aksi halde sıfırdır.<br />
rewind(FILE *) : kütük işaretçisinin (kütükteki hangı kayıdın okunacağı bilgisi) kütüğün başını göstermesini        			sağlar.</p>
<p>Örnek 12.1.3: Ekleme ve okuma</p>
<p>a+ modunda kütük aç. + eklenmez ise kütük işaretçisi kütük başına taşınmıyor</p>
<p>#include <stdio.h><br />
main()<br />
{<br />
  FILE *kp;<br />
  char *s;<br />
  int i;</p>
<p>  kp = fopen(&#8220;dene&#8221;, &#8220;a+&#8221;);<br />
  if (kp == NULL)<br />
     exit(1);</p>
<p>  clrscr();<br />
  for (i=0; i<2; i++) {<br />
      gets(s);<br />
      fprintf(kp, "%s\n", s);<br />
  }<br />
  rewind(kp);<br />
  fscanf(kp, "%s", s);<br />
  while (!feof(kp)) {<br />
      printf("%s\n", s);<br />
      fscanf(kp, "%s", s);<br />
      getch();<br />
  }<br />
  getch();<br />
}</p>
<p>Örnek 12.1.4: Matrisin elemanlarının değerlerinin kütükten öğrenilmesi.<br />
   kütüğün ismi  matrisa.dat<br />
   matris elemanları double<br />
   boyut 4x3</p>
<p>#define SAT 4<br />
#define SUT 3<br />
#include <stdio.h><br />
main()<br />
{<br />
  FILE *kp;<br />
  double a[SAT][SUT];<br />
  int i, j;</p>
<p>  kp = fopen(&#8220;matrisa.dat&#8221;, &#8220;r&#8221;);<br />
  if (kp == NULL)<br />
     exit(1);</p>
<p>  for (i=0; i<SAT; i++)<br />
      for (j=0; j<SUT; j++)<br />
	  fscanf(kp, "%lf", &#038;a[i][j]);</p>
<p>  clrscr();</p>
<p>  for (i=0; i<SAT; i++) {<br />
      for (j=0; j<SUT; j++)<br />
	  printf("%8.1f", a[i][j]);<br />
      printf("\n");<br />
  }</p>
<p>  getch();<br />
}</p>
<p>Örnek 12.1.5:  Hesaplanan değerlerin kütüğe yazdırılması.<br />
1-exp(-x) fonksiyonu 0-10 aralığında 0.02 adımlarla hesaplanıp kütüğe yazılıyor</p>
<p>#include <stdio.h><br />
#include<br />
<math.h>
<p>#define ADIM 0.02<br />
#define T0   0<br />
#define TS   10</p>
<p>main()<br />
{<br />
  FILE *kp;<br />
  double f, t;</p>
<p>  kp = fopen(&#8220;sonuc.dat&#8221;, &#8220;w&#8221;);<br />
  if (kp == NULL)<br />
     exit(1);<br />
  for (t=T0; t<TS; t = t + ADIM) {<br />
      f = 1 - exp(-t);<br />
      fprintf(kp, "%6.3f     %12.8f\n", t, f);<br />
      printf("%6.3f     %12.8f\n",t, f);<br />
  }<br />
  getch();<br />
}</p>
<p>12.1.1 Text Kütükte Değişiklik</p>
<p>Kütük işaretçisi değişiklik yapılacak kaydı göstermelidir. Ayrıca yeni bilgi eski bilgi ile aynı olmalıdır. Bu nedenle text kütüklerde değişiklik başvural bir şey değil. Gerektiği durumlarda kayıtlar geçici olarak başka bir kütüğe yazılır.</p>
<p>int remove(const char *k_adi) : kütüğü siler<br />
int rename(const char *eski, const char *yeni) : kütüğün ismi değiştirilir</p>
<p>Örnek 12.1.6: Girilen dosyada herbir harfin kaçdefa geçtiğini bulup, çoktan aza doğru yazar.</p>
<p>#include <stdio.h><br />
#include <stdlib.h></p>
<p>void degistir(int *, int *);</p>
<p>main(int argc, char *argv[])<br />
{</p>
<p>  char dosyaadi[64];<br />
  FILE *fp;<br />
  char c;</p>
<p>  long toplam = 0;<br />
  int frek[2][26] = {0,};<br />
  int i, j, k;</p>
<p>  for (i=0; i<26; i++)<br />
      frek[0][i] = 65 + i;</p>
<p>  if (argc<2) {<br />
     printf("Dosya adını belitmediniz\n");<br />
     exit(1);<br />
  }<br />
  else<br />
     strcpy(dosyaadi, argv[1]);</p>
<p>  fp = fopen(dosyaadi, "r");</p>
<p>  while (!feof(fp)) {<br />
     c = toupper(fgetc(fp));<br />
     if (c >= &#8216;A&#8217; &#038; c <='Z' )<br />
	 frek[1][c - 'A']++;<br />
  }</p>
<p>  for (i = 0; i < 26; i++)<br />
       toplam = toplam + frek[1][i];</p>
<p>  clrscr();<br />
  printf("İncelenen Dosya : %s\n", dosyaadi);<br />
  printf("Toplam harf     : %ld", toplam);</p>
<p>  /* Çoktan aza doğru sırala */<br />
  do {<br />
     k = 0; /* bayrak */<br />
     for (i=0; i < 25; i++)<br />
	 if (frek[1][i] < frek[1][i+1] ) {<br />
	    k = 1;<br />
	    degistir(&#038;frek[0][i], &#038;frek[0][i+1]);<br />
	    degistir(&#038;frek[1][i], &#038;frek[1][i+1]);<br />
	 }<br />
  } while (k == 1);</p>
<p>  for (i = 0; i < 26; i++) {<br />
      if (i<13)<br />
	 gotoxy(1, 5+ i);<br />
      else<br />
	 gotoxy(40, 5 + i - 13);</p>
<p>      printf("%c:  %6d  %5.3f",frek[0][i] , frek[1][i], (float)frek[1][i]/toplam);<br />
 }</p>
<p>  getch();<br />
}</p>
<p>void degistir(int *a, int *b)<br />
{<br />
  int c;<br />
  c  = *a;<br />
  *a = *b;<br />
  *b = c;<br />
}</p>
<p>Örnek çıktı: (frekans classics.txt)</p>
<p>İncelenen Dosya : classics.txt<br />
Toplam harf     : 122850</p>
<p>E:   14657  0.119                      M:    2870  0.023<br />
T:   10449  0.085                      F:    2630  0.021<br />
A:    9902  0.081                      P:    2440  0.020<br />
I:    9889  0.080                       Y:    2292  0.019<br />
S:    9504  0.077                      W:    2257  0.018<br />
O:    9492  0.077                      G:    2172  0.018<br />
N:    8521  0.069                      B:    1779  0.014<br />
R:    7706  0.063                      V:    1279  0.010<br />
H:    6215  0.051                      K:    1260  0.010<br />
L:    5333  0.043                      Z:     288  0.002<br />
D:    4463  0.036                      J:     236  0.002<br />
C:    3760  0.031                      X:     218  0.002<br />
U:    3121  0.025                      Q:     117  0.001</p>
<p>12.2  Rastgele Erişimli Kütükler</p>
<p>- Veriler sabit uzunluktaki bloklar (kayıt) şeklinde saklanır.<br />
- Veriler karekterler dizisi biçiminde saklı.<br />
- Değişkenlerin içeriği bellekte saklanış biçimiyle kütüğe yazıldığı için okuma/yazma işlemleri text kütüklere göre daha hızlı.<br />
- Aynı sebepten dolayı veriler kütükte daha az yer kaplar.<br />
- Gerçel sayılarda hassasiyet kayıbı yok.<br />
- İstenilen kayıda doğrudan erişmek mümkün.</p>
<p>Bilgiler sabit uzunlukta saklandığı için değişiklik anında kayıt bozulması yok<br />
İstenilen bilgiye erişmesi kolay.</p>
<p>Kütüklerin Bu Biçimde Kullanılması İçin</p>
<p>	fwrite ve fread deyimleri kullanılır</p>
<p>fwrite(veri_ptr, uzunluk, kac_tane, kp) : Belirtilen sayıda sabit uzunluktaki veriyi kütüğe yazar</p>
<p>veri_ptr   : Yazılacak veriye işaretçi<br />
uzunluk   : Yazılacak verinin uzunluğu<br />
kac_tane : Verinin kaç defa ard arda yazılacağı<br />
kp            : Kütük işaretçisi</p>
<p>Kütüğe uzunluk * kac_tane kadar byte yazılır. Dönüş değeri<br />
	yazılan veri sayısı ( byte değil)</p>
<p>fead(veri_ptr, uzunluk, kac_tane, kp) : Belirtilen sayıda sabit uzunluktaki veri kütükten okunur<br />
Örnek 12.2.1: Rastgele erişimli kütük</p>
<p>#include <stdio.h><br />
#include<br />
<math.h>
#include <errno.h></p>
<p>typedef struct {<br />
    char no[11];<br />
    int notu;<br />
} ogryapi;</p>
<p>FILE *kp;<br />
ogryapi ogr;</p>
<p>void giris(void);<br />
void liste(void);</p>
<p>main()<br />
{<br />
  int i;<br />
  char c;</p>
<p>  kp = fopen(&#8220;ogr.dat&#8221;, &#8220;r+&#8221;);</p>
<p>  if (kp == NULL) {<br />
     printf(&#8220;%d\n&#8221;, errno);  /* 2 ise file not found */<br />
     kp = fopen(&#8220;ogr.dat&#8221;, &#8220;w+&#8221;);<br />
  }<br />
  do {<br />
     clrscr();<br />
     fseek(kp, 0, 2);<br />
     printf(&#8220;Dosya uzunluğu  %ld\n&#8221;, ftell(kp));<br />
     printf(&#8220;Kayıt sayısı    %d\n\n&#8221;, ftell(kp)  / sizeof(ogryapi));</p>
<p>     printf(&#8220;1-Giriş\n2-Liste\n3-Çıkış\n&#8221;);<br />
     c = getch();<br />
     switch (c) {<br />
         case &#8217;1&#8242;: giris(); break;<br />
         case &#8217;2&#8242;: liste(); break;<br />
         case &#8217;3&#8242;: exit(0);<br />
     };<br />
  } while (1);</p>
<p>void giris(void)<br />
{<br />
  int i;</p>
<p>  clrscr();</p>
<p>  printf(&#8220;Öğrenci no : &#8220;); scanf(&#8220;%s&#8221;, ogr.no);<br />
  printf(&#8221;      Notu : &#8220;); scanf(&#8220;%d&#8221;, &#038;ogr.notu);</p>
<p>  i = atoi(ogr.no);</p>
<p>  fseek(kp, (i-1)*sizeof(ogryapi), 0);<br />
  fwrite(&#038;ogr, sizeof(ogryapi), 1, kp);</p>
<p>  fflush(kp);<br />
  /*int fflush(FILE *) tampon bllektekiler diske yazılır<br />
    int flushall(void)<br />
  */</p>
<p>}</p>
<p>void liste(void)<br />
{<br />
  clrscr();<br />
  fseek(kp, 0, 0);<br />
  fread(&#038;ogr, sizeof(ogryapi), 1, kp);<br />
  while (!feof(kp)) {<br />
      printf(&#8220;%s    %d\n&#8221;, ogr.no,ogr.notu);<br />
      fread(&#038;ogr, sizeof(ogryapi), 1, kp);<br />
  }<br />
  getch();<br />
}</p>
<p>Örnek 12.2.2 : Dizinin kütüğe yazılması, okunması</p>
<p>#include <stdlib.h><br />
#include <stdio.h></p>
<p>#define MAX 10</p>
<p>FILE *kp;<br />
int a[MAX];</p>
<p>void giris(void);<br />
void liste(void);</p>
<p>main()<br />
{<br />
Önceki örnek gibi<br />
}</p>
<p>void giris(void)<br />
{<br />
  int i;</p>
<p>  clrscr();<br />
  for (i=0; i<MAX; i++)<br />
      a[i] = rand() % 100;</p>
<p>  fseek(kp, 0, 0);<br />
  fwrite(a, sizeof(int), MAX, kp);<br />
}</p>
<p>void liste(void)<br />
{<br />
  int i;<br />
  clrscr();</p>
<p>  fseek(kp, 0, 0);<br />
  fread(a, sizeof(int), MAX, kp);</p>
<p>  for (i=0; i<MAX; i++)<br />
      printf("%d  ", a[i]);</p>
<p>  printf("\n");<br />
  getch();<br />
}</p>
<p>EK A. Örnekler</p>
<p>Örnek A.1: Paralel portun kullanımı<br />
/* PC deki paralel porta erişim<br />
oku     : paralel portu okur. Eski tip portlar çift yönlü olmadığı için<br />
          durum uçları giriş amaçlı kullanıldı<br />
          ( 4-bit , bi-directiona, EPP, ECP )</p>
<p>yaz     : paralel port data uçlarına bilgi gönderir</p>
<p>oku_yaz : durum uçlarından okuduğunu veri uçlarına gönderir</p>
<p>*/</p>
<p>#include <stdio.h><br />
#include <dos.h><br />
#include <conio.h></p>
<p>typedef unsigned word;</p>
<p>void binary_yaz(word);<br />
void oku(void);<br />
void yaz(void);<br />
void oku_yaz(void);<br />
word pdata=0&#215;378;<br />
word pstat=0&#215;379;<br />
word bout, bin;<br />
char c;</p>
<p>main()<br />
{</p>
<p>  do {<br />
     clrscr();<br />
     printf(&#8220;1 &#8211; Oku\n&#8221;);<br />
     printf(&#8220;2 &#8211; Yaz\n&#8221;);<br />
     printf(&#8220;3 &#8211; Okuduğunu Yaz\n&#8221;);<br />
     printf(&#8220;4 &#8211; Çık\n&#8221;);</p>
<p>     c = getch();<br />
     switch(c) {<br />
         case &#8217;1&#8242; : oku(); break;<br />
         case &#8217;2&#8242; : yaz(); break;<br />
         case &#8217;3&#8242; : oku_yaz(); break;<br />
         case &#8217;4&#8242; : exit(0);<br />
     }<br />
  } while (1);<br />
}</p>
<p>void yaz(void)<br />
{<br />
  clrscr();<br />
  printf(&#8220;Gönderilecek veri :&#8221;);<br />
  scanf(&#8220;%d&#8221;, &#038;bout);<br />
  binary_yaz(bout); printf(&#8220;\n&#8221;);<br />
  outport(pdata, bout);<br />
  c = getch();<br />
}<br />
void oku(void)<br />
{<br />
  clrscr();<br />
  do {<br />
     bin = inportb(pstat);<br />
     binary_yaz(bin);<br />
     printf(&#8221;   %d\n&#8221;, bin);<br />
     c = getch();<br />
  } while (c != &#8216;q&#8217;);<br />
}</p>
<p>void oku_yaz(void)<br />
{<br />
  clrscr();<br />
  do {<br />
     bin = inportb(pstat);<br />
     gotoxy(1,8) ; printf(&#8220;Okunan  = &#8220;);<br />
     binary_yaz(bin);<br />
     outport(pdata, bin);<br />
     gotoxy(1,9) ; printf(&#8220;Yazılan = &#8220;);<br />
     binary_yaz(bin);</p>
<p>     printf(&#8221;   %d\n&#8221;, bin);<br />
     c = getch();<br />
  } while (c != &#8216;q&#8217;);<br />
}</p>
<p>void binary_yaz(word x)<br />
{<br />
  word i;<br />
  word m;</p>
<p>  m = 0&#215;8000;<br />
  for (i = 0; i<16; i++) {<br />
      if (x &#038; m)<br />
         printf("1");<br />
      else<br />
         printf("0");<br />
      m = m >> 1;<br />
  }<br />
  printf(&#8221; &#8220;);<br />
}</p>
<p>Örnek A.2. Kesme (interrupt) kullanımı</p>
<p>Intel 8086 Registers</p>
<p>General Purpose Registers   AH/AL  AX  (EAX)  Accumulator     BH/BL  BX  (EBX)  Base                  CH/CL  CX  (ECX)  Counter             DH/DL  DX  (EDX)  Data                  (Exx) 386+ 32 bit register    	Segment Registers  CS     Code Segment DS     Data Segment SS     Stack Segment ES     Extra Segment (FS)    386 and newer (GS)    386 and newer  </p>
<p>Pointer Registers                       Stack Registers</p>
<p>SI (ESI)  Source Index                  SP (ESP)  Stack Pointer<br />
DI (EDI)  Destination Index          BP (EBP)  Base Pointer<br />
IP        Instruction Pointer</p>
<p>FLAGS &#8211; Intel 8086 Family Flags Register<br />
0  CF Carry Flag 1  1 2 PF Parity Flag 3 0 4 AF Auxiliary Flag 5 0 6 ZF Zero Flag 7 SF Sign Flag 8 TF Trap Flag  (Single Step) 	9 IF Interrupt Flag A DF Direction Flag B OF Overflow flag C,D IOPL I/O Privilege Level  (286+ only) E NT Nested Task Flag  (286+ only) F 0 10 RF Resume Flag (386+ only) 11 VM  Virtual Mode Flag (386+ only)</p>
<p>#include <dos.h><br />
#include <stdio.h><br />
main()<br />
 {<br />
    union REGS a;</p>
<p>    clrscr();<br />
    a.h.ah = 0x2A;       /* Dos servislerinden 2Ah = get system date */<br />
    int86(0&#215;21,&#038;a,&#038;a); /* int 21h dos servisleri */</p>
<p>    printf(&#8220;makinanin tarihi = %d/%d/%d\n&#8221;, a.h.dl, a.h.dh, a.x.cx);</p>
<p>    a.h.ah = 0&#215;36;       /* Diskteki bos alan */<br />
    a.h.dh = 0;          /* bulunulan, A=1 */<br />
    int86(0&#215;21,&#038;a,&#038;a);</p>
<p>    printf(&#8220;makinanadaki yer = %ld\n&#8221;, (long)a.x.ax*a.x.bx*a.x.cx);</p>
<p>    getch();<br />
}</p>
<p>ÖRNEKLER</p>
<p>Örnek : 1996-97 2.dönem vize<br />
/*Soru 1 */<br />
#include <stdio.h><br />
#include <string.h></p>
<p>char *kelime(char *);</p>
<p>main()<br />
{<br />
  char *cumle = &#8220;ali zil caldi mi&#8221;;<br />
  char *s, *kelimeler[20];<br />
  int i, kk = 0;<br />
  clrscr();</p>
<p>  /* yol 1:<br />
  s = kelime(cumle);<br />
  while (strlen(s)) {<br />
	strcpy(kelimeler[kk++], s);<br />
	s = kelime(cumle);<br />
   }<br />
  */</p>
<p>  /* yol 2: strtok islevini kullanarak<br />
  s = strtok(cumle, &#8221; &#8220;);<br />
  while (s !=NULL) {<br />
	strcpy(kelimeler[kk++], s);<br />
	s = strtok(NULL, &#8221; &#8220;);<br />
  }<br />
  */</p>
<p>  for (i=kk-1; i>=0; i&#8211;)<br />
      printf(&#8220;%s &#8220;, kelimeler[i]);</p>
<p>  getch();<br />
}</p>
<p>char *kelime(char *s)<br />
{<br />
 char a[20], *b, d[20];<br />
 int i;<br />
 while (s[0] == &#8216; &#8216;)<br />
    s++;</p>
<p> strcpy(d, s);</p>
<p> b = strchr(s, &#8216; &#8216;);<br />
 if (b == NULL)<br />
    strcpy(a, s);<br />
 else<br />
    {<br />
      i = abs(b-s);<br />
      strncpy(a, d, i);<br />
      a[i] = &#8216;\0&#8242;;<br />
    }<br />
 strcpy(s, b);<br />
 return a;<br />
}</p>
<p>/* Soru 3<br />
struct veriler {<br />
  double ka, ya, yg;<br />
};<br />
struct veriler a[60000];</p>
<p>for (i=0; i<60000; i++)<br />
    if (a[i].ka == a[i].ya)<br />
       printf("%f     %f\n",i*20, a[i].ka);<br />
Soru 3*/</p>
<p>EK B.  DİNAMİK VERİ YAPILARI</p>
<p>Self-referential structure : üye, tanımlı olduğu yapıya bir işaretçi<br />
struct yapi {<br />
    char   adi[21];<br />
    struct yapi *ptr;<br />
};</p>
<p>B.1 Sıralı Bağlı Liste</p>
<p>.....</p>
<p>Örnek B.1: Sıralı bağlı listenin gerçekleştirilmesi.</p>
<p>#include <stdlib.h><br />
#include <string.h><br />
struct listyapi {<br />
    char   adi[21];<br />
    struct listyapi *sonraki;<br />
};<br />
typedef struct listyapi listnode;<br />
typedef listnode *listptr;<br />
listptr headnode;   /* Herzaman listenin baţýný gösterir */</p>
<p>void seeklist(char *searchthis, listptr *prevnode)<br />
{<br />
  listptr c;</p>
<p>  c = headnode;<br />
  *prevnode = c;<br />
  while ((c->sonraki != NULL)) {<br />
       c = c->sonraki;<br />
       if (strcmp(c->adi, searchthis) >= 0) break;<br />
       *prevnode = c;<br />
  }<br />
}</p>
<p>void kayit(char *s)<br />
/* prevnode kayıdı newnode kayıdını, newnode kayıdı prevnode&#8217;nin daha önce gösterdiği kayıdını gösterir. */<br />
{<br />
   listptr newnode, prevnode;</p>
<p>   newnode = malloc(sizeof(listnode)); /* yeni kayıda yer a‡ */</p>
<p>   strcpy(newnode->adi, s);            /*bilgiyi yeni kayıda yaz */</p>
<p>   seeklist(newnode->adi, &#038;prevnode);  /* listedeki yerini bul */</p>
<p>   newnode->sonraki = prevnode->sonraki;  /* listeye ekle */<br />
   prevnode->sonraki = newnode;<br />
}</p>
<p>void iptal(char *s)<br />
/* newnode kayıdı silinir. prevnode kayıdı newnode kayıdının gösterdiği kayıdını gösterir. */<br />
{<br />
   listptr newnode, prevnode;</p>
<p>   seeklist(s, &#038;prevnode);<br />
   newnode = prevnode->sonraki;<br />
   prevnode->sonraki = newnode->sonraki;<br />
   free(newnode);<br />
}</p>
<p>void listlist(void)<br />
{<br />
   listptr currentnode;</p>
<p>   currentnode = headnode;<br />
   if (currentnode != NULL) currentnode = currentnode->sonraki;<br />
   while (currentnode != NULL)<br />
       {<br />
	  printf(&#8220;%s  &#8220;,currentnode->adi);<br />
	  currentnode = currentnode->sonraki;<br />
       }<br />
   printf(&#8220;\n&#8221;);</p>
<p>}   /* Procedure listlist; */</p>
<p>main()<br />
{<br />
  char      sec;<br />
  char      *s;</p>
<p>  headnode = malloc(sizeof(*headnode));<br />
  strcpy(headnode->adi,&#8221; listenin baţý&#8221;);<br />
  headnode->sonraki = NULL;</p>
<p>  do {<br />
    clrscr();<br />
    printf(&#8220;Boş yer : %ld\n\n&#8221;,coreleft());</p>
<p>    listlist();</p>
<p>    printf(&#8220;\n\n1 &#8211; Giriş\n2 &#8211; iptal\n3 &#8211; Son\n\nSeç \n&#8221;);</p>
<p>    sec = getch();<br />
    switch (sec) {<br />
      case &#8217;1&#8242;:<br />
		printf(&#8220;Adı &#8220;); gets(s);<br />
		kayit(s);<br />
		break;</p>
<p>      case &#8217;2&#8242;: printf(&#8220;Adı \n&#8221;); gets(s);<br />
		iptal(s);<br />
		break;</p>
<p>      case &#8217;3&#8242;: exit(0);break;<br />
    }<br />
  }  while (1);<br />
}</p>
<p>Problem : Polinomlar sıralı bağlı listede saklı. İki polinomun toplamını üçücnü polinomda oluşturan program</p>
<p>B.2 Listelerin Özel Biçimleri (Uygulamaları)</p>
<p>B.2.1 Stack (yığın) : Son giren ilk çıkar (LIFO)<br />
                (Fonksiyon çağırıldığında geri dönüş adresi,     Fonksiyona gönderilecek parametreler )</p>
<p>Örnek B.2.1:  Stack kullanarak girilen cümleyi kelimeleri bozmadan tersten yazdır<br />
#include <stdio.h><br />
#include <stdlib.h><br />
struct stackyapi {<br />
    char deger[50];<br />
    struct stackyapi *sonraki;<br />
};<br />
typedef struct stackyapi stacknode;<br />
typedef stacknode *stackptr;<br />
stackptr top;</p>
<p>void push(char *gelen)<br />
{<br />
  stackptr newnode;<br />
  newnode = malloc(sizeof(stacknode));<br />
  strcpy(newnode->deger, gelen);<br />
  newnode->sonraki = top;<br />
  top = newnode;<br />
}</p>
<p>int pop(char *giden)<br />
{<br />
   stackptr oldnode;</p>
<p>   if (top != NULL) {<br />
      oldnode = top;<br />
      strcpy(giden, top->deger);<br />
      top = top->sonraki;<br />
      free(oldnode);<br />
      return 0;<br />
   }<br />
   else<br />
      return 1; /* yığın boş */<br />
}</p>
<p>main()<br />
{<br />
  char *kelime, *cumle;<br />
  stackptr current;</p>
<p>  top = NULL;<br />
  clrscr();<br />
  printf(&#8220;Cumleyi girin : &#8220;); gets(cumle);<br />
  kelime = strtok(cumle, &#8221; &#8220;);<br />
  while (kelime) {<br />
     push (kelime);<br />
     kelime = strtok(NULL, &#8221; &#8220;);<br />
  }<br />
  kelime = (char *) malloc(20); /* kelime NULL idi, yer açalım*/<br />
  while (!pop(kelime))<br />
      printf(&#8220;%s &#8220;, kelime);</p>
<p>  printf(&#8220;\n&#8221;);<br />
  getch();<br />
}</p>
<p>Problem : </p>
<p>	infix      : operand  operator operand	        2 + 7<br />
	postfix :  operand operand operator                      2  7 +<br />
                              Soldan sağa işlem yapılır. Öncelik (parantez) yok. </p>
<p>postfix biçimindeki ifadeyi hesaplama ?<br />
infix  postfix dönüşümü                   ?</p>
<p>B.2.1: Kuyruk (queue) ilk giren ilk çıkar (FIFO)</p>
<p>	Bilgisayarda çoklu işlem<br />
	Yazıcıyı ortak kullanım</p>
<p>B.2.3: Ağaç (tree) Doğrusal olmayan yapı<br />
	İkili ağaç (kök, çocuk, yaprak, derece)</p>
<p>MEMORY MODELLERİ</p>
<p>Tiny 	: Code + data + stack aynı 64 K lık segment te<br />
Small 	: Code için 64 K, data + stack ayrı 64 K lık segment<br />
Medium : Code için far pointer ( yani 1 MB code) , data 64 K ( data kullanmayan uzun programlar)<br />
Compact: Medium un tersi. ( çok data kullanan kısa programlar)<br />
Large	: Code için 1 MB, data için 1 MB<br />
Huge	: Large ile aynı fakat static data 64 K dan fazla olabilir.<br />
YILMAZ TAŞKIRAN</p>
]]></content:encoded>
			<wfw:commentRss>http://www.genelbilge.com/c-ortaminda-yazilim-gelistirme-nayil-yapilir.html/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>PIC Microcontoller Memory Method</title>
		<link>http://www.genelbilge.com/pic-microcontoller-memory-method.html/</link>
		<comments>http://www.genelbilge.com/pic-microcontoller-memory-method.html/#comments</comments>
		<pubDate>Fri, 09 Oct 2009 09:08:23 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		<br />
<b>Warning</b>:  Invalid argument supplied for foreach() in <b>/home/genelbil/public_html/wp-content/plugins/autometa/autometa.php</b> on line <b>300</b><br />
		<category><![CDATA[Elektronik]]></category>
		<category><![CDATA[Programlama]]></category>
		<category><![CDATA[Aha]]></category>
		<category><![CDATA[Cursor Location]]></category>
		<category><![CDATA[Data0]]></category>
		<category><![CDATA[Data2]]></category>
		<category><![CDATA[Demo]]></category>
		<category><![CDATA[Dispatcher]]></category>
		<category><![CDATA[Elements]]></category>
		<category><![CDATA[Lcd Module]]></category>
		<category><![CDATA[Memory]]></category>
		<category><![CDATA[Mr Ed]]></category>
		<category><![CDATA[Nixon]]></category>
		<category><![CDATA[Output Speech]]></category>
		<category><![CDATA[Pointer]]></category>
		<category><![CDATA[Pps]]></category>
		<category><![CDATA[R2r Ladder]]></category>
		<category><![CDATA[Ru]]></category>
		<category><![CDATA[S Scott]]></category>
		<category><![CDATA[Scott Dattalo]]></category>
		<category><![CDATA[Speech Data]]></category>
		<category><![CDATA[Table Lookups]]></category>

	<!-- AutoMeta Start -->
	<!-- AutoMeta End -->
	
		<guid isPermaLink="false">http://www.genelbilge.com/?p=11059</guid>
		<description><![CDATA[Big Table lookups Tony Nixon says: Table can access 1 to 8178 bytes (assuming max ROM of 8K) Table movlw High(TStart) movwf PCLATH movf OffsetH,W addwf PCLATH movlw Low(TStart) addwf OffsetL,W btfsc STATUS,C incf PCLATH movf OffsetL,W call DoTable movlw High(here) movwf PCLATH ; reset PCLATH here goto here org 0x???? DoTable addwf PCL TStart [...]]]></description>
			<content:encoded><![CDATA[<p>
Big Table lookups<br />
Tony Nixon says:<br />
Table can access 1 to 8178 bytes (assuming max ROM of 8K)<br />
Table   movlw High(TStart)<br />
        movwf PCLATH<br />
        movf OffsetH,W<br />
        addwf PCLATH<br />
        movlw Low(TStart)<br />
        addwf OffsetL,W<br />
        btfsc STATUS,C<br />
        incf PCLATH</p>
<p>        movf OffsetL,W<br />
        call DoTable</p>
<p>        movlw High(here)<br />
        movwf PCLATH    ; reset PCLATH<br />
<span id="more-11059"></span><br />
here    goto here</p>
<p>        org 0x????</p>
<p>DoTable addwf PCL<br />
TStart  Retlw d&#8217;0&#8242;<br />
        etc<br />
As an example of how to use it, say you want to output speech data at 5K samples per second. A simple R2R ladder is on PortB. The speech table has 3000 data points<br />
Start   clrf OffsetH<br />
        clrf OffsetL</p>
<p>SoundLoop       ; 200uS loop time = 5000 samples per second</p>
<p>        movlw High(Table)<br />
        movwf PCLATH<br />
        call Table      ; get sound data<br />
        movwf PORTB</p>
<p>        movlw High(here)<br />
        movwf PCLATH    ; reset PCLATH</p>
<p>here    incf OffsetL    ; add 1 to data pointer<br />
        btfsc STATUS,C<br />
        incf OffsetH</p>
<p>NoUp    movlw Low(d&#8217;3000&#8242;)<br />
        xorwf OffsetL,W<br />
        btfss STATUS,Z<br />
        goto SoundLoop</p>
<p>        movlw High(d&#8217;3000&#8242;)<br />
        xorwf OffsetH,W<br />
        btfss STATUS,Z<br />
        goto SoundLoop<br />
        goto Start<br />
;<br />
; SOUND DATA TABLE 3000 ELEMENTS<br />
;<br />
Table   movlw High(TStart)<br />
        movwf PCLATH<br />
        movf OffsetH,W<br />
        addwf PCLATH<br />
        movlw Low(TStart)<br />
        addwf OffsetL,W<br />
        btfsc STATUS,C<br />
        incf PCLATH</p>
<p>        movf OffsetL,W<br />
DoTable addwf PCL<br />
TStart  DT &#8220;Hello. I&#8217;m Mr Ed&#8221;</p>
<p>; plus another 2984 data points</p>
<p>        end<br />
PS: the text won&#8217;t sound like that coming from PORTB <img src='http://www.genelbilge.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /><br />
PPS :if you want an easy way to create a 3000 point data table ready for MPASM see </p>
<p>http://www.bubblesoftonline.com/demo/dtimg.html</p>
<p>Dmitry Kiryashov [zews at AHA.RU] says:<br />
AFAIK it can be done in more straight way.<br />
        call    Dispatcher<br />
; will be returned here</p>
<p>Dispatcher:<br />
        movlw   High    TStart<br />
        addwf   OffsetH,W<br />
        movwf   PCLATH</p>
<p>        movlw   Low     TStart<br />
        addwf   OffsetL,W<br />
        skpnc<br />
        incf    PCLATH,F</p>
<p>        movwf   PCL     ;computed goto with right PCLATH</p>
<p>TStart:<br />
        dt      data0,data1,data2,&#8230;   ;retlw&#8217;s</p>
<p>Scott Dattalo says:<br />
;*******************************************************************<br />
;write_string<br />
;<br />
;  The purpose of this routine is to display a string on the LCD module.<br />
;On entry, W contains the string number to be displayed. The current cursor<br />
;location is the destination of the output.<br />
;  This routine can be located anywhere in the code space and may be<br />
;larger than 256 bytes.<br />
;<br />
; psuedo code:<br />
:<br />
; char *string0 = &#8220;foo&#8221;;<br />
; char *string1 = &#8220;bar&#8221;;<br />
;<br />
; char *strings[] = { string0, string1};<br />
; char num_strings = sizeof(strings)/sizeof(char *);<br />
;<br />
; void write_string(char string_num)<br />
; {<br />
;   char *str;<br />
;<br />
;   str = strings[string_num % num_strings];<br />
;<br />
;   for( ; *str; str++)<br />
;     LCD_WRITE_DATA(*str);<br />
;<br />
; }<br />
;<br />
; Memory used<br />
;    buffer2, buffer3<br />
; Calls<br />
;    LCD_WRITE_DATA<br />
; Inputs<br />
;    W = String Number<br />
;<br />
write_string</p>
<p>        andlw   WS_TABLE_MASK           ;Make sure the string is in range<br />
        movwf   buffer3                 ;Used as an index into the string table<br />
        addwf   buffer3,w               ;to get the string offset<br />
                                        ;<br />
        addlw   LOW(ws_table)           ;First, get a pointer to the string<br />
        movwf   buffer3                 ;<br />
                                        ;<br />
        movlw   HIGH(ws_table)          ;<br />
        skpnc                           ;<br />
         movlw   HIGH(ws_table)+1       ;</p>
<p>        movwf   PCLATH</p>
<p>        movf    buffer3,w<br />
        call    ws2                     ;First call is to get string offset in<br />
table<br />
        movwf   buffer2</p>
<p>        incf    PCLATH,f<br />
        incfsz  buffer3,w<br />
         decf   PCLATH,f</p>
<p>        call    ws2                     ;get the high word (of the offset)</p>
<p>        movwf   PCLATH                  ;<br />
ws1:                                    ;Now loop through the string<br />
        movf    buffer2,w<br />
        call    ws2</p>
<p>        andlw   0xff<br />
        skpnz                           ;If the returned byte is zero,<br />
         return                         ;   we&#8217;ve reached the end</p>
<p>        call    LCD_WRITE_DATA</p>
<p>        incf    PCLATH,f                ;Point to the next character in the<br />
string<br />
        incfsz  buffer2,f<br />
         decf   PCLATH,f</p>
<p>        goto    ws1</p>
<p>ws2<br />
        movwf   PCL</p>
<p>#define WS_TABLE_MASK  1   ; This should equal 2^number of strings</p>
<p>; The first part of the table contains pointers to the start of the<br />
; strings. Note that each string has a two word pointer for the low<br />
; and high bytes.</p>
<p>ws_table:<br />
        retlw   LOW(string0)<br />
        retlw   HIGH(string0)</p>
<p>        retlw   LOW(string1)<br />
        retlw   HIGH(string1)</p>
<p>string0:        dt      &#8220;GPSIM WROTE THIS&#8221;,0<br />
string1:        dt      &#8220;A STRING ON ROW 2&#8243;,0</p>
<p>also:<br />
•	Wave to data table converter<br />
•	PIC DSP / filters<br />
•	PIC Microcontoller Audio Input / Output<br />
David A Cary of Motorguide Pinpoint Says:<br />
Someone mentioned SoundLoop: &#8230; incf OffsetL ; add 1 to data pointer btfsc STATUS,C incf OffsetH<br />
but my little cheat sheet claims that `incf&#8217; only affects the Z bit, not the C bit. Is my cheat sheet leaving something out ? Or is there a bug in this code ? Or am I missing something ? SoundLoop: &#8230; incf OffsetL ; add 1 to data pointer btfsc STATUS,Z incf OffsetH<br />
The heavy use of btfsc STATUS,C ; also known as skpnc elsewhere on this page looks OK, because they follow the &#8220;addwf&#8221; or &#8220;addlw&#8221; instructions, which do affect the carry bit. &#8212; David Cary<br />
Comments:<br />
•	The &#8220;write_string&#8221; subroutine wouldn&#8217;t even compile until I made this little tweak:<br />
•	write_string:<br />
•	&#8230;.<br />
•	        movlw   HIGH(ws_table)          ;<br />
•	        skpnc                           ;<br />
•		addlw 1		; because my assembler choked on &#8220;movlw   HIGH(ws_table)+1&#8221;<br />
Interested:<br />
•	</p>
]]></content:encoded>
			<wfw:commentRss>http://www.genelbilge.com/pic-microcontoller-memory-method.html/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
